saya-ch/dsh-mobile

saya-ch/dsh-mobile

通过 Android App 或手机浏览器访问 DeepSeek Harness,支持安全局域网连接、远程访问、持久设备配对和可自定义移动界面。

远程与移动端androidcpolardeepseek-harness

DSH Mobile

能做什么 · 快速开始 · 连接教程 · 扩展与自定义 · 设备管理 · 第三方插件适配 · 安全 · 兼容性 · 文档 · 贡献者 · 更新记录 · English

DSH Mobile 是 DeepSeek Harness 社区插件,原生 App 仅支持 Android。
当前正式版本:0.6.16。新增相册入口、浏览器语言记忆和 FRP 字段提示,改善前台重连;配合独立发布的 Android App 0.6.7,可选择同电脑局域网/远程切换,并迁移符合条件的纯文本草稿。插件更新与下载 · 完整更新记录。
版本说明:自插件 0.6.2 起,Android App 与插件独立编号、独立发布,版本号无需一致;插件升级不代表 App 需要同步升级。兼容说明。

下载 Android App 0.6.7 版本说明与校验文件

DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App 通过局域网,或可选的 Tailscale Funnel、cpolar、cloudflared、自建 FRP 或自有反向代理远程通道连接电脑,继续使用同一份会话、工作区、消息和工具。电脑端分别启停局域网与远程访问、分别管理配对授权;Android App 统一显示已配对电脑。插件不修改 DeepSeek Harness 源码。

移动访问使用独立 HTTPS 与设备配对;Android App 固定局域网私有 CA,公开远程通道使用系统信任的证书;自签 FRP 入口还需由 0.4.6 App 在配对时固定远程 CA。

它还能在 DSH 对话里用 /mobile 定制手机端。

能做什么

  • 在手机上继续电脑端的工作:同一份会话、工作区、消息和工具,实时同步。
  • 用对话定制手机端:在 DSH 对话里提出布局、交互或功能需求;文件修改完成后,手机页面通常会自动刷新。
  • 专属触屏布局:会话抽屉、工具详情、设置、提问卡片和输入栏都按手机重新组织;App 跟随系统语言(简/英/意),插件界面跟随 DSH 语言。
  • 多种远程通道:Tailscale、cpolar、cloudflared 快速/命名隧道、自建 FRP、自有反向代理,按网络任选;Windows/Linux x64 还可由插件托管 Caddy HTTPS 与证书。
  • 配对与多设备:扫码、链接或密钥配对一次;切换 Wi-Fi、热点或 IP 后通常自动恢复;App 在一个列表中显示局域网和远程配对的电脑,定期检测可达状态,并支持切换、重新配对或删除本地记录。
  • 一键诊断与放行:检查版本、网关、网卡、防火墙和远程通道,生成脱敏报告;被拦截的第三方插件连接按确切路径一键放行。
  • 任务系统通知:任务完成与待输入以 Android 系统通知提醒,可在 App 内的 DSH“通用设置”中开启,锁屏文本脱敏。
  • 纵深安全:局域网固定私有 CA,公开远程入口使用受信任 HTTPS;自签 FRP 入口由 0.4.6 App 固定远程 CA。凭据存 Keystore,设备令牌只发往精确 Origin,第三方 WS 默认拦截。

配对设备可以操作电脑上的 DSH,应视为完全受信任的设备。局域网只在可信网络开启;远程访问应使用可靠的 HTTPS 通道。手机丢失时,请立即从电脑端撤销设备。

快速开始

先在电脑安装插件,再用 Android App 或手机浏览器配对。按你使用的 DSH 选择安装方式。

官方 DSH Desktop

在应用的 插件 页面安装并启用 dsh-mobile,再打开 移动访问 配置局域网或远程通道。Desktop 的 profile 由应用管理,不适用下面的 --profile web 命令。

安装或更新后,请从应用菜单正常退出并重新打开 Desktop,无需清除会话或配对数据。若仍提示 dsh-mobile-question-fixes: failed to import,请检查安装日志;这也可能是组件解析问题,单纯重启不一定能解决。

DSH Web

已经安装 dsh 命令时,在终端执行:

dsh plugin --profile web add dsh-mobile@latest
dsh plugin --profile web exec dsh-mobile setup
dsh --profile web

使用 DeepSeek Harness 源码或社区插件市场

在 DeepSeek Harness 源码目录中执行:

