dsh-mobi-web:DSH 手机优先 Web 客户端

前言

DeepSeek Harness(DSH)自带 Web UI 体量较大,在经中继的手机网络上首屏加载往往要十秒以上,交互也偏桌面。社区里另有名为 dsh-mobile-gateway 的 npm 包,走的是扫码与代理完整 UI 的路线。dsh-mobi-web 是另一类方案:在 harness 进程内挂一个 sidecar 网关,对外提供约 32 KB 的独立移动页,直连宿主服务,并支持「由手机发起的回合,审批只留在手机上」等行为。下面按定位、能力、安装与暴露方式说明用法与注意点。

这是什么

dsh-mobi-web 是面向手机的 Web 客户端插件,维护者为 rainfish-home,归类为 DSH 客户端插件。数据流大致为:手机浏览器经 HTTPS(Tailscale Serve 或 Cloudflare Tunnel)访问本机 127.0.0.1 上的网关端口,网关再与 harness 宿主服务同进程协作。

phone browser  ──HTTPS──▶  Cloudflare tunnel / Tailscale  ──▶  127.0.0.1:3083 (this plugin)  ──▶  harness host services

插件以 DSH bundle 形式发布(自带 cordis.patch.yml),当前 npm 包版本为 0.1.0,许可证 MIT,要求 Node >=20。

核心功能

浏览与会话

  • 按 workspace 分组展示会话,与桌面一样按 SessionSummary.updatedAt 排序;正在运行的会话有标记。
  • 活跃会话(运行中或 24 小时内有过活动)与更早会话分开,旧会话默认折叠;已归档会话不展示;各 workspace 折叠状态会记住。

阅读消息

  • 支持常见 Markdown:标题、列表、表格、引用、链接、行内与围栏代码块。
  • 围栏内的 Mermaid 在设备上渲染为 SVG,点开可全屏平移缩放,再点关闭。
  • 长消息折叠到约 460px,可「展开全文」;回复支持 token 流式增长。

操作

  • 多行输入(Enter 换行,仅发送按钮提交);最多 4 张图片(单张 4 MB,inline base64)。
  • 可中止正在运行的 turn;可在任意 workspace 标题栏「+」新建会话;可跳回最新消息。

审批(Origin affinity)

  • 审批请求经 SSE 以卡片形式到达。
  • 若该 turn 由手机发起,审批只留在手机端,最多等待 15 分钟,超时取消,不会回落到无人值守的桌面;桌面发起的 turn 仍保持原有行为(约 20 秒宽限后交回桌面)。
  • 默认配置项 approvalPriority 为 'phone-first';设为 'desktop' 可关闭拦截。

连接与生命周期

  • SSE 断线指数退避重连(2 s 至 30 s),并以 6 s 轮询兜底。
  • 网关随 harness 进程启停,无需单独守护进程。

安装与启用

插件是 DSH bundle,安装后会把依赖写入 package.json 的 dsh.profile.bundles;新 bundle 需重启应用或 dsh 后才会挂载。

Web 及其他 profile(npm CLI):

dsh plugin --profile web add dsh-mobi-web     # from npm
dsh plugin --profile web add link:/path/to/dsh-mobi-web-plugin   # from a checkout

Desktop profile(Electron 专用,npm CLI 不管理 desktop):在应用内插件管理器安装,或使用应用自带的 dsh:

dsh plugin --profile desktop add dsh-mobi-web

本地检出目录名惯例仍为 dsh-mobi-web-plugin,与 npm 包名 dsh-mobi-web 不同,勿与无关包 dsh-mobile-gateway 混淆。

暴露访问与登录

网关默认只监听环回地址,需用隧道把端口暴露给手机:

tailscale serve --bg 3083          # phone on the same tailnet
# or a Cloudflare tunnel ingress: host → http://127.0.0.1:3083

浏览器打开 https://<your-host>/m/。

访问口令:未在 patch 里设置 token 时,首次启动会在 $DSH_HOME/dsh-mobi-web-token(权限 0600)生成令牌;启动日志只打印文件路径,用 cat 该文件读取。也可在配置中设置 token: '…',或在完全可信的网络使用 token: false 关闭门控。不推荐开启 allowTokenUrl(?t=… 易泄露)。

配置要点

在对应 profile 的 cordis.patch.yml 中覆盖配置时,patch 会替换整段 config 对象,需写全非默认值。示例:

- id: dsh-mobi-web
  config:
    listenHost: '127.0.0.1'
    listenPort: 3083
    blockPaths: ['/dsh-whale/']
key 默认值 含义
listenHost 127.0.0.1 不绑定公网,由隧道终结 TLS
listenPort 3083(bundle patch;代码默认 3080) 监听端口
token 自动生成文件 Cookie 门控密码;false 关闭
allowTokenUrl false 是否接受 URL 传参令牌
blockPaths [] 匹配前缀返回 204,减轻页面负载
approvalPriority 'phone-first' 'desktop' 关闭手机侧拦截
pwa true 为代理 UI 注入 manifest 与图标
brotli true 对代理 UI 的 JS 再压缩

主要 HTTP 路由包括移动页 GET /m/、会话与 SSE GET /m/api/...、写操作 POST /m/api/prompt 等;存活探测 GET /__gw/health 无需认证。

典型用法

  1. 在目标 profile 执行 dsh plugin … add dsh-mobi-web,重启 harness。
  2. 用 Tailscale Serve 或 Cloudflare Tunnel 把 3083 映射到 HTTPS 主机名。
  3. 手机打开 /m/,输入令牌登录;在同一 tailnet 内使用,避免公网裸奔。
  4. 在手机上发起需要工具审批的对话;审批卡片只在本机浏览器出现,在时限内批准或拒绝。
  5. 需要看图或流程时,在会话里查看 Mermaid 渲染;需要发截图时用图片发送(最多 4 张)。

适用场景与注意

适合谁:已在单机跑 DSH、偶尔用手机查看会话、发 prompt、处理工具审批(含 shell)的开发者;网络侧愿意用 Tailscale 等私有组网,或明确理解公网暴露风险的场景。

安全(README 强调):持有登录令牌即相当于通过 harness 操作该机——可发 prompt、读全部会话历史、代你批准工具调用(含 shell)。网关代理的是整个 harness,而非仅聊天。建议放在 Tailscale 等私有网络;令牌专用于此、不复用他处密码;公网隧道需自知风险。插件以当前 dsh 进程权限运行,安装前请阅读 源码与 MIT 许可证。

限制(文档写明):单用户、单主机,无多账号;无推送,手机休眠时审批只能等待(手机发起时最长约 15 分钟)。历史消息内图片可渲染(README 在此处有截断,其余以仓库为准)。

设计约束:实现上拒绝在非环回地址启动监听;sidecar 内请求处理器均包 try/catch,避免未捕获异常拖垮宿主。

结尾

dsh-mobi-web 用极小页面和进程内网关,在弱网手机上补齐 DSH 的浏览、对话、Mermaid 与手机优先审批能力。安装走官方 dsh plugin add dsh-mobi-web,暴露端口后访问 /m/ 即可。更多说明见社区目录 SkillHub 条目 与仓库 GitHub README。

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

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

小夜