OpenClaw 24h 更新快报(2026-11-15):Agent 后台唤醒、会话广播性能、控制台 Usage 瘦身

内容管家 新闻 AI领域评论2字数 3874阅读12分54秒阅读模式
OpenClaw 24h 更新快报(2026-11-15):Agent 后台唤醒、会话广播性能、控制台 Usage 瘦身

OpenClaw 24h 更新快报(2026-11-15):Agent 后台唤醒、会话广播性能、控制台 Usage 瘦身

过去 24 小时,OpenClaw 的主线是 Agent 后台任务的退出通知:静默成功的命令不再沉默,而是直接唤醒会话并带上结果;同一批退出合并为一个模型轮次;Gateway 重启后 durable 命令也不再被误报为“已停止”。

另一条线是会话广播层反复出现的序列化开销被改为在已授权受众内复用编码;控制台则集中做减法,Usage 的内嵌会话阅读器、Activity 的图片画廊与浏览器本地工具流被整体移除。

Agent 后台命令:静默退出也能唤醒会话

这一组改动动的是 OpenClaw 的执行唤醒语义。过去 notifyOnExitEmptySuccess 只对聊天渠道默认为真,因此在控制台、仪表盘或 API 这类会话里,后台命令静默成功退出(CI 变绿、sleep 600 结束、gh run watch --exit-status 返回 0 且无输出)不会唤醒任何对话。Agent 拿到的提示里明说“如果可能静默成功,请用 poll 收集”,于是它每 30 秒轮询一次;能调用 automations 工具时更夸张,会排一个每分钟复检的一次性任务,每次复检都是一个模型轮次,多数回复只有 NO_REPLY。

PR #199122 把这条链路改成:后台命令退出即唤醒会话,唤醒文本已经带上进程 ID、退出码、耗时和输出尾部,静默成功同样生效。一个等待 CI 的 Agent 只需要起一个后台命令然后结束这一轮,命令退出时对话被唤醒、结果已在眼前,等待过程中的模型往返和 token 消耗随之下降;定时、跨会话的后续跟进仍然走 automations。

唤醒太频繁是副作用。PR #199113 之前每次退出都会各自排一个会话事件、各占一个模型轮次,三个命令同时结束就是三轮模型、三次回复。改动新增了 src/auto-reply/reply/session-event-batch.ts,让每个会话只保留一个在途的完成轮次:新的完成项在轮次排队或运行时认领自己的 occurrence 并等待,轮次落定一秒后,所有共享同一 exec 请求属主、启动 run、route 且目标可合并的完成项合并成一个轮次一起送达,每条结果仍带自己的进程 ID、状态、退出码和输出尾部。

Gateway 重启:durable 命令不再被误判为已停止

同一时段还有三个 PR 专门修重启路径上的失真。PR #199085 指出优雅重启时所有会话都会收到一句“Background exec processes were stopped; rerun them if still needed”,但 durable 后台命令其实已经被接管、退出时仍会唤醒会话。现在优雅停机标记跳过 durable 进程,普通命令的重启提示保持不变,Agent 不会再因为这句假消息去轮询或重跑仍然活着的命令。

PR #199222 补的是另一半:重启后被接管的 durable 命令曾自称“不会唤醒会话”,process poll 直接显示 “Automatic completion wake is unavailable”,Agent 因此持续轮询,控制台也把 Waiting on … 卡片藏起来。现在接管阶段就在会话当前权限下准备唤醒目标,退出路径再准备一次,因此会话 reset 或配置变更依然生效;已归档、incognito、子代理和 cron 会话以及关闭了通知的场景仍然不唤醒。

PR #199148(P1)修的是另一个方向:SIGKILL 重启后被中断的会话偶尔恢复失败。原因是发布监听器在还不知道物理属主是谁的时候就把拓扑事件当作相关,一个无关 Agent 的就绪状态会作废本来有效的恢复读取。现在采集期事件被保留到属主绑定之后再做相关性判断,改动只有八行生产代码。对照基线是:主干上 30 次真实 SIGKILL 重启,Bun 27 通过 / 3 失败,Node 24 29 通过 / 1 失败,四次失败都是 SessionMutationFactsUnavailableError。

子代理侧也有一处响应性修补。PR #199228 指出大量待清理的 subagent 积压会把每轮的 promise 全部抽干,让事件循环长时间没有机会推进无关的 Gateway 工作。现在每处理 128 个合格运行就检查一次 4 毫秒的处理预算,超时即让出,完成、取消、归档和清理的判定与顺序保持不变。作者同时记录了观测器自身的代价:20,000 次运行的扫描增加 5.43 毫秒 CPU(19.53 → 24.96 毫秒),因此观测被推迟而没有并入本次改动。

