dsh-remote-dashboard:多机 DSH 会话只读墙屏看板

前言

在 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 提交到版本库。

链接

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye