DSH 的核心理念是「一切皆插件」。在官方 ctx.subagents 的基礎上加一層委派邊界,解決子代理調用中常見的深度失控、角色越界和併發溢出問題。
這是什麼¶
dsh-agent-delegate 是一個委派代理(Broker)插件,由 xingyingyuzhui 維護。它不提供控制面 UI,而是通過代碼邏輯治理委派行爲。它解決了以下具體問題:
- 委派深度:按父鏈真實計數,防止無限嵌套。
- 角色衰減:限制子代理的角色權限,避免權限擴散。
- 併發預算:限制同時存在的未結束子代理數量。
- 寫入隔離:爲寫入型子代理分配獨立的 Git worktree,避免污染主工作區。
- 結果合入:提供 patch 機制,由父任務驗收後決定是否合入。
核心能力¶
深度與併發控制¶
插件基於父鏈的真實調用深度進行計數。當調用 subagent 時,如果當前深度超過 policy.delegation.maxDepth,調用會被直接拒絕。
對於併發,插件默認限制最多 4 個未結束的子代理並行寫入任務。如果同時存在的未結束 child 超過 delegation.maxChildren,新的委派請求也會被拒絕。
角色過濾與限制¶
委派時可以指定目標角色,支持以下形式:
* role
* [research] 標籤
* role: reviewer 提示詞
子代理的角色策略計算公式爲 child = parent ∩ 角色預設。如果目標角色不在 delegation.roles 配置中,委派會被直接拒絕。例如,默認情況下 developer 角色只能委派給 research 或 reviewer。
獨立工作樹與 Handoff¶
僅寫入型 child(例如配置了 files.write: all)會與後臺寫入任務分配獨立的 Git worktree。主會話和前臺 bash 繼續在項目根目錄工作。
創建 worktree 時,插件會將父工作區的未提交改動和非忽略未跟蹤文件拷貝進去。子代理任務結束後,相對種子提交的 diff 會被寫入 ~/.dsh/agent-delegate/handoffs/<id>.patch,狀態標記爲 pending。不會自動 merge。
父任務驗收後,需要調用 delegate_handoff 命令:
* accept:對父倉庫執行 git apply(必要時使用 --3way)。如果合入失敗,狀態會被標記爲 conflicted,父樹保持原樣。
* reject:放棄該次委派的更改。
* list:查看所有待處理的 handoff。
Sandbox 約束¶
對於 research、reviewer、public 角色,或者在 sandbox.requireEnforcement: full 模式下,當 sandbox 報告 partial(部分執行)時,插件會拒絕任何文件動作,不會降級放行。
安裝與啓用¶
使用官方安裝命令添加插件:
dsh plugin --profile web add github:xingyingyuzhui/dsh-agent-delegate
建議同時安裝 dsh-session-permissions 與 dsh-agent-gate,裝完重啓 dsh web。
如果是本地開發調試,可以使用本地路徑:
dsh plugin --profile web add link:/abs/path/to/dsh-agent-delegate
卸載¶
卸載後,插件不再創建 worktree,不再執行深度/衰減攔截,系統會回落到 DSH 原有的子代理行爲(但已安裝的 dsh-agent-gate 仍會生效)。
dsh plugin --profile web remove dsh-agent-delegate
技術細節¶
- 版本:0.2.10
- 引擎要求:Node.js >= 20
- 許可證:MIT
- 文件大小限制:handoff 默認截取 64KiB
適用場景¶
適合需要在 DSH 環境中嚴格控制子代理權限、防止無限遞歸調用、以及需要將子代理的修改以 patch 形式由人工審覈後再合入的場景。
更多細節與源碼,請參考 GitHub 倉庫。