Files
hermes-agent/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/tui.md
T
2026-06-14 14:30:48 -04:00

254 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
sidebar_position: 2
title: "TUI"
description: "启动 Hermes 的现代终端 UI——支持鼠标操作、丰富的浮层面板和非阻塞输入。"
---
# TUI
TUI 是 Hermes 的现代前端——一个终端 UI(用户界面),与 [Classic CLI](cli.md) 共享同一 Python 运行时。相同的 agent、相同的会话、相同的斜杠命令;交互界面更简洁、响应更流畅。
这是以交互方式运行 Hermes 的推荐方式。
## 启动
```bash
# 启动 TUI
hermes --tui
# 恢复最近的 TUI 会话(若无则回退到最近的 classic 会话)
hermes --tui -c
hermes --tui --continue
# 通过 ID 或标题恢复指定会话
hermes --tui -r 20260409_000000_aa11bb
hermes --tui --resume "my t0p session"
# 直接运行源码——跳过预构建步骤(供 TUI 贡献者使用)
hermes --tui --dev
```
也可以通过环境变量启用:
```bash
export HERMES_TUI=1
hermes # 现在使用 TUI
hermes chat # 同上
```
Classic CLI 仍作为默认方式保留。[CLI 界面](cli.md)中记录的所有内容——斜杠命令、快捷命令、skill 预加载、personality、多行输入、中断——在 TUI 中均完全一致。
## 为什么选择 TUI
- **即时首帧** — banner 在应用加载完成前就已渲染,因此 Hermes 启动时终端不会出现卡顿感。
- **非阻塞输入** — 会话就绪前即可输入并排队消息。agent 上线后立即发送第一条 prompt(提示词)。
- **丰富的浮层面板** — 模型选择器、会话选择器、审批和澄清提示均以模态面板形式渲染,而非内联流程。
- **实时会话面板** — 工具和 skill 在初始化过程中逐步填充。
- **鼠标友好的选择** — 拖拽高亮时使用统一背景色,而非 SGR 反色。使用终端的常规复制手势即可复制。
- **备用屏幕渲染** — 差量更新意味着流式传输时无闪烁,退出后无滚动历史残留。
- **编辑器增强** — 长片段的内联折叠粘贴、`Cmd+V` / `Ctrl+V` 文本粘贴(带剪贴板图片回退)、括号粘贴安全保护,以及图片/文件路径附件规范化。
同样的 [skins](features/skins.md) 和 [personalities](features/personality.md) 均适用。会话中途使用 `/skin ares``/personality pirate` 切换,UI 实时重绘。完整的可定制键列表及其对 classic 与 TUI 的适用范围,请参阅 [Skins & Themes](features/skins.md)——TUI 支持 banner 调色板、UI 颜色、prompt 字形/颜色、会话显示、补全菜单、选区背景色、`tool_prefix``help_header`
### 可折叠的 banner 区块
TUI 启动 banner 将运行时信息分为四个可折叠区块,每个区块标题旁渲染 `▸` / `▾` 折叠箭头:
| 区块 | 默认状态 |
|------|---------|
| Tools | 展开 |
| Skills | 折叠 |
| System Prompt | 折叠 |
| MCP Servers | 折叠 |
点击区块标题(或其折叠箭头)的任意位置即可切换展开/折叠状态。Tools 列表默认展开,因为它是会话开始时最常查看的区块;Skills、System Prompt 和 MCP Servers 默认折叠,即使安装了大量 skill 或接入了多个 MCP server,banner 也能保持紧凑。状态仅对当前 banner 实例有效,下次启动将重置为默认值。
## 环境要求
- **Node.js** ≥ 20 — TUI 作为从 Python CLI 启动的子进程运行。`hermes doctor` 会验证此项。
- **TTY** — 与 classic CLI 一样,通过管道传入 stdin 或在非交互式环境中运行时,将回退到单次查询模式。
首次启动时,Hermes 会将 TUI 的 Node 依赖安装到 `ui-tui/node_modules`(一次性操作,耗时数秒)。后续启动速度很快。拉取新版 Hermes 后,若源文件比 dist 更新,TUI bundle 将自动重新构建。
### 外部预构建
发行版若附带预构建 bundle(如 Nix、系统包),可将 Hermes 指向该 bundle
```bash
export HERMES_TUI_DIR=/path/to/prebuilt/ui-tui
hermes --tui
```
该目录必须包含 `dist/entry.js`
## 快捷键
快捷键与 [Classic CLI](cli.md#keybindings) 完全一致。仅有以下行为差异:
- **鼠标拖拽** — 以统一选区背景色高亮文本。
- **`Cmd+V` / `Ctrl+V`** — 优先尝试普通文本粘贴,然后回退到 OSC52/原生剪贴板读取,最后在剪贴板或粘贴内容解析为图片时进行图片附件操作。
- **`/terminal-setup`** — 安装本地 VS Code / Cursor / Windsurf 终端绑定,以在 macOS 上获得更好的 `Cmd+Enter` 和撤销/重做一致性。
- **斜杠自动补全** — 以带描述的浮动面板形式展开,而非内联下拉菜单。
- **`Ctrl+X`** — 当排队消息被高亮(在 agent 仍在运行时发送的消息)时,从队列中删除该消息。**`Esc`** 取消编辑并取消高亮,但不删除。
- **`Ctrl+G` / `Ctrl+X Ctrl+E`** — 在 `$EDITOR` 中打开当前输入缓冲区,用于多行/长 prompt 编写;保存并退出后,内容将作为 prompt 发送回来。
## 斜杠命令
所有斜杠命令均可正常使用。部分命令由 TUI 独有——它们会产生更丰富的输出或以浮层而非内联面板形式渲染:
| 命令 | TUI 行为 |
|------|---------|
| `/help` | 带分类命令的浮层,可用方向键导航 |
| `/sessions` | 模态会话选择器——预览、标题、token 总量、内联恢复 |
| `/model` | 按提供商分组的模态模型选择器,带费用提示 |
| `/skin` | 实时预览——浏览时主题变更即时生效 |
| `/details` | 切换详细工具调用详情(全局或按区块) |
| `/usage` | 丰富的 token / 费用 / 上下文面板 |
| `/agents`(别名 `/tasks`) | 可观测性浮层——带终止/暂停控制的实时子 agent 树、按分支的费用/token/文件汇总、逐轮历史记录 |
| `/reload` | 将 `~/.hermes/.env` 重新读入运行中的 TUI 进程,使新添加的 API 密钥无需重启即可生效 |
| `/mouse [on\|off\|toggle\|wheel\|buttons\|all]` | 在运行时选择鼠标跟踪预设(同时持久化到 `config.yaml``display.mouse_tracking`)。`wheel`(1000+1006)保留滚轮滚动而不产生悬停事件,避免在 tmux 中向 prompt 行发送"No image in clipboard"垃圾信息;`buttons` 添加 1002 以支持终端侧拖拽选择;`all` 是带悬停 UI 的默认值。 |
其他所有斜杠命令(包括已安装的 skill、快捷命令和 personality 切换)与 classic CLI 完全一致。请参阅[斜杠命令参考](../reference/slash-commands.md)。
## LaTeX 数学渲染
TUI 的 Markdown 渲染管线支持内联 LaTeX 数学:`$E = mc^2$``$$\frac{a}{b}$$` 渲染为 Unicode 格式的数学表达式,而非原始 TeX 源码。支持内联和块级数学;不支持的语法将回退为显示包裹在代码 span 中的原始 TeX,以保持可复制性。
此功能始终开启,无需配置。Classic CLI 保留原始 TeX。
## 浅色终端检测
TUI 自动检测浅色终端并相应切换到浅色主题。检测分三层进行:
1. `HERMES_TUI_THEME` 环境变量——最高优先级。可选值:`light``dark`,或原始 6 位背景十六进制色值(如 `ffffff``1a1a2e`)。
2. `COLORFGBG` 环境变量——xterm 衍生终端使用的经典"背景色查询"提示。
3. 通过 OSC 11 探测终端背景——适用于不设置 `COLORFGBG` 的现代终端(Ghostty、Warp、iTerm2、WezTerm、Kitty)。
若要无论终端如何都永久使用浅色主题:
```bash
export HERMES_TUI_THEME=light
```
## 忙碌指示器样式
状态栏忙碌指示器可插拔——默认在 agent 工作期间每 2.5 秒轮换一次 Hermes 的 kawaii 表情调色板。通过配置或 `/indicator` 斜杠命令选择不同样式:
```yaml
display:
tui_status_indicator: kaomoji # kaomoji | emoji | unicode | ascii
```
或在会话中:`/indicator emoji`(等)。各样式附带匹配的字形宽度,轮换时状态栏其余部分不会抖动。
## 自动恢复
默认情况下,`hermes --tui` 每次启动都会开启新会话。若要自动重新连接到最近的 TUI 会话(在终端或 SSH 连接意外断开时很有用),可选择启用:
```bash
export HERMES_TUI_RESUME=1 # 最近的 TUI 会话
# 或:
export HERMES_TUI_RESUME=<session-id> # 指定会话
```
取消设置该变量,或在每次启动时显式传入 `--resume <id>` 以覆盖。
## 状态栏
TUI 的状态栏实时跟踪 agent 状态:
| 状态 | 含义 |
|------|------|
| `starting agent…` | 会话 ID 已激活;工具和 skill 仍在上线中。可以输入——消息将排队,就绪后发送。 |
| `ready` | Agent 空闲,等待输入。 |
| `thinking…` / `running…` | Agent 正在推理或运行工具。 |
| `interrupted` | 当前轮次已取消;按 Enter 重新发送。 |
| `forging session…` / `resuming…` | 初始连接或 `--resume` 握手中。 |
各 skin 的状态栏颜色和阈值与 classic CLI 共享——请参阅 [Skins](features/skins.md) 了解自定义方式。
状态栏还显示:
- **工作目录及 git 分支** — `~/projects/hermes-agent (docs/two-week-gap-sweep)`。在旁边的终端执行 `git checkout` 时,分支后缀会更新(mtime 缓存),TUI 反映的是实际活跃分支,而非启动时的分支。
- **每条 prompt 的耗时** — 轮次运行时显示 `⏱ 12s/3m 45s`(实时),轮次完成后冻结为 `⏲ 32s / 3m 45s`。第一个数字是自上次用户消息以来的时间;第二个是会话总时长。每次新 prompt 时重置。
- **`🗜️ N`** — 当前会话被自动压缩的次数。首次压缩触发后显示。
- **`▶ N`** — 当前会话中正在运行的 `/background` 任务数量。至少有一个任务在执行时显示。
- **`⚠ YOLO`** — 每当 YOLO 模式开启时(`hermes --yolo``/yolo``HERMES_YOLO_MODE=1`)显示的可见警告。同一徽章也出现在启动 banner 中,确保你不会在未注意到的情况下启动自动审批会话。
## 配置
TUI 遵循所有标准 Hermes 配置:`~/.hermes/config.yaml`、profile、personality、skin、快捷命令、凭证池、内存提供商、工具/skill 启用状态。不存在 TUI 专属配置文件。
少数键专门用于调整 TUI 界面:
```yaml
display:
skin: default # 任意内置或自定义 skin
personality: helpful
details_mode: collapsed # hidden | collapsed | expanded — 全局折叠面板默认值
sections: # 可选:按区块覆盖(任意子集)
thinking: expanded # 始终展开
tools: expanded # 始终展开
activity: collapsed # 重新启用 activity 面板(默认隐藏)
mouse_tracking: all # off | wheel | buttons | all(或 true/false 以向后兼容)
# wheel — 1000+1006(滚轮+点击;无拖拽,无悬停——
# 在 tmux 内推荐使用,可消除悬停事件导致的
# prompt 行"No image in clipboard"垃圾信息)
# buttons — 添加 1002 以支持终端侧拖拽选择
# all — 添加 1003 以支持悬停(滚动条悬停翻页、
# 链接 mouseenter 等)
```
运行时切换:
- `/details [hidden|collapsed|expanded|cycle]` — 设置全局模式
- `/details <section> [hidden|collapsed|expanded|reset]` — 覆盖单个区块
(区块:`thinking``tools``subagents``activity`
**默认可见性**
TUI 附带有主见的按区块默认值,将轮次以实时转录形式流式展示,而非一堆折叠箭头:
- `thinking`**展开**。推理过程随模型输出内联流式显示。
- `tools`**展开**。工具调用及其结果以展开状态渲染。
- `subagents` — 沿用全局 `details_mode`(默认折叠在箭头下——在实际发生委托之前保持安静)。
- `activity`**隐藏**。环境元信息(gateway 提示、终端一致性提醒、后台通知)对日常使用来说是噪音。工具失败仍会在失败的工具行内联渲染;当所有面板均隐藏时,环境错误/警告通过浮动警告兜底显示。
按区块覆盖优先于区块默认值和全局 `details_mode`。调整布局的方式:
- `display.sections.thinking: collapsed` — 将 thinking 折叠到箭头下
- `display.sections.tools: collapsed` — 将工具调用折叠到箭头下
- `display.sections.activity: collapsed` — 重新启用 activity 面板
- 运行时使用 `/details <section> <mode>`
`display.sections` 中显式设置的内容优先于默认值,因此现有配置保持不变。
## 会话
会话在 TUI 和 classic CLI 之间共享——两者均写入同一个 `~/.hermes/state.db`。可以在一个界面开始会话,在另一个界面恢复。会话选择器显示来自两个来源的会话,并带有来源标签。
会话生命周期、搜索、压缩和导出,请参阅[会话](sessions.md)。
## TUI 如何与其 gateway 通信
默认情况下,TUI 会在进程内启动自己的 gateway,因此每个 TUI 实例是自包含的——无需任何配置。
你可能会在代码或日志中看到 `HERMES_TUI_GATEWAY_URL` 环境变量。它是 **Web 仪表板的内部接线细节**,并非面向用户的远程连接开关。当你打开仪表板的 "Chat" 标签页(`hermes dashboard``/chat`)时,仪表板的 Web 服务器会派生一个内嵌的 TUI 子进程,并注入 `HERMES_TUI_GATEWAY_URL`,让该子进程通过本地回环 WebSocket(`/api/ws`)连接到仪表板自己的进程内 `tui_gateway``/api/ws` 端点仅存在于仪表板服务器内部(`hermes_cli/web_server.py`),并绑定到该进程的生命周期和认证。
不存在通用的"将任意 TUI 指向任意独立 gateway 端口"的模式。特别是,OpenAI 兼容 API 服务器(`hermes gateway` / `api_server` 平台)**不**提供 `/api/ws`——它是模型后端接口(`/v1/chat/completions``/v1/models` 等),并刻意不暴露 TUI 的 JSON-RPC 控制通道。将 `HERMES_TUI_GATEWAY_URL` 设置为该端口将返回 404。
如果你希望多个界面共享同一组会话,请使用共享的 `~/.hermes/state.db`(参见[会话](sessions.md))或 Web 仪表板的内嵌聊天(参见 [Web Dashboard](features/web-dashboard.md#chat))——而不是手动设置 gateway URL。
## 回退到 Classic CLI
不带 `--tui` 启动 `hermes` 将继续使用 classic CLI。若要让某台机器默认使用 TUI,在 shell profile 中设置 `HERMES_TUI=1`。若要回退,取消设置即可。
如果 TUI 启动失败(无 Node、缺少 bundle、TTY 问题),Hermes 会打印诊断信息并回退——而不是让你陷入困境。
## 另请参阅
- [CLI 界面](cli.md) — 完整的斜杠命令和快捷键参考(共享)
- [会话](sessions.md) — 恢复、分支和历史记录
- [Skins & Themes](features/skins.md) — 自定义 banner、状态栏和浮层主题
- [语音模式](features/voice-mode.md) — 在两种界面中均可使用
- [配置](configuration.md) — 所有配置键