dsh-acp-resume:讓 DSH 與外部 ACP Agent 可持續多輪協作

前言

在 DeepSeek Harness(DSH)裏委派外部 ACP(Agent Client Protocol)子代理時,官方 @deepseek-ai/dsh-subagent-acp 的常見路徑是:每輪啓動新進程、執行一次、結束即銷燬。遠端會話即便在對方側已落盤(例如在 kiro-cli 上實測 session/load 可用),DSH 側也不會複用同一會話句柄繼續聊。若你的任務需要模型與同一個外部 ACP agent 跨多輪協作、進程異常退出後仍能接上上下文,就需要在「一次性委派」之上再疊一層持久化與會話重連邏輯。

下面介紹社區插件 dsh-acp-resume(維護者 Tureen,GitHub 倉庫 Tureen/dsh-acp-resume)。它是官方 ACP 後端的獨立兄弟包:保留與官方一致的一次性(one-shot)委派行爲,並額外提供持久會話池、五個模型工具,以及右側持久會話面板;進程死後可通過 session/load 按原會話號與工作目錄重連。分類上屬於 DSH 社區目錄中的「工作流」類插件。

插件以當前 DSH 進程權限運行子 agent 可執行文件;安裝前請自行查閱源碼與 MIT 許可證,並覈對 command 指向的二進制是否可信。

這是什麼

dsh-acp-resume 是 DeepSeek Harness 的可續聊 ACP 子代理後端。在架構上與官方包完全隔離並存:一側註冊名爲 acp-resume 的 one-shot provider(行爲對齊官方 subagent-acp),另一側把持久會話池與模型工具掛到 ctx.tools(不經 ctx.subagents)。

實現上使用標準 ACP 方法;README 寫明目前只在 kiro-cli 上做過實測。會話中途插話依賴 kiro 專屬擴展 _session/steer(對應工具 acp_chat_steer);換用其他 ACP agent 時可通過配置 command 指向其可執行文件,若對方不認 kiro 的 --agent-engine 旗標,可將 agentEngine 設爲 none。package.json 中版本爲 0.1.18;README 亦標註實現進度與已知限制(完整 kiro-cli 冒煙劇本尚未全部走完,部分行爲由 mock 服務器測試覆蓋)。

社區目錄頁:https://www.skillhub.cn/plugins/Tureen/dsh-acp-resume(獨立站點,與 DeepSeek / 幻方無官方從屬關係)。

核心功能

與會話生命週期相關的動機

相對官方「每輪新進程、結束即毀」的模式,本插件補上三層能力:

  1. 會話號與輪次落盤:外部 agent 的會話號寫在 $DSH_HOME/storages/acp-resume/registry.json;每會話的輪次記錄(消息與回答明文)在 turns/<chatId>.jsonl,保留最近 200 條,供面板詳情查看,刪除會話時一併刪除。
  2. 進程空閒保活與超時釋放:會話進程在空閒超時後釋放,但會話記錄保留。
  3. 自動重連:下次對話時重新 spawn → initialize → session/load(原會話號 + 原 cwd) → 繼續;遠端拒絕 load 時降級爲新會話。若同一 chat 在內存中連續 3 輪 error,下一次 send 會跳過 load 而新開會話,並以短語 remote session failed repeatedly, started fresh 告知(該計數僅內存保存,應用重啓後重新累計)。

模型工具(五個)

工具 用途
acp_chat_start 建立持久會話,返回會話句柄 chatId
acp_chat_send 向指定會話發消息;進程死後自動重連恢復上下文。宿主裝有 jobs 服務時立即返回後臺任務 id,回答流式寫入該任務(不要對運行中任務 wait 硬等);無 jobs 服務時等待並返回最終回答
acp_chat_list 列出活躍與持久化會話
acp_chat_close 釋放會話進程(記錄保留,可再連;purge 同時刪記錄)
acp_chat_steer 給在途輪插話;agent 不支持 _session/steer 時報錯;要立即中止可用 job_kill / acp_chat_close

此外提供持久會話面板(右側欄):按會話聚合狀態、輪數、摘要,支持釋放與刪除;點卡片可查看每輪問答、結局與重連事件(設計見倉庫內 PANEL-DESIGN.md)。

配置要點

掛載方式二選一:啓用 bundle 時在 profile 的 cordis.patch.yml 寫頂層同 id 覆蓋;不啓用 bundle 時用 - insert: 手動接線。勿 bundle 與 profile insert 雙掛,否則會 DUPLICATE_PROVIDER。

手動接線時 provider id 爲 subagent-acp-resume,常用字段包括:

  • command(必填):子 agent 可執行文件路徑
  • args:默認 [],kiro 配方爲 [acp]
  • agentEngine:默認 v3;none 表示不追加 --agent-engine
  • enableChatTools:默認 true;false 時只註冊 one-shot provider
  • idleTimeoutMs:默認 600000(空閒多久釋放進程)
  • registryPath:默認空串即使用 $DSH_HOME/storages/acp-resume/registry.json

