dsh-mobile 0.6.8 → 0.6.10
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 -3
- package/CONTRIBUTORS.md +6 -3
- package/README.en.md +15 -7
- package/README.md +15 -7
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/apps/mobile/README.md +11 -7
- package/apps/mobile/release.json +3 -3
- package/docs/CADDY_MANAGED.en.md +21 -17
- package/docs/CADDY_MANAGED.md +21 -17
- package/docs/README.md +3 -3
- package/docs/SELF_HOSTED_FRP.en.md +1 -1
- package/docs/SELF_HOSTED_FRP.md +1 -1
- package/docs/SELF_HOSTED_ORIGIN.en.md +3 -1
- package/docs/SELF_HOSTED_ORIGIN.md +4 -2
- package/lib/client.js +63 -50
- package/lib/client.js.map +1 -1
- package/lib/index.mjs +214 -46
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
- package/packages/question-fixes/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
Notable changes are recorded here. GitHub Releases provide the downloadable packages and generated commit notes.
|
|
4
4
|
|
|
5
|
+
## 0.6.10 - 2026-10-16
|
|
6
|
+
|
|
7
|
+
- Preserve the first Funnel failure and its validated official authorization URL instead of replacing them with a later process-exit error. Discard queued events from the failed connection while allowing an explicit reconnect to start a new one. Failed resource cleanup remains visible and can be retried without discarding owned resources.
|
|
8
|
+
- Keep unmapped remote-controller error codes visible in localized diagnostics instead of rendering an empty error description. Thanks @Anyways366 for the detailed report and reproduction in [#223](https://github.com/saya-ch/dsh-mobile/issues/223).
|
|
9
|
+
- Clarify that custom file drops need iterable file items as well as files, and that successful event dispatch is not confirmation that DSH added the attachment. Thanks @Void-LifeStream for the extension findings and follow-up verification in [#205](https://github.com/saya-ch/dsh-mobile/issues/205).
|
|
10
|
+
- Android App remains independently published as 0.6.4 (build 80); these plugin changes do not require another APK.
|
|
11
|
+
|
|
12
|
+
## 0.6.9 - 2026-10-15
|
|
13
|
+
|
|
14
|
+
- Enable optional managed Caddy installation on Windows/Linux x64 with independently verified official component URLs, lengths and SHA-256 pins. Tencent Cloud DNSPod credentials, a domain and reachable public ingress are required; existing Cloudflared tunnels and external proxies remain available. Thanks @abworks-dev for the original managed-Caddy contributions in [#176](https://github.com/saya-ch/dsh-mobile/pull/176), [#184](https://github.com/saya-ch/dsh-mobile/pull/184), [#185](https://github.com/saya-ch/dsh-mobile/pull/185) and [#190](https://github.com/saya-ch/dsh-mobile/pull/190).
|
|
15
|
+
- Refresh managed Caddy component inputs to Caddy 2.11.7, Go 1.26.9 and an explicit golang.org/x/net 0.60.0 pin, retaining exact source, checksum and embedded dependency checks.
|
|
16
|
+
- Use explicit single-maintainer manual component publication instead of mandatory second-person approval. Preserve exact tag/source binding, same-run Windows/Linux native gates, draft/public asset verification and occupied-release protection; component publication does not publish npm or Android automatically.
|
|
17
|
+
- Cancel and drain accepted Caddy component work during plugin unload, retain recoverable files on failure, and wait for the owned Caddy process's actual close event before releasing it. Failed cleanup remains visible and retryable.
|
|
18
|
+
- Cover native CaddyController startup/shutdown and HTTP/1.1/HTTP/2 POST responses that remain quiet for more than 60 seconds, including exact response bytes and one upstream request per operation. These isolated checks do not establish public DNS-01 issuance or certificate renewal for the fixed component.
|
|
19
|
+
- Document scoped custom CSS selectors and same-page comparisons before applying older overrides. Current header behavior is retained rather than hiding working actions. Thanks @Void-LifeStream for [#219](https://github.com/saya-ch/dsh-mobile/issues/219).
|
|
20
|
+
- Android App remains the independently published 0.6.4 (build 80); these changes do not require another APK.
|
|
21
|
+
|
|
5
22
|
## 0.6.8 - 2026-10-15
|
|
6
23
|
|
|
7
24
|
- Fix remote pairing on computers with the same default state path overwriting one another in the Android device list. Automatically identified entries without a pairing CA use their persisted random installation identifier for new pairings; explicit operator IDs, LAN CA fingerprints and self-signed FRP CA fingerprints remain unchanged.
|
|
@@ -10,7 +27,7 @@ Notable changes are recorded here. GitHub Releases provide the downloadable pack
|
|
|
10
27
|
- Keep working pairings without re-pairing. A local App credential already overwritten by the collision cannot be recovered automatically: update and restart the plugin, then pair each affected computer again. Usable old rows remain valid; any duplicate local row can be removed explicitly without computer-side revocation.
|
|
11
28
|
- Adapt compatibility checks to DSH 0.2.1-alpha.3's authenticated Host-backed settings while retaining the Remote/Connection dependency checks and earlier settings policies. Mobile typography remains local to its Origin. Extend the browser test matrix to alpha.3 and recognize its first-run account dialog without submitting credentials.
|
|
12
29
|
- Add bilingual remote-channel selection notes distinguishing the maintainer's long-term network experience from provider limits and conditional self-hosted deployment characteristics.
|
|
13
|
-
- Android App 0.6.3
|
|
30
|
+
- At this plugin release, Android App 0.6.3 was still the published native version; Android 0.6.4 was published independently later on the same day. Its file-picker changes are not part of this plugin fix. Thanks @Yurzi for reporting [#213](https://github.com/saya-ch/dsh-mobile/issues/213).
|
|
14
31
|
|
|
15
32
|
## 0.6.7 - 2026-10-14
|
|
16
33
|
|
|
@@ -22,10 +39,12 @@ Notable changes are recorded here. GitHub Releases provide the downloadable pack
|
|
|
22
39
|
- Clarify `/mobile` and both READMEs: detected files are not proof of page activation; ordinary DSH login or phone-sized preview does not establish mobile pairing. Thanks @Dantezcx for the detailed reports in [#209](https://github.com/saya-ch/dsh-mobile/issues/209) and [#210](https://github.com/saya-ch/dsh-mobile/issues/210).
|
|
23
40
|
- Thanks @GavinQiEr for the request in [#207](https://github.com/saya-ch/dsh-mobile/issues/207) and implementation in [#208](https://github.com/saya-ch/dsh-mobile/pull/208); the original author commit is retained alongside maintainer corrections.
|
|
24
41
|
|
|
25
|
-
##
|
|
42
|
+
## Android 0.6.4 - 2026-10-15
|
|
26
43
|
|
|
27
44
|
- Prefer the system Photo Picker on Android 13+ for supported image requests, with document selection for other requests or an unavailable picker. Preserve multi-selection, MIME filtering and selected URI results without adding storage permission or forcing a vendor gallery.
|
|
28
|
-
- Bind standard file callbacks to the active WebView, Origin and document. Cancel them on navigation or teardown and prevent old results from consuming a newer request.
|
|
45
|
+
- Bind standard file callbacks to the active WebView, Origin and document. Cancel them on navigation or teardown and prevent old results from consuming a newer request. This native update is released independently from plugin 0.6.8 and preserves existing paired records.
|
|
46
|
+
- On WebViews with navigation-listener support, settle file requests before replacing their document and pause new selection until all in-flight document navigations finish, including cancelled and non-committing navigations. This prevents a late cancellation from disabling the new page's file input. Older providers retain their available callbacks; update WebView or reopen the paired computer if selection still fails after changing pages.
|
|
47
|
+
- Retain the package identity, established release signer, permission list and native pairing protocol. Thanks @Void-LifeStream for the attachment report in [#205](https://github.com/saya-ch/dsh-mobile/issues/205), and @xhwxt for the document-picker proposal in [#203](https://github.com/saya-ch/dsh-mobile/pull/203).
|
|
29
48
|
|
|
30
49
|
## 0.6.6 - 2026-10-14
|
|
31
50
|
|
package/CONTRIBUTORS.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# 贡献者 / Contributors
|
|
2
2
|
|
|
3
|
-
GitHub 的 [Contributors 图表](https://github.com/saya-ch/dsh-mobile/graphs/contributors) 按进入默认分支的提交自动统计,无法手动加入仅提交 issue 或 PR 提案的成员。本页按截至 2026-10-
|
|
3
|
+
GitHub 的 [Contributors 图表](https://github.com/saya-ch/dsh-mobile/graphs/contributors) 按进入默认分支的提交自动统计,无法手动加入仅提交 issue 或 PR 提案的成员。本页按截至 2026-10-16 的实际参与方式感谢社区成员;仓库维护者与自动依赖更新仍可在 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-10-
|
|
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-10-16. The repository maintainer and automated dependency updates remain visible in GitHub's history.
|
|
6
6
|
|
|
7
7
|
## 0.6.7 代码贡献 / Code contributions in 0.6.7
|
|
8
8
|
|
|
@@ -64,6 +64,8 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
64
64
|
|
|
65
65
|
## 问题反馈与建议 / Issue reports and ideas
|
|
66
66
|
|
|
67
|
+
感谢 [@Anyways366](https://github.com/Anyways366) 在 [#223](https://github.com/saya-ch/dsh-mobile/issues/223) 提供 Funnel 错误覆盖和诊断信息缺失的详细复现与修正建议。 / Thanks [@Anyways366](https://github.com/Anyways366) for the detailed Funnel error-overwrite and missing-diagnostic reproduction and proposed corrections in [#223](https://github.com/saya-ch/dsh-mobile/issues/223).
|
|
68
|
+
|
|
67
69
|
感谢 [@Yurzi](https://github.com/Yurzi) 在 [#213](https://github.com/saya-ch/dsh-mobile/issues/213) 报告不同电脑的远程配对记录互相覆盖。 / Thanks [@Yurzi](https://github.com/Yurzi) for reporting remote pairing records on different computers overwriting one another in [#213](https://github.com/saya-ch/dsh-mobile/issues/213).
|
|
68
70
|
|
|
69
71
|
感谢 [@Dantezcx](https://github.com/Dantezcx) 在 [#209](https://github.com/saya-ch/dsh-mobile/issues/209) 和 [#210](https://github.com/saya-ch/dsh-mobile/issues/210) 提供侧栏命中、短屏布局和定制资源加载的详细诊断。 / Thanks [@Dantezcx](https://github.com/Dantezcx) for the detailed sidebar hit-testing, short-viewport and customization-loading diagnostics in [#209](https://github.com/saya-ch/dsh-mobile/issues/209) and [#210](https://github.com/saya-ch/dsh-mobile/issues/210).
|
|
@@ -80,6 +82,7 @@ Thanks [@xhwxt](https://github.com/xhwxt) for the document-picker proposal in [#
|
|
|
80
82
|
| [@2647954284](https://github.com/2647954284) | [#199](https://github.com/saya-ch/dsh-mobile/issues/199) |
|
|
81
83
|
| [@abworks-dev](https://github.com/abworks-dev) | [#174](https://github.com/saya-ch/dsh-mobile/issues/174) |
|
|
82
84
|
| [@Ann-luo](https://github.com/Ann-luo) | [#150](https://github.com/saya-ch/dsh-mobile/issues/150) |
|
|
85
|
+
| [@Anyways366](https://github.com/Anyways366) | [#223](https://github.com/saya-ch/dsh-mobile/issues/223) |
|
|
83
86
|
| [@azri57806-design](https://github.com/azri57806-design) | [#97](https://github.com/saya-ch/dsh-mobile/issues/97) |
|
|
84
87
|
| [@BrainZombie](https://github.com/BrainZombie) | [#128](https://github.com/saya-ch/dsh-mobile/issues/128) |
|
|
85
88
|
| [@CESAEREE](https://github.com/CESAEREE) | [#1](https://github.com/saya-ch/dsh-mobile/issues/1) |
|
|
@@ -115,7 +118,7 @@ Thanks [@xhwxt](https://github.com/xhwxt) for the document-picker proposal in [#
|
|
|
115
118
|
| [@sortjiajun](https://github.com/sortjiajun) | [#90](https://github.com/saya-ch/dsh-mobile/issues/90) |
|
|
116
119
|
| [@StrawberryAO](https://github.com/StrawberryAO) | [#39](https://github.com/saya-ch/dsh-mobile/issues/39) |
|
|
117
120
|
| [@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) |
|
|
118
|
-
| [@Void-LifeStream](https://github.com/Void-LifeStream) | [#205](https://github.com/saya-ch/dsh-mobile/issues/205) |
|
|
121
|
+
| [@Void-LifeStream](https://github.com/Void-LifeStream) | [#205](https://github.com/saya-ch/dsh-mobile/issues/205), [#219](https://github.com/saya-ch/dsh-mobile/issues/219) |
|
|
119
122
|
| [@WalkerJay666](https://github.com/WalkerJay666) | [#201](https://github.com/saya-ch/dsh-mobile/issues/201) |
|
|
120
123
|
| [@up-and-down-0618](https://github.com/up-and-down-0618) | [#115](https://github.com/saya-ch/dsh-mobile/issues/115) |
|
|
121
124
|
| [@taki-ohh](https://github.com/taki-ohh) | [#19](https://github.com/saya-ch/dsh-mobile/issues/19) |
|
package/README.en.md
CHANGED
|
@@ -25,20 +25,20 @@
|
|
|
25
25
|
<a href="#security">Security</a> ·
|
|
26
26
|
<a href="#compatibility">Compatibility</a> ·
|
|
27
27
|
<a href="#contributors">Contributors</a> ·
|
|
28
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.6.
|
|
28
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.6.10">Release notes</a> ·
|
|
29
29
|
<a href="README.md">简体中文</a>
|
|
30
30
|
</p>
|
|
31
31
|
|
|
32
32
|
> DSH Mobile is a DeepSeek Harness community plugin; the native app supports Android only.
|
|
33
33
|
>
|
|
34
|
-
> **Current stable release: 0.6.
|
|
34
|
+
> **Current stable release: 0.6.10**. Preserve Tailscale Funnel's specific failure and authorization entry when its process exits, restore error codes and actionable guidance in all three diagnostic languages, and clarify extension file delivery. Existing remote channels and pairings are retained; no Android app update is required. [Release notes and downloads](https://github.com/saya-ch/dsh-mobile/releases/tag/v0.6.10) · [Full changelog](CHANGELOG.md).
|
|
35
35
|
>
|
|
36
36
|
> **Version policy**: since plugin **0.6.2**, the Android app and plugin use independent version numbers and releases. Their numbers do not need to match, and a plugin update does not imply an app update. [Compatibility notes](#compatibility).
|
|
37
37
|
|
|
38
38
|
<p align="center">
|
|
39
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.6.
|
|
40
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.6.
|
|
41
|
-
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.6.
|
|
39
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.6.4/dsh-mobile-android-v0.6.4.apk"><img src="https://raw.githubusercontent.com/saya-ch/dsh-mobile/main/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/android-v0.6.4/dsh-mobile-android-v0.6.4.apk"><strong>Download Android app 0.6.4</strong></a><br>
|
|
41
|
+
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.6.4">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. 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.
|
|
@@ -52,7 +52,7 @@ It also lets you customize the phone from a DSH conversation: `/mobile <what you
|
|
|
52
52
|
- **Continue DSH work from a phone**: the same sessions, Workspaces, messages, and tools, in real time.
|
|
53
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
|
-
- **Several remote options**: Tailscale, cpolar, cloudflared quick/named tunnels, self-hosted FRP, or your own reverse proxy.
|
|
55
|
+
- **Several remote options**: Tailscale, cpolar, cloudflared quick/named tunnels, self-hosted FRP, or your own reverse proxy; Windows/Linux x64 can also let the plugin manage Caddy HTTPS and certificates.
|
|
56
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.
|
|
@@ -162,13 +162,14 @@ The usage notes below reflect the maintainer's long-term experience on a persona
|
|
|
162
162
|
| Tailscale Funnel | Sign-in and Funnel authorization | Availability depends on the network | This personal network often needs proxy assistance and may still fail to connect; not every user needs a proxy |
|
|
163
163
|
| Self-hosted FRP | VPS and domain or real public IPv4 | Server maintenance required; [deploy](docs/SELF_HOSTED_FRP.en.md) or [attach to existing frps](docs/ATTACH_EXISTING_FRPS.en.md) | More control over deployment and resources; long-term stability depends on the VPS route, configuration and maintenance |
|
|
164
164
|
| Own reverse proxy | Existing public HTTPS proxy | The plugin provides only its private authenticated backend; [guide](docs/SELF_HOSTED_ORIGIN.en.md) | Reuses your proxy infrastructure; stability depends on the proxy, network route and maintenance |
|
|
165
|
+
| Managed Caddy | Tencent Cloud DNSPod-managed domain and reachable public ingress | Plugin-managed HTTPS and certificates on Windows/Linux x64; [guide](docs/CADDY_MANAGED.en.md) | Does not traverse NAT; check inbound ports and forwarding. Existing Cloudflared users do not need to migrate |
|
|
165
166
|
|
|
166
167
|
<p align="center">
|
|
167
168
|
<img src="https://raw.githubusercontent.com/saya-ch/dsh-mobile/main/assets/screenshots/remote-access-en.png" width="82%" alt="DSH Mobile remote access and provider selection">
|
|
168
169
|
</p>
|
|
169
170
|
|
|
170
171
|
1. Open **Mobile Access → Remote** in the lower-left corner of DeepSeek Harness, choose a channel and complete its sign-in or configuration.
|
|
171
|
-
2. Once ready, select **Create remote pairing QR code**.
|
|
172
|
+
2. Once ready, select **Create remote pairing QR code**. External proxy mode's **Backend listening** does not establish public readiness; verify public HTTPS and WebSocket access as well.
|
|
172
173
|
3. Select **Remote access** in the Android app and scan the current QR code. A publicly trusted certificate also permits pairing from a mobile browser.
|
|
173
174
|
4. Later launches reconnect using the saved address and credential. If a temporary address changes, scan the current computer QR code to verify it. Do not clear app data; the stored device token never goes to a new Origin.
|
|
174
175
|
|
|
@@ -180,6 +181,7 @@ After selecting the channel in the panel:
|
|
|
180
181
|
- **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.
|
|
181
182
|
- **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. Use manual deployment and merge the import as described in the guide when custom Caddy sites already exist. 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.
|
|
182
183
|
- **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).
|
|
184
|
+
- **Managed Caddy**: under **Self-hosted connection → Own reverse proxy**, select **Managed Caddy**, choose **Install managed Caddy**, and confirm the download. Enter the public HTTPS origin, Tencent Cloud DNSPod credentials and local HTTPS listen port, then choose **Save and start Caddy**. A domain and reachable public ingress are required; this does not bypass CGNAT. See the [managed Caddy guide](docs/CADDY_MANAGED.en.md) for forwarding and complete steps.
|
|
183
185
|
- **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.
|
|
184
186
|
- **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).
|
|
185
187
|
|
|
@@ -218,10 +220,14 @@ Two kinds of changes are supported: the phone UI itself (theme, layout, buttons)
|
|
|
218
220
|
|
|
219
221
|
Open customizations through the **Mobile Access pairing entry**. Opening an ordinary DSH page or selecting a phone-sized browser viewport is not mobile pairing, and a file's presence does not establish that the current page loaded it. If extension requests return `401`, check the entry and pairing state; do not enable anonymous access or share Cookies or Tokens.
|
|
220
222
|
|
|
223
|
+
An old `mobile.css` patch can override a newer built-in fix. Back up that file and compare the same session, orientation and font settings with and without its styles before adding more rules. Scope CSS Modules selectors to an inspected ancestor, such as `[data-dsh-mobile-header] [class*="_titleRow"]`, rather than matching bare class suffixes/substrings across the page. Hiding an action area with `display: none` removes access to its controls; it is not a collapsible presentation. Thanks for the controlled comparison in [#219](https://github.com/saya-ch/dsh-mobile/issues/219).
|
|
224
|
+
|
|
221
225
|
Extension manifests, scripts, styles, and assets are revisioned. When the plugin observes a `/mobile` or extension-file change, it notifies authenticated phones to refresh immediately; 45-second visible and 5-minute hidden checks remain only as recovery fallbacks. A failed Host staging pass keeps the current version; if the Host has changed but the new phone UI cannot activate, that extension closes and retries instead of mixing generations.
|
|
222
226
|
|
|
223
227
|
An extension action's `input` may use a callable Schemastery schema such as `api.schema.object(...)` or an adapter with `parse(value)`; mobile `api.host.invoke()` sends JSON explicitly, and the input is validated and normalized before the computer-side action runs.
|
|
224
228
|
|
|
229
|
+
Prefer DSH's built-in file upload for attachments. If an extension must simulate a drop, its `dataTransfer` needs iterable `items` (file items) as well as `files`; a `files` array alone is insufficient. Some WebViews have incomplete native drag-and-drop constructors; see the [plugin's file-delivery implementation](src/native-mobile.ts) for compatibility handling. An accepted `dragover` or successfully dispatched event does not confirm attachment delivery: check the composer's attachments and previews.
|
|
230
|
+
|
|
225
231
|
The 0.6.3 release adds optional [Worker execution](docs/EXTENSION_WORKERS.en.md) for trusted local JavaScript hosts. It is disabled by default, selectable by extension, and recovers explicitly without replaying interrupted actions. It is not a permission sandbox and does not require a matching App version.
|
|
226
232
|
|
|
227
233
|
<sub>You can even use an extension to connect to SillyTavern running on the same computer, give it a lightweight mobile frontend, and open it from the same app.</sub>
|
|
@@ -356,6 +362,7 @@ Three layers: the Host face for discovery, pairing, HTTPS, loopback proxying, an
|
|
|
356
362
|
- A remote origin is publicly reachable, but unpaired requests cannot enter DSH; turn the remote switch off when it is not needed.
|
|
357
363
|
- cpolar downloads a pinned official build only after confirmation and verifies its size and SHA-256. It installs no system service, PATH entry, or startup task, and plugin cleanup removes its managed files.
|
|
358
364
|
- cloudflared likewise downloads a pinned build from the official GitHub Release only after confirmation and verifies the exact size and SHA-256, and it launches the client with automatic updates disabled so the running binary is always the verified one. A quick tunnel needs no account, token, or DNS record; a named tunnel token is stored only in the plugin private directory and reaches cloudflared through the environment, and cleanup deletes every file it manages.
|
|
365
|
+
- Managed Caddy downloads a fixed component reviewed and published by DSH Mobile, only after confirmation, and checks its size, SHA-256, core and DNS module versions. DNS credentials and certificates stay in a private directory; no system service, PATH entry or system trust certificate is added. Removing the component preserves other channels and paired devices.
|
|
359
366
|
- Self-hosted FRP downloads pinned official `frpc` only after confirmation and verifies the origin, exact size, SHA-256, archive paths, and executable version. The shared token never appears in status, diagnostics, or attachment-plan responses. Copying a server template, or explicitly copying a token-bearing attach config after re-entering its token, places it on the system clipboard; clear it after use. Local cleanup removes only plugin-managed files. Managed VPS deployments require separate uninstall-script or one-click cleanup; attaching to an existing frps neither changes nor cleans up that VPS. Automatic deployment and server cleanup require SSH host-key verification against the VPS console.
|
|
360
367
|
- A paired device is a fully trusted DeepSeek Harness operator and can run tools on the computer; revoke lost devices from the computer.
|
|
361
368
|
- The mobile gateway proxies requests as a local DSH operator and supports `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, and `DELETE` on ordinary plugin routes; writes still require a paired Session, exact Origin, and CSRF validation. Third-party plugins must not treat the upstream loopback Host as proof that the client is physically local to the computer.
|
|
@@ -392,6 +399,7 @@ Version 0.5.2 keeps the DSH host peer names but does not block installation by D
|
|
|
392
399
|
| cloudflared quick/named tunnel | Yes (on-demand) | Yes (on-demand) | Yes (on-demand) | Yes, x64/arm64 (on-demand) |
|
|
393
400
|
| Self-hosted FRP | Yes (on-demand) | Yes (on-demand) | Yes (on-demand) | Yes (on-demand) |
|
|
394
401
|
| Own reverse proxy | Yes (config only) | Yes (config only) | Yes (config only) | Yes (config only) |
|
|
402
|
+
| Managed Caddy | Yes (on-demand) | Yes (on-demand) | No | No |
|
|
395
403
|
|
|
396
404
|
On macOS, local network, cloudflared, self-hosted FRP and the own reverse proxy work; Funnel and cpolar have no managed macOS component yet. The diagnostics firewall check currently covers Windows only and reports “not applicable” elsewhere.
|
|
397
405
|
|
package/README.md
CHANGED
|
@@ -25,20 +25,20 @@
|
|
|
25
25
|
<a href="#安全">安全</a> ·
|
|
26
26
|
<a href="#兼容性">兼容性</a> ·
|
|
27
27
|
<a href="#贡献者">贡献者</a> ·
|
|
28
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.6.
|
|
28
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.6.10">更新记录</a> ·
|
|
29
29
|
<a href="README.en.md">English</a>
|
|
30
30
|
</p>
|
|
31
31
|
|
|
32
32
|
> DSH Mobile 是 DeepSeek Harness 社区插件,原生 App 仅支持 Android。
|
|
33
33
|
>
|
|
34
|
-
> **当前正式版本:0.6.
|
|
34
|
+
> **当前正式版本:0.6.10**。修复 Tailscale Funnel 的具体错误与授权入口被退出通知覆盖,补齐三语诊断中的错误码和操作说明,并完善扩展文件投递指南。已有远程通道和配对保留,无需更新 Android App。[更新与下载](https://github.com/saya-ch/dsh-mobile/releases/tag/v0.6.10) · [完整更新记录](CHANGELOG.md)。
|
|
35
35
|
>
|
|
36
36
|
> **版本说明**:自插件 **0.6.2** 起,Android App 与插件独立编号、独立发布,版本号无需一致;插件升级不代表 App 需要同步升级。[兼容说明](#兼容性)。
|
|
37
37
|
|
|
38
38
|
<p align="center">
|
|
39
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.6.
|
|
40
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.6.
|
|
41
|
-
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.6.
|
|
39
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.6.4/dsh-mobile-android-v0.6.4.apk"><img src="https://raw.githubusercontent.com/saya-ch/dsh-mobile/main/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/android-v0.6.4/dsh-mobile-android-v0.6.4.apk"><strong>下载 Android App 0.6.4</strong></a><br>
|
|
41
|
+
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.6.4">版本说明与校验文件</a></sub>
|
|
42
42
|
</p>
|
|
43
43
|
|
|
44
44
|
DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App 通过局域网,或可选的 Tailscale Funnel、cpolar、cloudflared、自建 FRP 或自有反向代理远程通道连接电脑,继续使用同一份会话、工作区、消息和工具。电脑端分别启停局域网与远程访问、分别管理配对授权;Android App 统一显示已配对电脑。插件不修改 DeepSeek Harness 源码。
|
|
@@ -52,7 +52,7 @@ DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App
|
|
|
52
52
|
- **在手机上继续电脑端的工作**:同一份会话、工作区、消息和工具,实时同步。
|
|
53
53
|
- **用对话定制手机端**:在 DSH 对话里提出布局、交互或功能需求;文件修改完成后,手机页面通常会自动刷新。
|
|
54
54
|
- **专属触屏布局**:会话抽屉、工具详情、设置、提问卡片和输入栏都按手机重新组织;App 跟随系统语言(简/英/意),插件界面跟随 DSH 语言。
|
|
55
|
-
- **多种远程通道**:Tailscale、cpolar、cloudflared 快速/命名隧道、自建 FRP
|
|
55
|
+
- **多种远程通道**:Tailscale、cpolar、cloudflared 快速/命名隧道、自建 FRP、自有反向代理,按网络任选;Windows/Linux x64 还可由插件托管 Caddy HTTPS 与证书。
|
|
56
56
|
- **配对与多设备**:扫码、链接或密钥配对一次;切换 Wi-Fi、热点或 IP 后通常自动恢复;App 在一个列表中显示局域网和远程配对的电脑,定期检测可达状态,并支持切换、重新配对或删除本地记录。
|
|
57
57
|
- **一键诊断与放行**:检查版本、网关、网卡、防火墙和远程通道,生成脱敏报告;被拦截的第三方插件连接按确切路径一键放行。
|
|
58
58
|
- **任务系统通知**:任务完成与待输入以 Android 系统通知提醒,可在 App 内的 DSH“通用设置”中开启,锁屏文本脱敏。
|
|
@@ -162,13 +162,14 @@ dsh plugin --profile web add dshmarket
|
|
|
162
162
|
| Tailscale Funnel | Tailscale 登录与 Funnel 授权 | 实际可用性取决于网络 | 自用网络常需代理辅助,仍可能连接失败;并非所有用户都需要代理 |
|
|
163
163
|
| 自建 FRP | 已有 VPS,域名或真实公网 IPv4 | 需管理服务器;[部署](docs/SELF_HOSTED_FRP.md)或[接入既有 frps](docs/ATTACH_EXISTING_FRPS.md) | 部署与资源更可控,长期稳定性取决于 VPS 线路、配置与运维 |
|
|
164
164
|
| 自有反向代理 | 已有公开 HTTPS 代理 | 插件只提供私有认证后端;[配置指南](docs/SELF_HOSTED_ORIGIN.md) | 可沿用自己的代理设施,稳定性取决于代理、线路与运维 |
|
|
165
|
+
| 托管 Caddy | 腾讯云 DNSPod 管理的域名与公网入站 | 插件管理 HTTPS 与证书;Windows/Linux x64;[配置指南](docs/CADDY_MANAGED.md) | 不提供内网穿透,需自行确认入站端口和映射;已有 Cloudflared 用户不必迁移 |
|
|
165
166
|
|
|
166
167
|
<p align="center">
|
|
167
168
|
<img src="https://raw.githubusercontent.com/saya-ch/dsh-mobile/main/assets/screenshots/remote-access.png" width="82%" alt="DSH Mobile 远程访问与通道选择">
|
|
168
169
|
</p>
|
|
169
170
|
|
|
170
171
|
1. 在 DeepSeek Harness 左下角打开 **移动访问 → 远程**,按上表选择通道,完成登录或配置。
|
|
171
|
-
2. 状态变为“远程访问已就绪”后,点击
|
|
172
|
+
2. 状态变为“远程访问已就绪”后,点击 **生成远程配对二维码**。自备代理模式的“后端已监听”不等于公网就绪,仍需确认公网 HTTPS 与 WebSocket 可用。
|
|
172
173
|
3. 在 Android App 中选择 **远程访问**,扫描当前二维码完成配对;公开证书入口也可用手机浏览器打开配对链接。
|
|
173
174
|
4. 以后 App 使用保存的地址与凭据自动重连。临时地址改变时,重新扫描电脑端当前二维码验证新地址,不需要清除 App 数据;旧设备 token 不会发送给新 Origin。
|
|
174
175
|
|
|
@@ -180,6 +181,7 @@ dsh plugin --profile web add dshmarket
|
|
|
180
181
|
- **cpolar**:点击 **安装官方组件**,登录 cpolar 控制台取得 Authtoken,粘贴后点击 **保存并连接**。组件只会在确认后下载到插件私有目录;免费临时地址可能在 DSH 或 cpolar 重启后变化。
|
|
181
182
|
- **自建 FRP(高级)**:已有 VPS 时,展开 **自建连接**,填写 frps 信息和公开 HTTPS 域名或真实公网 IPv4。可以复制受限的 frps + Caddy 模板手动部署,也可以在 Ubuntu/Debian + systemd 上用 SSH 密钥一键部署;不支持密码登录。已有自定义 Caddy 站点时,请按指南手动部署并合并 import。部署或清理前须到 VPS 控制台核对主机指纹。本机 `frpc` 按需下载校验,VPS 需单独清理。需要 Android App 0.3.3 或更新版本;证书、端口和操作步骤见 [自建 FRP 使用指南](docs/SELF_HOSTED_FRP.md)。
|
|
182
183
|
- **自有反向代理**:展开 **自建连接 → 自有反向代理**,填写公网 HTTPS 地址(支持自定义端口)、私有监听 IPv4、独立 HTTP 后端端口(默认 3444)和代理来源 CIDR,再点击 **保存并启动后端**。适合已有 Lucky/Nginx/Caddy 的用户,无需隧道组件;需要 Android App 0.4.0 或更高版本。详见 [自有反向代理指南](docs/SELF_HOSTED_ORIGIN.md)。
|
|
184
|
+
- **托管 Caddy**:在 **自建连接 → 自有反向代理** 中选择 **托管 Caddy**,点击 **安装托管 Caddy** 并确认下载。填写公网 HTTPS 地址、腾讯云 DNSPod 凭据和本机 HTTPS 监听端口,再点击 **保存并启动 Caddy**。需要域名和可达的公网入站,不会替你穿透 CGNAT;端口映射与完整步骤见 [托管 Caddy 指南](docs/CADDY_MANAGED.md)。
|
|
183
185
|
- **cloudflared 快速隧道**:点击 **安装官方组件**,插件在确认后从官方发布页下载固定版本到插件私有目录,随后自动申请一个临时公网地址(quick tunnel),**无需注册或登录**。适合不想注册账号的用户;quick tunnel 地址每次重连都会变化,官方定位为测试用途、有限流且无可用性保证,请勿用于必须长期可达的生产访问,只适合临时或验证场景。
|
|
184
186
|
- **cloudflared 命名隧道**:已有 Cloudflare 账号和域名时,把隧道类型切到 **命名隧道**,填入连接器令牌、公网域名与本机转发端口,即可获得重启后不变的固定地址(令牌只存私有目录、只经环境变量传给 cloudflared)。步骤见 [Cloudflare 命名隧道](docs/CLOUDFLARE_TUNNEL.md)。
|
|
185
187
|
|
|
@@ -218,10 +220,14 @@ Funnel 的运行组件把公开监听生命周期绑定到父进程和受限控
|
|
|
218
220
|
|
|
219
221
|
定制需要从 **移动访问的配对入口**进入。直接打开普通 DSH 网页或调整浏览器为手机视口,不等于完成移动配对;文件存在也不代表当前页面已加载。若扩展接口返回 `401`,先核对入口与配对状态,不要开放匿名访问或公开 Cookie、Token。
|
|
220
222
|
|
|
223
|
+
旧的 `mobile.css` 补丁可能覆盖新版内置修复。排查布局时先备份文件,在同一会话、方向和字号下对比有无该样式的效果,不要先叠加更多规则。匹配 CSS Modules 类名时应限定到已核对的区域祖先,例如 `[data-dsh-mobile-header] [class*="_titleRow"]`,不要裸用后缀/子串选择器;用 `display: none` 隐藏操作区会移除其中功能,不等于折叠。感谢 [#219](https://github.com/saya-ch/dsh-mobile/issues/219) 提供的对照记录。
|
|
224
|
+
|
|
221
225
|
扩展清单及其脚本、样式和资源按版本标识刷新。插件监听到 `/mobile` 或扩展文件变化后,会通过已认证连接通知手机立即更新;页面可见时每 45 秒、隐藏时每 5 分钟的检查只作为断线兜底。Host 暂存失败会继续使用现有版本;若 Host 已更新但新手机界面激活失败,则关闭该扩展并自动重试,避免混用新旧能力。
|
|
222
226
|
|
|
223
227
|
扩展动作的 `input` 可以直接使用 `api.schema.object(...)` 等 Schemastery schema,也可以使用带 `parse(value)` 的适配器;手机端 `api.host.invoke()` 会按 JSON 请求发送,输入会在电脑端动作执行前完成校验和规范化。
|
|
224
228
|
|
|
229
|
+
附件功能优先复用 DSH 自带的文件上传。扩展若需模拟拖放,`dataTransfer` 除了 `files`,还须提供可迭代的 `items`(文件项列表),不能只拼一个 `files` 数组。部分 WebView 的原生拖放构造不完整,兼容处理可参考[插件内的文件投递实现](src/native-mobile.ts);`dragover` 接受或事件派发成功不代表附件已加入,应检查输入框中的附件与预览。
|
|
230
|
+
|
|
225
231
|
0.6.3 新增可选的 [Worker 执行模式](docs/EXTENSION_WORKERS.md),用于约束可信本地扩展的 JavaScript 阻塞;默认关闭,按扩展选择,故障后显式恢复,不自动重放操作。这不是权限沙箱,也不要求 App 同步版本。
|
|
226
232
|
|
|
227
233
|
<sub>你甚至可以通过扩展连接电脑上运行的酒馆,并从同一 App 打开它的简易移动前端。</sub>
|
|
@@ -357,6 +363,7 @@ flowchart LR
|
|
|
357
363
|
- 远程地址可从公网到达,但未配对请求无法进入 DSH;不使用时应关闭远程开关。
|
|
358
364
|
- cpolar 仅在用户确认后下载固定官方版本并校验大小和 SHA-256;不会安装系统服务、写入 PATH 或设置开机启动,插件清理会删除其托管文件。
|
|
359
365
|
- cloudflared 同样仅在用户确认后从官方 GitHub Release 下载固定版本并校验精确大小和 SHA-256,且启动时关闭自动更新,以保证运行的始终是已校验的那份二进制;快速隧道不需要账号、Token 或 DNS 记录;命名隧道令牌只存插件私有目录、只经环境变量传给 cloudflared,清理时删除插件托管的全部文件。
|
|
366
|
+
- 托管 Caddy 从 DSH Mobile 审核发布的固定组件下载,安装前需确认,下载后校验大小、SHA-256、核心与 DNS 模块版本。DNS 凭据和证书保存在私有目录,不安装系统服务、不修改 PATH 或系统证书信任;移除组件不会删除其他通道和设备配对。
|
|
360
367
|
- 自建 FRP 仅在用户确认后从官方 Release 下载固定版本 `frpc`,校验来源、精确大小、SHA-256、压缩包路径和可执行文件版本;共享 Token 不会出现在状态、诊断或接入清单响应中。复制服务器模板,或重新输入 Token 后显式复制含 Token 的接入配置时,它会进入系统剪贴板,请粘贴后及时清除。本机清理只删除插件管理的文件;托管部署的 VPS 需用面板卸载脚本或一键清理单独清除,接入既有 frps 则不会改动或清理你的 VPS。自动部署与一键清理前都需核对 SSH 主机指纹。
|
|
361
368
|
- 配对设备拥有控制电脑端 DeepSeek Harness 的能力,应视为完全可信设备;丢失手机后应在电脑端撤销设备。
|
|
362
369
|
- 移动网关以 DSH 本机操作者身份代理请求,支持普通插件路由的 `GET`、`HEAD`、`POST`、`PUT`、`PATCH`、`DELETE`;写请求仍校验配对 Session、精确 Origin 与 CSRF。第三方插件不能把上游回环 Host 当成请求来自电脑物理本机的证明。
|
|
@@ -393,6 +400,7 @@ flowchart LR
|
|
|
393
400
|
| cloudflared 快速/命名隧道 | 支持(按需下载) | 支持(按需下载) | 支持(按需下载) | 支持 x64/arm64(按需下载) |
|
|
394
401
|
| 自建 FRP | 支持(按需下载) | 支持(按需下载) | 支持(按需下载) | 支持(按需下载) |
|
|
395
402
|
| 自有反向代理 | 支持(纯配置) | 支持(纯配置) | 支持(纯配置) | 支持(纯配置) |
|
|
403
|
+
| 托管 Caddy | 支持(按需下载) | 支持(按需下载) | 不支持 | 不支持 |
|
|
396
404
|
|
|
397
405
|
macOS 上局域网、cloudflared、自建 FRP 与自有反向代理可用;Funnel 与 cpolar 暂未提供 macOS 组件。诊断页的防火墙检查目前仅覆盖 Windows,其他系统显示“不适用”。
|
|
398
406
|
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -14,7 +14,7 @@ The optional [FRP](https://github.com/fatedier/frp) client is not included in th
|
|
|
14
14
|
|
|
15
15
|
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/).
|
|
16
16
|
|
|
17
|
-
The managed Caddy component is not included in the npm package or Android App.
|
|
17
|
+
The optional managed Caddy component is not included in the npm package or Android App. Since plugin 0.6.9, users on Windows/Linux x64 can explicitly confirm an on-demand download of the fixed [DSH Mobile component distribution](https://github.com/saya-ch/dsh-mobile/releases/tag/caddy-component-2.11.7-tencentcloud-0.4.3-r1); its source, exact size and SHA-256 are pinned in the plugin. This distribution builds [Caddy v2.11.7](https://github.com/caddyserver/caddy/blob/v2.11.7/LICENSE), under Apache License 2.0, with [caddy-dns/tencentcloud v0.4.3](https://github.com/caddy-dns/tencentcloud/blob/v0.4.3/LICENSE), under the MIT License. The component release supplies each platform's exact embedded dependency manifest, Go build metadata and complete third-party license/notice texts as separate assets. It is a DSH Mobile build, not an upstream Caddy release or a dynamically generated download. Existing user-managed proxies are separate from this optional component.
|
|
18
18
|
|
|
19
19
|
The npm package declares direct runtime dependencies on [Schemastery](https://github.com/shigma/schemastery) `^3.18.1`, [@noble/hashes](https://github.com/paulmillr/noble-hashes) `1.8.0`, [bonjour-service](https://github.com/onlxltd/bonjour-service) `1.4.4`, [qrcode](https://github.com/soldair/node-qrcode) `^1.5.4`, [selfsigned](https://github.com/jfromaniello/selfsigned) `^5.5.0`, and [ws](https://github.com/websockets/ws) `8.22.0`. These packages are distributed under the MIT License; the release checkout's exact transitive versions appear in the attached CycloneDX npm SBOM.
|
|
20
20
|
|
package/apps/mobile/README.md
CHANGED
|
@@ -6,11 +6,13 @@ DeepSeek Harness is the display name of this lightweight, community-maintained A
|
|
|
6
6
|
|
|
7
7
|
Android is the only supported native target. The iOS client remains an unpublished local experiment and is outside the build, release, and support scope.
|
|
8
8
|
|
|
9
|
-
The current stable app is **0.6.
|
|
9
|
+
The current stable app is **0.6.4** (build 80). The app and npm plugin update independently; plugin web UI or connection fixes do not require reinstalling the APK. Install a new signed release APK for native updates or when the app reports that its version is too old. Older official APKs with the same signer retain pairing during in-place upgrades; a differently signed Debug build cannot overwrite the official app.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## 0.6.4 update
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Build 80 uses the system Photo Picker on Android 13+ when the webpage requests a single supported image MIME filter. Multiple selection follows the system limit; unavailable pickers, older systems, capture requests and filters that cannot be represented exactly use the document picker instead. Document requests start directly and retain MIME and multiple settings. The App does not promise a particular manufacturer's gallery. Standard callbacks are bound to the current WebView, exact Origin and document; obsolete Activity results cannot complete a newer request. These native changes require App 0.6.4 or later and are released independently from the npm plugin.
|
|
14
|
+
|
|
15
|
+
WebViews with navigation-listener support cancel a pending standard file request before replacing the document and do not open another selector while a document navigation is in progress. Older providers use the available navigation callbacks; if file selection stops opening after changing pages, update WebView or return to the paired-computer list and reopen the page. Clearing App data is unnecessary.
|
|
14
16
|
|
|
15
17
|
## 0.6.3 update
|
|
16
18
|
|
|
@@ -93,7 +95,7 @@ Deleting a row removes the App's saved device token and pinned certificate, not
|
|
|
93
95
|
| TLS | LAN pins its pairing-key CA privately. The self-signed FRP entry requires a remote CA pin in app 0.4.6 or later. Both accept only an otherwise-untrusted, valid leaf for the exact Origin. Public-CA remote entries use platform trust; every other TLS error is cancelled. |
|
|
94
96
|
| Origin | Only scheme, normalized host, and port persist. Ordinary paths, queries, and fragments do not. |
|
|
95
97
|
| Navigation | Same-origin main frames stay inside; user-initiated external HTTPS links open in the system browser. |
|
|
96
|
-
| Permissions |
|
|
98
|
+
| Permissions | Standard file input uses the system Photo Picker or document picker according to Android version and the webpage's request, without storage permission. Camera permission is requested for QR scanning or photo capture; microphone permission is requested for DSH voice input. |
|
|
97
99
|
| Downloads | Foreground GET from the exact origin only; authentication control paths are never downloads. |
|
|
98
100
|
| Data | Android Keystore encrypts device records, including tokens, origins and pinned CAs; Web storage stays in the app sandbox. Deleting a device removes its record only; system clear-app-data removes all pairings and Web data. |
|
|
99
101
|
| Backup | App backup is disabled; TLS private keys and signing keys must remain outside the repository. |
|
|
@@ -106,7 +108,7 @@ The authenticated page can call the Android bridge through `dshMobile` extension
|
|
|
106
108
|
|
|
107
109
|
Available actions include `files.pick`, `camera.capture`, `share`, `clipboard.read`, `clipboard.write`, `notification.notify`, `notification.settings` and `mobile.switch-computer`. DSH keeps its file-attachment action in Add; Mobile adds camera capture there when the current attachment owner accepts images. The separate `files.pick` returns one file, follows the caller's MIME types and returns at most 8 MiB through the bridge; that is not a limit on DSH's file selector. Camera capture requests permission when used, writes a full-resolution JPEG through `FileProvider` and returns a browser `File`.
|
|
108
110
|
|
|
109
|
-
For ordinary DSH attachments, the
|
|
111
|
+
For ordinary DSH attachments, App 0.6.4 selects the system Photo Picker or document picker as described above, preserves the webpage's MIME and multiple-selection settings, and returns all selected items within the system picker limits. Available galleries and document providers depend on the device. This standard WebView path is independent of the extension `files.pick` action and its Bridge size limit. File-selection acceptance remains specific to the checked device, WebView provider and APK.
|
|
110
112
|
|
|
111
113
|
Task reminders use Host completion events and explicit pending-input cards while the page remains alive. Enable notifications or open system settings from DSH **Settings → General** inside the app. Lock-screen text is generic and tapping opens the app. Plugin 0.6.4 distinguishes full session and turn IDs, including long and non-ASCII IDs; earlier versions can replace notifications when their tags collide. Completion reminders require SSE and have no offline event replay; Cloudflare Quick Tunnels do not support the stream. See [channel limits](../../docs/CLOUDFLARE_TUNNEL.en.md#quick-tunnel-feature-limits).
|
|
112
114
|
|
|
@@ -135,11 +137,13 @@ Set-Location apps/mobile/android
|
|
|
135
137
|
./gradlew.bat :app:lintDebug :app:testDebugUnitTest :app:assembleDebug -x :app:lintAnalyzeDebugUnitTest -x :app:lintAnalyzeDebugAndroidTest
|
|
136
138
|
```
|
|
137
139
|
|
|
138
|
-
The debug APK is written to `app/build/outputs/apk/debug/app-debug.apk`. GitHub Releases build a signed release APK with a stable signing key stored only in repository secrets; signing keys and passwords never enter the source tree or build artifacts. The current signed release is [Android 0.6.
|
|
140
|
+
The debug APK is written to `app/build/outputs/apk/debug/app-debug.apk`. GitHub Releases build a signed release APK with a stable signing key stored only in repository secrets; signing keys and passwords never enter the source tree or build artifacts. The current signed release is [Android 0.6.4](https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.6.4), with SHA-256 `b28f2e832a8596df2fa1bfbad7dc36eef59d519c9e4875dd2be1ea4713804adf`.
|
|
139
141
|
|
|
140
142
|
## Acceptance
|
|
141
143
|
|
|
142
|
-
Shared URL-policy tests cover origin normalization, pairing entry, same-origin navigation and download paths. PJW110 with Android 16 and WebView
|
|
144
|
+
Shared URL-policy tests cover origin normalization, pairing entry, same-origin navigation and download paths. Local acceptance of the clean App 0.6.4 / build 80 Debug APK used PJW110 with Android 16 and Google WebView 153.0.8010.36. With the same retained WebView, the real DSH stock input reopened Documents after document replacement, rejected the old selection, and received the exact controlled PNG bytes with a decoded draft preview. A held main-document response also confirmed that selection was refused during navigation and reopened after HTTP 204 retained the old document. No model prompt was submitted. These USB-isolated Debug checks do not establish physical acceptance of the official-signer APK, public tunnels, HyperOS, older providers or other devices.
|
|
145
|
+
|
|
146
|
+
Earlier PJW110 checks with Android 16 and WebView 151 covered model-menu Back, rotation with draft/reference/image retention, known revocation through checks and restart, and re-pairing the same device. Those checks also used an isolated HTTPS instance over USB. A real VPS plus phone end-to-end test of the self-signed FRP entry has not been recorded; cutouts, font scaling, TLS failures, downloads and additional device/provider combinations still require their own acceptance.
|
|
143
147
|
|
|
144
148
|
A 0.5.6 development build used to prepare 0.6.0 additionally verified in-place Debug upgrade with paired data retained, all seven Launcher choices, two isolated computers, explicit order surviving later connections, scanner buttons/double-tap zoom and camera release on this device. Physical pinch, real QR recognition, older-Android fallback and process-death restoration are not represented as completed device checks.
|
|
145
149
|
|
package/apps/mobile/release.json
CHANGED
package/docs/CADDY_MANAGED.en.md
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
[中文](CADDY_MANAGED.md)
|
|
4
4
|
|
|
5
|
-
>
|
|
5
|
+
> Since plugin 0.6.9, Windows/Linux x64 can install managed Caddy on demand for plugin-managed HTTPS and certificates. The component is a fixed build reviewed and published by DSH Mobile, not the Caddy custom-download service. Existing Cloudflared channels and external proxies remain available; no migration or Android app update is required.
|
|
6
6
|
|
|
7
7
|
## Requirements
|
|
8
8
|
|
|
9
9
|
Managed Caddy manages an HTTPS proxy and certificates; it is not a NAT traversal service. You need a domain with Tencent Cloud DNSPod DNS, a reachable public inbound port, and router forwarding to the DSH computer. DNS-01 cannot bypass CGNAT, campus isolation, or an unavailable inbound route. Use Cloudflare Tunnel, cpolar, or FRP on an existing VPS for those networks.
|
|
10
10
|
|
|
11
|
+
The panel currently configures DNS-01 only for Tencent Cloud DNSPod. Cloudflare DNS users can keep using Cloudflared without migrating DNS for this feature; do not enter a Cloudflared connector token in the Tencent Cloud credential fields.
|
|
12
|
+
|
|
11
13
|
```text
|
|
12
14
|
Android App / browser → public HTTPS hostname (Caddy terminates TLS)
|
|
13
15
|
→ dedicated HTTP Gateway on 127.0.0.1
|
|
@@ -18,11 +20,15 @@ Android App / browser → public HTTPS hostname (Caddy terminates TLS)
|
|
|
18
20
|
|
|
19
21
|
These are upstream modes of the same own-proxy provider. External mode remains the default: you manage Lucky, Nginx, or Caddy, and the plugin provides the HTTP backend. Managed mode owns a separate Caddy child and loopback Gateway, stopping the previous mode before starting the next. External proxy settings and paired-device records are retained, never overwritten by managed settings.
|
|
20
22
|
|
|
21
|
-
Configure the public HTTPS origin, DNS-01 credentials and local HTTPS port separately. The public URL can use port 443 while the router forwards to local port 8443; the local port is what Caddy actually binds.
|
|
23
|
+
Configure the public HTTPS origin, DNS-01 credentials and local HTTPS port separately. The public URL can use port 443 while the router forwards to local port 8443; the local port is what Caddy actually binds. Its range is 1024–65535, excluding reserved ports 3080, 3443 and 3444. Check that it is unused and permit the required HTTPS ingress through the host firewall, router or cloud security group; never expose the loopback HTTP backend. Use a least-privilege DNS credential restricted to the required zone, not an account-wide cloud master key.
|
|
22
24
|
|
|
23
25
|
## Installation, startup, and readiness
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
1. On the computer, open **Mobile Access → Remote → Self-hosted connection → Own reverse proxy** and choose **Managed Caddy**.
|
|
28
|
+
2. Choose **Install managed Caddy** and confirm the download. The plugin downloads the fixed [DSH Mobile component distribution](https://github.com/saya-ch/dsh-mobile/releases/tag/caddy-component-2.11.7-tencentcloud-0.4.3-r1), checking its exact length, SHA-256, core and DNS module versions. Unavailable or invalid assets are not executed.
|
|
29
|
+
3. Enter the public HTTPS origin, such as `https://dsh.example.com`, select Tencent Cloud DNSPod, supply a `SecretId` and `SecretKey` with the required zone permissions, and set the local HTTPS port, such as `8443`. Point the domain at the public ingress and, where needed, forward public TCP 443 to port 8443 on the computer.
|
|
30
|
+
4. Choose **Save and start Caddy**. Installed is not ready: the panel reports readiness only after validating public HTTPS and confirming that the entry belongs to the current DSH instance.
|
|
31
|
+
5. Generate a remote pairing QR code and scan it from **Remote access** in the Android app, or open the pairing link in a mobile browser. Use the phone's cellular connection to check actual page loading, session synchronization and WebSockets; a computer-side health check alone does not establish phone access.
|
|
26
32
|
|
|
27
33
|
Initial DNS-01 issuance waits for DNS propagation and certificate issuance. Keep the computer online and avoid repeated restarts that can trigger issuer limits. Managed mode creates no system service, PATH entry, startup item, or system trust-store certificate. Caddy's admin API and configuration autosave are disabled.
|
|
28
34
|
|
|
@@ -30,13 +36,13 @@ Initial DNS-01 issuance waits for DNS propagation and certificate issuance. Keep
|
|
|
30
36
|
|
|
31
37
|
Settings and DNS credentials are atomically stored in the plugin's private directory. The Caddyfile contains environment placeholders, never the credentials. The child receives only necessary DNS credentials and runtime environment, not unrelated API secrets, proxy overrides, or admin-address overrides. Raw DNS module logs are not retained. Certificates, private keys, configuration caches, and runtime files also stay in the private directory.
|
|
32
38
|
|
|
33
|
-
Stopping access or changing provider waits for Caddy and Gateway termination, retaining settings. Confirming removal deletes the managed binary, DNS credentials, certificate keys, logs, and caches without deleting other providers, LAN settings, or paired-device data. Existing manually installed proxies are not owned or uninstalled by the plugin.
|
|
39
|
+
Stopping access or changing provider waits for Caddy and Gateway termination, retaining settings and certificates for the next connection. Confirming removal deletes the managed binary, DNS credentials, certificate keys, logs, and caches without deleting other providers, LAN settings, or paired-device data. A cleanup failure is reported and retains retryable state rather than claiming the deletion completed. Existing manually installed proxies are not owned or uninstalled by the plugin.
|
|
34
40
|
|
|
35
41
|
## Maintainer build and validation
|
|
36
42
|
|
|
37
43
|
Run these build and validation tools from a source checkout of this repository. The npm plugin package does not include these maintenance scripts; ordinary users do not need to compile Caddy.
|
|
38
44
|
|
|
39
|
-
The [builder](<../scripts/build-caddy-component.mjs>) fixes Go 1.26.
|
|
45
|
+
The [builder](<../scripts/build-caddy-component.mjs>) fixes Go 1.26.9, xcaddy v0.4.7, Caddy v2.11.7, Tencent Cloud DNS v0.4.3 and golang.org/x/net v0.60.0. The [input lock](<../scripts/caddy-component-lock.json>) freezes source revisions and compiled dependency versions/checksums. Each build uses fresh private compiler AND module caches, normal Go checksum verification, source-origin checks and retained-module verification. Unknown dependencies, replacements, wrong native settings or compiler versions fail closed before executing the generated Caddy.
|
|
40
46
|
|
|
41
47
|
Use the exact Go compiler (optionally through `GO_BINARY`); output directories must be new and absolute:
|
|
42
48
|
|
|
@@ -48,28 +54,26 @@ node scripts/compare-caddy-builds.mjs --first /absolute/new/first --second /abso
|
|
|
48
54
|
|
|
49
55
|
Windows uses native absolute paths and `--target win32-x64`. Reproducibility means identical executable bytes/size/SHA-256, not identical OS images or every rendered metadata/license file. The [workflow](<../.github/workflows/caddy-component.yml>) natively builds twice on Windows/Linux x64, validates complete evidence and tests the actually installed binary with an independent manifest. Tests cover real default inspection/promotion, no-redownload restart, corrupt-download rollback, TLS/pairing/API/WSS, durable device credentials and stopped-process owned cleanup while neighboring/pairing data survives. Other targets remain unreviewed.
|
|
50
56
|
|
|
51
|
-
PR and normal dispatch runs are read-only review-artifact builds. Only an explicit manual opt-in on an existing `caddy-component-2.11.
|
|
57
|
+
PR and normal dispatch runs are read-only review-artifact builds. Only an explicit manual opt-in on an existing `caddy-component-2.11.7-tencentcloud-0.4.3-review.N` tag in the authorized `abworks-dev/dsh-mobile` fork can publish a **TEST prerelease**, after both native jobs pass:
|
|
52
58
|
|
|
53
59
|
```sh
|
|
54
|
-
gh workflow run caddy-component.yml --repo abworks-dev/dsh-mobile --ref caddy-component-2.11.
|
|
60
|
+
gh workflow run caddy-component.yml --repo abworks-dev/dsh-mobile --ref caddy-component-2.11.7-tencentcloud-0.4.3-review.1 -f publish_review_prerelease=true
|
|
55
61
|
```
|
|
56
62
|
|
|
57
63
|
Component tags never start with `v`, avoiding the plugin release trigger. The separate write-permission job refuses occupied releases, creates a non-latest draft prerelease without asset clobbering, verifies an authenticated download of every draft asset against prepared bytes, then publishes. Assets include platform-distinct raw executables, manifests, build/module/version/license records, double-build proof, source-commit/run identity and SHA256SUMS. The [verifier](<../scripts/verify-caddy-release.mjs>) checks **every published asset** through GitHub metadata and the actual installer's HTTPS/validated-redirect downloader before emitting a review-only catalog. A failed post-publication check leaves the labelled prerelease public, fails the job and emits no catalog; it does not silently delete or roll back a release. Artifact retention is 14 days; release assets are separate.
|
|
58
64
|
|
|
59
|
-
The public custom-download endpoint returned v2.11.7 when v2.11.6 was requested; dynamic latest downloads are not a trust source. Versioned GitHub URLs can still be replaced by repository owners: exact reviewed byte/hash pins, not URL spelling or a remotely supplied checksum alone, define the content boundary. A fork catalog is only a review candidate; it never automatically populates the [production table](<../src/caddy-component.ts>).
|
|
60
|
-
|
|
61
|
-
### Official distribution is a separate, two-stage authorization
|
|
65
|
+
The public custom-download endpoint returned v2.11.7 when v2.11.6 was requested; dynamic latest downloads are not a trust source. Versioned GitHub URLs can still be replaced by repository owners: exact reviewed byte/hash pins, not URL spelling or a remotely supplied checksum alone, define the content boundary. A fork catalog is only a review candidate; it never automatically populates the [production table](<../src/caddy-component.ts>).
|
|
62
66
|
|
|
63
|
-
|
|
67
|
+
### Official distribution and installation enablement
|
|
64
68
|
|
|
65
|
-
|
|
69
|
+
A maintainer with repository publication access reviews the candidate and dispatches publication manually. One maintainer is sufficient: a second approver and a preconfigured GitHub Environment are not required. Both publication inputs default to false, so PR and ordinary builds cannot publish. Contributor tests may be accepted within their stated version, environment and observed scope without rebuilding the same environment on the maintainer's computer. Isolated tests or an older candidate must not be reported as public issuance or renewal acceptance of a new binary.
|
|
66
70
|
|
|
67
|
-
|
|
71
|
+
Official publication accepts only the public `saya-ch/dsh-mobile` repository and version-bound non-`v` tag `caddy-component-2.11.7-tencentcloud-0.4.3-r1`. The maintainer creates that tag on the reviewed main commit and explicitly dispatches the existing workflow with `publish_official_release=true` and review input false. Existing tags are never moved or overwritten; this publication-preparation correction uses the new fixed `-r1` revision tag and retains the original tag. The publisher checks that the tag SHA equals this Actions SHA and belongs to main, and requires both platforms' independent double builds, native tests and plugin builds from that same run. Wrong events, branches, repositories, conflicting inputs, failed native jobs and mismatched tags reject publication.
|
|
68
72
|
|
|
69
|
-
|
|
73
|
+
The single publisher uses `contents: write` and the existing `GITHUB_TOKEN` to create a non-latest official component distribution, not npm or APK. It refuses occupied releases, downloads and byte-compares all 16 draft assets, then publishes and independently verifies public metadata, lengths and hashes through the installer's actual HTTPS downloader. Verification failure preserves the actual public state and fails the job; it never deletes or destructively retries publication.
|
|
70
74
|
|
|
71
|
-
|
|
75
|
+
Component updates have two stages: publish and verify the official distribution, then separately review the plugin catalog change that pins the actual public binaries' source, size and SHA-256 in `CADDY_COMPONENT_RELEASES`. Version 0.6.9 enables the fixed Windows/Linux x64 catalog; publishing another component asset does not automatically change the version users run.
|
|
72
76
|
|
|
73
|
-
|
|
77
|
+
The prepare/verify CLI defaults to review; the final `--channel official` selects official identity validation. Successful verification emits `official-candidate-not-production` with `productionCatalogEnabled: false`: this JSON is review input, not runtime configuration, and cannot enable installation by itself. Contributor real-world feedback is accepted within its stated version and deployment scope.
|
|
74
78
|
|
|
75
|
-
Isolated
|
|
79
|
+
Isolated validation uses ephemeral loopback listeners and a private internal CA with `skip_install_trust`; no system trust, production DNS or existing proxy is changed. This fixed component has not received separate public DNS-01/ACME issuance or long-cycle renewal acceptance. Issuance, renewal, public reachability and actual page/API/stream delivery need separate observations; isolated CI or an older candidate's real-world tests cannot substitute for them.
|