dsh-peer-link
Manifest validLink DeepSeek Harness (DSH) instances on the LAN: delegate subagents to another machine's DSH, continue its sessions, with signed auto-discovery and a visual settings page
DSH 互联(@local/dsh-peer-link)
把局域网里另一台电脑上的 DeepSeek Harness 当作子代理使用。对端会话是一个完整的 agent,有它那台机器自己的 shell、文件和工具。
提供什么
| 能力 | 说明 |
|---|---|
subagent_peer 工具 | 标准委派工具(dsh-tool-subagent),挂在 peer provider 上。任务在对端 DSH 新开会话执行,完成后以通常的子代理完成通知把最终回复送回来。子代理可以续接:用 send_message 继续追问、补充指示或回答对端的提问,见下文。 |
peer_dsh 工具 | peers 列出对端及在线状态;pair 用配对码配对;unpair 删除对端;run 新开或续接对端会话并等待回复(对端有待回答的提问时,内容作为回答交给它);sessions 列出对端会话;read 读最近消息;cancel 中止对端当前回合。 |
peer-link 模型通道 | subagent_peer 子代理专用的模型通道,把子代理的每一轮交给对端会话执行。模型 auto 用默认对端,也可以直接选某个对端名。 |
| 局域网端点 | HTTP 监听随机空闲端口(优先沿用上次的端口),对端通过下面的发现协议自动找到,不会和其他程序抢端口。只接受带 HMAC 签名的请求,响应也带签名;密钥不在网络上传输。带时间戳和一次性随机串,防重放;有 IP 白名单和失败限流。 |
对端会话的标题以 [发起方名称] 开头,在对端界面里一眼能看出是谁派的任务。
子代理续接
subagent_peer 的子代理是本机的普通可续接子代理,只是它的"模型"是对端 DSH:
- 每个子代理对应对端的一个会话。第一轮新建会话,之后每一轮都发到同一个会话,对端保留完整上下文。
- 子代理结束后,父代理用
send_message发消息,子代理会被唤醒,消息发到同一个对端会话继续处理,回复照常以完成通知送回。 - 对端还在处理时发来的消息,会立即转给对端正在运行的那一轮(steer),不用等它结束。
- 对端调用
ask_user_question而无人回答时,回复里会列出问题;下一条send_message会作为回答交给对端,对端随即继续。 - 停止子代理会同时中止对端当前回合。DSH 关闭或重载插件时不取消对端,重启恢复后继续等待同一回合。
- 子代理与对端会话的对应关系保存在
~/.dsh/peer-link/links.json,重启后仍能续接。 - 在本机界面里可以打开子代理会话查看往来记录,也可以直接在里面输入,输入的内容同样转给对端。
配套 skill
skills/dsh-peer-link/SKILL.md 教 agent 什么时候、怎么用这两个工具:选哪个工具,怎么写委派任务,怎么续接、回答对端提问,以及常见错误怎么处理。插件本身不加载它;把整个 dsh-peer-link 目录放进 skill 目录即可,例如 ~/.agents/skills/(多个 agent 共用)或 ~/.dsh/skills/(只给 DSH 用)。
mkdir -p ~/.agents/skills
cp -R skills/dsh-peer-link ~/.agents/skills/
怎么找到对端(发现协议)
HTTP 端口每次启动都可能变化,所以对端地址只是缓存。调用对端时依次尝试:
- 缓存地址。先用 2 秒的 TCP 探测,连不上就跳过。必须拿到用对端密钥签名的响应才算找到;旧端口被别的程序占用时,那个程序给不出签名,会被跳过。
- 局域网发现。在 UDP
47788上发查询,用组播(239.255.77.88)、各网卡广播,再向对端已知 IP 单播。查询里只带由密钥派生的短 ID 和 HMAC,只有持有同一密钥的对端会回复自己当前的端口,回复同样带签名。UDP 端口用共享方式绑定(SO_REUSEADDR),不会独占,也不会因为被占用而启动失败。 - 配对码里的地址,作为最后手段。
此外,对端启动时和每 60 秒会广播一次签名公告,已配对的一方收到后直接更新缓存。
两台机器只要在同一局域网里,换端口、换 IP(DHCP)、重启后都能自动重新找到对方。跨网段时组播和广播不通,就靠向已知 IP 单播。
安装后的授权
启用插件后,界面会弹窗询问:是否允许对端会话完全访问本机。
对端发来的任务在本机新开会话、无人值守地执行。默认沙箱下,需要审批的操作会让任务卡住;在 Windows 上,默认沙箱甚至无法启动 PowerShell(退出码 0xC0000142)。
- 允许完全访问:把
permissionPreset设为danger-full-access。这些会话不受沙箱限制、不经审批,可以读写任意文件、执行任意命令,所以只与自己信任的设备配对。 - 暂不:保持本机默认权限。
无论选哪个,选择都会记在 ~/.dsh/peer-link/state.json,不会再弹窗。之后可以在设置页的「对端会话的权限预设」里修改。只影响对端发来的新会话,不影响本机自己的会话。
配对(一次性)
- 两台机器都安装本插件。
- 在 A 机:设置 → 插件 → DSH 互联 → 配置,在「配对」里点「显示配对码」→「复制」。码也写在
~/.dsh/peer-link/pairing-code.txt(Windows:%USERPROFILE%\.dsh\peer-link\pairing-code.txt)。 - 在 B 机的同一页面,把码粘贴到「对端配对码」,点「配对」。也可以对 agent 说「用 peer_dsh 配对,code 用文件 <绝对路径>」。传文件路径可以让密钥不进入对话记录。
- 插件会把自己的配对码回传给对端,双方因此互相配对。配对码里含密钥,不要贴到公共场合。
密钥和对端列表保存在 ~/.dsh/peer-link/state.json(权限 0600),不进 profile 的 cordis.patch.yml。
Windows 安装
-
安装 DSH:
https://download.deepseek.com/dsh-desk/bin/win-x64/deepseek-harness-0.2.1-rc.2-win-x64.exe。 -
把本目录拷到 Windows,例如
C:\dsh-plugins\dsh-peer-link。在 DSH 里让 agent 用plugin_manager install_bundle安装,target 填这个绝对路径。 -
放行防火墙。端口是随机的,所以按程序放行,不按端口。在 DSH 运行时打开管理员 PowerShell:
$exe = (Get-Process | Where-Object { $_.Path -like '*DeepSeek Harness*' } | Select-Object -First 1).Path $exe # 确认路径 New-NetFirewallRule -DisplayName "DSH peer-link" -Direction Inbound -Program $exe -RemoteAddress LocalSubnet -Action Allow这条规则同时覆盖 TCP(随机端口)和 UDP 47788(发现)。如果 Windows 首次监听时弹出了「允许访问」对话框,勾选「专用网络」也行。
-
在弹出的授权窗口里选择「允许完全访问」(见「安装后的授权」)。
-
按上面的步骤配对。
设置页
设置 → 插件 → DSH 互联 → 配置 打开设置页。页面分为以下几块:
- 本机:显示名称、监听地址、发现端口的当前状态。
- 已配对的对端:在线状态、地址、系统。可以刷新;解除配对要点两次确认。
- 配对:粘贴对端配对码完成配对,或者显示并复制本机的配对码。
- 网络 / 委派 / 对端权限:编辑下表中的全部配置。点「保存」后立即生效,不用重启;改了端口或监听设置,监听器会自动重建。
页面的实时数据走本插件注册的 POST /peer-link/rpc。这个接口受 Web 连接的鉴权和 Origin 校验保护,执行的操作与 peer_dsh 工具相同。配置本身通过 DSH 的设置服务写入 profile。
| 字段 | 默认 | 说明 |
|---|---|---|
displayName | 主机名 | 本机在对端显示的名称 |
listen | true | 是否接收对端请求 |
host | 0.0.0.0 | 监听地址 |
port | 0 | HTTP 端口;0 表示随机空闲端口,优先沿用上次的。填固定值时,如果被占用会自动退回随机端口 |
discoveryPort | 47788 | 发现用的 UDP 端口(共享绑定)。两侧必须一致 |
allowCidrs | 私网地址段 | 允许连入的地址 |
allowedRoots | 空 | 对端可用的工作目录根;空为不限制 |
remoteCwd | 空 | 委派到对端时的默认目录(对端路径)。为空时,若本机当前目录在对端也存在就用它,否则用对端默认目录 |
subagentPeer | 空 | 有多个对端时 subagent_peer 用哪一个 |
permissionPreset | 空 | 对端发来的新会话用的权限预设,例如 danger-full-access。无人值守时审批弹窗会让任务卡住 |
delegationNote | true | 在委派任务前加一段"无人值守、自行决策、最后汇报"的说明 |
限制
- 只传文本,不传图片和附件。
- 子代理的回复是对端每一轮的最终文本;对端的中间过程(工具调用等)留在对端会话里,可用
peer_dsh action=read查看。 - 回答对端提问时,同一段文字作为该次提问里每个问题的自定义回答。
- 传输是明文 HTTP,内容可被同一局域网的人看到(密钥不会)。不要跨不可信网络使用。
- 两台机器的时钟偏差需要在 5 分钟以内。
- 发现协议只在局域网内有效(组播 TTL=1)。跨网段需要能路由到对端 IP。
Comments
Loading…