dsh-phone-remote:用自建中继把 DSH 实例交给手机

前言

DSH 的会话、审批和终端操作都绑定在电脑端。想离开工位继续跟进一次长任务,通常的做法是把电脑开着、开远程桌面,或者临时找一台能在移动端跑的壳子。这个插件走的是另一条路径:在 Host 机器和手机之间放一个自建 relay,手机只连 relay,relay 把 RPC 转发回 DSH 实例,会话列表、流式对话、审批、附件、终端、文件浏览都由此转发。在 DSH web GUI 里还有一个本地控制台,安装后不需要改配置文件、也不需要单独部署服务。

下面介绍的是社区维护者 yubi233 的 dsh-phone-remote。它属于客户端分类,是 dsh-web-remote 的 DSH Host 插件:手机侧通过专用移动壳接入,Host 侧负责注册、维持连接、桥接 RPC 并挂载控制台路由。

这是什么

一句话定位:Host 端插件,把一台运行 DeepSeek Harness 的机器接进中继,让手机远程使用它。

仓库情况:yubi233/dsh-phone-remote,MIT 许可证,版本 0.2.4,TypeScript,node >= 22,DSH 引擎要求 >=0.1.2-alpha.4,客户端平台为 web。GitHub 星标 0、fork 1。这是个人项目,不是官方应用,社区目录也是独立站点。

仓库里有一个在线演示,地址是 https://yubi233.github.io/dsh-phone-remote/。需要说明的是它是纯前端 mock:没有 relay、没有真实会话,渠道名已脱敏为「演示渠道 A–E」,数据全部在浏览器内模拟。想判断真实行为,只能自己装一次。

结构:一个包,两个半区

这个包同时包含 Node 侧逻辑和浏览器侧逻辑,两个 exports 入口:. 指向 lib/index.js,./client 指向 lib/client.js。

  • Host 半区(lib/index.js,Node):cordis 插件。向 relay 注册本机、维持出站 WebSocket,把手机 RPC 桥接到 DSH;同时在 DSH web GUI 的 /api/web-remote/* 挂本地控制台路由,只接受本机或同源请求。
  • Client 半区(lib/client.js,浏览器):在 web GUI 里注入两个入口——「设置 → 手机远程」完整页,以及「插件 → dsh-phone-remote」详情页底部的同款区块。两个入口都能配置中继、生成配对码、管理已配对设备。

安装与启用

安装命令来自 README:

dsh plugin --profile web add dsh-phone-remote

装完重启 profile:

dsh web

设置导航里出现「手机远程」即安装成功。没有第二步配置:局域网模式下插件自带 relay 和手机壳静态页,不需要额外部署任何东西。

典型用法:局域网模式(默认)

  1. 打开 DSH 网页 → 设置 → 手机远程。状态卡直接给出局域网地址,例如 http://192.168.1.23:8787,并自动生成配对二维码。
  2. 手机连同一个 Wi-Fi,打开该地址即可使用;也可以点「配对手机」扫码;把这个地址发给别人同样可用。
  3. 已配对设备可在面板里随时撤销。

中继默认端口 8787,被占用时会自动换端口。Host 进程重启后本地中继自动恢复;设备配对记录持久化在 ~/.dsh/storages/web_remote_local_relay.json。

典型用法:接入外部 relay(服务器模式)

要让手机在局域网外访问,比如公网 VPS,走面板配置:在「中继服务器」里填外部 relay 地址与注册令牌,点「保存并连接」;随时可以点「使用局域网模式」切回。

外部 relay 的最小环境变量:

变量 作用
HOST / PORT 监听地址。公网部署必须前置 TLS
RELAY_REGISTRATION_TOKEN 注册本插件的共享密钥,公网必设
RELAY_TRUST_PROXY=1 反向代理后按真实客户端 IP 限速
RELAY_STORE_FILE 配对与令牌持久化
RELAY_STATIC_DIR 可选。托管手机壳静态页,即本包 shell/ 目录

不想用面板配置时,也可以在 patch 行里带 config:

- insert:
    - id: web-remote-host
      name: 'dsh-phone-remote'
      config:
        relayHttpUrl: https://relay.example.com
        hostId: <uuid>
        hostSecret: <secret>
        hostName: my-mac
        registrationToken: <RELAY_REGISTRATION_TOKEN>

注意这里的优先级:一旦 patch 里带了 config,面板修改会覆盖这里的值。

安全边界

  • 配对使用一次性 256-bit token,默认 5 分钟过期。claim 端点免鉴权,但按 IP 限速;换取的 device token 只返回一次,relay 只存哈希。
  • 控制台路由只接受本机回环或同源浏览器请求,跨源一律 403。
  • 单 Host 单手机:第二台设备接管后,60 秒内会升级为冲突,需要在面板撤销后重新配对。
  • 日志里不出现 token、prompt、附件内容。

有哪些已知限制

README 里明确写了两条:

  • 手机壳与 relay 的部署(含 HTTPS、登录门)不在这个包内,需要看仓库 deploy/README.md。
  • 审批和提问按 Session 路由;Host 进程重启后,等待中的旧审批不可回答。

另外还有一点来自插件本身的运行方式:它以当前 dsh 进程的权限执行操作。安装前应当检查源码与许可证,确认 relay 地址和注册令牌不会落到不该访问的人手里。

适用场景

适合已经在用 DSH、想从手机继续跟进会话和审批的人。局域网场景下它基本是零成本的:装完插件、手机连同一 Wi-Fi 就能用,不涉及改配置或部署服务。需要跨网络访问时,就得自己准备一个带 TLS 的 relay,这部分工作不在插件范围内。

结尾

核心价值是把「手机远程使用 DSH」从手写转发脚本变成一次 dsh plugin 安装,本地默认模式几乎不需要运维,权限面也收敛在 relay 和配对 token 上。

  • 目录页:https://www.skillhub.cn/plugins/yubi233/dsh-phone-remote
  • GitHub:https://github.com/yubi233/dsh-phone-remote
羽毛球分组比赛记分
小程序二维码

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

小夜