33.1 TUI 架构

生成模型:Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗:输入 ~340k tokens,输出 ~6k tokens(本节)


OpenClaw 提供了一个全功能的终端用户界面(TUI,Terminal User Interface),让用户可以直接在终端中与 AI Agent 进行交互式对话。TUI 不仅仅是一个简单的命令行 REPL——它具备语法高亮、Markdown 渲染、工具调用可视化、多 Agent 切换、会话管理等完整功能。

衍生解释:TUI 与 CLI 的区别 CLI(Command Line Interface)是传统的命令行工具——用户输入命令、程序返回结果,交互是线性的。TUI(Terminal User Interface)则在终端中构建了类似 GUI 的界面,具有布局系统、交互组件、实时更新等特性。经典的 TUI 应用包括 vimhtoptmux 等。TUI 通过 ANSI 转义码控制终端的光标位置、文字颜色和屏幕区域。

33.1.1 pi-tui 集成

OpenClaw 的 TUI 基于 @mariozechner/pi-tui 库构建。该库提供了一套终端 UI 组件系统,包括布局容器、文本渲染、编辑器、加载动画、列表选择等基础组件。

核心依赖

import {
  CombinedAutocompleteProvider,  // 组合自动补全
  Container,                     // 布局容器
  Loader,                        // 加载动画
  ProcessTerminal,               // 终端适配器
  Text,                          // 文本组件
  TUI,                           // TUI 根实例
} from "@mariozechner/pi-tui";

TUI 组件树

TUI 的界面由一棵组件树构成:

ProcessTerminal 是终端的底层适配器,封装了 process.stdin / process.stdout 的读写和终端尺寸检测。

自定义组件

除了 pi-tui 的内置组件,OpenClaw 还实现了以下自定义组件(位于 src/tui/components/):

组件
文件
功能

ChatLog

chat-log.ts

聊天记录显示,支持滚动和历史加载

CustomEditor

custom-editor.ts

输入编辑器,支持多行和自动补全

AssistantMessage

assistant-message.ts

AI 回复的 Markdown 渲染

UserMessage

user-message.ts

用户消息的格式化显示

ToolExecution

tool-execution.ts

工具调用的可视化

FilterableSelectList

filterable-select-list.ts

可过滤的选择列表

SearchableSelectList

searchable-select-list.ts

可搜索的选择列表(模糊匹配)

33.1.2 TUI 适配层

src/tui/ 目录的文件按职责清晰分层:

Gateway 客户端

TUI 通过 GatewayChatClient 与 Gateway 通信:

状态管理

TUI 的状态通过 TuiStateAccess 接口集中管理,使用 getter/setter 代理模式:

状态变更会自动触发 UI 更新。例如,activityStatus"idle" 变为 "streaming" 时,状态栏会切换为加载动画。

输入处理

编辑器的提交处理支持三种输入模式:

三种输入模式:

前缀
模式
示例
行为

!

Bash

!ls -la

在本地 Shell 中执行命令

/

命令

/think high

执行斜杠命令

消息

帮我写一个函数

发送给 AI Agent

注意 ! 模式使用原始未裁剪的文本raw),确保前导空格不会误触发 Bash 模式。单独的 ! 被视为普通消息。

33.1.3 终端渲染

主题系统

TUI 的配色方案定义在 src/tui/theme/theme.ts 中:

配色方案经过精心设计,在深色终端中提供舒适的阅读体验。代码高亮基于 cli-highlight 库,支持主要编程语言的语法着色。

终端基础工具

src/terminal/ 提供了底层的终端操作工具:

文件
功能

ansi.ts

ANSI 转义码常量和工具函数

palette.ts

全局调色板(与 TUI 主题独立)

links.ts

终端超链接(OSC 8 协议)

table.ts

终端表格渲染

stream-writer.ts

流式写入器(支持节流和缓冲)

progress-line.ts

进度行(单行更新)

note.ts

提示框渲染

restore.ts

终端状态恢复(异常退出时还原)

流式响应组装

TuiStreamAssembler 负责将 Gateway 的增量事件组装为完整的显示文本:

每个运行(runId)维护独立的状态:thinkingText(思维过程)和 contentText(正文内容)分别追踪,按需合成显示文本。showThinking 参数控制是否将思维过程(如 Claude 的 <thinking> 标签内容)显示给用户。

状态行与等待动画

当 Agent 正在处理时,状态行显示动态的等待消息:

tui-waiting.ts 提供了一组随机等待短语(如"思考中..."、"正在推理..."),增加界面的趣味性。

33.1.4 斜杠命令系统

TUI 提供了丰富的斜杠命令,涵盖 Agent 管理、会话控制、模型切换等:

命令支持参数自动补全——例如 /think 命令会补全 offminimallowmediumhighxhigh 等级别。命令别名机制(COMMAND_ALIASES)支持简写,如 /elev/elevated

覆盖层选择器

复杂的选择操作(如 Agent 切换、会话选择、模型选择)通过覆盖层(overlay)实现:

覆盖层使用 SearchableSelectList 组件,支持键盘导航和模糊搜索(fuzzy-filter.ts),提供类似 VS Code 命令面板的交互体验。

33.1.5 本地 Shell

TUI 的 ! 前缀支持直接在终端中执行本地 Shell 命令:

这使得用户无需离开 TUI 界面就能执行文件操作、运行脚本等任务——在 AI 辅助编程的工作流中非常实用。


本节小结

  1. pi-tui 框架:TUI 基于 @mariozechner/pi-tui 构建,使用组件树模型(header → chatLog → status → footer → editor)。

  2. Gateway 通信GatewayChatClient 封装了 WebSocket 客户端,提供 sendMessage/listSessions/patchSession 等高层 API。

  3. 三种输入模式! 前缀执行本地 Shell、/ 前缀触发斜杠命令、无前缀发送消息给 Agent。

  4. 流式响应组装TuiStreamAssembler 分别追踪思维过程和正文内容,按需合成显示文本,支持增量更新。

  5. 主题系统:精心设计的 20+ 色调色板,支持语法高亮(cli-highlight),在深色终端中提供舒适的阅读体验。

  6. 斜杠命令:20+ 个命令覆盖 Agent/会话/模型管理,支持参数自动补全和命令别名。

  7. 覆盖层选择器:模糊搜索列表用于 Agent/会话/模型选择,提供类似 VS Code 命令面板的交互体验。

  8. 终端工具层src/terminal/ 提供 ANSI 控制、表格渲染、流式写入、超链接等底层能力。

Last updated