原生安卓手机 App 的电脑侧:扫码配对后,就能在手机上对话、审批工具调用、回答提问、驱动子智能体、跟进后台任务,通道端到端加密;同一时刻只服务一台设备。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-mobile-connector
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:Imzl-zl/deepseek-harness-mobile#path:/connector
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
DSH 插件:手机端远程通道的电脑侧网关。 装进 DeepSeek Harness 之后, 手机扫码就能连到这台电脑 —— 对话、轨迹、改动卡、审批与提问、子智能体与后台任务,都在手机上。
要求
| 项 | 版本 |
|---|---|
| DSH | >=0.2.1-rc.5 <0.2.2 |
| Node | ^22.19.0 || >=24.0.0 |
| 对端 | 手机 App(Release 里的 APK) |
安装
两条通道,装哪个都行(版本号可能不一致,见下):
# ① npm(DSH 插件面板里按包名装 = 走这条)
dsh plugin --profile <profile> add dsh-mobile-connector
# ② GitHub Release 的 tgz(面板「安装」里也能直接粘这个 URL)
dsh plugin --profile <profile> add \
https://github.com/Imzl-zl/deepseek-harness-mobile/releases/download/v0.2.3/dsh-mobile-connector-0.1.9.tgz
装完要重启一次 DSH:插件热重载会让旧 fiber 先拆、新 fiber 再挂, 那一拍存储后端正在关,管理面可能挂不上(症状:面板 404、手机离线)。 新版已经对这一拍做了退避重试,但当次已经失败的那次挂载不会自己回来。
配置
三种写法等价,改哪个都生效(面板改的是 profile 的设置,不用重启):
A. 面板(推荐) —— DSH 侧边栏「手机」→「连接」卡:
- 中转:
内置中转(开箱即用)/自定义(填自己的中转根地址) - 令牌:粘贴中转的连接器令牌(只写不读,界面上不显示值);令牌行可点「去注册 / 登录」打开中转。
- 直连:
8790(局域网点对点用;0= 不开)
B. profile 的 cordis.patch.yml:
- id: dsh-mobile-connector
config:
relayUrl: wss://relay.example.com/ws/connector # 连接器拨的地址,带 /ws/connector
relayTokenRef: relay-connector # 可选;不写就用默认格 relay-connector
listenPort: 8790 # 局域直连端口,0 = 不开
listenHost: 0.0.0.0
C. 环境 / 凭据面:令牌本体走 DSH 的 ctx.credentials,配置里只放引用名(relayTokenRef)。
地址形状容易搞错:电脑侧这条是连接器拨的,带
/ws/connector; 手机侧拿到的是根地址,它自己拼/ws-ticket与/ws/device?ticket=。
面板能做什么
| 区块 | 能做的事 |
|---|---|
| 总览 | 中转状态 · 在线台数 · 直连端口,一眼判断"这台电脑现在通不通" |
| 连接 | 选中转(内置 / 自定义)、写令牌、开/关直连端口,卡头直接保存 |
| 通道与地址 | 逐条启停(中转拨号 / 直连监听)· 删除不再上报的网卡地址(可恢复)· 追加一条不在枚举里的地址(Tailscale 这类) |
| 已配对设备 | 停用 / 启用 · 接管(换掉正在服务的那台)· 删除(在用的也行:先停用拿终态,再抹记录) |
| 配对新手机 | 出二维码(5 分钟有效,同一台手机重扫替换旧记录) |
| 版本 | 当前插件版本 ·「检查更新」(电脑代查 npm 的 latest;查不到会说原因,不冒充"已是最新") |
停 ≠ 卸载:停传输不清凭据、不动身份,再启动不用重扫。断开 ≠ 解绑:删设备才需要重新配对。
它怎么工作
- 两条链路:一条控制连接接收路由与名册通知;每台设备再拨一条独立数据连接。
- 端到端加密:每条连接现场协商密钥(X25519 + AEAD),手机只信任二维码里带出的电脑公钥;中转只转发密文与路由元数据。
- 方法白名单:只暴露列出的方法;审批 / 提问 / 任务走同一条通道,不另开端口。
- 独占 1:1:同一时刻只服务一台设备,被拒的那台会收到占用者的名字(面板里可以「接管」)。
排错
| 症状 | 多半是 |
|---|---|
面板整块红、出码报 HTTP 404: not found |
管理面没挂上(装插件后的热重载那一拍)。重启一次 DSH |
| 手机显示"端点点拨不通" | 电脑不在线 / 换了网络。局域网直连要 listenPort 开着且同网段 |
| 中转一直是"连接中" | relayUrl 少了 /ws/connector、或令牌不对(中转会 401) |
| 手机上「检查更新」有新版但装不上 | 手机装的是 debug 签名包,与 Release 的正式签名不同 —— 只能卸载重装 |
开发与门禁
cd connector
pnpm exec tsc --noEmit # 类型
pnpm build # 产出 lib/(插件入口)
pnpm test # 825 项
node --check client.js # 浏览器半侧是手写 JS,没有类型检查
协议与设计文档:docs/subsystems/connector-and-relay.md、docs/subsystems/remote-channel.md(在仓库里)。
市场截图清单:同目录 screenshots.json。为什么用绝对地址而不是相对路径、为什么不把图片复制进来,见 .agents/notes/implemented/2026-11-07-marketplace-screenshots-declaration.md。
链接
License
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-remote-web-ui★ 9959
手机/PC 远程操控 dsh web 工作区:扫码配对、令牌门控通道、SSE 实时同步,提供移动端与完整桌面 GUI 两种远程形态。
zhu1090093659/dsh-web#packages/dsh-ssh★ 9959
SSH 远程运维面板:Web 终端、SFTP 传输、本地端口转发与一条命令并发集群执行,Agent 与面板共用同一份主机配置。
liguobao/ds-harness-remote★ 1319
通过端到端加密通道远程访问 DeepSeek Harness 及兼容的编码工作区,支持自适应 Relay/WebRTC 传输、设备授权、工作区文件、只读预览、终端和可选的 Codex Remote。
saya-ch/dsh-mobile★ 728
通过 Android App 或手机浏览器访问 DeepSeek Harness,支持安全局域网连接、远程访问、持久设备配对和可自定义移动界面。
uumit-ai/dsh-uumit-remote★ 381
用 UUMit 账号在手机或其他电脑上打开这台电脑的 dsh web,不用自建服务器、不装其他程序:插件内置通道客户端连接 UUMit 托管的通道,侧栏里的面板负责配对和选择谁能用(仅自己、通过邀请链接或手机号授权的人、所有人),可随时撤销。需 dsh web 且 DSH >=0.2.1-rc.2。
ZSeven-W/dsh-ios★ 355
在对话里直接操作 iOS 模拟器或 USB 连接的 iPhone:22 个 Agent 工具用于启动、构建、按无障碍标识或 OCR 文本驱动 UI、列表行操作与 SwiftUI 预览热重载,并附带可点击拖拽的流式侧边栏面板。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。