TUI

TUI 是 Hermes 的现代化前端——一个终端 UI,底层使用与经典 CLI 相同的 Python 运行时。相同的 agent、相同的会话、相同的斜杠命令;但交互界面更清晰、响应更快。

这是推荐使用的 Hermes 交互方式。

启动

# 启动 TUI
hermes --tui
 
# 恢复最新的 TUI 会话(回退到最新的经典会话)
hermes --tui -c
hermes --tui --continue
 
# 按 ID 或标题恢复特定会话
hermes --tui -r 20260409_000000_aa11bb
hermes --tui --resume "my t0p session"
 
# 直接运行源码——跳过预构建步骤(适用于 TUI 贡献者)
hermes --tui --dev

你也可以通过环境变量启用它:

export HERMES_TUI=1
hermes          # 现在使用 TUI
hermes chat     # 同样

经典 CLI 仍然作为默认值可用。CLI 接口中记录的所有内容——斜杠命令、快速命令、技能预加载、人格、多行输入、中断——在 TUI 中工作方式相同。

为什么要用 TUI

  • 即时首帧——横幅在应用完成加载前就已显示,因此 Hermes 启动时终端永远不会感觉卡住。
  • 非阻塞输入——在会话准备好之前输入和排队消息。你的第一条提示在 agent 上线时立即发送。
  • 丰富的覆盖层——模型选择器、会话选择器、批准和澄清提示都以模态面板而非内联流程呈现。
  • 实时会话面板——工具和技能在初始化过程中逐步填充。
  • 鼠标友好的选择——拖拽以高亮,使用统一的背景而非 SGR 反转。使用终端正常的复制手势进行复制。
  • 交替屏幕渲染——差异更新意味着流式传输时无闪烁,退出后无滚动回放杂乱。
  • 编辑器功能——内联粘贴折叠长片段,Cmd+V / Ctrl+V 文本粘贴并回退到剪贴板图片,括号粘贴安全,图片/文件路径附件规范化。

可应用相同的皮肤人格。在会话中使用 /skin ares/personality pirate 切换,UI 实时重绘。参见皮肤与主题获取完整的可自定义键列表,以及哪些适用于经典模式 vs TUI——TUI 遵循横幅调色板、UI 颜色、提示符样式/颜色、会话显示、补全菜单、选择背景、tool_prefixhelp_header

可折叠横幅区域

TUI 启动横幅将运行时信息分为四个可折叠区域,每个区域标题旁带有 / 箭头:

区域默认状态
工具(Tools)展开
技能(Skills)折叠
系统提示词(System Prompt)折叠
MCP 服务器(MCP Servers)折叠

点击区域标题(或其箭头)上的任意位置即可切换。工具列表默认展开,因为它是会话启动时最常检查的区域;技能、系统提示词和 MCP 服务器默认折叠,以便即使你安装了数十个技能或配置了大量 MCP 服务器,横幅仍保持紧凑。状态对横幅实例是局部的,因此下次启动会重置为默认值。

要求

  • Node.js ≥ 20——TUI 作为从 Python CLI 启动的子进程运行。hermes doctor 会验证这一点。
  • TTY——与经典 CLI 一样,管道 stdin 或在非交互环境中运行会回退到单查询模式。

首次启动时,Hermes 将 TUI 的 Node 依赖安装到 ui-tui/node_modules(一次性,几秒钟)。后续启动很快。如果你拉取新版本的 Hermes,当源文件比 dist 新时,TUI 包会自动重建。

外部预构建

分发预构建包的发行版(Nix、系统包)可以将 Hermes 指向该包:

export HERMES_TUI_DIR=/path/to/prebuilt/ui-tui
hermes --tui

目录必须包含 dist/entry.js

键绑定

键绑定与经典 CLI 完全一致。唯一的区别:

  • 鼠标拖拽用统一的选中背景高亮文本。
  • Cmd+V / Ctrl+V 首先尝试普通文本粘贴,然后回退到 OSC52/原生剪贴板读取,最后在剪贴板或粘贴内容解析为图片时附加图片。
  • /terminal-setup 安装本地 VS Code / Cursor / Windsurf 终端绑定,以获得更好的 Cmd+Enter 和 macOS 上的撤销/重做体验。
  • 斜杠自动补全以包含描述的浮动面板形式打开,而非内联下拉列表。
  • Ctrl+X——当一条排队消息被高亮(在 agent 仍在运行时发送)时,将其从队列中删除。Esc 取消编辑并取消高亮,不删除。
  • Ctrl+G / Ctrl+X Ctrl+E——在 $EDITOR 中打开当前输入缓冲区,用于多行/长提示词编写;保存并退出将内容发送回作为提示词。

斜杠命令

所有斜杠命令工作方式不变。少数几个是 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]在运行时选择鼠标跟踪预设(也会持久化到 display.mouse_trackingconfig.yaml 中)。wheel(1000+1006)保留滚轮滚动而不产生悬停事件,避免 tmux 在提示行上刷”剪贴板中无图片”;buttons 添加拖拽选择;all 是带悬停驱动的 UI 的默认值。

所有其他斜杠命令(包括已安装的技能、快速命令和人格切换)的工作方式与经典 CLI 相同。参见斜杠命令参考

LaTeX 数学渲染

TUI 的 Markdown 管道内联渲染 LaTeX 数学公式:$E = mc^2$$$\frac{a}{b}$$ 渲染为 Unicode 格式的数学公式,而非原始的 TeX 源码。支持内联和块级数学公式;不支持的语法回退为显示字面 TeX 并包裹在代码跨度中,以便保持可复制性。

这是始终开启的——无需配置。经典 CLI 保留原始 TeX。

浅色终端检测

TUI 自动检测浅色终端并相应地切换到浅色主题。检测通过三层进行:

  1. HERMES_TUI_THEME 环境变量——最高优先级。值:lightdark,或原始 6 字符背景十六进制值(例如 ffffff1a1a2e)。
  2. COLORFGBG 环境变量——由 xterm 衍生终端使用的经典”我的背景色是什么?“提示。
  3. 通过 OSC 11 的终端背景探测——适用于未设置 COLORFGBG 的现代终端(Ghostty、Warp、iTerm2、WezTerm、Kitty)。

如果你希望无论终端如何都永久使用浅色主题:

export HERMES_TUI_THEME=light

忙碌指示器样式

状态栏忙碌指示器是可插拔的——默认在 agent 工作期间每 2.5 秒轮换 Hermes 的可爱脸表情调色板。通过配置或 /indicator 斜杠命令选择不同的样式:

display:
  tui_status_indicator: kaomoji   # kaomoji | emoji | unicode | ascii

或在会话中:/indicator emoji(依此类推)。样式附带匹配的字形宽度,因此状态栏的其余部分在轮换时不会抖动。

自动恢复

默认情况下,hermes --tui 每次启动都会开始一个新的会话。要自动重连到最近的 TUI 会话(当你的终端或 SSH 连接意外断开时很有用),选择加入:

export HERMES_TUI_RESUME=1          # 最近的 TUI 会话
# 或:
export HERMES_TUI_RESUME=<session-id>   # 特定会话

取消设置该变量或显式传递 --resume <id> 以按启动覆盖。

状态栏

TUI 的状态栏实时跟踪 agent 状态:

状态含义
starting agent…会话 ID 已激活;工具和技能正在上线。你可以输入——消息会排队并在就绪时发送。
readyAgent 空闲,等待输入。
thinking… / running…Agent 正在推理或运行工具。
interrupted当前轮次已取消;按 Enter 重新发送。
forging session… / resuming…初始连接或 --resume 握手。

每个皮肤的状态栏颜色和阈值与经典 CLI 共享——参见皮肤以进行自定义。

状态栏还显示:

  • 带 git 分支的工作目录——~/projects/hermes-agent (docs/two-week-gap-sweep)。分支后缀在你于侧边终端执行 git checkout 时更新(基于 mtime 缓存),因此 TUI 反映的是你实际活跃的分支,而非启动时的状态。
  • 每轮次耗时——轮次运行时显示 ⏱ 12s/3m 45s(实时),轮次完成后冻结为 ⏲ 32s / 3m 45s。第一个数字是自上次用户消息以来的时间;第二个是总会话持续时间。每次新提示时重置。
  • 🗜️ N——运行中的会话被自动压缩的次数。在第一次压缩触发后出现。
  • ▶ N——当前在此会话中运行的 /background 任务数量。在至少有一个任务正在进行时出现。
  • ⚠ YOLO——当 YOLO 模式开启(hermes --yolo/yoloHERMES_YOLO_MODE=1)时显示的可见警告。同样的标志也出现在启动横幅中,因此你不可能在未注意到的情况下启动一个自动批准的会话。

配置

