
OpenClaw 24h 更新快报(2026-10-27):子代理中断恢复、凭据隔离、沙箱加固
过去 24 小时里,OpenClaw 主干最密集的改动集中在 Agent 会话生命周期:Gateway 重启后被中断的嵌套子代理现在可以被找回、恢复并向父会话正确结算;已经结束运行的子代理也不会再因为内部压缩而丢失最终回复。与此同时,安全侧的修复开始从"权限判断"下沉到"资源归属"层面——记忆嵌入凭据不再随 provider 切换错配到别的目的地,回复附件开始真正遵守显式的文件读取策略,沙箱里嵌套挂载的技能目录也补上了可写祖先目录的加固。
如果只看合并数字会以为这仍是清一色的性能优化批次,但真正影响使用手感的其实是几条 P1 修复:更新命令在超大依赖树下会直接失败、源码构建在某些声明阶段编译不过、浏览器扩展中继在应用原地升级后仍连着旧安装。这些问题不报错在业务逻辑里,而是让"升级"这个动作本身失灵,因此值得单独说明。
Agent 会话:中断的子代理可以被找回,终态回复不再被压缩掉
多层子代理(director → lead → sub-lead → worker,每层用 sessions_spawn 加 sessions_yield 串联)在 Gateway 崩溃时唤醒 yielded 的环节,一旦崩溃就会永久挂起。相关修复分两步推进:
- PR #184925 让"已接纳的请求方结算回合"在任意 spawn 深度上都能在 Gateway 重启后恢复,抓到真实的最终回复并只结算父会话一次。作者在 Crabbox 压测中用
kill -9复现了原问题,此修复不需要任何配置或迁移,缺失最终回复的场景仍然按错误处理。 - PR #184988 补上了另一个缺口:此前只有"父会话回合 ID 存在"时才会保存操作者凭证,直接被操作者接纳的子会话会丢掉原始来源,恢复时反而被
sessions.recover拒绝。现在这类子会话在启动前就保留原始来源,可以跨多次 Gateway 重启继续恢复;恢复不了时也会保留 Resume 标记,并向真正的父会话发出带恢复指引的中断通知。
与之相关的是 PR #185051:子代理运行的最终回复此前会在内部压缩时被移出常驻记录,而 subagent-announce-result.ts、agents_wait 预览、cron 跟进等读取路径都从常驻记录取值,结果是"跑完了但没人知道它说了什么"。该修复把终态回复保留在常驻记录中,announce 阶段再晚发生也不会丢文本。
另外两处清理类修复也值得留意:PR #184990 让已完成运行的异步上下文及时释放运行状态,避免长期占用;PR #179731 则修掉了 /reset 与 sessions.reset 在历史子代理原始会话实例已不可用时失败的问题,重置操作现在会跳过那些早已结束的终端运行,而不是再去"杀死"它们一次。
安全与权限:凭据归属、读取策略与沙箱挂载
PR #184966 修的是一个容易被忽视的凭据串号问题:记忆搜索模块在 Agent 覆盖了共享 provider 时,会独立选取 provider 却沿用继承来的 endpoint 与鉴权字段,导致共享凭据被送到另一个 provider;记忆安装流程在切换 provider 时也会误删旧的共享鉴权。修复后,嵌入凭据始终跟随其配置的目的地,主配置继承与安装流程的保留行为都恢复正常。
PR #184964 把显式的文件读取策略真正接到了回复附件授权链路上。此前准入只看群组规则和发送者规则,操作者明确排除读取的文件仍可能作为工作区附件被带进最终回复;现在全局与单 Agent 的读策略会在授予出站媒体访问之前生效,被拒绝的读取会走既有的 denied-reader 路径,而正常附件与受管生成媒体不受影响。
沙箱侧,PR #180840 修掉了一个真实的逃逸面:当 workspaceAccess 为 rw 时,技能根目录会以只读方式嵌套挂载到可写工作目录之下(<workdir>/.agents/skills 等),而 Linux 允许重命名挂载点的父目录——沙箱 shell 只要把 .agents 或 .openclaw 移开再重建,就能用普通可写文件冒充受保护的技能路径。该修复把每个可写祖先目录一并固定住,使技能挂载无法被这种"移开再重建"的手法绕过。
渠道与语音:取消要真的停,发话顺序要真的对
PR #184915 修复了 Discord 出站适配器丢掉调用方取消信号的问题:回合被停止后,文本、媒体、语音消息请求、投票以及 webhook 人格发送仍会继续,重试也会继续跑。现在取消信号被透传到既有的 REST 与重试链路,取消进行中的请求会真正停掉后续文本分片与重试。
语音侧有两处小而确定的修复。PR #183681 处理了实时 Talk 启动在等待 Gateway 目录时被取消的场景:此前会留下中继泄漏和错误的"正在聆听"状态,取消时会关闭中继并清理会话,macOS 上未就绪的中继也不会被标记为聆听中。PR #184743 则修正了混合语音与输入的聊天里的排序错乱——尚未写入历史的口述字幕原本被追加在所有消息之后,导致"先说的话反而排在后输入的文字下面",现在字幕会停在它被说出的位置。
控制台体验:会话选择、大文件预览与访客可见性
PR #185039 处理了 Access(Daybreak 的 Blue / Red 选项)在新建或重新打开会话时丢失的问题,包括使用配置默认模型的草稿。修复后,关闭再打开会恢复上次允许的 Daybreak 选择;首次提交且没有历史选择或默认配置时明确使用 Standard。
PR #184997 让超过 4 万字符的 Markdown 文件在聊天侧栏的预览里按文档渲染,而不是把原文当纯文本堆出来;桌面端与移动端的文件预览现在都能完整读到末尾的标题,源视图仍保留原始文本,远程图片依旧需要显式打开。
权限体验上还有两条:PR #184980 让只有会话级权限的登录用户也能编辑自己的个人指令,而不必拥有更宽的 Gateway 读取权限;PR #185035 与 PR #182625 分别修复了访客在提及标签上无法加载人员卡片、以及访客无法在自己的会话里布置个人看板的问题——此前这些路径硬性要求 operator.read 与更宽的 Gateway 访问权。
构建、更新与运行时:让"升级"这个动作本身不再失灵
PR #184958 修复了大依赖树下 openclaw update 必然失败的问题:运行期保留阶段把整个保留清单通过 worker 的 stdout 回传,stdout 有 64 MiB 上限,在 pnpm nodeLinker: isolated 配合全局虚拟store(可达约 74.6 万个被保留文件)的安装上会触发 Worker output exceeded its capture limit 并被 SIGTERM 终止。修复后大安装也能完成更新,小安装行为不变。
PR #185050 修掉了 pnpm build 在主干上的失败:packages/ai 的声明步骤编译 observeAsyncIterator 时触发 TS2550: Property 'withResolvers' does not exist on type 'PromiseConstructor',原因是包声明程序使用 ES2023 的 lib 配置。修复同时让 PR CI 在包声明程序无法编译时直接失败,而不是把问题留给下一次完整构建。
PR #185038 处理了原地更新后的浏览器中继陈旧问题:应用或包原地更新后,Chrome 仍会沿用旧安装目录里的扩展中继,直到有人手动结束进程。修复后中继会在约 30 秒内切到当前安装,同一安装内的重新附着行为保持不变。
运行时还有两条降本性质的改动:PR #185057 把 Anthropic 客户端 SDK 从共享助手的入口处急切导入改为首次使用时再加载——一次十分钟的合成 Gateway 普查发现忙时窗口内有 218 个脚本加载了 SDK 却一次也没调用其函数;PR #185003 则修正了知识库维护计划在夏令时前跳时后会漏掉一个调度日的问题,限定星期或日期的维护现在会在前跳之后的第一个匹配日执行。
本轮更新的基调是把可靠性问题从"用户能看见的功能异常"下沉到"会话状态、凭据归属与挂载布局"这些底层层面,修复的数量多但方向一致,代价是单条改动都不显眼,只有在批量升级或大规模使用时才会显出价值。


评论