← 返回更新日志

OpenClaw v2026.2.25-beta.1 预发布

2026-02-26 · GitHub 原文
### 变更 - Android/聊天:改进原生 Android 聊天 UI 中的流式交付处理和 markdown 渲染质量,包括更好的 GitHub 风格 markdown 行为。(#26079) 感谢 @obviyus。 - Android/启动性能:延迟前台服务启动,将 WebView 调试初始化移出关键启动路径,并添加启动宏基准测试 + 低噪声性能 CLI 脚本,用于确定性冷启动跟踪。(#26659) 感谢 @obviyus。 - UI/聊天撰写:在小屏幕上为撰写操作按钮添加移动端堆叠布局,以改进发送/会话控制的可用性。(#11167) 感谢 @junyiz。 - 心跳/配置:用心跳直接策略 `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` 固定。 ### 修复 - 代理/子代理交付:将子代理完成通知分发重构为显式队列/直接/回退状态机,在冷/陈旧插件注册表状态下恢复出站通道插件解析(跨通知/消息/网关发送路径),在通知流拒绝时完成最终清理簿记,并将没有 `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`)在 `groupPolicy: "allowlist"` 下正确匹配 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 `state` 暴露 PKCE 验证器的遗留 `oauth.json` 引导路径;这仅影响 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 的写入路径检查加固跟踪/下载输出路径处理,防止符号链接根和符号链接父级逃逸,并添加不安全的回退链接上失败封闭的安全回退临时目录验证。此功能将在下一个 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 报告。 - 安全/Slack 交互:在入队 `block_action`/`view_submission`/`view_closed` 系统事件之前,强制执行通道/DM 授权和模态参与者绑定(`private_metadata.userId`),并为未经授权的发送者和缺失/不匹配参与者元数据提供回归覆盖。此功能将在下一个 npm 版本(`2026.2.25`)中发布。感谢 @tdjackey 报告。 - 安全/Nextcloud Talk:使用跨重启的持久每账户重放去重丢弃重放签名的 webhook 事件,并在账户基础 URL 已配置时拒绝意外的 webhook 后端来源。感谢 @aristorechina 报告。 - 安全/Nextcloud Talk:在完整正文读取之前拒绝未签名的 webhook 流量,减少未身份验证的请求正文暴露,具有身份验证顺序回归覆盖。(#26118) 感谢 @bmendonca3。 - 安全/Nextcloud Talk:停止将 DM 配对存储条目视为组允许列表发送者,以便组授权保持绑定到配置的组允许列表。(#26116) 感谢 @bmendonca3。 - 安全/LINE:在身份验证/签名处理之前限制未签名 webhook 正文读取,以限制未身份验证的正文处理。(#26095) 感谢 @bmendonca3。 - 安全/IRC:保持配对存储批准仅为 DM,并且不在 IRC 组允许列表授权之外,具有允许列表解析的策略回归测试。(#26112) 感谢 @bmendonca3。 - 安全/Microsoft Teams:将组允许列表和命令授权与 DM 配对存储条目隔离,以防止跨上下文授权渗漏。(#26111) 感谢 @bmendonca3。 - 安全/SSRF 防护:在共享 SSRF IP 检查中将 IPv6 多播字面量(`ff