用手机远程控制 DeepSeek Harness:Android App + 云端中继 + PC 插件。一个长期有效的二维码,三种用途——下载、配对、登录授权。
32.9/100
综合分
4
GitHub 星标
73
npm 周下载
—/5
用户评分
数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @zdx8637/dshmobile-bridgenpm 源 · @zdx8637/dshmobile-bridge 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · ui
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 14 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过安装清单取自 plugins/package.json
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包@zdx8637/dshmobile-bridge @ 1.0.8
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/20 16:15:31
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 119 处,展示前 73 条)
- 写入本地文件lib/index.js:66
mkdirSync(stateDir, { recursive: true }); - 写入本地文件lib/index.js:67
writeFileSync(scanFile, script, "utf8"); - 执行外部命令来自配置/变量lib/index.js:75
const out = execSync(cmd, { encoding: "utf8", timeout: 15e3, windowsHide: true, stdio: ["ignore", "pipe", "ignore"] }); - 写入本地文件lib/index.js:162
mkdirSync2(STATE_DIR, { recursive: true }); - 写入本地文件lib/index.js:163
appendFileSync(path.join(STATE_DIR, "host.log"), `${( new Date()).toISOString()} ${msg} - 读取本地文件lib/index.js:170
return JSON.parse(readFileSync(file, "utf8")); - 写入本地文件lib/index.js:194
mkdirSync2(STATE_DIR, { recursive: true }); - 写入本地文件lib/index.js:197
writeFileSync2(tmp, JSON.stringify(l, null, 2)); - 读取本地文件lib/index.js:215
if (fromEnv && existsSync(path.join(fromEnv, "package.json"))) return fromEnv; - 读取本地文件lib/index.js:219
if (typeof dir === "string" && dir && existsSync(path.join(dir, "package.json"))) return dir; - 读取本地文件lib/index.js:249
return existsSync(packageDir(profileDir)); - 读取本地文件lib/index.js:260
if (!existsSync(root)) return null; - 读取本地文件lib/index.js:262
for (const e of readdirSync(root, { withFileTypes: true })) { - 删除本地文件lib/index.js:312
rmSync(f, { force: true }); - 执行外部命令固定命令lib/index.js:579
const out = execSync2('reg query "HKLM\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid', { - 删除本地文件lib/index.js:630
rmSync(HEARTBEAT_FILE, { force: true }); - 执行外部命令来自配置/变量lib/index.js:1032
const p = spawn(process.execPath, spawnArgs, { - 发起网络请求lib/index.js:1131
const res = await fetch(`${base}${pathname}`, { - 删除本地文件lib/index.js:1271
rmSync(SESSION_FILE, { force: true }); - 删除本地文件lib/index.js:1375
rmSync(SESSION_FILE, { force: true }); - 写入剪贴板lib/client.js:2205
void navigator.clipboard?.writeText(text); - 发起网络请求lib/client.js:2508
res2 = await fetch(url2, { cache: "no-store" }); - 发起网络请求lib/client.js:2519
res = await fetch(url, { - 写入本地文件bridge/adapter.js:13
appendFileSync(E2EE_DEBUG_LOG, `${new Date().toISOString()} ${msg}\n`); - 发起网络请求bridge/adapter.js:985
const res = await fetch( - 写入本地文件bridge/adapter.js:993
await mkdir(dirname(target), { recursive: true }); - 写入本地文件bridge/adapter.js:995
const out = createWriteStream(tmp); - 写入本地文件bridge/adapter.js:1016
await rename(tmp, target); - 写入本地文件bridge/adapter.js:1021
try { await rename(tmp, `${tmp}.failed`); } catch {} - 读取本地文件bridge/adapter.js:1068
st = await stat(target); - 读取本地文件bridge/adapter.js:1091
if (mediaType) imageData = (await readFile(target)).toString("base64"); - 发起网络请求bridge/adapter.js:1123
const res = await fetch(`${this.relay.url}${path}`, { - 发起网络请求bridge/adapter.js:1137
const res = await fetch( - 读取本地文件bridge/adapter.js:1400
const dir = await opendir(target); - 读取本地文件bridge/adapter.js:1412
const st = await stat(join(target, name)); - 读取本地文件bridge/adapter.js:1435
const st = await stat(`${letter}:\\`); - 写入本地文件bridge/adapter.js:1610
await mkdir(target); - 发起网络请求bridge/dsh.js:64
const res = await fetch(`${this.baseUrl}/api/session/list`, { - 删除本地文件bridge/dsh.js:101
if (f) rmSync(f, { force: true }); - 读取本地文件bridge/dsh.js:144
if (!f || !existsSync(f)) return null; - 读取本地文件bridge/dsh.js:145
const c = JSON.parse(readFileSync(f, "utf8")); - 写入本地文件bridge/dsh.js:157
mkdirSync(this.stateDir, { recursive: true }); - 写入本地文件bridge/dsh.js:158
writeFileSync(f, JSON.stringify(c)); - 发起网络请求bridge/dsh.js:174
const res = await fetch(`${this.baseUrl}/?token=${encodeURIComponent(this.token)}`, { - 发起网络请求bridge/dsh.js:226
async #fetch(path, init = {}) { - 发起网络请求bridge/dsh.js:231
return fetch(`${this.baseUrl}${path}`, { ...init, headers }); - 发起网络请求bridge/dsh.js:250
const res = await this.#fetch(`/api/${endpoint}`, { - 读取本地文件bridge/e2ee-policy.js:67
const d = JSON.parse(readFileSync(this.file, "utf8")); - 读取本地文件bridge/e2ee-policy.js:72
if (existsSync(this.file)) this.loadWarning = `${POLICY_FILE_NAME} 解析失败:${err?.message ?? err}`; - 写入本地文件bridge/e2ee-policy.js:82
mkdirSync(this.stateDir, { recursive: true }); - 写入本地文件bridge/e2ee-policy.js:85
writeFileSync(tmp, body, { mode: 0o600 }); - 写入本地文件bridge/e2ee-policy.js:86
renameSync(tmp, this.file); - 读取本地文件bridge/e2ee.js:29
if (existsSync(this.keyFile)) { - 读取本地文件bridge/e2ee.js:31
const d = JSON.parse(readFileSync(this.keyFile, "utf8")); - 写入本地文件bridge/e2ee.js:43
copyFileSync(this.keyFile, bak); - 写入本地文件bridge/e2ee.js:58
mkdirSync(this.stateDir, { recursive: true }); - 写入本地文件bridge/e2ee.js:61
writeFileSync(tmp, body, { mode: 0o600 }); - 写入本地文件bridge/e2ee.js:62
renameSync(tmp, this.keyFile); - 读取本地文件bridge/e2ee.js:109
const f = JSON.parse(readFileSync(this.pairingFile, "utf8")); - 读取本地文件bridge/main.js:24
const config = JSON.parse(readFileSync(configPath, "utf8")); - 读取本地文件bridge/main.js:62
return JSON.parse(readFileSync(configPath, "utf8"))?.dsh?.token ?? ""; - 读取本地文件bridge/main.js:103
if (!existsSync(file)) { - 读取本地文件bridge/main.js:107
ageMs = Date.now() - statSync(file).mtimeMs; - 写入本地文件bridge/main.js:215
writeFileSync(join(config.stateDir, "device-id.json"), JSON.stringify({ deviceId }, null, 2)); - 发起网络请求bridge/relay.js:78
const res = await fetch(`${this.url}${path}`, options); - 写入本地文件bridge/scan.js:35
mkdirSync(stateDir, { recursive: true }); - 写入本地文件bridge/scan.js:36
writeFileSync(scanFile, script, "utf8"); - 执行外部命令来自配置/变量bridge/scan.js:45
const out = execSync(cmd, { encoding: "utf8", timeout: 15000, windowsHide: true, stdio: ["ignore", "pipe", "ignore"] }); - 写入本地文件bridge/singleton.js:146
writeFileSync( - 删除本地文件bridge/singleton.js:155
try { rmSync(join(stateDir, "bridge.lock.json"), { force: true }); } catch { } - 写入剪贴板lib/client.body.js:2200
void navigator.clipboard?.writeText(text); - 发起网络请求lib/client.body.js:2503
res2 = await fetch(url2, { cache: "no-store" }); - 发起网络请求lib/client.body.js:2514
res = await fetch(url, {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 手机远程控制
- 云端中继
- 二维码下载配对登录
README
由 DeepSeek 最新模型翻译生成dshmobile — DeepSeek Harness 手机远程客户端
English version
开箱即用:装一次插件 → 扫码 → 手机接着干。为 DSH 建立一个真正的 Remote Client——不需要懂 Tailscale、隧道、端口、NAT 或任何网络概念,不修改 DSH,跨平台。
在手机上远程控制本机 DeepSeek Harness(DSH):扫码配对 → 设备 → 会话树 → 对话、审批、提问应答、模型切换、文件浏览。
架构
┌──────────────┐ WSS ┌───────────────────┐ WSS ┌───────────────────────────┐
│ Android App │ ───────▶ │ Cloud Relay │ ◀─────── │ PC Bridge(DSH 插件) │ │ (签名 APK) │ │ (托管服务) │ │ (开源) │ └──────────────┘ └───────────────────┘ └────────────┬──────────────┘ │ 127.0.0.1:3080 ┌─────────▼──────────┐ │ DeepSeek Harness │ └────────────────────┘
展开完整文档(README 剩余 1 节)
dshmobile — DeepSeek Harness 手机远程客户端 English version 开箱即用:装一次插件 → 扫码 → 手机接着干。为 DSH 建立一个真正的 Remote Client——不需要懂 Tailscale、隧道、端口、NAT 或任何网络概念,不修改 DSH,跨平台。 在手机上远程控制本机 DeepSeek Harness(DSH):扫码配对 → 设备 → 会话树 → 对话、审批、提问应答、模型切换、文件浏览。 架构 ┌──────────────┐ WSS ┌───────────────────┐ WSS ┌───────────────────────────┐ │ Android App │ ───────▶ │ Cloud Relay │ ◀─────── │ PC Bridge(DSH 插件) │ │ (签名 APK) │ │ (托管服务) │ │ (开源) │ └──────────────┘ └───────────────────┘ └────────────┬──────────────┘ │ 127.0.0.1:3080 ┌─────────▼──────────┐ │ DeepSeek Harness │ └────────────────────┘ 业务内容(prompt / 回复 / 会话 / 文件)经 E2EE 端到端加密:relay 只能看到路由元数据, 读不到、也改不了你的会话内容。连接层带自愈:DSH 重启、网络抖动后自动重握手恢复,无需手动操作。 开源与安全 | 组件 | 状态 | 说明 | | PC Bridge / 插件 | Open Source(MIT) | plugins/,npm 包 @zdx8637/dshmobile-bridge | | 协议契约 | Open | docs/02-protocol.md(wire format 单一事实来源) | | E2EE 设计 | Open and auditable | docs/plan-e2ee.md(威胁模型 + 密码学参数 + 握手) | | Android App | 签名 APK 分发 | 扫码下载 | | Cloud Relay | 托管服务 | 认证 / 路由 / 审计 | 协议与加密实现完全公开、可独立审计;业务内容经 E2EE 端到端加密,relay 只负责路由与元数据转发,无法读取你的会话内容。 安装 先选方式:DSH 桌面版 0.2.0 及以上 → 用 §A(GUI,推荐);旧版 dsh web(0.1.7)→ 用 §B(CLI)。 两种方式装的是同一个包:@zdx8637/dshmobile-bridge(当前插件版本 1.0.7)。 A. 电脑端 —— DSH 0.2.0 桌面版:GUI 安装(推荐) 1. 打开 DSH 桌面版 → 插件管理器 → 点 「添加插件」; 2. 在输入框里粘贴带精确版本号的包名(输入框提示原文是「输入插件的包名、GitHub 仓库地址或本地目录路径。」,GitHub 仓库地址与本地目录路径它同样接受): @zdx8637/dshmobile-bridge@1.0.7 3. 右侧 「安装源」 按网络情况选 npm 官方源 或 中国大陆镜像源; 4. 点安装; 5. 重启 DSH(宿主需要重新加载插件才会生效); 6. 打开面板:Web 左侧栏底部出现 ▶ 箭头,点开即配置面板(① 登录 / 授权码,② 加密配对码)。 ⚠️ 务必带上精确版本号(如 @zdx8637/dshmobile-bridge@1.0.7)。 profile 目录里有 pnpm-lock.yaml,只写包名重装时锁文件可能把版本钉回旧的(实测:线上已经发到 1.0.2,重装后却仍然是 1.0.0)。 ⚠️ 没有自动更新。 弹窗原文:「插件安装后,暂不支持自动更新。若需升级,请先卸载再安装新版」。 升级 = 先在插件管理器里卸载,再按上面的步骤装上带新版本号的包名。 B. 电脑端 —— DSH 0.1.7(旧版:dsh web + CLI):CLI 安装 npx -y @deepseek-ai/dsh plugin --profile web add @zdx8637/dshmobile-bridge@latest 重启 dsh 后,Web 左侧栏底部出现 ▶ 箭头,点开即配置面板 前置 pnpm(dsh plugin 子命令依赖它;corepack enable 或 npm i -g pnpm)。 仅限旧版:@deepseek-ai/dsh 的 npm latest 指向 0.1.7 的 CLI,所以这条命令拿到的是 0.1.7 的 dsh plugin。0.2.0 及以上请改用上面的 §A(GUI),CLI 不是 0.2.0 的安装路径。 手机端(Android App) 扫描电脑面板二维码 → 落地页下载签名 APK(当前版本 v1.0.0)。装好后在 App 内扫码:先扫①登录,再扫②加密配对,配对成功后设备列表出现盾牌记号即 E2EE 已生效(非加密显示为「盾牌 + 斜杠」;两者都是灰色,差别在形状不在颜色)。 DSH 版本要求 插件只支持 v2 协议,即 DSH v0.1.5 及以上。旧版 DSH 的 legacy 协议已于 0.1.0-beta.23 整体删除。 | DSH 版本 | 插件行为 | | v0.1.5 及更新 | 完整支持:/api 会话鉴权(launch token → 会话 Cookie)、Typert 端点(session/* 等)、/api/remote.mux 流复用、$events 审批/提问瀑布 | | v0.1.0-rc.6 及更早 | 不支持 —— 请先升级 DSH,再安装本插件 | 这是有意的收窄:双协议分支长期是缺陷高发区,每条改动都要在两条链路上各验一遍。 若你仍在使用 v2 之前的 DSH,请停留在 0.1.0-beta.22,或先升级 DSH。 目录 | 目录 | 内容 | | plugins/ | PC Bridge 插件(host + bridge 守护 + Web 面板),开源 | | docs/02-protocol.md | relay 信封、消息类型、设备语义(线格式契约) | | docs/plan-e2ee.md | E2EE v1 设计(威胁模型、密码学、握手、pinning) | | docs/e2ee-identity-issues.md | E2EE 身份/配对问题调研(撕裂读再生、重启自愈等) | | docs/bridge-singleton.md | 桥单实例保护:多实例/孤儿桥互相顶替的原理、四层防护与诊断入口 | 信任与自托管(路线图) - 现阶段 relay 为作者自营托管服务;内容隐私由 E2EE 保证,relay 只做路由与元数据转发。 - 后续将发布 reference self-hosted relay(参考实现,≠ 线上生产版),让用户可自建: Android → 自建 relay → Bridge → DSH。账号系统、监控、扩缩容等运营能力由托管方维护。 隐私与密钥 本仓库不含任何真实凭据。Android 签名密钥、relay 账号密码、服务器 SSH 凭据等只存在于本地 / 私有渠道,一律以环境变量注入、文档中用占位符。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
zdx8637-gitdog/dshmobile
用手机远程控制 DeepSeek Harness:Android App + 云端中继 + PC 插件。一个长期有效的二维码,三种用途——下载、配对、登录授权。
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这是你的仓库?认领条目