前言¶
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 和手机壳静态页,不需要额外部署任何东西。
典型用法:局域网模式(默认)¶
- 打开 DSH 网页 → 设置 → 手机远程。状态卡直接给出局域网地址,例如
http://192.168.1.23:8787,并自动生成配对二维码。 - 手机连同一个 Wi-Fi,打开该地址即可使用;也可以点「配对手机」扫码;把这个地址发给别人同样可用。
- 已配对设备可在面板里随时撤销。
中继默认端口 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