文档 · 会话与分组
会话与分组
每个智能体都是一个真正的 tmux 会话,有自己的目录、命令和环境。退出管理器,它们照常工作;合上笔记本盖子,它们也还在。
模型、推理强度和 profile
n 表单在 tool 下方有 model 和 effort
两行,支持 profile 的工具在它们上方还有一行 profile。快速提示模式在
ctrl+l、ctrl+x 和 ctrl+y 上提供同样的选项,agent-manager spawn 则接受 --model、--effort 和
--profile。所有取值都来自 CLI 本身,通过它为程序提供的接口查询得到,所以下周发布的新模型无需等 Agent Manager 发新版就会出现在列表里。
不去动的话,每一行都保持 CLI 自己的默认值,也就是你在该 CLI 里的设置。每个 CLI 会记住你上次为它选的模型、推理强度和 profile,该 CLI 的下一个会话就从这些值开始。模型列表随输入过滤,最近选过的排在最前,只能选列表里有的模型。推理强度一行列出所选模型支持的级别。这些选择保存在会话上,因此重启(R)、恢复(v)和分叉(f)都沿用它们。
| CLI | 查询方式 | 模型 | 推理强度 | Profile |
|---|---|---|---|---|
| Claude Code | Agent SDK 的 initialize 请求 | 支持 | 按模型 | · |
| Codex | codex app-server | 支持 | 按模型,带默认值 | 不支持 |
| Grok Build | 通过 grok agent stdio 走 ACP | 支持 | 按模型 | · |
| Pi | pi --mode rpc | 支持 | 按模型 | · |
| Oh My Pi | omp --mode rpc | 支持 | 按模型 | · |
| Muse Code | muse serve | 支持 | 按模型 | · |
| OpenCode | opencode models | 支持 | 不支持 | · |
| Gemini CLI | 通过 gemini --acp 走 ACP | 支持 | 不支持 | · |
| Hermes Agent | hermes serve | 按 profile,连同提供商 | 手动输入 | 支持 |
| Antigravity CLI | 暂未查询 | 不支持 | 不支持 | · |
| Command Code | 没有可供程序查询的接口 | 不支持 | 不支持 | · |
| Cursor CLI | 通过 cursor-agent acp 走 ACP | 支持 | 包含在模型 id 中 | · |
CLI 无法提供的行显示为 "not supported"(不支持)。OpenCode 和 Gemini CLI 启动时不接受推理强度参数。Cursor CLI 把推理强度放在模型 id 里,所以表单不单独提供推理强度控件。Hermes 会告诉你哪些模型支持推理,但不告诉具体级别,所以它的推理强度需要手动输入,并且只有支持推理的模型才显示这一行。Pi 的模型列表需要 Pi 0.84.3 或更高版本,旧版 Pi 会改为打开更新对话框。CLI 因其他原因没有响应时,模型一行会说明原因,会话以 CLI 的默认值启动,半分钟后下一次打开表单会重新查询。查询结果在配置目录的 catalogs 下缓存六小时,CLI 升级后会立即重新查询。
每个会话独立的 git worktree
在同一个仓库上并行工作的多个智能体可以各自拥有一份私有检出。n 表单在目录和提示词之间有一个 worktree 字段,快速提示模式下向分组启动会话时,ctrl+t 起同样的作用。两者在管理器运行期间都沿用你上次选的工具和 worktree 选项,在那之前的初始值由设置决定。
worktree 位于仓库旁边的 <repo>-worktrees/<name>,使用新分支
am/<name>。它从仓库工作最终合入的分支开始:仓库有 upstream
远程时取它的默认分支,否则依次取 origin 的默认分支、本地的 main 或
master,最后是 HEAD。分组可以通过 g 表单或其编辑卡片里的
base 行自己指定起点,保持 auto 的分组沿用父分组的设置。当表单或快速提示模式设为启动 worktree 时,管理器会从远程拉取那一个分支,同一目录最多每分钟一次,设置中的 fetch on spawn 行可以关闭这一行为。worktree 创建失败会以错误阻止这次启动。不是 git 仓库的路径无法容纳 worktree,此时该字段显示为不可用,会话作为普通会话在那里启动。
从 upstream 开始的分支会继续跟踪该远程,所以 git pull 拉取上游的改动,git push 把分支推送到 origin,也就是你的 fork。如果你已经设置了
remote.pushDefault,git push 会使用它。
重命名会话会把它的分支改名为 am/<new name>,worktree 目录保留在创建时的路径,这样正在运行的智能体的工作路径依然有效。删除会话会移除干净的 worktree 及其分支。干净指没有未提交的改动,也没有只存在于该 worktree 中的提交。已经进入 base 的分支算作已合并,在 git 2.38
或更高版本上 squash 合并也算。已推送的提交不妨碍移除 worktree,本地分支会保留,让这些提交仍可访问。有改动的 worktree 会留在磁盘上,状态行显示它的路径。是否干净以 git status
为准,所以 .env 这类被 gitignore 的文件会随目录一起删除。结束、归档和恢复都不会动 worktree。
终端标签页
T 打开一个 shell 标签页:它和其他会话一样,只是面板里跑的是你的 shell 而不是智能体。在智能体上按,新 shell 嵌套在该会话下,位于该智能体的分组和目录。在分组上按,它作为不嵌套的同级项落在该分组中。嵌套的 shell 以所属会话命名,例如 terminal-review-done,而不是生成的 id。shell 与它们所属的智能体一起显示在树中,在智能体显示状态圆点的位置标记为
❯。在终端上按 m 可以把它移到某个智能体或分组下。
向面板写入内容的按键不作用于 shell。space 和审查界面的 C 都会粘贴文本并按下 Enter,所以在 shell 上,本来写给智能体的一句话会被当作命令执行。要在那里输入,请进入该会话。
结束会话但保留行
x 结束一个占着你想收回的内存的会话,在分组行上则结束其下所有运行中的会话。X 结束视图中所有运行中的会话。两者都会先请求确认,结束的是 tmux 会话而不是记录:该行仍留在树中,标记为 dead,名称、分组和对话 id 都完好无损。
一组智能体今晚的活干完了。在分组上按 x 释放内存,行都留着。第二天早上在分组上按
v,同样的那些对话就回来了。
恢复同一个对话
v 以原来的 id 重新启动已结束的会话,保留它的名称、分组和历史。当管理器持有该会话自己的对话 id 时,恢复会通过工具的 resume_by_id_command 接上那个确切的对话。智能体用 /clear、/new、/resume 或 /fork
切换到别的对话时,行会跟过去,因此 v 重新打开的是那个对话,而不是会话最初的对话。只有本次启动的那个智能体会让行跟着走。被它当作工具调用的 CLI,或在面板里手动输入启动的 CLI,都不会改变行。Cursor CLI 固定在启动时捕获的那个聊天上。各工具的命令如下:
claude --resume {id}
codex resume {id}
opencode --session {id}
grok --resume {id}
gemini --resume {id}
pi --session {id}
cmd --session {id}
hermes --cli --resume {id}
muse resume {id}
agy --conversation {id}
omp --resume {id}
cursor-agent --resume {id}
id 有两种获取方式:
| 字段 | id 的获取方式 |
|---|---|
| session_id_flag | 工具以管理器生成的 id 启动。 |
| session_store | 工具自己生成 id,再由捕获器读回(codex、opencode、gemini、hermes、command-code、muse、antigravity、omp、cursor)。 |
revive_command(claude --continue),它接上该目录最近的一个对话,管理器会在状态行说明这一点,因为共用同一目录的会话可能会接错对话。
在分组行上,v 恢复其下所有已结束的会话,V 恢复视图中所有已结束的会话。涉及多个会话时,两者都会先请求确认。它们会尽量恢复能恢复的,遇到失败继续往下,并报出第一个失败的会话。
分叉对话
光标下的会话试了一种做法。f 新建一个你命名的第二个会话,从同一段历史继续,位于同一分组和目录,让另一种做法在旁边并行。它运行工具的 fork_command,该命令通过 {id}
或 {session_file} 引用源会话,所以分叉既需要这条命令,也需要已捕获的对话 id。没有对话 id 的会话或 shell 会说明原因,而不进行分叉。Claude Code、OpenCode、Codex、Grok Build、Gemini CLI、Pi、Command Code 和 Muse Code 自带分叉命令。Hermes Agent、Antigravity CLI、Oh My Pi
和 Cursor CLI 不支持分叉。Muse 只能在运行中的源会话内部分叉,所以 f 会向该会话输入
/fork,并在新面板中打开分叉。源会话必须处于静止状态,且提示符处没有已输入的内容。
以空上下文重启
R 保留行、丢掉上下文:名称、分组、工具和目录不变,以智能体从未见过的新对话启动。会话积累了一堆用不着的上下文时就该用它,恢复则会花预算重读历史。它会先请求确认,对运行中的会话同样有效,会先结束正在运行的智能体再启动新的。旧对话被弃用而不是恢复,它留在磁盘上,行不再指向它,并且只有新智能体启动成功后行才会切换过去,所以启动失败时会话仍停在原来的对话上。
全屏
设置(s)中的 sessions layout 行可以让会话列表占满整个终端:← 或 → 切换到全屏,预览列让开,每一行都占满整个宽度。本机仪表压缩成按键说明上方的一行,在某一行上按 → 会在整个主体区域聚焦该会话。有未读消息时,View 底栏会把 M unread 画成实心标签,点击即可打开消息。同样的按键可以把布局切回分屏,这个选择和分屏比例一样会被记住。
list density 行决定两种布局下各行的疏密。Compact(紧凑)让每个会话只占一行,智能体的最后一条消息跟在名称旁边。Comfortable(宽松)把每个会话展开为三行:名称、❯
后面你的最后一条消息,以及其下智能体的最后一条消息。
另一台机器上的会话
C 添加一个 SSH 连接:名称、目标(user@host 或 ~/.ssh/config
中的别名),以及可选的 agent-manager 在对方机器上的位置。对方机器运行 Linux 或 macOS,其登录
shell 的 PATH 上有 agent-manager,本机的 ssh 需要一把无需输入口令即可使用的密钥。管理器从不询问密码,也从不修改你的 SSH 配置。请先手动连接一次(ssh user@host),让主机密钥被记录下来。从未连接过的主机会显示为 unreachable。
连接显示在列表中你自己的分组之后,有自己的颜色和 ssh 标签,对方机器的分组、智能体和终端都嵌套在它下面。它可以像分组一样折叠。每次轮询都会在后台刷新它。刷新失败的主机保留上次的行,并附一条说明原因的提示(unreachable、agent-manager
missing、agent-manager too old、agent-manager newer 或
error),之后隔一段时间重试,间隔逐渐增加到半分钟。第一次刷新会在那里启动一个无界面的管理器,agent-manager serve --background,让发给那边智能体的消息能够送达。
| 按键 | 在连接的行上 |
|---|---|
| enter / A | 在当前终端通过 SSH 进入(attach)。退出(detach)后回到管理器。远程面板从不嵌入显示。 |
| space | 以你的身份向远程智能体的面板输入,或按输入栏显示的 CLI、模型、推理强度和 profile 在那里启动新智能体。 |
| n | 在那里启动一个智能体。除非你另行设置,目录和 worktree 默认值取对方机器的。 |
| T / g | 在那里打开终端,或在那里创建分组。 |
| x / v / a / u | 结束、恢复、归档和还原。 |
| r / d | 在连接行上:编辑或移除它。移除前会先确认,它的会话在那台主机上继续运行。 |
重命名、移动、删除、重启、分叉、审查、编辑器、复制回复、重新排序、标记为空闲、取消回合结束后的结束操作,以及全部结束和全部恢复,在远程行上都会被拒绝,并提示缺少的功能。连接中的任何内容都不会写入本机的存储。智能体也能通过 MCP 使用连接,所以只为你愿意让所有智能体使用的主机添加连接。
分组是一棵树
分组是 backend/api/auth 这样的路径,构成一棵深度不限的树,会话可以位于任意节点,包括根节点。
| 按键 | 操作 |
|---|---|
| g | 就地创建子分组。 |
| enter | 折叠子树。F 折叠或展开全部。 |
| e | 隐藏或恢复显示空分组。 |
| r | 编辑分组的名称、默认路径和 worktree base。 |
| K / J | 在同级之间重新排列会话,或在同级之间重新排列整个分组。顺序会被保存。 |
| m | 把会话移到某个分组,把终端移到某个会话下,或把分组移到另一个分组下。 |
| a / u | 归档 / 还原会话或分组。归档会结束进程并保留最后的预览;还原会接上它。还原时会一并取消所需祖先分组的归档。 |
| t | 切换归档视图。 |
会话自己命名
没有指定名称就启动的会话会得到一个类似 claude-a1b2 的占位名,它的第一条提示词开头会请智能体运行一次 agent-manager rename,用一个简短的名称概括它正在做的整体功能,而不是某个单独的子任务。该指令还会告诉智能体,除非你要求,否则不要再次重命名。
当第一条提示词无法携带该指令时,比如它是一条 /slash 命令,或者根本没有提示词,管理器会在工具的输入框出现后单独发送这条指令。该子命令把名称写入每个会话各自的文件,管理器在下一次轮询时读取它。
agent-manager rename。