前言¶
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 无需认证。
典型用法¶
- 在目标 profile 执行
dsh plugin … add dsh-mobi-web,重启 harness。 - 用 Tailscale Serve 或 Cloudflare Tunnel 把
3083映射到 HTTPS 主机名。 - 手机打开
/m/,输入令牌登录;在同一 tailnet 内使用,避免公网裸奔。 - 在手机上发起需要工具审批的对话;审批卡片只在本机浏览器出现,在时限内批准或拒绝。
- 需要看图或流程时,在会话里查看 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。