@kinocode/dsh-mobile:在 Android 上配对 DSH,从通知里批复审批

前言

DeepSeek Harness(DSH)的会话、审批和右侧工作区都围绕桌面端设计。你离开电脑时,Agent 在等工具批准或追问,只能回到桌前点开界面。社区里也有远程桌面、消息转发等做法,但要么权限面太大,要么和 DSH 的 Gateway 审批流对不上。

@kinocode/dsh-mobile 是 kinocode-jp 维护的 DSH 主机侧插件,配合单独发布的 DSH Mobile Android 应用(不在本仓库内),在电脑上起 HTTPS 网关,用手机扫 QR 配对后,在手机上使用常规 DSH Web UI,并在通知里回复审批与 Agent 问题。这是非官方项目,与 DeepSeek 无隶属关系。插件在 SkillHub 插件目录 归类为「客户端」;源码见 GitHub:kinocode-jp/dsh-mobile。

这是什么

npm 包名为 @kinocode/dsh-mobile(当前版本 0.3.7,MIT 许可证)。它不作为 Android 安装包分发,而是装进 DSH Desktop 所在环境,为已配对的手机提供网关、配对管理与(可选)通知中继对接。手机与电脑需在同一局域网,或双方均在 Tailscale 上。

核心功能

README 中列出的能力如下,均经主机插件与移动端协同实现:

  • 在 DSH 侧栏扫 QR(或复制链接)完成手机配对。
  • 通过电脑上的 HTTPS 网关在手机上使用常规 DSH Web 界面。
  • 在桌面实时会话中,从手机通知回复审批请求与 Agent 问题(任意设备先提交的回答生效)。
  • 当被监视的会话完成一轮(turn)时,向手机推送通知。

插件以进程内 owner 客户端连接 DSH Gateway 事件流,不注册审批监听器,因此不会从桌面「抢走」请求;Gateway 接受第一个提交的答案后,各端提示会一并关闭。

环境与依赖

安装前请确认:

  • DeepSeek Harness 版本 >=0.2.1-rc.2 且 <0.3.0(插件依赖尚未稳定的内部 Gateway API,版本范围被固定)。
  • DSH Desktop 自带的 webserver 服务可用。
  • Node.js 22.4+(DSH Desktop 捆绑的运行时即可)。
  • 需要通知且手机走移动数据、无法直连电脑时:须自建或信任的中继(relay),见下文配置;无中继时,只要手机能直连电脑,除通知外其余功能仍可用。

安装与启用

在 DSH 的 Plugins 页面添加 @kinocode/dsh-mobile,或在终端执行:

dsh plugin --profile desktop add @kinocode/dsh-mobile

重启 DSH 后,日志中应出现类似 [mobile-bridge] gateway listening {"origins":[...]} 的行,表示网关已在私网地址上监听(默认端口 3543)。

配对手机

  1. 在 DSH 侧栏底部点击 スマホを接続(Connect phone)。
  2. 在 Android 应用中点 QR を読み取る(Scan QR)扫码;无摄像头可用 リンクをコピー(Copy link)把链接粘贴进应用。
  3. 配对码一次性,5 分钟过期;可点 新しい QR(New QR)重新生成。

侧栏面板会列出已配对设备并可移除;移除后立即撤销该设备访问。该面板目前仅日语界面。

配对后,手机端会隐藏默认侧栏以让对话区占满宽度;左上角圆形按钮可叠开侧栏。在手机上添加工作区时,会列出电脑上的文件夹而非在电脑上弹目录选择器。右侧栏(文件、预览、变更审查、浏览器、终端)在手机上全屏打开;依赖本机 Finder/应用的按钮会隐藏,文件预览提供 スマホに保存(Save to phone)保存到手机 Downloads。若 DSH 重启后页面空白,一般会自行重载;仍异常时可参考下文故障排除。

配置(可选)

