OpenClaw 24h 更新快报(2026-10-23):Cron 调度边界、插件子代理、Gateway 加固

内容管家 其他评论0字数 3919阅读13分3秒阅读模式
OpenClaw 24h 更新快报(2026-10-23):Cron 调度边界、插件子代理、Gateway 加固

OpenClaw 24h 更新快报(2026-10-23):Cron 调度边界、插件子代理、Gateway 加固

过去 24 小时,openclaw/openclaw 有超过 700 个 PR 被合并,绝大多数是 UI 层的 Solid 重构与测试清理,但真正影响使用方式的变化集中在三处:Cron/Automations 开始引入统一的"调度执行上下文",自动化与其创建会话之间的绑定被明确写进运行时;插件侧补齐了原生子代理的发起、恢复与跨重启续跑能力,Slack、Discord 等渠道里的插件命令第一次能拿到和 Gateway 聊天客户端同等的权限;Gateway 侧则连续收紧了本地终端、宿主执行、LSP 环境变量和 Node/pnpm 运行时底线。

对普通用户来说,最直接的感知是"自动化不会在会话消失后还偷偷跑"以及"插件命令在渠道里终于能派子任务";对自建部署者来说,本轮改动更像一次安全基线抬升,涉及运行时版本要求、会话托管边界和密钥继承范围,需要在升级前重新核对配置。

安全与运行时基线

  • PR #177855(feat: restrict Gateway-local terminals and automation host execution)给 Gateway 本地终端和宿主执行的自动化加了开关:OPENCLAW_DISABLE_GATEWAY_LOCAL_TERMINALS=1 阻断本地终端准备与 PTY 创建,OPENCLAW_DISABLE_CRON_HOST_EXECUTION=1 阻断宿主侧执行的自动化负载、脚本触发器和 Gateway 托管的自动化运行。动机是直接改写可写配置文件就能绕过 OPENCLAW_CONFIG_READONLY 这类 API 级写入控制,并顺带暴露可访问凭据。两个开关默认关闭,已被拦截的持久化任务仍然可见、可禁用、可删除,已授权的节点终端与沙箱流源不受影响。升级前应确认自己依赖的是节点终端还是 Gateway 本地终端。
  • PR #179415(fix(lsp): bundle LSP servers inherit Gateway secrets)收紧了插件内置语言服务器的环境继承。此前通过 .lsp.json 或 manifest lspServers 声明的语言服务器会以 Gateway 的完整环境启动,供应商 API Key、Gateway 与 hook token、密钥管理器凭据乃至 .env 里的内容全部可见。现在改为与 bundle MCP stdio 服务器一致的短白名单基底,仅额外放行语言服务器确实会读取的语言区域、临时目录、XDG 与工具链路径;服务器自身声明的 env 依然生效。考虑到部分语言服务器此前依赖继承的代理、CA bundle 或 virtualenv 变量,Gateway 会在启动时逐个点名提示需要显式传入哪些变量,openclaw doctor 也会为已配置的 bundle LSP 服务器给出同样的指引。
  • PR #179992(fix(security): require patched Node and native pnpm runtimes)抬高了启动底线:Node 24 线要求 24.22.1+、26 线要求 26.12.1+,pnpm 工具链固定到 12.15.0。此前 OpenClaw 可以在受影响的 Node 24+ 构建上启动,源码工具链还会选中带有独立受影响的原生 TLS 运行时的 pnpm 12.12.1。诊断与更新恢复路径保留,固定工具链的基准环境改用 pnpm 12 支持的 pmOnFail=ignore,避免检出旧源码树时静默选中存在漏洞的可执行文件。
  • PR #180280(fix(auth): rate-limited profiles stay locked out for hours after repeated 429s)修正了限流退避:旧的本地失败计数器在持续 TPM 压力下会把退避一路翻倍到 24 小时上限,即使供应商只说了"6 秒后重试"。现在冷却时间严格跟随供应商给出的 Retry-After 头、"try again in 6s" 文本或 Google RetryInfo;供应商不给等待时间时,本轮仍会切到下一个 profile 或模型,但该 profile 对下一轮保持可用。计费类、永久鉴权失败和 30s/1m/5m 的过载/瞬时退避不变,被旧逻辑锁住的 profile 在升级后自动释放。

Cron 与 Automations:从散落判断到统一执行上下文

