夜雨聆风学习资料网

ARTICLE · 987250

Codex深度分析源码版(一): 总体架构

Codex深度分析源码版(一): 总体架构
Codex解读系列

第 1 章:总体架构与二进制组成

约 1964 字·阅读 5 分钟

本系列文章由openai开源的codex项目以及codex客户端二进制逆向分析而来

01

1.1 关键事实:AI 逻辑不在 Electron 里

很多人以为 Codex 桌面应用是"一个 Electron app",但解压 app.asar 后发现 Electron 那一层基本只是 UI 外壳,真正的 Agent 核心是几个 Rust 编译、stripped 的原生二进制。

证据:package.json 元数据

D:/work/ai/app/_extracted/package.json:

json
{"name": "openai-codex-electron","productName": "Codex","author": "OpenAI","version": "26.707.31428","main": ".vite/build/early-bootstrap.js"}

main 指向 .vite/build/early-bootstrap.js(仅 216 字节),说明 Electron 入口极其轻量。重型逻辑全在原生侧。

证据:.vite/build/ 下的 JS 都是外围功能

按文件大小排序后最大的几个 JS:

文件
大小
实际作用
sqlite-BqLffnB9.js
4.3MB
SQLite 绑定
main-CZpDUN17.js
1.7MB
Electron 主进程胶水
worker.js
1.4MB
Worker 线程
child-process-snapshot-worker.js
581KB
子进程快照
comment-preload.js
340KB
评论 preload
codex-micro-service-Bm59YbrT.js
13KB
Work Louder 键盘灯控制
(非 AI)
sandbox-preload.js
2.2KB
MCP App iframe 沙箱预加载
preload.js
3.2KB
通用 IPC 预加载

关键观察:codex-micro-service-Bm59YbrT.js 里全是 WLDeviceDiscovery、sendLightingConfig、batteryPercentage——这是 Work Louder 硬件键盘的灯效服务,跟 AI 毫无关系。

sandbox-preload.js 处理的是 web-sandbox.oaiusercontent.com 这个域的 iframe 通信,是给 MCP App 用的浏览器沙箱,也不是 AI 核心。

grep 这些 JS 文件查找 codex|compact|token|tool_call,命中数为 0,进一步证实 AI 逻辑不在 JS 里。

· · ·

02

1.2 真正的核心:四个 Rust 二进制

文件
大小
类型
作用
codex
298MB
ELF x86_64 static-pie stripped
Codex CLI 主程序(Linux/跨平台构建)
codex.exe
341MB
PE
Codex CLI 主程序(Windows)
codex-code-mode-host
 / .exe
46/53MB
ELF/PE
嵌入式 V8 runtime(隔离执行代码单元)
codex-command-runner.exe
1.2MB
PE
命令执行器
codex-windows-sandbox-setup.exe
8.8MB
PE
Windows Sandbox 初始化

证据:Rust 特征字符串

从 codex 二进制 strings 里直接读到的 Rust 生态标志:

$serde_json::private::Number/home/runner/work/codex/codex/.cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/serde_json-1.0.149/src/de.rs/home/runner/work/codex/codex/.cargo-home/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.52.3/src/fs/.../home/runner/work/codex/codex/.cargo-home/git/checkouts/tokio-tungstenite-.../src/connect.rs

确认:Rust + tokio(异步运行时)+ serde_json(序列化)+ tokio-tungstenite(WebSocket)。源码编译路径前缀 /home/runner/work/codex/codex/,对应 GitHub Actions runner。

证据:版本

从 strings 里读到内部版本号片段:

"minimal_client_version": "0.144.0"

即 Codex CLI 内核版本约 0.144.0(桌面外壳版本 26.707.31428 是另一套版本号)。

· · ·

03

1.3 模块全景图(从源文件路径 + 开源仓库还原)

二进制里残留了大量 event <file>:<line> 格式的 tracing 宏字符串,能还原出 crate 结构。统计 top-level 模块(按出现次数):

