Skip to content

架构概览 — 代码走读

codex-rs/Cargo.toml — Workspace 根配置

toml
[workspace]
resolver = "2"
members = [
    "core", "core-api", "core-plugins", "core-skills",
    "cli", "tui", "exec",
    "app-server", "app-server-protocol", "app-server-client", "app-server-daemon",
    "sandboxing", "linux-sandbox", "bwrap",
    "codex-mcp", "mcp-server", "rmcp-client",
    "config", "execpolicy", "protocol",
    "apply-patch", "tools", "file-system", "file-search",
    # ... 共 119 个成员
]

workspace 使用 resolver = "2"edition = "2024",release profile 启用 lto = "fat"codegen-units = 1 进行最大优化。核心依赖(tokioserdeclap 等)在 [workspace.dependencies] 中统一管理版本。

codex-rs/cli/src/main.rs — CLI 多工具入口

main() 函数约 3773 行,是整个 Codex 的统一入口:

rust
// 简化的入口逻辑
fn main() -> Result<()> {
    let cli = MultitoolCli::parse();  // clap Parser
    arg0_dispatch_or_else(cli, cli_main)
}

fn cli_main(cli: MultitoolCli, paths: Arg0DispatchPaths) -> Result<()> {
    let config_overrides = cli.fold_config_overrides();
    match cli.subcommand {
        Some(Subcommand::Exec(args)) => exec::run_main(args, paths),
        Some(Subcommand::AppServer(args)) => app_server::run_main(args, paths),
        Some(Subcommand::Login) => login_flow(),
        // ... 25+ 子命令
        None => run_interactive_tui(cli),  // 默认启动 TUI
    }
}

MultitoolCli 结构体包含三个顶层字段:config_overrides(CLI 配置覆盖)、feature_toggles(特性开关)、subcommand(25+ 子命令枚举)。无子命令时进入交互式 TUI 模式。

codex-rs/core/src/lib.rs — 核心 crate 导出

核心 crate 是所有业务逻辑的汇聚点,导出以下关键类型:

rust
// 会话与线程
pub use codex_thread::{CodexThread, CodexThreadSettingsOverrides, ThreadConfigSnapshot};
pub use session::Codex;  // 内部重命名为 Codex

// 线程管理
pub use thread_manager::{ThreadManager, NewThread, StartThreadOptions};

// 模型客户端
pub use client::{ModelClient, ModelClientSession, Prompt, ResponseStream};

// 工具与 MCP
pub use codex_mcp::McpConnectionManager;

// 沙箱
pub use sandboxing::{SandboxManager, SandboxType};

// 执行策略
pub use execpolicy::{load_exec_policy, Policy, Decision};

// 配置
pub mod config;

// 补丁应用
pub use apply_patch::{parse_patch, StreamingPatchParser};

内部包含 60+ 个模块(agentclientcodex_threadcompactexecgoalshooksmcprolloutsafetysessionskillstools 等),覆盖了代理循环的全部功能。

codex-rs/tui/src/lib.rs — TUI 模式入口

run_main() 约 3000 行,是 TUI 模式的主入口:

rust
pub fn run_main(cli: Cli, paths: Arg0DispatchPaths) -> Result<AppExitInfo> {
    // 1. 解析 CLI,解析配置,确定 codex_home
    // 2. 检查本地守护进程 (maybe_probe_default_daemon_socket)
    // 3. 确定 AppServerTarget:Embedded | LocalDaemon | Remote
    // 4. 加载配置、认证、云配置
    // 5. 执行 onboarding/trust 界面(如需要)
    // 6. 处理恢复/分叉会话选择
    // 7. 调用 App::run()
}

TUI crate 包含 70+ 子模块,其中核心模块包括:chatwidget(聊天组件)、diff_render(差异渲染)、streaming(流式输出)、markdown(Markdown 渲染)、keymap(快捷键映射)、session_resume(会话恢复)。

codex-rs/exec/src/lib.rs — Exec 模式入口

run_main() 约 1975 行,是Exec 无头模式的入口:

rust
pub fn run_main(cli: Cli, paths: Arg0DispatchPaths) -> Result<CodexStatus> {
    // 1. 解析 CLI、配置,确定 codex_home
    // 2. 加载配置,强制登录
    // 3. 启动 in-process app-server client
    // 4. 从 args/stdin 解析 prompt
    // 5. 启动/恢复 thread
    // 6. 运行事件循环直到 turn 完成
    // 7. 通过 EventProcessor 输出(JSON 或文本)
}

Exec 模式的关键特征是所有交互请求(审批、用户输入、MCP elicitation)都会被 自动拒绝,确保无人工干预的自动化执行。

关键函数索引

函数/模块文件路径说明
MultitoolClicodex-rs/cli/src/main.rsclap Parser,25+ 子命令定义
cli_main()codex-rs/cli/src/main.rsCLI 入口,子命令分发
Codex::spawn()codex-rs/core/src/session/mod.rs创建 Session(队列对 + 事件循环)
CodexThreadcodex-rs/core/src/codex_thread.rs外部接口,包装 Codex
ThreadManagercodex-rs/core/src/thread_manager.rs多线程生命周期管理
ModelClientcodex-rs/core/src/client.rsLLM API 调用(WebSocket/SSE)
run_main() (TUI)codex-rs/tui/src/lib.rsTUI 入口,约 3000 行
run_main() (Exec)codex-rs/exec/src/lib.rsExec 入口,约 1975 行
App::run()codex-rs/tui/src/app.rsTUI 应用状态机
workspace 配置codex-rs/Cargo.toml119 成员 workspace