Appearance
终端界面 — 概念
Ratatui 渲染架构
Codex TUI 基于 Ratatui 框架构建,采用即时模式(immediate mode)渲染——每帧完全重绘:
App struct 是 TUI 的核心状态机(tui/src/app.rs),包含以下关键状态:
| 组件 | 类型 | 职责 |
|---|---|---|
ChatWidget | 主聊天组件 | 消息列表、输入框、状态栏 |
BacktrackState | 回溯状态 | 支持 undo 操作,恢复到之前的对话状态 |
AppServerSession | 服务器会话 | 与 [[glossary/app-server-protocol |
ModelCatalog | 模型目录 | 可用模型列表和选择 |
TokenUsage | Token 用量 | 实时 token 消耗追踪 |
RuntimeKeymap | 运行时快捷键 | 可自定义的键盘映射 |
FileSearchManager | 文件搜索 | 模糊文件搜索功能 |
TranscriptReflowState | 转录回流 | 调整窗口大小时重新排版 |
TUI 的 70+ 子模块按功能分组:
| 功能组 | 模块 | 说明 |
|---|---|---|
| 聊天核心 | chatwidget, history_cell, exec_cell | 消息展示、历史条目、命令执行条目 |
| 渲染 | render, diff_render, markdown, streaming | 各类内容的终端渲染 |
| 交互 | input, keymap, slash_command, clipboard_copy | 用户输入和快捷键 |
| 会话 | session_resume, app_server_session, session_lifecycle | 会话管理和恢复 |
| 审批 | approval_events, app_server_requests | 命令审批和请求处理 |
| 搜索 | file_search, resume_picker | 文件搜索和会话选择 |
| 主题 | theme_picker, frames | UI 主题和边框样式 |
事件处理系统
TUI 的事件处理采用多源汇聚的架构,将终端事件、代理事件和定时器事件统一分发:
关键事件类型和交互流程:
终端事件:crossterm 捕获键盘、鼠标和 resize 事件,通过
input模块处理- 快捷键通过
RuntimeKeymap映射到操作(如Ctrl+C中断、Ctrl+Zundo) slash_command模块处理/开头的命令(如/help、/model)
- 快捷键通过
代理事件:
CodexThread::next_event()返回的Event通过thread_events模块处理TurnItem更新触发 UI 重绘- 审批请求(
ApprovalRequest)通过approval_events弹出审批对话框 - MCP 服务器 elicitation 通过
ThreadInteractiveRequest::McpServerElicitation处理
交互请求:
ThreadInteractiveRequest枚举定义了三种需要用户交互的请求:AppLink(AppLinkViewParams)— 应用链接Approval(ApprovalRequest)— 命令/补丁审批McpServerElicitation(McpServerElicitationFormRequest)— MCP 服务器表单
流式输出渲染
LLM 的流式响应通过 streaming 模块实现实时渲染:
流式渲染的优化策略:
- 增量渲染:只追加新的 token 到现有文本,避免全文重绘
- Markdown 渐进解析:
markdown模块在流式输入过程中渐进解析 Markdown,处理不完整的代码块、链接等 - 自适应刷新率:根据内容变化频率调整渲染频率,在快速输出时降低刷新率
- 光标管理:正确处理光标位置,确保输入框和输出区域的光标不会冲突
差异展示
diff_render 模块负责代码修改差异的终端渲染:
| 差异类型 | 渲染方式 | 颜色方案 |
|---|---|---|
| 新增行 | 绿色 + 前缀 | 前景绿色 |
| 删除行 | 红色 - 前缀 | 前景红色 |
| 上下文行 | 默认颜色 | 无特殊样式 |
| 文件头 | 加粗路径 | 高亮 |
差异展示集成在 ChatWidget 中,当 Apply Patch 工具执行时,自动显示修改前后的对比视图。
相关概念
- Ratatui — Rust 终端 UI 框架
- Agent Loop — TUI 消费的代理事件来源
- App Server Protocol — TUI 与核心的通信协议