扫码配对手机,在手机上使用 DSH 并处理审批
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/kinocode-jp/dsh-mobile.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 13 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 28 处,展示前 28 条)
- 发起网络请求lib/index.mjs:252
return route.fetch(request) - 发起网络请求lib/desktop-api.mjs:35
async fetch() { - 发起网络请求lib/desktop-api.mjs:61
async fetch() { - 发起网络请求lib/desktop-api.mjs:75
async fetch() { - 发起网络请求lib/desktop-api.mjs:94
async fetch(req) { - 发起网络请求lib/desktop-api.mjs:115
async fetch(req) { - 读取本地文件lib/desktop-api.mjs:120
const info = await stat(path) - 读取本地文件lib/desktop-api.mjs:123
return new Response(Readable.toWeb(createReadStream(path)), { - 发起网络请求lib/desktop-api.mjs:150
async fetch(req) { - 读取本地文件lib/desktop-api.mjs:174
const info = await stat(path) - 读取本地文件lib/desktop-api.mjs:177
for (const entry of await readdir(path, { withFileTypes: true })) { - 读取本地文件lib/desktop-api.mjs:181
isDirectory = await stat(join(path, entry.name)).then(s => s.isDirectory(), () => false) - 请求外部主机in-processlib/gateway-client.mjs:192
const response = await this.fetchHandler.fetch(new Request('http://in-process/api/$events/result', { - 发起网络请求lib/gateway-client.mjs:192
const response = await this.fetchHandler.fetch(new Request('http://in-process/api/$events/result', { - 写入本地文件lib/state.mjs:45
await mkdir(this.dir, { recursive: true, mode: 0o700 }) - 读取本地文件lib/state.mjs:47
const parsed = JSON.parse(await readFile(this.file, 'utf8')) - 写入本地文件lib/state.mjs:63
await rename(this.file, `${this.file}.corrupt-${this.now()}`) - 写入本地文件lib/state.mjs:153
await writeFile(tmp, `${JSON.stringify(this.data, null, 2)}\n`, { mode: 0o600 }) - 写入本地文件lib/state.mjs:154
await chmod(tmp, 0o600) - 写入本地文件lib/state.mjs:155
await rename(tmp, this.file) - 写入本地文件lib/tls-store.mjs:68
await mkdir(this.dir, { recursive: true, mode: 0o700 }) - 读取本地文件lib/tls-store.mjs:70
const certPem = await readFile(join(this.dir, 'ca.pem'), 'utf8') - 读取本地文件lib/tls-store.mjs:71
const keyPem = await readFile(join(this.dir, 'ca-key.pem'), 'utf8') - 读取本地文件lib/tls-store.mjs:95
const certPem = await readFile(join(this.dir, 'server.pem'), 'utf8') - 读取本地文件lib/tls-store.mjs:96
const keyPem = await readFile(join(this.dir, 'server-key.pem'), 'utf8') - 写入本地文件lib/tls-store.mjs:117
await writeFile(tmp, content, { mode }) - 写入本地文件lib/tls-store.mjs:118
await chmod(tmp, mode) - 写入本地文件lib/tls-store.mjs:119
await rename(tmp, path)
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:in-process
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 插件,用于 DSH Mobile 安卓应用:扫码配对,在手机上运行 DSH,从通知里直接批准回答。
README
由 DeepSeek 最新模型翻译生成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。
- 通知功能:需要中继服务器(见通知与中继)。
展开完整文档(README 剩余 1 节)
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":[...]}。
配对手机
1. 点击 DSH 侧边栏底部的 スマホを接続(连接手机)。
2. 在应用中点击 QR を読み取る(扫码)并扫描该二维码。如果没有摄像头,可以使用 リンクをコピー(复制链接)并将链接粘贴到应用中。
3. 二维码为一次性使用,5 分钟后过期。点击 新しい QR(生成新二维码)可重新生成。
该面板还会列出已配对的手机并支持将其移除。移除手机会立即撤销其访问权限。该面板目前仅提供日语界面。
在手机上,DSH 的侧边栏默认隐藏,让对话占满屏幕宽度。点击左上角的圆形按钮可以把侧边栏叠加在对话上方打开;选择会话或点击外部区域即可关闭。仅用于桌面端的按钮也会隐藏。
配置
所有字段均为可选。将它们添加到 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 许可证)。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
kinocode-jp/dsh-mobile
扫码配对手机,在手机上使用 DSH 并处理审批
相关插件 · 安全 / 权限
智能体逆向工程morluto/rea
用智能体逆向工程任何东西,从应用行为到原生二进制。
★ 415,267已汉化DSH
73.3
智能体集群框架ruvnet/ruflo
面向 Claude Code 与 Codex 的智能体元基座meta-harness。
★ 80,414已汉化MCP
71.9
WorkBuddy 模型接入corrinehu/dsh-workbuddy-connect
2026 年 10 月 20 日起,WorkBuddy…
★ 1,604已汉化DSH
71.7
破甲一键通z91772524-ai/pojia-next
十五个 AI…
★ 967已汉化DSH
71.6
AI 代理虚拟终端strukto-ai/mirage
Mirage 是给 AI 智能体用的虚拟终端:一层 shell,统管数据、命令行和运行时。Unix…
★ 3,756已汉化DSH
70.8
Agent 操作层agentic-os-org/ANOLISA
ANOLISA(Agentic Nexus Operating Layer & Interface System Architecture)|智能体操作系统,带运行时、安全、可观测性,以及 Tokenless 响应压缩,降低 token 用量与成本。
★ 649已汉化DSH
70.7