DSH ⇄ TRAE 互为 Subagent 桥接
让 DSH (DeepSeek Harness) 与 TRAE (IDE agent) 可以互相委派任务。
- TRAE → DSH:TRAE 说「让 DSH 执行…」→ 调用
bin/dsh-ask.cmd无头跑 DSH,拿回最终回答 - DSH → TRAE:DSH 的模型用
subagent_trae工具 → 写文件队列 → TRAE 侧/dshskill 认领执行 → 写回结果
TRAE ──(dsh-ask.cmd 无头调用)──► DSH 交付物 1
DSH ──(subagent_trae 工具→文件队列桥)──► TRAE 交付物 2
目录结构
dsh-trae-bridge/
├── dsh-subagent-trae/ # DSH 侧桥接插件(subagent provider: trae)
│ └── lib/index.js
├── bin/dsh-ask.cmd # TRAE→DSH 无头 CLI 包装(自动探测 DSH 安装路径)
├── trae-skills/dsh/SKILL.md # TRAE 侧 skill:处理 DSH 投递的任务(/dsh 触发)
├── trae-agents/dsh.md # TRAE 侧 agent:把任务委派给 DSH(让 DSH 执行…)
├── profiles/ # cordis.patch.yml 示例(desktop / headless)
├── test/ # 4 套测试,45+ 项
├── OPTIMIZATION-NOTES.md # 可靠性/压缩/安全设计记录
└── README.md
快速开始
0. 准备
- DSH Desktop 已安装(本插件依赖
desktop-cli.js/ headless profile) - TRAE 已安装,且可安装自定义 skill 与 agent(
~/.trae-cn/skills、~/.trae-cn/agents)
1. 决定桥目录
桥目录默认 ~/.dsh-trae/bridge(即 %USERPROFILE%\.dsh-trae\bridge),也可用环境变量覆盖:
# 可选:自定义桥目录
setx DSH_TRAE_BRIDGE_DIR "D:/path/to/your/bridge"
2. 安装 DSH 侧插件
把 dsh-subagent-trae/ 目录放进 DSH 的 profile 依赖。desktop profile 手动布放:
$dst = "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-subagent-trae"
New-Item -ItemType Directory -Path "$dst\lib" -Force | Out-Null
Copy-Item "<REPO_DIR>\dsh-subagent-trae\package.json" "$dst\"
Copy-Item "<REPO_DIR>\dsh-subagent-trae\lib\index.js" "$dst\lib\"
# 用示例配置替换 cordis.patch.yml(先按下面第 3 步填好 <BRIDGE_DIR>)
Copy-Item "<REPO_DIR>\profiles\desktop-cordis.patch.yml" "$env:USERPROFILE\.dsh\profiles\desktop\cordis.patch.yml" -Force
3. 配置 cordis.patch.yml
参考 profiles/desktop-cordis.patch.yml,把 <BRIDGE_DIR> 换成你的桥目录:
- insert:
- id: subagent-trae
name: dsh-subagent-trae
config:
providerName: trae
bridgeDir: "C:/Users/<you>/.dsh-trae/bridge" # 或留空走默认/环境变量
timeoutMs: 900000
pollIntervalMs: 2000
# 可选优化项:
# maxConcurrent: 1
# retryCount: 0
# allowedCwdPrefixes: ["C:/Users/<you>"]
# maxFileAgeDays: 7
# sharedSecret: ""
# maxPromptChars: 20000
# maxResultChars: 20000
- id: tool-subagent-trae
name: "@deepseek-ai/dsh-tool-subagent"
config:
provider: trae
toolName: subagent_trae
enableRunInBackground: false
maxDepth: provider-managed
必须重启 DSH Desktop 并新建会话,subagent_trae 工具才会出现。
4. 安装 TRAE 侧 skill 与 agent
# skill:处理 DSH 投递的任务
Copy-Item -Recurse "<REPO_DIR>\trae-skills\dsh" "$env:USERPROFILE\.trae-cn\skills\dsh"
# agent:把任务委派给 DSH
Copy-Item "<REPO_DIR>\trae-agents\dsh.md" "$env:USERPROFILE\.trae-cn\agents\dsh.md"
把 trae-skills/dsh/SKILL.md 里的 <BRIDGE_DIR> 也换成你的桥目录。
5. 使用
DSH → TRAE(在 DSH 对话里):
用 subagent_trae 工具问 TRAE:<你的问题>
然后在 TRAE 里输入 /dsh(或说「处理DSH任务」)触发 skill 认领任务。
TRAE → DSH(在 TRAE 对话里):
让 DSH 执行:<你的任务>
TRAE 的 dsh agent 会调用 bin/dsh-ask.cmd 无头执行 DSH。
配置项一览
| 配置键 | 默认值 | 说明 |
|---|---|---|
providerName |
trae |
provider 名 |
bridgeDir |
~/.dsh-trae/bridge(或 DSH_TRAE_BRIDGE_DIR) |
桥目录 |
timeoutMs |
900000 |
单次超时;重试总预算 = timeoutMs×(retryCount+1) |
pollIntervalMs |
2000 |
轮询间隔上限(指数退避上限) |
pollBackoffMs |
200 |
轮询初始间隔 |
maxConcurrent |
1 |
DSH 侧并发轮询上限 |
retryCount |
0 |
error 后自动重投递次数 |
allowedCwdPrefixes |
[] |
cwd 白名单(空=不限制) |
maxFileAgeDays |
7 |
过期文件清理天数 |
sharedSecret |
"" |
非空则写 HMAC 签名(防伪造) |
maxPromptChars |
20000 |
DSH→TRAE prompt 压缩上限 |
maxResultChars |
20000 |
TRAE→DSH 结果截断上限 |
上下文防爆炸
桥两端只传任务指令文本,不传对方完整会话。DSH→TRAE 超限时走滑动窗口压缩(窗口 5/step 1/min 1,最多 3 个语义窗口),关键行按权重标记(路径 +10、指令词 +5/个)全部前置且永不丢失。TRAE→DSH 方向 dsh-ask.cmd 拒绝超 15000 字符的指令。详见 OPTIMIZATION-NOTES.md。
测试
node test/optimize-check.mjs # 20 项
node test/review-fixes-check.mjs # 6 项
node test/context-guard-check.mjs # 7 项
node test/sliding-window-check.mjs # 12 项
测试从 %USERPROFILE%\.dsh\profiles\desktop\node_modules\dsh-subagent-trae 导入插件(按 README 布放后即可运行)。
已知限制
- 队列桥需 TRAE 侧触发(
/dsh),非全自动 - TRAE 执行任务消耗 TRAE 积分;
retryCount>0会成倍消耗 - 桥目录明文可见;
sharedSecret只防伪造不防窥 - DSH 侧插件改动需重启 DSH Desktop 生效
故障排查速查
| 现象 | 排查 |
|---|---|
| queue 有 pending 但 results 永不出现 | TRAE 是否运行?是否输入 /dsh?cwd 是否被白名单丢弃? |
| DSH 报 error | 看 results/*.json 的 stopReason;带 lastFailure 则是重试仍失败 |
任务 failed + orphaned |
上次进程 claimed 后崩溃,启动自愈(正常) |
| 队列文件半截 JSON | 撕裂写;双方重试,日志出现一次 corrupt 告警后恢复 |
| 结果缺尾 | truncated: true 被压缩——向对端索取缺失上下文 |
还没有评论,来写第一条。