OpenClaw 24h 更新快报(2026-11-12):权限审批、Claude Code 原生搜索、会话轮转

内容管家 新闻 AI领域评论6字数 4175阅读13分55秒阅读模式
OpenClaw 24h 更新快报(2026-11-12):权限审批、Claude Code 原生搜索、会话轮转

OpenClaw 24h 更新快报(2026-11-12):权限审批、Claude Code 原生搜索、会话轮转

过去24小时,openclaw/openclaw合并了309个PR,日常影响最大的集中在三条线上:委派操作的有效权限判定被收紧到生效点检查,Claude Code原生WebSearch成为claude-cli托管回合的默认能力,会话自动轮转不再打断正在执行的回合。其余改动按主题展开。

权限与密钥:判定时机和边界一起收紧

PR #196984修的是安全语义上的洞。此前Default权限模式下的持久化变更,会在有效权限受限或无法确定时照常自动执行;改动之后,判断被挪到变更真正生效的那一刻,由现有的委派与审批owner检查当前权限——只有可用、无限制的Gateway执行才能推定为Full Access,请求里声明的native模式和工具目录不构成有效权限。

对操作者来说,行为变化可以这样理解:

  • 显式开启OpenClaw Full Access,或Default且有效权限已确认完整:默认自动执行。
  • Default且权限受限或未知:默认要求精确审批。
  • 想继续自动执行,可配置tools.openclaw.autoApproveChanges(支持全局与per-agent覆盖);allow-once仅覆盖当前这一次提案。

需要强调的是,长期委派授权不会解锁被直接拒绝的工具,不越过containment边界,也不能覆盖继承权限、操作上限与本次运行的有效性。这是"生效点校验"而不是"设置项授权",新增配置项后不需要任何数据迁移。

配套的诊断也补齐了。PR #196992让inactive operator authority的失败在既有的lane task error记录里区分出三种来源——源被失效、Gateway owner被回收、保留的closure被释放,并带上权限捕获的时长;它只增加三个投影字段,不新增日志记录,也不声称找到了尚未证实的生产触发原因。PR #197299处理的是权限被撤销后的行为:此前post-connect 4001会关闭自动重连,并把不同的失效原因都藏在同一条inactive-account消息里;改动后访问owner在失效传给客户端前记录一个不含身份信息的原因,可区分授权撤销、profile失败、插件退役与策略检查不可用。终态失败改为显示既有的访问拒绝恢复页、等待显式Connect,只有已识别的策略转换才允许在至少30秒延迟加上原有jitter/backoff后重新准入,握手准入与实时强制始终fail closed。

密钥侧有一个具体的泄漏点被修掉。PR #197319指出,Control UI的Skills页面在点击Save key时会把输入内容直接覆盖skills.entries.<key>.apiKey,即使原值是SecretRef或${VAR}引用——一次点击就把留在配置文件之外的密钥变成明文落进openclaw.json,随后进入备份、配置diff和支持包。改动复用了Settings表单已有的storedSecretSource规则(#191450):被引用的密钥改为只读并显示来源("From environment · VAR"或"Set by a SecretRef. Change it in the config file."),保存路径在入队前与真正派发前各校验一次;配置快照未加载或无效时保持fail closed,字段与按钮禁用。skills.update的RPC契约没有变,明文与未设置的密钥行为不变。

发布链路上还有一处请求预算问题:PR #197336修复了带恢复凭据的npm授权在遍历恢复证据时耗尽256次请求预算、导致发布在派发npm子进程之前就失败的问题。修复后父流程复用已有的命令级原始证据重放,不落盘、不复用已认证的判定,最终的依赖刷新与同步权限校验仍然强制执行。

Claude Code与模型目录:原生能力接进来,目录读法变宽容

PR #197291把Claude Code的原生WebSearch变成了claude-cli托管回合的默认能力。此前在只装了Claude订阅、没有配置OpenClaw搜索provider的环境里,托管回合没有网页搜索,除非操作者自己去打开managedNativeTools开关。现在Anthropic backend的选择函数在未设置default时返回["WebSearch"],未配置就等于["WebSearch"],显式列表(包括空数组)可以替换掉它。既有门槛一个都没放松:只在agent工具策略允许web_search、tools.web.search已启用、且没有固定或配置OpenClaw搜索provider时才保留;一旦配置了OpenClaw provider,agent看到的仍然只有一个搜索工具。子代理完成回合保留工具定义但拒绝调用,WebFetch依旧不支持。关闭方式是把plugins.entries.anthropic.config.managedNativeTools.default设为空数组。

升级影响值得单独提一句:从最新稳定版升级,claude-cli会话会重置一次(原因是prompt-tools变化)后恢复正常;从main升级则只是启动时的工具列表变化一次,会话用同一id继续resume,之前的上下文还在,首个回合会重建一次缓存前缀。

