---
title: 核心概念
description: Fyolo 由这几个名词构成——设备、工作区、项目、会话、窗格、worktree——再加上一套状态模型，告诉你哪个 Agent 需要你。
x-i18n:
  source_path: concepts.mdx
  source_hash: cf86c1617ebe6aacb459c0e312ec6ae0079ea45125fff40ec16ac02ef44267b9
  generated_at: 2026-10-10
---

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

## 设备 [#device]

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

本机也是一台普通设备，所以在你添加第二台之前，这一层是看不见的。见
[设备](/zh-CN/docs/devices)。

## 工作区 [#workspace]

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

每个工作区都只属于一台设备——设备这个问题因此只在最顶上回答一次，不必对每个项目再问
一遍。`⌘1` 到 `⌘9` 在它们之间切换。见 [工作区](/zh-CN/docs/workspaces)。

## 项目

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

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

## 会话

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

有三点很关键：

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

## 窗格 [#pane]

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

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

<DocsImage
  src="/screenshots/docs/03-grouped-panes.png"
  alt="一个 Fyolo 项目包含三个已编组的窗格，分别显示 Agent、拆分树测试和文档预览"
  width={2424}
  height={1664}
/>

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

## Worktree

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

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

<Callout type="note" title="「工作区」指的是侧栏的作用域">
  在这里，一台机器上检出的仓库叫*项目*，同一个仓库的第二份检出叫 *worktree*。工作区这个
  词留给侧栏里那个具名的作用域——尽管别的工具会拿它指文件夹。
</Callout>

## 状态 [#status]

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

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

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

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

### 信号从哪里来

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

1. **程序自己汇报的状态。** 支持 [program status 协议](https://mitchellh.com/writing/program-status-osc7501)（`OSC 7501`）的程序，
   会直接通过终端告诉 Fyolo 它在做什么——Claude Code 从 2.1.295 起、Pi 从 1.1.0 起都支持。
   不用安装任何东西，在远程机器上也一样。
2. **Agent 自己的 hooks。** 首次运行时，Fyolo 会把状态 hooks 写进每个支持 hooks 的
   Agent 配置里，让 Agent 自己汇报每一轮。程序自己汇报状态时，hooks 只补充细节，比如它正在
   运行的工具。你不需要配置任何东西。参见[会话控制](/zh-CN/docs/session-control)。
3. **终端内的带内信号。** Agent 本来就会发出的进度和标题序列（`OSC 9;4`、`OSC 777`）
   会被直接从流里读出——Grok 就是这样在没有 hooks 的情况下汇报忙碌与空闲的。
4. **屏幕，作为最后手段。** 对两者都没有的 Agent，Fyolo 会观察窗格里是否出现「正在
   等待输入」的提示形态，并且只有在这一判读稳定持续后才提升状态。

<Cards>
  <Card href="/zh-CN/docs/first-session" title="你的第一个会话">
    打开项目，启动 Agent，拆分窗口。
  </Card>
  <Card href="/zh-CN/docs/agents" title="同时运行多个 Agent">
    把侧栏当作一支队伍的控制台。
  </Card>
  <Card href="/zh-CN/docs/workspaces" title="工作区">
    决定一个项目在哪台机器上打开的那个作用域。
  </Card>
  <Card href="/zh-CN/docs/devices" title="设备">
    把工作区放到另一台机器上，并在那儿装好 Fyolo server。
  </Card>
</Cards>
