feat(codex): 支持空闲会话自动升级已安装版本 - #1306
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 安装已经更新时,长期运行的会话仍可能停留在旧进程,继续使用旧版本的模型列表和行为。此改动让 Botmux 在确认会话安全空闲后,切换到本机已安装的较新 Codex,并静默恢复原线程;安装更新与会话进程换代由此衔接起来。
改动
dashboard.autoUpgradeCodexSessions,默认开启,修改后热生效。resumed结果,失败不会降级为新建线程。安全边界与影响面
codex/codex-app运行进程。adopt 会话、外部或共享 App Server、配置了 CLI wrapper 的会话不参与自动换代,其他 CLI 不启用此能力。验证
macOS 与 Linux 均执行以下定向测试,各 638 passed、1 skipped:
bun run test \ 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.tsbun run build全量构建通过;Linux 单文件二进制构建及 smoke 通过。0.153.4配合隔离的本地 mock provider,验证 TUI 和 App Server 静默恢复:观察窗口内没有新增 HTTP 请求或 usage。该测试不使用真实账户计费。0.153.2 → 0.153.4会话换代:原线程与 Botmux worker PID 保持,原生 CLI 进程换代,未新增模型回合或 token 用量。0.153.4;观察窗口内task_started增量为 0,总 token 用量不变。这项验证覆盖接管后的版本显示,没有再次执行原生版本升级。真实 Hook review 菜单尚未手工验证,目前由行为回归测试覆盖阻塞与解除后的升级。以上是本地和开发机验证结果,不代表 CI 已通过,也不包含真实计费压测。
开关与回滚
关闭 Dashboard 开关或设置
dashboard.autoUpgradeCodexSessions: false可停止后续自动换代,无需重启 daemon;关闭开关不会取消已经开始的换代,也不会回退已运行的 Codex 版本。需要回滚 Botmux 时,先关闭开关并等待当前换代结束,再恢复上一版构建并按既有流程重启。此功能不主动下载安装 Codex,也不改变 Botmux 会话的持久化结构。界面
入口:全局设置 → 通用设置 → 实验性设置,默认开启。