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

手机接入桥 cuteG41cute/dsh-mobile

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

把本地 DeepSeek Harness WebUI 搬到手机上:局域网代理桥接、移动端 UI 适配、设备审批,外加原生 Android 外壳。

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装;安装清单取自 netmon/package.json。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add cuteG41cute/dsh-mobile
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/11/2) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装;安装清单取自 netmon/package.json

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-netmon(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 22:23:12

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 35 处,展示前 27 条)
  • 读取本地文件
    bridge/bridge.cjs:61
    if (fs.existsSync(LOG_FILE) && fs.statSync(LOG_FILE).size > 1024 * 1024) fs.truncateSync(LOG_FILE, 0);
  • 写入本地文件
    bridge/bridge.cjs:64
    fs.appendFileSync(LOG_FILE, "[" + new Date().toISOString() + "] " + message + "\n");
  • 发起网络请求
    bridge/bridge.cjs:176
    const probe = http.request({
  • 读取密钥环境变量
    bridge/bridge.cjs:220
    const TOKEN_DAYS = Number(process.env.DSH_BRIDGE_TOKEN_DAYS || 7);
  • 读取密钥环境变量
    bridge/bridge.cjs:234
    if (process.env.DSH_BRIDGE_ACCESS_TOKEN) return process.env.DSH_BRIDGE_ACCESS_TOKEN;
  • 读取本地文件
    bridge/bridge.cjs:308
    const stat = fs.statSync(file);
  • 读取本地文件
    bridge/bridge.cjs:311
    const text = fs.readFileSync(file, "utf8");
  • 读取本地文件
    bridge/bridge.cjs:388
    const parsed = JSON.parse(fs.readFileSync(DEVICE_STORE_FILE, "utf8"));
  • 写入本地文件
    bridge/bridge.cjs:407
    try { fs.writeFileSync(DEVICE_STORE_FILE, JSON.stringify(deviceStore, null, 2) + "\n"); }
  • 读取本地文件
    bridge/bridge.cjs:1021
    const text = fs.readFileSync(CREDENTIALS, "utf8");
  • 读取本地文件
    bridge/bridge.cjs:1074
    try { body = fs.readFileSync(file); }
  • 发起网络请求
    bridge/bridge.cjs:1492
    const request = http.request({
  • 发起网络请求
    bridge/bridge.cjs:1522
    const q = http.request({ hostname: TARGET.hostname, port: TARGET.port || 80, method: "GET", path: SETTINGS_DESCRIBE_PATH, headers: { host: qrHosts().l
  • 发起网络请求
    bridge/bridge.cjs:1682
    const proxied = http.request({
  • 发起网络请求
    bridge/mobile-panel.js:98
    return fetch(API + (host ? '?host=' + encodeURIComponent(host) : ''), { cache: 'no-store' })
  • 发起网络请求
    bridge/mobile-panel.js:102
    return fetch(path + '?id=' + encodeURIComponent(id) + (extra || ''), { method: 'POST' }).then(function (r) { return r.json(); });
  • 写入剪贴板
    bridge/mobile-panel.js:243
    if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(text); return; }
  • 发起网络请求
    bridge/mobile-panel.js:270
    fetch('/__wan?url=' + encodeURIComponent(url || ''), { method: 'POST' })
  • 发起网络请求
    bridge/mobile-panel.js:279
    fetch('/__wan?rotate=1', { method: 'POST' })
  • 发起网络请求
    bridge/mobile-panel.js:322
    fetch('/__display?locale=' + encodeURIComponent(lang), { method: 'POST' })
  • 发起网络请求
    bridge/mobile-panel.js:333
    fetch('/__display?' + q.join('&'), { method: 'POST' })
  • 发起网络请求
    bridge/mobile-tweaks.js:558
    fetch("/__display", { credentials: "same-origin" }).then(function (r) { return r.json(); }).then(function (info) {
  • 发起网络请求
    netmon/lib/client.js:15
    return fetch('/dsh-netmon/api', {
  • 写入剪贴板
    netmon/lib/client.js:65
    try { if (navigator.clipboard && navigator.clipboard.writeText) navigator.clipboard.writeText(text); } catch (e) { }
  • 发起网络请求
    netmon/lib/index.js:54
    const res = await fetch(url, Object.assign({ signal: controller.signal }, init || {}))
  • 发起网络请求
    netmon/lib/index.js:94
    const req = https.request({
  • 执行外部命令来自配置/变量
    netmon/lib/index.js:201
    const child = spawn(process.execPath, [file].concat(args), {
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 局域网代理桥接
  • 移动端UI适配
  • 设备审批

README

由 DeepSeek 最新模型翻译生成
DSH 手机端(DeepSeek Harness Mobile) DSH 手机端——把本地 DeepSeek Harness 接入手机 把本机的 DeepSeek Harness WebUI 接到手机上用:局域网扫码即用,需要时再通过任意 frp 隧道从外网接入。 Bring your local DeepSeek Harness WebUI to your phone — over LAN by QR code, over WAN through any frp tunnel. 截图 | 深色(跟随系统) | 浅色 | 会话界面 | | 深色首屏 | 浅色首屏 | 会话界面 | 界面右侧的圆球是实时网络往返延迟(绿 <150ms / 黄 <400ms / 红更慢);点一下进 App 设置,长按刷新页面,可拖到任意位置并吸附边缘。深色 / 浅色既支持「跟随系统」(系统切深浅时实时跟着变),也支持按设备单独指定。 App 设置与文件浏览 | 首次打开就是这一页(App 设置) | 文件浏览(DSH 自身的「文件」页面) | | App 设置 | 文件预览 | 还没填地址时,App 直接停在设置页:扫码连接、从相册里的二维码图片连接、保持屏幕常亮、快捷操作(展开/收起会话列表、刷新页面、在系统浏览器中打开),底部是版本号与当前服务器地址。
展开完整文档(README 剩余 1 节)
DSH 手机端(DeepSeek Harness Mobile)

DSH 手机端——把本地 DeepSeek Harness 接入手机

把本机的 DeepSeek Harness WebUI 接到手机上用:局域网扫码即用,需要时再通过任意 frp 隧道从外网接入。

Bring your local DeepSeek Harness WebUI to your phone — over LAN by QR code, over WAN through any frp tunnel.

截图

| 深色(跟随系统) | 浅色 | 会话界面 |
| 深色首屏 | 浅色首屏 | 会话界面 |

界面右侧的圆球是实时网络往返延迟(绿 <150ms / 黄 <400ms / 红更慢);点一下进 App 设置,长按刷新页面,可拖到任意位置并吸附边缘。深色 / 浅色既支持「跟随系统」(系统切深浅时实时跟着变),也支持按设备单独指定。

App 设置与文件浏览

| 首次打开就是这一页(App 设置) | 文件浏览(DSH 自身的「文件」页面) |
| App 设置 | 文件预览 |

还没填地址时,App 直接停在设置页:扫码连接、从相册里的二维码图片连接、保持屏幕常亮、快捷操作(展开/收起会话列表、刷新页面、在系统浏览器中打开),底部是版本号与当前服务器地址。填好一次即长期使用,之后打开直达界面。右侧是 DSH 自带的文件浏览在手机上的样子——翻目录、看文件、改分辨率都不用换设备。

它做了什么

| 能力 | 说明 |
| 手机接入桥 | 一个零依赖的 Node 反向代理(默认 0.0.0.0:8099 到 127.0.0.1:3080),替手机侧签发 harness 认证 cookie,并把请求 Host/Origin 归一化成受信任来源 |
| 移动端适配 | 往页面注入移动端适配(☰ 抽屉、宽度门控、悬浮球),不改产品源码 |
| 「手机端」设置面板 | 二维码(局域网/外网)、App 下载、设备管理(允许/拒绝/踢出/完全信任)、接入口 |
| 设备身份与认证 | 粗粒度机型特征码(安卓 App 用 Android ID)→ 随机 ID;新设备在本机点「允许」才放行;口令每 7 天自动轮换,「完全信任」设备免口令 |
| 按设备隔离的设置 | 外观 / 字号 / 语言按设备生效,不影响电脑 |
| 传输优化 | 压缩透传 + 桥侧 brotli,首屏字节约为原来的 1/3 |
| 外网接入 | 任何 frp / 内网穿透都行;自带 Let's Encrypt 证书自动续期脚本(HTTP-01,无需服务商 API 密钥) |
| 下载到手机 | 「文件」面板每个文件行有 ⤓;预览里长按也能下载当前文件(含从会话点开的)。经桥的 /__file 以附件形式落到手机「下载」目录 |
| 预览手势缩放 | 只对图片生效:预览默认适宽(一屏看全),双指捏合缩放,范围 10%–2000%,页面里不放任何常驻控件(不会挡输入框),长按菜单可切「适宽 / 1:1」。PDF 保持产品排版:分页与滚动原样,捏合不会再去改页面尺寸。|
| 下载进度 | 悬浮球边缘一圈细环显示下载进度(原生实现,需 App 在 1.3.5 以上)|
| 延迟探测不再被挡 | 悬浮球的 /__ping 是原生请求,1.3.5 起会把 WebView 的 cookie 一起带上——走隧道时不再每 5 秒被口令闸门拦下一次(日志不再刷屏)|
| 返回键先关浮层 | 打开抽屉 / 右栏预览 / 插件面板 / 长按菜单时,按安卓返回键会收起它们,不会后退重载页面(页面位置不丢);都没有打开时才按「再按一次退出」处理。页面侧契约 window.__dshmBack(),由 App 在 1.3.5 起从 onBackPressed 调用,纯浏览器里不生效 |
| 网络 / 隧道监视器 | 配套 DSH 插件(netmon/):会话头部一个「网络」芯片,点开看接入桥健康、内网入口、外网隧道真实可达性、证书剩余天数、设备在线情况 |
| 抗更新退化 | 注入前清单自检 + /__selftest + 桌面启动器自检不过就回退官方端口 |

目录

bridge/ 手机接入桥(Node,零依赖)+ 手机端面板 + 移动端适配注入 + 证书脚本 app/ 安卓 App(原生 WebView 壳,无 Gradle/AndroidX,用 build-tools 直接构建) netmon/ 配套 DSH 插件:会话头部的「网络 / 隧道」监视器(含安装说明) docs/ 部署清单(换一台机器怎么装)

快速开始

前提:本机已能跑 dsh web(默认 127.0.0.1:3080),Node 在 18 以上。

1) 电脑:启动桥
node bridge/bridge.cjs # 默认 0.0.0.0:8099 到 127.0.0.1:3080
node bridge/bridge.cjs --port 8099 --target http://127.0.0.1:3080

2) 电脑:放行防火墙(Windows 管理员运行一次) powershell -ExecutionPolicy Bypass -File bridge/allow-firewall.ps1

3) 打开 http://127.0.0.1:8099/ ——「设置 → 手机端」里有二维码

手机与电脑同一 Wi-Fi 时,浏览器扫码即用;页面里可直接下载安卓 App(也可以在 App 内「扫一扫」直接连上)。

外网接入见 docs/SETUP.md(隧道 → 域名 → 证书 → 二维码)。

安卓 App

app/dist/dsh-mobile-1.3.9.apk 是可直接安装的构建产物(自签名,仅供自用);也可以从 Releases 直接下载。装好后应用名是 DeepSeek Harness(桌面图标是一只虎鲸,左右各留 8% 空白)。自己改代码后重新构建:

cd apppowershell
powershell -ExecutionPolicy Bypass -File build.ps1 -VersionCode 10 -VersionName 1.4.0

需要本机有 Android SDK 和 build-tools(aapt2 / d8 / zipalign / apksigner)。签名密钥请自行生成(keystore/ 不入库)。

版本号以 AndroidManifest.xml 里的 versionCode/versionName 为准:实际 build.ps1 -VersionCode/-VersionName 只影响输出文件名,aapt2 的 --version-code 盖不住清单里的值。改版本请直接改清单,否则会出现「文件名 1.3.4、装上去还是 1.3.3」。

安全模型(请务必读)

- 桥端口等价于本机 shell 权限:能打开它的人即可读写文件、执行命令。只暴露桥端口,绝不要暴露 3080。
- 三道闸门:接入口令(外网必须带)+ 设备认证(本机点 ✓)+ 可选「完全信任」(免口令,可随时撤销);
- 自签证书(App v1.3.7 起):连到证书不被系统信任的服务器时,App 把 SHA-256 指纹摊给你核对,确认后只认这一张(TOFU)。没有「信任所有证书」这个开关——中间人换一张证书会立刻被拒。
- 桥不给页面注入任何远程代码:面板/适配脚本都是本地文件。
- 建议:只用在家用网络 + 自己的隧道;不要把端口映射到公网裸奔。

已知边界

- 依赖 DSH 的页面结构与启动清单;DSH 大版本更新后若结构变化,最坏情况是少个面板、页面照常(不会白屏)。
- /api/settings/describe 在新版 DSH 上已不存在,因此「按设备隔离」改走页面注入(见 bridge/README.md);
- 语言切换在页面加载时解析,改完需刷新一次。

提个醒:两处设置别混淆

- 设置 → 通用设置 里的 语言 / 外观 / 字号是全局的:在任何设备上改,所有设备(含电脑)一起变。
- 设置 → 手机端 →「仅本设备的显示」只作用于当前这台设备:电脑不受影响,按设备保存(换浏览器、重装后仍沿用)。语言在页面加载时解析,改完刷新一次。

| 设置 → 通用设置(全局) | 设置 → 手机端(只影响这一台) |
| 通用设置 | 手机端 |

宣传图

分享用(矢量源文件在 docs/,PNG 版同目录):

| 横版 1280×640 | 竖版 1080×1920 |

banner.png 可直接用作 GitHub 社交预览图;poster.png 底部的二维码指向本仓库(已用 ZXing 实测可扫)。

许可

本项目自己的代码是 MIT(见 LICENSE)。仓库里另有两个第三方文件(ZXing 的 Apache-2.0 jar、qrcode-generator 的 MIT 源码),逐项声明与许可全文见 THIRD-PARTY.md。
预览分享卡片长什么样 ↓cuteG41cute/dsh-mobile
分享 · DeepSeek Harness Hub
cuteG41cute/dsh-mobile

把本地 DeepSeek Harness WebUI 搬到手机上:局域网代理桥接、移动端 UI 适配、设备审批,外加原生 Android 外壳。

这是你的仓库?认领条目

回到顶部