PR #197033则把thinking与fast mode的取值来源改到Claude Code自己身上,而不是用Anthropic provider的名称档案去猜。它同时留下了两个明确的后续项:thinking档位校验仍按provider名称判断,因此Haiku 5.5仍接受off而Claude Code实际按adaptive运行;agent --local也还没有把会话的fast mode传进CLI运行。1M context的规则维持原样。

缓存与目录这两块也有实打实的修正。PR #197226处理OpenAI Responses上的会话fork:Advisor复查、/btw fork这类操作从不读父会话的prompt cache,每次都按全价重算整段对话,在内置openai路线上fork的prompt约为父会话的2.5倍。根因有四处——fork每次都删掉prompt_cache_key、btw流没有传native web-search策略上下文、把thinking级别固定成off而不是取父会话的实际解析结果,以及没有采用agent或模型的thinking默认值。实测显示这个key决定GPT-5.6及以上请求能否命中另一个请求的缓存:带上它,与父会话一致的前缀读到的token数是0。fork仍然是独立请求,不会共享父会话的完整准备。

PR #197204关系到模型目录升级。第一个读取catalog v3的版本会冻结它的解析器,而当时的v3 reader仍有封闭取值:一个未知provider api、一个重复的推荐id或一条缺少斜杠的独立pricing key都可能让整份目录被拒;未知status、无效费率或超过16个contextWindows则会让单行被丢弃。改动加了一层按问题降级最窄字段的修复钩子并带上行警告——null可选变成缺失、不可用的pricing变成unknown(per-image media行因此得以保留)、未知status降级为deprecated、只丢无效的decision。有一处刻意不放松:未知row api仍然丢弃该行,因为移除它会继承provider的传输层并发出错误形状的请求。缓存侧也补了,退役默认URL从只有v1变成v1与v2。

插件侧的提示钩子这轮做了两件事。PR #197220让授权的before_prompt_build处理器能看出当前这一回合的claude-cli原生会话是否被重置:新增一个host拥有的可选事件字段continuity,取值为fresh、resumed或invalidated,并附带invalidatedReason与history标记。它不携带transcript内容,也不授予任何权限。PR #197249随后收紧了这条链路:此前模型回退的候选会复用第一个候选的授权增强结果而不重跑处理器,于是某个模型被允许接收的增强内容会流到不被允许的回退模型;改动移除了按回合的结果缓存,改为每次尝试都用该次尝试的模型、上下文预算与工具权限重跑。Codex侧同时把被token融合轮换掉的thread正确报告为invalidated。

会话与Agent:轮转不再打断在跑的回合

PR #197345是这一轮影响面最大的用户可见修复。之前一个正在会话上运行的回合——比如一个跑了83秒的cron回合——会在新的agent --session-key回合到达、而会话的idle或daily重置窗口已过时被中止,回复直接丢失。原因是新鲜度只看最后交互时间,计划回合并不计为交互,于是会话在cron回合还在跑的时候就到期重置;Gateway在准备新回合时提交了这个自动重置,而重置清理随后停掉了运行中的回合,自动重置又保持同一个session id,看起来就像旧会话的运行。改动让Gateway的回合准备采用auto-reply路径早就有的规则:当这个精确会话的writer正在执行时,隐式的idle或daily轮转被推迟,新回合复用这个会话;持久化复核还会拒绝"准备与提交之间判断翻转"的情况,因此不会再写入没有重置边界的重置元数据。对使用者的影响是:跑着的回合会跑完并保留回复,新回合在同一个会话里排队,而不是把它脚下的会话换掉。没有运行内容、或只有排队回合的会话照旧轮转,/new与sessions.reset也没有变化。

PR #196940修的是子代理结果回传的一个死循环。当子代理结束、结果需要直接发到父会话时(例如Telegram私信场景,完成回退为发送子代理结果文本),发送会报Plugin invocation scope is closed并每次重试同样失败,用户永远收不到结果。根因是公告从子代理已结束的回合启动,跑在那个回合的异步上下文里,仍带着子代理的plugin invocation scope,而回合结束时该scope就被释放了。改动让直接公告在退出该scope的上下文里运行,频道调用进入自己的plugin owner。

运行时的数据库边界也收紧了一步。PR #197379处理的是一个新worker回合会发出两条Gateway线程SQL查询(键是plugins.installedIndex)而期望是零条的问题:先前引入的私有注册缓存把调用方已经提供的metadata snapshot对嵌套读者隐藏了,目录播种于是回退到同步SQL读取。改动把提供的快照与私有缓存组合起来,两条inspection获取路径都保留了这个快照,同时保持生产者的归属与退休语义。

