← 返回更新日志

OpenClaw v2026.5.4-beta.1 预发布

2026-05-04 · GitHub 原文
## 2026.5.4 ### 亮点 - 插件/文件传输:新增内置文件传输插件,提供 `file_fetch`、`dir_list`、`dir_fetch` 和 `file_write` 智能体工具,用于在配对节点上进行二进制文件操作;在 `plugins.entries.file-transfer.config.nodes` 下实施基于节点的默认拒绝路径策略,需操作员审批;默认拒绝符号链接遍历(需通过 `followSymlinks` 显式启用),且每次往返传输限制为 16 MB。(#74742) 感谢 @omarshahine。 - Google Meet/语音通话:使 Twilio 拨入加入的通话通过实时 Gemini 语音桥接进行语音输出,采用节奏化音频流传输、背压感知缓冲、插话队列清除,并在实时语音期间不使用 TwiML 回退,为 Meet 参与者提供更敏捷的 OpenClaw 语音智能体。(#77064) 感谢 @scoootscooob。 ### 变更 - 控制界面/头部:在仪表板面包屑中显示当前活跃的智能体名称,但不添加当前会话键,使非聊天视图保持方向感且不拥挤顶部栏。 - 控制界面/定时任务:使“新建任务”侧边栏可折叠,以便任务列表回收空间,同时保持表单一键可达。感谢 @BunsDev。 - 网关/启动:将模型目录测试辅助函数、运行会话查找代码、QR 配对辅助函数和 TypeBox 记忆工具模式构建移出热启动导入路径,减少默认网关基准测试中的插件加载和内存压力。 - 控制界面/性能:在支持的情况下,将浏览器的长动画帧或长任务条目记录到调试事件日志中,便于从 UI 层面定位缓慢的仪表板渲染问题。 - 频道/流式传输:新增统一的 `streaming.mode: "progress"` 草稿,支持自动单字状态标签,并在 Discord、Telegram、Matrix、Slack 和 Microsoft Teams 间共享进度配置。 - Slack/流式传输:新增 `streaming.progress.render: "rich"`,用于由结构化进度行数据支持的 Block Kit 进度草稿。 - Slack/流式传输:当 Block Kit 限制截断长进度草稿时,保留最新的丰富进度行。感谢 @vincentkoc。 - 频道/流式传输:默认限制进度草稿工具的行数,使编辑进度框时避免因长换行导致的跳动重排。 - 智能体/详细模式:默认对 `/verbose` 和进度草稿使用紧凑的解释模式工具摘要,支持 `agents.defaults.toolProgressDetail: "raw"` 及按智能体重写,用于调试原始命令/详细输出。 - 智能体/命令:新增 `/steer <message>`,用于在会话空闲时独立于队列地引导当前活跃会话的运行,而无需开启新回合。(#76934) - 控制界面/聊天:在聊天会话选择器中新增优先按智能体筛选的功能;保持聊天控件/编辑器在手机/平板/桌面端宽度下响应式;桌面端聊天控件保持单行;避免初始聊天加载时重复刷新头像;向下滚动聊天记录时隐藏该行。感谢 @BunsDev。 - 控制界面/聊天:将连续重复的文本消息折叠为一个带计数的气泡,使无操作的心跳确认保持紧凑,且不隐藏附近上下文。 - 智能体/子智能体:当直接完成回退必须绕过请求者智能体的公告回合时,保留所有分组的子结果。感谢 @vincentkoc。 - 语音合成/电话:在电话合成提供商中尊重提供商语音/模型覆盖,使 Google Meet 智能体语音日志与实际生成音频的后端匹配。感谢 @vincentkoc。 - 语音通话/实时:限制节奏化 Twilio 音频队列,并在提供商音频在 WebSocket 背压保护器后堆积之前关闭过载的实时流。感谢 @vincentkoc。 - 工具/BTW:新增 `/side` 作为 `/btw` 旁问的文本和原生斜杠命令别名。 - 医生/配置:`doctor --fix` 现在即使在不相关的验证问题(如缺少插件)阻止完整验证通过的情况下,也会提交安全的遗留配置迁移,因此无论其他配置问题如何,`agents.defaults.llm` 和其他已知的遗留键始终会被 `doctor --fix` 清理。修复 #76798。(#76800) 感谢 @hclsys。 - 文档:明确 IRC 在操作员管理的正向代理路由之外使用原始 TCP/TLS 套接字,因此在启用 IRC 前应明确批准直接 IRC 出站流量。感谢 @jesse-merhi。 - 智能体/工具:当有效工具黑名单已阻止它们时,跳过可选的媒体和 PDF 工具工厂,避免为将在模型使用前被过滤的工具进行不必要的热路径设置。(#76773) 感谢 @dorukardahan。 - Discord/状态:允许显式的反应工具调用通过 `trackToolCalls: true` 选择加入跟踪 reacted 消息上的后续工具进度,并使用共享的工具显示表情符号表进行状态反应。 - 网关/配置:停止网关启动和热重载自动恢复无效配置;无效配置现在会安全失败(fail closed),`openclaw doctor --fix` 负责最后一次已知良好配置的修复。 - 网关/性能:延迟加载早期运行时发现和关闭钩子辅助函数,将维护定时器推迟到就绪之后,并削减网关启动期间重复的插件自动启用工作。 - 网关/性能:将非就绪边车推迟到就绪信号之后,避免热路径的频道插件 barrel 导入,并在网关启动期间快速路径处理受信任的内置插件元数据。 - 网关/性能:避免在原生可加载插件启动路径上导入 `jiti`,这样编译后的内置插件表面不会支付源转换加载器成本,除非实际需要同步回退加载。 - 插件/加载器:在原生快速路径上保留真实的编译插件模块评估错误,而不是将每个抛出的 `.js` 模块都视为源转换回退未命中。感谢 @vincentkoc。 - QA/Mantis:新增 `pnpm openclaw qa mantis discord-smoke` 运行器和手动 GitHub 工作流,验证 Mantis Discord 机器人能否看到配置的服务器/频道、发布冒烟测试消息、添加反应并上传制品。 - QA/Mantis:新增 `pnpm openclaw qa mantis slack-desktop-smoke` 命令,用于在 Crabbox VNC 桌面内运行 Slack 实时 QA,打开 Slack Web 端,并在 Slack QA 产物旁捕获桌面截图。 - QA/Mantis:通过 desktop-browser Crabbox 和 artifact-copy 子命令传递运行时环境变量,使嵌入的 Mantis 调用者能够在不修改父进程的情况下提供 Crabbox 凭据。感谢 @vincentkoc。 - QA/Mantis:即使远程 Slack QA 失败,也返回已复制的 Slack 桌面截图路径,以便 CLI 仍能打印失败截图产物。感谢 @vincentkoc。 - QA/Mantis:接受来自桌面冒烟预热阶段的 Blacksmith Testbox `tbx_...` 租约 ID,使提供商覆盖配置在 inspect/run 之前不会失败。感谢 @vincentkoc。 - QA/Slack:新增 Slack 实时传输 QA 运行器,涵盖金丝雀测试和 @提及门控测试,用于私有 bot-to-bot 测试框架。感谢 @vincentkoc。 - Gateway/性能:在 Gateway 其余部分启动后延迟加载繁重的 cron 运行时,在就绪后延迟刷新 restart-sentinel,并允许 Gateway 启动基准测试使用 `--cpu-prof-dir` 写入每次运行的 V8 CPU 性能分析文件。 - Gateway/性能:阻止原始 channel-config 模式解析发现捆绑插件的运行时元数据,并新增 `pnpm gateway:watch --benchmark-no-force` 用于在不执行默认端口清理的情况下对启动过程进行性能分析。 - Plugins/引导配置:允许手动设置安装可选的官方插件,包括支持 ClawHub 并具备 npm 回退机制的诊断插件,并将外部 Codex 插件暴露为可选的提供商设置选项。感谢 @vincentkoc。 - Plugins/更新:将官方外部化的捆绑 npm 迁移和 ClawHub 到 npm 的回退机制视为可信的源链接安装,使仅含预发布版本的官方插件包能够从捆绑构建中迁移,而不会被拒绝为不安全的预发布解析。感谢 @vincentkoc。 - Plugins/更新:在早期 npm 回退之后,一旦 ClawHub 包可用,便将 ClawHub 优先的外部化插件安装移回 ClawHub。感谢 @vincentkoc。 - Plugins/更新:清理已外部化的固定 npm 和 ClawHub 插件安装的过时捆绑加载路径,使发布通道同步不会在已安装的外部包之前残留已删除的捆绑路径。感谢 @vincentkoc。 - Plugins/CLI:在 `openclaw plugins list --json` 中包含包依赖的安装状态,以便脚本无需在运行时加载插件即可发现缺失的插件依赖。 - Telegram:在代理消息工具中接受插件拥有的数字论坛主题目标,并在原地包更新期间将 reply-dispatch 提供商块保留在真实稳定的运行时别名之后。修复 #77137。感谢 @richardmqq。 - Google Meet:保留 `realtime.introMessage: ""`,使实时 Chrome 加入时保持静音,而不是恢复默认的语音欢迎语。感谢 @vincentkoc。 - Discord/状态:在 `openclaw channels status`、`openclaw status --deep` 和 fetch-timeout 日志中添加降级的 Discord 传输和 Gateway 事件循环饥饿信号,使间歇性 socket 重置不会看起来像健康的运行通道。(#76327) 感谢 @joshavant。 - Providers/OpenRouter:新增可选的响应缓存参数,仅在验证过的 OpenRouter 路由上发送 OpenRouter 的 `X-OpenRouter-Cache`、`X-OpenRouter-Cache-TTL` 和缓存清除头信息。感谢 @vincentkoc。 - Providers/OpenRouter:扩展应用归属类别,使 OpenClaw 能在验证过的 OpenRouter 路由上宣传编码、编程、写作、聊天和个人代理的使用。感谢 @vincentkoc。 - Plugins/更新:在 beta OpenClaw 更新通道上,默认行的 npm 和 ClawHub 插件更新将优先尝试 `@beta`,当不存在插件 beta 版本时回退到 default/latest。 - Channels/WhatsApp:支持显式的 WhatsApp 频道/通讯 `@newsletter` 出站消息目标,使用频道会话元数据替代 DM 路由。修复 #13417;延续 #13424 中的窄出站目标设计。感谢 @vincentkoc 和 @agentz-manfred。 - Exec 审批:新增基于 tree-sitter 的 Shell 命令解释器,用于未来的审批和命令审查界面。(#75004) 感谢 @jesse-merhi。 - Agents/沙箱:将沙箱容器和浏览器注册表条目存储为按运行时分片的文件,在 `openclaw doctor --fix` 迁移遗留的单体注册表文件期间,减少无关会话的锁竞争。(#74831) 感谢 @luckylhb90。 - Plugins/ClawHub:为 ClawHub 返回的 429 错误附加来自 `RateLimit-Reset`/`Retry-After` 的重置窗口信息,并在请求未认证时追加 `Sign in for higher rate limits.` 提示,以便用户了解下载何时恢复以及如何提升限制。感谢 @romneyda。 - Plugins/运行时状态:新增 `registerIfAbsent` 用于原子化键值存储的去重声明,该操作会返回插件是否成功声明了键且未覆盖现有活跃值。感谢 @amknight。 ### 修复 - fix: 强化后端消息操作网关路由 [AI]。(#76374) 感谢 @pgondhi987。 - 限制 QQBot 流式命令认证 [AI]。(#76375) 感谢 @pgondhi987。 - Plugins/discovery: 忽略仅暴露 TypeScript 源码入口而无编译运行时输出的托管 npm 插件包,以防止陈旧/损坏的安装包在安装期间隐藏可用的内置或可重新安装的分发插件。 - CLI/update: 将 OpenClaw 稳定版修正版本(如 `2026.5.3-1`)视为比其基础稳定版更新,从而避免包更新时再提示降级确认。 - Plugins/install: 对受信任的官方 OpenClaw npm 安装禁用危险模式扫描器警告,从而安装 `@openclaw/discord` 时不再打印凭证收集警告。 - Plugins/release: 使发布的 npm 运行时验证器拒绝空的 `openclaw.runtimeExtensions` 条目,而非将其视为缺失并通过推断输出放行。感谢 @vincentkoc。 - Plugins/security: 在插件安装扫描中匹配源规则上下文时忽略行内和块级注释,从而避免仅含注释的 `fetch`/`post` 引用(靠近环境变量默认值时)拦截干净的插件。感谢 @vincentkoc。 - Doctor/plugins: 即使未显式配置内置插件,也移除其陈旧托管安装记录,以防止 doctor 清理后遗留孤立安装元数据。感谢 @vincentkoc。 - Web fetch: 按所选的抓取提供程序对提供程序回退缓存条目进行作用域划分,以防止配置重载时复用其他提供程序的缓存回退负载。感谢 @vincentkoc。 - Web search: 在工具执行期间尊重延迟绑定的 `tools.web.search.enabled: false`,以防止配置重载后遗留已创建的 `web_search` 工具仍可运行。感谢 @vincentkoc。 - Plugins/packages: 拒绝存在但未能通过包边界检查的推断构建运行时条目,改为不再对已安装包回退至 TypeScript 源码。感谢 @vincentkoc。 - Plugins/loader: 在原生评估已遇到缺失依赖后,不再通过源码转换器重试原生加载的 JavaScript 插件模块,以避免重复的顶层副作用。感谢 @vincentkoc。 - Plugins/security: 当 `process.env` 访问和常规 API 发送仅出现在同一编译包的不同位置时,停止安装扫描器拦截官方内置插件包。 - Plugins/packages: 拒绝空的 `openclaw.runtimeExtensions` 条目,而非静默忽略并回退至推断的 TypeScript 运行时条目。感谢 @vincentkoc。 - Doctor/plugins: 从托管包锁、`package.json` 和 `node_modules` 中移除陈旧的托管 npm 插件影子条目,以防止未来的 npm 操作持续引用已修复的内置插件影子。感谢 @vincentkoc。 - Plugins/runtime state: 当命名空间驱逐与现有条目在同一毫秒运行时,保留正在注册的键,从而防止 `register` 和 `registerIfAbsent` 在驱逐自身新值时错误报告成功。感谢 @vincentkoc。 - Control UI/Talk: 使失败的 Talk 启动错误可关闭,并在关闭时清除陈旧的 Talk 错误状态,从而防止缺失实时语音提供程序配置留下永久聊天横幅。修复 #77071。感谢 @ijoshdavis。 - Control UI/Talk: 在关闭运行时错误横幅时停止并清除失败的实时 Talk 会话,从而下次点击 Talk 时启动全新会话,而非仅停止陈旧会话。感谢 @vincentkoc。 - Control UI/Talk: 下次点击 Talk 时直接从失败的实时 Talk 会话重试,而非要求先单独点击停止陈旧会话。感谢 @vincentkoc。 - Canvas host: 在浏览器画布主机 URL 和启动挂载日志中保留网关 TLS 协议,从而防止直接 HTTPS 网关宣传不安全的画布链接。感谢 @vincentkoc。 - WhatsApp/login: 通过注入的运行时路由登录成功与失败消息,从而设置/引导界面能捕获所有登录输出,而非仅显示二维码。感谢 @vincentkoc。 - Google Chat: 为每个认证客户端创建隔离的 Google 认证传输通道,从而防止 google-auth-library 拦截器变异在 webhook 验证和访问令牌客户端间累积。感谢 @vincentkoc。 - Doctor/plugins: 在 `doctor --fix` 期间移除孤立或已恢复的托管 npm 副本(针对内置 `@openclaw/*` 插件),从而防止陈旧包清单遮蔽当前内置插件配置架构。 - Control UI/performance: 在共享事件日志中限制长任务和长动画帧诊断条目,从而防止慢渲染遥测数据将网关/插件事件从调试和概览视图中挤出。感谢 @vincentkoc。 - Gateway/startup: 仅在 HTTP 服务器绑定后记录画布主机挂载信息,从而启动日志不再报告画布主机在可处理请求前已挂载。 - Control UI/i18n: 在所有语言环境中渲染包含配置分钟数的“Sessions 活跃”过滤器工具提示,并使 i18n 检查拒绝占位符漂移。感谢 @BunsDev。 - Web fetch: 从活跃运行时快照中延迟绑定 `web_fetch` 配置和提供程序回退元数据,与 `web_search` 保持一致,从而长生命周期工具不会使用陈旧的抓取提供程序设置。感谢 @vincentkoc。 - Discord: 当异步机器人探测抛出异常时清除陈旧的启动探测机器人/应用状态,而不仅限于返回降级探测结果时。感谢 @vincentkoc。 - Web search: 通过清单所有权限制显式内置 `web_search` 提供程序的运行时加载作用域,从而选择 DuckDuckGo/Gemini 等时不会导入无关内置提供程序或记录其可选依赖失败。感谢 @vincentkoc。 - 插件/发现:将已安装 `origin: "global"` 插件包上仅源码 TypeScript 运行时检查从配置阻塞错误降级为警告,并让运行时通过 jiti 回退到 TypeScript 源码,因此单个损坏的已安装包不再阻塞无关插件的 `plugins install`;安装时对仅源码新包的拒绝行为保持不变。感谢 @romneyda。 - 提供商/OpenAI Codex:在显示手动重定向粘贴提示前停止 OAuth 进度旋转动画,从而避免回调超时在多个终端刷屏 `Browser callback did not finish`。 - 提供商/DeepSeek:通过轻量级 provider-policy 接口暴露 DeepSeek V4 `xhigh` 和 `max` 思考级别,以便 Control UI `/think` 选择器在运行时插件注册表未激活时仍能显示最大推理选项。修复 #77139。感谢 @bittoby。 - 发布/beta 冒烟测试:当 `gh workflow run` 未返回运行 URL 时,从 `gh run list` 解析已调度的 Telegram beta E2E 运行,从而使维护者助手在调度后不会立即失败。感谢 @vincentkoc。 - 媒体/图片:当可选的 Sharp 转换不可用时,使 HEIC/HEIF 附件保持安全失败(fail-closed)状态,而不是发送仍需转换的原始文件。感谢 @vincentkoc。 - Google Meet:将调用者当前的 agent 对话记录分叉到 agent 模式的会议顾问会话中,从而使 Meet 回复继承加入会议时工具调用的上下文。 - iOS/移动端配对:在生成 QR 码/设置码前拒绝非回环 `ws://` 设置 URL,并允许 iOS Gateway 设置界面扫描 QR 码或粘贴完整的设置码消息。感谢 @BunsDev。 - Control UI:在窄屏和平板宽度下,保持 Gateway Access 输入框和语言选择器限制在卡片内部。 - 智能体/轨迹:限制运行时轨迹捕获并让出队列中的 sidecar 写入,使过大的轨迹停止记录而非独占 Gateway 清理资源。修复 #77124。感谢 @loyur。 - Telegram/流式传输:在共享压缩前清理工具进度草稿预览的反引号,从而使长且反引号密集的进行中文本仍能在安全的代码格式预览中正常渲染,而不是折叠为省略号。 - UI/聊天:从聊天队列文本规则中移除不受支持的 `line-clamp` 声明,以消除 Firefox 控制台噪音,且不改变可见的截断行为。感谢 @ZanderH-code。 - 智能体/Pi:抑制合成中途溢出续传提示的持久化,从而避免对话记录重试恢复时将“从对话记录继续”提示作为新的用户轮次写入。感谢 @vincentkoc。 - 智能体/工具:在消息工具发送前,从可见的富文本展示标题、区块、按钮和选择标签中剥离推理文本,从而防止结构化通道载荷泄露隐藏规划。感谢 @vincentkoc。 - Telegram:将回复调度的延迟提供程序运行时块保留在稳定的分发名称后,并在最终交付后删除 `/reasoning stream` 预览,从而防止包更新和实时推理草稿导致 Telegram 轮次损坏或产生噪音。感谢 @BunsDev。 - Discord:启动网关监控器时不等待启动时的机器人/应用探测,从而使 `/users/@me` REST 路径较慢的 WSL2 主机仍能在状态增强异步完成时将频道上线。修复 #77103。感谢 @Suited78。 - 执行审批:检测 `-S`/`-s` 与其他 env 短选项结合时的 `env -S` 分割字符串命令载体风险,从而使审批说明不会遗漏隐藏在 `env -iS...` 后的分割载荷。感谢 @vincentkoc。 - Google Meet:在语音合成后记录具体的 agent 模式 TTS 提供程序、模型、语音、输出格式和采样率,从而使 Meet 日志显示每个回复由哪个语音后端生成。 - 语音通话:当实时提供程序正常关闭时标记实时通话已完成,从而防止 Twilio/OpenAI/Google 实时停止事件遗留活跃通话记录。感谢 @vincentkoc。 - 网关/更新:将关闭路径保留在稳定的运行时块后,并为最近的 `server-close-*` 哈希提供兼容性别名,从而防止手动替换 npm 包导致已运行的网关无法干净关闭。修复 #77087。感谢 @westlife219。 - Control UI/媒体:为助手媒体获取生成短期作用域票据,并渲染带票据的 URL,而不是在聊天图片 URL 中暴露长期认证令牌。修复 #70830 和 #77097。感谢 @hclsys。 - 执行审批:将 POSIX `exec` 视为内联评估、shell 包装器和评估/源码检测的命令载体,从而使审批说明和命令风险检查不会遗漏隐藏在 `exec` 后的载荷。感谢 @vincentkoc。 - Google Meet:在启动 Chrome 和配对节点 Meet 语音对讲桥接时记录已解析的音频提供程序模型,从而使 agent 模式加入显示 STT 模型,双向加入显示实时语音模型。 - 诊断:在 cron 恢复上下文中处理缺失的 session-tail 文件,且不触发扩展测试类型检查。感谢 @vincentkoc。 - QA/Slack:更新用于结构化进度草稿辅助函数的 Slack 调度预览回退测试 SDK mock,从而使富进度草稿回归套件覆盖新导入项,而不是在断言运行前失败。感谢 @vincentkoc。 - 发布验证:允许聚焦的 QA 实时重运行选择 Matrix 和 Telegram 而不运行 Slack,从而防止已知的 Slack 凭证池故障阻塞非 Slack 的实时验证。感谢 @vincentkoc。 - 插件/加载器:将捆绑插件包的 `test-api.js` 别名保留在私有 QA 模式后,从而防止源码转换在正常插件加载期间暴露仅用于测试的公开接口。感谢 @vincentkoc。 - 网关/启动:即使延迟维护计时器在就绪后失败,也启动 cron 并记录就绪后的内存轨迹,从而防止非致命计时器设置问题静默导致计划任务闲置。感谢 @vincentkoc。 - 执行审批:在审批命令和严格的内联评估检查之前,解包 BSD/macOS `env -P <path>` 载体命令,以确保 `/approve` Shell 执行和内联解释器负载仍被该 env 形式拦截。 - 智能体/会话状态:即使运行尚未在持久化会话存储中创建条目,也保持实时运行会话上的语义化 `session_status({ sessionKey: "current" })`,而不是回退到沙箱策略键。感谢 @vincentkoc。 - QA/Slack:在源码模式 QA 运行期间解析捆绑官方插件的公共表面包别名,以便发布 Slack 实时验证无需工作区符号链接即可加载 `@openclaw/slack/api.js`。感谢 @vincentkoc。 - Codex:当沙箱策略使用独立的会话键时,将实时运行会话键传入 app-server 动态工具,以便 `session_status({ sessionKey: "current" })` 报告活跃运行而非沙箱策略键。感谢 @vincentkoc。 - 网页搜索:当活跃运行时元数据或活跃插件注册表不完整时,保持一等公民助手 `web_search` 的自动检测及配置的运行时提供者可见。修复 #77073。感谢 @joeykrug。 - 插件/工具:即使工具来自共享的非可选工厂,也将清单中可选的同类工具标记为可选,以便缓存/状态/MCP 元数据保持“选择加入”工具策略的准确性。感谢 @vincentkoc。 - Matrix:将 `streaming.progress.toolProgress` 限制在进度草稿模式范围内,以便除非禁用 `streaming.preview.toolProgress`,否则部分和静默 Matrix 预览不会丢失工具进度。感谢 @vincentkoc。 - 网关/验证:隔离网关服务器验证文件,在请求跟踪覆盖中忽略无关的启动日志,并在共享认证套接字卡住时快速失败,从而减少贡献者遇到的主分支 CI 误报失败。感谢 @amknight。 - 频道/流式传输:将 `streaming.progress.toolProgress` 限制在进度草稿模式范围内,以便禁用紧凑进度行不会静音部分/块预览工具更新。感谢 @vincentkoc。 - 插件/更新:将 OpenClaw 稳定修正版本(如 `2026.5.3-1`)视为稳定版本用于 npm 安装、插件更新和捆绑版本比较,以便 `latest` 可在无需预发布选择加入的情况下推进官方插件。感谢 @vincentkoc。 - 控制面板 UI:将外观 tweakcn 浏览操作和文档指向实时 tweakcn 编辑器路由,而非已移除的 `/themes` 页面。修复 #77048。 - 控制面板 UI:通过清理后的 Markdown 管道渲染“梦境日记”文本,使日记中的粗体/斜体/标题 Markdown 不再显示为字面源文本。修复 #62413。 - 控制面板 UI:渲染输出以文本块数组形式到达的工具结果,并为展开的工具输出提供可滚动区块,以便在 WebChat 中保持读取/执行输出可见。修复 #77054。 - MCP:在 `conversations_list` 和 `messages_read` 的主要文本内容中包含序列化对话/消息负载,同时为支持的客户端保留 `structuredContent`。修复 #77024。 - 媒体:将写入后媒体 fsync 步骤返回的 `EPERM` 视为尽力而为,允许在成功写入后拒绝 `fsync` 的 Windows 文件系统上完成 WebChat 和频道上传。修复 #76844。 - 媒体/Telegram:当可选图像优化不可用时,发送符合限制的原图,以便 Telegram MEDIA 回复和消息工具图像发送不会仅因缺少 `sharp` 而失败。修复 #77081。(#77117) 感谢 @pfrederiksen。 - 诊断信息:在停滞会话和卡死会话的恢复日志中包含最后进度、Cron 任务/运行 ID、已停止的 Cron 任务名称以及最后助手转录片段,以便 Cron 停滞日志显示具体停止了什么。 - 流式传输频道:添加 `streaming.preview.commandText: "status"` / `streaming.progress.commandText: "status"` 以在预览进度行中隐藏命令/执行文本,同时保留已发布的原始命令文本默认值。修复 #77072。 - 智能体/Cron:让显式 Cron `timeoutSeconds` 驱动 CLI 无输出和嵌入式 LLM 空闲看门狗,而不是被恢复默认值限制。修复 #76289。 - 插件/目录:对已禁用、被拒绝或不在严格白名单内的外部频道插件,屏蔽缺失 `channelConfigs` 的兼容性诊断。修复 #76095。 - 诊断信息:保持 Webhook/消息 OTEL 属性和 Prometheus 交付标签为低基数,并从跨度中省略原始聊天/消息 ID,以便进度草稿和消息工具模式不会泄露高基数消息标识符。 - Google Meet:停止向智能体和配置 UI 通告遗留的 `mode: "realtime"`,同时将其保留为 `mode: "agent"` 的隐藏兼容别名,以便新加入者使用 STT -> OpenClaw 智能体 -> TTS 路径,而不是选择直接实时语音回退。 - Google Meet:为生成的命令对 SoX 音频命令添加 `chrome.audioBufferBytes`,并将默认缓冲区从 SoX 的 8192 字节降低至 4096 字节,以减少 Chrome 语音回退延迟。 - Google Meet:将实时提供者配置拆分为智能体模式转录和双向模式语音提供者,并使用 `doctor --fix` 迁移遗留的 Gemini Live 双向配置,以便 Gemini Live 可回退直接双向模式,同时不破坏默认 OpenClaw 智能体语音回退路径。 - Google Meet:在加入介绍就绪期间继续等待 Meet 麦克风取消静音,而不是在 Meet 短暂报告本地麦克风静音时永久跳过语音回退。 - Google Meet:在插件清单架构和设置提示中暴露 `voiceCall.postDtmfSpeechDelayMs`,以便基于清单的配置编辑接受运行时支持的 Twilio 延迟键。感谢 @vincentkoc。 - Google Meet:当 `realtime.transcriptionProvider` 未设置时,保留显式的非 Google `realtime.provider` 值作为转录提供者的兼容回退。感谢 @vincentkoc。 - Google Meet:使 Twilio 设置状态要求启用 `voice-call` 插件条目,而不是将缺失条目视为就绪。感谢 @vincentkoc。 - Telegram:在回复投递中渲染共享的交互式回复按钮,以便插件审批消息显示内联键盘。(#76238) 感谢 @keshavbotagent。 - Cron/sessions:在磁盘对话记录存在之前,保持没有磁盘对话记录的 cron 元数据行为不可恢复,这样 doctor 和 `sessions cleanup --fix-missing` 不再将生成记录前的 cron 行报告或清理为损坏的会话。Refs #77011。 - Agents/cli-runner:当 `~/.claude/projects/` 中已保存的 `claude-cli` 恢复 sessionId 对应的磁盘对话记录不存在时,在准备阶段丢弃该 sessionId。这样由半安装 `update.run` 导致的陈旧绑定就不会将后续运行(自动回复/Telegram 直连)困在 `claude --resume` 超时循环中;运行将重新开始,并通过现有的运行后流程写回新的 sessionId。(#77030; refs #77011) 感谢 @openperf。 - Release validation:通过 Windows 安全的 Node/npm 包装器安装跨操作系统 TypeScript 测试框架,使原生 Windows 包检查能够顺利运行 OpenClaw 冒烟测试套件,而不是在捕获制品前退出。感谢 @vincentkoc。 - Release validation:当内置的 2026.5.2 更新器触发原生模块交换清理回退机制时,允许 Windows 打包升级检查继续执行。通过包元数据和下游冒烟测试验证回退安装的候选版本,而不是在立即更新状态探测时崩溃。感谢 @vincentkoc。 - Doctor/plugins:当另一个已配置的插件是同一频道的实际所有者时,跳过基于频道的官方插件安装,这样 `doctor --repair` 在 `openclaw-lark` 处理 `channels.feishu` 时不会重新安装 `feishu`。修复 #76623。感谢 @fuyizheng3120。 - Gateway/sessions:对重复的思维选项增强进行缓存,并在列出会话时跳过未使用的成本回退检查,从而减少大型多代理存储中每行的处理开销。修复 #76931。 - Gateway/sessions:限制默认的 `sessions.list` RPC 响应并报告截断元数据,防止 Slack 重度使用的长生命周期存储强制 Gateway 无限制地构建行数据。修复 #77062。 - Agents/tools:在插件工具注册和实时运行时配置获取中使用仅配置的运行时快照,避免在核心插件工具准备路径上进行昂贵的完整密钥快照克隆。修复 #76295。 - Agents/tools:在构建可选的 PDF/媒体工具工厂前遵循有效的工具拒绝列表,这样 `tools.deny: ["pdf"]` 会在后续策略过滤前跳过 PDF 设置。修复 #76997。 - MCP/plugin tools:在通过独立 MCP 桥接暴露插件工具时应用全局 `tools.profile`、`tools.alsoAllow` 和 `tools.deny` 策略,使 ACP 客户端不会看到被策略隐藏的插件工具,也不会遗漏需手动选择的可选工具。感谢 @vincentkoc。 - Plugin tools:在选择插件工具运行时遵循明确的工具拒绝列表,这样被拒绝的插件工具在直接命令或 Gateway 界面中不会在后续策略过滤前被实例化。感谢 @vincentkoc。 - Plugin tools:按清单中的每个工具可选策略过滤工厂返回的工具,这样共享运行时工厂的可选同类工具除非被明确允许,否则将保持隐藏。感谢 @vincentkoc。 - Agents/transcripts:仅在入站用户轮次实际持久化后,才从当前对话记录重试上下文溢出压缩,并防止 WebChat 代理运行实时投递写入重复的 Pi 管理助手轮次。修复 #76424。(#77033) - Agents/bootstrap:将待处理的 `BOOTSTRAP.md` 和引导截断通知保留在系统提示的项目上下文中,而不是将设置文本或原始警告诊断信息复制到 WebChat 用户/运行时上下文中。修复 #76946。 - Channels/WhatsApp:在 `onlyBuiltDependencies` 中允许 `@whiskeysockets/libsignal-node`,这样 pnpm v9+ 的 `blockExoticSubdeps` 不再拒绝 baileys git-tarball 子依赖,从而避免所有入站代理回复被静默。修复 #76539。感谢 @ottodeng 和 @vincentkoc。 - Gateway/install:在 macOS LaunchAgent 环境变量文件中保留 `.env` 管理的值,同时继续跟踪 `OPENCLAW_SERVICE_MANAGED_ENV_KEYS`,这样重新生成的服务不会因缺少管理的认证/提供商密钥而无法启动。修复 #75374。 - Gateway/restart:当 `lsof` 仅报告 Node 进程名时,通过 argv 验证监听器 PID,这样过期的 Gateway 清理逻辑也能找到 macOS `cnode` 监听器。修复 #70664。 - Gateway/logging:在创建文件记录器前展开 `logging.file` 开头的 `~`,防止基于家目录的日志路径导致启动崩溃循环。修复 #73587。 - Channels/CLI:当获取提供商使用情况失败时,保持 `openclaw channels list --json` 可用,并报告各提供商的使用情况错误而不中止频道列表。Refs #67595。 - Doctor/plugins:在缺失插件修复期间不将 `plugins.allow` 条目视为已配置的插件,这样严格的允许列表不再安装允许但未使用的插件。感谢 @vincentkoc。 - Agents/messaging:在相同目标的 `message` 工具发送后提供独立的最终评论,同时仍对工具已发送的文本/媒体进行去重,这样简短的结束语不再被静默丢弃。修复 #76915。感谢 @hclsys。 - Agents/messaging:在匹配消息工具回复去重路由时保留字符串类型的线程 ID,避免在频道插件比较前对看似数字的主题 ID 造成精度丢失。感谢 @vincentkoc。 - Channels/streaming:在 Slack、Discord、Telegram、Matrix 和 Microsoft Teams 的进度草稿中遵循 `agents.defaults.toolProgressDetail: "raw"` 设置,这样在调试时工具启动行会包含原始命令/详细输出。感谢 @vincentkoc。 - Channels/streaming:从压缩的原始进度草稿行中移除未匹配的 inline-code 反引号,避免在长命令详情被缩短后出现残留的 Markdown 标记。感谢 @vincentkoc。 - Discord/Slack/Mattermost:使草稿预览的工具进度配置帮助与运行时行为保持一致,当 `streaming.preview.toolProgress` 为 false 时隐藏中间工具更新。感谢 @vincentkoc。 - 飞书:使用共享的频道进度格式化器处理流式卡片工具状态行,包括原始命令/详细输出及消息工具过滤。感谢 @vincentkoc。 - Mattermost:使用共享的进度草稿格式化器处理工具状态预览,当启用 `agents.defaults.toolProgressDetail: "raw"` 时包含原始命令/详细输出。感谢 @vincentkoc。 - Mattermost:在草稿预览激活期间抑制独立显示的默认工具进度消息,包括禁用草稿工具行时。感谢 @vincentkoc。 - Telegram:通过内联键盘附带共享的备用按钮标签文本来发送仅按钮的交互式回复,避免将回复丢弃为空。感谢 @vincentkoc。 - OpenAI Codex:在启动未指定明确认证配置文件的 app-server 客户端时,遵循 `auth.order.openai-codex` 设置,使状态/模型探测及隐式启动使用已配置的 Codex 账户,而非回退到默认配置文件。感谢 @vincentkoc。 - OpenAI Codex:使受 SSRF 防护的提供商请求继承 OpenClaw 的 undici IPv4/IPv6 回退策略,以便在 DNS 仍返回不可达 IPv6 地址时,ChatGPT 支持的 Codex 能在仅支持 IPv4 的主机上恢复运行。修复 #76857。感谢 @jplavoiemtl 和 @SymbolStar。 - Gateway/systemd:在重新部署期间保留操作员添加的密钥到 Gateway 环境变量文件中,同时清除 OpenClaw 管理的键(如 `OPENCLAW_GATEWAY_TOKEN`),以确保新的暂存值不会被陈旧的环境文件副本覆盖;当状态目录 `.env` 为空时,操作员密钥也会被保留。修复 #76860。感谢 @hclsys。 - 插件更新:当默认/最新规范仍解析为已安装的预发布版本(且安装程序应将其替换为稳定版回退)时,不要将可信的官方 npm 更新短路标记为未更改。感谢 @vincentkoc。 - 插件更新:清理已外部化 npm 安装的陈旧捆绑加载路径,这些安装的旧版安装记录仅保留了已解析的包名。感谢 @vincentkoc。 - 插件工具:即使同一插件的其他默认工具可用且 `tools.alsoAllow` 指定了该可选工具,仍保持认证不可用的可选工具处于隐藏状态。感谢 @vincentkoc。 - 实时转录:针对 OpenAI、xAI 和 Deepgram 流式转录,将提供商就绪前发生的套接字关闭报告为“就绪前关闭”故障,而非误标为连接超时。感谢 @vincentkoc。 - OpenAI/Google Meet:当套接字在 `session.updated` 之前关闭时,使实时语音连接尝试失败,避免卡住等待从未就绪的桥接的 Meet 加入。感谢 @vincentkoc。 - Google Meet:在抑制实时回声转录时,避免将重复的参与者词语误判为多次助手重叠匹配。感谢 @vincentkoc。 - Google Meet:将 `mode: "agent"` 设为默认的 Chrome 语音回传路径,输入使用实时转录,输出使用常规 OpenClaw TTS;同时保留 `mode: "bidi"` 作为直接实时语音答案选项,并将 `mode: "realtime"` 接受为代理模式的兼容别名。 - QA/缓存:要求完整的 `CACHE-OK <suffix>` 标记出现后,实时缓存探测才会停止重试,从而防止仅含后缀的文本掩盖损坏的探测响应。感谢 @vincentkoc。 - Slack/Matrix:当 `streaming.progress.label=false` 且进度工具行被禁用时,避免创建空白的进度草稿消息。感谢 @vincentkoc。 - Slack/Discord:当部分预览流式传输配置为 `streaming.preview.toolProgress: false` 时,抑制独立的工具进度消息,以符合文档中描述的静默预览行为。感谢 @vincentkoc。 - QA/Matrix:保持模拟 OpenAI 工具进度提供程序与精确标记的 Matrix 提示保持一致,以便强化后的实时预览场景在最终交付前仍强制进行确定性读取。感谢 @vincentkoc。 - Matrix:在发布选项反应之前绑定原生审批反应目标,以便在审批处理器完成设置期间,线程提示上的快速审批反应不会被丢弃。感谢 @vincentkoc。 - Google Meet:通过 `realtime.strategy: "agent"` 默认使实时语音回传由代理驱动,保留 `realtime.strategy: "bidi"` 作为之前的直接双向模型行为;为本地 Chrome 实时加入自动将 Meet 标签页的扬声器输出路由至 `BlackHole 2ch`;在咨询代理前合并邻近的语音转录片段;并避免因服务器 VAD 或陈旧播放管道错误而截断代理语音。 - Google Meet:抑制来自实时输入路径的排队助手播放和类似助手的转录回声,以免会议将代理的自身语音误听为新用户发言而导致循环或自我中断。 - OpenAI/Google Meet:在将桥接视为已连接之前,等待实时语音 `session.updated`,以免 Meet 加入返回时音频排在未配置的实时会话之后。感谢 @vincentkoc。 - 插件/目录:将官方外部目录描述符合并到部分软件包频道配置元数据中,以便滞后的企业微信/元宝清单保留其自身架构,同时仍暴露主机提供的标签和设置文本。感谢 @vincentkoc。 - 插件/目录:使用 OpenClaw 目录中的频道配置描述符和声明的工具契约,补充滞后的官方外部企业微信和元宝 npm 清单,以便可信的软件包扫描不再因外部包元数据落后于主机契约而失败。感谢 @vincentkoc。 - 插件/安装:当 npm `latest` 指向预发布版本时,使可信的官方 `@openclaw/*` 目录安装能够恢复:通过回退到最新的稳定版本,或为仅支持预发布的启动包选择最新的精确预发布版本并附带警告,而不是让 beta/开发插件扫描在安装时失败。感谢 @vincentkoc。 - Google Meet:针对实际的 Meet 标签页授予 Chrome 媒体权限,仅在加入 Meet 后启动本地实时音频桥接,在状态/日志中暴露实时转录内容,并使用当前 OpenAI 实时输出音频事件强制生成明确的音频响应,以防止 BlackHole 捕获导致 OpenClaw 参与者保持静音或无声。 - Memory/LanceDB:在捆绑的内存插件包中声明 `apache-arrow`,以便 LanceDB 安装时包含其运行时依赖。修复 #76910。感谢 @afiqfiles-max。 - CLI/devices:在配对范围所有权被拒绝后,使用 `operator.admin` 重试显式设备配对审批,以便现有的具备管理员权限的已配对设备令牌在升级后能够恢复新的 Control UI/浏览器配对,而无需手动编辑 JSON。修复 #76956。感谢 @neo19482。 - Google Meet:使用本地通话控制麦克风按钮替代已禁用的远程参与者静音按钮,并在 OpenClaw Meet 麦克风保持静音时阻止实时语音。 - Google Meet:在状态检查期间刷新实时浏览器状态,并在 Meet 完成加入后重试延迟语音,使刚打开的通话标签页不再因过时的 `not-in-call` 健康状态而导致语音卡住。 - Plugins/install:当 `plugins/installs.json` 为空或部分时,从受管理的 npm 根目录恢复安装账本,以便重新安装 Discord 和 Codex 时不会导致另一个已安装的插件消失。 - Google Meet:当 CDP 授权不影响已附加的 Chrome 页面时,通过 Playwright 浏览器上下文授予 Meet 媒体权限,并报告通话中的麦克风/扬声器权限问题,而不是标记实时语音就绪。 - Google Meet:在 Linux 预发布分片上保持 Chrome 实时传输测试的隔离性,同时保留仅 macOS 的运行时保护。感谢 @vincentkoc。 - QA/Slack:在任何意外的 SUT(被测系统)回复时使实时提及门控场景失败,即使该回复未回显预期标记。感谢 @vincentkoc。 - QA/Matrix:将实时工具进度预览检查从 `HEARTBEAT.md` 转移,并在实时标记回复未匹配精确令牌时报告最终预览候选项。感谢 @vincentkoc。 - QA/Matrix:使实时工具进度预览和错误检查能够验证进度替换事件,而无需依赖预览显示 `Working`、`tool: read`、无标签/无路径的 `read from` 或观察到原始草稿根目录。感谢 @vincentkoc。 - QA/Matrix:通过观察两个 Matrix 事件后经由网关解析已接受的审批,使 target=both 审批场景专注于频道和 DM 元数据传递。感谢 @vincentkoc。 - QA/Matrix:在启动线程化审批决策超时前,等待实时审批反应的回显。感谢 @vincentkoc。 - QA/Matrix:在确认审批反应回显时重用已准备好的驱动同步流,避免在实时发布运行中遗漏自反应。感谢 @vincentkoc。 - Tlon:在频道配置模式中暴露 `groupInviteAllowlist`,并明确说明在没有邀请白名单的情况下,群组邀请自动接受将失败(安全关闭)。感谢 @vincentkoc。 - Channels/WhatsApp:在入站分发期间应用共享的群组/频道可见回复模式,使群组回复默认保持仅消息工具,而不会覆盖直接聊天的框架默认值。引用 #75178 和 #67394。感谢 @scoootscooob。 - Control UI/WebChat:将重复的飞行中内部文本发送合并到活跃的 Gateway 运行中,以便快速重复提交不会启动新的 `agent:main:main` 分发。修复 #75737。感谢 @dsdsddd1 和 @BunsDev。 - Mattermost:接受文档化的 `channels.mattermost.streaming` 配置,并通过禁用草稿预览帖子来遵循 `streaming: "off"`。感谢 @vincentkoc。 - Mattermost:在生成的频道配置元数据中暴露流式进度配置标签和帮助文本,以便 Control UI/文档能够解释新的 `channels.mattermost.streaming.progress.*` 字段。感谢 @vincentkoc。 - Mattermost:在进度草稿模式中遵循 `channels.mattermost.streaming.progress.toolProgress=false`,使紧凑的工具状态行保持隐藏,直到最终交付。感谢 @vincentkoc。 - Microsoft Teams:在原生 Teams 进度流中遵循进度草稿工具行,并在 `channels.msteams.streaming.progress.toolProgress=false` 时抑制独立工具消息。感谢 @vincentkoc。 - Discord:在流式回复期间保持进度草稿边界回调的绑定,以便在进度预览在助手和推理块之间过渡时,扩展程序 lint 检查保持通过。感谢 @vincentkoc。 - Discord:从活跃运行时快照中解析基于 SecretRef 的命名账户机器人令牌,并防止未解析的配置令牌导致状态或健康检查崩溃。(#76987) 感谢 @joshavant。 - Channels/streaming:在捆绑的频道配置元数据中暴露 `streaming.progress.label`、`labels`、`maxLines` 和 `toolProgress`,以便进度草稿设置出现在配置、文档和控制界面中。感谢 @vincentkoc。 - Channels/streaming:对 `streaming.progress.label: "auto"` 进行空白符和大小写规范化,以便进度草稿标签继续使用内置标签池,而非渲染字面量 `auto` 标题。感谢 @vincentkoc。 - Plugins/Codex:为 `/codex bind` 应用服务器回合保留 Codex 原生 OAuth 路由,以便绑定会话保留所选的 Codex 认证配置文件,而不是回退到公共 OpenAI 凭据。(#76714) 感谢 @keshavbotagent。 - Telegram:保持状态检查指向活跃聊天,以便查询当前会话时不再报告旧的私聊对话。(#76708) 感谢 @amknight。 - Gateway/install:在重新生成受管理的网关服务时,优先使用受支持的系统 Node 而非 nvm/fnm/volta/asdf/mise,以便 `gateway install --force` 不再重新生成会被 doctor 立即标记为版本管理器支持的 service 定义。修复 #76339。感谢 @brokemac79 和 @BunsDev。 - Cron/状态:将明确设置 `delivery.mode: "none"` 的任务渲染为无投递预览,并清晰标记 cron 会话历史,而非显示回退投递或直接会话行。修复 #76945。 - Gateway/用量:通过持久化会话聚合缓存提供 `usage.cost` 和 `sessions.usage`,支持锁安全的后台刷新和本地化过期缓存状态,从而避免大型用量视图重复全量扫描。(#76650) 感谢 @Marvinthebored。 - 插件/钩子:允许通过操作者配置中的 `plugins.entries.<id>.hooks.timeoutMs` 和 `plugins.entries.<id>.hooks.timeouts` 限制插件类型钩子的超时,从而无需修补已安装的插件代码即可调整慢速钩子。修复 #76778。感谢 @vincentkoc。 - Telegram:在顶层和每个账户级别添加 `channels.telegram.mediaGroupFlushMs`,使操作者能够调整相册缓冲,而非受限于硬编码的 500ms 媒体组刷新窗口。修复 #76149。感谢 @vincentkoc。 - 配置/消息:将布尔值 `messages.visibleReplies` 和 `messages.groupChat.visibleReplies` 强制转换为文档中记录的枚举模式,使直观的开关不再导致配置失效及频道启动失败。修复 #75390。感谢 @scottgl9。 - 智能体/网络:允许受信任的网页搜索提供商和配置的模型提供商主机在 Surge/Clash/sing-box 的假 IP DNS 后正常工作,仅针对请求作用域的主机名接受 RFC 2544 和 IPv6 ULA 合成响应,而不授予广泛的私有网络访问权限。引用 #76530 和 #76549。感谢 @zqchris。 - 提供商:在未配置显式分发策略时,为受保护的提供商模型获取遵循 env-proxy 设置,同时保留显式的传输覆盖。修复 #70453。(#72480) 感谢 @mjamiv。 - 网页抓取:新增默认关闭的 `tools.web.fetch.useTrustedEnvProxy` 选项,适用于仅代理环境,使 `web_fetch` 能够允许操作者控制的 HTTP(S) 代理解析 DNS,同时保留默认的严格 DNS 固定和主机名策略检查。引用 #58034 和 #62560。感谢 @cosmicnet 和 @mjamiv。 - 飞书:在顶层和每个账户级别接受并遵循 `channels.feishu.blockStreaming`,同时保持旧版默认关闭,使飞书卡片不再拒绝文档中的配置或静默丢弃块级回复。修复 #75555。感谢 @vincentkoc。 - Gateway/更新:避免在 macOS 更新引导后立即执行 `launchctl kickstart -k`,并在打包后安装和 `doctor --fix` 期间解除悬空的全局插件运行时符号链接,使升级不再向新启动的 Gateway 发送 SIGTERM 信号,或留下指向已修剪 `plugin-runtime-deps` 树捆绑的插件导入。完成 #76261 并修复 #76466。(#76929) - Google Chat:在 google-auth/gaxios 拦截器运行前规范化自定义 Google 身份验证传输标头,恢复证书检索期望 Fetch `Headers` 时的 webhook 令牌验证。修复 #76742。感谢 @donbowman。 - Google Chat:在 google-auth-library 读取 cache-control 前规范化 Google 身份验证证书响应标头,使入站 webhook 身份验证不再因 `res?.headers.get is not a function` 而拒绝。修复 #76880。感谢 @donbowman。 - WhatsApp:通过活动运行时路由初始和重启套接字的终端登录 QR 码输出,使 `openclaw channels login --channel whatsapp` 不会因直接写入 stdout 而丢失 QR 码。修复 #76213。感谢 @dougvk。 - Doctor/插件:在 `doctor --fix` 期间重置过期的 `plugins.slots.memory` 和 `plugins.slots.contextEngine` 引用,使缺失插件配置的清理不会留下无法恢复的槽位所有者。修复 #76550 和 #76551。感谢 @vincentkoc。 - 文档/WhatsApp:合并网关频道配置示例中重复的顶层 `web` 对象,使复制粘贴的 WhatsApp 配置同时保留 `web.whatsapp` 和重连设置。修复 #76619。感谢 @WadydX。 - 插件/Anthropic:从捆绑的提供商策略工件中暴露 Claude 思考配置文件,使非运行时调用者保留 Opus 4.7 的 `adaptive`、`xhigh` 和 `max`,而非降级为 `high`。修复 #76779。感谢 @tomascupr 和 @iAbhi001。 - 插件/工具:将 `tools.alsoAllow` 视为可选的插件工具发现提示,但不将其内部的全允许默认值视为加载所有清单标记的可选插件工具的权限。修复 #76616。 - Discord/原生命令:当 `channels.discord.commands.native=false` 时跳过斜杠命令注册和清理 REST 调用,使低性能网关无需等待已禁用的原生命令生命周期请求即可启动。修复 #76202。感谢 @vincentkoc。 - CLI/插件:在托管代理启动和完整插件 CLI 运行时加载之前,拒绝未拥有的命令根(如 `openclaw foo`),同时保留清单拥有和 CLI 元数据拥有的插件命令。修复 #75287。感谢 @neilofneils404。 - CLI/消息:为显式的网关拥有消息操作跳过本地配置频道的插件预加载,使标准化的 CLI 投递委托给网关,而无需在短生命周期的 CLI 进程中初始化频道运行时。修复 #75477。 - 插件/命令:规范化空的插件命令处理程序结果,并允许 Telegram 原生插件命令在返回 `undefined` 时发送空响应回退,而非抛出异常。修复 #74800。感谢 @vincentkoc。 - 插件/工具:当活动注册表仅具有部分工具覆盖时,冷加载选定的插件工具注册表,使通配符扩展的白名单不再将已安装的插件工具从 `tools.effective` 中隐藏。修复 #76780。感谢 @lilesjtu。 - 插件/工具:将缓存和运行时的插件工具名称冲突与规范化的核心工具名称进行比较,从而阻止核心工具的大小写变体,避免泄漏重复的工具注册。感谢 @vincentkoc。 - 插件/OpenRouter:通过运行时和轻量级提供商策略接口公开 DeepSeek V4 的思考级别(包括 `xhigh` 和 `max`),使 `/think` 验证不再拒绝经 OpenRouter 路由的 DeepSeek V4 模型。修复 #74788。感谢 @vincentkoc。 - 状态/会话:在渲染状态摘要时,忽略格式错误的非字符串持久化会话提供程序/模型元数据,而不是抛出异常。修复 #76206。感谢 @vincentkoc。 - CLI/配置:执行 `openclaw config unset array[index]` 时仅移除目标数组元素,避免在写入配置时重放未设置操作并误删移位后的下一个元素。修复 #76290。感谢 @SymbolStar 和 @vincentkoc。 - 插件/语音通话:将异常的本机 Gateway 关闭码 1006 视为独立的 CLI 回退情况,以便在 Gateway 套接字在返回响应前关闭时,`voicecall smoke` 及相关命令仍能运行提供程序检查路径。 - 智能体/工具:停止将 `tools.deny: ["write"]` 视为隐式的 `apply_patch` 拒绝;希望阻止补丁写入的操作员应显式拒绝 `apply_patch` 或 `group:fs`。修复 #76749。(#76795) 感谢 @Nek-12 和 @hclsys。 - 插件/发布:验证已发布的插件 npm 压缩包在发布后暴露了编译后的运行时入口,在发布收尾前捕获仅含 TypeScript 的包工件。感谢 @vincentkoc。 - CLI/消息:当消息命令插件注册表在分发前加载失败时,以非零状态码干净退出,防止 `openclaw-message` 子进程在插件加载错误后继续存活。修复 #76168。 - 插件/配置:将存在但因路径安全检查而被拦截的配置插件报告为“已拦截”,而不是过时的“插件未找到”条目,并在发现过程中去重重复的拦截候选警告。修复 #76144。感谢 @mayank6136。 - Gateway/更新:在包更新后恢复已安装但未加载的 macOS LaunchAgent,重新运行 Gateway 健康/版本/通道就绪检查,并在报告更新失败前打印重启、重新安装和回滚指南。(#76790) 感谢 @jonathanlindsay。 - CLI/插件:说明缺失的插件命令别名是否属于默认禁用的内置插件,并提供 `openclaw plugins enable <plugin>` 修复命令。(#76835) - Gateway/Bonjour:仅在 macOS 主机上自动启动局域网组播发现,同时在其他平台保留显式的 `openclaw plugins enable bonjour` 启动方式,使不需要局域网发现的 Linux 服务器和容器避免默认的 mDNS 探测和看门狗频繁触发。引用 #74209。 - Gateway/macOS:停止在新鲜引导后让 `doctor` 和 LaunchAgent 恢复运行 `launchctl kickstart -k`,避免刚启动的 Gateway 立即收到 SIGTERM,同时仍能轻推已加载的 launchd 作业。修复 #76261。感谢 @solosage1。 - 代理/调试:在托管代理模式激活期间,禁用调试代理对代理请求和 CONNECT 隧道的直接上游转发,除非显式设置 `OPENCLAW_DEBUG_PROXY_ALLOW_DIRECT_CONNECT_WITH_MANAGED_PROXY=1` 以用于批准的本地诊断。感谢 @jesse-merhi 和 @mjamiv。 - Google Meet:将有状态 CLI 会话命令通过 Gateway 拥有的运行时进行路由,以便在启动 CLI 进程退出后,已加入的实时会话仍能存活。修复 #76344。感谢 @coltonharris-wq。 - 内存/状态:在 `memory status --deep` 和 `openclaw status` 中将内置 sqlite-vec 存储的就绪状态与嵌入提供程序的就绪状态分离,使本地向量存储故障不再被误认为提供程序故障,且提供程序故障不再掩盖健康的本地向量存储。 - CLI/医生:当 CLI 侧无法解析活动内存后端时,信任已就绪的 Gateway 内存探测,防止对健康的运行时配置产生虚假的“未注册活动内存插件”警告。修复 #76792。感谢 @som-686。 - 内存/状态:通过将向量和嵌入提供程序探测保留给 `--deep` 或 `--index` 参数,使纯 `openclaw memory status` 和 `openclaw memory status --json` 保持轻量只读路径。修复 #76769。感谢 @daruire。 - Telegram:当较新的已接收消息在较旧的 Telegram 分发完成前到达时,抑制过期的同会话回复。修复 #76642。感谢 @chinar-amrutkar。 - Gateway/诊断:限制重复的长时间运行活动工作会话警告,使健康的定时任务或子代理运行不再在每个心跳周期打印相同的 `recovery=none` 行。 - Gateway/诊断:将非阻塞活动工作和瞬态事件循环最大尖峰存活诊断从默认 Gateway 控制台中移除,同时保留针对排队、停滞和可恢复工作的结构化诊断事件和警告。 - Slack:将常规的 Socket Mode pong 超时重连合并为一条 OpenClaw 重连日志,并抑制重复的 Slack SDK pong 警告。 - Gateway/诊断:在长时间无进展停滞后中止排空嵌入式运行,使单个死会话不再因重复的 `recovery=none` 存活警告而阻塞排队的 Discord/频道回合。 - 插件/ClawHub:同时接受实时工件解析器的 `kind`/`sha256` 字段名和强类型的 `artifactKind`/`artifactSha256` 形式,使 `clawhub:` 安装的 npm 包和传统 ZIP 包不再遗漏可下载工件。感谢 @romneyda。 - 控制面板 UI/会话:避免对聊天回合的 `sessions.changed` 负载进行完整的 `sessions.list` 重载,使大型会话存储在交付聊天响应时不再增加数秒延迟。(#76676) 感谢 @VACInc。 - Gateway/监控:当开发 Gateway 子进程在启动期间退出时,运行一次 `doctor --fix --non-interactive` 并重试,使过时的本地插件安装/配置状态不会导致 tmux 监控会话无声消失而不尝试修复。 - 医生/Telegram:当选定的 Telegram 引用回复可能抑制 `streaming.preview.toolProgress` 时发出警告,并记录 `replyToMode` 的权衡取舍,且不改变运行时交付。修复 #73487。感谢 @GodsBoy。 - 频道/Discord:在接受传入的 DM 后立即发送尽力而为的原生输入提示,以便在排队、上下文组装、模型或工具工作开始前,慢速预分发回合能显示 Discord 的活跃状态。修复 #76417。感谢 @mlopez14。 - 插件/安装:拒绝仅包含源代码的 TypeScript 包安装,以及缺少已编译运行时输出的已安装插件包,以便在插件安装/发现阶段就拦截损坏的 npm 构件,而不是通过 jiti 降级并在稍后作为不可用提供商暴露。修复 #76720。 - 插件/配置:当显式配置的插件覆盖其他已发现的候选插件时,去重相同的清单兼容性诊断信息,从而避免外部渠道插件在安装和启用期间重复打印相同的缺失 `channelConfigs` 警告。感谢 @vincentkoc。 - Discord/状态:在仅工具频道中遵循显式的 `messages.statusReactions.enabled: true` 配置,使排队确认反应能够继续推进至思考/完成生命周期反应,而不是停留在初始表情符号上。感谢 @Marvinthebored。 - Discord/原生命令:在同步期间比较 Discord 标准化的斜杠命令描述和本地化描述,从而避免中日韩(CJK)或多行命令文本触发冗余的启动 PATCH 请求爆发和速率限制 429 错误。修复 #76587。感谢 @zhengsx。 - 智能体/OpenAI:仅在存在函数工具时为 `gpt-5.4-mini` 省略 Chat Completions 的 `reasoning_effort` 参数,同时保留无工具 Chat 和 Responses 的推理支持,防止 Telegram 路由的回退运行在 OpenAI 拒绝工具负载后挂起。修复 #76176。感谢 @ThisIsAdilah 和 @chinar-amrutkar。 - Telegram:复用成功的启动 `getMe` 探测用于 grammY 轮询启动,并在可恢复的 `deleteWebhook` 清理失败后继续执行 `getUpdates`,从而减少长轮询开始前的高延迟 Bot API 控制平面调用。引用 #76388。感谢 @jackiedepp。 - 网关/诊断:在诊断会话状态和活动跟踪中合并会话 ID/密钥别名,使已完成运行不再遗留陈旧的排队任务,从而避免存活度样本持续处于警告级别。 - 智能体/模型:当未提供运行时覆盖时,将模型 `maxTokens` 作为 OpenAI 兼容的 Responses 和 Completions 传输的默认输出令牌限制,防止提供商默认值静默截断较大输出。(#76645) 感谢 @joeyfrasier。 - macOS CLI/引导:在 `openclaw-mac wizard` 中使用 termios 不回显输入处理敏感向导文本步骤,在保留长 API 密钥和网关令牌的同时抑制保存凭据的预览。修复 #76698。感谢 @anurag-bg-neu 和 @sallyom。 - 控制面板 UI/技能:通过延迟 `showModal()` 直到对话框元素连接到 DOM,修复所有浏览器中技能详情模态框静默打开失败的问题;Lit `ref` 回调在连接前触发,导致每次点击技能时抛出 `DOMException: HTMLDialogElement.showModal: Dialog element is not connected`。感谢 @nickmopen。 - 网关/更新:在报告成功之前、控制面板 UI 全局包更新之后运行 `doctor --non-interactive --fix`,以便在网关重启前迁移旧版配置。感谢 @stevenchouai。 - 网关/定时任务:阻止因热重载竞争失败而导致的惰性 cron 启动,防止在重载已替换 cron 状态后旧 cron 服务再次启动。 - CLI/插件:当 npm 插件安装被配置选中的失败源遮蔽时发出警告,并在 `plugins doctor` 中显示修复路径。感谢 @LindalyX-Lee。 - 智能体/Telegram:在嵌入式模型提示中保留显式的回复和引用上下文,同时防止引用文本驱动提示本地图片加载。修复 #76419。(#76659) 感谢 @cheechnd。 - 活跃内存:将 `setupGraceTimeoutMs` 同时应用于嵌入式召回运行器和外层提示构建看门狗,使极冷首次召回能够保持端到端的配置设置宽限期。(#74480) 感谢 @volcano303。 - 渠道/飞书:限制每个聊天的顺序队列阻塞后续同键任务的时间(默认 5 分钟),以便单个挂起的分发不再导致后续同聊消息在网关重启前一直处于 `queued` 状态;卡住的任务将继续运行,但会从阻塞链中移除并记录警告。修复 #70133。(#76687) 感谢 @martingarramon 和 @bek91。 - 活跃内存:在解析嵌入式召回运行通道时,跳过包含 `:` 的限定 Telegram 论坛主题对话 ID,改为回退到 `messageProvider`,从而避免活跃内存在此类会话中抛出捆绑插件 dirName 验证错误。修复 #76704。 - 智能体/工具:将 PDF 模型/身份验证的自动解析推迟到实际使用 PDF 工具时,避免在智能体回合的工具准备阶段对不含 PDF 的消息探测身份验证配置文件,同时保留显式的 PDF 模型注册。修复 #76644。感谢 @hclsys。 - CLI/配置:即使补丁仅包含 SecretRef 对象,也保持 JSON 干运行补丁对受影响的渠道配置进行捆绑渠道模式验证。 - 插件/工具:将已禁用的捆绑工具插件排除在显式运行时白名单所有权之外,并从已加载但空的渠道注册表回退到包含工具的插件注册表,以便即使 `memory-lancedb` 被禁用,活跃内存仍可使用捆绑的 `memory-core` 搜索/获取工具。修复 #76603。感谢 @jwong-art。 - 插件/安装:从托管的 npm-root 清单运行 `npm install`,以便安装一个 `@openclaw/*` 插件时保留已安装的兄弟插件,而不是将其修剪。修复 #76571。(#76602) 感谢 @byungskers 和 @crpol。 - 插件/上下文引擎:将选定的 `plugins.slots.contextEngine` 插件包含在网关启动加载计划中,以便清单中不含 `activation.onStartup` 的外部上下文引擎插件在智能体回合解析活跃引擎之前加载;防止网关启动后出现“上下文引擎 X 未注册;回退到默认引擎 legacy”警告。修复 #76576。感谢 @hclsys。 - 插件/工具:恢复基于路径的插件(源自“config”)的按需注册表加载,以便在未预热的通道注册表不存在时,通过 `plugins.load.paths` 注册的工具工厂在代理请求时解析;防止网关启动后出现“未知方法”错误。修复 #76598。感谢 @hclsys。 - 插件/钩子:将显式启用的支持钩子的插件包含在网关启动的运行时作用域中,以便嵌入式 PI 运行能识别其 `before_prompt_build` 和 `agent_end` 钩子。修复 #76649。感谢 @wwf3045 和 @MkDev11。 - 插件/OpenCode:通过轻量级提供程序策略层暴露 Claude 思维配置文件,以便指令和会话验证为 `opencode/claude-opus-4-7` 保留 `xhigh`、`adaptive` 和 `max`,而不是将 `xhigh` 重新映射为 `high`。修复 #76648。感谢 @aaajiao。 - 通道/QQ 机器人:在 QQ 令牌交换前解析结构化的 `clientSecret` SecretRefs,向密钥工具暴露 QQ 机器人密钥契约,并拒绝旧的 `secretref:/...` 标记字符串。(#74772) 感谢 @xialonglee。 - 代理:通过在原始响应块上刷新受保护的获取超时来保持活动流式提供程序回复的存活,并将真正的提示词流超时作为明确错误抛出,而不是返回不完整的助手片段。修复 #76307。(#76633) 感谢 @MkDev11。 - 插件/外部化:在生产包名上保留官方的 ACPX、Google Chat 和 LINE 安装规范,将 beta 标签探测留给显式的 OpenClaw beta 更新通道。感谢 @vincentkoc。 - CLI/doctor:防止缺失插件修复使用运行时回退覆盖官方目录元数据,以便 ACPX 修复在外部化部署期间保留官方 npm 规范。感谢 @vincentkoc。 - CLI/doctor:通过精确解析的包名匹配过时的内置插件安装记录,以便 doctor 不会删除仅共享 OpenClaw 包名前缀的外部 npm 或 ClawHub 记录。 - 插件/目录:在生成打包通道目录时保留 ClawHub 安装规范,以便未来的 storepack-first 通道插件保持其远程来源,而不是仅依赖 npm。感谢 @vincentkoc。 - 插件/目录:将预发布外部通道目录条目中的裸 npm 规范固定到目录条目版本,以便 beta 目录不会静默安装最新的稳定版包。 - 插件/更新:将目录匹配的官方 npm 更新和 OpenClaw 编写的外部化内置 npm 桥接视为受信任的官方安装,以便启动代码插件可以更新或从内置树中迁移,而不会引发扫描器误报。感谢 @vincentkoc。 - 插件/引导:仅在缺少包/版本错误时从 ClawHub 回退到 npm,在 storepack 部署期间保持完整性和验证失败为安全关闭(fail-closed)。感谢 @vincentkoc。 - CLI/引导:在交互式 `openclaw onboard` 向导中屏蔽凭据输入(模型认证提供程序 API 密钥、网关令牌和密码、网络搜索提供程序密钥以及技能环境变量值),以便粘贴的密钥不再回显到终端滚动缓冲区、`Start-Transcript` 日志或截图中;现有令牌/密码会在敏感提示前通过屏蔽预览确认步骤保留。感谢 @anurag-bg-neu。 - 控制面板 UI/Talk:通过从浏览器请求头中移除仅服务器端使用的归属头(`originator`、`version`、`User-Agent`)来修复 Talk(OpenAI 实时 WebRTC)的 CORS 失败问题;`api.openai.com/v1/realtime/calls` 的 CORS 预检仅允许 `authorization` 和 `content-type`,因此转发这些头会导致浏览器 SDP 交换失败。修复 #76435。感谢 @hclsys。 - 聊天投递:使 `/verbose on|full|off` 的更改再次影响后续的 tool-use 聊天气泡,包括启用了草稿预览工具进度的通道,同时保留一次性 verbose 指令。 - CLI/日志:在网关临时断开连接(WebSocket 关闭、超时、连接中断)时,使用有界指数退避(最多 8 次重试,上限 30 秒)和 stderr 重试警告自动重连 `openclaw logs --follow`,同时在无法恢复的认证或配置错误时立即退出。修复 #74782。(#75059) 感谢 @shashank-poola。 - CLI/日志:在临时中断后轮询成功时,通过 `[logs] gateway reconnected` 通知宣布 `--follow` 恢复,并在 `--json` 模式下为重试警告和重连转换输出 JSON `notice` 记录,以便实时监控脚本能响应恢复。延续 #75059。(#75372) 感谢 @romneyda。 - Codex/WhatsApp:当配置 Codex 源回复通过消息工具投递时,保持 `message` 动态工具可用,以便编码配置文件聊天代理不会在不可见通道回复的情况下私下完成回合。修复 #76660。(#76663) 感谢 @VishalJ99。 - Codex/心跳:通过 Codex 回合作用域的合作模式指令发送心跳专属的主动性指导,将普通消息工具聊天回合保持在默认模式,避免心跳提示词泄漏。感谢 @pashpashpash。 - 插件/引导:信任从官方目录选择的可选官方插件和网络搜索安装,以便 npm 安全扫描将它们视为其他源链接的官方安装路径。感谢 @vincentkoc。 - 代理/web_search:在缺少网络搜索元数据时保持已安装的运行时提供程序发现功能启用,以便外部安装的官方提供程序(如 Brave)对代理和 cron 回合可见,而不是回退到仅内置查找。修复 #76626。感谢 @amknight。 - 测试/插件:将 Discord npm 引导 Docker 测试通道暴露为包脚本,并断言计划的 Docker 通道指向真实脚本,以便外部通道引导覆盖率测试能够实际运行。感谢 @vincentkoc。 - 插件/ClawHub:将未发布的 ClawHub 插件制品解释为回退到 `npm:` 安装的部署状态,而不是泄露原始归档元数据字段。感谢 @vincentkoc。 - 测试/引导流程:断言打包频道的引导流程完成后,`openclaw channels status --json` 和纯文本 `openclaw status` 均会显示已配置的频道,覆盖 Channels 表格为空的回归测试路径。感谢 @vincentkoc。 - Microsoft Teams:在 Gateway 重启期间持久化已发送消息的标记,以便对近期机器人消息的后续回复能继续解析原始对话,而不是在重启后中断,并在尽力恢复时保留标记的 TTL。(#75585) 感谢 @amknight。 - Matrix:在 Gateway 重启期间持久化待审批的反应目标,以便 OpenClaw 重新上线后,房间审批者仍能批准或拒绝待处理的提示。(#75586) 感谢 @amknight。 - 频道/引导流程:将第三方官方企业微信(WeCom)和元宝(Yuanbao)目录条目映射到其已发布的插件 ID,使 npm 安装能通过预期插件验证。感谢 @vincentkoc。 - 插件 SDK:恢复被固定元宝频道包所使用的 Mattermost 和 Matrix 兼容性子路径,使外部安装能在 npm install 后正常加载模块。感谢 @vincentkoc。 - 插件/安装:防止托管的 npm-root 安全扫描将早期插件的 `openclaw` peer 依赖链接视为失败,从而避免单个外部插件安装污染后续官方 npm 安装。感谢 @vincentkoc。 - Memory LanceDB:允许加载已安装但未配置的插件元数据,使引导和设置流程能够提示配置嵌入(embedding)参数,而不是首先导致插件注册表失败。感谢 @vincentkoc。 - CLI/插件:防止 `plugins enable` 和 `plugins disable` 创建未配置的频道配置节,使带有必填设置字段的频道插件在生命周期探测中不再验证失败。感谢 @vincentkoc。 - 代理/子代理:检测仅含前缀的完成公告回复,并回退到捕获的子结果,使请求者对话不再无声丢失大部分长子代理报告。修复 #76412。感谢 @inxaos 和 @davemorin。 - 诊断工具/配置:在兼容性修复期间,为省略可见回复策略的已配置频道配置设置 `messages.groupChat.visibleReplies: "message_tool"`,使升级能持久化预期的仅工具群组/频道回复默认值。感谢 @kagura-agent。 - 代理/会话:在软等待窗口超时后保持延迟的 `sessions_send` A2A 回复存活,同时保留终端运行超时,并避免请求者会话中出现陈旧的目标回复。修复 #76443。感谢 @ryswork1993 和 @vincentkoc。 - TUI/控制界面:修复当活动会话使用与默认不同的模型时,`/think` 命令仅显示基础思考级别的问题,使 DeepSeek V4 Pro 的 `xhigh` 和 `max` 等特定提供商级别现在可见且可选。修复 #76482。感谢 @amknight。 - CLI/会话:在工具传递频道输出后,使有意的空代理回复保持静默,而不是显示误导性的“代理无回复。”回退提示。感谢 @vincentkoc。 - 配置/诊断工具:限制每个配置路径的 `.clobbered.*` 取证快照数量,并序列化快照写入,使重复的 `doctor --fix` 恢复循环不会淹没配置目录。修复 #76454;延续 #65649。感谢 @JUSTICEESSIELP、@rsnow 和 @vincentkoc。 - 飞书:在回复发送原生语音媒体时抑制重复文本,同时保留普通音频文件的字幕,并在语音上传失败时回退到文本加附件链接。 - 飞书:当 `audioAsVoice` 在转码失败后回退到通用文件附件时,发送被跳过的回复文本,使语音意图回复不会丢失其字幕。 - TTS/插件:在 Gateway 启动期间激活配置的语音提供商插件,使选择 Microsoft 和 Local CLI 语音回复后立即生效,而不是在启动插件集中保持不可见。修复 #76481。感谢 @amknight。 - TTS/插件:在 Gateway 启动期间包含通过继承的代理、频道和账户 TTS 人格选择的语音提供商,以匹配运行时 TTS 配置合并。延续 #76481。感谢 @amknight。 - 飞书:通过将 SDK 加载为插件本地运行时依赖,防止打包的飞书启动程序捆绑 Lark SDK 的 ESM `__dirname` 路径。修复 #76291 和 #76494。(#76392) 感谢 @zqchris。 - 插件/npm:为可发布插件构建包本地运行时 dist 文件,并停止在核心包元数据中列出根包排除的插件边车组件,使 `@openclaw/diffs` 和 `@openclaw/discord` 等 npm 插件安装不再发布仅包含源码的运行时负载。修复 #76426。感谢 @PrinceOfEgypt。 - 频道/密钥:在插件拆分后,通过外部插件密钥合约解析基于 SecretRef 的频道凭据,覆盖运行时启动、目标发现、Webhook 认证、禁用账户枚举和延迟绑定的 web_search 配置。修复 #76371。(#76449) 感谢 @joshavant 和 @neeravmakwana。 - Docker/Gateway:将 Docker 设置 `.env` 值传递到 gateway 和 CLI 容器中,并在托管服务计划中保留 exec SecretRef `passEnv` 键,使 1Password Connect 支持的 Discord 令牌在诊断或插件修复后仍能正确解析。感谢 @vincentkoc。 - 控制界面/WebChat:在聊天历史中解释压缩边界,并直接链接到会话检查点控件,使压缩前的轮次在刷新后不再无声丢失。修复 #76415。感谢 @BunsDev。 - 代理/压缩:添加一个可选的捆绑压缩通知器钩子,并在自动压缩导致某轮次缺少最终可见回复时,从压缩后的转录记录中重试一次。(#76651) 感谢 @simplyclever914。 - 代理/未完成轮次:当工具调用链结束后代理的最终文本因从未生成工具后助手响应而被无声丢弃时,检测并显示警告,而不是仅使用工具前分析文本来完成该轮次。修复 #76477。感谢 @amknight。 - 频道/WhatsApp:通过根据 WhatsApp 参与者数据(包括 LID 群组)解析 `@+<数字>` 和 `@<数字>` 令牌,为群聊文本和媒体字幕附加原生出站提及元数据。修复 #39879;延续 #56863。感谢 @kengi1437、@joe2643 和 @fridayck。 - 频道/WhatsApp:要求出站提及令牌必须在词边界处结束,这样较长字符串内的电话号码前缀将不再触发隐藏的原生提及。 - 插件/卸载:删除克隆的插件仓库后移除空的管理型 git 安装父目录,并在 Docker 插件生命周期测试中覆盖 npm/git 卸载残留情况。感谢 @vincentkoc。 - 插件/安装:当无内置源时,通过官方目录解析 `brave` 等裸官方外部插件 ID,使打包安装获取预期的作用域 npm 包而非无关的非作用域包。修复 #76373。感谢 @bek91 和 @vincentkoc。 - 插件/安装:在授予官方 npm 插件扫描器信任前,要求安装来源必须归属 OpenClaw,这样直接 npm 包名将不再绕过启动码扫描,而目录、引导和医生诊断安装仍保持可信。感谢 @fede-kamel 和 @vincentkoc。 - 网络代理:保留通过托管 HTTP 代理路由的 Node HTTPS 请求的目标 TLS 主机名验证,这样 Discord 风格的 CONNECT 流量将不再针对本地代理主机验证证书。修复 #74809。(#76442) 感谢 @jesse-merhi 和 @abnershang。 - 网关/会话:将异步 `sessions.list` 标题和预览填充限制在对话记录的头/尾读取范围内,这样控制面板轮询便不会在每次刷新时全量扫描大型会话记录。感谢 @vincentkoc。 - 网关/会话:基于活动插件元数据快照缓存清单模型 ID 规范化及内置设置 CLI 回退元数据,这样控制面板 `sessions.list` 轮询可避免重复扫描插件清单,同时在插件重载后仍能刷新。感谢 @rolandrscheel。 - 网关/性能:缓存每次运行的详细级别会话读取,在 `gateway --force` 未杀死任何监听器时跳过冗余的 `lsof` 扫描,并使网关启动基准测试在输入 `--help` 时打印用法。 - 网关/会话:在轻量级 `sessions.list` 行中保留代理运行时元数据,这样仅含模型的会话补丁不会导致控制面板丢失运行时身份。感谢 @vincentkoc。 - 网关/会话:通过跳过逐行对话记录使用回退、显示模型推理和插件投影,保持批量 `sessions.list` 行的轻量级,避免大型会话存储中的事件循环阻塞。感谢 @Marvinthebored 和 @vincentkoc。 - 网关/模型:在只读 `models.list` 回退中基于持久化/当前元数据和配置行,并使用静态身份验证检查,这样缺失的 `models.json` 文件将不再在运行时加载提供者发现或导致重启后网关卡死。修复 #76382;参考 #76360 和 #75707。感谢 @trojy13、@RayWoo、@AnathemaOfficial 和 @vincentkoc。 - 网关/模型:在完整目录中保留代理图像附件能力检查,同时保留只读 `models.list` 路径,这样在静态目录回退后图像发送不会被拒绝。 - CLI/插件:在 `plugins enable` 和 `plugins disable` 写入配置前拒绝缺失的插件 ID,这样拼写错误将不再导致陈旧配置项持久化。(#73554) 感谢 @ai-hpc。 - 代理/会话:在会话文件修复期间保留已送达的末尾助手回复,这样 Telegram/WebChat 历史将不会被重写以丢弃已送达的响应。修复 #76329。感谢 @obviyus。 - 网关/聊天记录:将超大的对话记录轮次保留为显式的省略消息占位符,同时避免大型 JSONL 解析阻塞。感谢 @Marvinthebored 和 @vincentkoc。 - 网关/模型:在兼容注册表的回退和元数据默认值上保持只读模型列表响应,这样空或极简的持久化模型文件将不会隐藏内置或自定义模型能力。感谢 @Marvinthebored。 - CLI/医生诊断:在解析内存诊断时加载配置的内存槽插件,这样内置的 `memory-core` 将不再在独立运行 `doctor` / `status` 时触发虚假的“无活动内存插件”警告。修复 #76367。感谢 @neeravmakwana。 - 网关:在 `chat.send` 或代理附件解析/暂存失败时保留堆栈诊断信息,改善图像发送故障排查。参考 #63432。(#75135) 感谢 @keen0206。 - 代理/空闲超时:在外层嵌入式运行重试循环中添加费用失控断路器,若连续 5 次空闲超时且无完成的模型进度则停止进一步尝试,这样卡死的提供者将不再在同一运行中扇出付费模型调用;完成文本或工具调用进度会重置断路器,但部分工具参数令牌滴漏则不会。修复 #76293。感谢 @ThePuma312。 - 心跳/Codex:当心跳轮次包含结构化 `heartbeat_respond` 工具时,停止发送传统的 `HEARTBEAT_OK` 提示指令,同时保留用于传统自动心跳回复的文本哨兵。感谢 @pashpashpash。 - 心跳/Codex:使结构化心跳提示与实际 `heartbeat_respond` 工具可用性保持一致,并将工具禁用时的承诺签到保留在传统确认路径上。感谢 @pashpashpash 和 @vincentkoc。 - 代理运行时:当请求的运行环境不可用时,诚实拒绝显式的插件运行时选择,而不是静默回退到嵌入式 PI 运行时。感谢 @pashpashpash。 - 维护者工作流:默认通过 GitHub 的已验证提交 API 推送已准备的 PR 头,并要求在通过 git 协议推送发布未签名提交前必须显式覆盖。感谢 @BunsDev。 - 飞书:通过所选/默认账户解析设置/状态探测,这样带有账户范围应用凭证的多账户配置将显示为已配置且可探测。修复 #72930。感谢 @brokemac79。 - Gateway/responses:当代理在单次交互中调用多个客户端工具时,从 `/v1/responses` 的 JSON 和 SSE 响应中发出每一次客户端工具调用,使多工具计划、图编排调用及类似的批量流程不再丢弃除最后一次调用外的所有调用。修复 #52288。感谢 @CharZhou 和 @bonelli。 - Gateway/agent:仅在 `deliver: true` 时对网关代理请求强制执行 `session.sendPolicy=deny`,使非投递的冒烟检查和内部代理运行不再被 `send blocked by session policy` 拒绝,同时保持出站投递的管控。修复 #73381。感谢 @wenxu007。 - Slack/reactions:将缺失的 no_reaction 移除响应视为幂等成功,并通过移除辅助函数路由自身反应清理,使并发清理不再暴露 Slack 竞态错误。修复 #50733。(#76304) 感谢 @martingarramon 和 @Hollychou924。 - Feishu:在入站去重中包含媒体 `file_key` 和 `image_key` 值,使复用的消息 ID 仍能处理不同的媒体附件,同时抑制真正的重试。修复 #75057。感谢 @SymbolStar。 - Control UI/Gateway:避免对本地应用的消息阶段会话更新进行完整的会话列表重载,通过转录文件更新事件传递已知的会话键,并在存在显式生成模型配置时延迟媒体提供商列表加载。参考 #76236、#76203、#76188、#76107 和 #76166。感谢 @BunsDev。 - Install/update:在打包安装的 postinstall 阶段清理过时的 `plugin-runtime-deps` 状态目录,使从 2026.5.2 之前版本的升级能够回收旧捆绑插件的依赖缓存,而不影响外部插件安装。 - Auto-reply/queue:在处理活跃运行队列时,将重置触发的 `/new` 和 `/reset` 交互视为中断运行,使引导/跟进模式无法将新会话延迟到现有工作之后。修复 #74093。(#74144) 感谢 @ruji9527 和 @yelog。 - Cron:将修复后的启动运行时状态持久化回 `jobs-state.json`,使具有缺失 `updatedAtMs` 的有效未来 `nextRunAtMs` 不再在网关重启后触发重复的外部健康检查修复。修复 #76461。感谢 @vincentkoc。 - Cron:在 `cron.runs` 历史中保留手动 `cron.run` ID,使手动运行确认能够与已完成运行记录关联。修复 #76276。 - CLI/devices:仅当确切的待处理设备请求将生成或继承管理员范围的操作员访问权限时,才为 `openclaw devices approve <requestId>` 请求 `operator.admin`,同时保持较低范围的审批在配对范围内。 - Memory/embedding:扩展嵌入重新索引重试分类器以包含临时套接字层错误(`fetch failed`、`ECONNRESET`、`socket hang up`、`UND_ERR_*`、`closed`),使内存重新索引能够承受提供商网络波动,而不是在运行中途中止。相关 #56815、#44166。(#76311) 感谢 @buyitsydney。 - Memory/sessions:通过在 `buildSessionEntry` 中索引其实际内容(而非短路为空条目),并在 `memory_search` 可见性过滤期间将归档命中路径映射回其活动转录主干,使旋转和删除的会话转录(`.jsonl.reset.<iso>` / `.jsonl.deleted.<iso>`)可端到端搜索。`.jsonl.bak.<iso>` 备份和压缩检查点仍保持不透明。参考 #56131。感谢 @buyitsydney。 - Memory/sessions:当 `archiveFileOnDisk` 将活动会话转录旋转为 `.jsonl.reset.<iso>` / `.jsonl.deleted.<iso>` / `.jsonl.bak.<iso>` 时发出 `sessionTranscriptUpdate` 事件,并为已计入使用的归档路径(`.jsonl.reset.<iso>` 和 `.jsonl.deleted.<iso>`)绕过 `processSessionDeltaBatch` 中的 delta-bytes / delta-messages 阈值门控。若无此绕过,归档事件会转发给监听器但在阈值检查处被丢弃,因为归档是一次性文件重命名操作而非增量追加,通常会低于默认的 `deltaBytes: 100000` / `deltaMessages: 50` 重新索引阈值。归档现在以与 `appendMessage` / 压缩 / 工具结果重写 / 聊天注入 / 命令执行事件相同的方式向内存同步增量路径提供数据。参考 #56131。感谢 @buyitsydney。 - Memory/search:在打包安装中保持 sqlite-vec 为可选,并将缺失扩展的恢复指向有效的 `agents.defaults.memorySearch.store.vector.extensionPath` 设置。感谢 @willemsej 和 @vincentkoc。 - Gateway:在限制性工具配置文件中保持直接请求的插件工具可调用,同时保留显式拒绝列表和 HTTP 安全拒绝列表,防止表现为“工具不可用”的目录/调用不匹配。感谢 @BunsDev。 - Gateway/update:允许 beta 二进制文件在配置最后由匹配的稳定版写入时刷新网关服务,避免在 beta 通道更新期间出现误报的新配置降级阻止。 - Channels:将 Matrix 和 Mattermost 保留在核心包中捆绑,而不是在这些通道切换前宣传外部 npm 安装。感谢 @vincentkoc。 - Bonjour:在重复的卡住广播恢复后禁用局域网 mDNS 广播,而不是反复重启 ciao 并耗尽网关事件循环。 - Channels/setup:将可安装通道选择器提示标记为远程 npm 安装,并隐藏已随 OpenClaw 提供的捆绑插件的远程安装提示。 - CLI/update:在停止托管的网关服务之前,拒绝从活跃网关进程树启动的包更新,避免自终止的同版本更新导致旧网关代码继续运行。修复 #75691。(#75819) 感谢 @ai-hpc。 - CLI/plugins:停止将非插件 `auth` 命令根目录视为捆绑插件 ID,使限制性 `plugins.allow` 配置不再提示用户添加过时的 `auth` 插件条目。 - Doctor/plugins:更新已配置但过时清单仍声明无 `channelConfigs` 通道的插件安装,使 beta 升级能在 `doctor --fix` 期间修复旧版 Discord 风格的包有效载荷。 - 诊断/插件:修复已配置的外部插件安装记录指向缺失包目录的问题,以便在插件运行时验证前,升级过程能协调幽灵 npm 元数据。感谢 @vincentkoc。 - 活跃内存:当调试遥测报告零命中时,防止非空的 `memory_search` 结果被快速失败判定为空。 - 活跃内存:在构建嵌入式回忆插件工具时保留目标代理上下文,以便 `memory_search` 和 `memory_get` 在显式回忆会话中保持可用。修复 #76343。感谢 @Countermarch。 - 插件/外部化:默认从 npm 修复缺失的已配置插件安装,将 ClawHub 下载保留给显式的 `clawhubSpec` 元数据,并覆盖代理运行时/环境选择插件的修复。感谢 @vincentkoc。 - 插件/安装:允许官方目录匹配的 npm 通道插件(如飞书)通过可信安装扫描器路径,同时继续拦截伪造的包名。感谢 @vincentkoc。 - 工具/LLM 任务:当工具被有意禁用时,防止仅 JSON 的嵌入式模型运行触发继承的工具白名单,同时保留运行时 `toolsAllow` 失败。修复 #74019。感谢 @amknight。 - 工具/配置文件:使 `tools.profile: "full"` 授予所有工具(包括浏览器等可选插件工具),这样完整配置文件不再静默丢弃需要显式白名单条目的插件提供工具。修复 #76507。感谢 @amknight。 - 飞书:将超时环境变量解析与 HTTP 客户端包装器分离,以便包安全扫描在安装期间不再报告虚假的环境变量收集命中。感谢 @vincentkoc。 - 升级/配置:在加载配置时,将配置的网页搜索提供商和静态抑制的模型/提供商对与活动插件集进行验证,以便过期的插件状态在运行时回退前显式报错。 - 状态/更新:当配置仍显示为 `stable` 时,从已安装版本解析 beta 更新通道检查,并让 `status --deep` 复用实时网关通道凭据状态,而不是在仅命令路径令牌缺失时发出警告。 - 诊断/插件:在 `doctor --fix` 期间保留未管理的第三方插件 `node_modules`,同时继续清理 OpenClaw 管理的运行时依赖缓存。 - 网关/重启:新增 `openclaw gateway restart --force` 和 `--wait <duration>`,在重启延迟计时器前记录活动任务运行 ID,并将超时重启报告为显式强制重启。 - Discord:在进程重启间持久化斜杠命令部署哈希,以便未更改的命令集跳过重新部署并避免重启循环 429 错误。 - 提供商/LM Studio:将 Gemma 4 及其他本地模型的二进制 `off`/`on` 推理元数据规范化为 LM Studio 接受的 OpenAI 兼容 `reasoning_effort` 值。 - 插件/外部化:保留官方外部安装文档,更新示例,并将实时 Codex npm 检查移至默认 npm 标签而非 `@beta`。感谢 @vincentkoc。 - 插件/外部化:将 ACPX、Google Chat 和 LINE 的可发布插件 dist 树排除在核心 npm 包文件列表之外。 - 插件/ClawHub:当制品解析器路由缺失时回退到版本元数据,并保持 Docker ClawHub 测试夹具与 npm-pack 制品解析对齐,避免在插件安装验证期间出现虚假的“版本未找到”失败。感谢 @vincentkoc。 - 提供商/openai-codex:在动态模型合成回退中遵循 `providerConfig.baseUrl`,这样配置了自定义上游(例如转发代理)的 codex 提供商在注册表没有可克隆的模板行时,不再静默绕过配置的 URL。(#76428) 感谢 @arniesaha。 - 状态/通道:即使在网关不可达时,也在 `openclaw status` 和仅配置的 `openclaw channels status` 输出中显示配置的通道,避免在 WSL 及其他无网关路径上出现空的通道表。感谢 @vincentkoc。 - 插件/ClawHub:在 ClawHub 制品路由部署期间,针对不可用的显式 ClawHub ClawPack 制品下载提供临时的 npm 安装提示。感谢 @vincentkoc。 - 媒体:接受基于主目录的 `MEDIA:~/...` 附件路径,同时保留现有的文件读取策略、遍历检查和媒体类型验证。修复 #73796。感谢 @fabkury。 - 引导/搜索:在保存提供商配置前安装官方外部网页搜索插件(如 Brave),并让诊断修复协调所选外部搜索提供商缺失的 npm 负载。感谢 @vincentkoc。 - 插件/外部化:为外部化通道、提供商和通用插件添加官方 npm 优先目录,保留未发布的 ACPX/Google Chat/LINE 捆绑包,并在 ClawHub 打包文件部署期间使缺失插件修复遵循 npm 优先元数据。感谢 @vincentkoc。 - 插件/更新:检测在 `openclaw update` 期间包目录消失的已跟踪插件安装记录,在正常插件更新前重新安装它们,如果任何安装记录仍指向缺失的磁盘负载,则更新失败。 - 插件/注册表:在验证持久化插件注册表时对清单和包元数据进行哈希处理,以便快速同大小重写无法使过期的插件元数据保持可信。 - 插件/注册表:在信任诊断前规范化安装记录来源路径,这样安装在符号链接临时/状态根目录下的 npm 插件不再被警告为未跟踪的本地代码。 - 插件/安装:允许官方外部 Discord 重新安装请求通过无效配置检查并运行过期通道修复,以便升级可以直接恢复缺失的外部插件状态。 - CLI/推断:在简单完成分发前拒绝本地 `codex/*` 一次性模型探测,并引导操作者前往 Codex 应用服务器运行时路径,而不是以空输出错误结束。 - 代理/会话:当最终运行元数据从过期的内存快照中持久化时,保留终端生命周期状态,防止 `main` 会话在完成或超时的回合后仍卡住为运行状态。 - 网关/CLI:使 `openclaw gateway start` 在启动前修复指向旧版 OpenClaw、缺失二进制文件或临时安装程序路径的陈旧托管服务定义。 - 心跳/调度器:使心跳阶段调度感知活跃时段,以便调度器向前查找窗口内的第一个阶段槽位,而不是为静默时段槽位设置计时器并完全依赖运行时保护。非 UTC 的 `activeHours.timezone` 值(例如 `Asia/Shanghai`)现在能正确影响下次心跳计时器的触发时间,避免浪费静默时段滴答声以及网关重启后的长时间休眠间隙。修复 #75487。感谢 @amknight。 - 提供商/Arcee AI:将 Trinity Large Thinking 标记为不兼容工具,以便主会话运行使用与子代理恢复相同的纯文本请求形状,避免在 #62848 传输故障转移修复后主会话响应形状仍不匹配。修复 #62851 和 #62847;延续 #62848。感谢 @Adam-Researchh。 - 状态:显示通过原生 Codex 运行时运行的 `openai/gpt-*` 会话的 `openai-codex` OAuth 配置文件,而不是报告认证未知。(#76197) 感谢 @mbelinky。 - 网关:避免重复对插件工具描述符配置进行哈希计算,以防止大型运行时配置阻塞回复启动并触发重连/超时。(#75944) 感谢 @joshavant。 - 插件/外部化:启动时保留诊断 ClawHub 包及持久化的捆绑插件重定位至 npm 首次安装元数据,并因 Discord 外部包已发布而将其从核心包中移除。感谢 @vincentkoc。 - 设置/TUI:限制终端启动引导运行的时间,使停滞的提供商请求超时,而不是让首次运行启动卡在看门狗后面。(#76241) 感谢 @joshavant。 - 定时任务/CLI 运行时:仅在解析出的模型提供商兼容时,才通过配置的每个代理 CLI 运行时路由隔离的定时任务,这样 OpenAI 任务覆盖将不再继承不匹配的 Claude CLI 后端。感谢 @vishutdhar。 - 插件/Codex:允许官方 npm Codex 插件在不使用 `unsafe-install` 覆盖的情况下安装,保留 `/codex` 命令所有权,并通过托管的 `.openclaw/npm` 依赖项覆盖真实的 npm Docker 运行路径,同时增加卸载失败防护。 - 网关/状态:当网关探测失败且 Bonjour 未找到本地网关时,添加具体的服务、配置、监听器所有者和日志收集的后续步骤,以便冻结或端口冲突报告包含根因排查所需的数据。引用 #49012。感谢 @vincentkoc。 - Codex 框架:通过原生 Codex 配置指令转发 OpenClaw 工作区引导文件(如 `SOUL.md`),同时将 `AGENTS.md` 留给 Codex 项目文档发现。修复 #76273。感谢 @zknicker。 - Parallels/Windows 更新冒烟测试:转义生成 PowerShell 脚本中陈旧的后交换导入正则表达式,以便预期的 `ERR_MODULE_NOT_FOUND` 更新交接继续传递到更新后健康检查。(#75315) - Slack:当 `replyToMode` 为 `off` 时,允许在顶级 DM 中流式传输草稿预览,同时保持 Slack 原生流式传输和助手线程状态限制在回复线程上。修复 #56480。(#56544) 感谢 @HangGlidersRule。 - 控制面板 UI/聊天:在每个关闭路径上移除删除确认弹出窗口的外部点击监听器,这样取消、删除、外部点击和同一按钮切换将不再遗留陈旧的文档监听器。引用 #75590 和 #69982。感谢 @Ricardo-M-L。 - 内存核心:将耗尽的文件监听器限制视为内置内存自动同步的非致命错误,同时保留对无关磁盘已满错误的致命处理。(#73357) 感谢 @solodmd。 - 提供商/Ollama:恢复目录上下文窗口转发为原生 `/api/chat` 请求的 `num_ctx`;修复了在未配置显式 `params.num_ctx` 时,带有目录条目的模型(qwen3、llama3、gemma3 等)的工具选择和上下文截断回归问题。修复 #76117。(#76181) 感谢 @openperf。 - 插件/安装:将 npm 插件安装锁定到已验证的解析版本,并拒绝 package-lock 版本或完整性漂移,以防止可变标签抢先通过完整性检查而接受不同的工件。感谢 @Lucenx9。 - 插件/提供商:保留已启用外部清单契约能力提供商的受限冷加载回退机制(针对启动注册表中缺失的提供商),以便 Fish Audio 等提供商可在请求时解析,无需依赖 `activation.onStartup` 即可保证正确性。 (#76536) 感谢 @Conan-Scott。 - 网关/更新:将 `update.run` 中的 `continuationMessage` 传递至成功重启哨兵中,以便会话级自更新在网关重启后能继续执行下一个后续交互回合。参考 #71178。 (#74362) 感谢 @100menotu001、@HeilbronAILabs 和 @artnking。 - 智能体/回退:在嵌入式回退重试后,抑制重复的当前回合用户消息转录记录写入,同时仍向模型发送重试提示词。 (#63696) 感谢 @dashhuang。 - 频道/Telegram:当活跃答案预览之后传递了可见的非预览气泡(工具/代码块/错误)时,强制生成全新的最终消息,从而使多步助手回复不再出现最终答案位于中间输出之上的情况。修复 #76529。感谢 @jack-stormentswe。 - 频道/Telegram:在将论坛主题最终回复视为已发送前,需观察到 Telegram 的发送、编辑或回退操作,从而避免在转录中生成的最终回复从 Telegram 话题中消失。修复 #76554。 (#76764) 感谢 @bubucilo 和 @obviyus。 - 插件/更新:将外部化的捆绑 npm 桥接更新保留在正常的插件安全扫描路径上,而不是在没有制品溯源证明的情况下授予源链接的官方信任。 (#76765) 感谢 @Lucenx9。 - 智能体/回复上下文:在模型可见的元数据中将回复的消息标记为当前用户消息的目标,从而使简短回复能锚定至其明确的回复目标,而非附近的聊天记录。 (#76817) 感谢 @obviyus。 - 诊断工具/插件:在诊断/更新修复期间安装配置缺失的官方插件(如 Discord 和 Brave),自动启用已修复的提供商插件,在下载失败时保留配置,并在无清单声明配置频道时停止自动启用功能凭空创建插件条目。修复 #76872。感谢 @jack-stormentswe。 - 终端界面 (TUI):将陈旧响应看门狗提示替换为面向用户的纯文本说明,从而避免停滞的回复暴露后端或流式处理内部细节。 (#77120) 感谢 @davemorin。