DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-peer-link

d

dsh-peer-link

Manifest valid

Link 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

UI (client)hasBundlePatch

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 端口每次启动都可能变化,所以对端地址只是缓存。调用对端时依次尝试:

  1. 缓存地址。先用 2 秒的 TCP 探测,连不上就跳过。必须拿到用对端密钥签名的响应才算找到;旧端口被别的程序占用时,那个程序给不出签名,会被跳过。
  2. 局域网发现。在 UDP 47788 上发查询,用组播(239.255.77.88)、各网卡广播,再向对端已知 IP 单播。查询里只带由密钥派生的短 ID 和 HMAC,只有持有同一密钥的对端会回复自己当前的端口,回复同样带签名。UDP 端口用共享方式绑定(SO_REUSEADDR),不会独占,也不会因为被占用而启动失败。
  3. 配对码里的地址,作为最后手段。

此外,对端启动时和每 60 秒会广播一次签名公告,已配对的一方收到后直接更新缓存。

两台机器只要在同一局域网里,换端口、换 IP(DHCP)、重启后都能自动重新找到对方。跨网段时组播和广播不通,就靠向已知 IP 单播。

安装后的授权

启用插件后,界面会弹窗询问:是否允许对端会话完全访问本机。

对端发来的任务在本机新开会话、无人值守地执行。默认沙箱下,需要审批的操作会让任务卡住;在 Windows 上,默认沙箱甚至无法启动 PowerShell(退出码 0xC0000142)。

  • 允许完全访问:把 permissionPreset 设为 danger-full-access。这些会话不受沙箱限制、不经审批,可以读写任意文件、执行任意命令,所以只与自己信任的设备配对。
  • 暂不:保持本机默认权限。

无论选哪个,选择都会记在 ~/.dsh/peer-link/state.json,不会再弹窗。之后可以在设置页的「对端会话的权限预设」里修改。只影响对端发来的新会话,不影响本机自己的会话。

配对(一次性)

  1. 两台机器都安装本插件。
  2. 在 A 机:设置 → 插件 → DSH 互联 → 配置,在「配对」里点「显示配对码」→「复制」。码也写在 ~/.dsh/peer-link/pairing-code.txt(Windows:%USERPROFILE%\.dsh\peer-link\pairing-code.txt)。
  3. 在 B 机的同一页面,把码粘贴到「对端配对码」,点「配对」。也可以对 agent 说「用 peer_dsh 配对,code 用文件 <绝对路径>」。传文件路径可以让密钥不进入对话记录。
  4. 插件会把自己的配对码回传给对端,双方因此互相配对。配对码里含密钥,不要贴到公共场合。

密钥和对端列表保存在 ~/.dsh/peer-link/state.json(权限 0600),不进 profile 的 cordis.patch.yml。

Windows 安装

  1. 安装 DSH:https://download.deepseek.com/dsh-desk/bin/win-x64/deepseek-harness-0.2.1-rc.2-win-x64.exe。

  2. 把本目录拷到 Windows,例如 C:\dsh-plugins\dsh-peer-link。在 DSH 里让 agent 用 plugin_manager install_bundle 安装,target 填这个绝对路径。

  3. 放行防火墙。端口是随机的,所以按程序放行,不按端口。在 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 首次监听时弹出了「允许访问」对话框,勾选「专用网络」也行。

  4. 在弹出的授权窗口里选择「允许完全访问」(见「安装后的授权」)。

  5. 按上面的步骤配对。

设置页

设置 → 插件 → DSH 互联 → 配置 打开设置页。页面分为以下几块:

  • 本机:显示名称、监听地址、发现端口的当前状态。
  • 已配对的对端:在线状态、地址、系统。可以刷新;解除配对要点两次确认。
  • 配对:粘贴对端配对码完成配对,或者显示并复制本机的配对码。
  • 网络 / 委派 / 对端权限:编辑下表中的全部配置。点「保存」后立即生效,不用重启;改了端口或监听设置,监听器会自动重建。

页面的实时数据走本插件注册的 POST /peer-link/rpc。这个接口受 Web 连接的鉴权和 Origin 校验保护,执行的操作与 peer_dsh 工具相同。配置本身通过 DSH 的设置服务写入 profile。

字段默认说明
displayName主机名本机在对端显示的名称
listentrue是否接收对端请求
host0.0.0.0监听地址
port0HTTP 端口;0 表示随机空闲端口,优先沿用上次的。填固定值时,如果被占用会自动退回随机端口
discoveryPort47788发现用的 UDP 端口(共享绑定)。两侧必须一致
allowCidrs私网地址段允许连入的地址
allowedRoots空对端可用的工作目录根;空为不限制
remoteCwd空委派到对端时的默认目录(对端路径)。为空时,若本机当前目录在对端也存在就用它,否则用对端默认目录
subagentPeer空有多个对端时 subagent_peer 用哪一个
permissionPreset空对端发来的新会话用的权限预设,例如 danger-full-access。无人值守时审批弹窗会让任务卡住
delegationNotetrue在委派任务前加一段"无人值守、自行决策、最后汇报"的说明

限制

  • 只传文本,不传图片和附件。
  • 子代理的回复是对端每一轮的最终文本;对端的中间过程(工具调用等)留在对端会话里,可用 peer_dsh action=read 查看。
  • 回答对端提问时,同一段文字作为该次提问里每个问题的自定义回答。
  • 传输是明文 HTTP,内容可被同一局域网的人看到(密钥不会)。不要跨不可信网络使用。
  • 两台机器的时钟偏差需要在 5 分钟以内。
  • 发现协议只在局域网内有效(组播 TTL=1)。跨网段需要能路由到对端 IP。

Comments

Loading…