File size: 11,463 Bytes
eeeb2b6 96f34e3 eeeb2b6 762b1c8 96f34e3 762b1c8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 | # Coordinator 多代理模式
## 概述
Coordinator 模式是 Codev 的一种高级执行模式,允许一个协调者(Coordinator)LLM 通过 `AgentTool` 派生子代理(Worker)并行执行任务。通过 `CLAUDE_CODE_COORDINATOR_MODE` 环境变量激活。
### 激活方式
```bash
export CLAUDE_CODE_COORDINATOR_MODE=1
```
检测逻辑位于 `src/coordinator/coordinatorMode.ts`:
```typescript
export function isCoordinatorMode(): boolean {
if (feature('COORDINATOR_MODE')) {
return isEnvTruthy(process.env.CLAUDE_CODE_COORDINATOR_MODE)
}
return false
}
```
### 会话模式匹配
`matchSessionMode()` 确保恢复的会话与当前 coordinator 模式一致。如果环境变量与会话存储的模式不匹配(例如在 coordinator 模式下创建会话,然后在 normal 模式下恢复),会自动翻转环境变量并记录事件。
---
## 工作模式
### 核心架构
```
User → Coordinator LLM → AgentTool → Worker 1
→ Worker 2
→ Worker 3 (并行)
```
- **Coordinator LLM**:接收用户请求,制定计划,派发任务,综合结果
- **Worker**:通过 `AgentTool` 派生的子代理,执行具体任务
- **通信**:Worker 结果通过 `<task-notification>` XML 格式返回
### Worker 通信格式
Worker 完成时,结果以 `user-role` 消息形式送达 Coordinator:
```xml
<task-notification>
<task-id>{agentId}</task-id>
<status>completed|failed|killed</status>
<summary>{human-readable status summary}</summary>
<result>{agent's final text response}</result>
<usage>
<total_tokens>N</total_tokens>
<tool_uses>N</tool_uses>
<duration_ms>N</duration_ms>
</usage>
</task-notification>
```
Coordinator 必须区分工作结果消息和真实用户消息:工作结果包含 `<task-notification>` 标签。
---
## 工作流:四阶段模型
### Phase 1: Research(研究)
- Coordinator 并行启动多个 Worker 进行独立研究
- 每个 Worker 负责调查代码库的不同方面
- 只读任务,可自由并行
### Phase 2: Synthesis(综合)
- Coordinator **亲自**阅读所有研究发现
- 理解问题本质,编写具体的实现规格
- **关键原则**:Coordinator 必须理解研究发现再分配任务,不能将理解工作委托给 Worker
### Phase 3: Implementation(实现)
- 根据综合后的规格派发实现任务
- 按文件集串行处理写操作,避免冲突
### Phase 4: Verification(验证)
- 独立的 Worker 验证实现结果
- 真正的验证意味着证明代码工作,而非确认代码存在
- 测试、类型检查和边缘用例
---
## 并行策略
### 只读任务全并行
研究阶段的所有 Worker 可同时启动,互不影响。
### 写任务按文件集串行
实现阶段的写操作需谨慎:同一组文件的操作需要串行执行。
### 验证与实现可部分并行
实现的不同文件区域可同时进行验证。
---
## 工具集
Coordinator 拥有以下专用工具(定义于 `src/tools/AgentTool/AgentTool.tsx`):
| 工具 | 用途 |
|------|------|
| `AgentTool`(`Agent`) | 创建新的 Worker |
| `SendMessageTool` | 向已存在的 Worker 发送后续指令 |
| `TaskStopTool` | 停止正在运行的 Worker |
| `subscribe_pr_activity` | 订阅 GitHub PR 事件 |
### AgentTool 的使用
```typescript
AgentTool({
description: "Investigate auth bug",
subagent_type: "worker",
prompt: "..."
})
```
重要规则:
- 不要用一个 Worker 去检查另一个 Worker 的状态——Worker 完成时会自动通知
- 不要为简单的文件读取或命令执行创建 Worker
- 不要设置 model 参数——Worker 使用默认模型
- 已完成工作的 Worker 应通过 `SendMessageTool` 继续使用其加载的上下文
---
## Prompt 编写规则
### Worker 看不到 Coordinator 的对话
每个 Worker prompt 必须**自包含**,包含执行任务所需的全部信息。Coordinator 不能假设 Worker 知道对话中发生过什么。
### 好的 Prompt 示例
```typescript
// 好的 prompt:包含具体路径、行号和精确指令
AgentTool({
prompt: "Fix the null pointer in src/auth/validate.ts:42. " +
"The user field can be undefined when the session expires. " +
"Add a null check and return early with an appropriate error. " +
"Commit and report the hash."
})
```
### 坏的 Prompt 示例(反模式)
```typescript
// 坏的 prompt:模糊、依赖上下文
AgentTool({ prompt: "Fix the bug we discussed" }) // 错误:Worker 看不到讨论
AgentTool({ prompt: "Based on your findings, implement the fix" }) // 错误:懒惰的委托
```
### 目的陈述
为 Prompt 添加目的说明,帮助 Worker 校准深度和重点:
- "This research will inform a PR description — focus on user-facing changes."
- "I need this to plan an implementation — report file paths, line numbers, and type signatures."
### continue vs spawn 的选择
| 场景 | 策略 | 原因 |
|------|------|------|
| 研究恰好覆盖了需编辑的文件 | **Continue**(SendMessageTool) | Worker 已有文件在上下文中 |
| 研究范围广,实现范围窄 | **Spawn fresh**(AgentTool) | 避免携带探索噪音 |
| 纠正错误或扩展近期工作 | **Continue** | Worker 有错误上下文 |
| 验证其他 Worker 的代码 | **Spawn fresh** | 验证者需以新视角查看代码 |
| 完全不同的任务 | **Spawn fresh** | 无有用上下文可复用 |
---
## 实现细节
### 核心文件
| 文件 | 路径 | 用途 |
|------|------|------|
| coordinatorMode.ts | `src/coordinator/coordinatorMode.ts` | Coordinator 模式检测、会话匹配、用户上下文构建 |
| AgentTool.tsx | `src/tools/AgentTool/AgentTool.tsx` | Agent 工具的实现 |
| builtInAgents.ts | `src/tools/AgentTool/builtInAgents.ts` | 内置 Agent 定义 |
### Worker 工具白名单
内部 Worker 工具(由 `INTERNAL_WORKER_TOOLS` 定义的集合)对 Worker 不可见:
- `TeamCreateTool`
- `TeamDeleteTool`
- `SendMessageTool`
- `SyntheticOutputTool`
在简单模式(`CLAUDE_CODE_SIMPLE`)下,Worker 仅有权访问:Bash、Read、Edit 工具,外加 MCP 工具。
### Worker 错误处理
当 Worker 报告失败时:
- 使用 `SendMessageTool` 继续同一 Worker——它保留完整的错误上下文
- 如果纠正尝试也失败,尝试不同方法或报告用户
### 停止 Worker
使用 `TaskStopTool` 停止方向错误的 Worker。已停止的 Worker 可通过 `SendMessageTool` 继续。
---
## Agent Teams(Swarm 拓扑)
### 概述
Agent Teams(Swarm 模式)是 Codev 的多 Agent 拓扑模型,通过 `feature('AGENT_SWARMS')` 编译期标记门控。与 Coordinator/Worker 模式不同,Teams 采用**文件系统邮箱通信**,每个 Agent 在独立进程中运行(tmux split-pane / in-process)。
### 激活方式
```bash
export CLAUDE_CODE_AGENT_SWARMS=1
```
### 核心架构
```
Team Lead (AgentTool team_name="my-team" name="lead")
│
├── AgentTool(name="researcher", team_name="my-team") → tmux pane / in-process
│ └── 邮箱: ~/.claude/teams/my-team/mailbox/researcher/
│
├── AgentTool(name="coder", team_name="my-team") → tmux pane / in-process
│ └── 邮箱: ~/.claude/teams/my-team/mailbox/coder/
│
└── AgentTool(name="reviewer", team_name="my-team") → tmux pane / in-process
└── 邮箱: ~/.claude/teams/my-team/mailbox/reviewer/
```
### 与 Coordinator/Worker 的区别
| 维度 | Coordinator/Worker | Agent Teams (Swarm) |
|------|-------------------|---------------------|
| 通信 | `<task-notification>` XML 消息 | 文件系统邮箱(mailbox) |
| 进程 | 同进程 | 独立 OS 进程(tmux / in-process) |
| 生命周期 | 单次任务 | 持久化团队 |
| 隔离度 | 共享上下文 | AsyncLocalStorage(in-process)或完全隔离 |
| 工具白名单 | 统一限制 | 可配置 agent_type → 自定义工具集 |
| 嵌套 | Coordinator 可 spawn worker | **禁止**团队成员 spawn 子代(仅 team lead 可) |
### 团队创建流程
1. **创建团队**: `TeamCreateTool({ name: "my-team" })` → 生成 `~/.claude/teams/my-team/config.json`
2. **设置 Leader**: 当前会话自动成为 team-lead
3. **派发成员**: `AgentTool({ name: "researcher", team_name: "my-team", prompt: "..." })`
4. **后台抉择**:
- In-process(启用时)→ 同一进程 AsyncLocalStorage 隔离
- tmux split-pane(默认)→ 新 tmux 窗格
- tmux separate-window → 新 tmux 窗口
- iTerm2 native → macOS 原生分屏
5. **通信**: 成员写入 `mailbox/{agent-name}/`,lead 轮询读取
### 邮箱通信格式
```json
{
"from": "researcher",
"text": "研究发现...",
"timestamp": 1712345678000
}
```
### 团队成员配置
自定义 Agent 定义(`~/.claude/agents/`):
```json
{
"name": "researcher",
"tools": ["BashTool", "ReadTool", "GrepTool", "GlobTool"],
"model": "claude-sonnet-4-20250514"
}
```
### 关键文件
| 文件 | 职责 |
|------|------|
| `src/tools/AgentTool/AgentTool.tsx` | 统一调度入口(Line 262-316 为团队路径) |
| `src/tools/shared/spawnMultiAgent.ts` | 三种 spawn 后端实现(1105 行) |
| `src/tools/TeamCreateTool/TeamCreateTool.ts` | 团队创建 + 任务列表重置 |
| `src/tools/TeamDeleteTool/TeamDeleteTool.ts` | 团队清理 + 活跃成员验证 |
| `src/utils/swarm/teamHelpers.ts` | TeamFile 类型、文件锁、清理 |
| `src/utils/swarm/inProcessRunner.ts` | 同进程 teammate 生命周期(1553 行) |
| `src/utils/swarm/teammateInit.ts` | Stop hook、路径白名单 |
| `src/utils/swarm/constants.ts` | `TEAM_LEAD_NAME`, `SWARM_SESSION_NAME` |
### Spawn 后端对比
| 后端 | 隔离 | 优点 | 缺点 |
|------|------|------|------|
| tmux split-pane | 完整进程隔离 | 可视化管理,可独立 kill | 需要 tmux |
| tmux separate-window | 完整进程隔离 | 传统方式 | UI 不够紧凑 |
| iTerm2 native | 完整进程隔离 | macOS 原生集成 | 仅 macOS |
| In-process | AsyncLocalStorage | 无需终端,快速 | 共享进程,有限隔离 |
### 清理机制
- `cleanupSessionTeams()` 在 SIGINT/SIGTERM 时自动执行
- 终止所有团队成员窗格
- 清理团队目录和任务目录
- 文件锁防止并发竞争
### Forbidden 规则
Agent 工具过滤(`filterToolsForAgent()`):
1. MCP 工具(`mcp__*`)始终保留
2. `ALL_AGENT_DISALLOWED_TOOLS` 从所有 Agent 移除
3. `CUSTOM_AGENT_DISALLOWED_TOOLS` 额外从非内置 Agent 移除
4. `ASYNC_AGENT_ALLOWED_TOOLS` 异步 Agent 仅允许白名单工具
---
## Fork Subagent(实验性)
### 概述
通过 `feature('FORK_SUBAGENT')` 门控,提供另一种 Agent 拓扑:子 Agent **继承父会话的全部上下文**。
### 关键特性
- **上下文继承**: 子 Agent 从父会话的完整历史开始
- **字节级缓存优化**: 所有 fork 共享相同 API 前缀(字节一致),提高 prompt 缓存命中
- **权限冒泡**: `permissionMode: 'bubble'` — 权限提示冒泡到父终端
- **强制异步**: 所有 fork spawn 必须异步执行
### 适用场景
- 需要子 Agent 拥有完整对话上下文时
- 希望复用父会话的 prompt 缓存
### 核心文件
| 文件 | 职责 |
|------|------|
| `src/tools/AgentTool/forkSubagent.ts` | `buildForkedMessages()` 构建字节相同前缀 |
|