dsh-mobile 0.5.0 → 0.5.2
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 +16 -0
- package/CONTRIBUTORS.md +8 -4
- package/README.en.md +36 -31
- package/README.md +40 -34
- package/SECURITY.md +2 -0
- package/THIRD_PARTY_NOTICES.md +4 -4
- package/docs/ATTACH_EXISTING_FRPS.en.md +5 -1
- package/docs/ATTACH_EXISTING_FRPS.md +6 -0
- package/docs/CLOUDFLARE_TUNNEL.en.md +15 -20
- package/docs/CLOUDFLARE_TUNNEL.md +15 -20
- package/docs/DSH_0.1.5_LAN.md +1 -1
- package/docs/README.md +2 -2
- package/docs/SELF_HOSTED_FRP.en.md +10 -11
- package/docs/SELF_HOSTED_FRP.md +10 -11
- package/docs/SELF_HOSTED_ORIGIN.en.md +1 -1
- package/docs/SELF_HOSTED_ORIGIN.md +1 -1
- package/lib/client.js +265 -32
- package/lib/client.js.map +1 -1
- package/lib/index.d.mts +55 -3
- package/lib/index.mjs +166 -15
- package/lib/index.mjs.map +1 -1
- package/lib/mobile-layout.js +22 -5
- package/lib/mobile-layout.js.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
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.2 - 2026-09-29
|
|
6
|
+
|
|
7
|
+
- Give each DSH Mobile installation a stable FRP proxy name on a shared frps and report proxy-name or entry-port conflicts directly instead of waiting for a generic timeout (thanks @liudasheng for [PR #130](https://github.com/saya-ch/dsh-mobile/pull/130)). Keep that name through first-time setup and restarts, and use it in copied attach instructions.
|
|
8
|
+
- Keep the four DSH peer names for host-side module resolution, but remove their per-release version ranges so a newly published DSH prerelease is not rejected solely by plugin metadata. Source-contract and isolated browser-startup checks now include DSH `0.2.0-rc.2`.
|
|
9
|
+
- Synchronize Android App version metadata with the plugin; native behavior and the pairing protocol are unchanged from 0.5.1.
|
|
10
|
+
|
|
11
|
+
## 0.5.1 - 2026-09-29
|
|
12
|
+
|
|
13
|
+
- Restore the Android system Back key on devices that deliver the legacy Activity callback even on Android 13 and later. The DSH page still uses its WebView history when available and exits the app at the root.
|
|
14
|
+
- On the dedicated mobile page, route Android Back through visible extension pages, supported DSH dialogs and menus, the details panel, narrow-screen drawer, and selected main panel before WebView navigation or app exit. Unknown dialogs stay in place instead of exposing a lower layer.
|
|
15
|
+
- Keep Android soft-keyboard Enter as a draft newline when an active conversation temporarily lacks a mobile-layout session ID. Camera results still require a matching session and composer origin, and a late result is discarded after navigation (thanks @ayiejosh for [PR #124](https://github.com/saya-ch/dsh-mobile/pull/124)).
|
|
16
|
+
- Declare Android's normal `MODIFY_AUDIO_SETTINGS` permission for WebView communication audio setup (thanks @ayiejosh for [PR #125](https://github.com/saya-ch/dsh-mobile/pull/125)). Microphone capture still requires the user's `RECORD_AUDIO` approval; recognition also depends on the device WebView and speech service.
|
|
17
|
+
- Accept DSH `0.2.0-rc.1` in the plugin's peer ranges and browser-startup checks. The paired mobile page and Workspace baseline were verified against the released runtime while retaining the tested `0.1.7` series.
|
|
18
|
+
- Avoid creating disabled control files for remote providers that have never been enabled, removing unnecessary file-permission work on first configuration. Existing private files retain their previous ACL-before-use handling; this does not remove the `whoami.exe`/`icacls.exe` waits reported in [#128](https://github.com/saya-ch/dsh-mobile/issues/128).
|
|
19
|
+
- Guide `/mobile` to inspect the running DSH page and, when available, matching frontend source before changing built-in controls, and to disclose when the result could not be checked on a phone. Shorten its command-menu description and refine the bilingual setup and remote-access guides.
|
|
20
|
+
|
|
5
21
|
## 0.5.0 - 2026-09-26
|
|
6
22
|
|
|
7
23
|
- 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)).
|
package/CONTRIBUTORS.md
CHANGED
|
@@ -2,19 +2,19 @@
|
|
|
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-29. The repository maintainer and automated dependency updates remain visible in GitHub's history.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 已合并 PR / Merged PRs
|
|
8
8
|
|
|
9
9
|
| 社区成员 / Community member | 已合并 PR / Merged PRs |
|
|
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) |
|
|
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), [#124](https://github.com/saya-ch/dsh-mobile/pull/124), [#125](https://github.com/saya-ch/dsh-mobile/pull/125) |
|
|
14
14
|
| [@chintoleung](https://github.com/chintoleung) | [#104](https://github.com/saya-ch/dsh-mobile/pull/104) |
|
|
15
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) |
|
|
16
16
|
| [@JackRushante](https://github.com/JackRushante) | [#16](https://github.com/saya-ch/dsh-mobile/pull/16) |
|
|
17
|
-
| [@liudasheng](https://github.com/liudasheng) | [#100](https://github.com/saya-ch/dsh-mobile/pull/100) |
|
|
17
|
+
| [@liudasheng](https://github.com/liudasheng) | [#100](https://github.com/saya-ch/dsh-mobile/pull/100), [#130](https://github.com/saya-ch/dsh-mobile/pull/130) |
|
|
18
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) |
|
|
19
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
20
|
| [@Sanksu](https://github.com/Sanksu) | [#118](https://github.com/saya-ch/dsh-mobile/pull/118) |
|
|
@@ -38,10 +38,12 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
38
38
|
| --- | --- |
|
|
39
39
|
| [@1624318455](https://github.com/1624318455) | [#92](https://github.com/saya-ch/dsh-mobile/issues/92) |
|
|
40
40
|
| [@azri57806-design](https://github.com/azri57806-design) | [#97](https://github.com/saya-ch/dsh-mobile/issues/97) |
|
|
41
|
+
| [@BrainZombie](https://github.com/BrainZombie) | [#128](https://github.com/saya-ch/dsh-mobile/issues/128) |
|
|
41
42
|
| [@CESAEREE](https://github.com/CESAEREE) | [#1](https://github.com/saya-ch/dsh-mobile/issues/1) |
|
|
42
43
|
| [@CharlesLueng](https://github.com/CharlesLueng) | [#68](https://github.com/saya-ch/dsh-mobile/issues/68) |
|
|
43
44
|
| [@chintoleung](https://github.com/chintoleung) | [#103](https://github.com/saya-ch/dsh-mobile/issues/103) |
|
|
44
45
|
| [@chmzs](https://github.com/chmzs) | [#73](https://github.com/saya-ch/dsh-mobile/issues/73) |
|
|
46
|
+
| [@gjzbbs](https://github.com/gjzbbs) | [#123](https://github.com/saya-ch/dsh-mobile/issues/123) |
|
|
45
47
|
| [@hairyf](https://github.com/hairyf) | [#114](https://github.com/saya-ch/dsh-mobile/issues/114) |
|
|
46
48
|
| [@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) |
|
|
47
49
|
| [@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) |
|
|
@@ -51,6 +53,7 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
51
53
|
| [@LWping](https://github.com/LWping) | [#94](https://github.com/saya-ch/dsh-mobile/issues/94) |
|
|
52
54
|
| [@oliverwan97](https://github.com/oliverwan97) | [#26](https://github.com/saya-ch/dsh-mobile/issues/26) |
|
|
53
55
|
| [@optttt](https://github.com/optttt) | [#111](https://github.com/saya-ch/dsh-mobile/issues/111) |
|
|
56
|
+
| [@reducm](https://github.com/reducm) | [#127](https://github.com/saya-ch/dsh-mobile/issues/127) |
|
|
54
57
|
| [@rgshendong](https://github.com/rgshendong) | [#87](https://github.com/saya-ch/dsh-mobile/issues/87) |
|
|
55
58
|
| [@RonaldinhoL](https://github.com/RonaldinhoL) | [#89](https://github.com/saya-ch/dsh-mobile/issues/89) |
|
|
56
59
|
| [@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) |
|
|
@@ -60,6 +63,7 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
60
63
|
| [@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
64
|
| [@up-and-down-0618](https://github.com/up-and-down-0618) | [#115](https://github.com/saya-ch/dsh-mobile/issues/115) |
|
|
62
65
|
| [@taki-ohh](https://github.com/taki-ohh) | [#19](https://github.com/saya-ch/dsh-mobile/issues/19) |
|
|
66
|
+
| [@tianyimc](https://github.com/tianyimc) | [#126](https://github.com/saya-ch/dsh-mobile/issues/126) |
|
|
63
67
|
| [@Xingcheng-wang](https://github.com/Xingcheng-wang) | [#76](https://github.com/saya-ch/dsh-mobile/issues/76) |
|
|
64
68
|
| [@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) |
|
|
65
69
|
| [@Yurzi](https://github.com/Yurzi) | [#17](https://github.com/saya-ch/dsh-mobile/issues/17) |
|
package/README.en.md
CHANGED
|
@@ -31,17 +31,17 @@
|
|
|
31
31
|
|
|
32
32
|
> DSH Mobile is a DeepSeek Harness community plugin; the native app supports Android only.
|
|
33
33
|
>
|
|
34
|
-
> **Current version: 0.5.
|
|
34
|
+
> **Current version: 0.5.2**. It gives installations stable, distinct proxy names on shared frps servers, reports name or port conflicts directly, and removes the DSH prerelease peer-version gate. [Release notes](CHANGELOG.md#052---2026-09-29).
|
|
35
35
|
>
|
|
36
|
-
> **Upgrade reminder**:
|
|
36
|
+
> **Upgrade reminder**: the plugin and Android app can both be updated to 0.5.2. This APK only synchronizes version metadata; the 0.5.1 app and existing pairings do not need reinstalling or re-pairing. [Compatibility notes](#compatibility).
|
|
37
37
|
|
|
38
38
|
<p align="center">
|
|
39
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.5.
|
|
40
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.5.
|
|
41
|
-
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.5.
|
|
39
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.5.2/dsh-mobile-android-v0.5.2.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.2/dsh-mobile-android-v0.5.2.apk"><strong>Download Android app 0.5.2</strong></a><br>
|
|
41
|
+
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.5.2">Release notes and checksums</a></sub>
|
|
42
42
|
</p>
|
|
43
43
|
|
|
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.
|
|
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. Both routes reach the same sessions, Workspaces, messages, and tools. The computer manages their switches and pairing authorizations separately; the Android app lists paired computers together. The plugin does not modify DeepSeek Harness source.
|
|
45
45
|
|
|
46
46
|
Mobile access uses a dedicated HTTPS origin and device pairing. The Android app pins the private LAN CA; public remote paths use platform-trusted certificates. The self-signed FRP entry additionally requires the 0.4.6 app to pin a remote CA during pairing.
|
|
47
47
|
|
|
@@ -50,15 +50,15 @@ It also lets you customize the phone from a DSH conversation: `/mobile <what you
|
|
|
50
50
|
## What it does
|
|
51
51
|
|
|
52
52
|
- **Continue DSH work from a phone**: the same sessions, Workspaces, messages, and tools, in real time.
|
|
53
|
-
- **Customize the phone UI by talking to DSH**:
|
|
53
|
+
- **Customize the phone UI by talking to DSH**: request layout, interaction, or feature changes in a conversation; open pages usually refresh after the files have been changed.
|
|
54
54
|
- **A dedicated touch layout**: session drawer, tool details, settings, question cards, and composer reorganized for phones; the app follows the system locale (Chinese/English/Italian), plugin UI follows DSH's locale.
|
|
55
|
-
- **
|
|
56
|
-
- **Pairing and multi-device**: pair once via QR code, link, or key; Wi-Fi, hotspot, or IP changes normally recover automatically; the app
|
|
55
|
+
- **Several remote options**: Tailscale, cpolar, cloudflared quick/named tunnels, self-hosted FRP, or your own reverse proxy.
|
|
56
|
+
- **Pairing and multi-device**: pair once via QR code, link, or key; Wi-Fi, hotspot, or IP changes normally recover automatically; the app lists LAN and remote paired computers together, checks their reachability periodically, and lets you switch, re-pair, or delete a local record.
|
|
57
57
|
- **One-click diagnostics and approval**: check versions, gateway, network interface, firewall, and the remote path with a redacted report; approve blocked third-party plugin connections per exact path.
|
|
58
58
|
- **Task system notifications**: completion and pending-input alerts via Android system notifications, enabled from DSH General settings inside the app, with redacted lock-screen text.
|
|
59
59
|
- **Defense in depth**: a private CA pinned for LAN, trusted HTTPS for public remote paths, and a remote CA pinned by the 0.4.6 app for the self-signed FRP entry. Credentials are Keystore-backed, device tokens go only to their exact Origin, and third-party WebSockets are blocked by default.
|
|
60
60
|
|
|
61
|
-
A paired device
|
|
61
|
+
A paired device can operate DSH on the computer and must be treated as fully trusted. Enable LAN access only on trusted networks, and use a reliable HTTPS channel for remote access. Revoke a lost phone from the computer immediately.
|
|
62
62
|
|
|
63
63
|
## Quick start
|
|
64
64
|
|
|
@@ -79,6 +79,8 @@ pnpm dsh plugin --profile web exec dsh-mobile setup
|
|
|
79
79
|
pnpm dsh --profile web
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
+
In official DSH Desktop, install and enable `dsh-mobile` from the app's **Plugins** page. Then open **Mobile Access** to configure LAN access or choose a remote channel. The app manages its Desktop profile; the `--profile web` commands above do not apply to it.
|
|
83
|
+
|
|
82
84
|
Or via the plugin market (optional):
|
|
83
85
|
|
|
84
86
|
```powershell
|
|
@@ -95,7 +97,7 @@ Registry-installed plugins check for updates when the desktop UI loads and show
|
|
|
95
97
|
|
|
96
98
|
## Connection guide
|
|
97
99
|
|
|
98
|
-
LAN and remote access are independent connections. Prefer LAN while the phone is near the computer for the lowest latency, and enable remote access only when leaving that network.
|
|
100
|
+
LAN and remote access are independent connections. Prefer LAN while the phone is near the computer for the lowest latency, and enable remote access only when leaving that network. The computer manages their switches and pairing authorizations separately; the Android app shows all paired computers together in its device list.
|
|
99
101
|
|
|
100
102
|
### Local network
|
|
101
103
|
|
|
@@ -114,7 +116,7 @@ Port note: `dsh web --port` changes the DSH Web upstream port (3080 by default),
|
|
|
114
116
|
|
|
115
117
|
Headless Linux hosts, and browsers that open DSH Web through a LAN IP or reverse proxy, can use the same **Mobile access** control in the lower-left corner. The admin API still requires a loopback TCP peer (for example a local `socat` or reverse proxy to `127.0.0.1`) so the plugin itself is not LAN-exposed. The browser Host may be `localhost`, RFC1918, or an IPv4 link-local address; public IPs and arbitrary DNS names still return 403. The reverse proxy must be limited to trusted local or LAN callers and must not publicly forward `/api/mobile-access`. The dedicated Mobile HTTPS listener (3443 by default) remains the phone surface and does not become the desktop admin panel.
|
|
116
118
|
|
|
117
|
-
The app is optional: select **Copy pairing link** and open it in a mobile browser.
|
|
119
|
+
The app is optional: select **Copy pairing link** and open it in a mobile browser. LAN uses a private certificate, which the browser may warn about on first visit; continue only after confirming that this is your DSH gateway. A public-certificate remote origin should not show a certificate warning. If it does, check the channel and certificate instead of bypassing the warning.
|
|
118
120
|
|
|
119
121
|
Browser pairing and reauthentication pages use the browser's `Accept-Language` to show Simplified Chinese, English, or Italian. Android screens follow the system language, while the DSH plugin control panel follows the language selected by DSH.
|
|
120
122
|
|
|
@@ -131,7 +133,7 @@ Remote providers may impose bandwidth and connection limits: the [cpolar Free pl
|
|
|
131
133
|
1. Open **Mobile Access → Remote** in the lower-left corner of DeepSeek Harness and choose a provider:
|
|
132
134
|
- **Tailscale Funnel**: select **Enable remote access**, complete the one-time Tailscale sign-in on the official page, follow the panel prompt to allow Funnel, then return to DSH and wait until the connection is ready.
|
|
133
135
|
- **cpolar**: select **Install official component**, sign in to the cpolar dashboard and obtain an Authtoken, paste it, then select **Save and connect**. The component is downloaded into the plugin's private directory only after confirmation; free temporary addresses may change after DSH or cpolar restarts.
|
|
134
|
-
- **Self-hosted FRP (advanced)**: expand **Self-hosted connection
|
|
136
|
+
- **Self-hosted FRP (advanced)**: if you have a VPS, expand **Self-hosted connection** and enter its frps details and a public HTTPS domain or real public IPv4 address. Apply the restricted frps + Caddy template manually, or deploy with an SSH key on Ubuntu/Debian with systemd. Password login is unsupported, and the plugin does not overwrite Caddy configuration it does not manage. Verify the VPS host keys against its console before deployment or cleanup. The local `frpc` is downloaded and verified on demand; VPS cleanup is separate. Android app 0.3.3 or later is required. The [self-hosted FRP guide](docs/SELF_HOSTED_FRP.en.md) covers certificates, ports, and the complete procedure.
|
|
135
137
|
- **Own reverse proxy**: open **Self-hosted connection → Own reverse proxy**, enter the public HTTPS origin (custom ports supported), private listen IPv4, separate HTTP backend port (default 3444), and allowed proxy source CIDRs, then select **Save and start backend**. This uses your existing Lucky/Nginx/Caddy without a tunnel component and requires Android app 0.4.0 or later. See the [own reverse proxy guide](docs/SELF_HOSTED_ORIGIN.en.md).
|
|
136
138
|
- **cloudflared quick tunnel**: select **Install official component**. After you confirm, the plugin downloads a pinned build from the official release page into its private directory and requests a temporary public address (a quick tunnel) with **no sign-up or sign-in**. Choose this when you would rather not create an account. The quick-tunnel hostname changes on every reconnect, and Cloudflare positions quick tunnels for testing: they are rate-limited and carry no uptime guarantee, so do not rely on one for production access that must stay reachable; it suits temporary or verification use.
|
|
137
139
|
- **cloudflared named tunnel**: with a Cloudflare account and domain, switch **Tunnel type** to **Named**, then supply a connector token, a public hostname and a local forward port to get an address that survives restarts. The token is stored only in the private directory and reaches cloudflared through the environment rather than the command line; see [Cloudflare named tunnel](docs/CLOUDFLARE_TUNNEL.en.md).
|
|
@@ -139,9 +141,9 @@ Remote providers may impose bandwidth and connection limits: the [cpolar Free pl
|
|
|
139
141
|
3. In the Android app, open **Remote access** and scan the QR code to create its separate pairing.
|
|
140
142
|
4. The app saves the current address and device credential for automatic reconnection. If a free cpolar address changes, scan the computer's current remote QR code to verify the connection again; clearing app data is unnecessary. A stored device token is sent only to its exact saved Origin, never to a new QR-code domain.
|
|
141
143
|
|
|
142
|
-
> **Remote notifications**: browser `Notification` permission is granted per Origin, and a web-page system toast appears only on the device running that page. Android task reminders are a separate 0.4.0 feature: enable them
|
|
144
|
+
> **Remote notifications**: browser `Notification` permission is granted per Origin, and a web-page system toast appears only on the device running that page. Android task reminders are a separate 0.4.0 feature: enable them under DSH **Settings → General** in the app, and keep the WebView page alive; they are not a general background push service. For reliable background delivery, use a server-side webhook or bot channel you have configured.
|
|
143
145
|
|
|
144
|
-
Tailscale Funnel has broad reach but may be unreliable from mainland China. Its runtime ties the public listener to the parent process and a bounded control channel; parent exit, channel closure, or an explicit stop ends the current generation and cleans up its resources. cpolar is better suited to mainland networks, while self-hosted FRP fits users who already have a VPS and want to avoid public-provider bandwidth quotas. cloudflared runs in two modes: a quick tunnel needs no account or sign-in, but its hostname is random, changes on every reconnect, and is
|
|
146
|
+
Tailscale Funnel has broad reach but may be unreliable from mainland China. Its runtime ties the public listener to the parent process and a bounded control channel; parent exit, channel closure, or an explicit stop ends the current generation and cleans up its resources. cpolar is better suited to mainland networks, while self-hosted FRP fits users who already have a VPS and want to avoid public-provider bandwidth quotas. cloudflared runs in two modes: a quick tunnel needs no account or sign-in, but its hostname is random, changes on every reconnect, and is [intended by Cloudflare for testing](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/do-more-with-tunnels/trycloudflare/) without an uptime guarantee, so it suits temporary or verification use rather than a permanent channel; a named tunnel uses a Cloudflare account token and keeps one fixed public hostname across restarts. An unregistered domain on a mainland-China VPS may be intercepted by the cloud provider; public IPv4 mode avoids that dependency. The plugin validates pinned on-demand components; locally managed configuration and binaries live under `$DSH_HOME/mobile-access/` and can be cleaned up from the panel. VPS files require separate cleanup through the self-hosted connection guide.
|
|
145
147
|
|
|
146
148
|
Managed self-hosted FRP uses an HTTP vhost to the DSH loopback gateway. Its plaintext VPS listener must be loopback-only, with Caddy providing public HTTPS. Version 0.4.6 adds existing-frps attachment without installing or changing the server: its public-CA mode still needs a restricted HTTP vhost and Caddy, while its self-signed mode forwards raw TCP to a computer-side HTTPS gateway whose CA the 0.4.6 Android app pins during pairing. The self-signed mode currently uses public IPv4 and is unavailable to older apps. Neither mode exposes arbitrary FRP configuration. Because frps `proxyBindAddr` governs proxy listeners globally, do not change it for the new TCP entry without checking existing plaintext vhosts. See the [attachment guide](docs/ATTACH_EXISTING_FRPS.en.md).
|
|
147
149
|
|
|
@@ -151,7 +153,7 @@ The public remote origin still requires DSH device pairing. The bundled Funnel a
|
|
|
151
153
|
|
|
152
154
|
## Extend and customize
|
|
153
155
|
|
|
154
|
-
Type `/mobile <what you want>` in a DSH conversation
|
|
156
|
+
Type `/mobile <what you want>` in a DSH conversation to hand the request to the current agent. Once the files have been changed, the phone page usually refreshes within a few seconds. For example:
|
|
155
157
|
|
|
156
158
|
```text
|
|
157
159
|
/mobile turn the phone UI into an old CRT terminal, with messages scrolling like terminal output
|
|
@@ -186,7 +188,7 @@ The examples above, applied:
|
|
|
186
188
|
|
|
187
189
|
The Android app shows multiple computers at once in one **Paired computers** list: LAN, cpolar, cloudflared, Tailscale Funnel, and self-hosted FRP pairings together. The first upgrade migrates the legacy LAN and remote credentials without requiring another pairing; an address change merges into a record with the same `instanceId` and keeps its custom name. Self-signed FRP uses its own CA fingerprint as identity, so its first pairing may appear as a separate row from LAN for the same computer. Android Keystore encrypts device tokens and LAN CAs; the 0.4.6 app also encrypts that self-signed entry's pinned remote CA. These values never appear in the list or QR code.
|
|
188
190
|
|
|
189
|
-
Each row shows its custom name, transport, Origin,
|
|
191
|
+
Each row shows its custom name, transport, Origin, periodically refreshed reachability, and last connection time. A green dot means **Reachable**; a gray dot means **Checking**, **Temporarily unreachable**, **Pairing expired**, or **Removed on computer**. The check validates the DSH Gateway over HTTPS instead of using ICMP, so a temporary network outage is not mistaken for computer-side revocation.
|
|
190
192
|
|
|
191
193
|
- **Startup behavior → Open DSH directly** (default): one device connects directly; with multiple devices, the app tries the last-used device first, then the still-valid device with the most recent connection. A bounded connection budget returns to the list instead of spinning forever.
|
|
192
194
|
- **Startup behavior → Show device list**: choose a computer on every launch, which is useful when switching between several machines. The option is in the list's top-right settings button and is saved immediately.
|
|
@@ -216,7 +218,8 @@ Compatibility and WebSocket rules:
|
|
|
216
218
|
|
|
217
219
|
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
220
|
|
|
219
|
-
- Version 0.5.
|
|
221
|
+
- Version 0.5.2 no longer blocks installation merely because a DSH version is absent from the peer range; source-contract, isolated pairing, page boot, and Workspace checks have covered `0.2.0-rc.2`. Future releases still require verification. The Mobile administration surface in official DSH Desktop continues to require an authenticated DSH session and does not loosen ordinary Web administration requests.
|
|
222
|
+
- Version 0.5.1 continued contract and boot checks against DSH `0.1.7-alpha.2`, `0.1.7-rc.1`, and `0.1.7-rc.2`, and supported `0.2.0-rc.1`. Official DSH Desktop `0.1.7-rc.2` uses a `dsh-app://app/` page.
|
|
220
223
|
- 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
224
|
- 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
225
|
- 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.
|
|
@@ -250,8 +253,8 @@ There is no default exclusion list. The plugin rejects unknown or boot-critical
|
|
|
250
253
|
|
|
251
254
|
| Client | Best for | Notes |
|
|
252
255
|
| --- | --- | --- |
|
|
253
|
-
| Android app | Everyday use | Separate Local and Remote entries; LAN discovery and
|
|
254
|
-
| Mobile browser | Temporary or cross-platform | Open the HTTPS origin shown by Mobile Access;
|
|
256
|
+
| Android app | Everyday use | Separate Local and Remote entries at first pairing; LAN discovery, system trust for public remote certificates, and app-pinned CA for the self-signed FRP entry |
|
|
257
|
+
| Mobile browser | Temporary or cross-platform | Open the HTTPS origin shown by Mobile Access; a private LAN certificate may need confirmation, while a public remote certificate should not warn |
|
|
255
258
|
|
|
256
259
|
The Android app is a thin Kotlin WebView shell and contains no frontend copy; mobile browsers load the same page. For compatibility diagnosis, append `?frontend=stock` to the browser URL to temporarily use the previous desktop-page adaptation.
|
|
257
260
|
|
|
@@ -289,19 +292,15 @@ See [SECURITY.md](SECURITY.md).
|
|
|
289
292
|
## Troubleshooting
|
|
290
293
|
|
|
291
294
|
- **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.
|
|
292
|
-
- **
|
|
293
|
-
- **
|
|
294
|
-
computer switched networks (Wi-Fi/Ethernet/dock) and the previously saved
|
|
295
|
-
adapter is down. Either reconnect that network, re-run setup on the new
|
|
296
|
-
one, or set `mobile-access` to `disabled: true` in `cordis.patch.yml` if
|
|
297
|
-
phone access is not needed. Recent versions no longer block boot in this
|
|
298
|
-
case — the plugin logs a warning, stays dormant, and recovers when the
|
|
299
|
-
adapter returns.
|
|
295
|
+
- **Remote 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.
|
|
296
|
+
- **LAN access stops after switching networks**: if the log reports `saved LAN interface "XXX" is not connected`, the saved adapter is unavailable. DSH keeps running while Mobile Access stays dormant and retries when the adapter returns. If you have moved to a different adapter, configure LAN again or re-run `setup`. If mobile access is not needed, disable `mobile-access` in `cordis.patch.yml`.
|
|
300
297
|
|
|
301
298
|
## Compatibility
|
|
302
299
|
|
|
303
300
|
The table records tested DSH and plugin version combinations; it does not imply automatic compatibility with other versions. Since 0.3.6 the plugin has not rejected DSH solely by version number. If mobile access breaks after upgrading DSH, check this table and update the plugin first. History lives in [CHANGELOG.md](CHANGELOG.md).
|
|
304
301
|
|
|
302
|
+
Version 0.5.2 keeps the DSH host peer names but does not block installation by DSH version. New releases still need the source-contract and paired-browser checks below; an unlisted version is not automatically verified.
|
|
303
|
+
|
|
305
304
|
### OS support matrix
|
|
306
305
|
|
|
307
306
|
| Channel | Windows x64 | Linux x64 | Linux arm64 | macOS |
|
|
@@ -317,6 +316,8 @@ On macOS, local network, self-hosted FRP, and the own reverse proxy work; the th
|
|
|
317
316
|
|
|
318
317
|
| DSH Mobile plugin | Verified DeepSeek Harness version |
|
|
319
318
|
| --- | --- |
|
|
319
|
+
| `0.5.2` | `0.1.7-alpha.2`, `0.1.7-rc.1`, `0.1.7-rc.2`, and `0.2.0-rc.1` (carried forward from earlier verification); `0.2.0-rc.2` (source contract, isolated pairing, mobile-page boot, and WebSocket Workspace baseline) |
|
|
320
|
+
| `0.5.1` | `0.1.7-alpha.2`, `0.1.7-rc.1`, `0.1.7-rc.2`, and `0.2.0-rc.1`; official Desktop `0.1.7-rc.2` (administration surface) |
|
|
320
321
|
| `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
322
|
| `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) |
|
|
322
323
|
| `0.4.6` | `0.1.7-alpha.2` and `0.1.7-rc.1` (source contract, isolated pairing, and workspace baseline over WebSocket) |
|
|
@@ -339,11 +340,15 @@ GitHub Release APKs use a stable signing certificate, so an older official APK w
|
|
|
339
340
|
|
|
340
341
|
## Uninstall
|
|
341
342
|
|
|
343
|
+
Choose one of the two Web-profile paths below. In official DSH Desktop, uninstall the plugin from the app's **Plugins** page. Uninstalling the package alone leaves certificates, pairing records, and custom files under `$DSH_HOME/mobile-access/` intact.
|
|
344
|
+
|
|
345
|
+
Remove only the plugin and keep local data:
|
|
346
|
+
|
|
342
347
|
```powershell
|
|
343
348
|
dsh plugin --profile web remove dsh-mobile
|
|
344
349
|
```
|
|
345
350
|
|
|
346
|
-
To remove local plugin data first
|
|
351
|
+
To remove local plugin data as well, first back up extensions and custom files you want to keep. **Run `purge --yes` before removing the plugin**; do not run the preceding remove-only command first. `purge` deletes the entire `$DSH_HOME/mobile-access/` directory and the plugin's Windows firewall rules, but it does not remove VPS files.
|
|
347
352
|
|
|
348
353
|
```powershell
|
|
349
354
|
dsh plugin --profile web exec dsh-mobile purge --yes
|
|
@@ -363,11 +368,11 @@ npm ci
|
|
|
363
368
|
npm run verify
|
|
364
369
|
```
|
|
365
370
|
|
|
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`,
|
|
371
|
+
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. Development-branch CI tests DSH `0.1.7-alpha.2`, `0.1.7-rc.1`, `0.1.7-rc.2`, `0.2.0-rc.1`, and `0.2.0-rc.2`; install DSH `0.2.0-rc.2` in a separate directory so it does not replace the plugin's development dependencies:
|
|
367
372
|
|
|
368
373
|
```powershell
|
|
369
374
|
$dshMobileTestRuntime = Join-Path $env:TEMP 'dsh-mobile-test-runtime'
|
|
370
|
-
npm install --prefix $dshMobileTestRuntime --no-save --package-lock=false @deepseek-ai/dsh@0.
|
|
375
|
+
npm install --prefix $dshMobileTestRuntime --no-save --package-lock=false @deepseek-ai/dsh@0.2.0-rc.2
|
|
371
376
|
$env:DSH_BOOT_SMOKE_BIN = Join-Path $dshMobileTestRuntime 'node_modules/@deepseek-ai/dsh/lib/bin.js'
|
|
372
377
|
npx playwright install chromium --only-shell
|
|
373
378
|
npm run smoke:dsh-boot
|
package/README.md
CHANGED
|
@@ -31,17 +31,17 @@
|
|
|
31
31
|
|
|
32
32
|
> DSH Mobile 是 DeepSeek Harness 社区插件,原生 App 仅支持 Android。
|
|
33
33
|
>
|
|
34
|
-
> **当前版本:0.5.
|
|
34
|
+
> **当前版本:0.5.2**。共享 frps 时使用稳定的独立代理名,并明确提示代理名或端口冲突;解除 DSH 预发布版的依赖版本拦截。[更新记录](CHANGELOG.md#052---2026-09-29)。
|
|
35
35
|
>
|
|
36
|
-
>
|
|
36
|
+
> **升级提醒**:插件与 Android App 可同步更新至 0.5.2。App 本次只同步版本信息;0.5.1 App 与现有配对无需重装或重新配对。[兼容说明](#兼容性)。
|
|
37
37
|
|
|
38
38
|
<p align="center">
|
|
39
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.5.
|
|
40
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.5.
|
|
41
|
-
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.5.
|
|
39
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.5.2/dsh-mobile-android-v0.5.2.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.2/dsh-mobile-android-v0.5.2.apk"><strong>下载 Android App 0.5.2</strong></a><br>
|
|
41
|
+
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.5.2">版本说明与校验文件</a></sub>
|
|
42
42
|
</p>
|
|
43
43
|
|
|
44
|
-
DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App 通过局域网,或可选的 Tailscale Funnel、cpolar、cloudflared、自建 FRP
|
|
44
|
+
DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App 通过局域网,或可选的 Tailscale Funnel、cpolar、cloudflared、自建 FRP 或自有反向代理远程通道连接电脑,继续使用同一份会话、工作区、消息和工具。电脑端分别启停局域网与远程访问、分别管理配对授权;Android App 统一显示已配对电脑。插件不修改 DeepSeek Harness 源码。
|
|
45
45
|
|
|
46
46
|
移动访问使用独立 HTTPS 与设备配对;Android App 固定局域网私有 CA,公开远程通道使用系统信任的证书;自签 FRP 入口还需由 0.4.6 App 在配对时固定远程 CA。
|
|
47
47
|
|
|
@@ -50,15 +50,15 @@ DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App
|
|
|
50
50
|
## 能做什么
|
|
51
51
|
|
|
52
52
|
- **在手机上继续电脑端的工作**:同一份会话、工作区、消息和工具,实时同步。
|
|
53
|
-
-
|
|
53
|
+
- **用对话定制手机端**:在 DSH 对话里提出布局、交互或功能需求;文件修改完成后,手机页面通常会自动刷新。
|
|
54
54
|
- **专属触屏布局**:会话抽屉、工具详情、设置、提问卡片和输入栏都按手机重新组织;App 跟随系统语言(简/英/意),插件界面跟随 DSH 语言。
|
|
55
55
|
- **多种远程通道**:Tailscale、cpolar、cloudflared 快速/命名隧道、自建 FRP、自有反向代理,按网络任选。
|
|
56
|
-
- **配对与多设备**:扫码、链接或密钥配对一次;切换 Wi-Fi、热点或 IP 后通常自动恢复;App
|
|
56
|
+
- **配对与多设备**:扫码、链接或密钥配对一次;切换 Wi-Fi、热点或 IP 后通常自动恢复;App 在一个列表中显示局域网和远程配对的电脑,定期检测可达状态,并支持切换、重新配对或删除本地记录。
|
|
57
57
|
- **一键诊断与放行**:检查版本、网关、网卡、防火墙和远程通道,生成脱敏报告;被拦截的第三方插件连接按确切路径一键放行。
|
|
58
|
-
- **任务系统通知**:任务完成与待输入以 Android 系统通知提醒,可在 App 内的 DSH
|
|
58
|
+
- **任务系统通知**:任务完成与待输入以 Android 系统通知提醒,可在 App 内的 DSH“通用设置”中开启,锁屏文本脱敏。
|
|
59
59
|
- **纵深安全**:局域网固定私有 CA,公开远程入口使用受信任 HTTPS;自签 FRP 入口由 0.4.6 App 固定远程 CA。凭据存 Keystore,设备令牌只发往精确 Origin,第三方 WS 默认拦截。
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
配对设备可以操作电脑上的 DSH,应视为完全受信任的设备。局域网只在可信网络开启;远程访问应使用可靠的 HTTPS 通道。手机丢失时,请立即从电脑端撤销设备。
|
|
62
62
|
|
|
63
63
|
## 快速开始
|
|
64
64
|
|
|
@@ -79,6 +79,8 @@ pnpm dsh plugin --profile web exec dsh-mobile setup
|
|
|
79
79
|
pnpm dsh --profile web
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
+
使用官方 DSH Desktop:在应用的 **插件** 页面安装并启用 `dsh-mobile`,再打开 **移动访问** 完成局域网配置或选择远程通道。Desktop 的 profile 由应用管理,不适用上面的 `--profile web` 命令。
|
|
83
|
+
|
|
82
84
|
也可以通过插件市场安装(可选):
|
|
83
85
|
|
|
84
86
|
```powershell
|
|
@@ -95,7 +97,7 @@ dsh plugin --profile web add dshmarket
|
|
|
95
97
|
|
|
96
98
|
## 连接教程
|
|
97
99
|
|
|
98
|
-
|
|
100
|
+
局域网和远程访问是两套相互独立的连接:在电脑附近优先使用局域网,延迟最低;离开当前网络时再启用远程访问。电脑端分别管理开关与配对授权;Android App 将所有已配对电脑集中显示在设备列表中。
|
|
99
101
|
|
|
100
102
|
### 局域网访问
|
|
101
103
|
|
|
@@ -114,7 +116,7 @@ dsh plugin --profile web add dshmarket
|
|
|
114
116
|
|
|
115
117
|
无图形界面的 Linux 主机,或通过局域网 IP / 反向代理打开 DSH Web 时,左下角 **移动访问** 管理口同样可用。管理 API 仍要求 TCP 对端是本机回环(例如本机 `socat` / 反向代理连到 `127.0.0.1`),不会把插件自己暴露到公网;浏览器 Host 可以是 `localhost`、RFC1918 或 IPv4 链路本地地址,公网 IP 和任意域名仍会返回 403。反向代理必须只对可信的本机或内网请求开放,不能把 `/api/mobile-access` 管理路径公开转发到互联网。手机走的独立 HTTPS 入口(默认 3443)仍是移动端界面,不会变成桌面管理口。
|
|
116
118
|
|
|
117
|
-
不安装 App 也可以访问:点击
|
|
119
|
+
不安装 App 也可以访问:点击 **复制配对链接**,在手机浏览器中打开。局域网使用私有证书,浏览器首次访问可能提示不受信任;只在确认这是自己的 DSH 网关后按浏览器指引继续。公开证书的远程入口不应出现证书警告,若出现请检查通道和证书,不要直接忽略。
|
|
118
120
|
|
|
119
121
|
手机浏览器中的配对和重新连接页面会按浏览器的 `Accept-Language` 显示简体中文、英文或意大利文;Android App 则跟随系统语言。DSH 内的插件控制面板继续跟随 DSH 当前语言。
|
|
120
122
|
|
|
@@ -131,7 +133,7 @@ dsh plugin --profile web add dshmarket
|
|
|
131
133
|
1. 在 DeepSeek Harness 左下角打开 **移动访问 → 远程**,选择一种连接方式:
|
|
132
134
|
- **Tailscale Funnel**:点击 **启用远程访问**,在打开的官方页面完成一次 Tailscale 登录;按面板提示继续允许 Funnel,然后返回 DSH 等待连接就绪。
|
|
133
135
|
- **cpolar**:点击 **安装官方组件**,登录 cpolar 控制台取得 Authtoken,粘贴后点击 **保存并连接**。组件只会在确认后下载到插件私有目录;免费临时地址可能在 DSH 或 cpolar 重启后变化。
|
|
134
|
-
- **自建 FRP
|
|
136
|
+
- **自建 FRP(高级)**:已有 VPS 时,展开 **自建连接**,填写 frps 信息和公开 HTTPS 域名或真实公网 IPv4。可以复制受限的 frps + Caddy 模板手动部署,也可以在 Ubuntu/Debian + systemd 上用 SSH 密钥一键部署;不支持密码登录,也不会覆盖非 DSH Mobile 管理的 Caddy 配置。部署或清理前须到 VPS 控制台核对主机指纹。本机 `frpc` 按需下载校验,VPS 需单独清理。需要 Android App 0.3.3 或更新版本;证书、端口和操作步骤见 [自建 FRP 使用指南](docs/SELF_HOSTED_FRP.md)。
|
|
135
137
|
- **自有反向代理**:展开 **自建连接 → 自有反向代理**,填写公网 HTTPS 地址(支持自定义端口)、私有监听 IPv4、独立 HTTP 后端端口(默认 3444)和代理来源 CIDR,再点击 **保存并启动后端**。适合已有 Lucky/Nginx/Caddy 的用户,无需隧道组件;需要 Android App 0.4.0 或更高版本。详见 [自有反向代理指南](docs/SELF_HOSTED_ORIGIN.md)。
|
|
136
138
|
- **cloudflared 快速隧道**:点击 **安装官方组件**,插件在确认后从官方发布页下载固定版本到插件私有目录,随后自动申请一个临时公网地址(quick tunnel),**无需注册或登录**。适合不想注册账号的用户;quick tunnel 地址每次重连都会变化,官方定位为测试用途、有限流且无可用性保证,请勿用于必须长期可达的生产访问,只适合临时或验证场景。
|
|
137
139
|
- **cloudflared 命名隧道**:已有 Cloudflare 账号和域名时,把隧道类型切到 **命名隧道**,填入连接器令牌、公网域名与本机转发端口,即可获得重启后不变的固定地址(令牌只存私有目录、只经环境变量传给 cloudflared)。步骤见 [Cloudflare 命名隧道](docs/CLOUDFLARE_TUNNEL.md)。
|
|
@@ -139,9 +141,9 @@ dsh plugin --profile web add dshmarket
|
|
|
139
141
|
3. 在 Android App 中进入 **远程访问**,扫描二维码完成独立配对。
|
|
140
142
|
4. 此后 App 会保存当前地址和设备凭据并自动重连。若 cpolar 免费临时地址发生变化,请扫描电脑端当前远程二维码重新验证连接;无需清除 App 数据。旧设备 token 只会发送到原先保存的精确 Origin,不会发送给二维码中的新域名。
|
|
141
143
|
|
|
142
|
-
> **远程通知说明**:浏览器的 `Notification` 权限按 Origin 分别授权,网页系统通知只显示在运行该网页的设备上。Android App 的任务提醒是独立的 0.4.0 功能,需要在 App
|
|
144
|
+
> **远程通知说明**:浏览器的 `Notification` 权限按 Origin 分别授权,网页系统通知只显示在运行该网页的设备上。Android App 的任务提醒是独立的 0.4.0 功能,需要在 App 内 DSH 的 **设置 → 通用设置** 中主动开启,且依赖 WebView 页面仍存活;它不是通用的后台推送。需要可靠的后台推送时,请使用你已配置的服务端 webhook 或机器人通道。
|
|
143
145
|
|
|
144
|
-
Tailscale Funnel 覆盖范围广,但在中国大陆网络下可能不稳定。其运行组件把公开监听生命周期绑定到父进程和受限控制通道;父进程退出、控制通道关闭或显式停止时会结束当前代次并清理资源。cpolar 更适合国内网络;自建 FRP 适合已有 VPS、希望避开公共服务带宽限制的用户。cloudflared
|
|
146
|
+
Tailscale Funnel 覆盖范围广,但在中国大陆网络下可能不稳定。其运行组件把公开监听生命周期绑定到父进程和受限控制通道;父进程退出、控制通道关闭或显式停止时会结束当前代次并清理资源。cpolar 更适合国内网络;自建 FRP 适合已有 VPS、希望避开公共服务带宽限制的用户。cloudflared 有两种模式:快速隧道不需要账号或登录,但地址随机、每次重连都会变化,[官方定位为测试用途](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/do-more-with-tunnels/trycloudflare/)且无可用性保证,因此只适合临时或验证场景;命名隧道使用 Cloudflare 账号令牌,能保留重启后不变的固定公网域名。中国大陆 VPS 上的未备案域名可能被云厂商拦截,此时可使用公网 IPv4 模式。插件会校验按需下载的固定版本组件;本机托管的配置与程序保存在 `$DSH_HOME/mobile-access/`,可在面板中清理。VPS 侧的文件须按自建连接指南单独清理。
|
|
145
147
|
|
|
146
148
|
自建 FRP 的托管部署使用指向 DSH 回环网关的 HTTP vhost:VPS 上的明文 vhost 只允许回环访问,由 Caddy 提供公网 HTTPS。0.4.6 新增“接入既有 frps”,不会安装或改动服务器;公开 CA 档仍需受限 HTTP vhost 与 Caddy,自签档则用 frps TCP 透传至电脑端 HTTPS 网关,须由 0.4.6 Android App 在配对时固定 CA。自签档目前面向公网 IPv4,旧版 App 不支持;两档都不开放任意 FRP 配置。frps 的 `proxyBindAddr` 是全局代理监听设置,不能只为新增 TCP 入口调整而忽略已有明文 vhost。[接入指南](docs/ATTACH_EXISTING_FRPS.md)。
|
|
147
149
|
|
|
@@ -151,7 +153,7 @@ Tailscale Funnel 覆盖范围广,但在中国大陆网络下可能不稳定。
|
|
|
151
153
|
|
|
152
154
|
## 扩展与自定义
|
|
153
155
|
|
|
154
|
-
在 DSH 对话里输入 `/mobile
|
|
156
|
+
在 DSH 对话里输入 `/mobile <需求>`,当前会话的 agent 会处理定制请求;文件修改完成后,手机端通常会在几秒内刷新。例如:
|
|
155
157
|
|
|
156
158
|
```text
|
|
157
159
|
/mobile 把手机端做成老式终端的样子,让消息像终端输出一样逐行滚动
|
|
@@ -186,12 +188,12 @@ Tailscale Funnel 覆盖范围广,但在中国大陆网络下可能不稳定。
|
|
|
186
188
|
|
|
187
189
|
Android App 用一个“已配对设备”列表同时显示多台电脑:局域网、cpolar、cloudflared、Tailscale Funnel 和自建 FRP 配对共处一处。首次升级会自动迁移旧版局域网与远程凭据,不要求重新配对;地址变化且 `instanceId` 与原记录一致时会合并条目,保留自定义名称。自签 FRP 使用独立 CA 指纹作为身份,首次与局域网配对时可能显示为另一条记录。设备 Token 和局域网 CA 由 Android Keystore 加密保存;0.4.6 App 还会加密保存自签 FRP 入口固定的远程 CA。这些信息不会显示在设备列表或二维码中。
|
|
188
190
|
|
|
189
|
-
每条记录显示自定义名称、连接方式、Origin
|
|
191
|
+
每条记录显示自定义名称、连接方式、Origin、定期更新的可达状态和最近连接时间。绿色状态点表示“可达”,灰色状态点表示“检测中”“暂不可达”“配对已过期”或“电脑端已移除”;可达性检查直接验证 DSH Gateway,不依赖 ICMP,也不会把暂时断网误判成电脑端撤销。
|
|
190
192
|
|
|
191
193
|
- **启动时打开 → 直接进入 DSH**(默认):单设备直接连接;多设备优先连接上次使用的设备,其次按最近连接时间选择仍有效的设备。连接超过有限重试预算后自动回到列表,不会无限转圈。
|
|
192
194
|
- **启动时打开 → 显示设备列表**:每次启动先选择电脑,适合经常在多台设备之间切换。该选项位于列表右上角的设置按钮中,修改后立即保存。
|
|
193
195
|
- 点按设备行可连接;右侧“…”和长按提供相同的操作面板,可编辑名称、立即检测、重新配对或删除本地记录。删除前会二次确认,并提供短暂撤销;撤销只恢复本机记录,不恢复电脑端已经撤销的授权。
|
|
194
|
-
- 在 WebView 页面打开 DSH **设置 →
|
|
196
|
+
- 在 WebView 页面打开 DSH **设置 → 通用设置**,选择 **切换电脑** 可回到已配对设备列表;该动作仅在 Android App 中显示。在线收到电脑端撤销通知后,App 保留该条目并显示“电脑端已移除”,停止自动重连,同时提供 **重新配对** 和 **删除本地记录**。
|
|
195
197
|
|
|
196
198
|
电脑端撤销会永久删除持久化存储中的设备记录及令牌摘要,而不是保留 `revokedAt` 标记;启动时也会清理旧版留下的已撤销记录。删除后,旧令牌与未知令牌一样返回 `401 authentication_failed`。现有 App 若在离线期间被撤销,再次检测时可能显示“配对已过期”,需要重新配对;在线会话仍会收到撤销通知并立即断开。
|
|
197
199
|
|
|
@@ -216,8 +218,9 @@ Android App 用一个“已配对设备”列表同时显示多台电脑:局
|
|
|
216
218
|
|
|
217
219
|
代理页面为兼容部分社区插件允许嵌入 HTTP 页面;这类内容未加密,可能被篡改,浏览器也可能因混合内容策略拦截。处理敏感内容时请使用 HTTPS。通过 HTTPS 管理入口打开远程面板时,页面顶部会显示相同提醒。
|
|
218
220
|
|
|
219
|
-
- 0.5.
|
|
220
|
-
-
|
|
221
|
+
- 0.5.2 不再因 DSH 版本号未列入依赖范围而阻止安装;已对 `0.2.0-rc.2` 进行源码契约、隔离配对、页面启动及工作区读取检查。未来新版本仍需实际验证。官方 DSH Desktop 的移动访问管理入口继续要求已认证的 DSH 会话,不放宽普通 Web 页面的管理请求。
|
|
222
|
+
- 0.5.1 延续对 DSH `0.1.7-alpha.2`、`0.1.7-rc.1` 和 `0.1.7-rc.2` 的契约及启动检查,并适配 `0.2.0-rc.1`。官方 DSH Desktop `0.1.7-rc.2` 使用 `dsh-app://app/` 页面。
|
|
223
|
+
- 网关默认只允许 DSH 内置的第一方 WebSocket 路径,包括 `/sidebar/ws/terminal`。社区侧边栏插件使用的其他路径默认拦截,通常会在诊断页显示为待处理项目;截图中的 `/sidebar/ws/agent-opens` 和 `/sidebar/ws/agent-terminals` 就属于这类需要按实际插件确认的路径。
|
|
221
224
|
- 在 **连接诊断 → 第三方 WebSocket 路径** 中,只对确认过的精确路径点击 **允许**。系统不接受带查询字符串或模糊前缀的路径;不建议使用“全部允许”。已允许的路径可以随时移除,局域网和远程连接使用同一套规则。
|
|
222
225
|
- 放行只代表该路径可以通过已认证、同源的 DSH Mobile 网关,不会开放任意 TCP/UDP 端口,也不会绕过设备配对。若社区插件仍然连接失败,先看诊断页的实际拦截路径,再按一条路径放行。
|
|
223
226
|
|
|
@@ -248,11 +251,10 @@ excludedClientModules:
|
|
|
248
251
|
|
|
249
252
|
## App 与手机浏览器
|
|
250
253
|
|
|
251
|
-
|
|
252
|
-
|
|
|
253
|
-
|
|
|
254
|
-
|
|
|
255
|
-
| 手机浏览器 | 临时或跨平台访问 | 打开“移动访问”卡片显示的 HTTPS 地址;首次连接需在浏览器手动信任该证书 |
|
|
254
|
+
| 方式 | 适合场景 | 说明 |
|
|
255
|
+
| --- | --- | --- |
|
|
256
|
+
| Android App | 日常使用 | 首次配对时分别提供局域网与远程入口;局域网自动发现,公开远程证书由系统验证,自签 FRP 入口由 App 固定 CA |
|
|
257
|
+
| 手机浏览器 | 临时或跨平台访问 | 打开“移动访问”卡片显示的 HTTPS 地址;局域网私有证书可能需要手动确认,公开远程证书不应出现警告 |
|
|
256
258
|
|
|
257
259
|
Android App 只是 Kotlin WebView 薄壳,不内置另一份网页;手机浏览器访问的是同一页面。需要排查兼容性时,可在浏览器地址后追加 `?frontend=stock`,临时回到旧的桌面页面适配模式。
|
|
258
260
|
|
|
@@ -291,17 +293,15 @@ flowchart LR
|
|
|
291
293
|
## 故障排查
|
|
292
294
|
|
|
293
295
|
- **手机出现另一插件的“输入配对码”页面**:`dsh-remote-web-ui` 与 DSH Mobile 各有独立的远程通道和配对码,不能交叉使用。若电脑端连接诊断提示“第三方远程插件”,先关闭该插件的远程访问并刷新,再扫描 DSH Mobile 当前二维码。仅安装该插件而未启用它的远程接管,不会触发这条诊断。
|
|
294
|
-
-
|
|
295
|
-
-
|
|
296
|
-
电脑切换过网络(WiFi/有线/扩展坞),之前保存的网卡当前未连接。处理方式
|
|
297
|
-
(三选一):连回原来的网络;按新网络重跑一遍 setup;暂时不用手机访问时,
|
|
298
|
-
在 `cordis.patch.yml` 把 `mobile-access` 设 `disabled: true`。新版本中该
|
|
299
|
-
情况不再阻断启动——插件记一条警告后休眠,等网卡回来自动恢复。
|
|
296
|
+
- **远程诊断显示“电脑经代理可访问”**:诊断先直连,失败后才尝试 DSH 进程环境变量中的 HTTP 代理;`NO_PROXY` 可排除目标。此结果只说明电脑经代理完成 HTTPS 探测,不代表手机或实际隧道可用。请用手机流量实际连接;若直连和代理都失败,报告仍为不可达,不会把离线误报为就绪。
|
|
297
|
+
- **切换网络后局域网访问不可用**:如果日志提示 `saved LAN interface "XXX" is not connected`,表示保存的网卡当前未连接。DSH 会继续运行,移动访问暂时休眠,原网卡恢复后会自动重试;若已改用新网卡,请重新完成局域网配置或重跑 `setup`。暂时不用移动访问时,可以在 `cordis.patch.yml` 中禁用 `mobile-access`。
|
|
300
298
|
|
|
301
299
|
## 兼容性
|
|
302
300
|
|
|
303
301
|
下表记录已验证的 DSH 与插件版本组合,不表示其他版本自动兼容。0.3.6 起插件不会仅凭版本号拒绝启动;升级 DSH 后若遇到移动端异常,请先核对兼容表并更新插件。历史记录见 [CHANGELOG.md](CHANGELOG.md)。
|
|
304
302
|
|
|
303
|
+
0.5.2 保留 DSH 宿主依赖名称,但不按 DSH 版本号拦截安装。新版本仍需经过下方的源码契约与配对启动检查;不在表中的版本不代表已验证。
|
|
304
|
+
|
|
305
305
|
### 系统支持矩阵
|
|
306
306
|
|
|
307
307
|
| 通道 | Windows x64 | Linux x64 | Linux arm64 | macOS |
|
|
@@ -317,6 +317,8 @@ macOS 上局域网、自建 FRP 与自有反向代理可用;三个托管组件
|
|
|
317
317
|
|
|
318
318
|
| DSH Mobile 插件 | 验证支持的 DeepSeek Harness 版本 |
|
|
319
319
|
| ----------------------------------------- | -------------------------------------------------------------- |
|
|
320
|
+
| `0.5.2` | `0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2`、`0.2.0-rc.1`(延续既有验证);`0.2.0-rc.2`(源码契约、隔离配对、移动页面启动和 WebSocket 工作区读取) |
|
|
321
|
+
| `0.5.1` | `0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2`、`0.2.0-rc.1`;官方 Desktop `0.1.7-rc.2`(桌面管理入口) |
|
|
320
322
|
| `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
323
|
| `0.4.7` | `0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2`(源码契约、隔离配对及 WebSocket 工作区读取) |
|
|
322
324
|
| `0.4.6` | `0.1.7-alpha.2`、`0.1.7-rc.1`(源码契约、隔离配对及 WebSocket 工作区读取) |
|
|
@@ -339,11 +341,15 @@ GitHub Release 的正式 APK 使用固定签名,可从同一签名的旧正式
|
|
|
339
341
|
|
|
340
342
|
## 卸载
|
|
341
343
|
|
|
344
|
+
以下是 Web profile 的两种卸载方式,按需选择其一;官方 DSH Desktop 请在应用的 **插件** 页面卸载。仅卸载插件不会删除 `$DSH_HOME/mobile-access/` 中的证书、配对记录或自定义文件。
|
|
345
|
+
|
|
346
|
+
仅卸载插件、保留本机数据:
|
|
347
|
+
|
|
342
348
|
```powershell
|
|
343
349
|
dsh plugin --profile web remove dsh-mobile
|
|
344
350
|
```
|
|
345
351
|
|
|
346
|
-
|
|
352
|
+
若要连同本机数据一起清理,请先备份需要保留的扩展与自定义文件,**先运行 `purge --yes`,再卸载插件**;不要先执行上面的单独卸载命令。`purge` 会删除整个 `$DSH_HOME/mobile-access/` 目录及插件创建的 Windows 防火墙规则,但不会清理 VPS 上的文件。
|
|
347
353
|
|
|
348
354
|
```powershell
|
|
349
355
|
dsh plugin --profile web exec dsh-mobile purge --yes
|
|
@@ -363,11 +369,11 @@ npm ci
|
|
|
363
369
|
npm run verify
|
|
364
370
|
```
|
|
365
371
|
|
|
366
|
-
真实启动冒烟另用临时 DSH Home、随机回环端口和 Chromium
|
|
372
|
+
真实启动冒烟另用临时 DSH Home、随机回环端口和 Chromium 配对,不访问现有用户配置,也不发送模型请求。开发分支的 CI 分别测试 DSH `0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2`、`0.2.0-rc.1` 与 `0.2.0-rc.2`;本机可把 DSH `0.2.0-rc.2` 装在独立目录,避免替换插件的开发依赖:
|
|
367
373
|
|
|
368
374
|
```powershell
|
|
369
375
|
$dshMobileTestRuntime = Join-Path $env:TEMP 'dsh-mobile-test-runtime'
|
|
370
|
-
npm install --prefix $dshMobileTestRuntime --no-save --package-lock=false @deepseek-ai/dsh@0.
|
|
376
|
+
npm install --prefix $dshMobileTestRuntime --no-save --package-lock=false @deepseek-ai/dsh@0.2.0-rc.2
|
|
371
377
|
$env:DSH_BOOT_SMOKE_BIN = Join-Path $dshMobileTestRuntime 'node_modules/@deepseek-ai/dsh/lib/bin.js'
|
|
372
378
|
npx playwright install chromium --only-shell
|
|
373
379
|
npm run smoke:dsh-boot
|
package/SECURITY.md
CHANGED
|
@@ -33,6 +33,8 @@ The maintainer will acknowledge a complete report within seven days. Publication
|
|
|
33
33
|
- Automatic VPS deployment and one-click VPS cleanup first read the server's SSH host keys and require the operator to confirm every `SHA256:` fingerprint against the VPS console before any authenticated connection. All SSH/SCP channels pin `StrictHostKeyChecking=yes` to a temporary known_hosts file built from the confirmed keys; unknown, rotated, or extra keys abort the operation instead of being silently accepted. SSH credentials themselves are key-or-agent only, never passwords; the private key path is convenience state in the current browser profile, and key material is never uploaded or logged.
|
|
34
34
|
- Disabling remote access stops the selected provider process without affecting LAN access. Resetting remote access also removes provider state and the independent remote device registry.
|
|
35
35
|
- Treat every paired device as a fully trusted operator. Stock DSH methods reached through the authenticated loopback proxy may read configuration or run tools with the desktop user's authority.
|
|
36
|
+
- Android stores the paired-device list as an encrypted record. Removing a local row erases its local credential but does not revoke the phone at the computer; use the computer-side device controls to revoke access. A computer-side revocation invalidates the token even if the App retains the row's name for re-pairing. Network timeouts are not evidence of revocation.
|
|
37
|
+
- Android grants WebView microphone access only for an audio-only request from the current paired HTTPS Origin, after Android's `RECORD_AUDIO` permission is granted. Other WebView resources and Origins remain denied. Client plugins within the authenticated page share that Origin and can invoke page APIs; install only trusted plugins before granting microphone access.
|
|
36
38
|
- Treat `mobile.js` as application code with the paired page's same-origin authority. Restrict write access to trusted host-side DSH sessions and review generated API calls or browser-permission use.
|
|
37
39
|
- Treat every extension `host.mjs` as a local program with the desktop user's Node.js privileges. It is never sandboxed and is not editable through the mobile gateway; only place code there that you trust.
|
|
38
40
|
- Extension Actions and Routes receive filtered request data, a device identifier, and an abort signal. They cannot set proxy security headers or access the gateway's cookies, device tokens, CSRF tokens, or internal request headers.
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Third-party notices
|
|
2
2
|
|
|
3
|
-
DSH Mobile includes
|
|
3
|
+
DSH Mobile includes platform-specific Windows and Linux Funnel helpers built from the source in `native/funnel-host`. They use [Tailscale tsnet](https://pkg.go.dev/tailscale.com/tsnet) `v1.102.3`, distributed under the BSD 3-Clause license. Their exact statically linked Go module versions and complete license and notice texts are generated from the bundled executables into `FUNNEL_THIRD_PARTY_LICENSES.txt`, which is included in every npm package.
|
|
4
4
|
|
|
5
5
|
The optional cpolar component is not included in the npm package or Android App. When a user explicitly chooses cpolar installation, DSH Mobile downloads the pinned official archive shown in the UI, verifies its size and SHA-256 digest, and stores it only under the user's DSH Mobile data directory. cpolar remains subject to its [terms of service](https://www.cpolar.com/tos).
|
|
6
6
|
|
|
7
7
|
The optional [FRP](https://github.com/fatedier/frp) client is not included in the npm package or Android App. When a user explicitly chooses self-hosted FRP installation, DSH Mobile downloads the pinned official `frpc` 0.70.1 archive, verifies its origin, exact size, SHA-256 digest, archive paths, and executable version, then stores only `frpc` under the user's DSH Mobile data directory. FRP is distributed under the Apache License 2.0.
|
|
8
8
|
|
|
9
|
-
The optional [cloudflared](https://github.com/cloudflare/cloudflared) client is not included in the npm package or Android App. When a user explicitly chooses cloudflared installation, DSH Mobile downloads the pinned official
|
|
9
|
+
The optional [cloudflared](https://github.com/cloudflare/cloudflared) client is not included in the npm package or Android App. When a user explicitly chooses cloudflared installation, DSH Mobile downloads the pinned official release asset for the supported host platform (version recorded in `src/cloudflared-component.ts`), verifies its exact size and SHA-256 digest, and stores it only under the user's DSH Mobile data directory. The client is started with automatic updates disabled. Quick tunnels do not require account credentials; named tunnels use an operator-supplied connector token stored in the plugin's private directory. cloudflared is distributed under the Apache License 2.0; use of Cloudflare's quick tunnels remains subject to Cloudflare's [website terms](https://www.cloudflare.com/website-terms/).
|
|
10
10
|
|
|
11
|
-
The npm package declares direct runtime dependencies on [Schemastery](https://github.com/shigma/schemastery) `^3.18.1`, [bonjour-service](https://github.com/onlxltd/bonjour-service)
|
|
11
|
+
The npm package declares direct runtime dependencies on [Schemastery](https://github.com/shigma/schemastery) `^3.18.1`, [bonjour-service](https://github.com/onlxltd/bonjour-service) `1.4.4`, [qrcode](https://github.com/soldair/node-qrcode) `^1.5.4`, and [selfsigned](https://github.com/jfromaniello/selfsigned) `^5.5.0`. These packages are distributed under the MIT License; the release checkout's exact transitive versions appear in the attached CycloneDX npm SBOM.
|
|
12
12
|
|
|
13
|
-
The Android App runtime contains [Kotlin standard library](https://github.com/JetBrains/kotlin) `2.1.0`, [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) `1.6.4`, [JetBrains annotations](https://github.com/JetBrains/java-annotations) `13.0`, [AndroidX Core](https://developer.android.com/jetpack/androidx/releases/core) `1.15.0`, [AndroidX WebKit](https://developer.android.com/jetpack/androidx/releases/webkit) `1.
|
|
13
|
+
The Android App runtime contains [Kotlin standard library](https://github.com/JetBrains/kotlin) `2.1.0`, [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) `1.6.4`, [JetBrains annotations](https://github.com/JetBrains/java-annotations) `13.0`, [AndroidX Core](https://developer.android.com/jetpack/androidx/releases/core) `1.15.0`, [AndroidX WebKit](https://developer.android.com/jetpack/androidx/releases/webkit) `1.17.1`, their AndroidX transitive components, [Guava listenablefuture](https://github.com/google/guava) `1.0`, and [ZXing Core](https://github.com/zxing/zxing) `3.5.4`. These runtime libraries are distributed under the Apache License 2.0; the exact resolved tree is attached to each release as `dsh-mobile-android-v<version>-dependencies.txt`.
|
|
14
14
|
|
|
15
15
|
## core-js browser compatibility bundle
|
|
16
16
|
|