拆解Codeg多智能体委托实现codeg-mcp伴生进程如何通过stdio MCPUDS调度子Agent【免费下载链接】codegCollaborative multi-agent AI coding workspace: aggregate sessions from Claude Code, Codex, OpenCode, Pi, Grok Build, etc. Desktop app, self-hosted server, or Docker.项目地址: https://gitcode.com/gh_mirrors/co/codegCodeg是一款协作式多智能体 AI 编码工作区其核心能力之一是多智能体委托Multi-Agent Delegation父 Agent 的 LLM 可以调用内置 MCP 工具把子任务派发给 Claude Code、Codex、OpenCode、Pi 等不同类型的 Agent 执行。本文拆解这套机制的实现——codeg-mcp 伴生进程如何通过stdio MCP 协议 UDSUnix Domain Socket调度子 Agent并顺带讲清异步任务、取消与恢复的完整链路。一、先看 Codeg 的多智能体协作界面Codeg 把来自不同 CLI Agent 的会话聚合成一个统一工作区委托出去的子 Agent 会话会以子线程卡片形式内嵌在父对话中右上角还有子 Agent 覆盖层可查看。任务看板同样支持可视化追踪每个委托任务的进展二、整体架构stdio 与 UDS 各管一段委托链路在 src-tauri/src/acp/delegation/mod.rs 的模块文档里有一张非常清晰的示意图父 LLM ─┐ │ ToolUse(delegate_to_agent, ...) ▼ 父 Agent CLI ──stdio──► codeg-mcp每次启动注入的伴生二进制 │ │ UDS / 命名管道token 鉴权 ▼ DelegationBroker委托代理核心 │ ▼ ConnectionManager 生成子 ACP 会话 │ │ 子会话 TurnComplete ▼ 父 LLM ◄── MCP tool_result ◄── 子 Agent 的最终输出两段通道各司其职stdiocodeg-mcp 是一个标准的 MCP Server父 Agent CLI如 Claude Code把它当作普通 MCP 工具调用走 stdin/stdout 的换行分隔 JSON-RPC 2.0支持并发分发notifications/cancelled可以截胡进行中的tools/call。协议实现在 src-tauri/src/acp/delegation/companion.rs二进制入口是 src-tauri/src/bin/codeg_mcp.rs。UDS伴生进程与 codeg 主进程之间走本机短链路——Unix 上是Unix Domain SocketWindows 上退化为命名管道并携带每次启动时主进程铸造的共享 token鉴权。主进程侧的接收端在 src-tauri/src/acp/delegation/listener.rs负责校验 token、把parent_connection_id解析为活跃的 ACP 连接后交给 Broker。为什么不用更省事的方案代码注释给出了答案transport.rsLLM 下发的task参数里可能包含换行符stdio 侧因为 Content-Length 头太复杂才用换行分隔而内部 UDS 可以做得更讲究。帧格式长度前缀一请求一响应UDS 帧格式非常朴素小端u32字节长度 对应长度的 UTF-8 JSON一问一答伴生进程每次tools/call都重新建连。用多几次 connect 换来一条极易测试、且无需复用的链路——因为从 LLM 视角看父会话同一时间只会发起一次委托调用并发由 Broker 在更高层处理。所有消息类型由带标签的BrokerMessage枚举表达call发起委托、status查询状态/长轮询、cancel_task取消、resume_task恢复、cancelfire-and-forget 的 MCP 取消通知。完整定义见 src-tauri/src/acp/delegation/transport.rs。⚠️ 注意一个版本约束codeg-mcp 与主进程 listener始终打包在同一发布产物里所以这条内部协议不带版本字段——旧版伴生进程对接新版 listener 是不受支持的状态宁可显式报 JSON-RPC 错误也不允许静默错乱。三、codeg-mcp 暴露的 6 个工具伴生进程按--features特性组开关最多暴露 6 个 MCP 工具companion.rs工具 schema 编译期嵌入 tool_schema.json工具作用说明delegate_to_agent发起委托异步立即返回task_id确认get_delegation_status查询结果支持轮询/长轮询可批量cancel_delegation取消任务按task_id精确停止resume_delegation恢复中断任务复用原task_id续跑不重复执行ask_user_question向用户提问阻塞等待多选卡片答复check_user_feedback拉取用户插话获取轮次中途的纠偏备注其中只有delegate_to_agent在 Broker 侧注册了真正的取消句柄取消状态/取消/反馈类往返只是抑制响应而对委托调用则能真正叫停子会话。四、DelegationBroker异步委托的心脏Broker 是整个模块最核心的协调单元src-tauri/src/acp/delegation/broker.rs。设计上有几个关键点1. 全异步无阻塞 oneshotdelegate_to_agent在子会话建立完成后就返回一个task_id确认ack结果通过get_delegation_status长轮询收集。运行中的任务只是runningmap 里的一条记录终态事件会原子地把它迁入completed缓存并唤醒长轮询等待者。2. 长轮询有边界get_delegation_status的wait_ms省略 立即快照显式0 无限期阻塞直到终态正数 有界等待且监听器侧设了60 秒硬上限listener.rs防止单次 MCP 调用把伴生进程的往返无界挂死。3. 结果缓存与兜底子 Agent 输出不存进 codeg 的数据库Broker 在内存里按父会话缓存终态文本单条上限 256 KiB每父会话总预算 512 MiBFIFO 淘汰。被淘汰的任务在查询状态时回落到数据库查终态状态完整输出则始终可以在子会话里查看。4. 取消的级联MCP 侧的notifications/cancelled→ 伴生进程按external_handle转发BrokerMessage::Cancel→ Broker 按句柄取消。当父会话整体消亡用户取消、断连时生命周期订阅者调用cancel_by_parent向该父会话的所有运行中子会话扇出取消 断连。而普通end_turn不会取消子会话——它们继续在后台跑这正是异步设计的意义所在。5. resume唯一的非一次性例外被取消、或崩溃遗留的in_progress任务可以经resume_delegation复活按记录的 agent 会话 id 重新挂接子连接复用原task_id与原父侧tool_use_id严格是续跑而非二次执行该工具不接受新的任务文本。五、伴生进程的取消竞态处理MCP 2024-11-05 / 2025-11-25 取消规范下的完整时序值得细看companion.rs伴生进程收到tools/callJSON-RPCid X铸造不透明的external_handle登记X → (handle, cancel_tx)后发起 UDS 往返若notifications/cancelled到达弹出登记项、触发cancel_tx并向 Broker 发送BrokerMessage::Cancel正在进行的tools/call任务观察到取消后放弃 UDS 读取按规范抑制响应若往返先于取消完成登记项正常移除迟到的取消通知静默忽略。六、前端把委托状态读回来线上传输的形状依赖宿主差异所以前端解析做了大量防御性设计参数可能被中继包裹在arguments/params/args等键下甚至双重 JSON 编码结果可能是裸文本、完整CallToolResult、Codex 的{result, error}信封或Wall time:…\nOutput:\njson包装——解析链逐层剥离src/lib/delegation-card.ts。关键区分ack 与 outcome异步委托下父工具的输出其实只是运行中确认若把它当结果渲染卡片会过早亮起 ok 徽章parseToolOutput。状态解析优先级waiting子会话卡在权限确认 实时绑定 持久化 meta 错误通道 运行中 ack 终态结果实现在 resolveDelegationStatus供内联消息流卡片与右上角覆盖层共用同一套逻辑避免两处漂移。工作台伴生工具task_progress、task_complete、create_automation等的解析在 src/lib/codeg-mcp-tool.ts把每次调用真正关心的那一个参数会话 id、进度文案、结论判定提炼成单行展示。工作区内的分屏布局也方便父/子会话对照查看七、关键源码导航想深入阅读建议按这条路径走模块路径架构总览含链路图src-tauri/src/acp/delegation/mod.rs异步 Brokersrc-tauri/src/acp/delegation/broker.rs伴生进程 MCP 协议src-tauri/src/acp/delegation/companion.rsUDS 帧格式与消息src-tauri/src/acp/delegation/transport.rs主进程监听端src-tauri/src/acp/delegation/listener.rs套接字生命周期服务src-tauri/src/acp/delegation/service.rs前端委托卡片src/lib/delegation-card.ts前端状态上下文src/contexts/delegation-context.tsx此外src-tauri/tests/delegation_e2e_uds.rs 提供了基于真实 UDS 的端到端测试是理解协议细节的最佳活文档。八、小结Codeg 的多智能体委托把三个关注点切得很干净stdio MCP让任何支持 MCP 的 Agent CLI 无需改造即可会委托协议标准、宿主差异由解析层吸收UDS token伴生进程与主进程间的最小化、可鉴权、可测试的本机链路异步 Brokertask_idack 长轮询 取消级联 中断恢复让派活这件事既不打断父 LLM 的回合又可追踪、可叫停、可续跑。这套设计对任何想实现Agent 调 Agent的项目都是不错的参考样板——如果你正在做类似的多智能体系统值得先读 delegation 模块 的文档注释十分钟就能建立完整心智模型。【免费下载链接】codegCollaborative multi-agent AI coding workspace: aggregate sessions from Claude Code, Codex, OpenCode, Pi, Grok Build, etc. Desktop app, self-hosted server, or Docker.项目地址: https://gitcode.com/gh_mirrors/co/codeg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
