Explorar o código

docs: 记录 Codex 接入实现,关闭 Q1–Q3

- 03-providers §3.4:版本与部署、CODEX_HOME、进程模型、权限配置映射、
  权限模式、审批与提问、用量计算、设备码登录、已知差距
- 11-roadmap:Q1(权限配置可按 thread 指定)、Q2(协议落定)、
  Q3(改用专用 CODEX_HOME)关闭

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Jerry Liang hai 1 semana
pai
achega
167c5c3777
Modificáronse 2 ficheiros con 18 adicións e 3 borrados
  1. 15 0
      docs/design/03-providers.md
  2. 3 3
      docs/design/11-roadmap.md

+ 15 - 0
docs/design/03-providers.md

@@ -116,6 +116,21 @@ Thread 参数:`approvalPolicy = on-request`、`cwd = workspaceDir`,沙箱使
 | turn 完成 / 失败 | `run.completed` / `run.failed` |
 | **服务端请求**:命令执行审批 / 文件变更审批 | `ctx.interact({kind:'approval'})` → 回复 accept / decline(含"本会话总是允许") |
 
+### 3.4 实现记录(M2,2026-10-23,codex 0.164.0)
+
+- **版本与部署**:`@openai/codex@0.164.0` 作为服务端依赖锁定,随 pnpm deploy 发布;协议类型由该版本 `codex app-server generate-ts` 生成,位于 `apps/server/src/providers/codex/protocol/`(升级 codex 时重新生成)
+- **CODEX_HOME**:服务专用(生产 `/srv/agent-server/home/.codex`,开发 `.dev-data/home/.codex`),不加载个人 `~/.codex` 的插件与 MCP(Q3 关闭);`auth.json` 列入全局禁止项
+- **进程**:单个常驻 app-server,JSON-RPC 每行一个 JSON;按 threadId 把通知和服务端请求分发给对应的 Run;进程退出时正在运行的 Run 失败,下次调用自动重启
+- **会话**:首轮 `thread/start`,之后 `thread/resume`(失败则新建);每个 Run 一个 `turn/start`,中断用 `turn/interrupt`
+- **文件访问策略**(Q1 关闭):每次 thread/start / resume 通过 `config` 传入动态权限配置 `default_permissions = "agent_server"` + `permissions.agent_server.filesystem`(受限模式 `":root" = "deny"`),响应中 `activePermissionProfile` 确认生效。**必须**把 `CODEX_HOME/tmp/arg0-linux` 和 codex 二进制目录设为可读,否则沙箱辅助程序无法启动;`/tmp` 不可写,`TMPDIR` 指向工作区 `.agent/tmp`
+- **环境变量**:`shell_environment_policy.inherit = "core"`,只继承基础变量,再设置 Python/Node 运行环境变量,不把服务进程的密钥带入命令
+- **权限模式**:需审批 → `approvalPolicy = "on-request"`(沙箱内命令自动执行,越界才请求审批,与 Claude 的"每条命令都询问"不同);自动 / 只读 → `"never"`;只读模式工作区为 read
+- **审批**(Q2 关闭):`item/commandExecution/requestApproval` / `item/fileChange/requestApproval` 回复 `accept | acceptForSession | decline | cancel`;**命令联网请求一律拒绝并审计**(Codex 命令联网后不受域名限制);文件变更与 `item/permissions/requestApproval` 先按访问策略检查,越界自动拒绝
+- **提问**:`item/tool/requestUserInput` 映射为提问卡片,回复 `{ answers: { [questionId]: { answers: [...] } } }`
+- **用量**:`thread/tokenUsage/updated` 给出线程累计与最近一次增量,本次 Run 用量 = 最新累计 −(首次通知的累计 − 首次增量)
+- **登录**:`account/login/start { type: "chatgptDeviceCode" }` 返回网址和短码,管理员在 OpenAI 页面输入,完成后收到 `account/login/completed`;AgentServer 不接触凭证。终端方式:`agent-codex login --device-auth`
+- **已知差距**:LibreOffice 在 Codex 沙箱中同样无法运行(禁止 Unix socket),`convert_document` / `recalc_workbook` 将在 MCP Gateway(M2 ②)中提供给 Codex;在此之前提示词会告知模型这两项不可用
+
 ## 4. 能力差异与对齐
 
 | 能力 | Claude | Codex | 对齐策略 |

+ 3 - 3
docs/design/11-roadmap.md

@@ -39,9 +39,9 @@
 
 | # | 问题 | 计划 |
 |---|---|---|
-| Q1 | Codex 权限配置能否按 thread 指定 | M2 实现时核对(03 §3.2) |
-| Q2 | codex app-server 协议的具体方法名与审批回复格式 | M2 用 `generate-ts` 落定后回填 03 §3 |
-| Q3 | 用 `-c` 能否完整禁用个人 config 中的插件和 MCP | M2 启动自检验证;不行时再评估独立 CODEX_HOME 方案(注意不能复制 auth.json) |
+| Q1 | Codex 权限配置能否按 thread 指定 | ✅ 可以:thread/start 的 config 传入动态权限配置(03 §3.4) |
+| Q2 | codex app-server 协议的具体方法名与审批回复格式 | ✅ 已落定(03 §3.4) |
+| Q3 | 用 `-c` 能否完整禁用个人 config 中的插件和 MCP | ✅ 不再需要:服务使用专用 CODEX_HOME(03 §3.4) |
 | Q4 | Claude SDK 中 AskUserQuestion 的回答格式 | ✅ 已核对:answers 以问题原文为键(03 §6) |
 | Q5 | 官方 Skills 的许可证是否允许在自托管服务中使用 | ✅ 采用 ADR-0013:只通过 Claude Code 插件机制安装、按路径加载、仅限 Claude;由管理员在后台确认后安装 |
 | Q6 | 本地资料的规模与存放位置 | 决定 M3 索引的优先级;建议放在 home 以外 |