附录 I:智能分层基础设施

# 附录 I:智能分层基础设施

> 基础设施决定上限——再聪明的 Agent,也跑在具体的进程、协议和文件系统之上。

---

## 附录 I-A:Bridge / IDE 远程控制

### 功能描述

Claude Code 可被 VS Code、JetBrains 等 IDE 插件以 WebSocket 协议**远程控制**:IDE 发送任务指令,Claude Code 在终端执行,结果流式回传给 IDE 展示。

这是 Claude Code VS Code 扩展、JetBrains 插件的底层通信机制。

### 架构概览

```
IDE 插件(VS Code / JetBrains)
    │
    │  HTTPS long-poll(工作任务获取)
    │  + WebSocket / SSE(结果回传)
    ▼
Anthropic Bridge API(云端中继)
    │
    │  HTTP
    ▼
Claude Code CLI(本地进程)
    ├─ bridgeMain.ts        ← 主循环:轮询任务、启动 Session
    ├─ sessionRunner.ts     ← 每个任务对应一个 Session 进程
    ├─ replBridgeTransport.ts ← REPL ↔ Bridge 双向消息传输
    ├─ flushGate.ts         ← 消息缓冲(防止乱序)
    └─ bridgePermissionCallbacks.ts ← 权限请求代理给 IDE
```

### 核心文件

| 文件 | 作用 |
|------|------|
| `src/bridge/bridgeMain.ts` | 主循环:轮询 Bridge API 获取工作任务,管理 Session 生命周期 |
| `src/bridge/sessionRunner.ts` | 为每个任务创建独立 Claude Code 进程(`SessionSpawner`) |
| `src/bridge/replBridgeTransport.ts` | REPL 与 Bridge 之间的双向消息传输层 |
| `src/bridge/bridgeApi.ts` | Bridge API 客户端(HTTP),包括工作任务获取与状态上报 |
| `src/bridge/flushGate.ts` | 消息有序缓冲(确保 IDE 端按序收到消息) |
| `src/bridge/bridgePermissionCallbacks.ts` | 将权限请求(如写文件确认)代理给 IDE 展示 |
| `src/bridge/jwtUtils.ts` | JWT 令牌管理与自动刷新(`createTokenRefreshScheduler`) |
| `src/bridge/workSecret.ts` | Work Secret 解码(base64url JSON,含 API key + git 信息) |
| `src/bridge/trustedDevice.ts` | 可信设备令牌(避免每次 IDE 连接都弹认证) |
| `src/bridge/types.ts` | 协议类型定义(`WorkData`、`WorkSecret`、`SessionActivity` 等) |

### 关键协议细节

**工作任务获取**(Long-poll):

```typescript
// bridgeMain.ts 简化逻辑
while (running) {
  const work = await client.getWork(bridgeId)  // 长轮询,最多等 30s
  if (work.type === 'session') {
    await sessionSpawner.spawn(work)           // 启动子进程处理任务
  } else if (work.type === 'healthcheck') {
    await client.respondHealthcheck(work.id)   // 心跳回复
  }
}
```

**Work Secret 结构**(解码自 base64url JSON):

```typescript
type WorkSecret = {
  version: number
  session_ingress_token: string    // Session 入口认证令牌
  api_base_url: string             // 使用的 API 地址
  sources: Array<{                 // 代码来源(可含 git clone 指令)
    type: string
    git_info?: { repo: string; ref?: string; token?: string }
  }>
  environment_variables?: Record<string, string>  // 注入的环境变量
  mcp_config?: unknown              // 远端 MCP 配置
}
```

**权限代理**:当 Claude Code 遇到需要用户确认的操作(如写文件、执行 bash),不在终端弹出确认框,而是通过 `bridgePermissionCallbacks.ts` 将请求发送给 IDE,由 IDE 展示确认对话框。

**退避重连**(`BackoffConfig`):

```typescript
type BackoffConfig = {
  connInitialMs: number   // 初始重连等待(毫秒)
  connCapMs: number       // 重连等待上限
  connGiveUpMs: number    // 放弃时间(超过则报错)
  generalInitialMs: number
  generalCapMs: number
  generalGiveUpMs: number
}
```

### 与 Worktree 的集成

Bridge 模式下,`bridgeMain.ts` 在启动任务前会调用 `createAgentWorktree()` 为每个任务创建独立的 git worktree(隔离分支),任务完成后 `removeAgentWorktree()` 清理。

---

## 附录 I-B:Computer Use(桌面自动化)

### 功能描述

允许 Claude 通过截图观察桌面状态、模拟鼠标/键盘事件控制 macOS 应用,实现完整的"看-思考-操作"桌面自动化循环。

### 架构概览

```
LLM 调用 computer_use 工具
    │
    ├─ screenshot()     → macOS screencapture → PNG → Base64 → LLM
    │
    ├─ click(x, y)      → Accessibility API 模拟鼠标点击
    ├─ type(text)       → Accessibility API 模拟键盘输入
    ├─ scroll(x, y, d)  → 模拟滚轮事件
    └─ key(combo)       → 模拟快捷键(如 Cmd+C)
```

