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 仓库。