Agent 工具、fork agent、Coordinator Mode、Agent Teams / Swarm、remote agent、后台 runtime task、TaskCreate 任务白板。它们共享部分底层设施,但不是同一个抽象。
这篇文档解决的是跨机制理解问题:当你看到一个任务被“派出去”、一个 teammate 变成 idle、一个 <task-notification> 回到主线程、一个 team 目录还在但 teammate 不跑了,应该知道它属于哪套机制、状态放在哪里、通信走哪条路、哪些东西能恢复。
全局心智模型
最短心智模型是:系统分层
多 Agent 系统可以看成五层,每层回答一个问题:
这五层不是一一对应关系。Coordinator worker 在运行层是
LocalAgentTask,通信层靠 <task-notification> 和 SendMessage(to: agentId);Swarm teammate 在运行层可能是 InProcessTeammateTask,通信层靠 mailbox;remote agent 在运行层是本地 RemoteAgentTask 镜像,真实执行状态来自 CCR。
什么时候用哪套机制
两个常见误判:
两种多 Agent 拓扑
Coordinator 和 Swarm 都是多 Agent,但控制权和状态模型完全不同。
Coordinator Mode 不是 Swarm 的特殊 Team Lead。它共享
AgentTool、LocalAgentTask、SendMessage 等设施,但不使用 TeamCreate/TeamDelete/TaskList/TaskUpdate 作为核心团队协作机制。
Coordinator Mode 五段状态机
Coordinator Mode 的核心设计是把主 Claude 降级为编排器:主线程不直接Read/Edit/Bash,而是拆任务、派 worker、综合结果、必要时停止或继续 worker。
1. 启用状态机
两层条件都满足才算进入 Coordinator:2. 恢复状态机
Coordinator mode 是会话属性,写在主 session JSONL 的mode entry 中:
3. Prompt 状态机
Coordinator prompt 不是只看 env。交互 REPL 侧大致优先级是:
风险点是
--agent 和 Coordinator 混用:可能出现工具池已经按 coordinator 过滤,但 system prompt 不是 coordinator 的不一致。
Headless 也要单独看。当前 headless 路径明确做了 coordinator 工具过滤,并注入 coordinator user context;但 system prompt 组装路径和交互 REPL 不完全相同,应把它当成需要复核的边界,而不是默认等同交互路径。
4. 工具过滤状态机
Coordinator 主线程和 worker 的工具池不同:
交互路径主要走
mergeAndFilterTools();headless 路径会在主入口直接应用 coordinator 工具过滤;worker 工具池由 AgentTool 独立组装,不继承主线程被过滤后的工具池。
5. Worker lifecycle
Coordinator 下Agent(worker) 会被强制异步:
<task-notification> 是 user-role message,但不是用户输入。Coordinator prompt 必须把它当成 worker 结果信号:
Coordinator 边界与排错
Swarm 完整状态机
Swarm 的核心是团队,而不是一次Agent 调用。TeamCreate 建 team,Agent({ name }) 加 teammate,TaskCreate/Update/List/Get 提供任务白板,SendMessage 和 mailbox 提供通信与控制。
当前实现默认启用 Agent Teams;设置 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS_DISABLED 才会关闭。
团队生命周期
关键不变量:存储拓扑
Swarm 的核心状态在~/.claude/teams 和 ~/.claude/tasks:
TeamCreate 到 teammate 的链路
TeamCreate 不只是写 config.json。它还会注册 session cleanup、重置 team 对应 task list、设置 leaderTeamName,并把 leader 投影到 AppState.teamContext。
AgentTool 遇到 team_name/current teamContext + name 时走 teammate spawn 分支,不走普通 runAgent()。spawnTeammate() 会解析 team、唯一化 name、选择 backend、更新 AppState.teamContext.teammates,再追加 TeamFile.members。
in-process vs pane-based teammate
AgentTool 分流决策树
AgentTool.call() 是多 Agent 入口最复杂的分叉点。同一个 Agent 工具会根据参数和上下文走不同运行时:
所以文档里不能把“Agent”写成一个单一概念:同一个工具入口下面至少有五条运行路径。
通信路径对照
多 Agent 的通信路径决定了结果是否进入当前 turn、是否持久化、能不能 resume。SendMessage 路由
plain textSendMessage 要带 summary。structured message 不能 broadcast,也不能跨 uds/bridge/tcp session。单 session 下 teammate name 是裸 name,to 不应写成含 @ 的跨域地址。
Mailbox 协议表
Mailbox 路径是:
协议消息不只是“聊天”:
一个重要边界:mailbox attachment 只消费非结构化消息;结构化协议消息应保持 unread,交给
useInboxPoller 或 in-process runner 路由。否则权限、plan、shutdown 可能被当成普通上下文吞掉。
Task 不是 Runtime Task
TaskCreate 的 task 和 LocalAgentTask 的 task 是两套模型。
共享任务生命周期:
TaskUpdate 在 Swarm 下有增强:
runtime task 类型包括:
持久化与恢复矩阵
恢复能力取决于状态放在哪里。最重要的区别是:能看到状态不等于能继续运行。
调试时可以按这个顺序问:
- 文件还在吗?
AppState投影还在吗?- runtime task 还在
running吗? - 通信通道还可用吗?
- sidechain / inbox / remote sidecar 是否足够恢复?
用户可见状态如何投影
UI 展示的是不同状态源的投影,不是单一真相。
pane-based team 主要通过 footer TeamStatus 和 TeamsDialog 管理:Enter 查看,
k kill,s shutdown,p prune idle,Shift+Tab 切 permission mode。in-process teammate 的 transcript view 输入会进 pendingUserMessages,不是写 mailbox。
两条端到端场景
复杂 bug 用 Coordinator
这个流程没有
TeamCreate,也不依赖 shared task list。
长期并行任务用 Swarm
这个流程里 team、task list 和 mailbox 是核心。teammate 输出不会自动给 lead;需要
SendMessage 或明确的协议消息。