← 返回更新日志

OpenClaw v2026.2.25

2026-02-26 · GitHub 原文
### 变更 - Android/聊天:改进原生 Android 聊天界面中的流式传输处理和 Markdown 渲染质量,包括更优的 GitHub 风格 Markdown 行为。(#26079) 感谢 @obviyus。 - Android/启动性能:延迟前台服务启动,将 WebView 调试初始化移出关键启动路径,并添加启动宏基准测试及低噪声性能 CLI 脚本,用于确定性冷启动追踪。(#26659) 感谢 @obviyus。 - UI/聊天撰写:在小屏幕上为撰写操作按钮添加移动端堆叠布局,以提升发送/会话控件的可用性。(#11167) 感谢 @junyiz。 - 心跳/配置:用心跳直接消息(DM)投递策略 `agents.defaults.heartbeat.directPolicy`(`allow` | `block`;也支持通过 `agents.list[].heartbeat.directPolicy` 进行每代理配置)替换原有的心跳 DM 开关,以提供更清晰的投递语义。 - 引导/安全:澄清引导流程中的安全提示,说明 OpenClaw 默认是个人边界(单一可信操作员边界),共享/多用户设置需要明确的锁定/加固措施。 - 品牌化/文档 + Apple 界面:在文档、iOS 应用界面、辅助脚本和 CLI 测试夹具中,将剩余的 `bot.molt` launchd 标签、捆绑 ID、日志子系统和命令示例替换为 `ai.openclaw`。 - 代理/配置:提醒代理在配置编辑或配置字段提问前调用 `config.schema`,以避免猜测行为。感谢 @thewilloftheshadow。 - 依赖项:更新工作区依赖项固定版本和锁文件(Bedrock SDK `3.998.0`、`@mariozechner/pi-*` `0.55.1`、TypeScript 原生预览 `7.0.0-dev.20260225.1`),同时保持 `@buape/carbon` 固定。 ### 破坏性变更 - **破坏性变更:** 心跳直接/DM 投递默认值现再次为 `allow`。若要保持 `2026.2.24` 版本中的 DM 阻止行为,请设置 `agents.defaults.heartbeat.directPolicy: "block"`(或通过每代理覆盖设置)。 ### 修复 - 代理/子代理投递:重构子代理完成声明分发机制,转为显式队列/直接/回退状态机;在声明/消息/网关发送路径中,恢复冷/陈旧插件注册状态下的出站通道插件解析;在声明流程被拒绝时完成最终清理记账;将未包含 `message_id` 的 Telegram 发送视为投递失败(而非虚假成功的 `"unknown"` ID)。(#26867, #25961, #26803, #25069, #26741) 感谢 @SmithLabsLLC 和 @docaohieu2808。 - Telegram/Webhook:预初始化 webhook 机器人,将 webhook 处理切换为回调模式 JSON 处理,并在延迟处理程序下保留完整近极限负载读取,以防止 webhook 请求挂起和更新丢失。(#26156) - Slack/会话线程:防止过大的父会话继承静默破坏新线程会话,向用户暴露嵌入上下文溢出空结果失败,并添加可配置的 `session.parentForkMaxTokens`(默认 `100000`,`0` 禁用)。(#26912) 感谢 @markshields-tl。 - Cron/消息多账户路由:在隔离的 cron 投递解析中,遵循显式的 `delivery.accountId`;当 `message.send` 省略 `accountId` 时,回退到发送代理绑定的通道账户,而非默认全局账户。(#27015, #26975) 感谢 @lbo728 和 @stakeswky。 - 网关/消息媒体根:将 `agentId` 线程化贯穿网关 `send` RPC,并优先使用显式 `agentId` 而非会话/默认解析,使得非默认代理工作区媒体发送不再因 `LocalMediaAccessError` 失败;为代理优先级和空白代理回退添加回归覆盖测试。(#23249) 感谢 @Sid-Qin。 - 后续操作/路由:当显式源路由失败时,允许同通道回退分发(同时仍阻止跨通道回退),以便在瞬态源适配器失败时后续回复不会被丢弃。(#26109) 感谢 @Sid-Qin。 - Cron/声明重复防护:分别追踪尝试的声明/直接投递与已确认的 `delivered`,并在投递已尝试时抑制回退主会话 cron 摘要,以避免不确定确认路径中的重复终端用户发送。(#27018) - LINE/生命周期:保持 LINE `startAccount` 处于待定状态直至中止,使得 webhook 启动不再被误读为立即通道退出,防止 LINE 提供商启动时的重启循环风暴。(#26528) 感谢 @Sid-Qin。 - Discord/网关:在生命周期监听器附加之前捕获并排空启动时网关 `error` 事件,使得早期的 `Fatal Gateway error: 4014` 作为可操作的意图指导关闭界面,而非未捕获的网关崩溃。(#23832) 感谢 @theotarr。 - Discord/入站文本:在消息和转发快照解析中保留嵌入 `title` + `description` 回退文本,使得嵌入标题不会从代理输入中静默丢失。(#26946) 感谢 @stakeswky。 - Slack/入站媒体回退:通过添加文件名占位符回退、将回退名称限制在共享媒体文件限制内,以及将空文件名规范化为 `file`,使得即使 Slack 媒体下载失败也能传递仅文件消息,防止仅附件消息被静默丢弃。(#25181) 感谢 @justinhuangcode。 - Telegram/预览清理:当后续助手消息仅为媒体时(例如混合文本加语音回合),通过跳过助手消息边界处的最终预览归档来保留已定稿的文本预览,防止清理删除已可见的最终文本消息。(#27042) - Telegram/Markdown 剧透:保留有效的 `||spoiler||` 对,同时将不匹配的尾部 `||` 分隔符保留为字面文本,避免错误的全有或全无剧透抑制。(#26105) 感谢 @Sid-Qin。 - Slack/允许列表频道:在通道允许列表解析期间不区分大小写匹配频道 ID,使得小写配置键(例如 `c0abc12345`)能正确匹配运行时 Slack ID(`C0ABC12345`),防止静默通道事件丢弃。(#26878) 感谢 @lbo728。 - Discord/输入指示器:通过密封通道输入保持回调在空闲/清理之后,并确保 Discord 分发始终标记输入空闲(即使预览流清理失败),防止卡住的输入指示器。(#26295) 感谢 @ngutman。 - 通道/输入指示器:在空闲/清理关闭后防护输入保持启动回调,使得关闭后滴答无法重新触发过时的输入指示器。(#26325) 感谢 @win4r。 - 后续操作/输入指示器:确保后续回合在每条退出路径(包括 `NO_REPLY`、空负载和代理错误)上标记分发空闲,使得输入保持清理始终运行,且通道输入指示器在排队/静默后续操作后不会卡住。(#26881) 感谢 @codexGW。 - 语音呼叫/TTS 工具:当消息提供商为 `voice` 时隐藏 `tts` 工具,防止语音呼叫运行选择自播放 TTS 并陷入无声无输出循环。(#27025) - 代理/工具:规范化省略 `content` 的非标准插件工具结果,使得嵌入运行在工具完成后不再因 `Cannot read properties of undefined (reading 'filter')` 而崩溃(包括 `tesseramemo_query`)。(#27007) - Cron/模型覆盖:当隔离的 `payload.model` 不再在允许列表中时,回退到默认模型选择而非使作业失败,同时仍对无效模型字符串返回显式错误。(#26717) 感谢 @Youyou972。 - 代理/模型回退:即使存在 `agents.defaults.models` 允许列表,也保持显式文本+图像回退链可达;优先使用显式运行 `agentId` 而非会话键解析以进行后续回退覆盖解析(带会话键回退);将代理级回退覆盖视为嵌入式运行器预检中配置;将 `model_cooldown` / `cooling down` 错误分类为 `rate_limit` 以便故障转移继续。(#11972, #24137, #17231) - 代理/模型回退:当会话模型与配置主模型不同时,保持同提供商回退链活跃;从提供商配置文件状态(而非仅 `disabledReason`)推断冷却原因;保持无配置文件回退提供商合格(env/models.json 路径);且仅为 `rate_limit` 放宽同提供商冷却回退尝试。(#23816) 感谢 @ramezgaberiel。 - 代理/模型回退:当候选者剩余时,对无法识别的错误继续回退遍历,同时在最后一个候选者上仍抛出原始未知错误。(#26106) 感谢 @Sid-Qin。 - 模型/身份验证探测:将永久身份验证故障转移原因(例如 `auth_permanent`,如密钥被撤销)映射到探测身份验证状态而非 `unknown`,使得 `openclaw models status --probe` 报告可操作的身份验证失败。(#25754) 感谢 @rrenamed。 - 钩子/入站元数据:在插件和内部钩子路径中,为 `message_received` 元数据包含 `guildId` 和 `channelName`。(#26115) 感谢 @davidrudduck。 - Discord/组件身份验证:使用命令门控授权器评估公会组件交互,使得未授权用户不再在模态/按钮事件上获得 `CommandAuthorized: true`。(#26119) 感谢 @bmendonca3。 - 安全/网关身份验证:要求对使用共享令牌身份验证的操作员设备身份会话进行配对,防止未配对设备自分配操作员范围。感谢 @tdjackey 报告。 - 安全/网关 WebSocket 身份验证:对 Control UI/Webchat 之外的直接浏览器 WebSocket 客户端强制实施源检查,对浏览器源环回尝试(包括 localhost)应用密码身份验证失败节流,并阻止非 Control UI 浏览器客户端的静默自动配对,以防止跨源暴力破解和会话接管链。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @luz-oasis 报告。 - 安全/网关可信代理:要求 Control UI 可信代理配对绕过具有 `operator` 角色,使得未配对的 `node` 会话不再能通过 `client.id=control-ui` 连接并调用节点事件方法。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/macOS 测试版引导:移除 Anthropic OAuth 登录和遗留的 `oauth.json` 引导路径(该路径通过 OAuth `state` 暴露 PKCE 验证器)。这仅影响 macOS 测试版引导路径。Anthropic 订阅身份验证现仅支持设置令牌,并将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @zdi-disclosures 报告。 - 安全/Microsoft Teams 文件同意:将 `fileConsent/invoke` 上传接受/拒绝绑定到原始会话,再消耗挂起的上传,防止通过泄露的 `uploadId` 值进行跨会话挂起文件上传或取消;包含匹配/不匹配调用处理的回归覆盖测试。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/网关:强化 `agents.files` 路径处理,以阻止 `agents.files.get`/`agents.files.set` 中工作区外的符号链接目标,保持工作区内符号链接目标支持,并为阻止的逃逸和允许的工作区内符号链接添加网关回归覆盖测试。感谢 @tdjackey 报告。 - 安全/工作区文件系统:在 `tools.fs.workspaceOnly` 和 `tools.exec.applyPatch.workspaceOnly` 边界检查(包括沙盒挂载根防护)中拒绝硬链接工作区文件别名,防止通过工作区内硬链接路径进行工作区外读/写。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/浏览器临时路径:基于 realpath 的写入路径检查以及不安全的回退链接安全回退 tmp-dir 验证(失败时关闭),强化跟踪/下载输出路径处理以抵抗符号链接根和符号链接父级逃逸。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/浏览器上传:在 Playwright 文件选择器和直接输入流的使用时重新验证上传路径,使得缺失/重新绑定的路径在 `setFiles` 前被拒绝,并包含严格缺失路径处理的回归覆盖测试。 - 安全/执行批准:将 `system.run` 批准匹配绑定到精确的 argv 身份,并在渲染的命令文本中保留 argv 空格,防止尾部空格可执行路径交换重复使用不匹配的批准。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/执行批准:通过在节点主机上强化批准绑定的 `system.run` 执行,拒绝符号链接 `cwd` 路径并在生成前规范化类路径可执行 argv,阻止批准与执行之间可变 cwd 符号链接重定向链。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/信号:在仅反应通知入队前强制执行 DM/群组授权,使得未授权发送者不再能在 `dmPolicy`/`groupPolicy` 下注入信号反应系统事件;反应通知现在需要先进行通道访问检查。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/Discord 反应:在直接消息中反应事件系统入队前强制执行 DM 策略/允许列表授权;Discord 反应处理现在也遵循 DM/群组 DM 启用和公会 `groupPolicy` 通道门控,以保持反应入口与正常消息预检一致。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/Slack 反应+固定:通过共享发送者授权门控 `reaction_*` 和 `pin_*` 系统事件入队,使得 DM `dmPolicy`/`allowFrom` 和通道 `users` 允许列表对非消息入口一致强制执行,并包含拒绝/允许发送者路径的回归覆盖测试。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/Telegram 反应:在入队反应系统事件前,对 `message_reaction` 事件强制执行 `dmPolicy`/`allowFrom` 和群组允许列表授权,防止在 DM 和群组中未经授权的反应触发输入;此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/Telegram 群组允许列表:通过从群组允许列表评估中移除 DM 配对存储回退,为群组发送者授权失败关闭;群组发送者访问现在需要显式的 `groupAllowFrom` 或每群组/每主题 `allowFrom`。(#25988) 感谢 @bmendonca3。 - 安全/Slack 交互:在入队 `block_action`/`view_submission`/`view_closed` 系统事件前,强制执行通道/DM 授权和模态参与者绑定(`private_metadata.userId`),并包含未授权发送者和缺失/不匹配参与者元数据的回归覆盖测试。此变更将包含在下一个 npm 版本(`2026.2.25`)中。感谢 @tdjackey 报告。 - 安全/Nextcloud Talk:使用持久的每账户重放去重(跨重启)丢弃重放的有签名 webhook 事件,并在账户