自帶 bundle 對 kiro-cli 默認 permission: allow;手動 insert 且省略 permission 時默認爲保守的 reject。

安裝與啓用

環境要求(來自 README 與 package.json):

  • DSH >=0.2.2-rc.1
  • Node >= 24

主路徑:從 npm 安裝

dsh plugin --profile <name> add dsh-acp-resume

<name> 爲 profile 名(DSH App 默認 profile 目錄示例爲 ~/.dsh/profiles/desktop/)。安裝後包出現在該 profile 的 dsh.profile.bundles 中,重啓 DSH 生效。升級:dsh plugin --profile <name> add dsh-acp-resume@<版本>;卸載:dsh plugin --profile <name> remove dsh-acp-resume。

若安裝報 ERR_PNPM_TARBALL_EXTRACT 或校驗和錯誤,README 建議顯式釘版本:dsh plugin --profile <name> add dsh-acp-resume@<版本>。

實驗性 Discover 安裝:在插件頁「實驗性插件」下打開自定義插件索引,在「發現」頁籤添加索引源 https://tureen.github.io/dsh-acp-resume/index.json,在卡片上選擇安裝並確認版本與來源後重啓 DSH。

不支持 github: 方式安裝:倉庫不帶可開箱的 prepare,僅從 GitHub 裝到的多爲源碼,加載會失敗;請用 npm 或本地 pnpm pack 產出的 tgz。

典型用法

默認 kiro-cli(bundle 已啓用)

只要 kiro-cli 在 PATH 中,自帶 bundle 已使用 command: kiro-cli 與 args: [acp],一般無需額外覆蓋。

kiro-cli 不在 PATH 時,在 profile 頂層覆蓋路徑:

- id: subagent-acp-resume
  name: 'dsh-acp-resume'
  config:
    command: /absolute/path/to/kiro-cli
    args: [acp]

換用其他 ACP agent

覆蓋可執行文件與參數;不認 kiro 引擎旗標時關閉追加,權限可改爲逐次詢問:

- id: subagent-acp-resume
  name: 'dsh-acp-resume'
  config:
    command: /absolute/path/to/other-acp-agent
    args: [acp]
    agentEngine: 'none'
    permission: ask

模型側典型流程(名稱可由 toolPrefix 調整,默認前綴 acp_chat_):

  1. 調用 acp_chat_start 拿到 chatId
  2. 用 acp_chat_send 向該會話發送任務;長任務在裝有 @deepseek-ai/dsh-jobs-local 等 jobs 能力時走後臺,完成後用不帶 wait 的 job_output 讀取,避免對運行中 acp-chat 任務 job_output wait:true 頂滿宿主時限(默認 allowChatJobWait: false 會攔截對運行中任務的硬等)
  3. 需要查看或清理時用 acp_chat_list、acp_chat_close;在 kiro 上且存在在途輪時,可用 acp_chat_steer 排隊插話

適用場景與注意

更適合誰

  • 已在 DSH 中使用或計劃使用外部 ACP agent(尤其 kiro-cli),且希望同一會話多輪協作、進程退出後仍能 session/load 恢復的開發者。
  • 需要把持久 ACP 會話暴露給主模型一組明確工具(start/send/list/close/steer),並在 UI 面板裏觀察會話狀態與歷史輪次的用戶。

務必留意的限制

  • 真機 kiro-cli 端到端冒煙(建會話 → 多輪 → 殺進程 → 重連 → 空閒釋放 → 再連)README 寫明尚未全部走完;其他 ACP agent 未實測。
  • acp_chat_steer 依賴 kiro 私有擴展,其他 agent 不支持時會明確報錯。
  • 後臺任務模式依賴宿主同時裝有 jobs 相關能力(README 截斷處提及 @deepseek-ai/dsh-jobs-local);否則 acp_chat_send 同步等待返回。
  • 插件執行你配置的 command 及子進程行爲,權限策略由 permission 控制;生產環境建議先讀 DESIGN.md、DECISIONS.md 與實現計劃 IMPLEMENTATION-PLAN.md。

結尾

dsh-acp-resume 在 DSH「一切皆插件」的生態裏,針對「官方 ACP 子代理一次性進程」的缺口,用持久會話池、session/load 重連和五個聊天工具,把外部 ACP agent 變成可續聊的後端;與官方包隔離並存,默認路徑面向 kiro-cli。若你的工作流裏有多輪委派、進程保活與重連需求,可先按上文安裝命令接入,再結合 profile 覆蓋調整 agent 路徑與權限。

羽毛球分组比赛记分
小程序二维码

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

小夜