🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

手机远控 zdx8637-gitdog/dshmobile

DeepSeek Harnessv1.0.8
zdx8637-gitdog14 天前有提交已提供中文文档扫描:含敏感能力

用手机远程控制 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-bridge
npm 源 · @zdx8637/dshmobile-bridge 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · ui
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 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 凭据等只存在于本地 / 私有渠道,一律以环境变量注入、文档中用占位符。
预览分享卡片长什么样 ↓zdx8637-gitdog/dshmobile
分享 · DeepSeek Harness Hub
zdx8637-gitdog/dshmobile

用手机远程控制 DeepSeek Harness:Android App + 云端中继 + PC 插件。一个长期有效的二维码,三种用途——下载、配对、登录授权。

这是你的仓库?认领条目

回到顶部