---
title: 核心概念
description: Termio 由四个名词构成——项目、会话、窗格、worktree——再加上一套状态模型，告诉你哪个 Agent 需要你。
x-i18n:
  source_path: concepts.mdx
  source_hash: 66c4578358665991f506ac41f0fd4306d18cf272a564c40f18e815b437886618
  generated_at: 2026-08-10
---

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

## 项目

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

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

## 会话

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

有两点很关键：

- **你不看它的时候，会话照常运行。** 切到别的会话、隐藏窗口，或者去用别的应用，
  Agent 都在继续干活。它的输出会被缓冲，等你回来时重绘。
- **会话是可寻址的。** 每个会话都有稳定的 URL，`termio://session/<uuid>`；菜单栏
  托盘、通知，以及 `termio` 命令行工具，靠它把某个会话带到最前面。

<Callout type="note" title="会话活不过应用退出">
  退出 Termio 会结束它的所有终端。持久保留的是工作台的*形状*——会话树、上次选中的会话、
  检查器布局——所以重新启动会恢复同样的列表，但 shell 是新的。能撑过一次退出（以及一次
  合盖）的会话，是 `termiod` 会话宿主正在解决的问题，不是今天这个应用做的事。
</Callout>

## 窗格 [#pane]

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

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

绑定见 [键盘快捷键](/zh-CN/docs/keyboard#panes)。

## Worktree

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

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

## 状态 [#status]

每个会话都会汇报它此刻在做什么。一共四种状态，而最后两种之间的区分正是整套模型的意义
所在：

| 状态 | 含义 | 看起来是什么样 |
| --- | --- | --- |
| `idle` | 没有待办，或者你正看着它。 | 无标记 |
| `working` | Agent 正在处理一轮任务。 | 彗星标记取代会话图标 |
| `done` | Agent 在你去别处时完成了。 | 绿点——*可以看了* |
| `needs-you` | Agent 被你挡住了：权限确认、一个提问。 | 橙色圆环——*在等你* |

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

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

### 信号从哪里来

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

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

<Cards>
  <Card href="/zh-CN/docs/first-session" title="你的第一个会话">
    打开项目，启动 Agent，拆分窗口。
  </Card>
  <Card href="/zh-CN/docs/agents" title="同时运行多个 Agent">
    把侧栏当作一支队伍的控制台。
  </Card>
</Cards>
