前言¶
在 DeepSeek Harness(DSH)上同时跑多台机器时,会话标题、当前工具、待审批项分散在各台本机的 Web 界面里,换机器或挂墙屏巡检都要反复切地址。社区插件 dsh-remote-dashboard(维护者 stephenlstrange2)把多台 DSH 的会话快照汇总到一个 hub,用平板或大屏浏览器打开一页只读看板;agent 可被 hub 拉取,也可在 NAT/虚拟机侧 推送 快照。插件不修改 DSH 状态,服务端以 GET/HEAD 为主,另有一条受 token 约束的 POST /v1/push。
这是什么¶
dsh-remote-dashboard 是 DSH 的客户端类插件:面向墙屏/平板的只读、多机会话监视器。当前 package 版本为 0.2.0,许可证 MIT,依赖 Node >=22,无额外 npm 依赖、无构建步骤。DeepSeek Harness 生态里常见做法是「一切皆插件」;插件目录站 skillhub.cn 为社区收录,与 DeepSeek / 幻方无官方从属关系。
架构上,各台被监视机器(或 push 模式下的推送端)向 hub 提供快照;hub 对外提供平板页与 /api/fleet,浏览器用 viewerKey 访问(首次经 URL 参数,随后换为 HttpOnly cookie):
machine A (DSH) ──┐ agent GET /v1/snapshot (Bearer token)
machine B (DSH) ──┼──────────────► HUB (one DSH) ──► tablet browser http://hub:3090/?key=VIEWER_KEY
machine C (DSH) ──┘ polled every pollMs serves the page + /api/fleet
运行模式¶
| mode | 提供能力 | 典型用途 |
|---|---|---|
agent |
/v1/snapshot(需 token) |
每一台要被 hub 拉取快照的机器 |
hub |
平板页 + /api/fleet |
只做汇总的机器 |
both |
上述全部,并包含本机会话 | 既托管看板又监视本机 |
push |
不监听 host/port | NAT、VM、无入站:机器主动向 hub 推送快照 |
Peer 的 token 只保存在 hub;平板侧仅持有 viewer key。push 模式下 hub 根据自身配置与 token 识别机器名,不接受 payload 冒充他机。
核心功能¶
看板展示(只读)¶
每台机器:在线状态与往返时延(离线则显示错误;push 端可显示类似 push · 5s)、运行中会话数。每个会话:运行指示灯、标题、距上次活动时间、当前执行的工具、工作目录名、轮次、token 进出、活跃后台任务与 goal 进度。任意机器上的待审批/待回答问题会在橙色横幅和浏览器标签标题中提示。不可达机器会灰显并展示错误信息。
拉取与推送¶
- 拉取:hub 按
pollMs(示例为 3000 ms)向各 agent 的GET /v1/snapshot轮询。 - 推送:推送端按
pushMs向 hub 的POST /v1/push提交快照;超过max(10 s, 3 × pushMs)未收到 push 则视为离线。poll 与 push 的 peer 可混配。
安全相关行为(README 说明)¶
- 非 loopback 绑定需
allowRemote: true,且 agent 必须配置token、hub 必须配置viewerKey。 - 无 TLS;viewer key 会出现在首次打开的 URL 中。官方建议在 Tailscale 或其它 VPN、可信 LAN 内使用,不要端口映射到公网。
tokenFile(建议chmod 600)可把密钥移出可能提交的cordis.patch.yml。- 推送请求先校验 token 再读 body,body 上限 1 MB;存储侧有会话数、字段裁剪等边界。viewer key 不能用于 push,push token 不能打开页面。
安装与启用¶
安装命令来自项目 README(路径需换成你本机插件目录):
dsh plugin --profile web add /path/to/DSH-Dashboard
随后在对应 profile 的 cordis.patch.yml 顶层 YAML 列表中追加插件块。密钥可用:
openssl rand -hex 16
被 hub 拉取的每台机器(agent)(需 Tailscale/LAN 可达):
- id: dsh-remote-dashboard
config:
mode: agent
machine: lab-pc
host: 100.64.0.10 # 本机 Tailscale/LAN IP,不要用公网 IP
allowRemote: true # 非 loopback 时必填
port: 3090
token: <random 16+ chars>
hub 机器(示例为 both,同时包含本机会话):
- id: dsh-remote-dashboard
config:
mode: both
machine: hub-pc
host: 0.0.0.0 # 或 LAN/Tailscale IP
allowRemote: true
port: 3090
viewerKey: <random 8+ chars>
pollMs: 3000
peers:
- { name: lab-pc, url: 'http://100.64.0.10:3090', token: <that agent's token> }
- { name: home-nuc, url: 'http://100.64.0.11:3090', token: <...> }
无法被 hub 入站访问的机器(push):
推送端:
- id: dsh-remote-dashboard
config:
mode: push
machine: otx-box
hub: http://10.0.2.2:3090 # 示例:QEMU/Boxes 用户态 NAT 下 host 为 10.0.2.2
tokenFile: /home/me/.dsh-remote-dashboard-token # chmod 600;或改用 token: <16+ chars>
pushMs: 3000
hub 的 peers 中增加:
- { name: otx-box, push: true, tokenFile: /home/me/.otx-box-token, pushMs: 3000 }
配置完成后,在 hub 上执行一次:http://<hub>:3090/?key=<viewerKey>,浏览器会写入 cookie 并跳转到无 key 的 URL;可将该页加入平板主屏幕。
插件代码更新后需 重启 dsh web:patchReload: live 会重读配置但不会重载插件代码;旧代码可能拒绝含新字段(如 push peer)的配置。
从 dsh-monitor 迁移¶
0.2.0 之前插件曾用名 dsh-monitor(npm 上另有同名无关项目)。按 README:各机器 dsh plugin --profile web remove dsh-monitor,再 dsh plugin --profile web add dsh-remote-dashboard(或本地 clone 路径),运行 python3 scripts/apply-config.py YOUR_ENTRY.yml --migrate-from dsh-monitor 替换配置块中的 id,然后重启 dsh web;token 与 key 可保持不变。
适用场景与限制¶
适合:多台 DSH 开发机/实验机需要一块只读墙屏或平板总览;部分节点只能出站访问 hub 时配合 push 模式。
限制与注意(README 原文要点):
- 轮次、token、当前工具等「 live 指标」统计的是插件启动以来看过的事件。
- 仅存在于磁盘、未加载的会话不会出现在列表中。
- 页面使用 ES5 以兼容旧平板浏览器;纯 HTTP 下 Keep-awake 不可用,需调长屏保或使用 kiosk 浏览器。
- 插件随当前 dsh web 进程权限运行;安装前请自行审阅 GitHub 源码 与 MIT 许可证,勿将 viewerKey、peer token 提交到版本库。