一个开关,两种桌面:Hermes 的 Simple / Advanced 界面模式

你把 Hermes 桌面 App 推荐给一位不写代码的同事,他打开之后愣了三秒:左边一列 profile,底部一条状态栏,右边有个终端面板,聊天记录里每个工具调用都展开成一大块 JSON,改文件还带彩色 diff,侧边栏里躺着“子代理”和“后台进程”。他问了一句:“我要在哪儿打字?“然后就把窗口关了。
同一件事也发生在老用户身上,只是方向相反:你想专心聊一件事的时候,这些运维信息是噪音。Hermes 桌面端最近加的界面模式(#118587)就是为这两种场合准备的:Simple 和 Advanced。
两种模式分别是什么
一句话概括:Advanced 就是今天的样子,Simple 是“只留对话”。 而这条边界是有明确原则的——模式改变的是“显示什么”,不是“Hermes 能做什么”。
Simple 会收起来的东西:
| 收起来的内容 | 说明 |
|---|---|
| 状态栏 | 底部的运行指标 |
| profile 轨道 | 例外:如果存在第二个 profile,它就留着——否则你没法切换 |
| 终端 / 文件浏览器 / 评审面板 | 面板本身 |
| 工具调用的技术视图与行内代码 diff | 对话里那些大块 JSON 和彩色 diff |
| Artifacts 与 Scheduled jobs 侧边栏行 | 以及所有标为 Advanced 层级的插件贡献行 |
| HUD、翻转、右侧栏这几个标题栏按钮 | 包括插件贡献的标题栏工具 |
| 子代理 / 后台进程状态组 | 状态区里的这两组 |
| 输入框的 git 行、PR 与 profile 过滤行 | 输入框周围的这些小控件 |
| 思考过程默认折叠 | 不是删掉,是折叠 |
Simple 明确保留的东西:对话本身、Sessions 与 Bots、新建会话、Capabilities 与 Messaging(这两块是“怎么把 Hermes 配起来”的入口,所以要留)、标题栏里的设置与布局编辑器、所有快捷键、⌘K、Todos、Goal、Queue、预览 chips、计费与免费额度提示,以及代理的 focus_pane。另外,Ctrl 加反引号那个组合键在 Simple 里依然会为当前会话打开终端——保留一个逃生口。
Simple 的布局编辑器也被简化了:只有模式选择器加两张卡片,“侧边栏在左”和“侧边栏在右”。模板、已保存的布局、保存当前布局,都归 Advanced。
它是怎么切换的
三个入口,改的都是同一个状态:
- 布局编辑器里的模式选择器;
- 设置 → Appearance → Window & layout;
- ⌘K 里的那一条。
底层是一个可重新绑定快捷键的动作 view.toggleSimpleMode,状态存在 hermes.desktop.interfaceMode.v1 这个键下。
为什么这个实现方式比“预设”聪明
这是这次改动里最值得学的一段设计。很多应用的“简易模式”是一份预设:切过去的时候,它把你的偏好挨个改写一遍;切回来的时候,它得想办法复原——于是要么存一份快照,要么尽力猜,猜错了你的布局就没了。
Hermes 走的是另一条路:模式是一个解析器输入,不是一个会写偏好的预设。 只有一条优先级,只有一个地方定义它:
effective(surface) = sessionReveal ?? policy[mode] ?? userPreference
拆开看就是三层,从高到低:
sessionReveal(本次会话的临时显露) —— 优先级最高。你在 Simple 里用 Ctrl 加反引号把终端叫出来,这个动作落在会话层,重启或切换模式就清掉了。所以“模式是默认值,不是锁”,而且这个临时显露不会污染你在另一种模式下设的偏好。policy[mode](模式策略) —— 而policy.advanced是空对象。这一点很关键:Advanced 不是因为“被设成了显示全部”而显示全部,而是因为它什么都不覆盖,于是自然落到你自己的偏好上。用代码里的话说,Advanced 是“模式的缺席”,存储上编码成“没有这个键”。userPreference(你自己的偏好) —— 兜底。
这条链带来几个很实在的好处:
- 老用户升级后什么都没变。 因为 Advanced 是空策略,不需要往你的存储里写任何东西。
- Simple 是“遮蔽”而不是“覆盖”。 它不会改写你的偏好转,所以离开 Simple 时,你原来那套布局原样回来——不需要快照,也没有需要修复的东西。
- 一种模式改不动另一种模式的偏好。 而如果这个操作本质上是“布局意图”(比如点了一个会展开面板的布局选择),在被遮蔽的状态下这个写入会被丢弃,因为“我想现在看一眼”和“我要改默认布局”是两件事。
还有一个工程上的细节挺漂亮:使用模式的组件从来不知道“模式”这个词。 每个偏好 store 把自己的原子包一层 modeBound,然后仍用原来的名字导出“生效值”,消费者一行都不用改;列表类界面则给自己的条目打一个 tier 标签,在它本来就有的那个过滤点上多跑一次 shownInMode。于是“模式”这个概念始终只有一处主人,不会渗进几十个组件里变成一团 if。
该选哪个
- 给不写代码的人用 → Simple。 他们的任务就是对话,状态栏和 diff 对他们只是压力。
- 自己调试 Hermes、盯子代理、看工具参数 → Advanced。 这些信息正是你要的。
- 想专心写东西 → 临时切 Simple。 不用担心它动你的布局,切回来就是原样。
如果你想先把桌面端的工作流铺开再切模式,布局与工作区那篇讲的是布局编辑器本身,桌面技能中心讲能力从哪里来,读、预览、浏览器讲的正是 Simple 会收起来的那几个面板。快捷键的地基在命令面板指南里。
小结
“简易模式”最容易做坏的地方,是把它做成一份会改写用户偏好的预设——切来切去,最后谁也不知道原始布局是什么。这里的做法是:模式只做显示层的解析输入,Advanced 定义为“空策略”,Simple 定义为“遮蔽”。 结果是升级无感、切换无损、临时显露可回收。功能一个都没少,只是有些先收起来了。