← 返回更新日志

OpenClaw v2026.2.24

2026-02-25 · GitHub 原文
### 变更 - 自动回复/中止快捷键:扩展独立停止短语(`stop openclaw`、`stop action`、`stop run`、`stop agent`、`please stop` 及相关变体),接受尾部标点(例如 `STOP OPENCLAW!!!`),添加多语言停止关键词(包括 ES/FR/ZH/HI/AR/JP/DE/PT/RU 形式),并将精确的 `do not do that` 视为停止触发器,同时保持严格的独立匹配规则。(#25103) 感谢 @steipete 和 @vincentkoc。 - Android/应用用户体验:发布原生四步引导流程,将引导后流程移至五标签壳(连接、聊天、语音、屏幕、设置),添加完整的连接设置/手动模式屏幕,并为新导航模型刷新 Android 聊天/设置界面。 - 对话/网关配置:添加与提供商无关的对话配置并保持旧版兼容性,并为网关对话 ElevenLabs 配置元数据公开设置/状态界面。 - 安全/审计:添加 `security.trust_model.multi_user_heuristic` 以标记可能的多用户入口并阐明个人助理信任模型,同时为有意设置的多用户环境提供强化指南(`sandbox.mode="all"`、工作区作用域文件系统、缩减工具表面、共享运行时上无个人/私有身份)。 - 依赖项:刷新工作区中的关键运行时和工具包(Bedrock SDK、pi 运行时堆栈、OpenAI、Google 身份验证、oxlint/oxfmt),同时有意将 `@buape/carbon` 固定。 ### 重大变更 - **重大变更:** 心跳传递现在在目标解析识别直接聊天(例如 `user:<id>`、Telegram 用户聊天 ID 或 WhatsApp 直接号码/JID)时阻止直接/私信目标。心跳运行仍会执行,但会跳过直接消息传递,仅非直接目标(例如频道/群组目标)可接收出站心跳消息。 - **重大变更:** 安全/沙箱:默认阻止沙箱和沙箱浏览器容器使用 Docker `network: "container:<id>"` 命名空间连接模式。要 intentionally 保留该行为,请设置 `agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true`(紧急突破)。感谢 @tdjackey 报告。 ### 修复 - 路由/会话隔离:强化后续路由,使显式跨渠道来源回复在路由失败时绝不回退到活跃调度器,在后续排空过程中保留排期溢出摘要路由元数据(`channel`/`to`/`thread`),并优先使用来源渠道上下文而非内部提供商标签进行嵌入式后续运行。这防止了在共享会话中 webchat/控制界面上下文劫持 Discord 目标回复。(#25864) 感谢 @Gamedesigner。 - 安全/路由:通过将出站目标解析绑定到当前回合的来源渠道元数据(而非过时会话路由回退)对共享会话跨渠道回复实施失败封闭,并通过网关 + 命令传递规划器连接这些回合来源字段并覆盖回归测试。(#24571) 感谢 @brandonwise。 - 心跳路由:通过阻止直接聊天心跳传递目标并保持被阻止传递的 cron/exec 提示仅内部,防止心跳泄露/垃圾信息进入 Discord 和其他直接消息目标。(#25871) - 心跳默认值/提示:将隐式心跳传递目标从 `last` 切换为 `none`(外部传递需显式加入),并在传递禁用时使用仅内部 cron/exec 心跳提示措辞,因此后台检查不会提示用户界面传递行为。(#25871, #24638, #25851) - 自动回复/心跳排队:当会话已存在活跃运行时丢弃心跳运行而非排队陈旧后续,防止排空后重复心跳响应分支。(#25610, #25606) 感谢 @mcaxtr。 - Cron/心跳传递:除非显式请求线程/主题,否则停止为心跳模式目标解析继承缓存的会话 `lastThreadId`,因此公告模式 cron 和心跳传递保持在顶级目标而非泄露到活跃对话线程中。(#25730) 感谢 @markshields-tl。 - 消息工具去重:在主动运行(心跳/cron/exec-event)中将来源渠道元数据视为相同目标 `message.send` 抑制的权威来源,包括合成提供商上下文,因此 `delivery-mirror` 抄录条目不再导致重复 Telegram 发送。(#25835) 感谢 @jadeathena84-arch。 - 频道/输入指示器保持活跃:在长回复期间按保持活跃间隔刷新频道输入回调,并在空闲/清理时跨核心 + 扩展调度器调用点清除保持活跃计时器,防止输入指示器在推理过程中过期。(#25886, #25882) 感谢 @stakeswky。 - 代理/模型回退:当运行当前位于配置的回退模型上时,继续遍历配置的回退链而非直接折叠到仅主模型,防止主模型保持冷却时出现死胡同失败。(#25922, #25912) 感谢 @Taskle。 - 网关/模型:即使捆绑模型目录数据过时也尊重显式 `agents.defaults.models` 允许列表引用,在 `models.list` 中合成缺失的允许列表条目,并允许 `sessions.patch`/`/model` 选择这些引用而不出现错误的 `model not allowed` 错误。(#20291) 感谢 @kensipe、@nikolasdehor 和 @vincentkoc。 - 控制界面/代理:当无每代理模型条目时在概览回退输入中继承 `agents.defaults.model.fallbacks`,同时保留显式每代理回退覆盖(包括空列表)。(#25729, #25710) 感谢 @Suko。 - 自动化/子代理/Cron 可靠性:在 `sessions_spawn` 完成/直接公告流程中尊重 `ANNOUNCE_SKIP`(无用户可见令牌泄露),为频道不可用添加瞬态直接公告重试(例如 WhatsApp 监听器重连窗口),并将 `cron` 包含在 `coding` 工具配置文件中以便 `/tools/invoke` 在网关策略显式允许时执行 cron 操作。(#25800, #25656, #25842, #25813, #25822, #25821) 感谢 @astra-fer、@aaajiao、@dwight11232-coder、@kevinWangSheng、@widingmarcus-cyber 和 @stakeswky。 - Discord/语音可靠性:恢复运行时 DAVE 依赖(`@snazzah/davey`),添加可配置 DAVE 加入选项(`channels.discord.voice.daveEncryption` 和 `channels.discord.voice.decryptionFailureTolerance`),清理语音监听器/会话拆除,防范陈旧连接事件,并在重复解密失败后触发控制重连恢复以改善 DAVE 接收错误下的入站 STT 稳定性。(#25861, #25372, #24883, #24825, #23890, #23105, #22961, #23421, #23278, #23032) - Discord/阻止流传输:通过仅抑制推理负载(而非所有 `block` 负载)恢复阻止流式回复传递,修复 `channels.discord.streaming=block` 模式下缺失 Discord 回复的问题。(#25839, #25836, #25792) 感谢 @pewallin。 - Discord/代理 + 反应 + 模型选择器:将线程频道代理获取编入入站媒体/贴纸下载,对 WSL/企业代理设置使用代理感知网关元数据获取,将 `messages.statusReactions.{emojis,timing}` 连接到 Discord 反应生命周期控制,并压缩模型选择器 `custom_id` 键以保持在 Discord 100 字符限制下同时保持向后兼容解析。(#25232, #25507, #25564, #25695) 感谢 @openperf、@chilu18、@Yipsh、@lbo728 和 @s1korrrr。 - WhatsApp/Web 重连:将关闭状态 `440` 视为不可重试(包括字符串形式状态值),立即停止重连循环,并在解决会话冲突后发出操作员指导以重新链接。(#25858) 感谢 @markmusson。 - WhatsApp/推理安全:抑制标记为推理的出站负载并在 WhatsApp 传递前硬删除以 `Reasoning:` 开头的文本负载,防止隐藏思考块通过最终消息路径泄露给最终用户。(#25804, #25214, #24328) - Matrix/已读回执:在 Matrix 消息到达时立即发送已读回执(在处理器管道工作之前),因此客户端在回复处理期间不再显示长期未读/已发送状态。(#25841, #25840) 感谢 @joshjhall。 - Telegram/回复:当 markdown 格式渲染为空 HTML(例如线程回复中的仅语法块)时,使用纯文本重试传递,并在格式化和纯负载均为空时大声失败,以避免错误传递状态。(#25096, #25091) 感谢 @Glucksberg。 - Telegram/媒体获取:在 SSRF 固定 DNS 地址排序中优先 IPv4 而非 IPv6,因此媒体下载在 IPv6 路由损坏的主机上仍能工作。(#24295, #23975) 感谢 @Glucksberg。 - Telegram/出站 API:应用 Telegram `autoSelectFamily` 决策时替换 Node 22 的全局 undici 调度器,因此出站 `fetch` 调用继承 IPv4 回退而非保持固定在过时调度器设置。(#25682, #25676) 感谢 @lairtonlelis。 - 引导/Telegram:当插件注册表填充缺失时通过回退到内置适配器保持核心频道引导可用,并使用可操作恢复指导继续向导设置。(#25803) 感谢 @Suko。 - Android/网关身份验证:在引导过程中保持 Android 网关身份验证状态,对操作员会话使用原生客户端 ID,在设备令牌身份验证失败后使用共享令牌回退重试,并避免在瞬态连接错误时清除令牌。 - Slack/DM 路由:将 `D*` 频道 ID 视为直接消息,即使 Slack 发送不正确的 `channel_type`,防止 DM 流量被错误分类为频道/群组聊天。(#25479) 感谢 @mcaxtr。 - Zalo/群组策略:使用 `groupPolicy` + `groupAllowFrom`(回退到 `allowFrom`)强制执行群组消息的发送者授权,默认运行时群组行为为失败封闭允许列表,并在调度前阻止未经授权的非命令群组消息。感谢 @tdjackey 报告。 - macOS/语音输入:防范所有音频输入启动路径缺少默认麦克风(语音唤醒、对话模式、一键通话、麦克风电平监视器、测试器)以避免无麦克风 Mac 上的启动/运行时崩溃,并在输入可用前优雅失败。(#25817) 感谢 @sfo2001。 - macOS/IME 输入:当标记文本处于活动状态时,在语音覆盖组合器和共享聊天组合器中优先将 Return 视为 IME 候选确认,以防止在编写 CJK 文本时意外发送。(#25178) 感谢 @bottotl。 - macOS/语音唤醒路由:将转发的语音唤醒记录默认路由到 `webchat` 频道(而非模糊的 `last` 路由),因此本地语音提示保持固定到控制聊天界面,除非显式覆盖。(#25440) 感谢 @chilu18。 - macOS/网关启动:在解析本地网关命令时优先使用可用的 `openclaw` 二进制文件而非 pnpm/node 运行时回退,因此本地启动在运行时发现损坏的主机上不再失败。(#25512) 感谢 @chilu18。 - macOS/菜单栏:停止为“使用成本(30 天)”子菜单重复使用注入器委托,以防止打开成本历史时出现递归子菜单注入循环。(#25341) 感谢 @yingchunbai。 - macOS/WebChat 面板:通过使用面板特定的视觉效果混合并在效果和托管层上匹配角落遮罩修复圆角裁剪问题。(#22458) 感谢 @apethree 和 @agisilaos。 - Windows/Exec shell 选择:在回退到 Windows PowerShell 5.1 之前优先发现 PowerShell 7 (`pwsh`)(Program Files、ProgramW6432、PATH),修复在安装 PS7 的 Windows 主机上 `&&` 命令链接失败。(#25684, #25638) 感谢 @zerone0x。 - Windows/媒体安全检查:通过将 win32 `dev=0` 统计视为未知设备回退(同时在双方均非零时保持严格设备检查),使异步本地文件身份验证与同步安全打开行为一致,修复本地附件/TTS/图像的虚假 `Local media path is not safe to read` 丢弃。(#25708, #21989, #25699, #25878) 感谢 @kevinWangSheng。 - iMessage/推理安全:使用出站 `messageId` 匹配(加上作用域文本回退)强化 iMessage 回声抑制,并在路由出站传递路径上强制推理负载抑制,防止隐藏思考文本作为用户可见频道消息发送。(#25897, #1649, #25757) 感谢 @rmarr 和 @Iranb。 - 提供商/OpenRouter/身份验证配置文件:为 OpenRouter 绕过身份验证配置文件冷却/禁用窗口,因此提供商失败不再将 OpenRouter 配置文件置于本地冷却,且陈旧遗留冷却标记在回退和状态选择路径中被忽略。(#25892) 感谢 @alexanderatallah 提出此问题及 @vincentkoc 修复。 - 提供商/Google 推理:通过删除 `-1` 预算并将配置的推理工作映射到 `thinkingLevel`,为 Gemini 3.1 请求清理无效负 `thinkingBudget` 负载,防止 `google-generative-ai` 上格式错误的推理负载。(#25900) - 提供商/SiliconFlow:将 `thinking="off"` 规范化为 `thinking: null` 用于 `Pro/*` 模型负载,以避免提供商端 400 循环和误导性压缩重试。(#25435) 感谢 @Zjianru。 - 模型/Bedrock 身份验证:将额外 Bedrock 提供商别名(`bedrock`、`aws-bedrock`、`aws_bedrock`、`amazon bedrock`)规范化为规范 `amazon-bedrock`,确保身份验证模式解析一致选择 AWS SDK 回退。(#25756) 感谢 @fwhite13。 - 模型/提供商:在合并提供商模型配置与内置目录元数据时保留显式用户 `reasoning` 覆盖,因此 `reasoning: false` 不再被目录默认值覆盖。(#25314) 感谢 @lbo728。 - 网关/身份验证:允许受信任代理身份验证的控制界面 websocket 会话在设备身份缺失时跳过设备配对,防止受信任反向代理后出现错误的 `pairing required` 失败。(#25428) 感谢 @SidQin-cyber。 - CLI/内存搜索:为 `openclaw memory search` 接受 `--query <text>`(同时保留位置查询支持),并在两者均未提供时发出清晰错误。(#25904, #25857) 感谢 @niceysam 和 @stakeswky。 - CLI/Doctor:使用有效命令(`openclaw gateway status --deep` 和 `openclaw configure --section model`)更正陈旧恢复提示。(#24485) 感谢 @chilu18。 - Doctor/沙箱:当沙箱模式启用但 Docker 不可用时,显示清晰可操作警告(包括失败影响和修复)而非温和的“跳过检查”备注。(#25438) 感谢 @mcaxtr。 - Doctor/插件:自动启用现在通过清单插件 ID(而非频道 ID)解析第三方频道插件,防止在 ID 不同时写入无效的 `plugins.entries.<channelId>`。(#25275) 感谢 @zerone0x。 - 配置/插件: