用 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
羽毛球分组比赛记分
小程序二维码

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

小夜