Appearance
终端界面 — 代码走读
codex-rs/tui/src/lib.rs — TUI 入口(~3000 行)
run_main() 是 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: 内嵌 app-server(默认)
// - LocalDaemon { endpoint }: 连接本地守护进程
// - Remote { endpoint }: 连接远程服务器
// 4. 加载配置、认证、云配置 (CloudConfigBundle)
// 5. 执行 onboarding/trust 界面(首次使用)
// 6. 处理恢复/分叉会话选择 (resume_picker)
// 7. 调用 App::run() 启动主循环
}公共 API 导出:
| 类型 | 说明 |
|---|---|
Cli | TUI 专属 CLI 参数 |
AppExitInfo | 退出信息(退出原因、退出码) |
ExitReason | 退出原因枚举 |
Terminal | 终端抽象(封装 crossterm) |
TokenUsage | Token 用量追踪 |
UpdateAction | 更新动作 |
RemoteAppServerEndpoint | 远程服务器端点 |
render_markdown_text() | Markdown 渲染函数 |
codex-rs/tui/src/app.rs — 应用状态机
App struct 是 TUI 的核心状态容器:
rust
pub struct App {
// 核心组件
chat_widget: ChatWidget,
backtrack_state: Option<BacktrackState>,
// 服务器连接
app_server_session: AppServerSession,
// 配置和模型
config: Config,
model_catalog: ModelCatalog,
// 功能模块
file_search_manager: FileSearchManager,
runtime_keymap: RuntimeKeymap,
token_usage: TokenUsage,
// 线程管理
thread_session_state: ThreadSessionState,
pending_requests: PendingAppServerRequests,
agent_navigation: AgentNavigationState,
side_thread_state: SideThreadState,
// UI 状态
transcript_reflow: TranscriptReflowState,
// ...
}App 的关键子模块(app/ 目录下):
| 子模块 | 职责 |
|---|---|
event_dispatch | 统一事件分发(终端/代理/定时器) |
input | 用户输入处理(键盘、鼠标) |
thread_events | 代理事件处理(turn 更新、工具结果) |
thread_routing | 多线程路由和切换 |
session_lifecycle | 会话创建、恢复、销毁 |
config_persistence | 配置变更持久化 |
app_server_events | App Server 通知处理 |
app_server_requests | 向 App Server 发送请求 |
background_requests | 后台异步请求 |
agent_navigation | 代理输出导航(跳转) |
history_ui | 历史会话 UI |
thread_settings | 线程级设置管理 |
loaded_threads | 已加载线程管理 |
codex-rs/tui/src/chatwidget/ — 聊天组件
ChatWidget 是 TUI 的主要 UI 组件,负责渲染聊天界面:
- 消息列表:使用
HistoryCell(历史消息)和ExecCell(命令执行)渲染对话内容 - 输入区域:底部多行输入框,支持粘贴和多行编辑
- 状态栏:显示当前模型、token 用量、代理状态
- 快捷键提示:底部显示常用快捷键
codex-rs/tui/src/streaming/ — 流式输出
streaming 模块实现 LLM 响应的增量渲染:
rust
// 流式渲染的核心逻辑
// 1. 接收 TurnItem 的增量更新
// 2. 追加新 token 到缓冲区
// 3. 触发 Ratatui 重绘(只渲染新增部分)codex-rs/tui/src/diff_render/ — 差异渲染
diff_render 模块渲染代码差异:
rust
// 差异渲染逻辑
// 1. 接收 FileChangeItem(旧/新文本对)
// 2. 计算行级差异
// 3. 构建带颜色的 Text(+绿色/-红色)
// 4. 在 ChatWidget 中显示codex-rs/tui/src/keymap/ — 快捷键映射
RuntimeKeymap 支持用户自定义快捷键绑定:
rust
pub struct RuntimeKeymap {
// 键到操作的映射
// 支持普通键和修饰键组合(Ctrl+X, Alt+X 等)
}关键函数索引
| 函数/模块 | 文件路径 | 说明 |
|---|---|---|
run_main() | tui/src/lib.rs | TUI 入口,~3000 行 |
App struct | tui/src/app.rs | 中央状态机 |
App::run() | tui/src/app.rs | 启动主事件循环 |
ChatWidget | tui/src/chatwidget/ | 主聊天 UI 组件 |
render() | tui/src/render/ | 即时模式渲染 |
event_dispatch | tui/src/app/event_dispatch.rs | 事件分发 |
input | tui/src/app/input.rs | 用户输入处理 |
thread_events | tui/src/app/thread_events.rs | 代理事件处理 |
diff_render | tui/src/diff_render/ | 代码差异渲染 |
streaming | tui/src/streaming/ | 流式输出渲染 |
markdown | tui/src/markdown/ | Markdown 渲染 |
session_resume | tui/src/session_resume/ | 会话恢复 |
keymap | tui/src/keymap/ | 快捷键映射 |
slash_command | tui/src/slash_command/ | 斜杠命令处理 |
resume_picker | tui/src/resume_picker/ | 恢复目标选择 |