pnpm install
pnpm dsh plugin --profile web add dsh-mobile@latest
pnpm dsh plugin --profile web exec dsh-mobile setup
pnpm dsh --profile web

也可以通过插件市场安装(可选):

dsh plugin --profile web add dshmarket

重启 DSH 后,在 设置 → 插件市场 里搜索 dsh-mobile 并安装。首次打开“移动访问”时,局域网页会列出电脑当前网络;确认网卡后由插件生成私有证书并配置局域网,按提示重启一次 DSH 即可使用,无需再打开终端运行 setup。

setup 会自动选择并记住当前局域网,切换 Wi-Fi、热点或 IP 后通常自动恢复;仅在自动选择失败时使用 --address 192.168.x.x。设置、证书、设备和自定义文件保存在 $DSH_HOME/mobile-access/。

安装手机 App

从上方链接下载正式 Android APK,或用手机浏览器打开电脑端生成的配对链接。随后按连接教程选择局域网或远程访问;手机不需要安装额外的隧道客户端。

通过 npm 安装的插件会在桌面界面加载时检查新版本,有更新时在访问面板标题右侧显示“更新插件”,安装后需重启 DSH。App 下载入口展示最新版本;本地开发包不会被自动覆盖,Android App 不会主动检查或推送版本更新。

连接教程

局域网和远程访问是两套相互独立的连接:在电脑附近优先使用局域网,延迟最低;离开当前网络时再启用远程访问。电脑端分别管理开关与配对授权;Android App 将所有已配对电脑集中显示在设备列表中。

局域网访问

适合同一 Wi-Fi、以太网或手机热点,是默认且最简单的连接方式。

  1. 让手机和电脑连接同一个局域网,在 DeepSeek Harness 左下角打开 移动访问 → 局域网。
  2. 如果尚未开启,点击 开启局域网访问;随后点击 生成并复制密钥,面板会显示配对二维码。
  3. 在 Android App 中进入 局域网访问,扫描发现电脑并点击设备,再扫描二维码或粘贴配对密钥。
  4. 配对完成后会建立持久设备信任。以后打开 App 会自动发现并连接,切换 Wi-Fi、热点或 DHCP 地址通常不需要重新配对。

侧栏底部有其他插件入口时,移动访问会收起为手机图标;悬停可查看名称,点击仍打开原面板。独占该区域时恢复文字显示。

端口说明:dsh web --port 修改 DSH Web 上游端口(默认 3080),插件会自动跟随;dsh-mobile setup --port 修改 Mobile HTTPS 监听端口(默认 3443),配对二维码会包含实际端口。

无界面主机、内网代理与额外来源网段

无图形界面的 Linux 主机,或通过局域网 IP / 反向代理打开 DSH Web 时,左下角 移动访问 管理口同样可用。管理 API 仍要求 TCP 对端是本机回环(例如本机 socat / 反向代理连到 127.0.0.1),不会把插件自己暴露到公网;浏览器 Host 可以是 localhost、RFC1918 或 IPv4 链路本地地址,公网 IP 和任意域名仍会返回 403。反向代理必须只对可信的本机或内网请求开放,不能把 /api/mobile-access 管理路径公开转发到互联网。手机走的独立 HTTPS 入口(默认 3443)仍是移动端界面,不会变成桌面管理口。

已有 WireGuard 等受控路由网络时,0.6.0 提供额外可信网段。它只追加明确的来源 CIDR,不建立 VPN 或路由,也不自动改 Windows 防火墙。

不安装 App 也可以访问:点击 复制配对链接,在手机浏览器中打开。局域网使用私有证书,浏览器首次访问可能提示不受信任;只在确认这是自己的 DSH 网关后按浏览器指引继续。公开证书的远程入口不应出现证书警告,若出现请检查通道和证书,不要直接忽略。

手机浏览器中的配对和重新连接页面支持简体中文、英文和意大利文。插件 0.6.16 起优先使用当前网关主机名下记住的 DSH 显示语言,没有可用偏好时再按浏览器的 Accept-Language 选择;清除网站数据或更换主机名可能重置偏好。Android 原生界面跟随系统语言;DSH 内的插件控制面板跟随 DSH 当前语言。

浏览器手动配对时填写电脑端显示的 43 位配对码;以 dsh1. 或 dsh2. 开头的是 Android App 密钥,不要填入浏览器配对框。优先打开电脑端复制的配对链接,它会自动填写配对码;过期后在电脑端重新生成。

远程访问

适合手机离开电脑所在网络后使用。远程访问默认关闭,手机不需要另外安装 Tailscale、cpolar、cloudflared 或 FRP。

远程服务可能受带宽和连接限额影响:cpolar 免费方案 当前为 1 Mbps,Tailscale Funnel 也存在不可配置的带宽限制,cloudflared 的 quick tunnel 由 Cloudflare 免费提供、地址随机且有限流。DSH Mobile 使用静态资源 gzip、WebSocket 长连接和顶部按需加载改善体验;会话的历史窗口与分页大小由 DSH 决定,插件无法提高服务商限额。

页面能打开但一直“重连中”,应先区分 WebSocket 升级失败、慢速数据同步和心跳超时,操作见慢链路与反复重连指南。0.5.4 还提供按确切路径启用的 WebSocket 压缩,默认关闭;长会话或计量网络可按指南尝试,并对比实际传输量。

下表的使用参考来自维护者在中国大陆自用网络的长期体验,不是普适测评;实际表现受运营商、网络和套餐影响,请在自己的手机网络验证。

连接方式 · 需要准备 · 地址特点与注意事项 · 维护者使用参考 cpolar · cpolar 账号与 Authtoken · 免费临时地址可能变化 · 免费方案限速明显,日常加载与同步体验较差 cloudflared 快速隧道 · 无需账号或域名 · 临时随机地址;不支持 SSE,即时通知存在限制;官方仅定位为开发测试用途 · 长期使用中经常断连,原因尚未确认;只作临时或测试选择 cloudflared 命名隧道 · Cloudflare 账号与域名 · 固定域名;配置指南 · 已长期使用的通道中最稳定;有账号和域名可优先尝试 Tailscale Funnel · Tailscale 登录与 Funnel 授权 · 实际可用性取决于网络 · 自用网络常需代理辅助,仍可能连接失败;并非所有用户都需要代理 自建 FRP · 已有 VPS,域名或真实公网 IPv4 · 需管理服务器;部署或接入既有 frps · 部署与资源更可控,长期稳定性取决于 VPS 线路、配置与运维 自有反向代理 · 已有公开 HTTPS 代理 · 插件只提供私有认证后端;配置指南 · 可沿用自己的代理设施,稳定性取决于代理、线路与运维 托管 Caddy · 腾讯云 DNSPod 管理的域名与公网入站 · 插件管理 HTTPS 与证书;Windows/Linux x64;配置指南 · 不提供内网穿透,需自行确认入站端口和映射;已有 Cloudflared 用户不必迁移

  1. 在 DeepSeek Harness 左下角打开 移动访问 → 远程,按上表选择通道,完成登录或配置。
  2. 状态变为“远程访问已就绪”后,点击 生成远程配对二维码。自备代理模式的“后端已监听”不等于公网就绪,仍需确认公网 HTTPS 与 WebSocket 可用。
  3. 在 Android App 中选择 远程访问,扫描当前二维码完成配对;公开证书入口也可用手机浏览器打开配对链接。
  4. 以后 App 使用保存的地址与凭据自动重连。临时地址改变时,重新扫描电脑端当前二维码验证新地址,不需要清除 App 数据;旧设备 token 不会发送给新 Origin。

各通道的安装与登录步骤

在面板选择对应通道后:

  • Tailscale Funnel:点击 启用远程访问,在打开的官方页面完成一次 Tailscale 登录;按面板提示继续允许 Funnel,然后返回 DSH 等待连接就绪。
  • cpolar:点击 安装官方组件,登录 cpolar 控制台取得 Authtoken,粘贴后点击 保存并连接。组件只会在确认后下载到插件私有目录;免费临时地址可能在 DSH 或 cpolar 重启后变化。
  • 自建 FRP(高级):已有 VPS 时,展开 自建连接,填写 frps 信息和公开 HTTPS 域名或真实公网 IPv4。可以复制受限的 frps + Caddy 模板手动部署,也可以在 Ubuntu/Debian + systemd 上用 SSH 密钥一键部署;不支持密码登录。已有自定义 Caddy 站点时,请按指南手动部署并合并 import。部署或清理前须到 VPS 控制台核对主机指纹。本机 frpc 按需下载校验,VPS 需单独清理。需要 Android App 0.3.3 或更新版本;证书、端口和操作步骤见 自建 FRP 使用指南。
  • 自有反向代理:展开 自建连接 → 自有反向代理,填写公网 HTTPS 地址(支持自定义端口)、私有监听 IP(IPv4 或 IPv6 回环/ULA)、独立 HTTP 后端端口(默认 3444)和代理直连来源 CIDR,再点击 保存并启动后端。适合已有 Lucky/Nginx/Caddy 的用户,无需隧道组件;需要 Android App 0.4.0 或更高版本。详见 自有反向代理指南。
  • 托管 Caddy:在 自建连接 → 自有反向代理 中选择 托管 Caddy,点击 安装托管 Caddy 并确认下载。填写公网 HTTPS 地址、腾讯云 DNSPod 凭据和本机 HTTPS 监听端口,再点击 保存并启动 Caddy。需要域名和可达的公网入站,不会替你穿透 CGNAT;端口映射与完整步骤见 托管 Caddy 指南。
  • cloudflared 快速隧道:点击 安装官方组件,插件在确认后从官方发布页下载固定版本到插件私有目录,随后自动申请一个临时公网地址(quick tunnel),无需注册或登录。适合不想注册账号的用户;quick tunnel 地址每次重连都会变化,官方定位为测试用途、有限流且无可用性保证,请勿用于必须长期可达的生产访问,只适合临时或验证场景。
  • cloudflared 命名隧道:已有 Cloudflare 账号和域名时,把隧道类型切到 命名隧道,填入连接器令牌、公网域名与本机转发端口,即可获得重启后不变的固定地址(令牌只存私有目录、只经环境变量传给 cloudflared)。步骤见 Cloudflare 命名隧道。

远程通知、服务器运维与安全限制

远程通知说明:浏览器的 Notification 权限按 Origin 分别授权,网页系统通知只显示在运行该网页的设备上。Android App 的任务提醒是独立的 0.4.0 功能,需要在 App 内 DSH 的 设置 → 通用设置 中主动开启,且依赖 WebView 页面仍存活;它不是通用的后台推送。需要可靠的后台推送时,请使用你已配置的服务端 webhook 或机器人通道。

Funnel 的运行组件把公开监听生命周期绑定到父进程和受限控制通道;父进程退出、控制通道关闭或显式停止时会结束当前代次并清理资源。中国大陆 VPS 上的未备案域名可能被云厂商拦截,此时可使用公网 IPv4 模式。插件会校验按需下载的固定版本组件;本机托管的配置与程序保存在 $DSH_HOME/mobile-access/,可在面板中清理。VPS 侧的文件须按自建连接指南单独清理。

自建 FRP 的托管部署使用指向 DSH 回环网关的 HTTP vhost:VPS 上的明文 vhost 只允许回环访问,由 Caddy 提供公网 HTTPS。0.4.6 新增“接入既有 frps”,不会安装或改动服务器;公开 CA 档仍需受限 HTTP vhost 与 Caddy,自签档则用 frps TCP 透传至电脑端 HTTPS 网关,须由 0.4.6 Android App 在配对时固定 CA。自签档目前面向公网 IPv4,旧版 App 不支持;两档都不开放任意 FRP 配置。frps 的 proxyBindAddr 是全局代理监听设置,不能只为新增 TCP 入口调整而忽略已有明文 vhost。接入指南。

自有反向代理的 HTTP 后端只允许留在可信私网;不要把它映射到公网,也不要绕过它直连 DSH 或现有 LAN 3443。来源 CIDR 匹配代理的直接 TCP 来源,不信任转发头;反代须保留外部 Host(含端口)、Origin、Cookie 和 WebSocket。清除代理配置不会删除已配对远程设备。

各通道的系统和组件支持范围见兼容性。本机托管的程序、凭据与配置可从面板清理;VPS 上的文件必须按对应指南单独清理。

实验中的 iroh 连接

dsh-mobile-iroh 正在独立开发,探索通过 iroh 连接电脑,并沿用 DSH Mobile 的配对、设备列表和 WebView 体验。目前本地开发候选已接通 Rust 传输与 Android,并通过本地 QUIC/HTTPS/WSS 验证和 Android 构建;尚未并入本插件或正式发布,电脑端操作界面、自动证书配置与真机跨网验收仍待完成。它还不是当前正式 App 可选的连接方式。

