Appearance
架构概览 — 代码走读
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 进行最大优化。核心依赖(tokio、serde、clap 等)在 [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+ 个模块(agent、client、codex_thread、compact、exec、goals、hooks、mcp、rollout、safety、session、skills、tools 等),覆盖了代理循环的全部功能。
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)都会被 自动拒绝,确保无人工干预的自动化执行。
关键函数索引
| 函数/模块 | 文件路径 | 说明 |
|---|---|---|
MultitoolCli | codex-rs/cli/src/main.rs | clap Parser,25+ 子命令定义 |
cli_main() | codex-rs/cli/src/main.rs | CLI 入口,子命令分发 |
Codex::spawn() | codex-rs/core/src/session/mod.rs | 创建 Session(队列对 + 事件循环) |
CodexThread | codex-rs/core/src/codex_thread.rs | 外部接口,包装 Codex |
ThreadManager | codex-rs/core/src/thread_manager.rs | 多线程生命周期管理 |
ModelClient | codex-rs/core/src/client.rs | LLM API 调用(WebSocket/SSE) |
run_main() (TUI) | codex-rs/tui/src/lib.rs | TUI 入口,约 3000 行 |
run_main() (Exec) | codex-rs/exec/src/lib.rs | Exec 入口,约 1975 行 |
App::run() | codex-rs/tui/src/app.rs | TUI 应用状态机 |
| workspace 配置 | codex-rs/Cargo.toml | 119 成员 workspace |