用 dsh-plugin-product-subagents 把 Codex、Claude Code 接到可续聊的 DSH 子智能体

前言

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 会话里把重构、审查、排障交给已经登录好的 claudecodex,或 Cursor / CodeBuddy / Gemini / OpenCode 这类 ACP CLI
  • 子任务不要每次从零开一场新会话,空闲回收或进程重启后还能按远程 session id 接回去
  • 审查、探索走只读,通用任务才给全权限,并且子代理不能再派出比自己权限更高的后代

需要先分清两件事。DeepSeek Harness 本身是 DeepSeek 开源的 Agent 运行时,核心理念是「一切皆插件」。本文用的插件目录 deepseek-harness-plugin.com 是社区站点,和 DeepSeek / 幻方没有官方从属关系,不能当成官方应用商店。官方运行时里也有 dsh-subagent-claude-codedsh-subagent-acp 等提供方;本插件是社区实现,额外叠了角色库、权限天花板和持久会话注册表。

核心功能

仓库 README 把能力收成下面几条,源码里的 roles/*.jsonpackage.json 也能对上。

可续聊子代理,而不是一次性跑完就丢

委派可以是同步 one-shot,也可以是异步连续式。连续式子代理可以用 send_messagelist_agentsinterrupt_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 可以

未知角色会回退到 generalexplore 明确禁止再派活,适合只读摸代码;code-review 虽然只读,但仍允许把子任务派出去。

角色文件字段大致如下(以仓库里的 code-review 为例):

{
  "id": "code-review",
  "description": "代码审查:审查变更的缺陷、安全与可维护性。产品以只读模式运行。",
  "provider": "claude-code",
  "permissionMode": "readonly",
  "allowDelegation": true,
  "instructions": "You are a code reviewer. ..."
}

自定义角色目录可以用配置项 rolesDir 指向别处。

两层权限,外加委派天花板

权限不是「模型想改就能改」:

  1. 中继模型永远是只读传话筒。进程内的桥接代理拿不到可写工具,任何角色都一样。
  2. 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
  3. 委派有天花板readonly < default < full。子代理不能派生出比自己权限更高的后代。

full 等于把产品自己的「绕过全部权限检查」开关打开。SECURITY.md 写得很直白:只给真正信任其任意文件和命令访问的角色开这个档。

任意 ACP CLI,零代码加 Provider

内置三件套是 claude-codecodexacp。其余讲 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.ymldsh plugin add 会把它注册成 profile 层,不必再手改接线:

dsh plugin --profile web add dsh-plugin-product-subagents

装完后重启 harness,插件才会加载。

环境要求(README):

  • 已有 DeepSeek Harness 部署,并且用的是 web profile
  • PATH 上至少有一个已登录的产品 CLI:claudecodex,或 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-reviewexplore,避免远程产品带着「绕过权限检查」的标志去改文件。

连续式子任务派出去之后,不必一直阻塞:先拿 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 自己的工具循环
  • 长任务需要可续聊:审查一轮、再追问一轮,远程产品会话不要每次重建
  • 要把「探索只读、审查只读、排障默认、落地全权限」写成角色文件,而不是每次口头约束模型

使用前建议先看这几条边界:

  1. 插件以当前 dsh 进程权限运行。 目录页和安全指南都写了:安装时可能执行代码,运行时能做当前进程能做的事。装之前读仓库源码和 MIT 许可证;生产环境用 #commit 钉死版本。
  2. 这是「配置即信任边界」的工具。 它会启动你配置的任何 CLI,并把 process.env 传给子进程,不会替你清洗密钥。full 会带上产品自己的危险开关。不要把不可信的 command 写进 providers
  3. 持久注册表是运行时状态。 默认文件 ~/.dsh/product-subagents-registry.json 把子会话 id 映射到远程产品 session id,不要提交、不要当配置模板分发。
  4. web profile 和 CLI 登录是前置条件。 没有 claude / codex / ACP CLI,工具表在,活派不出去。
  5. 手动装包用 pnpm。 npm 会把 @deepseek-ai/dsh-tools 再装一份,盖住宿主单例。CHANGELOG 还提到:部分环境下 pnpm 11 默认的 minimumReleaseAge 会让 dsh plugin add 落到旧的 0.2.0;若遇到工具调用异常,可显式安装 dsh-plugin-product-subagents@0.3.1
  6. 社区目录不是官方商店。 条目来自独立站点,维护者和许可证以 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