4/17/26Less than 1 minute
整体交互流程
agent 启动 / 每轮 API 调用前
↓
SystemPromptBuilder.build() — 按顺序调用 6 个 section 构建函数
├─ _build_core() → 核心身份与指令
├─ _build_tool_listing() → 工具清单
├─ _build_skill_listing() → 技能元信息
├─ _build_memory_section() → 记忆内容
├─ _build_claude_md() → CLAUDE.md 指令链
├─ DYNAMIC_BOUNDARY → 分隔标记
└─ _build_dynamic_context() → 动态环境信息
↓
完整系统提示词 → 作为 role=system 消息发送给模型
5/5/26About 5 min
整体交互流程
turn() 中的 API 调用
↓
call_with_recovery() — 外层最多 MAX_RECOVERY_ATTEMPTS+1 次循环
│
├─ 调用成功,finish_reason 正常(stop/tool_calls)
│ → 返回 (response, "ok")
│
├─ 调用成功,finish_reason == "length"(输出截断)
│ → 返回 (response, "continue") → turn() 追加已输出内容 + 续写提示 → continue 循环
│
├─ BadRequestError + context_length_exceeded(上下文过长)
│ → compact_fn() 压缩消息 → continue 循环重试
│
└─ APITimeoutError / APIConnectionError / RateLimitError / 5xx(临时错误)
→ 指数退避等待 → continue 循环重试
5/5/26About 5 min
整体交互流程
模型需要分解多步工作
↓
task_create(subject, description) — 创建任务,分配自增 ID,写入 .tasks/task_N.json
↓
task_update(task_id, addBlockedBy=[1], addBlocks=[3]) — 建立依赖关系
↓
task_update(task_id, status="in_progress") — 开始执行
↓
task_update(task_id, status="completed") — 完成,自动清除其他任务的 blockedBy
│
└─ 每轮 turn() 检查:未使用 task 工具超过 6 轮 → 注入提醒消息
5/5/26About 5 min
整体交互流程
模型调用 background_run(command)
↓
BackgroundTaskManager.start() → 创建子进程 → 输出写入临时文件 → 返回 task_id
↓
模型继续做其他事(不被阻塞)
↓
模型调用 background_output(task_id, block=false) → 非阻塞读取当前输出
或 background_output(task_id, block=true, timeout=30) → 阻塞等待完成
│
├─ 已完成 → 返回完整输出 + exit_code
└─ 仍在运行 → 返回部分输出(或等待超时后返回部分输出)
5/5/26About 6 min
整体交互流程
模型调用 cron_create(cron="*/5 * * * *", prompt="检查部署状态")
↓
CronScheduler.create() → 生成 task_id → 加入内存列表 → 可选持久化到磁盘
│
└─ 后台守护线程(每秒检查一次)
│
├─ 当前分钟 ≠ 上次检查分钟?
│ ├─ 是 → 遍历所有任务 → cron_matches(now) 匹配?
│ │ ├─ 是 → 通知入队 Queue → 记录 last_fired
│ │ └─ 否 → 跳过
│ └─ 否 → 跳过(避免同一分钟重复触发)
│
└─ agent_loop 顶部: SCHEDULER.drain_notifications()
↓
将通知作为 user 消息注入对话 → 模型在下一轮看到并响应
5/5/26About 9 min
整体交互流程
Lead 调用 spawn_teammate(name, role, prompt)
↓
TeammateManager.spawn() → 创建 TeammateRecord (状态 WORKING) → 写入 config.json 持久化
↓
启动独立 daemon 线程 → _teammate_loop() 主循环
│
├─ ① read_inbox() 读取并清空收件箱
├─ ② 消息注入 LLM 上下文(协议消息以结构化格式注入)
├─ ③ 调用 LLM (含工具:send_message/shutdown_response/plan_approval 等)
├─ ④ 执行工具调用
├─ ⑤ 重复 ①-④ 直到 LLM 无工具调用 或 达到 MAX_WORK_TURNS(50)
└─ ⑥ 设置状态 idle(正常完成)/ shutdown(协议关闭)
│
└─ 最终结果通过 task_result 消息发送到 lead 的 inbox
5/5/26About 12 min
整体交互流程
Teammate 完成当前工作(LLM 无工具调用 或 调用 idle 工具)
↓
进入 IDLE 阶段 → 状态设为 idle,开始轮询
│
└─ 每 IDLE_POLL_INTERVAL(5s) 轮询一次,最多 IDLE_TIMEOUT(60s)
│
├─ ① 检查 inbox 是否有新消息?
│ ├─ 有 → 重注入身份信息 → 恢复 WORK 阶段
│ └─ 无 → 继续
│
├─ ② 扫描任务板 scan_unclaimed_tasks(role)?
│ ├─ 有 → claim_task(task_id, owner, source="auto") → 注入任务上下文 → 恢复 WORK 阶段
│ └─ 无 → 继续
│
└─ ③ 超时(60s 内无新消息、无可认领任务)
↓
关闭,状态设为 shutdown
5/5/26About 6 min
整体交互流程
Lead 调用 worktree_create(name="task-3", task_id=3)
↓
WorktreeManager.create()
├─ 校验名称(1-40 字符,字母数字._-)
├─ git worktree add -b wt/task-3 .worktrees/task-3 HEAD
├─ 写入 .worktrees/index.json 索引条目
└─ TaskManager.bind_worktree(3, "task-3") → 任务记录 worktree="task-3", worktree_state="active"
│
├─ worktree_run("task-3", "npm test") ← 在隔离目录执行命令
├─ worktree_run("task-3", "uv run main.py")
│
└─ worktree_closeout("task-3", action="keep", reason="功能完成")
↓
更新索引 status="kept",记录 closeout,任务同步更新 worktree_state
5/5/26About 6 min
整体交互流程
agent 启动
↓
PluginLoader.scan() → 扫描 .claude-plugin/plugin.json → 提取 mcpServers 配置
↓
对每个服务器: MCPClient.connect()
├─ subprocess.Popen 启动子进程
├─ JSON-RPC initialize 握手
├─ notifications/initialized 通知
└─ tools/list 获取工具列表
│
↓
MCPToolRouter.register_client() 注册所有客户端
↓
build_tool_pool() 组装工具池: 原生工具 + MCP 工具(mcp__ 前缀)
│
├─ 每轮 turn() 调用时,工具池作为 tools 参数传给 LLM
│
└─ LLM 返回 mcp__{server}__{tool} 调用
↓
handle_mcp_or_native() 路由
├─ mcp__ 前缀 → MCPToolRouter.call() → MCPClient.call_tool() → JSON-RPC tools/call
└─ 其他 → handlers[tool_name]() 原生工具
5/5/26About 7 min
