dsh-remote-control:用浏览器经中继驱动完整的 DeepSeek Harness 客户端

前言

DeepSeek Harness(DSH)的主界面通常跑在本机 Electron 或 dsh web 提供的回环服务上。人不在电脑前时,常见做法是另做一个「远程控制台」:按 RPC 方法表重绘会话列表、审批和流式输出。只要 GUI 迭代,这种从外向内拼出来的界面就容易和本地客户端不一致——侧边栏对不上、审批延迟、流式文本不流。

dsh-remote-control(维护者 icrefin,GitHub 仓库 icrefin/dsh-remote-control)换了一条路:主机向自建或自管的中继出站连一条 WebSocket,中继把远端浏览器的 HTTP/WebSocket 反向代理到这条隧道上,主机再把流量重放到自己的回环 web 服务器。远端浏览器看到的字节与本地 GUI 相同,会话、审批、ask_user、文件、终端、设置、插件与 token 流式输出都随真实客户端而来,而不是在插件里逐块重写。

这是什么

一句话:从手机、平板或另一台桌面的浏览器,驱动正在运行 DSH 的那台主机,拿到的是完整 Harness Web 客户端,不是裁减版遥控面板。

插件分类为 DSH 社区目录中的「客户端」类插件;项目采用 MIT 许可证,当前 package 版本为 0.9.8,要求 Node >=22.17.0,DSH >=0.2.1-rc.5 且 <0.2.2-0。插件与中继随同一仓库发布,需成对部署,版本策略见下文「版本与配对」。

核心功能

隧道代理,而非移动端 SPA

插件只负责打开出站 WebSocket 并完成隧道重放,不维护独立的方法表 UI。相对早期自建移动端 SPA 的方案,这类「子集界面永远过时」的问题被架构上规避;代价是中继会终结浏览器侧的 HTTP(明文可见性见安全说明)。

中继与 Relay server 配置

主机主动拨号到中继,浏览器通过中继访问主机。中继是依赖较少的 Node 程序,随包位于 relay/。插件不预置默认中继——在你填写 origin 之前,面板只会说明未配置,不会连到第三方服务器。

Relay server 经 Harness settings service 写入 profile 的 cordis.patch.yml;环境变量 DSH_REMOTE_RELAY 优先级更高,设置后面板字段会禁用且显示 from DSH_REMOTE_RELAY。保存合法 origin(仅 http:/https:,无路径)后,若链路已启动,会立即按新 origin 重启。

连接测试与配对

面板提供 Test connection,按步骤检查:中继是否配置、 /healthz 是否可达、中继与插件兼容线版本是否一致、主机 socket 是否挂上、中继是否识别本会话、以及经隧道的往返帧。配对 token 一次性且默认约 10 分钟有效;刷新含 token 的页面或重复打开链接会导致 token 已失效,需从面板重新生成链接。

Start / Stop 与会话寿命

Start 向中继出站连接并展示二维码或链接;Stop 结束配对而非暂停,泄漏链接也可靠 Stop 撤销。应用重启会续上同一会话,已配对浏览器通常仍可继续使用;这与 Stop 的语义不同。

中继密钥存放在 ~/.dsh/relay-secret(权限 0600),不在 profile 文档里;面板可读打码内容。浏览器配对 cookie 寿命与中继侧状态相关,链接与配对的区别见官方 README 表格说明。

远端显示与窄屏

随 DSH 发布的桌面客户端在窄屏下会收拢侧边栏;插件经隧道注入一小段 payload,处理软键盘视口、低于 1120px 时的 Fit(桌面布局缩放)与 Native(客户端重排)切换,以及触摸手势。该 payload 仅作用于经隧道返回的响应,本地浏览器行为不变。

安装与启用

下面介绍从源码打包到装进 DSH 的流程。插件与中继为同版本组件:插件调用 /_relay/*,并遵循仓库内 PROTOCOL.md §3 的隧道封装;新旧不匹配时可能无法注册,或出现 HTML/JSON 应答错位。可用中继 GET /healthz 的 version 快速发现 skew。

先在仓库根目录安装依赖并校验(typecheck、构建与测试):

pnpm install
pnpm check          # typecheck both halves, build, run 62 tests
scripts/install.sh  # pack, then print how to install dist/dsh-remote-control-<version>.tgz

scripts/install.sh 会在 dist/ 生成 dsh-remote-control-<version>.tgz,并打印安装说明。桌面版 profile 由 Electron 应用管理,不支持对桌面 profile 使用随意的 dsh plugin add;应通过应用内 Settings → Plugins → install,填入 tarball 的绝对路径,例如:

/path/to/dsh-remote-control/dist/dsh-remote-control-0.9.8.tgz

安装后必须重启 Harness;向运行中的 profile 追加 bundle 时,未重启前可能出现 entry 无法 import 的错误。重装相同版本等于无操作,需先升版本或移除 bundle。

若使用 CLI 管理的 profile,可让脚本直接安装(示例来自 scripts/install.sh 的 --profile 分支,需本机存在对应 DSH 应用路径):

scripts/install.sh --profile <profile-name>

部署中继

在双方都能访问的机器上运行中继。最小示例:

cd relay && npm install --omit=dev
PORT=8080 PUBLIC_ORIGIN=http://relay.example node server.mjs

systemd 主机可一次完成安装:

sudo ./relay/install.sh --public-origin https://relay.example

将上述 PUBLIC_ORIGIN 填入 Remote Control 面板的 Relay server 并 Save。TLS、升级与环境变量详见包内 relay/README.md。

典型用法

经过上面的安装与中继部署,日常使用可以按下面步骤进行。

  1. 在 Harness 侧边栏打开 Remote Control。
  2. 确认 Relay server 已保存且 Test connection 各步通过(尤其版本一致与隧道往返)。
  3. 按 Start。主机连上中继后,面板出现二维码或配对链接。
  4. 用手机相机或任意浏览器打开链接;加载完成后即为完整 Harness Web 客户端。
  5. 窄屏可在 Fit 与 Native 间切换;进行中的对话可跨过切换而不必整页重载。
  6. 结束远程访问时按 Stop;需要新链接时再 Start 生成新会话与二维码。

运维侧还可通过仅限回环的 /api/dsh-remote-control/* 路由查看状态、启停链路、生成配对与跑连接测试;面板相对文档路径请求这些 API,避免请求落到中继 HTML 配对页。

适用场景与注意

适合谁: 需要在移动设备或异地浏览器上操作同一台 DSH 主机、且希望界面与本地客户端一致(含审批、插件与终端)的开发者或运维;愿意自行部署或托管中继,并接受中继对浏览器 HTTP 的终结模型。

权限与安全: 插件作为 DSH 插件加载,以当前 DSH 进程权限运行,远程浏览器经配对 URL 获得的访问能力等价于「能打开该链接的人可抵达本机 Harness」。安装前应阅读仓库源码与 MIT 许可证,并理解:配对 URL 即凭据;Harness 会话 cookie 在主机回环上签发,不离开主机;中继在未加 TLS 时可见明文流量,敏感场景应自管中继或在自有反向代理上终结 TLS。配对 URL 在日志中打码,QR/status 路由使用 cache-control: no-store。

版本与配对: 插件与中继共享 semver 前两位的兼容线(例如任意 0.9.* 插件可配 0.9.* 中继);连接测试比较的是这条线。发布 tarball 同时包含 relay/ 与 lib/,可用同一 artifact 部署两侧。

DSH 生态强调「一切皆插件」;社区插件目录 SkillHub 上的 dsh-remote-control 页 为独立站点收录,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-remote-control 用一条出站 WebSocket 和中继反向代理,把真实 Harness Web 客户端搬到任意浏览器,避免重复实现 GUI 带来的长期漂移。部署时记得插件与中继同线版本、自行指定中继 origin,并在启用远程访问前想清楚中继与配对链接的信任边界。

  • 目录页:https://www.skillhub.cn/plugins/icrefin/dsh-remote-control
  • 源码与文档:https://github.com/icrefin/dsh-remote-control
羽毛球分组比赛记分
小程序二维码

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

小夜