Skip to content

终端界面 — 概念

Ratatui 渲染架构

Codex TUI 基于 Ratatui 框架构建,采用即时模式(immediate mode)渲染——每帧完全重绘:

App struct 是 TUI 的核心状态机(tui/src/app.rs),包含以下关键状态:

组件类型职责
ChatWidget主聊天组件消息列表、输入框、状态栏
BacktrackState回溯状态支持 undo 操作,恢复到之前的对话状态
AppServerSession服务器会话与 [[glossary/app-server-protocol
ModelCatalog模型目录可用模型列表和选择
TokenUsageToken 用量实时 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, framesUI 主题和边框样式

事件处理系统

TUI 的事件处理采用多源汇聚的架构,将终端事件、代理事件和定时器事件统一分发:

关键事件类型和交互流程:

  1. 终端事件:crossterm 捕获键盘、鼠标和 resize 事件,通过 input 模块处理

    • 快捷键通过 RuntimeKeymap 映射到操作(如 Ctrl+C 中断、Ctrl+Z undo)
    • slash_command 模块处理 / 开头的命令(如 /help/model
  2. 代理事件CodexThread::next_event() 返回的 Event 通过 thread_events 模块处理

    • TurnItem 更新触发 UI 重绘
    • 审批请求(ApprovalRequest)通过 approval_events 弹出审批对话框
    • MCP 服务器 elicitation 通过 ThreadInteractiveRequest::McpServerElicitation 处理
  3. 交互请求ThreadInteractiveRequest 枚举定义了三种需要用户交互的请求:

    • AppLink(AppLinkViewParams) — 应用链接
    • Approval(ApprovalRequest) — 命令/补丁审批
    • McpServerElicitation(McpServerElicitationFormRequest) — MCP 服务器表单

流式输出渲染

LLM 的流式响应通过 streaming 模块实现实时渲染:

流式渲染的优化策略:

  • 增量渲染:只追加新的 token 到现有文本,避免全文重绘
  • Markdown 渐进解析markdown 模块在流式输入过程中渐进解析 Markdown,处理不完整的代码块、链接等
  • 自适应刷新率:根据内容变化频率调整渲染频率,在快速输出时降低刷新率
  • 光标管理:正确处理光标位置,确保输入框和输出区域的光标不会冲突

差异展示

diff_render 模块负责代码修改差异的终端渲染:

差异类型渲染方式颜色方案
新增行绿色 + 前缀前景绿色
删除行红色 - 前缀前景红色
上下文行默认颜色无特殊样式
文件头加粗路径高亮

差异展示集成在 ChatWidget 中,当 Apply Patch 工具执行时,自动显示修改前后的对比视图。

相关概念