前言¶
DeepSeek Harness(dsh)把模型、工具、会话、沙箱和 UI 都做成插件,官方也提供了 dsh-subagent 这一套子智能体契约:父会话可以把任务交给 Codex、Claude Code 或任意讲 Agent Client Protocol(ACP)的 CLI。实际用起来,常见卡点不在「能不能拉起」,而在「拉起来之后怎么管」:子任务是一次性还是可续聊、进程被回收后远程会话还在不在、不同角色该给只读还是全权限、子智能体再往下派活时权限会不会越界。
dsh-plugin-product-subagents 就是冲着这几件事来的。它把外部产品 CLI 接到 dsh 的子智能体通道上,用声明式角色决定谁来干、能干什么,并给可续聊子任务加上持久会话恢复。下面按社区目录页、GitHub 仓库 README / CHANGELOG / SECURITY、npm 包说明,以及 DeepSeek Harness 官方 subagent 文档交叉核对后整理:它是什么、装完能做什么、怎么接到当前 profile。
这是什么¶
dsh-plugin-product-subagents 是一款面向 DeepSeek Harness 的会话与消息插件,由 shaokeyibb 维护,仓库托管在 shaokeyibb/dsh-plugin-product-subagents,许可证 MIT,主要语言 JavaScript。截至 2026-08-18,GitHub 显示 16 星;npm 当前版本是 0.3.1(2026-08-17 发布)。
一句话定位:基于角色的 Codex / Claude Code / ACP 子智能体提供方,把外部 Agent CLI 变成可续聊、可恢复的子代理,并带上按角色的产品权限和委派天花板。
它解决的是这类需求:
- 在 dsh 会话里把重构、审查、排障交给已经登录好的
claude、codex,或 Cursor / CodeBuddy / Gemini / OpenCode 这类 ACP CLI - 子任务不要每次从零开一场新会话,空闲回收或进程重启后还能按远程 session id 接回去
- 审查、探索走只读,通用任务才给全权限,并且子代理不能再派出比自己权限更高的后代
需要先分清两件事。DeepSeek Harness 本身是 DeepSeek 开源的 Agent 运行时,核心理念是「一切皆插件」。本文用的插件目录 deepseek-harness-plugin.com 是社区站点,和 DeepSeek / 幻方没有官方从属关系,不能当成官方应用商店。官方运行时里也有 dsh-subagent-claude-code、dsh-subagent-acp 等提供方;本插件是社区实现,额外叠了角色库、权限天花板和持久会话注册表。
核心功能¶
仓库 README 把能力收成下面几条,源码里的 roles/*.json 和 package.json 也能对上。
可续聊子代理,而不是一次性跑完就丢¶
委派可以是同步 one-shot,也可以是异步连续式。连续式子代理可以用 send_message、list_agents、interrupt_agent 控制,再用 product_wait 同步挂回去拿结果。
会话中模型会拿到六个工具:
| 工具 | 用途 |
|---|---|
product_delegate |
按角色委派任务(同步或连续式) |
product_roles |
列出角色库 |
product_submit |
子代理内部桥,仅连续式子代理使用 |
subagent_progress |
单个子代理的状态和内部 trace |
product_wait |
阻塞直到子代理结算,返回答案 |
product_agents |
Provider 是否可用,以及当前活跃的子代理 |
远程会话可以恢复¶
子代理对应的远程产品会话,在空闲释放和进程重启之后仍可恢复。实现依赖持久注册表加上日志标记:Claude / Codex 按 session id 恢复,ACP 走重连(session/load)。默认注册表路径在 SECURITY.md 里写的是 ~/.dsh/product-subagents-registry.json,属于运行时状态,不要提交进 Git。
空闲超时由 idleTimeoutMs 控制,文档示例是 600000(10 分钟),设为 0 则禁用释放。连续式子代理同时存在的上限是 maxConcurrentChildren,默认示例为 8。
声明式角色库¶
角色放在 roles/*.json,装上即用的四个是:
| 角色 | 默认产品 | 权限 | 可否再委派 |
|---|---|---|---|
general |
未绑定(空 provider) |
full |
可以 |
code-review |
claude-code |
readonly |
可以 |
explore |
claude-code |
readonly |
禁止 |
debug |
codex |
default |
可以 |
未知角色会回退到 general。explore 明确禁止再派活,适合只读摸代码;code-review 虽然只读,但仍允许把子任务派出去。
角色文件字段大致如下(以仓库里的 code-review 为例):
{
"id": "code-review",
"description": "代码审查:审查变更的缺陷、安全与可维护性。产品以只读模式运行。",
"provider": "claude-code",
"permissionMode": "readonly",
"allowDelegation": true,
"instructions": "You are a code reviewer. ..."
}
自定义角色目录可以用配置项 rolesDir 指向别处。
两层权限,外加委派天花板¶
权限不是「模型想改就能改」:
- 中继模型永远是只读传话筒。进程内的桥接代理拿不到可写工具,任何角色都一样。
permissionMode作用在远程产品上,取值readonly/default/full,并映射到各 CLI 自己的标志:
-readonly:Claude 为--permission-mode plan,Codex 为--sandbox read-only
-full:Claude 为--dangerously-skip-permissions,Codex 为--dangerously-bypass-approvals-and-sandbox- 委派有天花板:
readonly < default < full。子代理不能派生出比自己权限更高的后代。
full 等于把产品自己的「绕过全部权限检查」开关打开。SECURITY.md 写得很直白:只给真正信任其任意文件和命令访问的角色开这个档。
任意 ACP CLI,零代码加 Provider¶
内置三件套是 claude-code、codex、acp。其余讲 ACP 的 CLI 走 config.providers,通用桥负责持久进程、session/load 恢复和死进程重连。文档给出的例子:
providers:
cursor: { type: acp, command: agent, args: [acp] }
codebuddy: { type: acp, command: cbc, args: [--acp] }
gemini: { type: acp, command: gemini, args: [--acp] }
opencode: { type: acp, command: opencode, args: [acp] }
只有对应命令在 PATH 上被检测到,Provider 才会出现在委派枚举里。内置三项可以用同名键覆盖。
进程启动考虑了 Windows:.cmd 垫片、路径转义。CHANGELOG 0.3.0 修过一处 Windows 引号问题(product_delegate 在 claude-code / codex 上报 'claude" -p ...' is not recognized)。CI 矩阵覆盖 macOS / Ubuntu / Windows,Node 18 / 20 / 22。
安装与启用¶
社区目录页给出的安装命令如下,在 DeepSeek Harness 终端里执行即可:
dsh plugin add github:shaokeyibb/dsh-plugin-product-subagents
需要可复现安装时,按目录页说明固定 commit 哈希:
dsh plugin add github:shaokeyibb/dsh-plugin-product-subagents#commit
把 #commit 换成仓库里实际的 commit SHA。插件以当前 dsh 进程的权限运行,安装时可能执行代码,装之前应检查源码和许可证。
作者 README(0.3.1)推荐的另一条路径,是装进 web profile,走 npm 包名而不是 github:owner/repo。0.3.1 在 package.json 里声明了 dsh.bundle,并自带 cordis.patch.yml,dsh plugin add 会把它注册成 profile 层,不必再手改接线:
dsh plugin --profile web add dsh-plugin-product-subagents
装完后重启 harness,插件才会加载。
环境要求(README):
- 已有 DeepSeek Harness 部署,并且用的是 web profile
PATH上至少有一个已登录的产品 CLI:claude、codex,或opencode/agent/cbc这类 ACP CLI- Node ≥ 18
如果要自己管依赖,README 要求在 profile 目录里用 pnpm,不要用 npm:npm 会自动装 peer 依赖,可能盖住宿主里的 @deepseek-ai/dsh-tools 符号链接。CHANGELOG 0.3.0 修过这个问题(工具调用报 Cannot read properties of undefined (reading 'prepare'))。手动装法:
cd ~/.dsh/profiles/web
pnpm add dsh-plugin-product-subagents
然后在 ~/.dsh/profiles/web/cordis.patch.yml 插入宿主层(与仓库自带 patch 同结构):
- insert:
- id: product-subagents
name: 'dsh-plugin-product-subagents'
config:
idleTimeoutMs: 600000
也可以直接让当前 dsh Agent 代劳。README 给的提示语是:在 web profile 执行 dsh plugin --profile web add dsh-plugin-product-subagents,然后提醒你重启 harness。
典型用法¶
先看角色和 Provider 是否就绪¶
会话里让模型调用 product_roles 列出角色库,调用 product_agents 看哪些 Provider 在 PATH 上可用。如果 Cursor / Codex 没有出现在枚举里,先确认对应 CLI 已安装、已登录,并且命令名和 config.providers 一致。
按角色委派一次任务¶
README 的最小例子:
product_delegate role=general task="重构 demo-project/calc.js 并运行测试"
product_wait subagent_id=<childId>
general 默认是 full 权限,适合真正改代码、跑测试。审查和摸仓库应换成 code-review 或 explore,避免远程产品带着「绕过权限检查」的标志去改文件。
连续式子任务派出去之后,不必一直阻塞:先拿 childId,需要结果时再 product_wait;中途可用 subagent_progress 看状态和内部 trace。
加 ACP Provider,并改超时¶
自定义配置写在 profile 的 cordis.patch.yml 里,按插件 id product-subagents 覆盖。覆盖会整份替换该行的 config 对象,要保留的字段必须一起写上:
- id: product-subagents
config:
idleTimeoutMs: 600000
maxConcurrentChildren: 8
providers:
cursor: { type: acp, command: agent, args: [acp] }
codebuddy: { type: acp, command: cbc, args: [--acp] }
完整配置项(README):
config:
providers: { cursor: { type: acp, command: agent, args: [acp] } }
idleTimeoutMs: 600000
maxConcurrentChildren: 8
rolesDir: <path>
registryPath: <path>
rolesDir 默认是包装来的 roles/;registryPath 指向持久化远程会话注册表。
适用场景与注意事项¶
比较对口的用法:
- 已经在用 Claude Code / Codex / Cursor CLI,希望在 dsh web 会话里按角色把活派出去,而不是只靠 dsh 自己的工具循环
- 长任务需要可续聊:审查一轮、再追问一轮,远程产品会话不要每次重建
- 要把「探索只读、审查只读、排障默认、落地全权限」写成角色文件,而不是每次口头约束模型
使用前建议先看这几条边界:
- 插件以当前 dsh 进程权限运行。 目录页和安全指南都写了:安装时可能执行代码,运行时能做当前进程能做的事。装之前读仓库源码和 MIT 许可证;生产环境用
#commit钉死版本。 - 这是「配置即信任边界」的工具。 它会启动你配置的任何 CLI,并把
process.env传给子进程,不会替你清洗密钥。full会带上产品自己的危险开关。不要把不可信的command写进providers。 - 持久注册表是运行时状态。 默认文件
~/.dsh/product-subagents-registry.json把子会话 id 映射到远程产品 session id,不要提交、不要当配置模板分发。 - web profile 和 CLI 登录是前置条件。 没有
claude/codex/ ACP CLI,工具表在,活派不出去。 - 手动装包用 pnpm。 npm 会把
@deepseek-ai/dsh-tools再装一份,盖住宿主单例。CHANGELOG 还提到:部分环境下 pnpm 11 默认的minimumReleaseAge会让dsh plugin add落到旧的 0.2.0;若遇到工具调用异常,可显式安装dsh-plugin-product-subagents@0.3.1。 - 社区目录不是官方商店。 条目来自独立站点,维护者和许可证以 GitHub 仓库为准。
小结¶
dsh-plugin-product-subagents 把 Codex、Claude Code 和任意 ACP CLI 接到 DeepSeek Harness 的子智能体通道上,用角色文件管权限,用注册表把远程会话留住。对已经在本地登录了这些产品 CLI、又想在 dsh 里按审查 / 探索 / 排障 / 落地分工的人,这条插件比「每次新开一个 CLI 窗口」更贴近会话工作流。
装之前读源码和许可证,按需钉 commit,full 权限只给信得过的角色。目录页和仓库地址:
- 目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-plugin-product-subagents/
- GitHub:https://github.com/shaokeyibb/dsh-plugin-product-subagents
- npm:https://www.npmjs.com/package/dsh-plugin-product-subagents
- DeepSeek Harness 官方仓库:https://github.com/deepseek-ai/deepseek-harness