Files
openclaw-config/skills/delegate-to-dsh/SKILL.md
T
yangxuan 43cd42a563 feat(acp): 接入 DSH 作为 ACP harness,打通 微信→OpenClaw→DSH 派发链路
- openclaw.json
  - plugins.allow 放行 acpx(限制性白名单,缺了后端不会加载)
  - 新增 acp 策略段:enabled/dispatch、backend=acpx、defaultAgent=dsh、
    allowedAgents=[dsh]、stream.deliveryMode=live
  - 新增 plugins.entries.acpx.config:permissionMode=approve-all、
    timeoutSeconds=900、cwd、agents.dsh = dsh --profile acp(绝对路径)
  - 新增 OpenClaw agent dsh(runtime.type=acp → harness dsh),否则
    sessions_spawn 会报 dispatch_failed: Unknown agent id "dsh"
- workspace-dsh/:该 agent 的身份文件(AGENTS/SOUL/IDENTITY/USER/BOOTSTRAP.md)。
  其中的空 .git 由 `openclaw agents add` 的标准 provisioning 生成(非任何 agent 自建),
  会让父仓库把它当 gitlink,已移除后纳入版本控制
- docs/bk02-dsh-openclaw-ACP集成.md:部署/配置/验证证据/排错/回滚全文
- docs/dsh-acp-smoke.mjs:ACP 独立冒烟(initialize→session/new→prompt→close)
- docs/dsh-lang-check.mjs:全局中文指令验证(英文提问看是否回中文)
- skills/delegate-to-dsh:让「交给 dsh」稳定走 ACP 派发;缺此技能时模型会
  静默 fallback 到内嵌 subagent(已复现「假成功」并写入判据)
- agents/main/agent/workshop-skills/acp-backend-triage:ACP 后端排查技能
- plugin-skills/acp-router:acpx 插件自带技能(symlink,与既有渠道一致)
- .gitignore:workspace-dsh 沿用 workspace/ 白名单(只版本化顶层 *.md);
  新增忽略 acpx/ 插件运行产物

验证:ACP 三条途径均通过(独立冒烟、显式 sessions_spawn、自然语言「转给 dsh」),
DSH 侧会话留痕与产物落地见 docs 文档 §5 与 §7。
2026-09-16 17:40:53 +08:00

3.1 KiB
Raw Blame History

name, description
name description
delegate-to-dsh 把任务交给 DSHDeepSeek Harness)执行:用户说「交给 dsh」「让 dsh 干」「用 DSH 跑」「dsh 那边做」「转给 dsh」时使用;也适用于希望由外部编码 harness 承接的重活(长时间编码、批量命令、仓库级改动)。

把任务交给 DSH

DSH 是本机通过 ACP 接入的外部编码 harnessOpenClaw agent id = dsh)。它有自己的模型、工作目录和工具,适合承接写代码、跑命令、仓库级改动这类"实活"。

唯一正确的调用方式

sessions_spawn必须显式带 ACP 运行时

{
  "task": "<完整、自包含的任务描述:目标 + 交付物 + 路径 + 验收标准>",
  "runtime": "acp",
  "agentId": "dsh",
  "mode": "run"
}
  • runtime 默认是 subagentOpenClaw 内嵌),省略它就会由你自己执行 —— 那等于没交给 DSH。
  • agentId 必须是 dsh(在 agents.entries 里已配置 runtime.type="acp",解析到 acpx harness dsh)。
  • 需要跨消息延续同一份上下文时才用 mode: "session"(并要求 thread: true,微信/飞书渠道不支持线程绑定,所以日常用 run)。
  • 任务描述要写全:DSH 看不到本会话的历史。

纪律

  1. 不要自己兜底执行。 不要改用 exec、不要改用默认 subagent、不要"我先做一遍再让 dsh 看"。用户要的是 DSH 干活。
  2. 不要静默降级。 ACP spawn 失败(例如 dispatch_failedUnknown agent id、超时)时,如实把错误原文回给用户,不要假装已派发。
  3. 结果原样回传。 把 DSH 的回复贴回来(可加一句你自己的核对/摘要),并说明它的 runId 或子会话键,便于追溯。
  4. 配对核验(可选)。 涉及文件改动时,可自己只读核对(execls/cat)后说明"我独立核验过",但要标注清楚哪句是 DSH 原话。

验证派发是否真的发生

只看回复文本会被骗:模型可能一边说"已交给 dsh",一边由 OpenClaw 内嵌运行时执行完了。真正的证据是:

# 1) 网关日志里出现 ACP 子会话
journalctl --user -u openclaw-gateway --since "10 minutes ago" | grep "agent:dsh:acp:"

# 2) DSH 侧新增会话目录
ls -lt ~/.dsh/sessions/--home-yangxuan-.openclaw-workspace-dsh--/ | head

两处都没有 → 这次并没有真的走 ACP。

环境事实(2026-09-16 实测,bk02

  • openclaw config get acpbackend=acpxdefaultAgent=dshallowedAgents=["dsh"]stream.deliveryMode=live
  • openclaw config get plugins.entries.acpx.config.agents.dshcommand=/home/yangxuan/.nvm/versions/node/v26.8.2/bin/dshargs=["--profile","acp"]
  • 微信 / 飞书 / 钉钉渠道不支持 ACP 会话绑定(conversationBindings 能力缺失),所以 /acp spawn dsh --bind here 在这些渠道不可用;持久 bindings[] type="acp" 同样依赖适配器的绑定钩子,三家都没有。只能靠本次派发
  • 完整文档:~/.openclaw/docs/bk02-dsh-openclaw-ACP集成.md