← 返回更新日志

OpenClaw v2026.2.19-beta.1 预发布

2026-02-19 · GitHub 原文
### 变更内容 - **iOS/Watch**:新增 Apple Watch 伴侣应用 MVP,包含手表收件箱界面、手表通知中继处理,以及用于手表状态/发送流程的网关命令界面。(#20054) 感谢 @mbelinky。 - **iOS/Gateway**:在 `nodes.invoke` 前通过 APNs 唤醒已断开的 iOS 节点,并在静默推送唤醒时自动重连网关会话,以减少应用在后台时的调用失败。(#20332) 感谢 @mbelinky。 - **Gateway/CLI**:新增配对设备清理流程,包含 `device.pair.remove`,以及 `openclaw devices remove` 和受保护的 `openclaw devices clear --yes [--pending]` 命令,用于移除配对条目并可选择拒绝待处理请求。(#20057) 感谢 @mbelinky。 - **iOS/APNs**:为节点交付新增推送注册和通知签名配置。(#20308) 感谢 @mbelinky。 - **Gateway/APNs**:在网关流程中新增用于 APNs 交付验证的推送测试管道。(#20307) 感谢 @mbelinky。 - **安全/审计**:当 `gateway.auth.mode="none"` 导致网关 HTTP API 可访问时,新增 `gateway.http.no_auth` 发现项,包含环回警告和远程暴露严重性,以及回归覆盖和文档更新。 - **技能**:通过移除将不受信任的问题文本直接插入命令字符串的 shell 命令示例,强化编码代理技能指导。 - **开发工具**:统一 `oxfmt` 本地/CI 格式化行为。(#12579) 感谢 @vincentkoc。 ### 修复内容 - **代理/流式处理**:在推理流期间保持助手部分流式处理活动,一致处理原生 `thinking_*` 流事件,去重混合的推理结束信号,并在同一目标重试成功后清除过时的变异工具错误。(#20635) 感谢 @obviyus。 - **iOS/屏幕**:将 `WKWebView` 生命周期所有权移至 `ScreenWebView` 协调器,并采用显式的附加/分离流程,以减少屏幕标签页更新期间的手势/生命周期崩溃风险(`__NSArrayM insertObject:atIndex:` 路径)。(#20366) 感谢 @ngutman。 - **iOS/引导**:通过保持恢复状态转换稳定,防止自动恢复期间的配对状态闪烁。(#20310) 感谢 @mbelinky。 - **iOS/引导**:通过手动重试时重置过时的配对请求状态、在操作员失败时断开操作员和节点网关连接,以及避免因操作员传输身份附加导致的重复配对循环,来稳定配对和重连行为。(#20056) 感谢 @mbelinky。 - **iOS/签名**:通过将 `.local-signing.xcconfig` 连接到活动签名配置并在本地签名设置中生成 `OPENCLAW_DEVELOPMENT_TEAM`,恢复 iOS 项目生成期间本地自动选择的签名团队覆盖。(#19993) 感谢 @ngutman。 - **Telegram**:统一类消息的入站处理,使 `message` 和 `channel_post` 共享相同的去重/访问/媒体管道并保持行为一致。(#20591) 感谢 @obviyus。 - **Telegram/代理**:将 exec/bash 工具失败警告置于详细模式之后,以便默认 Telegram 回复保持简洁,同时详细会话仍能显示诊断信息。(#20560) 感谢 @obviyus。 - **Telegram/Cron/心跳**:在 cron 和心跳交付中遵循显式的 Telegram 主题目标(`<chatId>:topic:<threadId>`),使计划发送的内容进入配置的主题而非最后的活动线程。(#19367) 感谢 @Lukavyi。 - **网关/守护进程**:将 `TMPDIR` 转发到已安装的服务环境中,以便 macOS LaunchAgent 网关运行可以可靠地打开 SQLite 临时/日志文件,而不是因 `SQLITE_CANTOPEN` 而失败。(#20512) 感谢 @Clawborn。 - **代理/计费**:在面向用户的计费消息中包含产生计费错误的活动模型(例如 `OpenAI (gpt-5.3)`),涵盖有效负载、故障转移和生命周期错误路径,以便用户能准确识别哪个密钥需要额度。(#20510) 感谢 @echoVic。 - **网关/TUI**:通过移除硬编码的块流禁用覆盖,使 `chat.send` 遵循 `agents.defaults.blockStreamingDefault`,以便回复可以使用配置的块模式交付。(#19693) 感谢 @neipor。 - **UI/会话**:在聊天 UI 流程中接受规范的主会话密钥别名,以保持主会话路由的一致性。(#20311) 感谢 @mbelinky。 - **OpenClawKit/协议**:在通过 `AnyCodable` 桥接时保留 JSON 布尔字面量(`true`/`false`),以便 Apple 客户端 RPC 参数不再将布尔值重新编码为 `1`/`0`。感谢 @mbelinky。 - **命令/Doctor**:当 `memory.backend` 为 `qmd` 时,跳过嵌入提供程序警告,因为 QMD 内部管理嵌入,不需要 `memorySearch` 提供程序。(#17263) 感谢 @miloudbelarebia。 - **Canvas/A2UI**:改进捆绑资源解析和空状态处理,使 UI 后备方案可靠渲染。(#20312) 感谢 @mbelinky。 - **命令/Doctor**:在修复期间避免使用新的 `gateway.auth.token` 默认值重写无效配置,仅在检测到实际配置更改时才写入,防止意外的令牌重复和备份变动。 - **网关/认证**:将未解析的网关认证默认为令牌模式,并在启动时自动生成/持久化 `gateway.auth.token`,同时允许显式设置 `gateway.auth.mode: "none"` 用于有意的开放环回设置。(#20686) 感谢 @gumadeiras。 - **频道/Matrix**:通过一致处理 matrix.to 提及格式,修复 `formatted_body` Matrix-to 链接的提及检测。(#16941) 感谢 @zerone0x。 - **心跳/Cron**:当 `HEARTBEAT.md` 缺失或为空且没有标记的 cron 事件排队时,跳过间隔心跳,同时为排队的标记提醒保留 cron 事件后备方案。(#20461) 感谢 @vikpos。 - **浏览器/中继**:当中继端口被另一个 OpenClaw 进程占用时,重用已运行的扩展中继,同时在非中继端口冲突时仍会失败,以避免掩盖无关的监听器。(#20035) 感谢 @mbelinky。 - **脚本**:更新 clawdock 辅助命令支持,以包含可用的 `docker-compose.extra.yml`。(#17094) 感谢 @zerone0x。 - **Lobster/配置**:移除 Lobster 可执行路径覆盖(`lobsterPath`),要求基于 PATH 的执行,并添加聚焦的 Windows 包装器解析测试以保持无 shell 行为的稳定。 - **网关/WebChat**:阻止 WebChat 客户端的 `sessions.patch` 和 `sessions.delete`,以便会话存储的变更仅限于非 WebChat 操作员流程。感谢 @allsmog 报告。 - **网关**:澄清 macOS 上 launchctl GUI 域引导失败。(#13795) 感谢 @vincentkoc。 - **Lobster/CI**:修复不稳定的测试 Windows cmd shim 脚本解析。(#20833) 感谢 @vincentkoc。 - **浏览器/中继**:要求对 `/extension` 和 `/cdp` 进行网关令牌认证,并将 Chrome 扩展设置调整为使用单个 `gateway.auth.token` 输入进行中继认证。感谢 @tdjackey 报告。 - **网关/钩子**:按配置的代理范围运行 BOOT.md 启动检查,包括每个代理的会话密钥解析、启动钩子回归覆盖以及非成功启动结果日志记录,以提高可诊断性。(#20569) 感谢 @mcaxtr。 - **协议/Apple**:为 `push.test` 重新生成 Swift 网关模型,以便 `pnpm protocol:check` 在主分支上保持通过。感谢 @mbelinky。 - **沙盒/注册表**:使用共享文件锁和原子替换序列化容器和浏览器注册表写入,以防止更新丢失和删除回滚竞争导致 `sandbox list`、`prune` 和 `recreate --all` 不同步。感谢 @kexinoh。 - **OTEL/diagnostics-otel**:完成 OpenTelemetry v2 API 迁移。(#12897) 感谢 @vincentkoc。 - **Cron/Webhooks**:使用受 SSRF 防护的出站获取(`fetchWithSsrFGuard`)保护 cron webhook POST 交付,以在请求分派前阻止私有/元数据目标。感谢 @Adam55A-code。 - **安全/语音通话**:通过阻止不安全的深度合并键(`__proto__`、`prototype`、`constructor`)来强化 `voice-call` 电话 TTS 覆盖合并,并为顶层和嵌套的原型污染负载添加回归覆盖。 - **安全/Windows 守护进程**:通过引用 cmd 元字符参数、转义 `%`/`!` 扩展以及拒绝参数、描述和环境赋值(`set "KEY=VALUE"`)中的 CR/LF,强化计划任务 `gateway.cmd` 生成,防止 Windows 守护进程启动脚本中的命令注入。此功能将在下一个 npm 版本中发布。感谢 @tdjackey 报告。 - **安全/网关/Canvas**:将共享 IP 后备认证替换为节点范围的会话能力 URL,用于 `/__openclaw__/canvas/*` 和 `/__openclaw__/a2ui/*`,当受信任代理请求省略转发的客户端标头时严格失败,并添加 IPv6/代理标头回归覆盖。此功能将在下一个 npm 版本中发布。感谢 @aether-ai-agent 报告。 - **安全/网络**:在 SSRF 检查中强制执行严格的点分十进制 IPv4 字面量,并在 DNS 查找前对不支持的旧格式(八进制/十六进制/短格式/打包格式,例如 `0177.0.0.1`、`127.1`、`2130706433`)严格失败。 - **安全/Discord**:对管理操作(`timeout`、`kick`、`ban`)强制执行受信任发送者公会权限检查,并忽略不受信任的 `senderUserId` 参数,以防止工具驱动流程中的权限提升。感谢 @aether-ai-agent 报告。 - **安全/ACP+Exec**:添加 `openclaw acp --token-file/--password-file` 密钥文件支持(带有内联密钥标志警告),将 ACP 工作目录前缀重定向为 `~` 主目录相对路径,将 exec 脚本预检文件检查限制在有效的 `workdir` 边界内,并在配置了 `tools.exec.host="sandbox"` 但沙盒模式关闭时添加安全审计警告。 - **安全/插件/钩子**:通过真实路径检查强制执行运行时/包路径包含,以便 `openclaw.extensions`、`openclaw.hooks` 和钩子处理程序模块无法通过遍历或符号链接逃逸其受信任的根目录。 - **安全/Discord**:在消息操作分派中集中管理操作的受信任发送者检查,跨处理程序共享管理命令解析,并通过显式的 any/all 语义澄清权限助手。 - **安全/ACP**:通过重复会话刷新、空闲会话回收、最旧空闲软限制驱逐以及会话创建的突发速率限制来强化 ACP 桥接会话管理,以降低本地 DoS 风险,同时不干扰正常的 IDE 使用。 - **安全/ACP**:在网关转发前将 ACP 提示文本负载限制在 2 MiB 以内,在预连接大小检查期间考虑连接分隔符字节,并在拒绝超大提示时避免过时的活动运行会话状态。感谢 @aether-ai-agent 报告。 - **安全/插件/钩子**:为 npm 插件/钩子安装添加可选的 `--pin`,持久化已解析的 npm 元数据(`name`、`version`、`spec`、完整性、shasum、时间戳),在更新期间对完整性漂移发出警告/确认,并扩展 `openclaw security audit` 以标记未固定的规范、缺失的完整性元数据和安装记录版本漂移。 - **安全/插件**:通过阻止不安全的候选(根目录逃逸、全局可写路径、可疑所有权)来强化插件发现,当 `plugins.allow` 为空且存在可发现的非捆绑插件时添加启动警告,并对没有安装/加载路径来源的已加载插件发出警告。 - **安全/网关**:将控制平面写入 RPC(`config.apply`、`config.patch`、`update.run`)的速率限制为每个 `deviceId+clientIp` 每分钟 3 个请求,添加重启单次飞行合并和 30 秒重启冷却期,并记录参与者/设备/IP 以及配置/更新触发的重启的变更路径审计详细信息。 - **安全/Webhooks**:通过 webhook 模式令牌前提条件、环回默认 Feishu 绑定主机、JSON 内容类型强制执行、每路径速率限制、Zalo 事件的重播去重、恒定时间 Zalo 密钥比较和异常状态计数器,强化 Feishu 和 Zalo webhook 入口。 - **安全/插件**:对于下一个 npm 版本,澄清插件信任边界,并默认保持 `runtime.system.runCommandWithTimeout` 可用于受信任的进程内插件。感谢 @markmusson 报告。 - **安全/技能**:对于下一个 npm 版本,在技能打包期间拒绝符号链接,以防止外部文件包含在分发的 `.skill` 存档中。感谢 @aether-ai-agent 报告。 - **安全/网关**:当 `hooks.token` 与 `gateway.auth.token` 匹配时启动失败,以便在启动时拒绝钩子和网关令牌重用。(#20813) 感谢 @coygeek。 - **安全/网络**:阻止到非环回主机的明文 `ws://` 连接,并要求在其他地方使用安全的 WebSocket 传输。(#20803) 感谢 @jscaldwell55。 - **安全/配置**:使用 YAML 1.2 核心模式解析 frontmatter YAML,以避免隐式强制转换 `on`/`off` 样式的值。(#20857) 感谢 @davidrudduck。 - **安全/Discord**:转义 exec-approval 嵌入内容中的反引号,以防止通过命令文本进行 Markdown 格式注入。(#20854) 感谢 @davidrudduck。 - **安全/代理**:在命令查找助手中用 `execFileSync` 替换基于 shell 的 `execSync` 使用,以消除 shell 参数插值风险。(#20655) 感谢 @mahanandhi。 - **安全/媒体**:使用 `crypto.randomBytes()` 生成临时文件名,并为 TTS 临时文件设置仅所有者权限。(#20654) 感谢 @mahanandhi。 - **安全/网关**:在网关 HTTP 响应上设置基线安全标头(`X-Content-Type-Options: nosniff`、`Referrer-Policy: no-referrer`)。(#10526) 感谢 @abdelsfane。 - **安全/iMessage**:通过要求严格的主机密钥验证、将 `channels.imessage.remoteHost` 验证为 `host`/`user@host`,并拒绝来自配置或自动检测的不安全主机令牌,来强化远程附件 SSH/SCP 处理。感谢 @allsmog 报告。 - **安全/Feishu**:通过将密钥派生的临时文件名替换为基于 UUID 的名称,防止 Feishu 入站媒体临时文件写入中的路径遍历。感谢 @allsmog 报告。 - **安全/Feishu**:在 `stripBotMention` 中转义提及正则表达式元字符,以便精心构造的提及元数据无法在入站消息解析期间触发正则表达式注入或 ReDoS。(#20916) 感谢 @orlyjamie 修复和 @allsmog 报告。 - **LINE/安全**:通过使用基于 UUID 的临时路径下载媒体,而不是外部消息 ID,来强化入站媒体临时文件命名。(#20792) 感谢 @mbelinky。 - **安全/媒体**:通过在 `saveMediaSource` 中使用符号链接拒绝和 inode/设备验证将读取固定到单个文件描述符,来强化本地媒体摄取,防止 TOCTOU/符号链接交换攻击。感谢 @dorjoos 报告。 - **安全/Lobster (Windows)**:对于下一个 npm 版本,移除启动 Lobster 包装器(`.cmd`/`.bat`)时基于 shell 的后备方案,并切换到显式的 argv 执行和包装器入口点解析,在保持 Windows 包装器兼容性的同时防止命令注入。感谢 @allsmog 报告。 - **安全/Exec**:要求 `tools.exec.safeBins` 二进制文件从受信任的 bin 目录(系统默认值加上网关启动 `PATH`)解析,以便被 PATH 劫持的特洛伊木马二进制文件无法绕过允许列表检查。感谢 @jackhax 报告。 - **安全/Exec**:通过使用确定性的仅 argv 的 stdin-safe 验证并阻止面向文件的标志(例如 `sort -o`、`jq -f`、`grep -f`),从 `tools.exec.safeBins` 中移除文件存在预言行为,以便允许/拒绝结果不再披露主机文件存在。此功能将在下一个 npm 版本中发布。感谢 @nedlir 报告。 - **安全/浏览器**:通过一个受 SSRF 防护的验证路径路由浏览器 URL 导航,用于标签页打开/CDP 目标/Playwright 导航流程,并默认阻止私有/元数据目标(可通过 `browser.ssrfPolicy` 配置)。此功能将在下一个 npm 版本中发布。感谢 @dorjoos 报告。 - **安全/Exec**:对于下一个 npm 版本,通过阻止输出/递归标志(`sort -o/--output`、grep 递归)并收紧默认安全二进制文件以移除 `sort`/`grep`,来强化