### 核心文件

| 文件 | 作用 |
|------|------|
| `src/utils/computerUse/` | 完整 Computer Use 实现目录 |
| `src/utils/computerUse/mcpServer.ts` | 以 MCP Server 形式暴露 Computer Use 工具 |
| `src/utils/computerUse/screenshot.ts` | 截图实现(macOS `screencapture` 命令) |
| `src/utils/computerUse/input.ts` | 鼠标/键盘事件模拟(macOS Accessibility API) |

### 关键设计

**以 MCP Server 集成**:Computer Use 工具不是内置工具,而是以 MCP Server 形式运行(`computerUse/mcpServer.ts`),通过 stdio 协议与主 Agent 通信。这使得 Computer Use 权限管理与其他 MCP 工具一致。

**Computer Use Lock**:防止多个 Agent 并发控制桌面,避免鼠标/键盘事件交叉污染。

**权限要求**:需要 macOS 辅助功能权限(在系统偏好设置 → 隐私与安全性 → 辅助功能中授权)。

---

## 附录 I-C:Git Worktree 并行分支

### 功能描述

允许 Agent(或子 Agent)在不同的 git worktree 中**并行工作于不同分支**,互不干扰。每个 Worktree 是同一仓库的独立工作目录,共享 `.git` 对象存储但有各自的工作文件和当前分支。

### 核心文件

| 文件 | 作用 |
|------|------|
| `src/utils/worktree.ts` | Worktree 完整生命周期管理(创建/校验/删除) |
| `src/tools/EnterWorktreeTool/` | `EnterWorktreeTool`:LLM 可调用,进入新 worktree |
| `src/tools/ExitWorktreeTool/` | `ExitWorktreeTool`:LLM 可调用,退出并清理 worktree |

### Worktree 生命周期

```
createAgentWorktree(branchSlug)
    │
    ├─ 1. 校验 slug(防路径穿越攻击)
    │     └─ VALID_WORKTREE_SLUG_SEGMENT = /^[a-zA-Z0-9._-]+$/
    │
    ├─ 2. git worktree add .claude/worktrees/<slug> <branch>
    │
    ├─ 3. 复制 settings.json 到新 worktree(继承配置)
    │
    ├─ 4. 执行 WorktreeCreate Hook(如有)
    │     └─ executeWorktreeCreateHook()
    │
    └─ 返回新 worktree 路径(子 Agent 将在此路径下工作)


removeAgentWorktree(slug)
    │
    ├─ 1. 执行 WorktreeRemove Hook(如有)
    ├─ 2. git worktree remove --force .claude/worktrees/<slug>
    └─ 3. 删除本地配置文件
```

### 与多 Agent 的集成

`AgentTool`(第 13 章)在启动子 Agent 时,若 `worktree` 参数设为 `true`,会:

1. 调用 `createAgentWorktree()` 创建隔离 worktree
2. 在该 worktree 目录下启动子 Agent(`cwd` 切换)
3. 子 Agent 完成后,主 Agent 调用 `removeAgentWorktree()` 清理

这是第 13 章 `AgentTool` 中提到的"worktree 隔离"的具体实现。

### Hooks 系统

```typescript
// src/utils/hooks.ts
executeWorktreeCreateHook(worktreePath): Promise<void>
executeWorktreeRemoveHook(worktreePath): Promise<void>

// 触发条件:src/utils/worktree.ts 在创建/删除时调用
// 用途:用户可以自定义脚本(如自动 npm install、设置 env 等)
```

---

## 附录 I-D:Team / Swarm 模式(多 Agent 树)

### 功能描述

多个 Claude Code 实例组成**树形结构**协同工作:一个 Leader Agent 创建并管理一组 Teammate Agents,通过邮箱系统传递消息,各自负责不同子任务。

与第 13 章的 `AgentTool`(进程内子 Agent)不同,Swarm 模式的每个 Teammate 是**独立的 Claude Code 进程**,拥有独立的终端窗口(iTerm2 Pane / tmux 窗口)。

### 架构概览

```
Leader Agent
    │
    ├─ TeamCreateTool  → 创建 team.json,启动 Teammate 进程
    ├─ SendMessageTool → 写入 Teammate 邮箱(文件系统)
    ├─ TaskGetTool     → 检查 Teammate 任务状态
    └─ TeamDeleteTool  → 关闭所有 Teammate,清理 team.json

Teammate Agent(独立进程 × N)
    ├─ 读取邮箱(轮询 ~/.claude/mailboxes/<agentId>/)
    ├─ 执行任务(使用自己的工具集)
    ├─ 完成后发送 idle 通知给 Leader
    └─ 权限从 Leader 同步(leaderPermissionBridge.ts)
```

### 核心文件

