dsh-mobile-remote:在 iPhone/iPad 上复用本机 DSH 会话

前言

DeepSeek Harness(DSH)桌面端自带官方 Web UI,智能体开发、对话和任务常在 Mac 上长时间运行。若想在手机上看同一会话、同一份上下文,常见做法往往是再起一套服务、做反向代理或把端口暴露到公网——维护和认证都更麻烦。

dsh-mobile-remote 是社区维护的 DSH 插件:不复制数据、不重写官方前端,而是通过 Tailscale 私网把手机 Safari 接到本机正在跑的 DSH Host,并加上移动端皮肤与一次性配对流程。下面介绍它的定位、能力与安装用法。

这是什么

  • 名称:dsh-mobile-remote(GitHub:monsterjakey/dsh-mobile-remote)
  • 维护者:monsterjakey
  • 分类:客户端
  • 许可证:MIT(package.json 版本 0.2.2)
  • 一句话:为官方 DeepSeek Harness Web UI 提供移动端皮肤、配对辅助,以及 tailscale serve 与 DSH 端口的自动对齐。

插件体量很小(README 称安装包约 19 KB,若干 JS/CSS,无运行时 npm 依赖)。DSH 仍监听 127.0.0.1;认证沿用官方 launch-token → signed-cookie,配对码单次有效、30 分钟 TTL,token 不离开 Mac。

工作原理概览

访问路径可概括为:

iPhone / iPad Safari → https://<本机>.<tailnet>.ts.net(Tailscale HTTPS,仅 tailnet)
  → tailscaled(tailscale serve --https=443 → 127.0.0.1:<DSH 端口>)
  → 与桌面相同的 DSH Host(官方 Web UI + 插件注入的 /__dshm/* 与配对路由)

桌面 Host 每次启动可能换新端口时,插件会在启动后按 2/5/10/20/40 秒重试,并每 5 分钟做一次 tailscale serve 协调。手机不经过第三方中继,走 Tailscale WireGuard 隧道直连本机。

核心功能

以下均来自项目 README / package.json,按模块归纳:

  1. 移动端皮肤:作用域为 html.dshm-mobile;大屏(如宽于 1024px)保留官方桌面布局,仅增加触摸滚动与浮动上下页按钮。可用 URL 片段 #dshm-off / #dshm-on 切换并写入 localStorage。
  2. 配对:提供 /__dshm/pair 页面与 6 位码;状态写入 ~/.dsh/mobile-remote.json(权限 0600)。
  3. Tailscale 集成:从 tailscale status --json 检测 tailnet URL;自动刷新 serve 指向当前 DSH 端口;README 明确插件不触碰 Funnel。
  4. 可审计工具:scripts/check-exposure.mjs 检查 Funnel 关闭、Serve 仅 tailnet、Tailscale SSH 关闭、Serve 目标端口与当前 DSH 端口一致;scripts/setup-profile.mjs 计算主机名、备份 profile 补丁并写入部署项。

兼容性:dsh.compatibility.dsh 为 >=0.2.2-0 <0.3.0(DeepSeek Harness Desktop 0.2.2.x)。

环境与依赖

安装前需确认:

  • Mac 与手机登录同一 Tailscale tailnet,手机安装 Tailscale 应用。
  • 在 tailnet 管理端启用 HTTPS 证书(DNS 相关设置),本机可用 tailscale CLI(默认路径 /usr/local/bin/tailscale)。
  • DeepSeek Harness Desktop 满足上述版本范围。

安装与启用

推荐从 GitHub 安装(README 原文命令)。先将 DSH 指向桌面应用内置 CLI:

DSH="/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh"
"$DSH" plugin --profile desktop add -w github:monsterjakey/dsh-mobile-remote
node ~/.dsh/profiles/desktop/node_modules/dsh-mobile-remote/scripts/setup-profile.mjs

也可使用 release 压缩包(需自行准备 DSH 变量与文件路径):

"$DSH" plugin --profile desktop add -w file:/path/to/dsh-mobile-remote-0.2.2.tgz

执行 setup-profile.mjs 后,重启 DSH Desktop 一次。

典型用法:手机配对与收藏

重启后,在手机上按 README 步骤操作:

  1. 打开 https://<本机>.<tailnet>.ts.net/__dshm/pair
  2. 在 ~/.dsh/mobile-remote.json 中查看 pairingCode 并输入
  3. 将 https://<本机>.<tailnet>.ts.net/ 加入书签(cookie 有效期约 7 天)

横屏大屏设备(README 以 iPhone Duo 为例)可获得更接近平板的侧栏与对话并排布局;仍为同一官方 Web UI 与同一会话。

排错与卸载

手机无法访问时,可在 Mac 上运行:

node ~/.dsh/profiles/desktop/node_modules/dsh-mobile-remote/scripts/check-exposure.mjs

若提示 serve target port X != DSH port Y,可执行 tailscale serve --bg --https=443 <Y>(插件也会自动重试)。另需确认手机 Tailscale 已连接且启用 Use Tailscale DNS,否则 *.ts.net 无法解析;长会话可考虑保持 Mac 唤醒(如 caffeinate)。

布局异常时,可在 URL 后加 #dshm-off 对比官方布局。

卸载示例(README):

DSH="/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh"
"$DSH" plugin --profile desktop remove -w dsh-mobile-remote
# 从 ~/.dsh/profiles/desktop/cordis.patch.yml 移除 "dsh-mobile-remote setup" 块
rm -f ~/.dsh/mobile-remote.json
tailscale serve reset   # 仅当没有其他 serve 配置时

适用场景与安全注意

适合谁:已在 Mac 上用 DSH Desktop 跑 Harness,且 tailnet 内有一台 iPhone/iPad,希望用 Safari 查看同一 Web UI 与运行中任务,而不愿另建实例或公网暴露。

权限与风险:README 与 SECURITY 说明,配对后的手机对本机 DSH 具备所有者级访问(智能体可执行 shell、读写文件)。插件以当前 DSH 进程权限运行;安装前应阅读仓库源码、LICENSE(MIT)及 SECURITY.md、INSTALL.md。建议保持手机锁屏、禁用 Funnel,并用 ACL 限制仅你的设备访问本机 tcp:443。

DSH 生态强调「一切皆插件」;插件目录站点 SkillHub 为社区索引,与 DeepSeek / 幻方无官方从属关系。本文事实以仓库 README 与 package.json 为准。

链接

  • 目录页:https://www.skillhub.cn/plugins/monsterjakey/dsh-mobile-remote
  • 源码与文档:https://github.com/monsterjakey/dsh-mobile-remote

若你的场景是「同一台 Mac 上的同一会话、私网 HTTPS、移动端可读」,dsh-mobile-remote 把皮肤、配对和 serve 协调收成一条安装链;按上文命令安装并完成一次性配对即可在手机上复用桌面 DSH。

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

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

小夜