Coordinator
Coordinator 模块通过 coordinatorMode.ts 实现多 Agent 协作的核心调度逻辑。它判断当前是否处于协调器模式(isCoordinatorMode),根据会话模式(matchSessionMode)分发不同的系统提示词和用户上下文。模块支持 Scratchpad 门控、Agent 间的上下文隔离,以及主 Agent 与子 Agent 的角色区分。虽然只有一个文件,但它是多 Agent 架构的神经中枢。
职责与设计理念
职责说明
多 Agent 协调器,管理主/子 Agent 的会话模式与系统提示词
设计理念
协调即解耦——Agent 之间不直接通信,通过协调器的模式匹配间接协作。一个文件承载的不是代码量,而是架构决策的密度。
架构决策
为什么 Agent 间不直接通信?
所有 Agent 通信通过 Coordinator 中转
直接通信会形成 N×N 的连接网络,Coordinator 将其简化为 N×1 的星型拓扑。更重要的是,Coordinator 可以在中转时注入安全检查、日志记录和上下文过滤。
⚖️ Coordinator 成为单点瓶颈,但对于当前的 Agent 规模(通常 < 10 个并发),这不是问题。
为什么用模式匹配而不是继承/多态?
三态 matchSessionMode 函数式模式匹配
只有三种模式(coordinator/subAgent/standalone),用 class 继承过度设计。函数式模式匹配让每个调用点都能看到完整的分支逻辑,不需要追踪继承链。
文件清单
| 文件名 | 用途 |
|---|---|
| coordinatorMode.ts | 协调器核心,模式判断、系统提示词生成、上下文分发 |
使用场景
isCoordinatorMode() 返回 true,主 Agent 获得协调器系统提示词
用户配置 → setMainThreadAgentType() → Coordinator 激活
Coordinator 为子 Agent 创建隔离的会话上下文,分配专用系统提示词
Coordinator → regenerateSessionId() → buildSubAgentPrompt() → 子 Agent 启动
关键代码片段
会话模式匹配与分发
function isCoordinatorMode(): boolean {
return getMainThreadAgentType() !== undefined
}
function matchSessionMode(
sessionId: SessionId,
handlers: {
coordinator: () => T
subAgent: () => T
standalone: () => T
}
): T {
if (isCoordinatorMode()) return handlers.coordinator()
if (getParentSessionId()) return handlers.subAgent()
return handlers.standalone()
}
function getCoordinatorSystemPrompt(): string {
// 根据模式生成不同的系统提示词
} 三态模式匹配:coordinator(主 Agent)、subAgent(子 Agent)、standalone(独立模式)
Agent 上下文隔离
// 子 Agent 只能看到分配给它的上下文切片
function getSubAgentContext(agentId: string): SubAgentContext {
return {
// 继承父会话的项目路径
projectRoot: getProjectRoot(),
// 但使用独立的会话 ID
sessionId: regenerateSessionId({ parentSessionId: getSessionId() }),
// 系统提示词根据角色定制
systemPrompt: buildSubAgentPrompt(agentId),
}
} 子 Agent 继承项目上下文但隔离会话状态,防止 Agent 间的状态污染
技术笔记
Agent 上下文隔离
子 Agent 无法访问父 Agent 的完整会话历史,只能看到 Coordinator 显式传递的上下文切片。这防止了敏感信息在 Agent 间泄露。
Scratchpad 门控
某些高级协调功能(如 Agent 间的 Scratchpad 共享)受特性开关控制,需要特定的订阅等级才能启用。