核心概念
Termio 由四个名词构成——项目、会话、窗格、worktree——再加上一套状态模型,告诉你哪个 Agent 需要你。
Termio 是一个用来同时运行多个编程 Agent 的终端。应用里的一切都由四个名词和一套状态 模型构成。搞懂这几个,剩下的文档读起来会很快。
项目
项目就是你 Mac 上的一个文件夹——通常是一个仓库。它是侧栏分组的单位,也是其中每个 会话的起始工作目录。
打开项目不会复制或索引任何东西。Termio 只记住路径,其余的从 git 读。
会话
会话是一个真实终端,跑着一件事:一个 Agent、一个开发服务器,或一个普通 shell。每个
会话拥有一个 PTY——和 ssh 或「终端」应用给进程的那种终端完全一样——由
libghostty(Ghostty 的终端内核)负责渲染。
有两点很关键:
- 你不看它的时候,会话照常运行。 切到别的会话、隐藏窗口,或者去用别的应用, Agent 都在继续干活。它的输出会被缓冲,等你回来时重绘。
- 会话是可寻址的。 每个会话都有稳定的 URL,
termio://session/<uuid>;菜单栏 托盘、通知,以及termio命令行工具,靠它把某个会话带到最前面。
会话活不过应用退出
退出 Termio 会结束它的所有终端。持久保留的是工作台的形状——会话树、上次选中的会话、
检查器布局——所以重新启动会恢复同样的列表,但 shell 是新的。能撑过一次退出(以及一次
合盖)的会话,是 termiod 会话宿主正在解决的问题,不是今天这个应用做的事。
窗格
窗格是会话在屏幕上的位置。一个会话通常占满窗口,而拆分其实是把另一个会话编组到它 旁边——左边一个 Agent,右边一个开发服务器和一个 shell。
窗格是视图层面的概念,不是第二种会话:窗格里的东西是一个完整的会话,有自己的侧栏行和 自己的状态。这也是为什么动词是 编组到 和 取消编组,而不是「拆分」和「关闭窗格」 ——编组改变的是会话怎么排布,不是它们是什么。
绑定见 键盘快捷键。
Worktree
git worktree 是同一个仓库的第二份检出,位于自己的分支上。当两个 Agent 同时动一个仓库 时,worktree 正是让它们互不干扰文件的东西。
Termio 直接从 git 读取(git worktree list),而不是自己另存一份,并把每个 worktree
显示为项目下嵌套的文件夹。你在应用里创建,或者在命令行用 git worktree add 创建,
两边看到的都一致,因为 git 才是事实来源。参见 Git worktree。
状态
每个会话都会汇报它此刻在做什么。一共四种状态,而最后两种之间的区分正是整套模型的意义 所在:
| 状态 | 含义 | 看起来是什么样 |
|---|---|---|
idle | 没有待办,或者你正看着它。 | 无标记 |
working | Agent 正在处理一轮任务。 | 彗星标记取代会话图标 |
done | Agent 在你去别处时完成了。 | 绿点——可以看了 |
needs-you | Agent 被你挡住了:权限确认、一个提问。 | 橙色圆环——在等你 |
一轮完成是 done,绝不是 needs-you。把两者混为一谈,正是让一支 Agent 队伍变成一堆
警报的原因:如果什么都在要你注意,那就等于什么都不要。Termio 让「可以看了」保持平静,
把响亮的那种状态留给真正无法自行继续的 Agent。
这些状态会向上汇总:项目那一行概括它的会话,菜单栏托盘概括全部,于是你在别的应用里 也能盯着整支队伍。
信号从哪里来
能不靠猜的地方,Termio 就不从像素上猜。它按可信度依次读取:
- Agent 自己的 hooks。 首次运行时,Termio 会把状态 hooks 写进每个支持 hooks 的 Agent 配置里,让 Agent 自己汇报每一轮。你不需要配置任何东西。参见 会话控制。
- 终端内的带内信号。 Agent 本来就会发出的进度和标题序列(
OSC 9;4、OSC 777) 会被直接从流里读出——Grok 就是这样在没有 hooks 的情况下汇报忙碌与空闲的。 - 屏幕,作为最后手段。 对两者都没有的 Agent,Termio 会观察窗格里是否出现「正在 等待输入」的提示形态,并且只有在这一判读稳定持续后才提升状态。