核心概念

Termio 由四个名词构成——项目、会话、窗格、worktree——再加上一套状态模型,告诉你哪个 Agent 需要你。

Markdown

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没有待办,或者你正看着它。无标记
workingAgent 正在处理一轮任务。彗星标记取代会话图标
doneAgent 在你去别处时完成了。绿点——可以看了
needs-youAgent 被你挡住了:权限确认、一个提问。橙色圆环——在等你

一轮完成是 done,绝不是 needs-you。把两者混为一谈,正是让一支 Agent 队伍变成一堆 警报的原因:如果什么都在要你注意,那就等于什么都不要。Termio 让「可以看了」保持平静, 把响亮的那种状态留给真正无法自行继续的 Agent。

这些状态会向上汇总:项目那一行概括它的会话,菜单栏托盘概括全部,于是你在别的应用里 也能盯着整支队伍。

信号从哪里来

能不靠猜的地方,Termio 就不从像素上猜。它按可信度依次读取:

  1. Agent 自己的 hooks。 首次运行时,Termio 会把状态 hooks 写进每个支持 hooks 的 Agent 配置里,让 Agent 自己汇报每一轮。你不需要配置任何东西。参见 会话控制
  2. 终端内的带内信号。 Agent 本来就会发出的进度和标题序列(OSC 9;4OSC 777) 会被直接从流里读出——Grok 就是这样在没有 hooks 的情况下汇报忙碌与空闲的。
  3. 屏幕,作为最后手段。 对两者都没有的 Agent,Termio 会观察窗格里是否出现「正在 等待输入」的提示形态,并且只有在这一判读稳定持续后才提升状态。
文档