扫码配对后随时用手机查看并控制桌面端会话
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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 70 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/9) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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 独立许可,不对插件施加额外协议要求。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
daetz-coder/DSH-Mobile
扫码配对后随时用手机查看并控制桌面端会话
相关插件 · 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,344已汉化DSH
71.5
终端编码代理esengine/DeepSeek-Reasonix
· 指南 · ACP · 扩展开发 · 规格 · 官方网站 · Discord · QQ
★ 36,045已汉化DSH
71.2
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,202已汉化DSH
71.1
这是你的仓库?认领条目