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

手机遥控端 daetz-coder/DSH-Mobile

DeepSeek Harness
daetz-coder70 天前有提交已提供中文文档扫描:含敏感能力

扫码配对后随时用手机查看并控制桌面端会话

27.5/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add daetz-coder/DSH-Mobile
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · ui
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 70 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/9) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 49 处,展示前 44 条)
  • 读取本地文件
    plugins/dsh-pocket/lib/index.js:37
    return JSON.parse(readFileSync(pkgPath, 'utf8')).version;
  • 写入本地文件
    plugins/dsh-pocket/lib/index.js:55
    mkdirSync(dirname(p), { recursive: true });
  • 写入本地文件
    plugins/dsh-pocket/lib/index.js:56
    writeFileSync(p, fresh, { mode: 0o600 });
  • 读取本地文件
    plugins/dsh-pocket/lib/index.js:62
    const existing = readFileSync(p, 'utf8').trim();
  • 读取本地文件
    plugins/dsh-pocket/lib/index.js:131
    const raw = JSON.parse(await readFile(restartNoticePath(), 'utf8'));
  • 写入本地文件
    plugins/dsh-pocket/lib/index.js:138
    return mkdir(dirname(restartNoticePath()), { recursive: true })
  • 写入本地文件
    plugins/dsh-pocket/lib/index.js:139
    .then(() => writeFile(restartNoticePath(), JSON.stringify({ at: Date.now(), pid: process.pid }), 'utf8'));
  • 删除本地文件
    plugins/dsh-pocket/lib/index.js:148
    await rm(restartNoticePath(), { force: true }).catch(() => {});
  • 执行外部命令固定命令
    plugins/dsh-pocket/lib/index.js:169
    const child = spawn('dsh', ['plugin', '--profile', profile, 'update', 'dsh-pocket', '--latest', '-w'], {
  • 读取本地文件
    plugins/dsh-pocket/lib/index.js:212
    const raw = readFileSync(join(process.env.DSH_HOME ?? join(homedir(), '.dsh'), 'settings.yaml'), 'utf8');
  • 读取本地文件
    plugins/dsh-pocket/lib/service.mjs:83
    const v = readFileSync('/proc/version', 'utf8').toLowerCase();
  • 执行外部命令来自配置/变量
    plugins/dsh-pocket/lib/service.mjs:117
    execFile(candidates[i], [], { timeout: 5000, windowsHide: true }, (err, stdout) => {
  • 写入本地文件
    plugins/dsh-pocket/lib/service.mjs:228
    await mkdir(dirname(autoStatePath), { recursive: true });
  • 写入本地文件
    plugins/dsh-pocket/lib/service.mjs:229
    await writeFile(autoStatePath, JSON.stringify({ at: Date.now() }), 'utf8');
  • 删除本地文件
    plugins/dsh-pocket/lib/service.mjs:234
    try { await rm(autoStatePath, { force: true }); } catch { }
  • 读取本地文件
    plugins/dsh-pocket/lib/service.mjs:333
    const raw = await readFile(autoStatePath, 'utf8');
  • 读取本地文件
    plugins/dsh-pocket/lib/settings.mjs:22
    const raw = JSON.parse(readFileSync(settingsPath(), 'utf8'));
  • 写入本地文件
    plugins/dsh-pocket/lib/settings.mjs:30
    mkdirSync(dirname(settingsPath()), { recursive: true });
  • 写入本地文件
    plugins/dsh-pocket/lib/settings.mjs:31
    writeFileSync(settingsPath(), JSON.stringify(s, null, 2), { mode: 0o600 });
  • 写入本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:61
    const out = createWriteStream(dest);
  • 发起网络请求
    plugins/dsh-pocket/lib/tunnel.mjs:88
    try { head = await fetch(url, { method: 'HEAD', signal }); } catch { head = null; }
  • 发起网络请求
    plugins/dsh-pocket/lib/tunnel.mjs:94
    const res = await fetch(url, { signal });
  • 写入本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:96
    await pipeline(Readable.fromWeb(res.body), createWriteStream(dest));
  • 发起网络请求
    plugins/dsh-pocket/lib/tunnel.mjs:104
    const probeRes = await fetch(url, { signal, headers: { Range: `bytes=0-${probeBytes - 1}` } });
  • 写入本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:112
    const w = createWriteStream(dest);
  • 发起网络请求
    plugins/dsh-pocket/lib/tunnel.mjs:118
    const restRes = await fetch(url, { signal, headers: { Range: `bytes=${probeBytes}-${len - 1}` } });
  • 写入本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:120
    await pipeline(Readable.fromWeb(restRes.body), createWriteStream(dest, { flags: 'a' }));
  • 删除本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:124
    await rm(dest, { force: true }).catch(() => {});
  • 删除本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:126
    await rm(dest, { force: true }).catch(() => {});
  • 发起网络请求
    plugins/dsh-pocket/lib/tunnel.mjs:142
    const res = await fetch(url, { signal, headers: { Range: `bytes=${p.start}-${p.end}` } });
  • 写入本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:144
    await pipeline(Readable.fromWeb(res.body), createWriteStream(p.file));
  • 删除本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:148
    await Promise.all(parts.map((p) => rm(p.file, { force: true }).catch(() => {})));
  • 发起网络请求
    plugins/dsh-pocket/lib/tunnel.mjs:166
    res = await fetch(TUNA_BOTTLES, { signal: AbortSignal.timeout(20_000) });
  • 读取本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:212
    const st = await stat(tmpFile);
  • 删除本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:218
    await rm(tmpFile, { force: true }).catch(() => {});
  • 写入本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:234
    await rename(tmpFile, extracted).catch(async () => {
  • 执行外部命令固定命令
    plugins/dsh-pocket/lib/tunnel.mjs:244
    const child = spawn('tar', ['-xzf', tmpFile, '-C', extractDir], { stdio: 'ignore' });
  • 读取本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:254
    try { if ((await stat(direct)).isFile()) found = direct; } catch { }
  • 读取本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:261
    try { if ((await stat(bin)).isFile()) { found = bin; break; } } catch { }
  • 删除本地文件递归
    plugins/dsh-pocket/lib/tunnel.mjs:270
    await rm(extractDir, { recursive: true, force: true }).catch(() => {});
  • 删除本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:275
    await rm(tmpFile, { force: true }).catch(() => {});
  • 执行外部命令来自配置/变量
    plugins/dsh-pocket/lib/tunnel.mjs:282
    execSync(process.platform === 'win32' ? 'where cloudflared' : 'command -v cloudflared', { stdio: 'ignore' });
  • 读取本地文件
    plugins/dsh-pocket/lib/tunnel.mjs:313
    await access(bin);
  • 执行外部命令来自配置/变量
    plugins/dsh-pocket/lib/tunnel.mjs:356
    const child = spawn(bin, ['tunnel', '--url', `http://127.0.0.1:${port}`, '--protocol', 'http2', '--no-autoupdate'], {
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 扫码配对
  • 状态通知
  • 桌面远程控制
展开完整介绍(125 字)↓

DSH-Mobile · 把 DeepSeek Harness 装进口袋 — 官方 DeepSeek Harness Web UI 的 Android 配套应用,扫码配对。DeepSeek Harness 手机配套:扫码配对、状态通知、桌面远程控制。

README

由 DeepSeek 最新模型翻译生成
DSH-Mobile —— 把 DeepSeek Harness 装进口袋 扫码配对一次,之后随时随地用手机查看/控制电脑上的 DeepSeek Harness。 Pair once by QR code — then watch and control your desktop DeepSeek Harness from your phone, anywhere. DSH-Mobile 是官方 DeepSeek Harness (DSH) Web 界面的安卓原生配套 App。用二维码与电脑端 dsh web 配对一次,之后官方 DSH 界面就一直在你口袋里——看会话、发消息、控制 agent;即使关掉 App,通知栏也会逐秒同步桌面上的原生进度文本。
展开完整文档(README 剩余 1 节)
DSH-Mobile —— 把 DeepSeek Harness 装进口袋

扫码配对一次,之后随时随地用手机查看/控制电脑上的 DeepSeek Harness。
Pair once by QR code — then watch and control your desktop DeepSeek Harness from your phone, anywhere.

DSH-Mobile 是官方 DeepSeek Harness (DSH) Web 界面的安卓原生配套 App。用二维码与电脑端 dsh web 配对一次,之后官方 DSH 界面就一直在你口袋里——看会话、发消息、控制 agent;即使关掉 App,通知栏也会逐秒同步桌面上的原生进度文本。

✨ 它能做什么

| 能力 | 说明 |
| 📷 扫码配对 | 扫 dsh web → 设置 → 插件 → 手机访问 的二维码,或手动输入地址 |
| 🔐 PIN 自动登录 | 首次输入的 8 位访问密码自动加密保存;配对历史重开即达,免重复扫码 |
| 🖥️ 官方界面整页呈现 | DSH 界面以 top-level 页面加载(非 iframe),与桌面浏览器完全一致 |
| 🔔 常驻状态通知 | 通知栏逐秒同步桌面状态文本(Deep diving...1分45秒),任务结束自动转「已完成 · 本次用时」——不自计时,与桌面显示永远一致 |
| 🌐 局域网 + 公网 | 同一 WiFi 直连;外出走 cloudflared 快速隧道(URL 每次重启轮换) |
| 🌙 深色模式 + 双语 | 跟随 DSH 的主题;App 内 zh/en 随时切换 |
| 📶 配对状态徽标 | 配对列表实时显示在线 / 离线 / 受密码保护 |
| 🔔 通知权限 | Android 13+ 首次使用拉起系统授权 |

桌面 DSH 是驾驶舱,DSH-Mobile 是口袋里的副驾。

📸 运行效果

| 📱 外部访问界面 | 💬 对话显示界面 |
| 外部访问界面 | 对话显示界面 |

🚀 快速开始

1. 电脑端 —— 安装两个服务端插件,然后启动 dsh web:

方式 A:从 dshmarket 插件市场安装(推荐)
dsh plugin --profile web add dshmarket
然后在 DSH 内安装:设置 → 插件 → 市场 →
dsh-pocket (shaobeichen/dsh-pocket)
dsh-web-mobile (mexiaosqwq/dsh-web-mobile)

方式 B:直接安装
dsh plugin --profile web add dsh-pocket -w
dsh plugin --profile web add github:mexiaosqwq/dsh-web-mobile

npx @deepseek-ai/dsh web

插件市场:dshmarket.com(dsh-pocket · dsh-web-mobile)。
已测试推荐版本(DSH-Mobile v1.0.3 下):dsh-pocket v1.13.4 · dsh-web-mobile v2.1.1 —— 无需安装其他扩展即可使用。

2. 手机端 —— 安装 DSH-Mobile(Releases 下载 APK,或直接侧载)。

3. 配对 —— 打开 App,扫 dsh web → 设置 → 插件 → 手机访问 的二维码,输入一次 8 位 PIN —— 完成 🎉。

局域网访问密码默认开启(安全默认)。首次加密输入后,之后免输。

使用

1. 电脑端保持 dsh web + 两个插件运行。
2. 打开 App 点击配对(或重新扫码)——官方 DSH 界面整页打开。
3. 正常看会话、发消息、控制 agent。
4. 随时关掉 App——常驻状态通知继续盯进度,配对列表显示在线 / 离线 / 受保护状态。

🔐 安全

- DSH 能在你电脑上执行代码——配对 URL / PIN / 会话 cookie 就是钥匙:不要分享、不要提交进仓库、不要贴到任何公开地方。
- PIN 存在电脑端(~/.dsh/dsh-pocket/);手机只持有加密配对记录,拆开 APK 也拿不到敏感信息。
- 公网 URL 每次重启轮换;局域网 PIN 建议保持开启。

📦 分发

| 渠道 | 方式 |
| 落地页 | daetz-coder.github.io/DSH-Mobile——「下载 APK」一键直达 |
| GitHub Release | Releases——每个 tag 附带 DSH-Mobile.apk(CI 自动构建)· 更新记录 |
| Obtainium | 一键添加:obtainium://app/github.com/daetz-coder/DSH-Mobile——也可手动把 https://github.com/daetz-coder/DSH-Mobile 添加为应用源,自动跟随 Release 更新 |
| 侧载 | adb install -r DSH-Mobile.apk,或手机直接打开 APK |
| 源码构建 | 见下方「给开发者」 |

给开发者

- 构建 APK:cd app && npm install && npx cap sync android,
再 cd android && .\gradlew.bat :app:assembleDebug(需 JDK 21)
- 二开插件:dsh-pocket v1.13.4(GPL-2.0)、dsh-web-mobile v2.1.1(MIT)

License

按组件双许可:

- App 壳(app/ 的 Capacitor 工程 + 自研原生插件):MIT
- plugins/dsh-pocket(shaobeichen/dsh-pocket 二开上游):GPL-2.0——修改/分发必须保持 GPL-2.0 并保留版权声明
- plugins/dsh-web-mobile(mexiaosqwq/dsh-web-mobile 二开上游):MIT

基于 Capacitor(MIT)与官方 DeepSeek Harness 构建。

通过 dshmarket.com 安装插件的用户请注意:两个插件遵循各自协议——dsh-pocket 为 GPL-2.0(修改后分发必须保持 GPL-2.0),dsh-web-mobile 为 MIT。本 App(DSH-Mobile)为 MIT 独立许可,不对插件施加额外协议要求。
预览分享卡片长什么样 ↓daetz-coder/DSH-Mobile
分享 · DeepSeek Harness Hub
daetz-coder/DSH-Mobile

扫码配对后随时用手机查看并控制桌面端会话

这是你的仓库?认领条目

回到顶部