OpenClaw 24h 更新快报(2026-10-29):Gateway 启动锁、只读配置提示、Cron 续跑

内容管家 新闻 AI领域评论0字数 2750阅读9分10秒阅读模式
OpenClaw 24h 更新快报(2026-10-29):Gateway 启动锁、只读配置提示、Cron 续跑

OpenClaw 24h 更新快报(2026-10-29):Gateway 启动锁、只读配置提示、Cron 续跑

过去 24 小时(UTC 2026-10-27 22:41 至 2026-10-28 22:41),openclaw/openclaw 合并了接近三百个 PR。主线很一致:把过去那些"偶发失败、重启就好了"的边缘行为,改成有明确规则、可预期、可解释的行为。最有代表性的是 Gateway 启动阶段对 SQLite 瞬时写锁的容错、健康监控不再抢在 sidecar 就绪之前拉起渠道,以及 Control UI 终于能直接告诉管理员"你连的这个 Gateway 配置是只读的,应该去那边改"。

Cron 与 CLI 这一侧则集中补齐了中断语义:被 Ctrl-C 打断的等待会真的停下,并且记住自己是因为什么停的。下面按主题挑出信息量较高的十余项,说明各自改了什么、为什么改,以及对使用者意味着什么。

Gateway 启动与运行稳定性

PR #186920 修掉了一个让运维反复重启的坑:worker sidecar 初始化期间如果撞上 SQLite 的瞬时写锁,Gateway 启动会直接中止,包括更新后的那次重启。现在的做法是在竞争写者释放锁后重试工作区日志清理,然后正常启动;必要的工作区恢复依然在 placement 启动前完成。如果锁是持续性的,启动仍然报出可执行的错误,而不是绕过恢复去赌工作区数据。

PR #186857 处理的是另一类抢跑:在慢启动的 Gateway 上,健康监控的第一次检查(60 秒宽限期之后)可能在 sidecar 准备完成之前就把一个已被停用的 provider 重新拉起。修复后,每一次账号启动都要先读 manager 拥有的启动屏障;批量初始启动还会保留运维在健康恢复等待期间下达的停止指令,避免后续的初始启动批次把停止状态清掉并"复活"该账号。

PR #186886 则针对 openclaw gateway suspend --wait 30:按下 Ctrl-C 之后,命令仍然在持续发送有副作用的 prepare 请求,同时阻塞根清理流程。修复后挂起流程会消费既有的取消信号,在派发前、非就绪回复后以及可中断的计时器中都会检查它;已经派发的 prepare 仍会正常收敛,而就绪结果的处理排在取消检查之前,所以运维已经拿到的 lease 凭据不会被丢掉。

另外两个方向也值得留意。PR #186998 让 Doctor 和更新的收尾阶段不再永久拒绝:当一个检查点化的旧版配置审计原始归档丢了它的脱敏副本,但原始字节仍与检查点一致且没有待导入记录时,Doctor 会记录一条带警告的跳过,保留原始归档与检查点并继续后续修复;真正还有未导入记录时依旧拒绝,并给出从可信备份恢复副本再重跑的具体指引。PR #186972 修复了选择 PostgreSQL agent 家族的安装在更新候选准入阶段误报"Agent 数据库迁移需要停写维护"的问题——即使 Gateway 已经停掉也会失败;现在这类受支持的旧版 PostgreSQL agent schema 可以正常进入既有的、带备份的停写迁移阶段。此外,提交 9b44c95 让 Doctor 能修复那些共享状态列尚未建完的升级残留。

控制台与开发者体验

PR #187015 是本轮对管理员最友好的改动。此前 Gateway 把配置当作只读处理这件事,只能靠管理员真的去改一次配置、撞到报错才能发现。现在 Control UI 会直接显示"Gateway configuration is read-only"并指明应该去哪里改;服务方还可以通过 OPENCLAW_CONFIG_READONLY_NOTICE 提供自定义说明和文档链接。这条提示由正在服务的 Gateway 按其配置写入器实际执行的策略给出,包括 Nix 模式下的只读配置;自定义提示只在当前连接确实指向那个只读 Gateway 时出现。

检索与选择体验也在补细节。PR #186964 修掉了配置向导里的模型选择器隐藏独立 CLI provider 的问题——当某个 provider 注册的 modelProvider 与它的后端 ID 相同时,条目会被误判为别名而藏起来,用户只好退回手动输入;现在这类模型可以正常出现在配置流程中。PR #186922 则把 TUI 里的会话、agent 与模型选择器统一到 NFC 归一化比较,修复了 openclaw resume Café 找不到名字里使用分解形式 Cafe\u0301 的会话这一类"看起来一样、码点不同"的问题,精确会话键仍然优先。

