dsh-mobile
Verified@kinocode/dsh-mobile · v0.3.7 · MIT · Web UI
DeepSeek Harness host plugin for the DSH Mobile Android app: pair with a QR, use DSH on the phone through its own HTTPS gateway, answer approvals and questions from notifications, push turn completion.
Install
dsh plugin add @kinocode/dsh-mobile Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
DSH Mobile — DeepSeek Harness 主机插件
@kinocode/dsh-mobile 是适用于 DSH Mobile Android 应用的 DeepSeek Harness (DSH) 插件。支持以下功能:
- 扫描 DSH 侧边栏中的二维码与手机配对。
- 通过电脑上运行的 HTTPS 网关,在手机上使用原版 DSH Web UI。
- 在桌面端实时会话中,直接通过通知处理审批请求和 Agent 提问(任一设备先提交的回答生效)。
- 当关注的会话结束一轮操作时接收通知。
Android 应用单独分发,不包含在本仓库中。这是一个非官方项目,与 DeepSeek 无关。
环境要求
- DeepSeek Harness
>=0.2.1-rc.2 <0.3.0。锁定此版本区间是因为插件依赖尚未稳定的 DSH Gateway 内部 API。 - DSH Web 服务器(
webserver服务),DSH Desktop 内置。 - Node.js 22.4 或更高版本(DSH Desktop 自带的运行环境即可)。
- 手机和电脑处于同一网络,或均加入 Tailscale。
- 通知功能:需要中继服务器(见通知与中继)。
安装
在 DSH 插件页面添加 @kinocode/dsh-mobile,或运行:
dsh plugin --profile desktop add @kinocode/dsh-mobile
重启 DSH。日志中应显示 [mobile-bridge] gateway listening {"origins":[...]}。
配对手机
- 点击 DSH 侧边栏底部的 スマホを接続(连接手机)。
- 在应用中点击 QR を読み取る(扫码)并扫描该二维码。如果没有摄像头,可以使用 リンクをコピー(复制链接)并将链接粘贴到应用中。
- 二维码为一次性使用,5 分钟后过期。点击 新しい QR(生成新二维码)可重新生成。
该面板还会列出已配对的手机并支持将其移除。移除手机会立即撤销其访问权限。该面板目前仅提供日语界面。
在手机上,DSH 的侧边栏默认隐藏,让对话占满屏幕宽度。点击左上角的圆形按钮可以把侧边栏叠加在对话上方打开;选择会话或点击外部区域即可关闭。仅用于桌面端的按钮也会隐藏。
在手机上添加工作区时,会在手机上列出电脑中的文件夹,而不是在电脑上弹出文件夹选择窗口。浏览到文件夹或输入路径后,点击 このフォルダを使う(使用此文件夹)。
右侧边栏(文件、预览、变更审阅、浏览器、终端)在手机上全屏打开。在电脑上用应用或 Finder 打开的按钮在手机上隐藏;文件预览改为提供 スマホに保存(保存到手机),保存到手机的“下载”文件夹。DSH 重启后页面一直空白时,会自动重新加载。
左上角(侧边栏)和右上角(右侧边栏)的圆形按钮可以长按后拖动到任意位置。
在 DSH 内置浏览器(右侧边栏的“浏览器”)的地址栏输入非网址的文字时会进行搜索:桌面端使用 Google,手机端使用 Bing。手机端只能显示允许被嵌入的页面(Google 等会拒绝),无法显示的页面可以通过 ↗(在系统浏览器中打开)用 Chrome 打开。
配置
所有字段均为可选。将它们添加到 profile 的 cordis.patch.yml 中。Profile patch 会替换插件的完整配置,因此请包含所有需要保留的字段。
- id: mobile-bridge
config:
relayUrl: https://relay.example.com
relayEnrollToken: '...'
| 字段 | 默认值 | 说明 |
|---|---|---|
relayUrl |
''(关闭) |
用于接收通知并在通知中进行回复的中继服务器。 |
relayEnrollToken |
'' |
仅允许已知电脑接入的中继服务器 Token。 |
gatewayEnabled |
true |
为手机运行 HTTPS 网关。 |
gatewayPort |
3543 |
网关端口(1024–65535)。 |
gatewayHosts |
自动检测 | 监听的 IPv4 地址。仅接受私网地址(见下文)。 |
hostLabel |
电脑名称 | 显示在手机上的名称。 |
previewMaxChars |
400 |
应用中显示的最长命令预览字符数(50–4000)。 |
stateDir |
$DSH_HOME/mobile-bridge |
存放主机身份标识、已配对设备和证书的绝对路径。$DSH_HOME 默认为 ~/.dsh。 |
配置 ID mobile-bridge 和日志名称 dsh-mobile-bridge 保持不变,以兼容旧版本。
工作原理
- 网关。 HTTPS 服务器仅监听私网 IPv4 地址:
10/8、172.16/12、192.168/16以及 Tailscale 的100.64/10。证书由插件创建的 CA 签发。二维码包含该 CA 的指纹,因此应用仅对该电脑信任该 CA。 - 配对。 应用在 Android Keystore 中生成 ECDSA P-256 密钥,并使用一次性代码注册公钥。
- 控制请求。 获取待处理列表、提交回答和修改设置的请求均使用设备密钥签名。插件会验证签名、时间戳(±5 分钟)以及 nonce 以防止重放攻击。
- DSH 界面。 配对后,应用会获得一个有效期为 12 小时的网关会话,该会话使用仅保存在电脑本地的密钥签名。移除设备会立即撤销该会话。网关直接登录本地 DSH Web 服务器;手机端永远不会收到 DSH 本身的登录凭据。
- 实时会话。 插件作为所有者客户端(owner client)在进程内连接至 DSH Gateway 事件流,相当于一个额外的 GUI 窗口。由于它未注册审批监听器,因此不会抢占桌面端的请求,也不会绕过桌面端。Gateway 接收最先提交的回答,并在其他所有端关闭对应提示。
- 桌面端面板。 侧边栏面板使用仅限所有者访问的 DSH API 路由(
/api/dsh-mobile-bridge/*)。
通知与中继
使用移动数据的手机无法直接连通网关,因此通知需经由中继服务器转发。插件会与中继维持一条出站 WebSocket 连接。中继通过 Firebase Cloud Messaging 推送通知,并将手机签名的请求转发给电脑。中继无法伪造这些签名,且永远不会接触 DSH 界面或 DSH 的登录凭据。
本项目不提供公共中继。如果不使用中继,只要手机可以直接连通电脑,除通知以外的所有功能均可正常使用。
中继可以读取的内容:
- 推送消息。 默认包含:会话标题、工具名称或问题标题、最多三个选项、状态以及内部 ID。如果在应用中开启 ロック画面にコマンド全文を表示(在锁屏显示完整命令),中继还会看到命令预览或完整问题(最多 400 字符),以及轮次结束时 Agent 最后回复的前 200 个字符。
- 通过中继发送的请求。 各端点与中继之间的通信经过加密,但并非端到端加密。当手机通过中继路由请求时,中继可以读取待处理列表(完整命令预览、原因、问题)、会话列表(标题和工作目录)以及你的回答(包含自由文本输入)。
请仅使用你自己运行或信任的中继。
在锁屏界面上,除非手机设置为显示敏感内容,否则 Android 仅显示简短的公开摘要。DSH 正常退出时,插件会尝试撤回未关闭的通知(最多等待 3 秒)。如果 DSH 崩溃,应用会在下次加载待处理列表时清理过期的残留通知。
故障排查
| 现象 | 排查 |
|---|---|
| 手机无法连接 | 两台设备是否处于同一网络或均连接至 Tailscale?防火墙是否拦截了 3543 端口?如果电脑的 IP 地址发生改变,请生成新的二维码。 |
| "The certificate does not match the QR code" | 该二维码来自其他电脑,或网关 CA 已被重新创建。请生成新的二维码。 |
| 收不到通知 | 手机是否已允许通知?是否设置了 relayUrl,且 DSH 日志中是否显示 relay connected?会话的权限预设是否会触发审批请求?(“Full access” 从不触发。) |
| 重启 DSH 后 DSH 界面显示空白 | 待 DSH 启动完成后,关闭并重新打开应用。 |
安全
报告安全漏洞请参阅 SECURITY.md。
开发
npm test
测试使用 Node 内置的测试运行器,无需网络连接或外部依赖。
许可证
MIT。lib/vendor/qrcode.mjs 为 Kazuhiko Arase 开发的 qrcode-generator 1.4.4(MIT 许可证)。