core(226)         ← 核心 agent 逻辑tui(154)          ← 终端 UI(桌面版嵌入)app-server(59)    ← 应用服务层(IPC)exec-server(43)   ← 远程执行服务(Noise 协议)core-plugins(23)write(22)network-proxy(20) ← 网络代理(MITM)rmcp-client(19)   ← MCP 客户端login(19)thread-store(17)  ← 会话持久化hooks(17)codex-api(17)     ← OpenAI API 客户端cli(17)memories(14)config(14)code-mode(14)     ← V8 代码执行skills(13)codex-mcp(12)     ← Codex 作为 MCP servercore-skills(11)rollout(10)       ← 推演/会话轨迹mcp-server(10)rollout-trace(9)protocol(9)model-provider(9)goal(9)app-server-daemon(8)

⭐开源仓库交叉验证(源码纠正)

以上约 35 个 crate 是从二进制 strings 反推的。对照开源仓库 github.com/openai/codex/codex-rs/,实际有 102 个 crate。二进制反推的是子集(约 1/3),漏掉的都是代码量小、tracing 事件少的小工具 crate:ansi-escape、arg0、async-utils、debug-client、file-search、git-utils、keyring-store、secrets、stdio-to-uds、uds、vendor 等。

几个归属纠正:

write → 实际是独立的 apply-patch crate
goal → 在 ext/goal/(扩展)
mcp → 是 codex-mcp / mcp-server 的简称
sandboxing 和 linux-sandbox 是两个独立 crate(前者策略层,后者 launcher 实现)

结论:模块层面 strings 反推与开源仓库零冲突——strings 看到的是真实存在的 crate,只是不完整。完整结构以开源仓库为准。

core/src/ 下又分若干子目录,下一章详述。这里给出整体依赖关系 [推断]:

              ┌─────────────────────────────────────┐              │            Electron 外壳             │              │  (UI / 托盘 / 键盘灯 / 崩溃上报)     │              └───────────────┬─────────────────────┘                              │ IPC / app-server              ┌───────────────▼─────────────────────┐              │           codex (Rust)               │              │  ┌─────────────────────────────┐    │              │  │   core (agent 主循环)        │    │              │  │   ├─ session / rollout       │    │              │  │   ├─ tools (router/handlers) │    │              │  │   ├─ compact (压缩)          │    │              │  │   ├─ guardian (审批)         │    │              │  │   └─ sandboxing              │    │              │  ├─ codex-api → OpenAI          │    │              │  ├─ network-proxy (MITM)        │    │              │  ├─ rmcp-client (MCP client)    │    │              │  ├─ mcp-server (MCP server)     │    │              │  ├─ thread-store (持久化)       │    │              │  └─ hooks / skills / memories   │    │              └──┬──────────────────────────────┘                 │ 子进程       ┌─────────┼──────────┐       ▼         ▼          ▼ code-mode    exec-server  codex-linux-sandbox  (V8)      (Noise 远程)    (Landlock/seccomp)

· · ·

04

1.4 配置与资源文件

D:/work/ai/app/resources/ 下还有这些值得注意的目录:

plugins/openai-bundled/ — 内置 7 个插件(browser/chrome/computer-use/deep-research/latex/sites/visualize),见第 7 章
skills/skills/.curated/ — 精选 skill(如 hatch-pet)
cua_node/ — 捆绑的 Node.js 运行时(用于 computer-use 等)
native/ — 原生模块(computer-use-app-icons.node、windows-account.node、windows-updater.node)
webview/apps/ — 各种 IDE 图标(vscode/cursor/zed/intellij...),用于显示"在哪个编辑器里打开"
rg / rg.exe — 捆绑的 ripgrep(系统提示里明确要求模型用 rg 而非 grep)

· · ·

05

1.5 小结

问题
答案
AI 逻辑在哪?
Rust 二进制 codex / codex.exe,不是 JS
Electron 干什么?
UI 外壳 + 系统集成,不含 agent 逻辑
用什么语言写的核心?
Rust(tokio + serde_json + tokio-tungstenite)
怎么还原结构的?
二进制残留的 event <file>:<line> tracing 字符串 + cargo 源码路径

下一章进入 core 内部,看 Agent 主循环。

本文由AI辅助整理生成,感谢关注。

相关学习资料