命令行退出码的准确性也在这一轮被修正。PR #171753 指出 dashboard --no-open 在 Gateway 已停止且 stdin 关闭时,会打印失败信息却不输出 URL,却返回退出码 0,脚本调用方因此得到假成功;现在这类准备失败一律返回退出码 1,与既有 JSON 路径保持一致,用户显式拒绝交互式恢复仍然算成功取消。PR #186983 修复了 YAML 路径写入的一处不一致:path set 在目标地址已被布尔或 null 键占用时会报告插入成功,实际却在同一逻辑地址上又加了一个字符串键,导致后续 path resolve 读到的仍是旧值;现在这种插入会直接失败且不改动文件。

移动端也有一个可量化的收益。PR #167730 修复了 iOS 侧边栏在每一个会话事件上都重新下载完整会话列表的问题——即使事件本身已经带上了变更行。现在已知的活动作用域行走共享行更新器,只有缺失、删除、归档、畸形或过期的行才会请求合并后的列表刷新;在真实 Gateway 模拟器上,同一事件序列的数据量从 476,148 字节降到 252,997 字节,减少约 46.9%。

Agent、Cron 与会话调度

Cron 侧有两个互补的修复。PR #185750 修掉了固定的精确运行地址被提前清理的问题:自动的即时清理在真实工作结束后会删掉一个合法固定的精确 occurrence 地址,尽管那个稳定的 cron 会话和共享记录还在,结果这个固定地址就不再解析。现在被固定且可固定的精确运行续跑能扛过自动即时清理,未被固定的条目仍然可以被清理;代价是保留的固定条目会占用存储直到被释放。PR #186750 修的是 cron run --wait 排队任务后按 Ctrl-C 或收到 SIGTERM 的情况:本地历史轮询会一直活到截止时间并阻塞根清理。现在中断会停掉本地等待,但不会为已排队的 Gateway 任务发送取消请求,完成、等待截止与输出刷新的既有契约保持不变,cron 与 automations 两个别名共享同一修复。

中断原因的可解释性同样被补上。PR #186903 让 CLI 在它已经知道停止原因时不再只给出笼统的 "CLI stopping" 诊断:被中断的命令会保留第一个被接受的停止原因,包括输出关闭(EPIPE)、输出 I/O 失败(EIO)和观测到的受管代理信号;退出码、取消类型、恢复与清理顺序都不变。PR #186905 修掉了 openclaw voicecall continue 在走 Gateway 时按 Ctrl-C 仍持续轮询、甚至在中断后还可能发布已完成回复的问题;语音命令的生命周期属主现在更早监听信号,并把信号贯穿到只读结果轮询和可中断等待中,同时不把取消信号传给 voicecall.continue.start 这个刻意要先结算的变更动作,因此打断通话本身不会结束对话或取消服务端语音。

Goals 侧的续跑也接上了一段。PR #180208 让本地 Codex 在一次非终结的正常回合之后,能够继续进行中的 OpenClaw Goals:排队的续跑会绑定到精确的本地/worker 落位和实时运维授权,并且在准入前落位或"需要 worker"策略发生变化时拒绝过期的本地续跑。这次合并刻意只包含同进程内的续跑部分,不含跨重启的持久化重放。此外,提交 21fdc27 允许 Agent 在连续出现完全相同的工具错误之后进行有界恢复,而不是直接卡死。

模型调用与性能开销

PR #187001 优化了 Anthropic 请求的构造路径。此前冻结对话历史中的内联图片会因为"消息投影缓存刻意排除带图消息以守住请求级图片预算"这一设计,被反复扫描 base64 内容;工具结果转换也会在归一化前重建每一个图片块。现在带图片的多轮 Anthropic 回合在准备请求时消耗更少 CPU,线路字节、可变输入校验、MIME 探测与转换、逐图与总量安全上限都不变,无需配置或迁移。

PR #186931 针对大体积工具结果:循环检测此前会在每个嵌套容器上先分配完整的规范化字符串再做哈希。现在改为复用既有的流式稳定值 SHA-256 与字符串归一化实现,循环检测在处理大结果时内存占用更低,而结果身份、重复错误拦截与进度检测保持逐字节不变。PR #186937 修掉了 Slack 私聊按用户限流的一处键名错配:写成原生 user ID 的 dms.U0123456789.historyLimit 会被内嵌运行时忽略,因为规范化后的会话 peer 是小写的,结果模型收到的是不断增长的完整对话,而不是配置好的最近回合窗口;现在原生大小写的键同样能约束内嵌记录。

发布链路

更新流程本身也有两处收敛。提交 171702e 让更新检查跳过对"仅替换"场景的重复判定,并对已经是当前版本的情况直接跳过,同时给出正确的服务管理器名称。提交 37106c5 则更新了测试规范,允许在修复类 PR 中做有明确理由的测试行数上限调整。

小结

这一轮的主线是"把偶发问题变成明确规则":启动锁、只读配置、中断语义、退出码和列表请求量,都在往可预期、可解释的方向收。对使用者来说,最直接的体感是重启变少、报错更可读、侧边栏更省流量。

常用链接

 
内容管家

发表评论