第 30 讲:Cloud Tasks + External Agent Migration

Codex 源码解析 · 第 30 讲

Codex 源码解析系列 第 30 讲:Cloud Tasks + External Agent Migration 基于 OpenAI Codex 源码 · 2026-10-24 💡 本讲一句话: Codex 有两条"把活干完"的暗线——一条是 codex cloud :任务丢到云端环境跑,best-of-N 出多个 diff,本地挑一个 apply;另一条是 external-agent-migration:把你从 Claude Code / Cursor 带来的配置、技能、插件、会话安全地搬进 Codex。本讲把这两套子系统的真实源码逐行拆开。 一、codex cloud:五个动词的 CLI 面 cloud-tasks crate(约 5K LOC)是 codex cloud 子命令的实现。整个 CLI 面只有五个动词,全部定义在 cli.rs: 📄 codex-rs/cloud-tasks/src/cli.rs (第 15-27 行) #[derive(Debug, clap::Subcommand)] // 派生 clap 子命令枚举,五个动词就是全部 CLI 面 pub enum Command { // 每个变体对应一个云端任务生命周期动作 /// Submit a new Codex Cloud task without launching the TUI. // exec:提交新任务,纯命令行不拉起 TUI Exec(ExecCommand), // 入参含 query/env/attempts/branch(见下文) /// Show the status of a Codex Cloud task. // status:查单个任务状态 Status(StatusCommand), // 非 READY 时进程以退出码 1 结束,方便脚本判断 /// List Codex Cloud tasks. // list:分页列出任务,支持 --json 给机器消费 List(ListCommand), // cursor 游标翻页,limit 上限 20 /// Apply the diff for a Codex Cloud task locally. // apply:把云端产出的 diff 落到本地工作区 Apply(ApplyCommand), // 可选 --attempt 指定 best-of-N 中的第几个 /// Show the unified diff for a Codex Cloud task. // diff:只打印统一 diff,不落盘 Diff(DiffCommand), // apply 之前的"先看一眼"动作 } 为什么这样设计: 五个动词恰好覆盖云端任务的完整生命周期——提交(exec)、观察(status/list/diff)、落地(apply)。注意 diff 和 apply 都接受 --attempt N :因为一个任务可以跑 N 次(best-of-N),产出 N 个候选 diff,用户有权挑。这个"多候选 + 显式选择"的模型贯穿整个 crate。 五个子命令的行为对照: 子命令 作用 关键参数 / 行为 exec 提交新任务到云端环境 --env 必填;--attempts 1~4(best-of-N);--branch 默认当前分支;成功后只打印任务 URL status 查单个任务状态 非 READY 时 exit(1)——脚本可据此轮询等待 list 分页列出任务 --limit 1~20;--cursor 翻页;--json 输出机器可读格式 diff 打印指定 attempt 的统一 diff --attempt N(1-based);无落盘副作用,纯只读 apply 把指定 attempt 的 diff 应用到本地 --attempt N;非 Success 状态 exit(1);TUI 里另有 preflight 预检(见第五节) 二、init_backend:认证是硬门槛,mock 只给调试构建 每个子命令的第一步都是 init_backend() 。它做三件事:解析 base_url、加载 ChatGPT 登录态、组装 HTTP 客户端。注意 mock 分…

阅读全文:Codex 源码解析 第 30 讲