| 文件 | 作用 |
|------|------|
| `src/utils/swarm/constants.ts` | 常量定义(`TEAM_LEAD_NAME`、`SWARM_SESSION_NAME`、环境变量名) |
| `src/utils/swarm/teammateInit.ts` | Teammate 启动时注册 Stop Hook(完成后通知 Leader) |
| `src/utils/swarm/teamHelpers.ts` | team.json 读写,成员状态管理(`setMemberActive` 等) |
| `src/utils/swarm/permissionSync.ts` | 权限从 Leader 同步给 Teammate |
| `src/utils/swarm/teammateLayoutManager.ts` | 多 Agent 的终端布局管理(Pane 分配) |
| `src/utils/swarm/backends/TmuxBackend.ts` | Tmux 后端:用 tmux 窗格展示各 Teammate 输出 |
| `src/utils/swarm/backends/ITermBackend.ts` | iTerm2 后端:用 iTerm2 分屏展示各 Teammate 输出 |
| `src/utils/teammateMailbox.ts` | 邮箱系统:基于文件系统的 Agent 间消息传递 |

### team.json 结构

```json
{
  "teamName": "claude-swarm",
  "leadAgentId": "uuid-of-leader",
  "members": [
    {
      "agentId": "uuid-of-teammate-1",
      "agentName": "backend",
      "active": true,
      "color": "blue"
    },
    {
      "agentId": "uuid-of-teammate-2",
      "agentName": "frontend",
      "active": false,
      "color": "green"
    }
  ],
  "teamAllowedPaths": ["/project/src"]
}
```

### 邮箱系统(消息传递)

```
Leader 发送消息:
  writeToMailbox(teammateAgentId, message)
    → 写入 ~/.claude/mailboxes/<teammateAgentId>/inbox/<timestamp>.json

Teammate 接收消息:
  readMailbox(agentId)
    → 读取所有未处理的 inbox 文件,按时间排序处理

Teammate 完成,发送 idle 通知给 Leader:
  createIdleNotification() → writeToMailbox(leadAgentId, idleMsg)
```

### 终端布局后端(多屏显示)

Swarm 支持两种多窗格布局:

```
TmuxBackend(在 tmux 会话中运行):
  ├─ 为每个 Teammate 创建 tmux 窗格(pane)
  ├─ Leader 与所有 Teammate 的输出分区展示
  └─ 使用独立 socket(getSwarmSocketName())隔离用户的 tmux 会话

ITermBackend(在 iTerm2 中运行):
  ├─ 调用 iTerm2 AppleScript API 创建 Split Pane
  └─ 每个 Teammate 占用一个 Pane
```

### Coordinator Mode(独立协调者)

与 Swarm 不同,Coordinator Mode 通过环境变量 `CLAUDE_CODE_COORDINATOR_MODE=1` 启用,由 `feature('COORDINATOR_MODE')` 门控:

```
Swarm 模式:                    Coordinator Mode:
  Leader 可以直接执行工具         Leader 只使用管理工具
  Teammate 也可执行工具           Leader 不直接操作文件/代码
                                 所有具体操作交给 Teammate 执行
```

Coordinator Mode 适合任务边界清晰、需要严格"管理与执行分离"的场景。

### 使用前提

- **Tmux 后端**:需要安装 tmux(macOS: `brew install tmux`)
- **iTerm2 后端**:需要在 iTerm2 中运行,且开启 Python API(iTerm2 → Preferences → General → Magic → Enable Python API)
- **权限**:所有 Teammate 共享 Leader 的 allowed paths(通过 `teamAllowedPaths` 同步)

---

## 附录 I 源码快速导航

```
智能分层基础设施
├── Bridge / IDE 远控
│   └── src/bridge/                  ← 40+ 文件,完整 Bridge 实现
│       ├── bridgeMain.ts            ← 主循环(Long-poll + Session 管理)
│       ├── sessionRunner.ts         ← Session 进程启动
│       ├── replBridgeTransport.ts   ← REPL ↔ Bridge 双向传输
│       ├── bridgePermissionCallbacks.ts ← 权限代理
│       ├── flushGate.ts             ← 消息有序缓冲
│       └── types.ts                 ← WorkData / WorkSecret / SessionActivity
│
├── Computer Use(桌面自动化)
│   └── src/utils/computerUse/       ← screenshot + input + MCP server
│
├── Git Worktree 并行分支
│   ├── src/utils/worktree.ts        ← 创建/删除/校验
│   ├── src/tools/EnterWorktreeTool/ ← LLM 可调用工具
│   └── src/tools/ExitWorktreeTool/  ← LLM 可调用工具
│
└── Team / Swarm(多 Agent 树)
    ├── src/utils/swarm/             ← 22 个文件,完整 Swarm 实现
    │   ├── constants.ts             ← 常量(TEAM_LEAD_NAME、socket 名等)
    │   ├── teammateInit.ts          ← Teammate 初始化(注册 Stop Hook)
    │   ├── teamHelpers.ts           ← team.json 读写
    │   ├── permissionSync.ts        ← 权限 Leader → Teammate 同步
    │   └── backends/                ← Tmux / iTerm2 / InProcess 后端
    ├── src/utils/teammateMailbox.ts ← 文件系统邮箱(Agent 间消息)
    └── src/coordinator/             ← Coordinator Mode(严格管理/执行分离)
```

---

→ [附录 II:后台智能与持续学习](appendix-II-background-intelligence)