
OpenClaw 24h 更新快报(2026-10-25):插件运行时兼容检查、会话状态恢复、控制台首屏渲染
过去24小时,openclaw/openclaw 合并了数百个 PR。这一天的主线集中在三处:插件体系有了正式的兼容性体检入口,Doctor 与备份等独立工作进程补齐了可打包入口;会话与子 Agent 的恢复链路修掉了几处会让 Gateway 长时间不可用的状态缺陷;控制台首屏改为先画框架再加载应用资源,冷启动 FCP 从约 226 毫秒降到 36 毫秒。安全侧还补上了搜索工具报错路径中的凭据泄露。
插件:可安装前先做兼容性体检
过去插件作者只能等插件装上去、跑起来之后才发现冲突:插件替换了宿主的内置模块、装了 loader hook,或者在运行时生成代码,都会和宿主打架。现在这条链路被前移了。
- PR #182419 新增
openclaw plugins lint --root <package>,在不 import 插件代码的前提下报告包、版本、文件与行号级别的兼容性诊断;安装时也会在依赖落盘后给出同样的告警。分析器解析的是词法接收者和别名,而不是粗暴禁用prototype这类关键词,并且明确区分“没有发现问题”和“检查不完整”。 - PR #182405 修掉独立打包下 Doctor 与备份工作进程起不来的问题。此前 worker 目标分散在运行时清单、自宿主模块、插件描述和被序列化的函数字符串里,靠文件名猜测和源码字符串抽取去拼装,编译产物里往往缺程序入口。现在改由运行时清单统一拥有入口身份,Doctor、目录监听、哈希、证书预热、工作区租约都有显式入口,Node、Bun 与 AOT 三种运行时使用同一份声明。
- PR #182826 阻止插件 import 替换宿主进程的内置函数,这是过去一连串插件崩溃的共同根因。
- PR #182818 让 AOT 构建也能正常加载外部拉取的插件和 Code Mode;PR #182856 则让动态 schema 在 AOT 构建下无需运行时代码生成即可校验。
打包侧还有一个容易被忽略的坑,368b5ec 记录了修复方式:npm 与 pnpm 的硬链接依赖资产在重新打包时必须先在私有暂存树里实体化复制,否则 tar 包里会出现 link 条目,Docker 与发版预检直接失败。
会话与 Agent 运行时:三处会让 Gateway 卡死的状态缺陷
这一组修复最值得关注,因为它们的共同特征是平时不出现,一旦出现就需要重启 Gateway。
- PR #182444(P0)解决了相对路径
session.store的解析基准问题。此前按进程工作目录解析,systemd 服务没有设置WorkingDirectory时,同一份会话数据会被注册进两个不同的数据库,后续对话读不到历史。现在相对路径统一按状态目录解析,绝对路径与家目录路径语义不变;openclaw doctor --fix可以迁移旧库,并且会拒绝在历史冲突、投递未结、Goal 回执未过期等情况下强行迁移。 - PR #182615(P0)修掉了认证触发的模型发布任务排在临时 SQLite 只读作用域内的问题:启动恢复流程关闭临时 reader 之后,排队中的刷新任务会因为作用域已关闭而失败,模型列表、会话列表和后续派发全部不可用,而日志里只会看到一句
SQLite read-only worker scope closed。修复后发布任务在 reader 释放后正常执行。 - PR #182453 处理了子 Agent 独立轮次在重启后无法恢复的场景。原任务已经结束、子 Agent 又收到一轮后续对话时,重启会打断这一轮:注册表不再持有它,普通恢复流程又因为它是子会话而跳过它,结果
sessions.recover直接拒绝。新的恢复归属按被打断的那一轮来判定,并且保留了请求方私有输入的原处理回执,避免恢复之后又被重放一遍。 - PR #182587 修正了父 Agent 等待 Resume 期间子结果被丢弃的问题;PR #182930 则消除了通过
message工具带附件回复时的重复消息与重复文件卡片。
Cron 侧也有一处行为修正,d90406a 让审批在重新规划流创建任务时保持有效:此前审批匹配归一化了创建时间,却同时沿用了由该时间推导出的操作来源修订号,导致同一个未改动的提案反复要求重新批准。现在创建来源被单独绑定,一次审批即可提交。
稳定性:限流退避、失败卡片与多副本模型发现
- PR #182954 修了限流重试的节奏问题。此前重试严格照搬提供方的建议间隔,OpenAI 每分钟 token 配额触发 429 时提示约 1 秒后重试,在持续饱和的情况下九次重试几乎在一秒内全部打完,预算瞬间耗尽。现在提供方建议值被视为退避下限,配以带抖动的指数退避,限流上限放宽到 60 秒、单次故障预算从 10 次提到 16 次;控制台还会把连续相同的失败提示折叠成一张卡片并标注重复次数,只有真实用户输入才会打断折叠。
- PR #182952 保留了隔离补全中已发现的模型,避免一次独立调用就把模型目录清空。
- PR #182963 跳过了模型流字节统计中未被消费的部分,PR #182902 让远端目录修订在多个工作进程上下文间共享,PR #182844 则只在真正需要时才构建会话分叉。
安全:报错信息里的凭据与审计盲区
- PR #182534 修掉一处凭据泄露:Exa 与 Parallel 的
web_search工具在配置的端点被拒绝时,会把原始 URL 直接写进面向 Agent 的工具结果,而 URL 的 userinfo 或查询参数里可能带着密钥。现在错误只指出是哪个配置项有问题,不再回显其值。 - PR #182384 修复了安全审计对符号链接工作区技能目录的漏检:根目录预检使用不跟随链接的判断,看到
workspace/skills是软链就直接返回,嵌套的SKILL.md越界从未被扫描。现在预检跟随链接,与既有的有界符号链接遍历器保持一致。 - PR #182407 让审计识别通过
${VAR}环境变量替换注入的密钥,不再把hooks.token和gateway.auth.password误报为明文存储。 - PR #182381 把容器默认 PID 上限收紧到 1024;沙箱侧的 PR #182974 让工具链的临时目录不再阻塞工作区恢复。
渠道:控制指令不再被普通消息堵住
- PR #182423(P1)解决了飞书控制命令的排队问题。
/stop、/status、/new这些指令在有回复正在进行、或身后压着一批普通消息时会被一直拖住。现在控制指令可以绕过防抖串行化单独生效,普通消息仍保持原有顺序,慢命令(例如/compact)期间/stop依然可用。 - PR #182619 修复了 Zalo Personal 插件重载后会话被串号的问题:模块级 session map 的生命周期可能长于它的持有者,导致新的注册实例拿到上一个实例的账号身份与群组信息。会话状态改由实例级运行时存储持有,并在正常生命周期钩子里清理,退役后到达的 SDK 事件会被丢弃。
- PR #182608 修复 Nextcloud Talk 与 Zalo 默认账号密钥丢失;PR #182517 让 WhatsApp 以 LID 形式发出的媒体被正确识别为源回复。
模型与记忆
- PR #182390 修复了 Gemini 拒绝 Agent 工具 schema 的问题:
message工具的表格单元格允许字符串或数字两种类型,转换后的 schematype被输出为数组,而 Google GenAI 要求标量。现在清洗器取第一个非空类型,与已有的代表性联合类型行为一致。 - bff1d86 为 Baseten 增加了 elephant-1 与 mammoth-1 两个决策模型的支持。
- PR #182530 补上了 LanceDB 记忆的运维缺口。此前反复的小写入会不断累积 fragment,运维却没有受支持的压缩命令。现在停掉 Gateway 后可以执行
openclaw ltm optimize,命令会打印整张共享表优化前后的 fragment 与行数,所有 Agent 的行与版本历史都保留;它不会自动维护,也不承诺回收磁盘空间,遇到活跃的状态持有者或未关闭的插件句柄会直接拒绝执行。 - PR #182821 让 PostgreSQL 嵌入缓存的淘汰走
updated_at索引,避免每次写入都全表扫描缓存;PR #182460 让本地嵌入别名支持查询指令。
控制台与开发者体验
这一块是当天性能改进最集中的地方。控制台首屏此前在入口样式表和应用代码图下载、执行期间是一片空白,PR #182825 把主题相关的侧栏、转录区与输入框框架搬进 index.html,在应用资源就绪前先绘制出来,实测冷启动 FCP 从 226 毫秒降到 36 毫秒,模拟 100 毫秒 RTT / 10 Mbps 的弱网冷启动从 1194 毫秒降到 140 毫秒,静态到实时的交接阶段累计布局偏移为零。配套的 PR #182814 只渲染聊天启动阶段可见的内容,PR #182945 移除了首屏的冗余启动工作。
工具链侧,PR #182575 把固定 schema 的校验从运行时编译函数改为构建期生成谓词,Gateway 消息、Codex app-server 回复、模型注册表、主题、TypeSafe 载荷等都改用生成式守卫。代价是 Gateway 校验探针包从 1.77 MB 增至 2.70 MB,Node 上首次校验的总 CPU 上升 8.1%,换来的是 AOT 下预热后 6.9 到 8.1 倍的改进。另一件值得注意的事是 PR #182399 修复了跨协议版本升级时的假失败:升级校验器跑在旧包里,它用自己钉住的协议版本去连新 Gateway,握手一律被拒,30 分钟就绪等待加 30 分钟恢复等待后以 state-migrated-no-rollback 收场。现在遇到协议不匹配会退回本地 HTTP 的 /startupz 与 /readyz 做身份校验。
这24小时的基调很清楚:把长期潜伏、需要重启才能脱身的状态缺陷一次性挖出来,同时把插件与升级这两条最容易翻车的路径加上前置检查。


评论