Conversation
|
感谢这个 PR,设计上的安全边界做得相当细致 —— 只升不降、 阻断项:4 条既有单测被打红(必需 check,CI 已红)CI 上
值得强调的是:这 4 条守卫的语义都还在,不是真的安全回归,纯粹是"源码文本断言的锚点/计数被改动打破"。但它们属于必需 check,所以仍需处理: 1. 2. 我验证过:按正确的(第 2 处)锚点重算,四个 fence 的偏移与 master 逐字相同(3245 / 4401 / 5540 / 6092), 最小改法是把新函数里的局部变量改个名(不必动测试): // src/worker.ts, observeCodexRuntimeVersionOnReady()
const versionObservationBackend = backend; // 原为 observedBackend4. hasRunStartupCommands = !shouldRunStartupCommandsOnSpawn({ willReattachPersistent })
|| codexAutoUpgrade?.stage === 'restoring';以上 4 处我都在本地实测过:改完后这 4 个文件全绿, 另外供参考:你描述里列的定向测试命令不包含这 4 个文件,所以本地 638 passed 不会暴露它们;这 4 条都是读 非阻断观察
顺带确认一下: 以上是自动评审的初步意见,可能有误判或遗漏;最终以维护者审阅为准。阻断项集中在那 4 条测试上,改动量很小,其余部分我这边没有发现功能性缺陷。 |
自动升级会杀掉并重启会话正在使用的 Codex 进程,属有副作用的动作, 默认开启会让所有宿主的 codex 会话无声参与。同一「实验性设置」区块的 邻居开关(codexRpcInput / noVisibleOutputHint)均为 `=== true` 默认关; 仅 bypassCodexHookTrust 因「不开会让首条消息卡死」才默认开,而本特性 不开只是保持现状,不属于此类,故与实验性开关对齐。 判定 `!== false` → `=== true`(仅显式存 true 才启用),三处读取点 一起改以保持 UI 与后端一致:config.ts 的 live getter、dashboard.ts 的 resolved 快照、settings-page.tsx 的 SPA 解析。同时修正 config.ts / global-config.ts 里「Default ON」的注释与中英帮助文案(原文写「默认 开启 / On by default」),新文案标注「实验性,默认关闭」并提示会重启 会话正在使用的 Codex 进程。 回归:auto-upgrade-codex-sessions-config.test.ts 由钉住「默认 ON」 改为钉住「默认 OFF」,保留显式 true/false 往返与非法值 fail-closed 覆盖。 Co-Authored-By: Claude Code <noreply@anthropic.com>
换代触发源是宿主上 Codex 已完成升级、需要让运行中的旧进程换代,这类 事件以天计,且换代本身仍需等待会话真正空闲,分钟级轮询没有收益。与仓库 内既有的 codex 运行时更新监视器(cli-runtime-update.ts 的 tick 为 1h) 对齐节奏,把 worker 内定时器从 10 分钟放宽到 1 小时,周期性进程表扫描 与版本探测开销再降一个数量级。 不复用 cli-runtime-update 的 24h 缓存:那条路径跑在 daemon、探测远端 registry(「上游是否发布新版」);本监视器跑在 worker、比较本地运行 进程与磁盘已装二进制(「已装好的新版该不该换代」),是两个不同的问题, 24h TTL 会让换代延迟到不可接受。 Co-Authored-By: Claude Code <noreply@anthropic.com>
主干已前进 38 个提交,rebase 到最新 master 后出现一处「语义冲突」(建议补一行)先说明:本 PR 现在对最新
需要改的一处:
|
本机 Codex 安装已经更新时,长期运行的会话仍可能停留在旧进程,继续使用旧版本的模型列表和行为。此改动让 Botmux 在确认会话安全空闲后,切换到本机已安装的较新 Codex,并静默恢复原线程;安装更新与会话进程换代由此衔接起来。
改动
dashboard.autoUpgradeCodexSessions,默认开启,修改后热生效。resumed结果,失败不会降级为新建线程。安全边界与影响面
codex/codex-app运行进程。adopt 会话、外部或共享 App Server、配置了 CLI wrapper 的会话不参与自动换代,其他 CLI 不启用此能力。/restart,不自动新建线程,也不自动重发已提交给旧进程的消息。验证
最新提交
b8555164仅将自动升级检查周期从 60 秒调整为 10 分钟。使用 Bun 1.4.2 执行bun run build通过;bun run test test/worker-codex-session-upgrade.test.ts test/codex-session-upgrade.test.ts共 49 passed。此提交的新一轮 CI 已触发,以下完整回归与 CI 结果对应明确标注的此前提交。本轮开发机只读检查仍有 1 个会话 working,因此未部署或重启,现网仍为
fix2;10 分钟周期需部署新构建并重启 worker 后生效。提交
01f32072已合入master的61dadb04c,保留quietResume和上游shellSubprocessEnv两项参数。原有 4 条源码结构断言恢复通过,运行时版本观察和启动命令的守卫语义不变。macOS 与 Linux 分别执行以下 15 个文件,各 895 passed、1 skipped;两端
bun run build完整构建通过,包含上游新增的typecheck:test-mocks:bun run test \ test/worker-pipe-initial-screen-order.test.ts \ test/restart-worker-null-reattach.test.ts \ test/raw-input-followup-atomicity.test.ts \ test/startup-commands.test.ts \ test/worker-codex-session-upgrade.test.ts \ test/worker-startup-retry-wiring.test.ts \ test/hook-review-input-hold-wiring.test.ts \ test/stuck-detector.test.ts \ test/codex-session-upgrade.test.ts \ test/codex-upgrade-target.test.ts \ test/codex-upgrade-helpers.test.ts \ test/cli-adapters.test.ts \ test/auto-upgrade-codex-sessions-config.test.ts \ test/codex-app-runner.integration.test.ts \ test/settings-write-applier.test.ts bun run build上述前 4 个阻断回归文件还分别在原生 Bun 1.4.2 下独立运行,使用隔离 HOME 和仓库测试 shim,共 99 passed、0 failed。
01f32072的 CI 的构建、3 个测试分片及聚合、3 类二进制检查均通过;CodeQL 全部通过。非阻断的 bun-test 为 1111/1112 文件通过:唯一失败在未修改的test/child-env.test.ts:251,真实 node-pty 子进程没有读到预期输出;未重跑确认是否偶发,不将该作业标作通过。01f32072的 Linuxfix3独立构建使用 Bun 1.4.2 和原样 frozen lock,单文件二进制构建及全部 smoke 通过。该轮开发机检查有 2 个运行中会话,因此没有切换入口或重启,现网继续运行fix2;本次新构建尚未完成 live 接管验证。以下静默恢复与开发机验证在此前功能构建上完成:
0.153.4配合隔离的本地 mock provider,验证 TUI 和 App Server 静默恢复:观察窗口内没有新增 HTTP 请求或 usage。该测试不使用真实账户计费。0.153.2 → 0.153.4会话换代:原线程与 Botmux worker PID 保持,原生 CLI 进程换代,未新增模型回合或 token 用量。fix2构建重新接管已有会话后,新 worker 保留原生 CLI PID 与原线程,Dashboard 显示实际版本0.153.4;观察窗口内task_started增量为 0,总 token 用量不变。这项验证覆盖接管后的版本显示,没有再次执行原生版本升级。真实 Hook review 菜单尚未手工验证,目前由行为回归测试覆盖阻塞与解除后的升级。上述实机结果不包含真实计费压测。
开关与回滚
关闭 Dashboard 开关或设置
dashboard.autoUpgradeCodexSessions: false可停止后续自动换代,无需重启 daemon;关闭开关不会取消已经开始的换代,也不会回退已运行的 Codex 版本。需要回滚 Botmux 时,先关闭开关并等待当前换代结束,再恢复上一版构建并按既有流程重启。此功能不主动下载安装 Codex,也不改变 Botmux 会话的持久化结构。界面
入口:全局设置 → 通用设置 → 实验性设置,默认开启。