現(xiàn):codeg-mcp伴生進(jìn)程如何通過stdio MCP+UDS調(diào)度子Agent)
拆解Codeg多智能體委托實(shí)現(xiàn)codeg-mcp伴生進(jìn)程如何通過stdio MCPUDS調(diào)度子Agent【免費(fèi)下載鏈接】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是一款協(xié)作式多智能體 AI 編碼工作區(qū)其核心能力之一是多智能體委托Multi-Agent Delegation父 Agent 的 LLM 可以調(diào)用內(nèi)置 MCP 工具把子任務(wù)派發(fā)給 Claude Code、Codex、OpenCode、Pi 等不同類型的 Agent 執(zhí)行。本文拆解這套機(jī)制的實(shí)現(xiàn)——codeg-mcp 伴生進(jìn)程如何通過stdio MCP 協(xié)議 UDSUnix Domain Socket調(diào)度子 Agent并順帶講清異步任務(wù)、取消與恢復(fù)的完整鏈路。一、先看 Codeg 的多智能體協(xié)作界面Codeg 把來自不同 CLI Agent 的會話聚合成一個統(tǒng)一工作區(qū)委托出去的子 Agent 會話會以子線程卡片形式內(nèi)嵌在父對話中右上角還有子 Agent 覆蓋層可查看。任務(wù)看板同樣支持可視化追蹤每個委托任務(wù)的進(jìn)展二、整體架構(gòu)stdio 與 UDS 各管一段委托鏈路在 src-tauri/src/acp/delegation/mod.rs 的模塊文檔里有一張非常清晰的示意圖父 LLM ─┐ │ ToolUse(delegate_to_agent, ...) ▼ 父 Agent CLI ──stdio──? codeg-mcp每次啟動注入的伴生二進(jìn)制 │ │ UDS / 命名管道token 鑒權(quán) ▼ DelegationBroker委托代理核心 │ ▼ ConnectionManager 生成子 ACP 會話 │ │ 子會話 TurnComplete ▼ 父 LLM ?── MCP tool_result ?── 子 Agent 的最終輸出兩段通道各司其職stdiocodeg-mcp 是一個標(biāo)準(zhǔn)的 MCP Server父 Agent CLI如 Claude Code把它當(dāng)作普通 MCP 工具調(diào)用走 stdin/stdout 的換行分隔 JSON-RPC 2.0支持并發(fā)分發(fā)notifications/cancelled可以截胡進(jìn)行中的tools/call。協(xié)議實(shí)現(xiàn)在 src-tauri/src/acp/delegation/companion.rs二進(jìn)制入口是 src-tauri/src/bin/codeg_mcp.rs。UDS伴生進(jìn)程與 codeg 主進(jìn)程之間走本機(jī)短鏈路——Unix 上是Unix Domain SocketWindows 上退化為命名管道并攜帶每次啟動時主進(jìn)程鑄造的共享 token鑒權(quán)。主進(jìn)程側(cè)的接收端在 src-tauri/src/acp/delegation/listener.rs負(fù)責(zé)校驗 token、把parent_connection_id解析為活躍的 ACP 連接后交給 Broker。為什么不用更省事的方案代碼注釋給出了答案transport.rsLLM 下發(fā)的task參數(shù)里可能包含換行符stdio 側(cè)因為 Content-Length 頭太復(fù)雜才用換行分隔而內(nèi)部 UDS 可以做得更講究。幀格式長度前綴一請求一響應(yīng)UDS 幀格式非常樸素小端u32字節(jié)長度 對應(yīng)長度的 UTF-8 JSON一問一答伴生進(jìn)程每次tools/call都重新建連。用多幾次 connect 換來一條極易測試、且無需復(fù)用的鏈路——因為從 LLM 視角看父會話同一時間只會發(fā)起一次委托調(diào)用并發(fā)由 Broker 在更高層處理。所有消息類型由帶標(biāo)簽的BrokerMessage枚舉表達(dá)call發(fā)起委托、status查詢狀態(tài)/長輪詢、cancel_task取消、resume_task恢復(fù)、cancelfire-and-forget 的 MCP 取消通知。完整定義見 src-tauri/src/acp/delegation/transport.rs。?? 注意一個版本約束codeg-mcp 與主進(jìn)程 listener始終打包在同一發(fā)布產(chǎn)物里所以這條內(nèi)部協(xié)議不帶版本字段——舊版伴生進(jìn)程對接新版 listener 是不受支持的狀態(tài)寧可顯式報 JSON-RPC 錯誤也不允許靜默錯亂。三、codeg-mcp 暴露的 6 個工具伴生進(jìn)程按--features特性組開關(guān)最多暴露 6 個 MCP 工具companion.rs工具 schema 編譯期嵌入 tool_schema.json工具作用說明delegate_to_agent發(fā)起委托異步立即返回task_id確認(rèn)get_delegation_status查詢結(jié)果支持輪詢/長輪詢可批量cancel_delegation取消任務(wù)按task_id精確停止resume_delegation恢復(fù)中斷任務(wù)復(fù)用原task_id續(xù)跑不重復(fù)執(zhí)行ask_user_question向用戶提問阻塞等待多選卡片答復(fù)check_user_feedback拉取用戶插話獲取輪次中途的糾偏備注其中只有delegate_to_agent在 Broker 側(cè)注冊了真正的取消句柄取消狀態(tài)/取消/反饋類往返只是抑制響應(yīng)而對委托調(diào)用則能真正叫停子會話。四、DelegationBroker異步委托的心臟Broker 是整個模塊最核心的協(xié)調(diào)單元src-tauri/src/acp/delegation/broker.rs。設(shè)計上有幾個關(guān)鍵點(diǎn)1. 全異步無阻塞 oneshotdelegate_to_agent在子會話建立完成后就返回一個task_id確認(rèn)ack結(jié)果通過get_delegation_status長輪詢收集。運(yùn)行中的任務(wù)只是runningmap 里的一條記錄終態(tài)事件會原子地把它遷入completed緩存并喚醒長輪詢等待者。2. 長輪詢有邊界get_delegation_status的wait_ms省略 立即快照顯式0 無限期阻塞直到終態(tài)正數(shù) 有界等待且監(jiān)聽器側(cè)設(shè)了60 秒硬上限listener.rs防止單次 MCP 調(diào)用把伴生進(jìn)程的往返無界掛死。3. 結(jié)果緩存與兜底子 Agent 輸出不存進(jìn) codeg 的數(shù)據(jù)庫Broker 在內(nèi)存里按父會話緩存終態(tài)文本單條上限 256 KiB每父會話總預(yù)算 512 MiBFIFO 淘汰。被淘汰的任務(wù)在查詢狀態(tài)時回落到數(shù)據(jù)庫查終態(tài)狀態(tài)完整輸出則始終可以在子會話里查看。4. 取消的級聯(lián)MCP 側(cè)的notifications/cancelled→ 伴生進(jìn)程按external_handle轉(zhuǎn)發(fā)BrokerMessage::Cancel→ Broker 按句柄取消。當(dāng)父會話整體消亡用戶取消、斷連時生命周期訂閱者調(diào)用cancel_by_parent向該父會話的所有運(yùn)行中子會話扇出取消 斷連。而普通end_turn不會取消子會話——它們繼續(xù)在后臺跑這正是異步設(shè)計的意義所在。5. resume唯一的非一次性例外被取消、或崩潰遺留的in_progress任務(wù)可以經(jīng)resume_delegation復(fù)活按記錄的 agent 會話 id 重新掛接子連接復(fù)用原task_id與原父側(cè)tool_use_id嚴(yán)格是續(xù)跑而非二次執(zhí)行該工具不接受新的任務(wù)文本。五、伴生進(jìn)程的取消競態(tài)處理MCP 2024-11-05 / 2025-11-25 取消規(guī)范下的完整時序值得細(xì)看companion.rs伴生進(jìn)程收到tools/callJSON-RPCid X鑄造不透明的external_handle登記X → (handle, cancel_tx)后發(fā)起 UDS 往返若notifications/cancelled到達(dá)彈出登記項、觸發(fā)cancel_tx并向 Broker 發(fā)送BrokerMessage::Cancel正在進(jìn)行的tools/call任務(wù)觀察到取消后放棄 UDS 讀取按規(guī)范抑制響應(yīng)若往返先于取消完成登記項正常移除遲到的取消通知靜默忽略。六、前端把委托狀態(tài)讀回來線上傳輸?shù)男螤钜蕾囁拗鞑町愃郧岸私馕鲎隽舜罅糠烙栽O(shè)計參數(shù)可能被中繼包裹在arguments/params/args等鍵下甚至雙重 JSON 編碼結(jié)果可能是裸文本、完整CallToolResult、Codex 的{result, error}信封或Wall time:…\nOutput:\njson包裝——解析鏈逐層剝離src/lib/delegation-card.ts。關(guān)鍵區(qū)分ack 與 outcome異步委托下父工具的輸出其實(shí)只是運(yùn)行中確認(rèn)若把它當(dāng)結(jié)果渲染卡片會過早亮起 ok 徽章parseToolOutput。狀態(tài)解析優(yōu)先級waiting子會話卡在權(quán)限確認(rèn) 實(shí)時綁定 持久化 meta 錯誤通道 運(yùn)行中 ack 終態(tài)結(jié)果實(shí)現(xiàn)在 resolveDelegationStatus供內(nèi)聯(lián)消息流卡片與右上角覆蓋層共用同一套邏輯避免兩處漂移。工作臺伴生工具task_progress、task_complete、create_automation等的解析在 src/lib/codeg-mcp-tool.ts把每次調(diào)用真正關(guān)心的那一個參數(shù)會話 id、進(jìn)度文案、結(jié)論判定提煉成單行展示。工作區(qū)內(nèi)的分屏布局也方便父/子會話對照查看七、關(guān)鍵源碼導(dǎo)航想深入閱讀建議按這條路徑走模塊路徑架構(gòu)總覽含鏈路圖src-tauri/src/acp/delegation/mod.rs異步 Brokersrc-tauri/src/acp/delegation/broker.rs伴生進(jìn)程 MCP 協(xié)議src-tauri/src/acp/delegation/companion.rsUDS 幀格式與消息src-tauri/src/acp/delegation/transport.rs主進(jìn)程監(jiān)聽端src-tauri/src/acp/delegation/listener.rs套接字生命周期服務(wù)src-tauri/src/acp/delegation/service.rs前端委托卡片src/lib/delegation-card.ts前端狀態(tài)上下文src/contexts/delegation-context.tsx此外src-tauri/tests/delegation_e2e_uds.rs 提供了基于真實(shí) UDS 的端到端測試是理解協(xié)議細(xì)節(jié)的最佳活文檔。八、小結(jié)Codeg 的多智能體委托把三個關(guān)注點(diǎn)切得很干凈stdio MCP讓任何支持 MCP 的 Agent CLI 無需改造即可會委托協(xié)議標(biāo)準(zhǔn)、宿主差異由解析層吸收UDS token伴生進(jìn)程與主進(jìn)程間的最小化、可鑒權(quán)、可測試的本機(jī)鏈路異步 Brokertask_idack 長輪詢 取消級聯(lián) 中斷恢復(fù)讓派活這件事既不打斷父 LLM 的回合又可追蹤、可叫停、可續(xù)跑。這套設(shè)計對任何想實(shí)現(xiàn)Agent 調(diào) Agent的項目都是不錯的參考樣板——如果你正在做類似的多智能體系統(tǒng)值得先讀 delegation 模塊 的文檔注釋十分鐘就能建立完整心智模型。【免費(fèi)下載鏈接】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創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考