Skip to content

E3|Cloud / Remote:云端任务不在这棵树里跑;Remote 是看本机 host ​

先别把 codex cloud 当成另一套 run_turn ​

A1 已经切开两套运行时。读到 cloud-tasks/ 的人,仍会以为这里有云端 kernel:搜 run_turn、沙箱、rollout,找不到就补一个。

判断先说清楚:chatgpt.com/codex 的 agent 在 OpenAI 隔离环境里跑,本仓库没有那份循环。 这里只有:用 ChatGPT 后端提交/查询任务、把 diff git apply 进本地、以及把 本机 app-server 暴露给手机(Remote)。额度可以跟本地共享(同一账号),Session 和沙箱政策 不能 共享。

E2 的 worktree 是本机第二份 checkout。云端沙箱是另一台 VM。Remote 更不是云——手机看的是你电脑上那条本地 Session。


1. 云端产品面:Web、GitHub、并行任务 ​

用户看见的入口:

  • 浏览器 chatgpt.com/codex:丢任务、看并行云端作业、在隔离环境里改 GitHub 仓库
  • GitHub:@codex 评论、issue / PR 上的云端任务(编排 不在本仓库)
  • 桌面/IDE 里的 Cloud 模式(壳不在这棵树,连的是同一套云端 API)

本仓库能对上 GitHub 的,是 按 git remote 找云端 environment。env_detect.rs 从 origin 解析 owner/repo,打 .../environments/by-repo/github/{owner}/{repo}(:50-64)。注释写明:GitHub only, like VSCode。其它 host 的 git remote 不会自动变成 Codex Cloud 环境。

云端并行任务是云端调度器的事,不是本机 AgentRegistry 的并发槽(D5)。不要把 max_concurrent_threads_per_session 套到 chatgpt.com 的任务列表上。

没有「云端不在这棵树」会怎样?你会给 cloud-tasks 补 Seatbelt,或把云端 task id 拿去 codex resume。resume 读的是 CODEX_HOME/sessions 的 JSONL(B4),云端 id 对不上。


2. CLI 只做提交、查看、把 diff 带回家 ​

codex cloud 标成 EXPERIMENTAL(cli/src/main.rs:225-227,别名 cloud-tasks)。子命令(cloud-tasks/src/cli.rs:16-27):

命令做什么
Exec提交任务:prompt、--env、--attempts、--branch
Status / List查云端任务
Diff看 unified diff
Apply把该任务的 diff 应用到本地

另有顶层 codex apply <task_id>(main.rs:200-202):「把 Codex agent 产出的最新 diff 当 git apply 打进工作区」。实现:get_task → 找 PR 的 output_diff → apply_git_patch(chatgpt/src/apply_command.rs:22-74)。apply_git_patch 本身在 git-utils crate(E6 的 /diff、B5 的信任根解析用的是同一个 crate,不是三份各写各的 git 封装)。失败看 git 的 applied/skipped/conflicts。成功只打印 Successfully applied diff。

不在本地重放那次 turn,不把云端 VM 政策拷进 AskForApproval,不把云端 rollout 写入 sessions/。缝是 git diff。本地随后的审查、测试、commit,走你本机 harness。

所有云端 HTTP 都要 uses_codex_backend() 且有 account id(chatgpt_client.rs:74-81)。API Key 走不通(A1)。codex exec --ephemeral 仍是本地 runtime,只是不落盘。

没有这条缝会怎样?两种隔离模型焊在一个 Session 里:云端以为有完整 VM,本地以为你会点 Allow。只搬 diff,就是拒绝混写。


3. Remote:手机看的是本机 app-server,不是云端 kernel ​

codex remote-control(cli/src/main.rs:174-175)启动 带远程控制的 app-server:前台、daemon start / stop、pair 配对码(remote_control_cmd.rs:53-88)。E1 的 TUI 也可以连 RemoteAppServerEndpoint。进程模型见 G3。

这是把 已经在你机器上跑的 Session 暴露给 ChatGPT 手机端(或另一台 Codex App)。仓库、命令、插件、MCP 都在 host 上(官方 remote-connections 文档)。它不是把 turn 丢到云端沙箱。

硬前提(测试名即文档):

  • ChatGPT 登录(connect_remote_control_websocket_requires_chatgpt_auth)
  • sqlite StateDb(缺库直接 fail:remote control requires sqlite state db)

API Key、ephemeral 无索引会话,配不了这条。企业托管可能禁远程控制,以当时产品为准。

E2 已拒绝在远程 workspace 上建 managed worktree:Remote 连的是 host 的 Local/worktree,不能在手机上再 git worktree add 一份假装隔离。

没有「Remote ≠ Cloud」会怎样?手机点的任务被理解成 codex cloud exec,diff 从云端 VM 回来,host 上正在编辑的文件对不上。Remote 的真相源仍是 host 的 rollout。


4. 额度共享,能力不共享 ​

同一 ChatGPT 账号:本地 TUI 和云端任务抽同一套额度(A1)。实现完全分开:

本地 harness(本仓库)云端(闭源)Remote
循环run_turn不在这棵树还是 host 上的 run_turn
隔离Seatbelt / bwrap / worktree云端 VMhost 的沙箱
历史CODEX_HOME JSONL云端任务存储host JSONL
人在回路TUI overlay / IDE任务级;运行中通常不在手机 UI 投 host 事件
GitHub @codex无产品编排无

不在本仓库、不要假装能抄的: 云端 kernel、chatgpt.com UI、GitHub App 编排、云端并行队列、云端环境镜像。本仓库只有 HTTP 客户端、git apply、environment-by-repo 探测、remote-control 把 app-server 挂出去。这只 HTTP 客户端也不是 cloud-tasks 自己攒的:任务详情、状态轮询走 cloud-tasks-client,底层类型(CodeTaskDetailsResponseExt 等)来自 codex-backend-client——同一个 crate 也给 B5 的 EnterpriseManaged 配置包、C2 memories 的额度检查供数据,云端任务只是它的一种消费者。

Apps / 远程插件市场同样要 Codex 后端(A1、D2)。云端任务能用的模型档,API Key 本地路径看不见。


5. 结语:带走一句话 ​

Cloud 是另一套闭源 runtime,本仓库只负责提交任务和把 git diff 带回家;Remote 是手机插头插在本机 app-server 上——两者都认 ChatGPT 账号,但都不是第二条 run_turn,也不是本机 worktree 的替代品。