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 路径与权限。

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

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

Xiaoye