它是什么
DSH Mobile 把你的 DSH 会话装进口袋。插件在原生 DSH Web 界面之前跑一个移动网关:手机——无论是配套的 Android App(一个 Kotlin WebView 薄壳)还是普通的手机浏览器——经局域网或远程隧道接入后,看到的还是同一份会话、工作区、消息与工具,只是换成了按触屏重组的布局。它还提供 /mobile 对话内命令,让 agent 按你的要求改造手机端界面,以及任务完成与待输入时的 Android 系统通知。
局域网与远程访问是两套相互独立的栈——分别启停、分别管理配对设备——且都不改动 DeepSeek Harness 的源码。
局域网与远程通道
- 局域网——默认且延迟最低的路径。插件生成私有证书,在独立 HTTPS 端口(默认 3443)监听,通过扫码、链接或密钥完成配对。
setup会自动选择并记住当前网络;切换 Wi-Fi、热点或 IP 后通常无需重新配对。 - Tailscale Funnel——运行组件随 npm 包提供(Windows x64、Linux x64/arm64);没有 macOS 构建。
- cpolar——官方组件在你确认后按需下载。
- cloudflared——快速隧道(无需账号、每次重连换随机地址、有限流,Cloudflare 官方定位为测试用途)与命名隧道(用你自己的令牌换取固定域名);组件按需下载。
- 自建 FRP——面向有 VPS 的用户:可复制受限模板手动部署,也可经 SSH 密钥一键部署
frps+ Caddy(Ubuntu/Debian + systemd,不接受密码),部署与清理前都会展示服务器主机指纹要求核对。frpc固定为 0.70.1。 - 自有反向代理——纯配置:私有 HTTP 后端(默认端口 3444)挂在你已有的 Nginx/Caddy/Lucky 之后,带来源 CIDR 校验,完全不装隧道组件。
所有按需组件都是固定版本、确认后才下载、按精确大小与 SHA-256 校验;cloudflared 启动时关闭自动更新,保证运行的始终是已校验的那一份二进制。它们都不安装系统服务、不改 PATH、不设开机启动,插件清理时会删除自己托管的全部文件。
安全模型
这个插件的威胁模型文档少见地完整,缓解措施值得直接列出来:
- 配对设备信任——移动访问跑在独立 HTTPS 上、做证书固定,只有配对过的设备能通过校验。README 直言配对设备应视为完全可信、可以操作电脑上的 DSH:手机丢失后应在电脑端撤销。撤销会永久删除设备记录与令牌摘要,此后旧令牌只会得到
401。 - 仅回环的管理 API——管理 API 要求 TCP 对端是本机回环,浏览器 Host 必须是 localhost、RFC1918 或 IPv4 链路本地地址;公网 IP 与任意域名返回 403。README 明确告诫:永远不要把
/api/mobile-access管理路径反代到公网。 - WebSocket 白名单——网关默认只放行 DSH 第一方 WS 路径。第三方插件路径会在连接诊断里列为待处理项,可按确切路径逐条放行——不接受查询字符串、不接受模糊前缀,官方明确不建议「全部允许」。放行也只是让该路径通过已认证、同源的网关,不会开放任何端口,也不绕过设备配对。
- App 侧防护——令牌与局域网 CA 存进 Android Keystore;设备令牌只发往配对时的精确 Origin;原生 Bridge 使用
androidx.webkitWebMessage 并校验精确顶层 Origin 与主 Frame、限制消息大小,不使用addJavascriptInterface。
/mobile 定制——以及它的影响半径
在 DSH 对话里输入 /mobile <需求>,需求会交给对话中的 agent,由它直接改 $DSH_HOME/mobile-access/ 下的文件:界面与交互改 mobile.css/mobile.js;手机端需要电脑能力时用 extensions/,其中的 host.mjs 以你本机用户的权限在电脑上运行。README 自己的警告在这里原样适用:只创建和运行你理解并信任的电脑端扩展。改动会经已认证连接立即推送到手机;若新扩展激活失败,会先回滚再自动重试,避免新旧能力混用。
运行要求
- Node 需
^22.19.0 || >=24.0.0,来自包的engines字段。 - Harness——README 的兼容性矩阵是上面
dshTarget的依据:插件0.4.2与0.4.1对应 DSH0.1.6-alpha.1(本机源码加 renderer-v2 契约检查);0.3.15–0.4.0对应0.1.5-rc.2(契约检查),0.1.5-rc.1有社区局域网实测覆盖;0.3.14对应0.1.3-alpha.2;更早的行逐级向下覆盖0.1.3-alpha.1、0.1.2-rc.1、0.1.2-alpha.2/.1与0.1.1-rc.2。自0.3.6起插件不再按版本号拒绝启动——未列出的更新版本由 CI 契约检查兜底,而不是一道硬门槛。 - 平台——局域网、自建 FRP 与自有反向代理在 Windows、Linux、macOS 均可用;三个托管组件(Funnel、cpolar、cloudflared)没有 macOS 包,诊断页的防火墙检查目前也只覆盖 Windows。Android App 要求 Android 10+;没有 iOS App。插件
0.4.2可继续搭配0.4.0App——已有设备无需重新配对。 - 运行依赖不多(
bonjour-service、qrcode、selfsigned、@deepseek-ai/schemastery);所有 harness 包都是可选 peer 依赖,区间横跨0.1.0-rc.5到^0.1.6-0。 - 没有安装期生命周期脚本。
prepack在作者发布时运行,而不是在你安装时运行。 - 配置、证书、设备与自定义文件保存在
$DSH_HOME/mobile-access/;卸载时用exec dsh-mobile purge --yes一并清除。
已知限制
- 远程隧道继承服务商的限额:cpolar 免费方案 1 Mbps,Funnel 有不可配置的带宽限制,cloudflared 快速隧道每次重连换地址且无可用性保证。插件通过分页、gzip 与 WebSocket 长连接减少流量,但无法突破服务商限额。Funnel 在中国大陆网络下可能不稳定——README 建议那里用 cpolar。
- 任务通知是 Android App 功能,需在 App 前台菜单主动开启,且依赖 WebView 页面存活——它不是通用的后台推送。浏览器通知按 Origin 授权,只显示在运行该网页的设备上。
- 为兼容部分社区插件,代理页面可能嵌入 HTTP 页面:这类内容未加密,浏览器也可能按混合内容策略拦截。旧内核 WebView 由随包 core-js 兜底,但前端仍以 ES2022 为构建目标——出问题先更新 Android System WebView。
- 命名隧道要求 App 侧处于「远程」流程内扫码;诊断页的防火墙检查仅覆盖 Windows。
什么时候用它、什么时候不要用
当你想让会话留在桌上跑、自己在沙发上、办公室或另一个网络里继续推进时用它。配对模型与逐路径 WebSocket 白名单比多数远程访问插件都更谨慎,README 也把自己的限制写得很明白。
不要把它当零信任远程网关来装:配对设备按设计就是完全信任;局域网监听只该放在可信网络里(README 明确说不要自行做端口转发);/mobile 扩展机制会以你的用户身份运行宿主代码。如果你需要的是 App 关闭后也能送达的推送,它不提供——那种需求请用你已配置的服务端 webhook 或机器人通道。
安装
dsh plugin --profile web add dsh-mobile@latest
dsh plugin --profile web exec dsh-mobile setup
dsh --profile web
setup 会自动选择并记住当前局域网——仅在自动选择失败时用 --address 192.168.x.x 指定。重启后在 DSH 左下角打开移动访问,开启局域网或远程访问并配对手机。Android App 从 GitHub Releases 下载;卸载用 dsh plugin --profile web remove dsh-mobile,如需连插件数据一起清除,先执行 dsh plugin --profile web exec dsh-mobile purge --yes。

