前言¶
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