
OpenClaw 24h 更新快报(2026-06-30):上下文溢出预检、插件漂移可视化、Memory 权限加固
过去24小时,OpenClaw 合并了16个 PR,涵盖多个重要 bug 修复与基础设施改进。其中最值得关注的是 Agent 运行时一处长达数月的上下文大小估算缺陷终于被修复——包含大量 bash 输出的会话之前会被预检 gate 误判为"容量正常",直接导致 context overflow;另外 Gateway 的 /status plugins 详细视图现在能直接显示"计划运行但未加载"的插件漂移,Memory Core 的 /dreaming 配置操作也加上了权限守卫。
Agent 运行时:上下文预检严重缺陷修复
PR #97861 修复了 shouldPreemptivelyCompactBeforePrompt 中一处长期存在的 token 计数错误。受影响的是 bashExecution、branchSummary 和 compactionSummary 三类消息角色:它们的实际 payload 存储在 command / output 或 summary 字段,而非 content 字段,因此原有的 estimateContentTokenPressure(record.content) 对这几类消息始终返回 0,整个 turn 只被计为约 29 字节的边界开销。
后果是:包含大文件 !cat 输出、构建日志或测试结果的 bash 重会话,在预检阶段被判定为"容量正常,直接提交",但实际送到 provider 时因 context overflow 被拒绝。同一估算错误还污染了 SessionContextBudgetStatus.remainingPromptBudgetTokens,导致用户看到的预算数字完全失真。
修复方案是让估算器直接调用与 provider 渲染器相同的转换函数(bashExecutionToText、summary 的前缀后缀常量),确保估算值与实际发往 provider 的 token 数量一致。修复后的实测数据:同一个 render 337,507 tokens 的 bash turn,修复前估算为 59,路由为"fits";修复后估算为 405,068,路由为 compact_only,溢出 293,452 tokens,正确触发压缩。
所有受影响角色均已补充单元测试(4个新 case 全部通过),原有16个相邻测试无回归。
Gateway:插件状态漂移可视化
PR #97878 为 /status plugins 详细视图新增了"计划运行但未加载"漂移检测行。在此之前,Gateway 启动时计划加载但实际未成功加载的插件,会被错误地归入"Installed (not active)"的中性列表中,完全不可见。
新版本将启动配置解析(resolveGatewayStartupPluginActivationConfig)提取为 Gateway 和 status 路径共用的纯函数,两者使用同一份代码计算"计划加载的插件集",不再存在 drifts。该函数包装在 try/catch 中,解析失败时回退到修复前的行为,完全向后兼容。
对运营商的实际影响:运行 /status plugins(详细模式)时,若存在计划但未加载的插件,会看到一行 Configured to run but not loaded: N (id, ...);已计划但因 error / disabled 记录而未加载的插件不会被双重列出;延迟加载插件(configuredDeferredChannelPluginIds)不参与漂移比较,因为它们本就在 Gateway 开始监听后才加载,不算启动失败。
Memory Core:Dreaming 配置权限加固
PR #97869 对 Memory Core 的 /dreaming on|off 命令加上了权限守卫:变更 dreaming 配置(而非只读查询 status)现在要求调用者拥有 channel owner 身份,或来自 Gateway 客户端且具备 operator.admin 权限。/dreaming status 和帮助/阶段输出保持可读,不触发权限检查。
这一改动解决了多用户共享 channel 时普通成员可能意外或恶意修改全局 dreaming 策略的问题。测试覆盖了非 owner 拒绝、owner 成功、Gateway 写作用域拒绝、Gateway admin 成功以及命令注册的 owner 暴露等多个场景。
安全:三个扩展的统一 bounded-read 修复
过去24小时合并的三个 PR 修复了同一类问题——扩展在处理 HTTP 错误响应时使用无限制的 await res.text(),可能被恶意或配置错误的端点驱动到 OOM:
- PR #97812:Microsoft Foundry 扩展的
testFoundryConnection在400和非 OK 状态分支均已修复为调用readResponseTextLimited(res, 8 KiB)。 - PR #97811:Nextcloud Talk 扩展的
probeNextcloudTalkBotResponseFeature错误分支同样改为 8 KiB 上限读取。 - PR #97808:Chutes OAuth 的
exchangeChutesCodeForTokens和refreshChutesTokens错误分支统一改为 8 KiB 上限读取,防止 token 端点返回大 body 时引发内存压力。
三个修复均通过了真实 HTTP 服务器(25 MiB 错误 body,无 Content-Length)的负向对照验证:无修复时读取全量 25 MiB,有修复时截断在 8 KiB,TCP 层在 0.22 MiB 处提前关闭连接。
CLI:根路径错误处理终于正确退出
PR #97807 修复了 openclaw --help 和 openclaw --version 快速路径的错误处理不调用 process.exit(1) 的问题。原有代码只设置了 exitCode,但快速路径跳过了主运行时清理,任何悬挂的异步句柄(打开的连接、timer、未 settled 的 Promise)都会保持 Node 事件循环,导致 CLI 挂起不返回终端。修复后直接调用 process.exit(1),即使存在悬挂句柄也能立即终止;同时 tryHandleRootVersionFastPath 的错误路径改为使用注入的 exit 钩子而非直接调用 process.exit,保持了测试和嵌入调用的可控性。
CI:平台 checkout 超时重试机制
PR #97912 为 Git 平台 checkout 的 fetch 超时添加了三段式重试机制,解决 Windows / macOS / iOS 平台 CI 因偶发 Git transport 超时(fatal: fetch-pack: invalid index-pack output,exit code 124)导致的虚假失败。修复保持了原有的 bounded kill 行为,只是在超时场景下触发重试。
QA Lab:传输场景基础设施与 Crabline Slack 集成
PR #97915 在 QA Lab 中引入了传输场景需求声明层(QaTransportCapabilities),使 channel 场景可以在不引入并行驱动抽象的前提下声明所需的传输能力或通用 channel 操作。现有的 QaTransportAdapter 架构保持不变,这是后续堆叠 PR 将 Slack、Telegram、WhatsApp 场景移植到该路径的基础设施铺垫。
基于同一架构,PR #97891 正式将 Crabline fake provider 接入 Slack 通道:QA Lab 现在可以在不需要真实 Slack 凭证的情况下运行 Crabline 支持的 Slack QA。
本次更新整体基调偏工程稳健性:多个存在内存压力风险的安全类修复、一个影响 Agent 会话正确性的严重 bug、一个提升可观测性的诊断增强,以及为下一阶段 QA 覆盖铺路的基础设施。


评论