本轮 Cron 方向的改动有一条清晰主线:过去一次调度"能做什么"分散在几十个各自为政的判断里,彼此并不一致;现在被收敛成一个可推导的执行上下文。

  • PR #178933(feat(cron): add the scheduled-run execution context)新增 src/cron/execution-context.ts 这一个纯构造器:它以存储的 job 加上准入时刻读取的事实(父会话行、一次全新的请求者校验)为输入,推导出该次执行的主体、放置位置、权限、工具策略、资源范围和推理账号。该 PR 本身不改变行为,只是为后续每个消费方切换到统一上下文铺路——与创建它的会话精确关联的 job 会成为该会话的子级。
  • PR #178965(feat(cron): pause automations whose creating conversation is gone)把上面那条绑定变成了可执行规则:当自动化所关联的会话被删除、归档或其绑定的 worktree 不复存在时,该次调度不再执行任何触发脚本、负载或会话轮次;job 被禁用,并给拥有它的 agent 发一条点名会话与 openclaw automations enable <id> 命令的通知——注意通知发给 agent,而不是发给已经消失的会话。恢复会话不会自动恢复 job,需要显式重新启用;下一次执行会重新检查该条件。
  • PR #180492(fix(cron): bind forwarded CLI accounts for scheduled runs)修掉了"能创建却永远跑不起来"的自动化:模型跑在 Claude CLI runtime、而主机上唯一的 Anthropic 登录是存储 token profile 时,每次执行都停在"Automation has no recorded inference account",建议的 model@profile 更新也没用——因为交互式聊天走 CLI 后端会转发存储 profile,自动化路径不会。现在创建时会用与交互式 CLI 轮次相同的 selector 记录该存储账号,运行后转发同一个账号。
  • PR #180619(fix(cron): owners cannot change their automation's tools from chat)放宽了所有权编辑限制:此前 cron.update 的守卫会直接拒绝任何来自管理型 turn 的 toolsAllow 修改,owner 只能重建任务或改去 Control UI。现在拥有该自动化的 owner 可以从对话中修复或调整自己的工具列表;仍然持有 app 运行时权威的 job(例如 Codex apps)在会丢掉该权威时依旧拒绝修改。
  • PR #180879(fix(cron): cron.list shows scheduled plugin commands as ordinary agent turns)补上了可观测性缺口:请求方调度的插件命令(S6)此前在 cron.list 里被投影成普通 agentTurn,消息体是保留占位符 [plugin-command-scheduled-turn:v1],而私有信封又被剥离,响应里无从判断这是什么 job。现在 cron.list、cron.get 与 cron 事件都会带上只读的 payloadSource: { kind: "pluginCommand", pluginId, command },Control UI 的会话悬浮卡与 agent cron 面板也能区分这类任务。

插件能力:原生子代理的发起、恢复与跨重启续跑

  • PR #180173(feat(plugins): let authenticated commands launch native subagents)允许插件斜杠命令在当前请求者权限下委派有界的辅助工作。插件需显式声明 runtimeCapabilities: ["subagents"] 才会获得该能力,未声明或旧命令保持不可用;命令文本按用户输入提交,/stop 可中断收集过程,辅助会话仍受请求者的工具上限约束。这不是 owner 专属能力——在渠道策略允许时,被授权的非 owner 也能消耗辅助模型预算。
  • PR #180282(feat(plugins): let requester commands schedule bounded follow-up turns)补上了"无人值守继续"的缺口:插件命令发起原生子代理后,需要宿主提供的方式在稍后继续(例如盯 PR 的后续检查、交接后恢复的长审阅),否则只能退化到以系统或 operator 身份运行的普通 cron 任务(还要额外提示模型),或者干脆丢掉延续。现在可以从合格的请求者命令调用 ctx.runtimeContext.scheduledTurns.schedule(...) 安排有界的后续轮次,每次发生都以原请求者身份按当前策略运行,且模型工作必须走已准入的原生子代理。该版本的范围限制是:调度在 Gateway 重启后即终止。
  • PR #180844(feat(plugins): keep requester command schedules across Gateway restarts)兑现了上一条留下的后续项:被接受的调度现在可以跨 Gateway 重启存活,仍在原有边界内、并接受同样的逐次权限校验。实现上,插件来源会记录一个私有的重启绑定(pluginCommandBinding),保存提供服务的 Gateway 进程与插件实例,以及插件代次的 sourceDigest;存储的调度仍沿用 pluginCommand 信封与 pluginCommand payload 类型,不新增表、列或 schema 版本。
  • PR #180968(fix(plugins): channel plugin commands never receive native subagents or scheduled turns)修掉了一个文档与实现不一致的缺口:在 Slack、Discord 等渠道里输入插件命令时,ctx.runtimeContext.subagents 与 scheduledTurns 永远是 undefined,即便发送者已通过授权且具备 operator 权限——而文档明确说明渠道发送者是合格主体。现在这类发送者可以使用插件命令声明的原生辅助与调度延续,前提是身份已验证并关联到当前拥有 operator.admin 角色的人,且渠道为其授权该命令;未关联、未验证、被降权或未获授权的发送者仍然拿到 undefined,无需任何配置改动。
  • PR #180274(feat(plugins): let plugins recover native subagents they launched)解决了子代理 ID 丢失问题:插件若在宿主接受 spawn 之后、保存返回 ID 之前崩溃或被打断,仅靠 spawn/collect 无法找回那个子会话。新增可选的 ctx.runtimeContext.subagents.list({ status? }),可枚举当前请求者下由本插件发起的原生子会话,再照常收集;宿主通过 native-subagent-list-v1 能力声明支持,旧宿主不提供 list。插件只能看到同一请求者、同一父会话下属于自己的子会话。
  • PR #180283(feat(plugins): expose requester-scoped model catalogs)让外部插件可以只读地查看"当前请求者与已保存会话被准入了哪些模型",不必依赖 Gateway 内部实现或借用更宽的目录。它通过特性探测 api.runtime.capabilities?.includes("requester-model-catalog-v1") 启用整个 runtimeCapabilities: ["models"] 声明,以兼容旧宿主;暴露的是只读目录,不含推理、凭据、账号选择或跨会话权限。

