dsh-mobile 0.4.6 → 0.5.0
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/CHANGELOG.md +22 -0
- package/CONTRIBUTORS.md +10 -1
- package/README.en.md +25 -8
- package/README.md +25 -8
- package/SECURITY.md +1 -1
- package/lib/client.js +326 -13
- package/lib/client.js.map +1 -1
- package/lib/index.d.mts +8 -3
- package/lib/index.mjs +293 -75
- package/lib/index.mjs.map +1 -1
- package/lib/mobile-compat.js.map +1 -1
- package/lib/mobile-layout.js +123 -21
- package/lib/mobile-layout.js.map +1 -1
- package/package.json +13 -13
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
Notable changes to DSH Mobile are recorded here. GitHub Releases remain the source for downloadable packages and complete generated commit notes.
|
|
4
4
|
|
|
5
|
+
## 0.5.0 - 2026-09-26
|
|
6
|
+
|
|
7
|
+
- Recognize the official DSH Desktop `dsh-app://app` page as a Mobile administration surface, while requiring its signed DSH browser session for forwarded management requests (thanks @Sanksu for [PR #118](https://github.com/saya-ch/dsh-mobile/pull/118) and @up-and-down-0618 for [#115](https://github.com/saya-ch/dsh-mobile/issues/115)).
|
|
8
|
+
- Send paired-page file uploads through the authenticated Mobile transport so PDF and other binary attachments reach DSH without bypassing the gateway's CSRF checks (thanks @ayiejosh for [PR #116](https://github.com/saya-ch/dsh-mobile/pull/116)).
|
|
9
|
+
- Allow the paired page to request microphone access for DSH voice input. App 0.5.0 asks for Android microphone permission on first use and grants audio-only capture to the paired HTTPS Origin (thanks @ayiejosh for [PR #119](https://github.com/saya-ch/dsh-mobile/pull/119)).
|
|
10
|
+
- Let narrow phone headers reveal hidden controls by horizontal drag or keyboard focus while keeping menus accessible; remove the redundant header arrow (thanks @ayiejosh for [PR #117](https://github.com/saya-ch/dsh-mobile/pull/117)).
|
|
11
|
+
- Keep composer statistics readable beside the context ring on narrow screens instead of clipping the values (thanks @ayiejosh for [PR #120](https://github.com/saya-ch/dsh-mobile/pull/120)).
|
|
12
|
+
- On touch devices, switching sessions no longer opens the soft keyboard automatically; tapping the composer still opens it normally.
|
|
13
|
+
- Explain cpolar download, extraction and private-storage failures more clearly and preserve the previous component if replacement fails ([#114](https://github.com/saya-ch/dsh-mobile/issues/114)). Diagnostics also flag an active, competing third-party remote pairing channel without modifying its traffic ([#111](https://github.com/saya-ch/dsh-mobile/issues/111)).
|
|
14
|
+
|
|
15
|
+
## 0.4.7 - 2026-09-25
|
|
16
|
+
|
|
17
|
+
- Expose `panelInfo` on the mobile layout service for DSH `0.1.7-rc.2`, so built-in panels such as Plugin Manager can mount without breaking the dedicated mobile frontend (thanks @chintoleung for [PR #104](https://github.com/saya-ch/dsh-mobile/pull/104) and [#103](https://github.com/saya-ch/dsh-mobile/issues/103)).
|
|
18
|
+
- Derive mobile boot batches in a canonical entry order. The same module set now produces stable batch URLs, response bodies and ETags when upstream entry order changes, avoiding unnecessary new cache entries (thanks @xhwxt for [PR #105](https://github.com/saya-ch/dsh-mobile/pull/105)).
|
|
19
|
+
- Remove the original application-batch preload when the dedicated mobile page replaces that batch, preventing a duplicate multi-megabyte transfer. On WebView 151+, raise this app's HTTP cache quota to at least 64 MiB so large versioned scripts can be reused after a cold start; older WebViews retain their default policy (thanks @xhwxt for [#107](https://github.com/saya-ch/dsh-mobile/issues/107)).
|
|
20
|
+
- Extend source-contract and isolated browser-startup checks to DSH `0.1.7-rc.2`, alongside `0.1.7-alpha.2` and `0.1.7-rc.1`.
|
|
21
|
+
- Add opt-in `excludedClientModules` for mobile-only boot slimming. Exact package ids are checked against the live graph; boot-critical entries and modules still required by retained entries are refused. The default graph, desktop page, and stock frontend remain unchanged (thanks @xhwxt for [#108](https://github.com/saya-ch/dsh-mobile/issues/108)).
|
|
22
|
+
- Let the right sidebar fill the phone viewport instead of clipping file and plugin panels behind a narrow overlay edge; keep the wide-screen column layout and a reachable collapse control.
|
|
23
|
+
- Keep the on-screen keyboard closed when opening the composer Add menu, without affecting other listbox controls (thanks @ayiejosh for [PR #109](https://github.com/saya-ch/dsh-mobile/pull/109)).
|
|
24
|
+
- In the Android App, use plain Enter to add a draft line when the on-screen keyboard is visible and no hardware keyboard is attached; retain DSH's original Enter behavior for browsers, unknown keyboard state, menus and IME composition (thanks @ayiejosh for [PR #110](https://github.com/saya-ch/dsh-mobile/pull/110)).
|
|
25
|
+
- Clear the Android page-load timer when WebView reports the same root document with a normalized URL, preventing a completed load from becoming a delayed false timeout. After native session renewal, keep a live DSH WebView instead of rebuilding it; reload only when the document is unavailable, and bound repeated renderer-crash recovery.
|
|
26
|
+
|
|
5
27
|
## 0.4.6 - 2026-09-24
|
|
6
28
|
|
|
7
29
|
- Use the configured HTTP proxy as a second, bounded remote-health probe only when the direct probe fails. The diagnostic respects `NO_PROXY`, reports proxy-only reachability as a warning rather than proof that a phone can connect, and retains the direct result if both routes fail (thanks @abworks-dev for [PR #99](https://github.com/saya-ch/dsh-mobile/pull/99)).
|
package/CONTRIBUTORS.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
GitHub 的 [Contributors 图表](https://github.com/saya-ch/dsh-mobile/graphs/contributors) 按进入默认分支的提交自动统计,无法手动加入仅提交 issue 或 PR 提案的成员。本页按实际参与方式感谢社区成员;仓库维护者与自动依赖更新仍可在 GitHub 历史记录中查看。
|
|
4
4
|
|
|
5
|
-
GitHub's Contributors graph counts commits on the default branch; issue reports and PR proposals cannot be manually added to it. This page credits community members by how they contributed, through 2026-09-
|
|
5
|
+
GitHub's Contributors graph counts commits on the default branch; issue reports and PR proposals cannot be manually added to it. This page credits community members by how they contributed, through 2026-09-26. The repository maintainer and automated dependency updates remain visible in GitHub's history.
|
|
6
6
|
|
|
7
7
|
## 已发布版本中的合并 PR / Merged PRs in released versions
|
|
8
8
|
|
|
@@ -10,12 +10,16 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
10
10
|
| --- | --- |
|
|
11
11
|
| [@1624318455](https://github.com/1624318455) | [#93](https://github.com/saya-ch/dsh-mobile/pull/93) |
|
|
12
12
|
| [@abworks-dev](https://github.com/abworks-dev) | [#91](https://github.com/saya-ch/dsh-mobile/pull/91), [#98](https://github.com/saya-ch/dsh-mobile/pull/98), [#99](https://github.com/saya-ch/dsh-mobile/pull/99) |
|
|
13
|
+
| [@ayiejosh](https://github.com/ayiejosh) | [#109](https://github.com/saya-ch/dsh-mobile/pull/109), [#110](https://github.com/saya-ch/dsh-mobile/pull/110), [#116](https://github.com/saya-ch/dsh-mobile/pull/116), [#117](https://github.com/saya-ch/dsh-mobile/pull/117), [#119](https://github.com/saya-ch/dsh-mobile/pull/119) |
|
|
14
|
+
| [@chintoleung](https://github.com/chintoleung) | [#104](https://github.com/saya-ch/dsh-mobile/pull/104) |
|
|
13
15
|
| [@idoall](https://github.com/idoall) | [#61](https://github.com/saya-ch/dsh-mobile/pull/61), [#66](https://github.com/saya-ch/dsh-mobile/pull/66), [#67](https://github.com/saya-ch/dsh-mobile/pull/67), [#77](https://github.com/saya-ch/dsh-mobile/pull/77) |
|
|
14
16
|
| [@JackRushante](https://github.com/JackRushante) | [#16](https://github.com/saya-ch/dsh-mobile/pull/16) |
|
|
15
17
|
| [@liudasheng](https://github.com/liudasheng) | [#100](https://github.com/saya-ch/dsh-mobile/pull/100) |
|
|
16
18
|
| [@longisland-icetea](https://github.com/longisland-icetea) | [#59](https://github.com/saya-ch/dsh-mobile/pull/59), [#60](https://github.com/saya-ch/dsh-mobile/pull/60), [#63](https://github.com/saya-ch/dsh-mobile/pull/63) |
|
|
17
19
|
| [@qzyqmzn](https://github.com/qzyqmzn) | [#38](https://github.com/saya-ch/dsh-mobile/pull/38), [#75](https://github.com/saya-ch/dsh-mobile/pull/75) |
|
|
20
|
+
| [@Sanksu](https://github.com/Sanksu) | [#118](https://github.com/saya-ch/dsh-mobile/pull/118) |
|
|
18
21
|
| [@StrawberryAO](https://github.com/StrawberryAO) | [#34](https://github.com/saya-ch/dsh-mobile/pull/34), [#40](https://github.com/saya-ch/dsh-mobile/pull/40) |
|
|
22
|
+
| [@xhwxt](https://github.com/xhwxt) | [#105](https://github.com/saya-ch/dsh-mobile/pull/105) |
|
|
19
23
|
| [@xingleiwu](https://github.com/xingleiwu) | [#79](https://github.com/saya-ch/dsh-mobile/pull/79), [#84](https://github.com/saya-ch/dsh-mobile/pull/84), [#85](https://github.com/saya-ch/dsh-mobile/pull/85), [#86](https://github.com/saya-ch/dsh-mobile/pull/86) |
|
|
20
24
|
|
|
21
25
|
## 已吸收但未直接合并的 PR / Incorporated without a direct merge
|
|
@@ -36,7 +40,9 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
36
40
|
| [@azri57806-design](https://github.com/azri57806-design) | [#97](https://github.com/saya-ch/dsh-mobile/issues/97) |
|
|
37
41
|
| [@CESAEREE](https://github.com/CESAEREE) | [#1](https://github.com/saya-ch/dsh-mobile/issues/1) |
|
|
38
42
|
| [@CharlesLueng](https://github.com/CharlesLueng) | [#68](https://github.com/saya-ch/dsh-mobile/issues/68) |
|
|
43
|
+
| [@chintoleung](https://github.com/chintoleung) | [#103](https://github.com/saya-ch/dsh-mobile/issues/103) |
|
|
39
44
|
| [@chmzs](https://github.com/chmzs) | [#73](https://github.com/saya-ch/dsh-mobile/issues/73) |
|
|
45
|
+
| [@hairyf](https://github.com/hairyf) | [#114](https://github.com/saya-ch/dsh-mobile/issues/114) |
|
|
40
46
|
| [@idoall](https://github.com/idoall) | [#42](https://github.com/saya-ch/dsh-mobile/issues/42), [#45](https://github.com/saya-ch/dsh-mobile/issues/45), [#46](https://github.com/saya-ch/dsh-mobile/issues/46), [#47](https://github.com/saya-ch/dsh-mobile/issues/47), [#62](https://github.com/saya-ch/dsh-mobile/issues/62), [#64](https://github.com/saya-ch/dsh-mobile/issues/64) |
|
|
41
47
|
| [@IvyC-zz](https://github.com/IvyC-zz) | [#58](https://github.com/saya-ch/dsh-mobile/issues/58), [#78](https://github.com/saya-ch/dsh-mobile/issues/78) |
|
|
42
48
|
| [@jillkayat](https://github.com/jillkayat) | [#10](https://github.com/saya-ch/dsh-mobile/issues/10) |
|
|
@@ -44,6 +50,7 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
44
50
|
| [@KMGTPEZY](https://github.com/KMGTPEZY) | [#95](https://github.com/saya-ch/dsh-mobile/issues/95) |
|
|
45
51
|
| [@LWping](https://github.com/LWping) | [#94](https://github.com/saya-ch/dsh-mobile/issues/94) |
|
|
46
52
|
| [@oliverwan97](https://github.com/oliverwan97) | [#26](https://github.com/saya-ch/dsh-mobile/issues/26) |
|
|
53
|
+
| [@optttt](https://github.com/optttt) | [#111](https://github.com/saya-ch/dsh-mobile/issues/111) |
|
|
47
54
|
| [@rgshendong](https://github.com/rgshendong) | [#87](https://github.com/saya-ch/dsh-mobile/issues/87) |
|
|
48
55
|
| [@RonaldinhoL](https://github.com/RonaldinhoL) | [#89](https://github.com/saya-ch/dsh-mobile/issues/89) |
|
|
49
56
|
| [@shengyvself](https://github.com/shengyvself) | [#13](https://github.com/saya-ch/dsh-mobile/issues/13), [#14](https://github.com/saya-ch/dsh-mobile/issues/14) |
|
|
@@ -51,7 +58,9 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
51
58
|
| [@sortjiajun](https://github.com/sortjiajun) | [#90](https://github.com/saya-ch/dsh-mobile/issues/90) |
|
|
52
59
|
| [@StrawberryAO](https://github.com/StrawberryAO) | [#39](https://github.com/saya-ch/dsh-mobile/issues/39) |
|
|
53
60
|
| [@Surpass567](https://github.com/Surpass567) | [#80](https://github.com/saya-ch/dsh-mobile/issues/80), [#81](https://github.com/saya-ch/dsh-mobile/issues/81) |
|
|
61
|
+
| [@up-and-down-0618](https://github.com/up-and-down-0618) | [#115](https://github.com/saya-ch/dsh-mobile/issues/115) |
|
|
54
62
|
| [@taki-ohh](https://github.com/taki-ohh) | [#19](https://github.com/saya-ch/dsh-mobile/issues/19) |
|
|
55
63
|
| [@Xingcheng-wang](https://github.com/Xingcheng-wang) | [#76](https://github.com/saya-ch/dsh-mobile/issues/76) |
|
|
64
|
+
| [@xhwxt](https://github.com/xhwxt) | [#107](https://github.com/saya-ch/dsh-mobile/issues/107), [#108](https://github.com/saya-ch/dsh-mobile/issues/108) |
|
|
56
65
|
| [@Yurzi](https://github.com/Yurzi) | [#17](https://github.com/saya-ch/dsh-mobile/issues/17) |
|
|
57
66
|
| [@Ztyss](https://github.com/Ztyss) | [#22](https://github.com/saya-ch/dsh-mobile/issues/22), [#23](https://github.com/saya-ch/dsh-mobile/issues/23) |
|
package/README.en.md
CHANGED
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
|
|
32
32
|
> DSH Mobile is a DeepSeek Harness community plugin; the native app supports Android only.
|
|
33
33
|
>
|
|
34
|
-
> **Current version: 0.
|
|
34
|
+
> **Current version: 0.5.0**. It supports the official DSH Desktop, paired-page file uploads and microphone permissions for voice input, with improved narrow-screen controls and remote diagnostics. [Release notes](CHANGELOG.md#050---2026-09-26).
|
|
35
35
|
>
|
|
36
|
-
> **Upgrade reminder**: update both the plugin and Android app to 0.
|
|
36
|
+
> **Upgrade reminder**: update both the plugin and Android app to 0.5.0 when practical. Existing pairings remain intact. App microphone permission support requires 0.5.0; older apps keep their existing connection methods. [Compatibility notes](#compatibility).
|
|
37
37
|
|
|
38
38
|
<p align="center">
|
|
39
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.
|
|
40
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.
|
|
41
|
-
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.
|
|
39
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.5.0/dsh-mobile-android-v0.5.0.apk"><img src="assets/brand/app-icon-rounded.svg" alt="DSH Mobile Android app icon" width="72" height="72"></a><br>
|
|
40
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.5.0/dsh-mobile-android-v0.5.0.apk"><strong>Download Android app 0.5.0</strong></a><br>
|
|
41
|
+
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.5.0">Release notes and checksums</a></sub>
|
|
42
42
|
</p>
|
|
43
43
|
|
|
44
44
|
DSH Mobile is a DeepSeek Harness plugin that lets a mobile browser or the Android app connect over a protected LAN or an optional Tailscale Funnel, cpolar, cloudflared, self-hosted FRP, or own reverse-proxy remote path. Local and remote access keep the same sessions, Workspaces, messages, and tools while using separate switches and paired-device stores without modifying DeepSeek Harness source.
|
|
@@ -216,11 +216,23 @@ Compatibility and WebSocket rules:
|
|
|
216
216
|
|
|
217
217
|
Proxied pages allow HTTP frames for compatibility with some community plugins; those pages are unencrypted and can be altered, and browsers may still block them as mixed content. Use HTTPS for sensitive work. The same warning appears at the top of the remote panel when it is opened over HTTPS.
|
|
218
218
|
|
|
219
|
-
- Version 0.
|
|
219
|
+
- Version 0.5.0 continues contract and boot checks against DSH `0.1.7-alpha.2`, `0.1.7-rc.1`, and `0.1.7-rc.2`. Official DSH Desktop `0.1.7-rc.2` uses a `dsh-app://app/` page; the Mobile administration surface still requires Desktop's forwarded authenticated DSH session and does not loosen ordinary Web administration requests.
|
|
220
220
|
- The gateway allows first-party DSH WebSocket paths by default, including `/sidebar/ws/terminal`. Other paths used by community sidebar plugins are blocked by default and appear in Diagnostics; the `/sidebar/ws/agent-opens` and `/sidebar/ws/agent-terminals` paths in the image are examples that must be reviewed for the actual plugin.
|
|
221
221
|
- In **Connection diagnostics → Third-party WebSocket paths**, select **Allow** only for an exact path you have verified. Query strings and fuzzy prefixes are rejected; **Allow all** is not recommended. Approved paths can be removed at any time, and the same policy applies to LAN and remote connections.
|
|
222
222
|
- Approval only lets that path pass through the authenticated, same-origin DSH Mobile gateway. It does not open arbitrary TCP/UDP ports or bypass device pairing. If a community plugin still fails, check the path recorded by Diagnostics and approve one path at a time.
|
|
223
223
|
|
|
224
|
+
If another remote-access plugin shows its own “not paired” page inside DSH Mobile, the two authorization systems are separate. Temporarily turn off the other plugin's remote access on the computer to check whether the Mobile path recovers; do not enter a DSH Mobile pairing key on that page. Excluding its client module below does not necessarily remove a request-rewriting script injected before client boot. See [#111](https://github.com/saya-ch/dsh-mobile/issues/111).
|
|
225
|
+
|
|
226
|
+
Advanced users can reduce mobile startup traffic by adding exact package ids to `excludedClientModules` in the current profile's `mobile-access` plugin configuration, then restarting DSH. This changes only the dedicated mobile page served through the gateway; desktop and `?frontend=stock` pages are unaffected. If both packages are present in the current boot graph, this example removes document preview and its dependent “Open In…” feature:
|
|
227
|
+
|
|
228
|
+
```yaml
|
|
229
|
+
excludedClientModules:
|
|
230
|
+
- '@deepseek-ai/dsh-client-ui-sidebar-documentpreview'
|
|
231
|
+
- '@deepseek-ai/dsh-client-ui-open-in-app'
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
There is no default exclusion list. The plugin rejects unknown or boot-critical modules and modules still referenced through `inject` or `external` by retained entries. If a DSH or community-plugin update invalidates the selection, the mobile page returns `409 excluded_client_modules_invalid` with the conflicting module; the computer also warns so you can adjust or remove the option. Bundle sizes and dependencies change between DSH installations and versions; another user's savings are not a prediction for yours.
|
|
235
|
+
|
|
224
236
|
<table>
|
|
225
237
|
<tr>
|
|
226
238
|
<td align="center" valign="top" width="50%">
|
|
@@ -276,6 +288,7 @@ See [SECURITY.md](SECURITY.md).
|
|
|
276
288
|
|
|
277
289
|
## Troubleshooting
|
|
278
290
|
|
|
291
|
+
- **The phone shows another plugin’s pairing-code page**: `dsh-remote-web-ui` and DSH Mobile have separate remote channels and pairing codes; they cannot be mixed. If DSH Mobile diagnostics warn about a competing remote plugin, turn off that plugin’s remote access on the computer, refresh, and scan the current DSH Mobile QR code. Merely installing the other plugin without enabling its remote channel does not trigger this warning.
|
|
279
292
|
- **Development diagnostics say “reachable through the computer's proxy”**: the check tries a direct request first, then an HTTP proxy from the DSH process environment only if direct access fails; `NO_PROXY` may exclude the target. This proves only that the computer completed an HTTPS probe through the proxy, not that the phone or actual tunnel can connect. Test from the phone's mobile network. If both paths fail, diagnostics continue to report the endpoint unreachable instead of treating an offline route as ready.
|
|
280
293
|
- **Boot fails with `saved LAN interface "XXX" is not connected`**: the
|
|
281
294
|
computer switched networks (Wi-Fi/Ethernet/dock) and the previously saved
|
|
@@ -304,6 +317,8 @@ On macOS, local network, self-hosted FRP, and the own reverse proxy work; the th
|
|
|
304
317
|
|
|
305
318
|
| DSH Mobile plugin | Verified DeepSeek Harness version |
|
|
306
319
|
| --- | --- |
|
|
320
|
+
| `0.5.0` | `0.1.7-alpha.2`, `0.1.7-rc.1`, and `0.1.7-rc.2`; official Desktop `0.1.7-rc.2` (administration surface) |
|
|
321
|
+
| `0.4.7` | `0.1.7-alpha.2`, `0.1.7-rc.1`, and `0.1.7-rc.2` (source contract, isolated pairing, and workspace baseline over WebSocket) |
|
|
307
322
|
| `0.4.6` | `0.1.7-alpha.2` and `0.1.7-rc.1` (source contract, isolated pairing, and workspace baseline over WebSocket) |
|
|
308
323
|
| `0.4.5` | `0.1.7-alpha.2` (source contract check, local and remote gateway integration) |
|
|
309
324
|
| `0.4.4` | `0.1.6-alpha.2` (local source and renderer-v2 contract check) |
|
|
@@ -320,6 +335,8 @@ On macOS, local network, self-hosted FRP, and the own reverse proxy work; the th
|
|
|
320
335
|
|
|
321
336
|
Existing apps (0.3.3 and later) do not need re-pairing. cpolar users should use app 0.3.15 or later because earlier apps may time out before a slow first load over the free route finishes; earlier apps also use a different status-bar strategy. The 0.4.0 app adds the multi-device list, startup behavior, and computer-side revocation status; older apps continue to connect to their saved single device. App 0.1.3 or earlier requires reinstalling and pairing again.
|
|
322
337
|
|
|
338
|
+
GitHub Release APKs use a stable signing certificate, so an older official APK with the same signer can be upgraded in place while retaining pairings. A locally built Debug APK with a different signer cannot be overwritten by the official APK; plan to pair again when switching between them.
|
|
339
|
+
|
|
323
340
|
## Uninstall
|
|
324
341
|
|
|
325
342
|
```powershell
|
|
@@ -346,11 +363,11 @@ npm ci
|
|
|
346
363
|
npm run verify
|
|
347
364
|
```
|
|
348
365
|
|
|
349
|
-
The real browser-startup smoke uses a temporary DSH home, OS-assigned loopback ports, and Chromium pairing. It neither reads an existing user profile nor sends a model request. CI tests
|
|
366
|
+
The real browser-startup smoke uses a temporary DSH home, OS-assigned loopback ports, and Chromium pairing. It neither reads an existing user profile nor sends a model request. CI tests DSH `0.1.7-alpha.2`, `0.1.7-rc.1`, and `0.1.7-rc.2`; install rc.2 in a separate directory locally so it does not replace the plugin's development dependencies:
|
|
350
367
|
|
|
351
368
|
```powershell
|
|
352
369
|
$dshMobileTestRuntime = Join-Path $env:TEMP 'dsh-mobile-test-runtime'
|
|
353
|
-
npm install --prefix $dshMobileTestRuntime --no-save --package-lock=false @deepseek-ai/dsh@0.1.7-rc.
|
|
370
|
+
npm install --prefix $dshMobileTestRuntime --no-save --package-lock=false @deepseek-ai/dsh@0.1.7-rc.2
|
|
354
371
|
$env:DSH_BOOT_SMOKE_BIN = Join-Path $dshMobileTestRuntime 'node_modules/@deepseek-ai/dsh/lib/bin.js'
|
|
355
372
|
npx playwright install chromium --only-shell
|
|
356
373
|
npm run smoke:dsh-boot
|
package/README.md
CHANGED
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
|
|
32
32
|
> DSH Mobile 是 DeepSeek Harness 社区插件,原生 App 仅支持 Android。
|
|
33
33
|
>
|
|
34
|
-
> **当前版本:0.
|
|
34
|
+
> **当前版本:0.5.0**。适配 DSH 官方桌面端,支持移动端文件上传与语音输入权限,并优化窄屏操作和远程故障提示。[更新记录](CHANGELOG.md#050---2026-09-26)。
|
|
35
35
|
>
|
|
36
|
-
> **升级提醒**:建议插件与 Android App 同步更新至 0.
|
|
36
|
+
> **升级提醒**:建议插件与 Android App 同步更新至 0.5.0,已有配对会保留。App 的麦克风权限适配需要 0.5.0;旧版 App 的既有连接方式不受影响。[兼容说明](#兼容性)。
|
|
37
37
|
|
|
38
38
|
<p align="center">
|
|
39
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.
|
|
40
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.
|
|
41
|
-
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.
|
|
39
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.5.0/dsh-mobile-android-v0.5.0.apk"><img src="assets/brand/app-icon-rounded.svg" alt="DSH Mobile 安卓应用图标" width="72" height="72"></a><br>
|
|
40
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.5.0/dsh-mobile-android-v0.5.0.apk"><strong>下载 Android App 0.5.0</strong></a><br>
|
|
41
|
+
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.5.0">版本说明与校验文件</a></sub>
|
|
42
42
|
</p>
|
|
43
43
|
|
|
44
44
|
DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App 通过局域网,或可选的 Tailscale Funnel、cpolar、cloudflared、自建 FRP 或自有反向代理远程通道连接电脑,继续使用同一份会话、工作区、消息和工具。局域网与远程访问分别启停、分别管理设备,且都不修改 DeepSeek Harness 源码。
|
|
@@ -216,11 +216,23 @@ Android App 用一个“已配对设备”列表同时显示多台电脑:局
|
|
|
216
216
|
|
|
217
217
|
代理页面为兼容部分社区插件允许嵌入 HTTP 页面;这类内容未加密,可能被篡改,浏览器也可能因混合内容策略拦截。处理敏感内容时请使用 HTTPS。通过 HTTPS 管理入口打开远程面板时,页面顶部会显示相同提醒。
|
|
218
218
|
|
|
219
|
-
- 0.
|
|
219
|
+
- 0.5.0 延续对 DSH `0.1.7-alpha.2`、`0.1.7-rc.1` 和 `0.1.7-rc.2` 的契约及启动检查。官方 DSH Desktop `0.1.7-rc.2` 使用 `dsh-app://app/` 页面;移动访问管理入口仍要求桌面端转发的已认证 DSH 会话,不放宽普通 Web 页面的管理请求。
|
|
220
220
|
- 网关默认只允许 DSH 内置的第一方 WebSocket 路径。社区侧边栏插件使用的其他路径默认拦截,通常会在诊断页显示为待处理项目;截图中的`/sidebar/ws/agent-opens` 和`/sidebar/ws/agent-terminals` 就属于这类需要按实际插件确认的路径。
|
|
221
221
|
- 在 **连接诊断 → 第三方 WebSocket 路径** 中,只对确认过的精确路径点击 **允许**。系统不接受带查询字符串或模糊前缀的路径;不建议使用“全部允许”。已允许的路径可以随时移除,局域网和远程连接使用同一套规则。
|
|
222
222
|
- 放行只代表该路径可以通过已认证、同源的 DSH Mobile 网关,不会开放任意 TCP/UDP 端口,也不会绕过设备配对。若社区插件仍然连接失败,先看诊断页的实际拦截路径,再按一条路径放行。
|
|
223
223
|
|
|
224
|
+
若另一个远程访问插件在 DSH Mobile 页面上显示自己的“未配对”提示,那是两套不同的授权。可先在电脑端暂时关闭另一插件的远程访问,确认 Mobile 链路是否恢复;不要把 DSH Mobile 密钥输入它的配对页。仅用下面的模块排除选项不能保证移除该插件在页面启动前注入的请求改写脚本,参见 [#111](https://github.com/saya-ch/dsh-mobile/issues/111)。
|
|
225
|
+
|
|
226
|
+
若某个不需要的客户端插件显著增加手机首次加载流量,高级用户可在当前 profile 的 `mobile-access` 插件配置中设置 `excludedClientModules`,填入启动清单中的**准确包名**,重启 DSH 后生效。它只改变经网关提供的专用移动页面;电脑端和 `?frontend=stock` 页面不变。例如,若当前启动清单同时包含以下两个包,下面的配置会移除文档预览及依赖它的“在应用中打开”功能:
|
|
227
|
+
|
|
228
|
+
```yaml
|
|
229
|
+
excludedClientModules:
|
|
230
|
+
- '@deepseek-ai/dsh-client-ui-sidebar-documentpreview'
|
|
231
|
+
- '@deepseek-ai/dsh-client-ui-open-in-app'
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
这是按安装环境选择的高级配置,没有默认排除列表。插件会拒绝不存在的包、启动必需模块,以及仍被保留模块通过 `inject` 或 `external` 引用的包;配置不匹配当前 DSH 或社区插件时,移动页面返回 `409 excluded_client_modules_invalid` 和冲突详情,电脑端也会提示,移除或调整配置即可恢复。模块内容与依赖会随 DSH 版本变化,不能把其他人的节省比例当作自己的预期。
|
|
235
|
+
|
|
224
236
|
<table>
|
|
225
237
|
<tr>
|
|
226
238
|
<td align="center" valign="top" width="50%">
|
|
@@ -278,6 +290,7 @@ flowchart LR
|
|
|
278
290
|
|
|
279
291
|
## 故障排查
|
|
280
292
|
|
|
293
|
+
- **手机出现另一插件的“输入配对码”页面**:`dsh-remote-web-ui` 与 DSH Mobile 各有独立的远程通道和配对码,不能交叉使用。若电脑端连接诊断提示“第三方远程插件”,先关闭该插件的远程访问并刷新,再扫描 DSH Mobile 当前二维码。仅安装该插件而未启用它的远程接管,不会触发这条诊断。
|
|
281
294
|
- **开发版远程诊断显示“电脑经代理可访问”**:诊断先直连,失败后才尝试 DSH 进程环境变量中的 HTTP 代理;`NO_PROXY` 可排除目标。此结果只说明电脑经代理完成 HTTPS 探测,不代表手机或实际隧道可用。请用手机流量实际连接;若直连和代理都失败,报告仍为不可达,不会把离线误报为就绪。
|
|
282
295
|
- **启动报 `saved LAN interface "XXX" is not connected` 且 DSH 起不来**:
|
|
283
296
|
电脑切换过网络(WiFi/有线/扩展坞),之前保存的网卡当前未连接。处理方式
|
|
@@ -304,6 +317,8 @@ macOS 上局域网、自建 FRP 与自有反向代理可用;三个托管组件
|
|
|
304
317
|
|
|
305
318
|
| DSH Mobile 插件 | 验证支持的 DeepSeek Harness 版本 |
|
|
306
319
|
| ----------------------------------------- | -------------------------------------------------------------- |
|
|
320
|
+
| `0.5.0` | `0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2`;官方 Desktop `0.1.7-rc.2`(桌面管理入口) |
|
|
321
|
+
| `0.4.7` | `0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2`(源码契约、隔离配对及 WebSocket 工作区读取) |
|
|
307
322
|
| `0.4.6` | `0.1.7-alpha.2`、`0.1.7-rc.1`(源码契约、隔离配对及 WebSocket 工作区读取) |
|
|
308
323
|
| `0.4.5` | `0.1.7-alpha.2`(源码契约检查、本机局域网及远程网关联调) |
|
|
309
324
|
| `0.4.4` | `0.1.6-alpha.2`(本机源码与 renderer-v2 契约检查) |
|
|
@@ -320,6 +335,8 @@ macOS 上局域网、自建 FRP 与自有反向代理可用;三个托管组件
|
|
|
320
335
|
|
|
321
336
|
现有 App(0.3.3 及更新)无需重新配对;cpolar 用户应使用 0.3.15 或更新 App,较早版本可能在免费线路的慢速首次加载完成前超时;更早的 App 还使用不同的状态栏策略。App 0.4.0 才支持多设备列表、启动行为设置和电脑端撤销状态同步;旧版 App 仍可连接已保存的单台设备。App 0.1.3 及更早版本需卸载重装并重新配对。
|
|
322
337
|
|
|
338
|
+
GitHub Release 的正式 APK 使用固定签名,可从同一签名的旧正式版原位升级并保留配对。自行构建的 Debug APK 若使用不同签名,不能直接覆盖安装正式版;切换前请准备重新配对。
|
|
339
|
+
|
|
323
340
|
## 卸载
|
|
324
341
|
|
|
325
342
|
```powershell
|
|
@@ -346,11 +363,11 @@ npm ci
|
|
|
346
363
|
npm run verify
|
|
347
364
|
```
|
|
348
365
|
|
|
349
|
-
真实启动冒烟另用临时 DSH Home、随机回环端口和 Chromium 配对,不访问现有用户配置,也不发送模型请求。CI 分别测试 DSH `0.1.7-alpha.2` 与 `0.1.7-rc.
|
|
366
|
+
真实启动冒烟另用临时 DSH Home、随机回环端口和 Chromium 配对,不访问现有用户配置,也不发送模型请求。CI 分别测试 DSH `0.1.7-alpha.2`、`0.1.7-rc.1` 与 `0.1.7-rc.2`;本机可把 rc.2 装在独立目录,避免替换插件的开发依赖:
|
|
350
367
|
|
|
351
368
|
```powershell
|
|
352
369
|
$dshMobileTestRuntime = Join-Path $env:TEMP 'dsh-mobile-test-runtime'
|
|
353
|
-
npm install --prefix $dshMobileTestRuntime --no-save --package-lock=false @deepseek-ai/dsh@0.1.7-rc.
|
|
370
|
+
npm install --prefix $dshMobileTestRuntime --no-save --package-lock=false @deepseek-ai/dsh@0.1.7-rc.2
|
|
354
371
|
$env:DSH_BOOT_SMOKE_BIN = Join-Path $dshMobileTestRuntime 'node_modules/@deepseek-ai/dsh/lib/bin.js'
|
|
355
372
|
npx playwright install chromium --only-shell
|
|
356
373
|
npm run smoke:dsh-boot
|
package/SECURITY.md
CHANGED
|
@@ -16,7 +16,7 @@ The maintainer will acknowledge a complete report within seven days. Publication
|
|
|
16
16
|
|
|
17
17
|
- Keep the ordinary DSH Web listener on loopback.
|
|
18
18
|
- Expose only the plugin-owned HTTPS listener to the LAN.
|
|
19
|
-
- The desktop admin API may accept an RFC1918 or IPv4 link-local Host only when the TCP peer is loopback, for a trusted local reverse proxy or headless host. Do not publicly forward `/api/mobile-access`; Host and loopback checks are not a replacement for proxy access control. Mutating admin requests
|
|
19
|
+
- The desktop admin API may accept an RFC1918 or IPv4 link-local Host only when the TCP peer is loopback, for a trusted local reverse proxy or headless host. Do not publicly forward `/api/mobile-access`; Host and loopback checks are not a replacement for proxy access control. Mutating admin requests require a same-origin `Origin` header, except official DSH Desktop requests: its forwarder strips `Origin` and `Sec-Fetch-Site` and supplies a signed Host browser-session Cookie, so the plugin client sends an exact non-simple marker that survives forwarding. The plugin requires both that marker and Connection's successful browser-session verification before accepting an Origin-less write.
|
|
20
20
|
- DNS-SD/mDNS, periodic UDP announcements, active UDP query replies, and HTTPS discovery return only the device name, public HTTPS origin, port, protocol version, and stable non-secret installation identifier. Discovery never returns the CA, a pairing key, a device token, Cookies, credentials, or private configuration.
|
|
21
21
|
- For LAN pairing, only after a user selects a device and enters the fingerprint-bound pairing key may Android fetch the public CA from that exact HTTPS origin. The bootstrap GET sends no key or credential. The app retains the CA in its encrypted credential record and never adds it to Android's system trust settings. Native requests use a private trust store; WebView accepts only the otherwise-untrusted leaf signed by that CA, for the exact origin and validity period. Every other TLS error is cancelled.
|
|
22
22
|
- Public remote origins provided by Funnel, cpolar, cloudflared, the FRP public-CA entry, or an operator-managed reverse proxy use platform-trusted HTTPS. Android stores no private CA for those credentials and cancels every TLS error. It sends a persisted device token only to the exact Origin that previously received it; a changed remote Origin requires a current one-time pairing token before the app replaces the saved credential. A QR-provided installation identifier alone never authorizes credential renewal. Browser clients likewise require a certificate trusted by their platform.
|