@feiyang666/dsh-mobile-remote 1.0.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.zh.md CHANGED
@@ -1,12 +1,16 @@
1
1
  <div align="center">
2
2
 
3
- # 手机端远程控制(dsh-mobile-remote)📱
3
+ # DeepSeek Harness 移动端远程控制插件(dsh-mobile-remote)📱
4
4
 
5
5
  [English](./README.md) | **简体中文**
6
6
 
7
- [MIT License](./LICENSE)
7
+ [GitHub](https://github.com/feiyang-dev/dsh-mobile-remote) · [npm](https://www.npmjs.com/package/@feiyang666/dsh-mobile-remote) · MIT License
8
8
 
9
- **让手机实时同步并远程操控电脑端 DeepSeek Harness 的官方扩展插件** —— 对话记录、会话列表、设置全部双向同步,手机上直接发消息,并对手机屏幕做移动端界面适配。
9
+ **由开发者制作的 DeepSeek Harness 插件** —— 在 Web UI 设置页内置「远程控制」:连接二维码、一键开关、在线设备数,让手机通过局域网访问并操控电脑上的 DeepSeek Harness,同时提供移动端界面优化。
10
+
11
+ ![License](https://img.shields.io/badge/license-MIT-blue.svg)
12
+ ![Node](https://img.shields.io/badge/node-%3E%3D18-339933)
13
+ ![Platform](https://img.shields.io/badge/platform-web%20%26%20desktop-4d9fff)
10
14
 
11
15
  </div>
12
16
 
@@ -14,48 +18,67 @@
14
18
 
15
19
  ## 简介
16
20
 
17
- `dsh-mobile-remote` 利用 DeepSeek Harness 桌面端(dsh-desktop)内置的「移动端远程控制」能力:开启该开关后,dsh web 服务会监听局域网(`0.0.0.0`),手机与电脑处于同一 Wi-Fi 时,用手机浏览器打开电脑的局域网地址即可访问 **同一个 Web UI**。
21
+ `dsh-mobile-remote` 是 DeepSeek Harness 生态的**移动端远程控制插件**(DSH plugin,Host + Client 双面一体包)。装好后在 WebUI **设置 → 远程控制** 出现一个管理面板:
18
22
 
19
- 因为手机和电脑访问的是同一份会话数据,所以:
23
+ - **连接二维码**:自动生成 `http://<局域网IP>:<端口>` 的二维码,手机相机 / 浏览器扫码即连;
24
+ - **开启 / 关闭开关**:一键切换 webserver 监听地址(`0.0.0.0` ↔ `127.0.0.1`),经 dsh 官方 HMR 热重载**无需重启服务**;
25
+ - **当前连接的设备数量**:移动端心跳上报,实时统计在线设备数;
26
+ - **远程访问密码门禁**(v1.2.0+):管理员本机设置密码,外网隧道访问进入页面需先输密码,本机/局域网不受影响;
27
+ - **远程访问提速**(v1.2.0+):frpc 连接池调大,缓解外网访问首屏转圈慢;
28
+ - **更丰富的数据展示**(v1.4.0):设备列表可点击展开完整上报信息(系统 / 浏览器 / 屏幕 / 视口 / DPR / 设备内存 / CPU 核数 / 电池 / 网络 / 当前页面 / 首次连接 / 心跳次数);「运行时信息」卡(运行时长 / 开机时长 / Node 版本 / PID / CPU 型号与核数 / 系统负载 / 内存使用率 / RSS / 堆内存);**「DSH 状态」卡**(dsh 版本 / 会话总数 / 工作区列表 / 已安装插件 / 模型提供方,后台缓存);「网络接口」卡(网卡名 / IP / 掩码 / MAC);外网隧道详情(域名 / 端口 / frpc 版本 / PID / 运行时长 / 脱敏绑定码 / 日志查看);
29
+ - **外网隧道真实状态**(v1.4.1):不再"假在线"——面板探测 frpc 日志确认隧道真正建立,断线重连降级「连接中」,token 鉴权失败显示红色「出错」+ 精确原因(如 `token in login doesn't match`)+ 一键重试;中转端 `FRP_TOKEN` 占位符时显示黄色警告条;隧道持续心跳保活,让中转端在线状态真实可靠;
30
+ - 局域网地址列表、手机访问地址、配置位置一目了然。
20
31
 
21
- - **实时双向同步**:对话记录、会话列表、设置项等所有信息天然一致,任何一端的操作都会即时反映到另一端;
22
- - **手机端完整操控**:手机上直接发送消息、切换会话、查看详情、管理设置……电脑端能做的一切都能做;
23
- - **移动端界面适配**:本插件针对手机屏幕优化触控与布局,让 Web UI 在手机上流畅可用。
32
+ **核心卖点:纯命令行用户无需安装桌面端。** 官方 CLI 出于安全拒绝 `--host 0.0.0.0`,但本插件通过 profile 的 `cordis.patch.yml`(或 `--patch <overlay>`)写入 `webserver.host: 0.0.0.0`——这正是桌面端「移动端远程控制」开关的实现方式。手机与电脑共享同一个 dsh 后端进程与同一份 `~/.dsh` 数据,**会话列表、历史记录、工作区、设置全部天然双向同步,无需任何数据复制**。
24
33
 
25
- npm 包名:`@feiyang666/dsh-mobile-remote`(同项目系列:`@feiyang666/dsh-usage-plugin` 用量插件、`@feiyang666/dsh-vault` 数据保险箱)。
34
+ ---
26
35
 
27
- ## 功能
36
+ ## 远程访问密码(可自定义,通用自托管)
28
37
 
29
- | 能力 | 说明 |
30
- |---|---|
31
- | **远程控制设置页** | Web 端设置页新增「远程控制」页面:实时显示开关状态、监听地址/端口、会话数、本机局域网 IPv4 地址、手机访问 URL(一键复制)、扫码二维码、连接测试、使用说明 |
32
- | **移动端界面适配** | 手机屏幕(≤768px)自动生效:三列布局收敛为单列、侧栏变成滑出抽屉(带遮罩)、触控目标放大、禁止双击缩放、iOS 安全区适配 |
33
- | **浮动控制条** | 手机端右上角悬浮按钮:`☰` 随时打开会话列表抽屉;状态圆点指示远程连接状态(绿=已通过局域网连接、黄=已开启但本机访问、灰=未开启),点击可查看手机访问地址并复制 |
34
- | **实时状态轮询** | 浮动控制条每 15 秒向 Host 查询一次状态,会话数、监听地址、连接状态保持最新 |
35
- | **模型工具** | 注册 `mobile_remote_status` 工具,模型可直接查询远程控制状态与手机访问链接 |
36
- | **Host JSON API** | `POST /api/dsh-mobile-remote`:`status`(完整状态快照)/ `ping`(心跳),供 UI 与扩展调用 |
38
+ 为了让「远程(外网隧道)访问」更安全,插件内置**远程访问密码门禁**:
37
39
 
38
- ## 工作原理
40
+ - 在 **设置 → 远程控制** 面板的「远程访问密码」卡片中,管理员可**在本机设置 / 修改 / 清除**一个密码;
41
+ - 设置后,任何**通过外网隧道(`*.dsh.xxx.top`,HTTPS 反代)**访问本机 DSH 的浏览器,进入页面时都会被全屏密码页拦截,**必须输入正确密码**才能使用;本机(`127.0.0.1`)与局域网直连访问不受影响,保证管理员始终能正常管理与修复;
42
+ - **密码完全存储在插件本地**(`~/.dsh/plugins/dsh-mobile-remote/config.json`),只保存 `scrypt` 哈希 + 随机盐,**绝不落盘明文**,校验使用 `timingSafeEqual` 防时序攻击,登录带失败次数限制防爆破。
39
43
 
40
- ```
41
- ┌─────────────┐ 同 Wi-Fi ┌──────────────────────────┐
42
- │ 手机浏览器 │ ──────────▶ │ dsh web (电脑, :3080) │
43
- │ (移动端适配) │ http://LAN │ - 同一个 Web UI │
44
- │ ☰ 抽屉/FAB │ ◀────────── │ - 同一份会话数据(实时同步) │
45
- └─────────────┘ 双向同步 └──────────────────────────┘
46
- ```
44
+ > **关键设计:完全本地、不依赖任何中转后端。** 无论你是否使用本项目自带的 `dsh-update-server` 中转服务,还是自建其它 frp / 中转方案,密码机制都能直接使用——它对任意「远程 HTTPS 访问」生效,与中转服务解耦。
45
+
46
+ ---
47
+
48
+ ## 中转服务端(dsh-update-server)接口
49
+
50
+ 插件外网隧道状态使用中转服务器的**成员端**接口(无需管理员登录):
51
+
52
+ - `GET /api/tunnel/status` — 基础成员状态(名称 / 在线 / 端口 / 最后心跳);
53
+ - `GET /api/tunnel/stats` — **成员隧道实时统计**(本次新增,需升级中转服务端):含基础字段,并带 **frps 实时详情** —— 今日上行 / 下行流量、当前连接数、本地转发端口、隧道启动时间。
54
+
55
+ 插件会**先请求 `/stats`,后端未升级时自动回退到 `/status`**,所以旧后端不会导致面板异常。
56
+
57
+ > 需将以下文件部署到你的中转服务器并重启服务:`src/routes/tunnel.js`、`src/tunnel-service.js`。
58
+
59
+ ## 远程访问性能优化
60
+
61
+ 远程(外网隧道)访问比内网慢的常见根因是:DSH 首屏会同时发起大量并发请求(JS/CSS / API / WebSocket),而 frp 隧道默认的工作连接池(`poolCount`)过小,导致 frpc 反复报 `work connection pool is full, discarding`,大量连接被丢弃、排队重试,表现为首页一直转圈。
62
+
63
+ 本插件做了以下优化:
64
+
65
+ - **frpc 连接池调大**:生成的 `frpc.toml` 为每个 `[[proxies]]` 注入 `poolCount = 20`(可用环境变量 `DSH_FRPC_POOL_COUNT` 覆盖);
66
+ - **服务端配套**:`dsh-update-server` 的 `deploy/frps.toml` 模板将 `transport.maxPoolCount` 调大到 `64`(需部署到中转服务器后生效),避免服务端限制客户端连接池。
67
+
68
+ ---
47
69
 
48
- - 手机与电脑访问的是**同一个 Web 应用、同一份 `~/.dsh` 会话数据**,因此「同步」是天然且实时的(无中间层、无二次复制);
49
- - dsh-desktop 的「移动端远程控制」开关通过 overlay 配置让服务监听 `0.0.0.0`(仅影响监听地址,不影响桌面端自身);
50
- - 本插件在此基础上补齐:移动端 UI 适配、远程控制引导设置页、连接状态指示与巡检。
70
+ ## 界面预览
71
+
72
+ ### 设置 → 远程控制
73
+ ![远程控制](./docs/assets/remote-control.png)
51
74
 
52
75
  ## 推荐安装方式
53
76
 
54
77
  > 两个方法任选其一,效果等价。**推荐使用桌面端**,全程图形化、无需命令行。
55
78
 
56
- ### 方式一:桌面端一键安装
79
+ ### 方式一(推荐):桌面端一键安装
57
80
 
58
- 安装 [DeepSeek Harness 桌面版](https://github.com/feiyang-dev/DeepSeek-Harness-Desktop),打开后点击 **「安装插件」→ 推荐插件 → 手机端远程控制 → 一键安装**,完成后点 **「立即重启服务」** 即可生效。
81
+ 安装 [DeepSeek Harness 桌面版](https://github.com/feiyang-dev/DeepSeek-Harness-Desktop),打开后点击 **「安装插件」→ 推荐插件 → 移动端远程控制 → 一键安装**,完成后点 **「立即重启服务」** 即可生效。
59
82
 
60
83
  ### 方式二:命令行安装
61
84
 
@@ -64,54 +87,163 @@ npm 包名:`@feiyang666/dsh-mobile-remote`(同项目系列:`@feiyang666/ds
64
87
  dsh plugin --profile web add @feiyang666/dsh-mobile-remote
65
88
  ```
66
89
 
67
- ## 使用方法
90
+ 装完重启 dsh web 服务即可。
91
+
92
+ ---
93
+
94
+ ## 使用步骤
95
+
96
+ 1. 启动 dsh(任意方式:桌面端 / `npx @deepseek-ai/dsh web` / 源码模式)。
97
+ 2. 电脑浏览器打开 `http://127.0.0.1:3080` → **设置 → 远程控制**。
98
+ 3. 点击开关**开启**(无需重启,HMR 热重载生效)。
99
+ 4. 手机与电脑连**同一 Wi-Fi**,用相机 / 浏览器**扫码**或访问局域网地址。
100
+ 5. 手机端即显示电脑端的会话列表、历史记录、工作区、设置等全部数据,可直接发消息操控电脑端执行。
101
+
102
+ ### 纯命令行启动(无需桌面端)
103
+
104
+ ```bash
105
+ # 方式一:直接使用设置页开关(推荐)
106
+ dsh --profile web
107
+ # 然后打开 http://127.0.0.1:3080 → 设置 → 远程控制 → 开启
108
+
109
+ # 方式二:手动 overlay(启动时传参)
110
+ dsh --profile web --patch remote-control.patch.yml
111
+ ```
112
+
113
+ `remote-control.patch.yml`:
114
+
115
+ ```yaml
116
+ - id: webserver
117
+ config:
118
+ host: '0.0.0.0'
119
+ port: !!js ctx.webStartup.port ?? 3080
120
+ ```
121
+
122
+ > **安全提示**:开启后服务暴露到局域网,请仅在可信的家庭 / 办公网络使用,**不要暴露到公网**。
123
+
124
+ ---
125
+
126
+ ## 这个包是什么
127
+
128
+ 一个 npm 包 = **host 半**(Node 侧 Cordis 插件,提供 `/__dsh_remote/*` API、patch 文件管理、心跳设备计数、index.html 注入,见 `lib/index.js`)+ **client 半**(浏览器侧设置面板,见 `lib/client.js`,通过 `/__dsh_remote/status` 等与 host 通信)。
129
+
130
+ 包通过两处声明接入 DSH:
131
+
132
+ | 声明 | 作用 |
133
+ | --- | --- |
134
+ | `dsh.bundle.patch`(`cordis.patch.yml`) | 让 DSH 把它识别为**标准 bundle 插件包**:`dsh plugin --profile <名> add <包名>` 一条命令即可安装并自动接线,无需手改任何配置文件 |
135
+ | `dsh.client` + `exports["./client"]` | 让 web 客户端在 `/plugins/<包名>/client.js` 自动加载设置页面板 |
136
+
137
+ 所以对使用者来说,**安装就是一条命令**,不用碰 YAML、不用手动复制文件。
138
+
139
+ ---
140
+
141
+ ## 工作原理
142
+
143
+ | 层 | 文件 | 职责 |
144
+ | --- | --- | --- |
145
+ | host | `lib/index.js` | `/__dsh_remote/status` / `toggle` / `heartbeat` / `qr` API;patch 文件读写;心跳设备计数;index.html 注入 |
146
+ | client | `lib/client.js` | 注册 `settings.section`「远程控制」面板(开关 / 二维码 / 设备数) |
147
+ | qrcode | `lib/qrcode.js` | 内联 MIT QR 生成器(`qrcode-generator`),零运行时依赖 |
148
+
149
+ - **开关**:`POST /__dsh_remote/toggle` → 写入 / 移除 profile `cordis.patch.yml` 的 `webserver` 覆盖块 → dsh `watchUserPatches`(Cordis HMR)热重载 webserver 行重新监听。
150
+ - **设备数**:移动端注入 JS 每 30s 心跳上报,host 维护活跃设备表(90s 过期)。每次心跳会上报完整设备元数据(屏幕 / 视口 / DPR / 网络 / 当前页面 / 语言 / 平台),设置面板的设备行可展开查看。
151
+ - **二维码**:`GET /__dsh_remote/qr?url=...` 返回 SVG。
152
+ - **移动端适配**:`tapIndex` 注入移动端 CSS/JS,composer 输入栏窄屏换行、选择器限宽、iOS 输入框 16px 防缩放;**不破坏 DSH 原生 rail + 汉堡抽屉交互**。
153
+
154
+ ---
155
+
156
+ ## 安装(给使用者)
157
+
158
+ ### 0. 前提条件
159
+
160
+ - 已安装 DeepSeek Harness(`npm install -g @deepseek-ai/dsh` 全局安装,或使用基于它的桌面应用 / `npx @deepseek-ai/dsh web`)。
161
+ - 确保 `dsh` 命令在 PATH 里(桌面应用自带环境则在其终端中执行)。
162
+
163
+ ### 1. 一条命令安装
164
+
165
+ ```bash
166
+ dsh plugin --profile web add @feiyang666/dsh-mobile-remote
167
+ ```
168
+
169
+ 这条命令会做三件事(全部自动):
68
170
 
69
- 1. **开启远程控制**:打开 dsh-desktop 设置页,开启 **「移动端远程控制」** 开关,重启服务;
70
- 2. **获取手机访问地址**:打开 Web UI → 设置 → **「远程控制」** 页面,复制任一「手机访问地址」(或扫二维码);
71
- 3. **手机访问**:确保手机与电脑连接**同一个 Wi-Fi**,用手机浏览器打开该地址;
72
- 4. **开始远程操控**:手机上即可看到与电脑端完全一致的界面并直接操控。右上角 `☰` 可随时打开会话列表抽屉,状态圆点可查看连接状态。
171
+ 1. 在 `~/.dsh/profiles/web` 里通过 pnpm 安装本包(首次使用会自动初始化该 profile);
172
+ 2. 检测到包的 `dsh.bundle` 声明,自动把包名写进 profile 的 `dsh.profile.bundles` 层列表;
173
+ 3. 重启后,DSH 启动时会自动读取包内的 `cordis.patch.yml`,把插件行挂进应用树——**不需要**手动编辑任何配置文件。
73
174
 
74
- > 提示:手机访问地址形如 `http://192.168.x.x:3080`。若页面提示「未开启」,请确认 dsh-desktop 的「移动端远程控制」开关已打开并重启了服务。
175
+ 其它 profile 同理,把 `web` 换成你的 profile 名即可(如 `dsh plugin --profile headless add ...`)。
75
176
 
76
- ## API 参考
177
+ > 想用本地 tarball 测试:`dsh plugin --profile web add C:\path\to\feiyang666-dsh-mobile-remote-1.4.1.tgz`
77
178
 
78
- `POST /api/dsh-mobile-remote`,请求体为 JSON:`{ "action": "status" | "ping" }`。
179
+ ### 2. 重启并验证
79
180
 
80
- ### status
181
+ 重启 DeepSeek Harness 的 web 应用(命令行:结束旧进程后重新运行 `dsh web`;桌面应用:完全退出后重新打开)。然后:
81
182
 
82
- | 字段 | 类型 | 说明 |
83
- |---|---|---|
84
- | `enabled` | boolean | 远程控制是否生效(服务监听非回环地址) |
85
- | `host` | string | 实际监听地址(如 `0.0.0.0`) |
86
- | `port` | number | 实际监听端口(如 `3080`) |
87
- | `lanAddresses` | string[] | 本机局域网 IPv4 地址列表 |
88
- | `urls` | string[] | 手机可访问 URL 列表(`http://<ip>:<port>`) |
89
- | `sessionCount` | number | 当前会话数 |
90
- | `serverTime` / `serverTimeIso` | number / string | 服务器时间(心跳/对时用) |
91
- | `pid` / `workspace` | number / string | 进程 PID 与工作目录 |
183
+ - 刷新 http://127.0.0.1:3080 → 设置 → 应出现 **「远程控制」** 面板。
92
184
 
93
- ### ping
185
+ ---
94
186
 
95
- 返回 `{ ok: true, serverTime, serverTimeIso }`,用于连接链路探测。
187
+ ## 卸载
188
+
189
+ ```bash
190
+ dsh plugin --profile web remove @feiyang666/dsh-mobile-remote
191
+ ```
192
+
193
+ 然后重启应用即可。
194
+
195
+ ---
96
196
 
97
197
  ## 常见问题
98
198
 
99
- **Q:手机打不开电脑地址?**
199
+ | 现象 | 原因 / 处理 |
200
+ | --- | --- |
201
+ | 设置里没有「远程控制」面板 | 插件未激活。确认 `cordis.patch.yml` 里的行存在且 `name` 正确;重启后刷新(清缓存) |
202
+ | 开启开关后手机还是连不上 | 确认手机与电脑同一 Wi-Fi;确认防火墙放行 3080 端口;确认访问的是局域网 IP 而非 `127.0.0.1` |
203
+ | 手机能访问但显示 403 | dsh 的信任围栏:请确认本插件已安装、且以官方支持的方式启动(`--patch` / profile patch 覆盖 `webserver.host`) |
204
+ | 设备数为 0 | 手机端页面需打开过才会心跳上报;等待几秒刷新 |
205
+ | 二维码扫不出来 | 确认「远程控制」已开启;相机应用需支持扫码 |
206
+ | 外网访问被全屏密码页拦住 | 这是**远程访问密码门禁**(v1.2.0+)。管理员在本机「设置 → 远程控制 → 远程访问密码」输入正确密码即可进入;忘记密码需在本机重新设置 |
207
+ | 远程访问仍转圈很慢 | 确认中转服务器 frps 已应用 `transport.maxPoolCount = 64`(`deploy/frps.toml`),并重启 frps;重新开启一次外网访问以重建隧道(`DSH_FRPC_POOL_COUNT` 默认 20) |
208
+ | 面板红色提示「外网隧道鉴权失败」 | frpc 的 `auth.token` 与 frps 服务端不一致。请将中转 `.env` 的 `FRP_TOKEN` 与 `/www/server/frps/frps.toml` 的 `auth.token` 改成完全相同,重启 frps 与中转服务后,关闭再重新开启外网访问 |
209
+ | 外网隧道一直「连接中」不见好 | frpc 在断线后自动重连;点面板上的「查看 frpc 日志」看真实原因(服务器宕机 / 端口被墙 / token 不匹配) |
210
+ | 黄色警告条提示「FRP_TOKEN 仍是占位符」 | 中转 `.env` 的 `FRP_TOKEN` 还是占位符,必须改成与 frps.toml 一致的真实值,否则隧道永远起不来(502) |
100
211
 
101
- A:确认 ① 手机与电脑在同一个 Wi-Fi/网段;② dsh-desktop「移动端远程控制」已开启并**重启过服务**;③ 电脑防火墙放行了 dsh 监听端口。
212
+ ---
213
+
214
+ ## 相关项目
215
+
216
+ | 项目 | 说明 | 安装方式 |
217
+ | --- | --- | --- |
218
+ | [DeepSeek Harness 桌面版](https://github.com/feiyang-dev/DeepSeek-Harness-Desktop) | Windows 桌面控制台:一键安装/启动/停止/重启 dsh web 服务,内置插件管理,**推荐插件区一键安装本插件** | 下载桌面版,点几下即可 |
219
+ | [用量与消耗插件(dsh-usage-plugin)](https://github.com/feiyang-dev/dsh-usage-plugin) | 记录每次模型调用的 token 用量与消耗,支持峰谷计费、余额查询、日历热力图与 CSV / JSON / PNG 导出 | 桌面端一键安装,或 `dsh plugin add @feiyang666/dsh-usage-plugin` |
220
+ | [数据保险箱(dsh-vault)](https://github.com/feiyang-dev/dsh-vault) | 自动备份 / 清空检测 / 一键恢复,保护聊天记录与工作区数据 | 桌面端一键安装,或 `dsh plugin add @feiyang666/dsh-vault` |
221
+ | [DeepSeek-Harness](https://github.com/deepseek-ai/DeepSeek-Harness) | 官方 CLI / Web 服务 | 见下方「运行 DeepSeek Harness」 |
102
222
 
103
- **Q:本插件是否需要手机端单独安装 App?**
223
+ ### 运行 DeepSeek Harness
104
224
 
105
- A:不需要。手机浏览器即可,无需任何安装。
225
+ **快速安装(通过 npm)**
106
226
 
107
- **Q:在电脑上开启远程控制是否影响桌面端使用?**
227
+ 安装 Node.js,然后运行:
108
228
 
109
- A:不影响。dsh-desktop 自身的健康检查、主窗口、日志仍走 `127.0.0.1`,仅新增局域网监听能力。
229
+ ```bash
230
+ npx @deepseek-ai/dsh web
231
+ ```
110
232
 
111
- **Q:手机上的数据与电脑端一致吗?**
233
+ 该命令会启动 Web UI,默认地址为 http://127.0.0.1:3080。详见 [Web UI 指南](https://github.com/deepseek-ai/DeepSeek-Harness)。
112
234
 
113
- A:完全一致且实时。手机与电脑访问同一个服务、同一份会话数据,不经过任何中间同步层。
235
+ **从源码运行**
236
+
237
+ 如需从仓库源码运行:
238
+
239
+ ```bash
240
+ git clone https://github.com/deepseek-ai/deepseek-harness.git
241
+ cd deepseek-harness
242
+ pnpm install
243
+ pnpm run build
244
+ pnpm dsh web
245
+ ```
114
246
 
115
- ## 许可证
247
+ ## 许可
116
248
 
117
- [MIT](./LICENSE)
249
+ MIT © dsh-mobile-remote
@@ -0,0 +1,52 @@
1
+ # dsh-mobile-remote v1.4.1
2
+
3
+ **DeepSeek Harness 移动端远程控制插件** —— 在 Web UI 设置页内置「远程控制」:连接二维码、一键开关、在线设备数,让手机通过局域网访问并操控电脑上的 DeepSeek Harness。本版聚焦**外网隧道真实状态诊断**:不再"假在线",token 鉴权失败 / 断线重连一目了然。
4
+
5
+ ## 安装方式
6
+
7
+ ```bash
8
+ dsh plugin --profile web add @feiyang666/dsh-mobile-remote
9
+ ```
10
+
11
+ 安装完成后**重启 dsh web 服务**,打开 `http://127.0.0.1:3080` → **设置 → 远程控制** 即可使用。
12
+
13
+ ## 本版更新(v1.4.1)
14
+
15
+ ### 🚦 外网隧道真实状态判定(核心)
16
+
17
+ 之前插件把「frpc 进程存活」误判为「隧道在线」——frpc 即使登录被拒、隧道从未建立,面板也显示绿色「在线」(打开链接却是 502)。本版彻底修复:
18
+
19
+ - **启动探测**:开启外网时读 frpc 日志,确认 `start proxy success` 隧道真正建立才算 `online`;
20
+ - **轮询复查**:`/status` 每 5s 复查日志——断线降级「连接中」(自动重连中)、token 不匹配降级「出错」,重连成功后自动恢复;
21
+ - **明确报错**:前端红色「出错」徽标 + 错误卡直接展示 frpc 真实原因(如 `token in login doesn't match token from configuration`),并附解决指引;
22
+ - **一键重试**:出错状态点开关即可 kill 旧进程重新绑定。
23
+
24
+ ### 🔁 隧道持续心跳保活
25
+
26
+ - 隧道在线期间每 60s 向中转端上报心跳,`last_seen` 保持新鲜;
27
+ - 停止隧道时主动上报 `offline`,配合后端在线判定让管理端 / 面板实时反映真实状态。
28
+
29
+ ### ⚠️ FRP_TOKEN 占位符检测
30
+
31
+ - 中转端新增 `frpTokenWarning` 字段;插件面板检测到服务器 `.env` 的 `FRP_TOKEN` 仍是占位符时,显示黄色警告条并说明会导致隧道 502。
32
+
33
+ ### 🗂 DSH 状态卡默认折叠
34
+
35
+ - 折叠态只显示摘要行(会话 / 工作区 / 插件 / 模型数),点击标题展开详情,节省面板空间。
36
+
37
+ ### 🐛 修复
38
+
39
+ - 修复设置页空白崩溃(`status` 首次渲染为 `null` 时的守卫缺失)。
40
+
41
+ ## 后端配套(dsh-update-server)
42
+
43
+ 外网隧道详情、真实在线判定依赖中转端新接口(`/api/tunnel/stats`、`/heartbeat` 离线支持、成员端在线判定)。**旧后端不影响插件使用**:插件自动回退到 `/status` 接口。若要展示流量 / 连接数等丰富信息,请同步升级中转端(见 `dsh-update-server` 的 `DEPLOY_CHECKLIST.md`)。
44
+
45
+ ## 已知事项
46
+
47
+ - 开启后服务暴露到公网,**请务必设置远程访问密码**,并仅在可信网络上使用
48
+ - 外网隧道需确保服务器 `.env` 的 `FRP_TOKEN` 与 `/www/server/frps/frps.toml` 的 `auth.token` 完全一致,否则面板会明确提示鉴权失败
49
+
50
+ ## 变更日志
51
+
52
+ 详见 [CHANGELOG.md](./CHANGELOG.md)。
package/cordis.patch.yml CHANGED
@@ -1,19 +1,15 @@
1
- # dsh-mobile-remote bundle patch: 手机端远程控制插件。
2
- # 在 dsh-base / dsh-web-app 基础层之后挂载。
1
+ # dsh-mobile-remote 插件 bundle 补丁层。
2
+ # 通过 `dsh plugin --profile web add dsh-mobile-remote`(或桌面端「插件管理 → 自定义安装」)
3
+ # 安装后,本文件会在 dsh web 启动时被挂载,把下面的插件行插入到宿主组合中。
3
4
  #
4
- # `inject` 列表为必需项:让 Cordis loader 等待 webServer / tools /
5
- # sessionPersistence 服务就绪后再激活插件。否则 apply 可能早于服务
6
- # 创建就运行,/api/dsh-mobile-remote 路由注册不上,设置页会报 not found。
7
- #
8
- # Host 半提供 /api/dsh-mobile-remote JSON API(状态 / 心跳)与
9
- # mobile_remote_status 模型工具;浏览器半通过 exports["./client"] 与
10
- # package.json 的 dsh.client 声明被 dsh-client-modules 自动发现,注入
11
- # 「远程控制」设置页与移动端浮动控制条。
12
-
5
+ # 插件是 host + client 双面插件:
6
+ # - host 侧(lib/index.js,inject [webServer]):
7
+ # * 通过 ctx.webServer.tapIndex 注入移动端响应式 CSS / JS;
8
+ # * 通过 ctx.webServer.register 提供 /__dsh_remote/* API
9
+ # (status / toggle / heartbeat / qr),支持设置页远程控制开关、二维码、设备数。
10
+ # - client 侧(lib/client.js,package.json 的 dsh.client 声明):
11
+ # * 由 dsh-client-modules 扫描加载,注册「设置 → 远程控制」section。
13
12
  - insert:
14
13
  - id: dsh-mobile-remote
15
- name: '@feiyang666/dsh-mobile-remote'
16
- inject:
17
- - webServer
18
- - tools
19
- - sessionPersistence
14
+ name: 'dsh-mobile-remote'
15
+ inject: [webServer]