会话存储与广播:复用编码,而不是重复序列化

这一组是纯性能工程,改动小、收益集中在同步路径上。PR #199099 处理的是会话广播:不同连接有各自的投递历史,但面向受众的会话字节可能完全相同,此前每份历史各自编码一份 UTF-8 缓冲区,使得已有的不可变分段压缩缓存无法共享;同时侧边栏的 owner 计数查询在静态排除之前就跑披露谓词,对子代理等根本不会出现在结果里的行也做了共享与 incognito 判断。现在编码在已授权受众和当前同步发布范围内复用,可见性、delta 版本、确认、顺序、体积统计、分段边界和压缩后的 WebSocket 字节都保持不变。

PR #199191 处理的是同一类重复:行比较已经按 baseline 共享了工作,但不同的连接历史仍反复序列化和测量同一份大 JSON patch——在 16/32 个订阅者时,压缩重放每次发布要为两个不同的行 delta 编码约 15/29 个 patch。现在发布侧持有的 delta 会携带首个完整 patch 编码、它的后缀与字节数,以及按精确序列化 header 索引的编码表;header 相同的订阅者共享首个字符串,版本不同则从其后缀派生字符串,即便只有一个订阅者也不会再多构造一份大 body。

PR #199212 处理侧边栏计数:owner 计数请求绕过了已有的保留选择分区,在任何行修订之后都会重新过滤整个可见 roster。在合成的 15k/60k 规模下(父会话占五分之一),每次更新要重复 2,571/10,285 次披露检查。现在计数事实从已有的查询与受众属主分区聚合而来,未变化的分区不必重复过滤,同时沿用既有的 32 MiB / 512 视图预算,并保证在字节压力下先淘汰计数分区再动侧边栏比较基线。

另外两笔是更细的分配优化。PR #199233 修掉了会话存储查找在判断 watcher 与 turn 状态归属时反复归一化已解析目录的问题,改由 transcript 目录属主只归一化一次 agent,生产代码净减一行,没有引入缓存或第二条解析路径。PR #199244 针对轨迹捕获在削减超大会话事件时反复构造随后被丢弃的大 JSON 字符串,现在有界裁剪同时携带字符计数,超大普通事件只序列化一次数据字段并在多次削减尝试间复用编码,最终只组装一个有界事件;256 KiB 的事件上限与 10 MiB 的滚动捕获上限都没有变化。

模型与 AI 能力:Anthropic 请求少走一遍

PR #199204 针对 Anthropic 请求构造:当 payload hook 只改了一个信封字段(比如内置 service-tier 包装器改 service_tier),整段会话仍会被重新序列化。现在转换器保留既有的“载荷未变”检查,并在编辑后的载荷仍是纯数据、消息仍相等时复用已有片段;替换 body、不透明 JSON 和消息变更仍走完整序列化。片段缓存改为持有私有 UTF-8 字节,每个请求再组装成新的连续字节数组。

PR #199252 收掉的是前一笔留下的重复劳动:纯信封 hook 会先校验整段可编辑历史是否为纯数据,然后为了相等比较再走一遍,而相等比较本身已经检查了消息描述符。现在消息只比较一次,然后只接纳信封;采用保留描述符的信封视图,避免触发 hook 自己创建的 getter,原型与访问器拒绝仍留在既有的不可变数据属主处处理。

PR #199234 处理诊断投影:它递归创建捕获的字段读取函数,V8 即使在标量叶子提前返回时也会分配捕获上下文,而媒体专用捕获策略还会读取自己随即丢弃的凭证判别符。现在把值和描述符快照显式传给一个共享的字段读取器,去掉递归闭包,凭证判别符只在脱敏策略启用时才读取。

同期还有两个不经过 PR 直接落到主干的提交值得留意:dd6df99(fix(models): avoid slow reads with many configured models)改的是模型授权可用性判定与 OpenAI 路由、插件 provider 路由的读取路径,避免配置模型较多时的慢读;20992c9(fix(agents): retry recovery compaction through provider outages)新增了压缩恢复的生命周期错误类型与溢出上下文恢复路径,让恢复性压缩在 provider 故障期间可以重试。

控制台:Usage 与 Activity 的功能瘦身

这一轮控制台侧是成片的减法,五个 PR 指向同一个方向:去掉和别处重复的副本。PR #199170 移除 Usage 里内嵌的第二套会话阅读器——它有自己的角色、工具、搜索过滤和展开控件,而 Chat 里已经用真实消息与工具渲染展示同一段对话。移除后使用会话头部的 Open conversation 跳回原始 Chat,Usage 保留用量汇总、时间线选择、区间消息与工具计数、上下文与系统提示检查以及导出;Gateway 的 logs API 不受影响。

PR #199161 移除 Usage 的小时活动图与小时筛选 chips,保留日图表、长周期日历、峰值错误小时、吞吐、会话详情和导出。给出的理由值得留意:当缺少精确 token 样本时,小时位置是从会话跨度估算出来的,这张图看起来比它的数据更精确。PR #199160 则移除了浏览器本地的 Recently viewed 历史与对应标签页——它只存在于本地浏览器、不同步、不反映其他设备上的工作,而既有的 Recent 排序本来就按 Gateway 的真实活动排序;Gateway 仍接受 recentKeys,只是 Control UI 不再发送。

Activity 侧的两笔更彻底。PR #199157 移除了与 Chat 并存的第二套图片画廊,连同它的发现队列、连接缓存、图片归属、查看器、样式和过时测试一并删掉,净减约 1100 行;artifacts.list 与 artifact API 保持不变,插件仍能发现会话图片。PR #199168 移除的是浏览器本地的 Activity 工具流,净减近 3000 行——它只在 Activity 页打开且标签页可见时记录,刷新即重置,最多 100 条,隐藏工具参数、输出预览也未做密钥掩码,而且为了填满它需要订阅最多 100 个会话的完整消息流。移除后 Activity 不再请求完整的工具消息流,运行中与排队中的会话仍以 Current work 呈现,会话历史和持久 Run 检查器都保留。

另外两笔偏向体验与体积。PR #199196 处理启动体积:Chat 与 New Session 因为 slash 命令发现导入了三个标签名而拉取完整的会话管理英文目录,现在把 Rename session、Verbose、Reasoning 放进既有共享目录,启动时少下载约 4 KB 压缩 JavaScript。PR #199173 修的是命令面板:Cmd+K 在页面刷新后忘记上次选择的 Search 或 Compose 模式,Cmd/Ctrl+Enter 在 Search 里毫无反应;现在显式选择会被记住(含加载态到就绪态的交接),由长提示或附件触发的自动切换不会覆盖它,两种模式都能启动后台会话而不替换当前对话或草稿,模式只记在本浏览器、不做账号同步。同期还有一个直接提交 3bd612c(fix(ui): keep model picker interactions stable)集中调整了 Chat 模型选择器的交互与样式,并补上 350 行端到端覆盖。

渠道、插件与发布链路

IRC 通道修了一个很具体的字符问题。PR #199108 记录了真实 CLI 的实际行为:Name<TAB>State<CR>Done 会被发成 NameState Done——Markdown 渲染会把单独的换行符变成空格,但制表符仍会把两个词粘在一起。现在只在 sendPrivmsg 内部、在清洗与分块之前规范化这些分隔符,换行转空格、IRC 格式码剥离保持不变,NickServ 密码、注册邮箱、realname 和 QUIT 原因的字节行为也不受影响。

macOS 客户端补上了丢失的诊断。PR #199126 指出有界的原生 Gateway 订阅会丢弃缓冲事件却不记录溢出;现在首次溢出会产生一条无内容的警告,订阅结束时再记录它累计丢弃的投递量,计数器按订阅者计数、在 Int.max 处饱和、终止时丢弃,且不记录消息、会话键和订阅 ID。

模型认证侧有一处直接导致失败的修复。PR #199137 指出,当某个 Agent 的遗留 Codex auth.json 只含空对象时,模型刷新会因为“凭证尚未导入”而失败;前置检查现在只豁免成功读取并解析出的空对象,非空、未知、格式错误和不可读的内容仍然给出原有诊断。

发布链路也有进展。PR #199141 修的是 beta.3 发布在核心 npm 分发之前停住的问题——完整的插件扇出会超出 GitHub 请求配额。现在 carrier-backed 的 consume/authorize 命令强制 128 次请求上限,预览也预留同一上限,101 个包的扇出所需请求从 52,736 降到含余量 26,880,配额不足时仍然 fail closed。

工作树管理有一笔带 security-sensitive-changed 标签的改动。PR #199098 指出受管工作树仍存在待完成的工作区集成时,空闲清理会反复执行恢复捕获。现在投影属主先接纳归档,再在既有 custody 操作下用该快照完成归档,成功归档移除仍然要求逐工作树的恢复提交;慢速移除失败会报告有界的错误类别与消息且不包含 checkout 路径,Linux 清理在慢速文件系统提交时也会主动让出。

插件侧还有一个直接提交 896cc0c(fix(plugins): allow more than 64 declared feature event types),它提高了插件 feature 契约里可声明的事件类型数量上限,并同步了文档与契约测试。

这一天的改动集中在两条主线:把 Agent 后台任务的退出变成可靠且廉价的唤醒信号,并修正重启路径上的误报;同时把重复的序列化与控制台里的重复副本逐个清掉。

常用链接

 
内容管家

发表评论