所有字段可选,写入 profile 的 cordis.patch.yml。注意 profile patch 会替换插件整段配置,需保留的字段要一并写上。配置 ID 为 mobile-bridge(与旧版兼容)。

- id: mobile-bridge
  config:
    relayUrl: https://relay.example.com
    relayEnrollToken: '...'
字段 默认 含义
relayUrl ''(关闭) 用于通知及从通知回复的中继地址。
relayEnrollToken '' 仅接受已知计算机的中继注册令牌。
gatewayEnabled true 是否运行供手机使用的 HTTPS 网关。
gatewayPort 3543 网关端口(1024–65535)。
gatewayHosts 自动检测 监听的 IPv4;仅接受私网地址。
hostLabel 计算机名 手机上显示的主机名。
previewMaxChars 400 应用中命令预览最长字符(50–4000)。
stateDir $DSH_HOME/mobile-bridge 主机身份、配对设备与证书的目录;$DSH_HOME 默认为 ~/.dsh。

通知与中继

手机在蜂窝网络下通常无法直连电脑网关,通知经出站 WebSocket 连到你配置的中继;中继通过 Firebase Cloud Messaging 下发推送,并把手机已签名的请求转发回电脑。中继不能伪造签名,也不承载 DSH 画面或 DSH 登录。

未提供公共中继。 默认推送内容含会话标题、工具名或问题标题、最多三个选项等;若在应用中开启 ロック画面にコマンド全文を表示(锁屏显示完整命令),中继还可看到最长 400 字符的预览等更多信息。经中继转发的请求对中继可读范围见 README「Notifications and the relay」——仅使用你自建或充分信任的中继。

会话权限预设需会触发审批(例如非「Full access」)才会出现待批复通知;DSH 正常退出时插件会尝试撤回未完成通知(最多等待约 3 秒)。

工作原理(摘要)

  • 网关:仅在私网 IPv4(含 Tailscale 100.64/10)监听;证书由插件自建 CA 签发,QR 内含 CA 指纹,应用只信任该 CA。
  • 配对:应用在 Android Keystore 生成 ECDSA P-256 密钥,用一次性码注册公钥。
  • 控制请求:待办列表、答案、设置等请求由设备密钥签名;插件校验签名、时间戳(±5 分钟)与 nonce,防重放。
  • DSH 画面:配对后应用获得最长 12 小时的网关会话;网关直接登录本机 DSH webserver,手机不持有 DSH 自身登录态。

更完整说明见仓库 README 的 “How it works” 与 SECURITY.md。

故障排除

现象 建议检查
手机连不上 是否同网或 Tailscale?防火墙是否放行 3543?电脑 IP 变更后需重新生成 QR。
证书与 QR 不匹配 QR 来自其他机器,或网关 CA 已重建;重新生成 QR。
无通知 手机通知权限、relayUrl 是否配置、日志是否 relay connected、会话是否需审批。
DSH 重启后手机画面空白 DSH 启动完成后关闭并重开应用一次。

适用场景与注意

适合需要在离开工位时仍处理 DSH 审批与追问、或希望在手机上浏览同一 DSH 会话的开发者。插件与当前 dsh 进程同权限运行,安装前请阅读 kinocode-jp/dsh-mobile 源码与 MIT 许可证,并理解网关、配对与中继带来的暴露面;社区目录 skillhub.cn 与 DeepSeek / 幻方无官方从属关系,DSH 生态奉行「一切皆插件」,本应用亦属社区贡献。

结尾

@kinocode/dsh-mobile 把 DSH 的 Web 体验延伸到 Android,并用可选中继把审批推到通知栏,与桌面 Gateway 先答先得的规则一致。安装命令为 dsh plugin --profile desktop add @kinocode/dsh-mobile;Android 客户端需另行获取。目录页:https://www.skillhub.cn/plugins/kinocode-jp/dsh-mobile,仓库:https://github.com/kinocode-jp/dsh-mobile。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye