Day 06 / 共 20 天 · 第 2 周 · 核心引擎
启动链:从 npm 到 TUI
codex.js 选平台二进制 → cli/main.rs 分发 → tui 挂载 in-process app-server。
📍 你在整门课的位置 · 第 2 周 · 核心引擎
D06 启动链→D07 Op 协议与 app-server→D08 Agent Turn 主循环→D09 配置分层与 config.toml→D10 认证与模型 Provider
L01
codex.js:选对原生二进制(逐段)
codex-cli/bin/codex.js 可以按三段读:
- L16–L23:
PLATFORM_PACKAGE_BY_TARGET把 Rust target triple 映射到可选依赖包名。 - L25–L77:用
process.platform/arch算出targetTriple;不支持就直接 throw。 - L79–L108:
findCodexExecutable()用require.resolve(平台包/package.json)找到vendor/<triple>/bin/codex;缺失则提示重新npm i -g。
const codexExecutable = path.join(
vendorRoot, targetTriple, "bin",
process.platform === "win32" ? "codex.exe" : "codex",
);
为什么异步 spawn?文件后半注释写明:用异步
spawn 而不是 spawnSync,以便 Node 能收 SIGINT 并转发给子进程——Ctrl-C 才能干净退出。🍼Node 只做「找对平台包 → 转交参数」。业务全在 Rust。
L02
cli/main.rs 分发
你敲: codex "fix flaky test"
→ MultitoolCli 解析
→ subcommand == None
→ 进入交互路径(TuiCli 参数 + prompt)
→ codex_tui::run_…
有子命令则 match 到 Exec / Login / Mcp…(同一文件后半部分巨大的 match 臂)。
L03
TUI 与 in-process app-server
现代架构TUI 不直接调 core 细节;它通过 in-process app-server client 发 JSON-RPC(和 IDE 同协议)。
关键文件:
- codex-rs/tui/src/lib.rs — 启动客户端与 App
- codex-rs/tui/src/chatwidget/input_submission.rs — 提交输入
- codex-rs/app-server-client/ — 客户端实现
L04
今日小结
✅ 能画出 npm→Rust→TUI→app-server 四段;知道 TUI 与 IDE 同协议。