PR #197230解决的是一个会持续吃磁盘的问题:每次就地memory reindex都会建一个影子库并在结束时删除,但Gateway一直握着它的只写描述符,被删的文件因此留着块不释放;报告者在53小时后数到154个这样的影子库、合计36.6 GB。原因是SQLite admission为了不释放其他连接持有的POSIX锁,会为每个库文件在进程生命周期内保留一个身份描述符——对活跃库是对的,对已经用完待删的影子库就没有回收。改动在删除文件前先退役对应路径的admission,并把已有的退役函数从plugin-sdk的sqlite-runtime子路径导出。实测在main上每次重建后分别持有1、2、3、4个影子描述符共97 MB,修复后全程为0。

运行时开销:会话列表、会话搜索与回合复制

PR #197355优化的是按agent过滤的会话列表。选择范围和行准入已经持有规范的agent ID,列表过滤器却又把每一行重新规范化一次,会话元数据一变就白白消耗主线程CPU并分配临时字符串。改动很小——生产代码净减3行且不引入新缓存——收益却可测量:在15302个会话、200行分页、每次调用33次元数据替换的基准上,主线程CPU从每次调用1773微秒降到1078微秒(约−39%),采样分配字节下降约19%,p95从2.718毫秒降到1.562毫秒。对控制台里挂着大量活跃会话的用户,这个改动直接降低了列表刷新的开销。

PR #197013处理的是另一头:宽泛的sessions_search查询会在Gateway主线程上反复物化大体量的归档会话清单。发现过程此前会跨所有agent分页取出活跃与归档的完整行,再为请求方agent重复扫一遍,而它其实只需要会话身份和归属关系。改动改用一份dashboard汇总清单来提供这些事实,并为请求方精确查找保留一个global查找以维持哨兵语义。可搜索的可见会话集合不变,生产代码净增35行,其中工具本身反而缩小了3行;没有引入缓存、配置或schema变更。

PR #197385是一轮减负:agent回合反复复制会话记账和已经投影过的插件事件元数据,徒增分配却不带来额外隔离。改动认为这些场景并不需要那么强的隔离——元数据订阅本来就已经把标量字段选进新的数据记录,闭包记账的reducer也是替换字段、只需要一个新的条目信封,于是把这几处复制省掉。完整插件载荷、可变prompt hook输入、worker收到的transcript、准入事实、诊断快照和认证策略仍保持原有隔离强度,配置、schema与公开API都不变。

控制面:Cron取消、沙箱冻结阶段与工作区可信度

PR #197315修的是Cron命令的取消语义。中断cron status、get、runs或只读的scratch查询时,Gateway请求会继续跑,直到CLI启动器大约两秒后强行把它杀掉;改动把这些剩余的读命令接入已有的命令取消与Gateway传输owner,延续此前list/show已经接受的做法,同时保留run-wait、写操作与scratch compare-and-swap的托管。效果是这些查询在Ctrl-C或SIGTERM后及时退出并返回130/143,不再打印迟到的结果或错误,被中断的写操作仍照常报告回执。实测中14次读中断从启动器约2.05秒后的SIGKILL变成131毫秒内的自然退出。

PR #197347针对的是沙箱冻结难以诊断的问题。长时间冻结往往把大部分时间花在主导阶段之外,而且当一个工作区有多个writer时,OpenClaw会在检查其余运行时目标之前先暂停第一个,慢的引擎准入因此会冻结本来还能继续跑的guest。改动改为在第一次暂停之前准备好所有选定的运行时目标,同时保留每次暂停前的实时权限检查与既有恢复回执;unpause日志行现在会报告每个累计至少一秒的阶段的耗时,恢复检查、生成校验与unpause完成被拆成resumeInspect、resumeAuthority和unpause三段。三个writer的逻辑冻结区间从26.480秒降到21.250秒,单writer不变。代价也被明确记录了:每周期约多出1到2微秒的蔷钟与进程CPU中位开销,这是换取完整阶段诊断,不是吞吐改进。

PR #197248修的是一个越权写入的后果:沙箱里的代码只要在自己的工作目录写下openclaw-workspace-state.json一个文件,就能让Gateway拒绝启动、拒绝每一次配置重载,影响的是所有agent和所有频道——因为生命周期就绪检查把沙箱工作区副本里的这个文件当成了待迁移的遗留状态。改动后就绪检查只信任操作者拥有的迁移证据,沙箱写出的文件不再能阻塞Gateway;如果该文件在某个副本首次准备时就已经存在,那份副本的检查仍会拒绝该沙箱的回合。默认的workspaceAccess为none时最容易遇到,ro模式因只读挂载而不受影响。

这一轮更新集中在一件事:把校验挪到生效的那一刻。权限、密钥、会话轮转都在更早被拦下,而Claude Code的原生搜索能力也顺带默认接了进来。

常用链接

 
内容管家

发表评论