模型与渠道体验

  • PR #180025(fix(clawrouter): give routed OpenAI and Claude models their native model facts)修复了"同一个模型走不同入口行为不同"的问题:直接调用 openai/gpt-6.1-sol 或 anthropic/claude-opus-5-5 会默认启用 Code Mode、丢弃模型不接受的 temperature、并按真实图像上限裁剪截图;经 ClawRouter 路由时这些都不生效,因为路由目录行只带推理档位。现在 OpenAI Responses 与 Anthropic Messages 的路由行会在上游模型 ID 与 API 完全匹配时,从内置目录复制三项事实:Code Mode 档位、是否接受 temperature、图像上限。
  • PR #178920(feat(clawrouter): support batch audio transcription)让 ClawRouter 能转写上传的音频文件。此前原生插件未注册媒体理解类音频 provider,显式选择会报 Media provider not available: clawrouter,自动选择路径也从不考虑它,Talk 的文件上传同样失败。现在配置了 ClawRouter 服务且持有合格范围密钥的运维方可用 gpt-4o-transcribe 做批量/文件转写,Talk 上传也走通;ClawRouter 可以被显式选择,在配置齐备且规范凭据可解析时也会自动进入候选。聊天、语音与图像生成的默认值不变。
  • PR #163783(feat(slack): create public channels from message actions)把"从 Slack 消息动作创建项目频道"这件事做成了显式的运维选择。频道创建默认关闭,不再走普通 messages 动作门禁;启用 channels.slack.actions.channels: true(或所选账号的等价配置)后,动作会在受信 workspace 中创建公开频道、在 Slack 允许时邀请受信请求者,并返回可复用的 workspace 限定目标。生成的 Slack manifest 为创建申请 channels:manage、为邀请申请 channels:write.invites。
  • PR #180202(fix(nextcloud-talk): honor silent message sends)让 Nextcloud Talk 不再丢弃静默发送标志,原本想安静的文本与原生文件分享仍会触发聊天通知。现在文本与文件分享均可请求 silent: true,消息依旧可见;静默文件发送在服务器所需能力无法确认时会在读取或上传媒体之前失败——静默文件元数据需要的是 media-caption 而非 silent-send。
  • PR #180509(feat(commands): accept /fast ultra as ultrafast shorthand)是个小而实用的修补:此前输入 /fast ultra 会得到 Unrecognized fast mode "ultra" 且会话保持不变,现在等价于 /fast ultrafast。存储的会话值仍是 "ultrafast",没有新增持久化字段,网关协议也不变。

控制台与运行时性能

  • PR #180884(perf(ui): reduce CPU while streaming long chat replies)针对长回复流式输出时的浏览器 CPU 开销:此前每次仅文本变化都会重新准备整个聊天面板并提交侧栏/跟随末尾的布局工作。现在几何信息只在 ChatThread 订阅,已准备的转录投影被复用,位置标记事实被记忆化;跟随末尾只对原生几何与结构提交生效,等高文本提交不做末尾对齐,侧栏仅在几何、活跃位置、可见性或显式交互变化时提交。
  • PR #180965(perf(ui): isolate cron rows from pending filter updates)处理了 500 条任务时输入过滤卡顿的问题:每次击键都会重新发布聚合视图属性,每一行控件即使 job 与权限事实未变也会重建菜单呈现。修复后改为显式的 job/动作属性传递,三个共享标量 memo 保留未变的权限、忙碌与连接事实,keyed 任务投影与动作继续读取当前任务、回调与权限。
  • PR #180972(improve(ui): download over 5% less JavaScript with Brotli)把构建期 Brotli 编码质量从 9 提到 10,构建压缩时间增加约 5 秒,换来 Brotli 客户端完整路由 JS 下载量下降超过 5%,解码后的应用完全一致。Gzip 下载与既有预算不变,资产、每组四文件的压缩策略、gzip 选项、服务的缓存契约与运行时均未改动。
  • PR #180973(fix: reduce delays while loading Gateway plugins)修掉了同步源读取反复等待已就绪的 worker 回复造成的插件加载延迟:源读取方等待的是一个回复生产方从未通知的共享信号。现在通过私有任务传输传递该信号,并在投递消息后通知,包括源映射回调;读取方在服务消息前先快照序列号,使得服务期间到达的回复不再造成无谓等待。既有界轮询兜底与任务回执仍是权威。
  • 另有一次独立提交值得记录:cf2558f(docs(models): clarify named custom provider setup)补充了命名自定义 provider 的配置说明,避免按文档配置时走错路径。

这一轮的主线不是新增某个显眼功能,而是把"谁在什么权限下能做什么"逐步变成可推导、可检查的运行时事实:Cron 有统一的执行上下文,插件有明确的请求者范围目录和可恢复的子代理会话,而 Gateway 的终端、密钥继承与运行时版本则被收得更紧。

常用链接

 
内容管家

发表评论