本文档是给 DSH(DeepSeek Harness)的部署 prompt,不是给人看的教程。 首次安装
dsh-agent-relay插件后,DSH 必须完整阅读本文档,并亲自完成部署操作。 部署采用 Agent 驱动方式:由你(DSH)完成 broker 初始化、启动、Agent 接入与验证。不要依赖"复制粘贴"的手动流程,也不要让用户自己敲命令。
你是部署执行者。任务:把多 Agent 协作中继(dsh-agent-relay)部署到本机,让各 Agent(dsh / Codex / Claude / Hermes / 其他)能经 broker 安全互发消息。
- 你负责:初始化配置与密钥、启动 broker、接入各 Agent、验证闭环。
- 只动与 relay 相关的文件与配置;不改动各 Agent 的其他配置、会话历史、技能文件。
- 完成标准见第 3 节验证清单,全部满足才算完成。
| 模式 | 适用 | 说明 |
|---|---|---|
| 单机(默认) | 本机多 Agent | broker 与 Agent 同机,全回环 127.0.0.1:19121,零网络暴露 |
| 分布式(进阶) | 多台机器 | 一台服务器 + 各机器 Agent;必须 TLS,secret 分发要谨慎 |
- 模式:默认单机回环;用户要跨机器才选分布式。
- broker host/port:默认
127.0.0.1:19121;改端口只需改broker/config.yaml。 - 接入哪些 Agent:默认接入已检测到的(dsh 插件 / CLI 客户端 / Python 客户端),检测不到的不接。
| 组件 | 位置 | 用途 |
|---|---|---|
| broker | <包目录>/broker/ |
零依赖 Node 中继服务(HMAC 认证 / JSONL 存储 / HTTP 服务) |
| setup | <包目录>/setup/ |
setup.js:init(生成密钥+配置)/ start(启动)/ selfcheck(验证) |
| dsh 插件 | <包目录>/lib/ |
relay_send / relay_recv / relay_peers / relay_history 模型工具 |
| CLI 客户端 | <包目录>/adapters/cli/relay.mjs |
脚本 / Codex / Claude 包装用 |
| Python 客户端 | <包目录>/adapters/hermes/relay_client.py |
纯标准库,Hermes 风格接入 |
路径注意:
<包目录>= 你(DSH)能找到本插件包的位置。若是 npm 安装,通常在<profile>/node_modules/dsh-agent-relay/;若是 git clone,就是仓库根目录。用实际解析结果,不要假设。
- 完整读完本文档。
- 确认模式(1.2):单机回环(默认)还是分布式。
- 记录
<包目录>与决定。
- 检查
<包目录>/broker/src/index.js、<包目录>/setup/setup.js、<包目录>/lib/index.js存在。 - 缺失 → 说明包不完整,改用
git clone https://github.com/Noelune/dsh-agent-relay.git后重试。
- 运行
node <包目录>/setup/setup.js init。 - 生成
broker/config.yaml,内含一个随机 64-hex 密钥。绝不提交、不外泄、不写入任何日志。 - 若已存在 config.yaml:保留,直接复用其中的 secret(幂等)。
- 前台启动:
node <包目录>/setup/setup.js start(会按 config.yaml 绑定)。 - 或后台/容器:见
docs/DEPLOY.md的 Docker 小节。 - 启动后验证:
node <包目录>/setup/setup.js selfcheck→all checks passed。 - 单机模式:确认 broker 绑定
127.0.0.1(config.yamlhost: 127.0.0.1),不要改成0.0.0.0除非后面有 TLS。
- dsh(插件):
dsh plugin --profile web add dsh-agent-relay- 配置共享密钥:
DSH_RELAY_SECRET=<config.yaml 里的 secret>(环境变量或插件设置),以及稳定的DSH_RELAY_AGENT=<名字>。
- CLI 客户端(脚本 / Codex / Claude 包装):
node adapters/cli/relay.mjs register --agent alpha --secret <secret>- 用
peers确认上线。
- Python 客户端(Hermes 风格):
from relay_client import RelayClient; client = RelayClient(broker_url="http://127.0.0.1:19121", agent="beta", secret="<secret>"); client.register()
- 每个接入的 Agent 名字要稳定唯一;重启后重新
register(心跳续期)。
node <包目录>/setup/setup.js selfcheck→all checks passed。- 端到端:两个 Agent 互发一条消息,接收方
recv能取到(node adapters/cli/relay.mjs send <b> "hello" --agent <a> --secret <s>,再recv)。 - 若接了 dsh 插件:确认
relay_peers工具能看到已注册 Agent。
按第 4 节格式输出部署报告。
-
broker/config.yaml存在,含 ≥32 位随机 secret,且未被纳入版本控制。 - broker 启动,
selfcheck全部 ok(config 有效 / broker 可达 / 插件模块加载)。 - 至少两个 Agent 注册成功,
peers能看到它们。 - 一条消息端到端送达(发送方收到
accepted:true,接收方recv取到)。 - (v1.1 租约)接收方用
pull取到消息 → 处理完成后ackcompleted→ 状态变done;retry会 attempts+1 并重新入队。 - 单机模式 broker 绑定回环地址;未向公网暴露明文端口。
- 未在任何日志、配置、汇报中出现 secret 明文以外的敏感信息。
- 消息内容仅存于 broker 的 TTL 限定期限投递队列(JSONL,默认 7 天清理),绝不写入应用日志;插件只记内存 id 级历史。
## 部署完成报告
**模式**:单机回环 / 分布式
**broker**:<host>:<port>(config.yaml 路径)
**密钥**:已生成/复用(长度 <N> hex,绝不回显)
| Agent | 接入方式 | 注册名 | 验证 |
|---|---|---|---|
| dsh | 插件 | <agent> | ✅/❌ |
| CLI | adapters/cli | alpha | ✅/❌ |
| Python | adapters/hermes | beta | ✅/❌ |
**selfcheck**:全部 ok / 列出失败项
**备注**:未满足的清单项、需要用户确认的事项(如分布式服务器、端口占用)、下一步(重启各 Agent 会话使插件生效)
- 密钥即凭据:
broker/config.yaml含共享密钥,绝不提交版本库、绝不进日志/汇报。分布式部署用带外方式(密码管理器/密封信封)分发。 - 单机默认回环:broker 默认
127.0.0.1。绝不要把明文 broker 暴露到公网——HMAC 只防伪造不防窃听。 - 分布式必须 TLS:跨机器部署时,broker 保持回环绑定,用反向代理(nginx/Caddy)终结 HTTPS,再转发到
127.0.0.1:19121。 - 端口占用:19121 被占用时报错——改
broker/config.yaml的port,并同步各 Agent 的DSH_RELAY_BROKER_URL。 - Agent 名字稳定唯一:接入时用固定名字,避免每次随机。
- 幂等反复部署:config.yaml 已存在时保留复用;重复
register无害(心跳续期)。 - Windows:路径用
C:/或C:\形式;Node ≥ 20;不要在 shell heredoc 里拼多行配置。 - 不碰无关配置:各 Agent 的其他配置、会话历史、技能文件不在本任务范围。
- 无法满足的项:任何一步遇到障碍(端口被占、权限不足、包不完整),停下来在汇报里说明,不要绕过或降级完成。
dsh-agent-relay 只负责消息中继,不存记忆。共享记忆请用 unified-agent-memory(Obsidian vault 为最高事实源)。 两者可同时部署:relay 让 Agent 互发消息,unified-agent-memory 让它们共享事实。