TUI 遵循所有标准的 Hermes 配置:~/.hermes/config.yaml、配置集、人格、皮肤、快速命令、凭据池、记忆提供者、工具/技能启用。没有 TUI 特定的配置文件。

少数几个键专门调整 TUI 界面:

display:
  skin: default              # 任何内置或自定义皮肤
  personality: helpful
  details_mode: collapsed    # hidden | collapsed | expanded — 全局手风琴默认值
  sections:                  # 可选:按区域覆盖(任何子集)
    thinking: expanded       # 始终展开
    tools: expanded          # 始终展开
    activity: collapsed      # 重新启用活动面板(默认隐藏)
  mouse_tracking: all        # off | wheel | buttons | all(或 true/false 以向后兼容)。
                             #   wheel   — 1000+1006(滚动 + 点击;无拖拽,无悬停—
                             #             推荐在 tmux 内使用,以抑制悬停事件在提示行
                             #             产生的"剪贴板中无图片"刷屏)
                             #   buttons — 添加 1002 用于终端侧拖拽选择
                             #   all     — 添加 1003 用于悬停(滚动条悬停分页、
                             #             链接 mouseenter 等)

运行时切换:

  • /details [hidden|collapsed|expanded|cycle]——设置全局模式
  • /details <section> [hidden|collapsed|expanded|reset]——覆盖一个区域 (区域:thinkingtoolssubagentsactivity

默认可见性

TUI 带有针对各个区域的固执默认值,将轮次流式传输为实时记录而非一堆箭头:

  • thinking——展开。推理在模型输出时内联流式传输。
  • tools——展开。工具调用及其结果以展开形式渲染。
  • subagents——回退到全局 details_mode(默认折叠在箭头下——在委派实际发生之前保持安静)。
  • activity——隐藏。环境元信息(网关提示、终端一致性提示、后台通知)对大多数日常使用来说是噪音。工具失败仍然在失败的工具行上内联渲染;环境错误/警告通过浮动告警兜底显示,当所有面板都隐藏时。

按区域覆盖优先于区域默认值和全局 details_mode。要重新设计布局:

  • display.sections.thinking: collapsed——将推理放回箭头下
  • display.sections.tools: collapsed——将工具调用放回箭头下
  • display.sections.activity: collapsed——重新启用活动面板
  • /details <section> <mode> 在运行时

display.sections 中显式设置的任何内容都会覆盖默认值,因此现有配置保持不变。

会话

会话在 TUI 和经典 CLI 之间共享——两者都写入同一个 ~/.hermes/state.db。你可以在一个界面中启动会话,在另一个界面中恢复。会话选择器显示来自两个来源的会话,带有来源标签。

参见会话了解生命周期、搜索、压缩和导出。

连接到运行中的网关

默认情况下,TUI 会生成自己的进程内网关,因此每个 TUI 实例是自包含的。如果你已经有一个长期运行的网关(例如 tmux 中的 hermes gateway run,或 systemd / launchd 服务),你可以将 TUI 指向该网关——TUI 然后成为一个瘦客户端,并与连接到同一网关的所有其他界面(消息平台、Web 仪表盘、其他 TUI 会话)共享状态。

在启动前通过环境变量设置 WebSocket URL:

export HERMES_TUI_GATEWAY_URL="ws://localhost:8765/api/ws?token=***"
hermes --tui

Token 来自网关的 API 认证配置(参见API 服务器)。当设置了此环境变量时,TUI:

  • 完全跳过启动本地网关——没有重复的平台适配器,没有端口冲突。
  • 通过 WebSocket 将每个操作(斜杠命令、图片附加、浏览器进度、语音事件等)路由到共享网关。
  • 如果在请求之间网关 URL 轮换(新令牌),自动重新连接。

这与 Web 仪表盘的内嵌 TUI 使用的通道相同(参见Web 仪表盘)——一个网关,多个客户端。

回退到经典 CLI

启动 hermes(不带 --tui)保持在经典 CLI 上。要让一台机器偏好使用 TUI,在你的 shell 配置文件中设置 HERMES_TUI=1。要恢复,取消设置即可。

如果 TUI 启动失败(无 Node、缺少包、TTY 问题),Hermes 会打印诊断信息并回退——而不是让你卡住。

参见

  • CLI 接口——完整的斜杠命令和键绑定参考(共享)
  • 会话——恢复、分支和历史
  • 皮肤与主题——设置横幅、状态栏和覆盖层的主题
  • 语音模式——在两个界面中均可使用
  • 配置——所有配置键