跳到正文
文档目录

基础

核心概念

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

Termio 是一个用来同时运行多个编程 Agent 的终端。应用里的一切都由六个名词和一套状态 模型构成。搞懂这几个,剩下的文档读起来会很快。

设备

设备就是你能连上的一台机器:本机、同一张桌子上的 Mac mini、一台 VPS。Termio 读 ~/.ssh/config 找到它们,调用系统的 ssh 过去——它不开通机器,也不中转你的流量。

本机也是一台普通设备,所以在你添加第二台之前,这一层是看不见的。见 设备。

工作区

工作区是侧栏里一个具名的作用域,装着项目和零散的终端。切到某个工作区,侧栏列出的内容 就跟着换,而每个工作区都记得你离开时停在哪个会话上。

每个工作区都只属于一台设备——设备这个问题因此只在最顶上回答一次,不必对每个项目再问 一遍。⌘1 到 ⌘9 在它们之间切换。见 工作区。

项目

项目就是某台设备上的一个文件夹——通常是一个仓库。它是侧栏分组的单位,也是其中每个 会话的起始工作目录。

打开项目不会复制或索引任何东西。Termio 只记住路径,其余的从 git 读。

会话

会话是一个真实终端,跑着一件事:一个 Agent、一个开发服务器,或一个普通 shell。每个 会话拥有一个 PTY——和 ssh 或「终端」应用给进程的那种终端完全一样——由 libghostty(Ghostty 的终端内核)负责渲染。

有三点很关键:

  • 你不看它的时候,会话照常运行。 切到别的会话、隐藏窗口,或者去用别的应用, Agent 都在继续干活。它的输出会被缓冲,等你回来时重绘。
  • 会话属于它那台设备,不属于应用。 每个会话——包括本机上的——都跑在 Termio server termiod 里,应用只是一个附着上去的查看器。关掉窗口,Agent 继续干活;SSH 断了, 也只是把你分离,不会杀掉任何东西。只有关闭会话才是有意结束一个会话。 什么会留下来是完整的那张表。
  • 会话是可寻址的。 每个会话都有稳定的 URL,termio://session/<uuid>;菜单栏 托盘、通知,以及 termio 命令行工具,靠它把某个会话带到最前面。

窗格

窗格是会话在屏幕上的位置。一个会话通常占满窗口,而拆分其实是把另一个会话编组到它 旁边——左边一个 Agent,右边一个开发服务器和一个 shell。

窗格是视图层面的概念,不是第二种会话:窗格里的东西是一个完整的会话,有自己的侧栏行和 自己的状态。这也是为什么动词是 编组到 和 取消编组,而不是「拆分」和「关闭窗格」 ——编组改变的是会话怎么排布,不是它们是什么。

一个 Termio 项目包含三个已编组的窗格,分别显示 Agent、拆分树测试和文档预览

绑定见 键盘快捷键。

Worktree

git worktree 是同一个仓库的第二份检出,位于自己的分支上。当两个 Agent 同时动一个仓库 时,worktree 正是让它们互不干扰文件的东西。

Termio 直接从 git 读取(git worktree list),而不是自己另存一份,并把每个 worktree 显示为项目下嵌套的文件夹。你在应用里创建,或者在命令行用 git worktree add 创建, 两边看到的都一致,因为 git 才是事实来源。参见 Git worktree。

「工作区」指的是侧栏的作用域

在这里,一台机器上检出的仓库叫项目,同一个仓库的第二份检出叫 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;4、OSC 777) 会被直接从流里读出——Grok 就是这样在没有 hooks 的情况下汇报忙碌与空闲的。
  3. 屏幕,作为最后手段。 对两者都没有的 Agent,Termio 会观察窗格里是否出现「正在 等待输入」的提示形态,并且只有在这一判读稳定持续后才提升状态。
文档