扩展与自定义

在 DSH 对话里输入 /mobile ,当前会话的 agent 会处理定制请求;文件修改完成后,手机端通常会在几秒内刷新。例如:

/mobile 把手机端做成老式终端的样子,让消息像终端输出一样逐行滚动

也可以让手机端调用电脑端的能力,比如实时读取电脑状态:

/mobile 为手机端添加赛博朋克风格的电脑监控面板,实时显示电脑的 CPU、内存和磁盘占用

/mobile 把需求交给 DSH 对话中的 agent,由它直接修改本机 $DSH_HOME/mobile-access/ 下的文件,已配对的移动页面会自动检查并应用。改动分两类:界面和交互在 mobile.css/mobile.js;需要电脑能力时用 extensions/ 下的扩展,其 host.mjs 以本机用户权限在电脑上运行。不修改 DeepSeek Harness 源码。

定制需要从 移动访问的配对入口进入。直接打开普通 DSH 网页或调整浏览器为手机视口,不等于完成移动配对;文件存在也不代表当前页面已加载。若扩展接口返回 401,先核对入口与配对状态,不要开放匿名访问或公开 Cookie、Token。

旧的 mobile.css 补丁可能覆盖新版内置修复。排查布局时先备份文件,在同一会话、方向和字号下对比有无该样式的效果,不要先叠加更多规则。匹配 CSS Modules 类名时应限定到已核对的区域祖先,例如 [data-dsh-mobile-header] [class*="_titleRow"],不要裸用后缀/子串选择器;用 display: none 隐藏操作区会移除其中功能,不等于折叠。感谢 #219 提供的对照记录。

扩展清单及其脚本、样式和资源按版本标识刷新。插件监听到 /mobile 或扩展文件变化后,会通过已认证连接通知手机立即更新;页面可见时每 45 秒、隐藏时每 5 分钟的检查只作为断线兜底。Host 暂存失败会继续使用现有版本;若 Host 已更新但新手机界面激活失败,则关闭该扩展并自动重试,避免混用新旧能力。

扩展动作的 input 可以直接使用 api.schema.object(...) 等 Schemastery schema,也可以使用带 parse(value) 的适配器;手机端 api.host.invoke() 会按 JSON 请求发送,输入会在电脑端动作执行前完成校验和规范化。

附件功能优先复用 DSH 自带的文件上传。扩展若需模拟拖放,dataTransfer 除了 files,还须提供可迭代的 items(文件项列表),不能只拼一个 files 数组。部分 WebView 的原生拖放构造不完整,兼容处理可参考插件内的文件投递实现;dragover 接受或事件派发成功不代表附件已加入,应检查输入框中的附件与预览。

0.6.3 新增可选的 Worker 执行模式,用于约束可信本地扩展的 JavaScript 阻塞;默认关闭,按扩展选择,故障后显式恢复,不自动重放操作。这不是权限沙箱,也不要求 App 同步版本。

你甚至可以通过扩展连接电脑上运行的酒馆,并从同一 App 打开它的简易移动前端。

host.mjs 与本机程序拥有相同权限;仅创建和运行你理解并信任的电脑端扩展。

示例的实际效果:

设备管理

Android App 在“已配对设备”中统一显示电脑及其局域网/远程连接记录。两种方式的授权彼此独立,同一台电脑可能有两条记录。升级会迁移旧凭据,无需重新配对;重新验证变化的地址后,相同身份的记录会合并并保留名称。自签 FRP 使用独立 CA 指纹,可能另成一条记录。Token 和固定的 CA 由 Android Keystore 加密;配对二维码含短期配对信息,不含长期设备 Token 或 CA 私钥。

未手动指定标识时,公开证书远程入口的新配对使用电脑保存的随机标识,避免相同安装路径让两台电脑的记录互相覆盖。已有连接无需为此重新配对,也不需要更新 Android App;局域网和自签 FRP 仍按各自的 CA 区分。更新后正常退出并重启 DSH,降级前请先阅读状态备份注意事项。

每条记录显示自定义名称、连接方式、Origin、定期更新的可达状态和最近连接时间。绿色状态点表示“可达”,灰色状态点表示“检测中”“暂不可达”“配对已过期”或“电脑端已移除”;可达性检查直接验证 DSH Gateway,不依赖 ICMP,也不会把暂时断网误判成电脑端撤销。