dsh-mobile 0.8.6 → 0.8.8

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 CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  Notable changes are recorded here. GitHub Releases provide the downloadable packages and generated commit notes.
4
4
 
5
+ ## 0.8.8 - 2026-11-12
6
+
7
+ - Restore Web Push on DSH 0.2.2-rc.2, which removed the `roots`/`isOwnedBy` ownership walk the public push host required: when the registry no longer exposes it, ownership comes from the durable Session header instead — `origin: 'subagent'` plus its `parentSession` ancestry, bounded and stopping at a missing parent — while hosts that still expose the walk keep the previous path and the same root-targeting and child-suppression rules. The packed push lanes and the Web Push guides cover rc.2 again. Thanks @chintoleung for the report in [#407](https://github.com/saya-ch/dsh-mobile/issues/407) and the fix in [#408](https://github.com/saya-ch/dsh-mobile/pull/408).
8
+ - Carry a bounded title and body with task-completion events: the Session display title and the turn's first non-empty assistant line, each bounded by code point (80 and 200) and dropped as a pair when either half looks like a credential, so the App never receives one without the other. The page keeps its own notification unless the installed App reports `enabled`, `connected` and `canPost` at the same time, so an older App, a disconnected service or a blocked notification channel never swallows the alert; questions stay page-only. The App-side halves (announced text, one notification per Session and turn sharing a tag and id, service-owned delivery) ship with the next Android release. Thanks @owenzhao for the measurement and proposal in [#400](https://github.com/saya-ch/dsh-mobile/issues/400).
9
+ - Add an opt-in, off-by-default reading mode to the dedicated Mobile layout ([#194](https://github.com/saya-ch/dsh-mobile/issues/194)) — thanks [@rushpixy](https://github.com/rushpixy) for the report and [@lnuxe](https://github.com/lnuxe) for the implementation in [#384](https://github.com/saya-ch/dsh-mobile/pull/384): scrolling down a long conversation collapses the composer editor so the reading area is unobstructed, while the card keeps the upstream Send/Stop row. Tapping the card, focusing the composer, opening the software keyboard, or scrolling back up about 80px restores it, and it never collapses while a draft exists, a submission is in flight, or a reply is streaming. It samples the conversation scroller `[data-conversation-scroll]` rather than the document, and the Settings → General switch is shared between the settings and layout bundles through the persisted flag, so it applies without a reload.
10
+ - Stop arming a push wake timer while every concurrent send slot is busy: a completion callback re-kicks delivery as slots free, so a saturated queue no longer wakes the device for sends it cannot start. Thanks @chintoleung for [#402](https://github.com/saya-ch/dsh-mobile/pull/402).
11
+
12
+ ## 0.8.7 - 2026-11-11
13
+
14
+ - Add an opt-in, off-by-default session prefetch for the dedicated Mobile layout. After a session switch settles, the page issues one bounded, read-only `session/projections` request for the session the user just left (the most likely switch-back target), so a follow-back hits DSH session-query's prepared-session cache warm instead of re-parsing the whole log. Guarded by a per-session cooldown and a bounded timeout; failures are silent and are not retried. It stays disabled until the new "Prefetch the session you just left" switch in Settings → General is turned on; the choice is persisted and applies without a reload. Thanks @eeeggplant for the measurement and proposal in [#291](https://github.com/saya-ch/dsh-mobile/issues/291), and @lnuxe for the implementation in [#383](https://github.com/saya-ch/dsh-mobile/pull/383).
15
+ - Close an active Gateway WebSocket with a normal close frame when its short Session expires instead of destroying the socket, so a mobile page can renew quietly instead of surfacing an abnormal close and "connection lost". Authentication-failure diagnostics now report `/plugins/*` and `/assets/*` as their own categories instead of folding them into the catch-all bucket, without logging module or bundle identifiers. Thanks @LUgABeEEE for the measurement and fix in [#350](https://github.com/saya-ch/dsh-mobile/pull/350).
16
+ - With Android 0.7.4 or later installed, the Settings → General background-reminder row reports whether the App's service is actually connected instead of leaving the row to a fixed label: it shows "Connected", "Not connected" or the bounded failure stage the service last recorded, so a reminder that never arrives can be separated from a pairing, renewal, stream or notification failure. An App older than 0.7.4 keeps the plain switch when it supports the background-reminder toggle at all; earlier Apps do not show this row. Thanks @owenzhao for the diagnosis in [#390](https://github.com/saya-ch/dsh-mobile/issues/390).
17
+ - With Android 0.7.4 or later installed, a tapped task notification opens the notified Session inside the live page instead of reloading the document. The dedicated Mobile page publishes `window.__dshMobileOpenSession`; it resolves only the built-in `dsh-session` route, asks DSH's workspace to open that Session and reports whether it did, so a warm tap keeps drafts and scroll position and the App falls back to its previous route navigation when the page is still booting, the Session is unknown or the stock layout is active. Thanks @owenzhao for [#394](https://github.com/saya-ch/dsh-mobile/issues/394).
18
+ - Document the Back-key, full-screen overlay and safe-area contract for third-party Mobile page plugins: an overlay mounted on `document.body` must claim the cancelable `dsh-mobile:native-back` event itself, because the Mobile layout only claims the details, sidebar and main panels, and a fixed full-screen surface must reserve the top safe area. The guide also records when an unclaimed event falls through to the App's own Back handling. Thanks @pakeh2866 for the report in [#389](https://github.com/saya-ch/dsh-mobile/issues/389) that prompted the contract; the third-party host's own change is not part of this repository.
19
+ - Declare a plugin icon so DSH shows the DSH Mobile picture in its plugin metadata instead of the default plugin glyph. The shipped `assets/brand/plugin-icon.png` is package-relative, within DSH's 256 KiB icon limit, and read without evaluating plugin code.
20
+ - The page-side halves of the background-reminder status and in-place notification navigation ship in this plugin release; their native halves are prepared as Android 0.7.4 below and released separately. Android 0.7.3 remains the published App until then.
21
+
22
+ ## Android 0.7.4 - 2026-11-11
23
+
24
+ - Cache the revision-addressed mobile page payload on the device, independently of the WebView's own HTTP cache. For a revalidated boot batch the App sends `If-None-Match` and serves the stored body after a 304; a revision-named plugin combo bundle is addressed by its ordered module list and revision and needs no round-trip. A body is stored only after its size and SHA-256 match the fetched bytes, a cache miss or any integrity, epoch or ownership failure falls back to the ordinary request, documents, API responses, credentials and non-revisioned assets never qualify, and clearing site data or removing the paired device clears the store. Thanks @LUgABeEEE for the implementation and the LAN measurements in [#350](https://github.com/saya-ch/dsh-mobile/pull/350).
25
+ - Report the background reminder's real phase in its persistent notification — connecting, connected or not connected — and publish `connected`, `lastEventAt` and a bounded `lastError` stage through `notification.background.get`, so the page and a `DshMobileBg` logcat line can separate a credential-renewal, stream-open or notification-delivery failure without recording tokens or addresses.
26
+ - Give background-service completion notifications a `dsh-task-bg-` tag so their origin is identifiable while page notifications keep `dsh-task-done-`, rebind the service to the newly active paired computer instead of retrying the previous Origin, and withdraw the opt-in when the active record cannot serve it, including an iroh pairing.
27
+ - Open a warm notification tap in the live page instead of reloading it: the App invokes the page's in-place Session hook first and only falls back to route navigation when the page is not ready or cannot handle the route.
28
+ - Released independently of the plugin: plugin 0.8.7 carries the page-side halves and shipped while Android 0.7.3 was the current App, and this App release is published as `android-v0.7.4` with the established signer. The plugin release notes keep the App that was published when they shipped; the download links in this repository point at the verified 0.7.4 APKs.
29
+
5
30
  ## 0.8.6 - 2026-11-10
6
31
 
7
32
  - Forward paired plugin `x-dsh-*` request headers through the mobile Gateway while continuing to strip internal `x-dsh-mobile-*` markers and the DSH account credential header. This restores third-party plugin write routes that validate their own request marker. Thanks @mekswhy for the reproduction in [#375](https://github.com/saya-ch/dsh-mobile/issues/375) and @lnuxe for [#376](https://github.com/saya-ch/dsh-mobile/pull/376).
@@ -12,7 +37,7 @@ Notable changes are recorded here. GitHub Releases provide the downloadable pack
12
37
  - Verify updated Windows firewall rules with a name query followed by property filtering, and retain the elevated child's failure text plus its numeric exit code in the plugin log. This removes the PowerShell parameter-set conflict that made managed LAN setup fail after creating only the TCP rule. Thanks @zustttt for the diagnosis in [#379](https://github.com/saya-ch/dsh-mobile/issues/379).
13
38
  - Recover the longer iroh private-directory cause chain by following a generic `tls-prepare` failure with a bounded local-only host probe. This keeps the existing sidecar compatible while classifying the reported Windows ACL failure explicitly. Thanks @fgql for the follow-up reproduction in [#365](https://github.com/saya-ch/dsh-mobile/issues/365).
14
39
  - Recognize the wrapper failure on any stderr line instead of requiring the whole buffer to equal it, so a preceding warning or an extra diagnostic no longer hides that cause chain. A failed managed-LAN firewall operation now keeps its own error when the scratch directory cannot be removed, and its detail omits the encoded command and local paths; the firewall diagnostics check the same rule profile as the managed setup before reporting a rule as ready.
15
- - Plugin-only update. Android 0.7.2 remains the published App; the Android 0.7.3 changes below are prepared in this repository and are released separately.
40
+ - Plugin-only update. At the time of this plugin release, Android 0.7.2 was the published App; the Android 0.7.3 changes below were prepared here and have since shipped as android-v0.7.3.
16
41
 
17
42
  ## 0.8.5 - 2026-11-08
18
43
 
@@ -25,7 +50,7 @@ Notable changes are recorded here. GitHub Releases provide the downloadable pack
25
50
  - Accept RFC 6598 `100.64.0.0/10` addresses as managed-LAN candidates, including networks whose router or ISP exposes CGNAT-style addressing for the local Ethernet or Wi-Fi segment. The admin Host-header check continues to reject CGNAT to preserve its DNS-rebinding defence. Thanks @Kizaemon for the diagnosis in [#369](https://github.com/saya-ch/dsh-mobile/issues/369).
26
51
  - Plugin-only update. Android 0.7.2 remains the published App; no native App change is included.
27
52
 
28
- ## Android 0.7.3 - Unreleased
53
+ ## Android 0.7.3 - 2026-11-10
29
54
 
30
55
  - Make task notification navigation preserve the full bounded opaque Session ID and open the exact conversation after a cold or warm tap. Each notification identifies its tap target by its tag, so two notifications cannot overwrite one another's target even when their request codes collide. Only the built-in `dsh-session` route is accepted. Thanks @owenzhao for the report in [#371](https://github.com/saya-ch/dsh-mobile/issues/371) and @lnuxe for the original implementation in [#374](https://github.com/saya-ch/dsh-mobile/pull/374).
31
56
  - Add an explicit, opt-in `dataSync` foreground service for completion alerts after Android suspends the WebView. It renews the paired credential, pins the configured CA, keeps a persistent notification, stops on device removal or revocation, and deliberately rejects iroh pairings until the native transport exposes the same authenticated identity. Notification permission remains a separate Android setting. Thanks @owenzhao for the background-delivery analysis in [#377](https://github.com/saya-ch/dsh-mobile/issues/377).
package/CONTRIBUTORS.md CHANGED
@@ -6,6 +6,18 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
6
6
 
7
7
  ## 下一版本贡献 / Contributions for the next release
8
8
 
9
+ 感谢 [@chintoleung](https://github.com/chintoleung) 在 [#407](https://github.com/saya-ch/dsh-mobile/issues/407) 报告 DSH 0.2.2-rc.2 下 Web Push 不可用,并提供 [#408](https://github.com/saya-ch/dsh-mobile/pull/408) 的兼容修复与 [#402](https://github.com/saya-ch/dsh-mobile/pull/402) 的推送调度修复;感谢 [@owenzhao](https://github.com/owenzhao) 在 [#400](https://github.com/saya-ch/dsh-mobile/issues/400) 提供实测与落点;感谢 [@rushpixy](https://github.com/rushpixy) 在 [#194](https://github.com/saya-ch/dsh-mobile/issues/194) 提出阅读体验问题,[@lnuxe](https://github.com/lnuxe) 提供 [#384](https://github.com/saya-ch/dsh-mobile/pull/384) 的阅读模式实现。
10
+
11
+ Thanks [@chintoleung](https://github.com/chintoleung) for reporting Web Push being unavailable on DSH 0.2.2-rc.2 in [#407](https://github.com/saya-ch/dsh-mobile/issues/407), and for the compatibility fix in [#408](https://github.com/saya-ch/dsh-mobile/pull/408) and the push-scheduling fix in [#402](https://github.com/saya-ch/dsh-mobile/pull/402); thanks [@owenzhao](https://github.com/owenzhao) for the measurement and points in [#400](https://github.com/saya-ch/dsh-mobile/issues/400); thanks [@rushpixy](https://github.com/rushpixy) for the reading-experience report in [#194](https://github.com/saya-ch/dsh-mobile/issues/194), and [@lnuxe](https://github.com/lnuxe) for the reading-mode implementation in [#384](https://github.com/saya-ch/dsh-mobile/pull/384).
12
+
13
+ ## 0.8.7 贡献 / Contributions in 0.8.7
14
+
15
+ 感谢 [@eeeggplant](https://github.com/eeeggplant) 在 [#291](https://github.com/saya-ch/dsh-mobile/issues/291) 提供会话切换重复加载的测量与预取提案,[@lnuxe](https://github.com/lnuxe) 通过 [#383](https://github.com/saya-ch/dsh-mobile/pull/383) 实现可选的会话预取;原作者提交保留,维护者补充独立开关、跨 bundle 的偏好同步和网关参数契约。感谢 [@owenzhao](https://github.com/owenzhao) 在 [#390](https://github.com/saya-ch/dsh-mobile/issues/390) 报告后台提醒不投递并持续提供设备侧排查信息,在 [#394](https://github.com/saya-ch/dsh-mobile/issues/394) 指出点击任务通知会整页重载;两个问题仍在确认中,本版只提供诊断与页面侧准备,不表示已修复。感谢 [@LUgABeEEE](https://github.com/LUgABeEEE) 在 [#350](https://github.com/saya-ch/dsh-mobile/pull/350) 提供网关到期连接正常关闭、认证失败分类,以及 App 端按修订号缓存页面资源的实现与测量。感谢 [@pakeh2866](https://github.com/pakeh2866) 在 [#389](https://github.com/saya-ch/dsh-mobile/issues/389) 报告文件预览后无法返回,促成第三方全屏宿主的返回键契约文档;宿主自身的修复不在本仓库。
16
+
17
+ Thanks [@eeeggplant](https://github.com/eeeggplant) for the session-switch measurement and prefetch proposal in [#291](https://github.com/saya-ch/dsh-mobile/issues/291), and [@lnuxe](https://github.com/lnuxe) for the implementation in [#383](https://github.com/saya-ch/dsh-mobile/pull/383); original commits are retained, with maintainer additions for the independent switch, cross-bundle preference sharing and the gateway argument contract. Thanks [@owenzhao](https://github.com/owenzhao) for the background-reminder non-delivery report and device-side diagnosis in [#390](https://github.com/saya-ch/dsh-mobile/issues/390), and for the full-page reload on a notification tap in [#394](https://github.com/saya-ch/dsh-mobile/issues/394); both remain under investigation, and this candidate only adds diagnostics and the page-side preparation, not a confirmed fix. Thanks [@LUgABeEEE](https://github.com/LUgABeEEE) for the orderly credential-expiry WebSocket close, the auth-failure categories and the App-side revisioned payload cache with its measurements in [#350](https://github.com/saya-ch/dsh-mobile/pull/350). Thanks [@pakeh2866](https://github.com/pakeh2866) for the file-preview Back report in [#389](https://github.com/saya-ch/dsh-mobile/issues/389), which prompted the Back-key contract for third-party full-screen hosts; the host's own change is not in this repository.
18
+
19
+ ## 0.8.6 贡献 / Contributions in 0.8.6
20
+
9
21
  感谢 [@mekswhy](https://github.com/mekswhy) 在 [#375](https://github.com/saya-ch/dsh-mobile/issues/375) 报告插件请求头被移动网关丢弃,[@lnuxe](https://github.com/lnuxe) 提供 [#376](https://github.com/saya-ch/dsh-mobile/pull/376) 的网关修复与 [#374](https://github.com/saya-ch/dsh-mobile/pull/374) 的通知导航实现;维护者保留原作者提交并补充安全过滤、完整长度校验、并发与真机验收路径。感谢 [@owenzhao](https://github.com/owenzhao) 在 [#371](https://github.com/saya-ch/dsh-mobile/issues/371)、[#372](https://github.com/saya-ch/dsh-mobile/issues/372)、[#373](https://github.com/saya-ch/dsh-mobile/issues/373) 和 [#377](https://github.com/saya-ch/dsh-mobile/issues/377) 提供通知链路场景、复现和边界说明。感谢 [@zustttt](https://github.com/zustttt) 在 [#379](https://github.com/saya-ch/dsh-mobile/issues/379) 定位 Windows 局域网一键配置失败的 PowerShell 参数集冲突。
10
22
 
11
23
  Thanks [@mekswhy](https://github.com/mekswhy) for reporting the mobile Gateway's dropped plugin request header in [#375](https://github.com/saya-ch/dsh-mobile/issues/375), and [@lnuxe](https://github.com/lnuxe) for the Gateway fix in [#376](https://github.com/saya-ch/dsh-mobile/pull/376) and notification navigation implementation in [#374](https://github.com/saya-ch/dsh-mobile/pull/374). Original commits are retained, with maintainer additions for security filtering, full-length validation, concurrency and device-acceptance paths. Thanks [@owenzhao](https://github.com/owenzhao) for the notification scenarios, reproductions and boundaries in [#371](https://github.com/saya-ch/dsh-mobile/issues/371), [#372](https://github.com/saya-ch/dsh-mobile/issues/372), [#373](https://github.com/saya-ch/dsh-mobile/issues/373) and [#377](https://github.com/saya-ch/dsh-mobile/issues/377). Thanks [@zustttt](https://github.com/zustttt) for diagnosing the PowerShell parameter-set conflict in [#379](https://github.com/saya-ch/dsh-mobile/issues/379).
package/README.en.md CHANGED
@@ -28,7 +28,7 @@
28
28
  <a href="#compatibility">Compatibility</a> ·
29
29
  <a href="docs/README.md">Documentation</a> ·
30
30
  <a href="#contributors">Contributors</a> ·
31
- <a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.8.6">Release notes</a> ·
31
+ <a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.8.8">Release notes</a> ·
32
32
  <a href="README.md">简体中文</a>
33
33
  </p>
34
34
 
@@ -36,14 +36,14 @@
36
36
  >
37
37
  > **Using an iPhone or iPad?** Use Safari or [add DSH Mobile to your Home Screen as a web app (PWA)](<#iphone-and-ipad-home-screen-web-app-pwa>)—no native iOS download needed.
38
38
  >
39
- > **Current stable release: 0.8.6**. Forward paired third-party plugin request headers, keep the browser push subscription after a Disable, and expose bounded custom web-push text to trusted Host plugins; also fix Windows firewall verification, iroh directory diagnostics and the LAN diagnostic scope. Plugin and Android App releases remain independent; the background-reminder App update ships separately as Android 0.7.3. [Plugin release notes and downloads](https://github.com/saya-ch/dsh-mobile/releases/tag/v0.8.6) · [Full changelog](CHANGELOG.md).
39
+ > **Current stable release: 0.8.8**. Restore Web Push on DSH 0.2.2-rc.2 after its AgentRegistry ownership change, carry the Session title and a bounded summary with task-completion events and yield page notifications only when the App reports it can post, add an opt-in reading mode, and stop arming push wake timers while the send queue is at capacity. Plugin and Android App releases remain independent; Android App 0.7.4 remains the published app. [Plugin release notes and downloads](https://github.com/saya-ch/dsh-mobile/releases/tag/v0.8.8) · [Full changelog](CHANGELOG.md).
40
40
  >
41
- > **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).
41
+ > **Version policy**: from plugin **0.6.2** the Android app and plugin ship as independent releases (the app was still 0.6.1 then), and the app has used its own version numbers since app **0.6.2**. Their numbers do not need to match, and a plugin update does not imply an app update. [Compatibility notes](#compatibility).
42
42
 
43
43
  <p align="center">
44
- <a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.2/dsh-mobile-android-v0.7.2.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>
45
- <a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.2/dsh-mobile-android-v0.7.2.apk"><strong>Download Android app 0.7.2 (compatibility)</strong></a><br>
46
- <sub><a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.2/dsh-mobile-android-v0.7.2-iroh.apk">64-bit full APK (experimental iroh)</a> · <a href="https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.2">Release notes and checksums</a></sub>
44
+ <a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.4/dsh-mobile-android-v0.7.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>
45
+ <a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.4/dsh-mobile-android-v0.7.4.apk"><strong>Download Android app 0.7.4 (compatibility)</strong></a><br>
46
+ <sub><a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.4/dsh-mobile-android-v0.7.4-iroh.apk">64-bit full APK (experimental iroh)</a> · <a href="https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.4">Release notes and checksums</a></sub>
47
47
  </p>
48
48
 
49
49
  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. The full Android App also supports experimental iroh encrypted direct connections with relay fallback. The phone reaches the computer's sessions, Workspaces, messages and tools. The computer manages LAN and remote switches and pairing authorizations separately; the Android app lists paired computers together. The plugin does not modify DeepSeek Harness source.
@@ -58,9 +58,9 @@ It also lets you customize the phone from a DSH conversation: `/mobile <what you
58
58
  - **Customize the phone UI by talking to DSH**: request layout, interaction, or feature changes in a conversation; changed customization resources are usually picked up automatically.
59
59
  - **A dedicated touch layout**: session drawer, tool details, settings, question cards, and composer reorganized for phones. The sidebar remembers its list position within the page instead of jumping to the top after a session switch. The app follows the system locale (Chinese/English/Italian), plugin UI follows DSH's locale.
60
60
  - **Several remote options**: Tailscale, cpolar, cloudflared quick/named tunnels, self-hosted FRP, your own reverse proxy, and experimental iroh without a domain or public port; Windows/Linux x64 can also let the plugin manage Caddy HTTPS and certificates.
61
- - **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.
61
+ - **Pairing and multi-device**: pair once via QR code, link, or key; the same Origin renews automatically, while an address, certificate or listener change requires pairing again through **Change network** (while LAN access runs) or takes effect the next time you enable it; the app lists LAN and remote paired computers together, checks their reachability periodically, and lets you switch, re-pair, or delete a local record.
62
62
  - **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.
63
- - **iPhone / iPad Web Push**: add the page to your Home Screen and explicitly enable notifications in DSH General settings. Choose from six categories and receive alerts while the page is closed or the screen is locked, without conversation text on the lock screen. [Requirements and setup](docs/WEB_PUSH.en.md).
63
+ - **iPhone / iPad Web Push**: add the page to your Home Screen and explicitly enable notifications in DSH General settings. Choose from six categories and receive alerts while the page is closed or the screen is locked; default text never includes conversation content, while custom text sent by a trusted Host plugin through `mobilePush.notify` (since 0.8.6) is supplied by that plugin. [Requirements and setup](docs/WEB_PUSH.en.md).
64
64
  - **Android task notifications**: enable completion and pending-input alerts in DSH General settings inside the app, using its separate native notification channel with redacted lock-screen text.
65
65
  - **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.
66
66
 
@@ -108,7 +108,7 @@ Restart DSH, then search for **dsh-mobile** under **Settings → Plugin Market**
108
108
 
109
109
  </details>
110
110
 
111
- `setup` automatically selects and remembers the current LAN from RFC1918 and `100.64.0.0/10` candidates; Wi-Fi, hotspot, and IP changes normally recover without re-pairing. Use `--address 192.168.x.x` to name the actual address only when automatic selection fails. Settings, certificates, devices, and customization files live under `$DSH_HOME/mobile-access/`.
111
+ `setup` automatically selects and remembers the current LAN from RFC1918 and `100.64.0.0/10` candidates; the gateway follows address changes, but a phone renews automatically only on the same Origin, while an address, certificate or listener change requires pairing through **Change network** (while LAN access runs) or takes effect the next time you enable it. Use `--address 192.168.x.x` to name the actual address only when automatic selection fails. Settings, certificates, devices, and customization files live under `$DSH_HOME/mobile-access/`.
112
112
 
113
113
  ### Install the Android app
114
114
 
@@ -144,10 +144,12 @@ Use this when the phone and computer share Wi-Fi, Ethernet, or a phone hotspot.
144
144
  1. Connect the phone and computer to the same local network, then open **Mobile Access → Local network** in the lower-left corner of DeepSeek Harness.
145
145
  2. If needed, select **Enable local access**, then select **Generate pairing QR code**. The panel displays a pairing QR code.
146
146
  3. In the Android app, open **Local network**, scan for computers, select the device, then scan the QR code or paste the pairing key.
147
- 4. Pairing creates persistent device trust. Later app launches discover and connect automatically; Wi-Fi, hotspot, and DHCP address changes normally do not require pairing again.
147
+ 4. Pairing creates persistent device trust. Later app launches discover and connect automatically and renew on the same Origin; an address, certificate or listener change requires pairing again through **Change network** (while LAN access runs) or takes effect the next time you enable it.
148
148
 
149
149
  LAN and HTTPS remote pairing codes show their expiry time. Generate a new code after expiry; doing so invalidates the previous code. **Copy pairing link** reuses the current valid code instead of invalidating the displayed QR. The computer-side **Device** entry lists and revokes LAN and remote authorizations in separate tabs; it does not manage the saved computer list in the App.
150
150
 
151
+ Once LAN is configured, the panel shows **Change network**: it rescans the computer's current interfaces and, after you confirm one, keeps the private CA and paired devices while re-signing only the server certificate and updating the listen address and allowed network. Switching while LAN access is running briefly disconnects connected phones and requires reconnecting with a new pairing QR code; when it is stopped, the configuration is only saved and takes effect the next time you enable LAN access.
152
+
151
153
  When other plugin entries share the sidebar footer, **Mobile access** becomes a phone-icon button. Hover to read its name; clicking opens the same panel. Its text label returns when the entry is alone.
152
154
 
153
155
  Port note: `dsh web --port` changes the DSH Web upstream port (3080 by default), which the plugin follows automatically. `dsh-mobile setup --port` changes the Mobile HTTPS listener (3443 by default), and the pairing QR code includes the selected port. When DSH Desktop starts with `--port 0`, the gateway follows the **actual port in use**; `upstreamOrigin` in `mobile-access/setup.json` is only the snapshot from the first setup, and the plugin refreshes it at startup — do not read it as the upstream the gateway uses.
@@ -177,7 +179,7 @@ Use this after the phone leaves the computer's network. Remote access is disable
177
179
 
178
180
  Remote providers may impose bandwidth and connection limits: the [cpolar Free plan](https://svip.cpolar.com/pricing) currently lists 1 Mbps, while [Tailscale Funnel](https://tailscale.com/docs/features/tailscale-funnel#requirements-and-limitations) has non-configurable bandwidth limits, and a cloudflared quick tunnel is a free Cloudflare address with randomized hostnames and rate limiting. DSH Mobile uses gzip for static assets, persistent WebSockets, and load-on-scroll history to improve loading; DSH controls the Session history window and page sizes, and the plugin cannot raise provider quotas.
179
181
 
180
- If the page opens but stays on “Reconnecting,” distinguish WebSocket upgrade failures, slow synchronization, and heartbeat deadlines using the [slow-link and reconnection guide](docs/SLOW_CONNECTIONS.en.md). Version 0.5.4 also offers opt-in WebSocket compression per exact path, disabled by default; for long Sessions or metered links, follow the guide and compare actual transfer volume.
182
+ If the page opens but stays on “Reconnecting,” distinguish WebSocket upgrade failures, slow synchronization, and heartbeat deadlines using the [slow-link and reconnection guide](docs/SLOW_CONNECTIONS.en.md). Version 0.5.4 introduced per-path WebSocket compression, and since 0.8.0 `/api/remote.mux` is compressed by default; set `paths` to `[]` to turn it off. For long Sessions or metered links, follow the guide and compare actual transfer volume.
181
183
 
182
184
  The usage notes below reflect the maintainer's long-term experience on a personal mainland-China network, not a universal comparison. Performance depends on the carrier, network and plan; verify the route on your own phone's network.
183
185
 
@@ -342,7 +344,7 @@ excludedClientModules:
342
344
  - '@deepseek-ai/dsh-client-ui-open-in-app'
343
345
  ```
344
346
 
345
- There is no default exclusion list. The plugin rejects unknown or boot-critical modules and modules still referenced through `inject` or `external` by retained entries. If a DSH or community-plugin update invalidates the selection, the mobile page returns `409 excluded_client_modules_invalid` with the conflicting module; the computer also warns so you can adjust or remove the option. Bundle sizes and dependencies change between DSH installations and versions; another user's savings are not a prediction for yours.
347
+ There is no default exclusion list. The plugin rejects unknown or boot-critical modules and modules still referenced through `inject` or `external` by retained entries. If a DSH or community-plugin update invalidates the selection, a settings write returns `409 excluded_client_modules_invalid` with the conflicting module, while a page load that fails shows a recovery page (HTTP 200); the computer also warns so you can adjust or remove the option. Bundle sizes and dependencies change between DSH installations and versions; another user's savings are not a prediction for yours.
346
348
 
347
349
  Selection priority is device choice → computer defaults → plugin configuration. See the [module guide](docs/CLIENT_MODULES.en.md) for application and recovery rules.
348
350
 
@@ -393,7 +395,9 @@ flowchart LR
393
395
  DSH -->|"same workspace, sessions and event stream"| Phone
394
396
  ```
395
397
 
396
- Three layers: the Host face for discovery, pairing, HTTPS, loopback proxying, and extension registration; the Client face for the dedicated mobile layout and extension SDK; and the Android app for a narrow native bridge. The bridge uses `androidx.webkit` WebMessage, verifies the exact top-level origin and main frame on every bounded message, and never uses `addJavascriptInterface`. The plugin does not rewrite source or webpage files in the DeepSeek Harness installation. Its mobile gateway serves the startup compatibility layer and dedicated layout per request; installation and removal use the plugin mechanism. The upstream DSH Web port defaults to 3080 and is configurable through `dsh web --port`.
398
+ Three layers: the Host face for discovery, pairing, HTTPS, loopback proxying, and extension registration; the Client face for the dedicated mobile layout and extension SDK; and the Android app for a narrow native bridge. The bridge uses `androidx.webkit` WebMessage, which verifies the exact top-level origin and main frame on every bounded message, and never uses `addJavascriptInterface`. The plugin does not rewrite source or webpage files in the DeepSeek Harness installation. Its mobile gateway serves the startup compatibility layer and dedicated layout per request; installation and removal use the plugin mechanism. The upstream DSH Web port defaults to 3080 and is configurable through `dsh web --port`. Reading mode (opt-in, off by default) collapses the composer editor while scrolling down a long conversation: the card and its Send/Stop row stay, and tapping the card, focusing the composer, opening the software keyboard, or scrolling back up about 80px restores it. It never collapses while a draft exists, a submission is in flight, or a reply is streaming. Enable it from Settings → General.
399
+
400
+ Switching sessions tears down the client Session instance and its live stream. The dedicated layout ships an opt-in, off-by-default session prefetch ([#291](https://github.com/saya-ch/dsh-mobile/issues/291)): after a switch settles, it issues one bounded, read-only `session/projections` request for the session the user just left, so a follow-back hits DSH session-query's prepared cache instead of re-parsing the whole log. Guarded by a per-session cooldown and a bounded timeout, failures are silent and never disturb normal requests or live streams; the behavior stays disabled until the "Prefetch the session you just left" switch in Settings → General is turned on (off by default; the choice is persisted).
397
401
 
398
402
  ## Security
399
403
 
@@ -445,7 +449,9 @@ On macOS, local network, cloudflared, self-hosted FRP and the own reverse proxy
445
449
 
446
450
  | DSH Mobile plugin | Verified DeepSeek Harness version |
447
451
  | --- | --- |
448
- | `0.8.6` | On the `0.2.2-rc.1` packed target, forward paired third-party plugin `x-dsh-*` headers, keep the push subscription after a Disable, expose the trusted Host push-text service, and fix Windows firewall verification, iroh directory diagnostics and the LAN diagnostic scope. The Android App remains 0.7.2; background reminders ship with 0.7.3 separately |
452
+ | `0.8.8` | On the `0.2.2-rc.2` target, restore Web Push after the AgentRegistry ownership change, carry the Session title and a bounded summary with task-completion events and yield page notifications only when the App reports it can post, add an opt-in reading mode, and stop arming push wake timers while the send queue is at capacity. The Android App is 0.7.4 |
453
+ | `0.8.7` | On the `0.2.2-rc.1` packed target, add an opt-in session prefetch, close an expiring Gateway WebSocket normally with clearer authentication-failure categories, and prepare the background-reminder status and in-place notification open for Android 0.7.4; also update the plugin icon and iroh troubleshooting notes. The Android App is 0.7.4, with the device-side page cache and real background-reminder status |
454
+ | `0.8.6` | On the `0.2.2-rc.1` packed target, forward paired third-party plugin `x-dsh-*` headers, keep the push subscription after a Disable, expose the trusted Host push-text service, and fix Windows firewall verification, iroh directory diagnostics and the LAN diagnostic scope. The Android App is 0.7.3 with opt-in background reminders |
449
455
  | `0.8.5` | Maintenance and performance update on the `0.2.2-rc.1` packed-DSH target: catalog cache, Desktop update targeting, CGNAT LAN discovery, firewall protection and a macOS permission notice. The Android App remains 0.7.2 |
450
456
  | `0.8.4` | Plugin maintenance update. The packed DSH test target remains `0.2.2-rc.1`, alongside existing compatibility checks. The upstream rc.1 npm CLI requires Node.js 24.9 or later |
451
457
  | `0.8.3` | Adapted to DSH 0.2.2-rc.1 with landscape, Plugins and Web Push settings layout fixes, shared FRP usernames and iroh pairing improvements |
package/README.md CHANGED
@@ -28,7 +28,7 @@
28
28
  <a href="#兼容性">兼容性</a> ·
29
29
  <a href="docs/README.md">文档</a> ·
30
30
  <a href="#贡献者">贡献者</a> ·
31
- <a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.8.6">更新记录</a> ·
31
+ <a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.8.8">更新记录</a> ·
32
32
  <a href="README.en.md">English</a>
33
33
  </p>
34
34
 
@@ -36,14 +36,14 @@
36
36
  >
37
37
  > **使用 iPhone 或 iPad?** 可以用 Safari 访问,或[添加到主屏幕作为 Web App(PWA)使用](<#iphone-与-ipad主屏幕-web-apppwa>),无需下载原生 iOS App。
38
38
  >
39
- > **当前正式版本:0.8.6**。透传已配对第三方插件的请求头,修正网页推送停用后的订阅处理,并向受信 Host 插件开放推送文案接口;同时修复 Windows 防火墙校验、iroh 目录诊断与局域网诊断口径。插件与 Android App 独立更新,带后台提醒的 App 0.7.3 单独发布。[插件更新与下载](https://github.com/saya-ch/dsh-mobile/releases/tag/v0.8.6) · [完整更新记录](CHANGELOG.md)。
39
+ > **当前正式版本:0.8.8**。恢复 DSH 0.2.2-rc.2 下的 Web 推送(AgentRegistry ownership 变更),任务完成事件携带会话标题与有界摘要、并在 App 报告可投递时让出页面通知,新增默认关闭的阅读模式,推送调度不再在容量满时唤醒定时器。插件与 Android App 独立更新;Android App 0.7.4 仍为当前正式版。[插件更新与下载](https://github.com/saya-ch/dsh-mobile/releases/tag/v0.8.8) · [完整更新记录](CHANGELOG.md)。
40
40
  >
41
- > **版本说明**:自插件 **0.6.2** 起,Android App 与插件独立编号、独立发布,版本号无需一致;插件升级不代表 App 需要同步升级。[兼容说明](#兼容性)。
41
+ > **版本说明**:自插件 **0.6.2** 起,Android App 与插件改为独立发布(当时 App 仍为 0.6.1);App 自 0.6.2 起使用独立编号,版本号无需一致;插件升级不代表 App 需要同步升级。[兼容说明](#兼容性)。
42
42
 
43
43
  <p align="center">
44
- <a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.2/dsh-mobile-android-v0.7.2.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>
45
- <a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.2/dsh-mobile-android-v0.7.2.apk"><strong>下载 Android App 0.7.2(兼容版)</strong></a><br>
46
- <sub><a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.2/dsh-mobile-android-v0.7.2-iroh.apk">64 位完整版(含实验性 iroh)</a> · <a href="https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.2">版本说明与校验文件</a></sub>
44
+ <a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.4/dsh-mobile-android-v0.7.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>
45
+ <a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.4/dsh-mobile-android-v0.7.4.apk"><strong>下载 Android App 0.7.4(兼容版)</strong></a><br>
46
+ <sub><a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.7.4/dsh-mobile-android-v0.7.4-iroh.apk">64 位完整版(含实验性 iroh)</a> · <a href="https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.4">版本说明与校验文件</a></sub>
47
47
  </p>
48
48
 
49
49
  DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App 通过局域网,或可选的 Tailscale Funnel、cpolar、cloudflared、自建 FRP、自有反向代理远程通道连接电脑;Android 完整版还支持实验性 iroh 加密直连与中继。手机可以继续使用电脑上的会话、工作区、消息和工具。电脑端分别启停局域网与远程访问、分别管理配对授权;Android App 统一显示已配对电脑。插件不修改 DeepSeek Harness 源码。
@@ -58,9 +58,9 @@ DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App
58
58
  - **用对话定制手机端**:在 DSH 对话里提出布局、交互或功能需求;文件修改完成后,自定义资源通常会自动更新。
59
59
  - **专属触屏布局**:会话抽屉、工具详情、设置、提问卡片和输入栏都按手机重新组织;侧栏列表在本页内记住位置,切换会话再打开不会总跳回顶部。App 跟随系统语言(简/英/意),插件界面跟随 DSH 语言。
60
60
  - **多种远程通道**:Tailscale、cpolar、cloudflared 快速/命名隧道、自建 FRP、自有反向代理,以及无需域名和公网端口的实验性 iroh;Windows/Linux x64 还可由插件托管 Caddy HTTPS 与证书。
61
- - **配对与多设备**:扫码、链接或密钥配对一次;切换 Wi-Fi、热点或 IP 后通常自动恢复;App 在一个列表中显示局域网和远程配对的电脑,定期检测可达状态,并支持切换、重新配对或删除本地记录。
61
+ - **配对与多设备**:扫码、链接或密钥配对一次;同一 Origin 下自动续期,地址、证书或监听变化后需按「更换网络」重新配对(局域网运行时)或下次开启生效;App 在一个列表中显示局域网和远程配对的电脑,定期检测可达状态,并支持切换、重新配对或删除本地记录。
62
62
  - **一键诊断与放行**:检查版本、网关、网卡、防火墙和远程通道,生成脱敏报告;被拦截的第三方插件连接按确切路径一键放行。
63
- - **iPhone / iPad 网页推送**:将页面添加到主屏幕后,在 DSH“通用设置”中主动开启;支持六类提醒和分类开关,页面关闭或锁屏后也可接收,锁屏文字不含会话正文。[使用条件与设置](docs/WEB_PUSH.md)。
63
+ - **iPhone / iPad 网页推送**:将页面添加到主屏幕后,在 DSH“通用设置”中主动开启;支持六类提醒和分类开关,页面关闭或锁屏后也可接收;默认文案不含会话正文,0.8.6 起受信 Host 插件通过 `mobilePush.notify` 投递的自定义文案由该插件提供。[使用条件与设置](docs/WEB_PUSH.md)。
64
64
  - **Android 任务通知**:在 App 内 DSH“通用设置”中开启任务完成与待输入提醒,使用独立的原生通知通道,锁屏文本脱敏。
65
65
  - **纵深安全**:局域网固定私有 CA,公开远程入口使用受信任 HTTPS;自签 FRP 入口由 0.4.6 App 固定远程 CA。凭据存 Keystore,设备令牌只发往精确 Origin,第三方 WS 默认拦截。
66
66
 
@@ -144,7 +144,7 @@ dsh plugin --profile web add dshmarket
144
144
  1. 让手机和电脑连接同一个局域网,在 DeepSeek Harness 左下角打开 **移动访问 → 局域网**。
145
145
  2. 如果尚未开启,点击 **开启局域网访问**;随后点击 **生成配对二维码**,面板会显示配对二维码。
146
146
  3. 在 Android App 中进入 **局域网访问**,扫描发现电脑并点击设备,再扫描二维码或粘贴配对密钥。
147
- 4. 配对完成后会建立持久设备信任。以后打开 App 会自动发现并连接,切换 Wi-Fi、热点或 DHCP 地址通常不需要重新配对。
147
+ 4. 配对完成后会建立持久设备信任。以后打开 App 会自动发现并连接,并在同一 Origin 下自动续期;地址、证书或监听变化后需按「更换网络」重新配对(局域网运行时)或下次开启生效。
148
148
 
149
149
  局域网和 HTTPS 远程配对码会显示有效截止时间;超时后重新生成即可。生成新码会使旧码失效,**复制配对链接**复用当前有效码,不会另行作废二维码。电脑端的 **设备** 入口可查看和撤销局域网、远程两组授权;这与 App 中保存的电脑列表是不同的管理对象。
150
150
 
@@ -179,7 +179,7 @@ dsh plugin --profile web add dshmarket
179
179
 
180
180
  远程服务可能受带宽和连接限额影响:[cpolar 免费方案](https://svip.cpolar.com/pricing) 当前为 1 Mbps,[Tailscale Funnel](https://tailscale.com/docs/features/tailscale-funnel#requirements-and-limitations) 也存在不可配置的带宽限制,cloudflared 的 quick tunnel 由 Cloudflare 免费提供、地址随机且有限流。DSH Mobile 使用静态资源 gzip、WebSocket 长连接和顶部按需加载改善体验;会话的历史窗口与分页大小由 DSH 决定,插件无法提高服务商限额。
181
181
 
182
- 页面能打开但一直“重连中”,应先区分 WebSocket 升级失败、慢速数据同步和心跳超时,操作见[慢链路与反复重连指南](docs/SLOW_CONNECTIONS.md)。0.5.4 还提供按确切路径启用的 WebSocket 压缩,默认关闭;长会话或计量网络可按指南尝试,并对比实际传输量。
182
+ 页面能打开但一直“重连中”,应先区分 WebSocket 升级失败、慢速数据同步和心跳超时,操作见[慢链路与反复重连指南](docs/SLOW_CONNECTIONS.md)。0.5.4 起可按确切路径启用 WebSocket 压缩,0.8.0 起默认压缩 `/api/remote.mux`;把 `paths` 设为 `[]` 可关闭。长会话或计量网络可按指南调整,并对比实际传输量。
183
183
 
184
184
  下表的使用参考来自维护者在中国大陆自用网络的长期体验,不是普适测评;实际表现受运营商、网络和套餐影响,请在自己的手机网络验证。
185
185
 
@@ -344,7 +344,7 @@ excludedClientModules:
344
344
  - '@deepseek-ai/dsh-client-ui-open-in-app'
345
345
  ```
346
346
 
347
- 这是按安装环境选择的高级配置,没有默认排除列表。插件会拒绝不存在的包、启动必需模块,以及仍被保留模块通过 `inject` 或 `external` 引用的包;配置不匹配当前 DSH 或社区插件时,移动页面返回 `409 excluded_client_modules_invalid` 和冲突详情,电脑端也会提示,移除或调整配置即可恢复。模块内容与依赖会随 DSH 版本变化,不能把其他人的节省比例当作自己的预期。
347
+ 这是按安装环境选择的高级配置,没有默认排除列表。插件会拒绝不存在的包、启动必需模块,以及仍被保留模块通过 `inject` 或 `external` 引用的包;配置不匹配当前 DSH 或社区插件时,设置写入返回 `409 excluded_client_modules_invalid` 和冲突详情,页面加载异常时展示恢复页(HTTP 200);电脑端也会提示,移除或调整配置即可恢复。模块内容与依赖会随 DSH 版本变化,不能把其他人的节省比例当作自己的预期。
348
348
 
349
349
  设置优先级为本设备选择 → 电脑默认 → 插件配置。详细生效与恢复规则见[模块指南](docs/CLIENT_MODULES.md)。
350
350
 
@@ -395,7 +395,9 @@ flowchart LR
395
395
  DSH -->|"同一工作区、会话和事件流"| Phone
396
396
  ```
397
397
 
398
- 插件包含三层:Host face 负责发现、配对、HTTPS、回环代理和扩展注册表;Client face 提供独立的移动布局与扩展 SDK;Android App 提供受限的原生 Bridge。Bridge 使用 `androidx.webkit` WebMessage,每条消息都校验精确顶层 Origin 和主 Frame,并限制消息大小;不使用 `addJavascriptInterface`。插件不改写 DeepSeek Harness 安装目录中的源码或网页文件;移动网关按请求提供启动兼容层与专用布局,安装和卸载通过插件机制完成。DSH Web 上游端口默认为 3080,可通过 `dsh web --port` 修改。
398
+ 插件包含三层:Host face 负责发现、配对、HTTPS、回环代理和扩展注册表;Client face 提供独立的移动布局与扩展 SDK;Android App 提供受限的原生 Bridge。Bridge 使用 `androidx.webkit` WebMessage,每条消息都校验精确顶层 Origin 和主 Frame,并限制消息大小;不使用 `addJavascriptInterface`。插件不改写 DeepSeek Harness 安装目录中的源码或网页文件;移动网关按请求提供启动兼容层与专用布局,安装和卸载通过插件机制完成。DSH Web 上游端口默认为 3080,可通过 `dsh web --port` 修改。阅读模式(可选,默认关闭):向下滚动阅读长会话时收起输入栏的编辑区,输入框卡片与发送/停止按钮保留;点按卡片、聚焦输入框、打开软键盘或向上回滚约 80px 即恢复。有草稿、提交中或回复生成中时不会收起。可在「设置 → 通用」中开启。
399
+
400
+ 会话切换后会重建客户端 Session 与实时流。插件提供默认关闭的会话预取(对应 [#291](https://github.com/saya-ch/dsh-mobile/issues/291)):切换稳定后,仅对刚离开的会话发起一次有界、只读的 `session/projections` 预热,让切回命中 DSH session-query 的已准备缓存,避免重新解析整个会话日志。该行为受每会话冷却与超时约束,失败静默,且绝不打扰正常请求或实时流;在「设置 → 通用」中的「预取刚离开的会话」开关显式开启后才生效(默认关闭,选择会持久化)。
399
401
 
400
402
  ## 安全
401
403
 
@@ -447,7 +449,9 @@ macOS 上局域网、cloudflared、自建 FRP 与自有反向代理可用;Funn
447
449
 
448
450
  | DSH Mobile 插件 | 已验证的 DeepSeek Harness 版本与范围 |
449
451
  | --- | --- |
450
- | `0.8.6` | 在 `0.2.2-rc.1` 打包目标上透传已配对第三方插件的 `x-dsh-*` 请求头、修正网页推送停用语义、向受信 Host 插件开放推送文案接口,并修复 Windows 防火墙校验、iroh 目录诊断与局域网诊断口径。Android App 仍为 0.7.2;带后台提醒的 0.7.3 单独发布 |
452
+ | `0.8.8` | 在 `0.2.2-rc.2` 上恢复 Web 推送(AgentRegistry ownership 变更),任务完成事件携带会话标题与有界摘要并在 App 报告可投递时让出页面通知,新增默认关闭的阅读模式,推送调度不再在容量满时唤醒定时器。Android App 为 0.7.4 |
453
+ | `0.8.7` | 在 `0.2.2-rc.1` 打包目标上加入默认关闭的会话预取、网关到期连接正常关闭与认证失败分类,并为 Android 0.7.4 准备后台提醒真实状态与通知就地打开;同时更新插件图标与 iroh 排障文档。Android App 为 0.7.4,新增设备端页面缓存与后台提醒真实状态 |
454
+ | `0.8.6` | 在 `0.2.2-rc.1` 打包目标上透传已配对第三方插件的 `x-dsh-*` 请求头、修正网页推送停用语义、向受信 Host 插件开放推送文案接口,并修复 Windows 防火墙校验、iroh 目录诊断与局域网诊断口径。Android App 为 0.7.3,新增可选后台提醒 |
451
455
  | `0.8.5` | 插件维护与性能更新,继续使用 `0.2.2-rc.1` 的 DSH 打包验证目标;新增目录缓存、Desktop 更新目标修复、CGNAT 局域网识别、防火墙保护与 macOS 权限提示。Android App 仍为 0.7.2 |
452
456
  | `0.8.4` | 插件维护更新,继续使用 `0.2.2-rc.1` 的 DSH 打包验证目标,并保留既有版本检查。使用 rc.1 的 npm CLI 时,按上游要求使用 Node.js 24.9 或更新版本 |
453
457
  | `0.8.3` | 当时适配 DSH 0.2.2-rc.1,修复横屏、插件页和网页推送设置布局,支持共享 FRP 用户名,并改进 iroh 配对 |
@@ -6,7 +6,7 @@ The Android launcher whale-mark variants were contributed by [@abworks-dev in PR
6
6
 
7
7
  ## Runtime components
8
8
 
9
- 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.
9
+ 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. The exact statically linked Go module versions and complete license and notice texts are generated from the bundled Windows x64 helper into `FUNNEL_THIRD_PARTY_LICENSES.txt` by `scripts/funnel-third-party-licenses.mjs`; that generator reads only `bin/dsh-mobile-funnel-win32-x64.exe` and records only that executable's SHA-256, and the resulting file is included in every npm package. The Linux x64 and Linux arm64 helpers are built from the same sources, but their embedded module metadata is not read by that generator and must be verified separately before publishing a change under `native/funnel-host`.
10
10
 
11
11
  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).
12
12
 
@@ -18,7 +18,7 @@ The optional managed Caddy component is not included in the npm package or Andro
18
18
 
19
19
  The experimental Rust transport is adapted from [dsh-mobile-iroh](https://github.com/saya-ch/dsh-mobile-iroh), copyright 2026 Guangqi Zhang, under the MIT License, and the host baseline preserves zexadev's MIT-licensed dsh-tether attribution. The source notices and complete licenses are retained under `native/iroh-host/` and included with the npm package. The optional sidecar is not bundled: explicit installation reuses a verified companion copy or downloads the size- and SHA-256-pinned companion release payload. Enabling the channel alone does not download it.
20
20
 
21
- 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) `2.4.0`, [bonjour-service](https://github.com/onlxltd/bonjour-service) `1.4.4`, [eventsource-parser](https://github.com/rexxars/eventsource-parser) `4.1.3`, [qrcode](https://github.com/soldair/node-qrcode) `^1.5.4`, [selfsigned](https://github.com/jfromaniello/selfsigned) `^5.5.0`, [ws](https://github.com/websockets/ws) `8.22.0`, and [Zod](https://zod.dev/) `4.6.7`. These packages are distributed under the MIT License; the release checkout's exact transitive versions appear in the attached CycloneDX npm SBOM.
21
+ The npm package declares direct runtime dependencies on Schemastery (`@deepseek-ai/schemastery`, upstream [shigma/schemastery](https://github.com/shigma/schemastery)) `^3.18.1`, [@noble/hashes](https://github.com/paulmillr/noble-hashes) `2.4.0`, [bonjour-service](https://github.com/onlxltd/bonjour-service) `1.4.4`, [eventsource-parser](https://github.com/rexxars/eventsource-parser) `4.1.3`, [qrcode](https://github.com/soldair/node-qrcode) `^1.5.4`, [selfsigned](https://github.com/jfromaniello/selfsigned) `^5.5.0`, [ws](https://github.com/websockets/ws) `8.22.0`, and [Zod](https://zod.dev/) `4.6.7`. These packages are distributed under the MIT License; the release checkout's exact transitive versions appear in the attached CycloneDX npm SBOM. This direct-dependency list and its declared version ranges are checked by `npm run check:notices`.
22
22
 
23
23
  Browser Web Push uses [web-push](https://github.com/web-push-libs/web-push) `3.6.7`, distributed under the Mozilla Public License 2.0 (MPL-2.0), for payload encryption and VAPID signing/key generation. It remains an unmodified, external Node runtime dependency, not part of the browser bundle; its npm package supplies the covered source and license. DSH Mobile owns the bounded HTTPS transport and endpoint validation. Exact transitive versions appear in the [npm lockfile](<package-lock.json>) and release SBOM.
24
24
 
@@ -4,14 +4,14 @@
4
4
 
5
5
  DeepSeek Harness is the display name of this community-maintained Android WebView app. It opens the plugin's authenticated HTTPS page rather than bundling another DSH frontend. The app and mobile browsers receive the same DSH features and computer-side mobile customizations.
6
6
 
7
- The current stable app is **0.7.2** (build 87). The npm plugin and Android App have independent versions: a plugin update does not automatically require another APK. See the [0.7.2 changes](#072-update).
7
+ The current stable app is **0.7.4** (build 89). The npm plugin and Android App have independent versions: a plugin update does not automatically require another APK. See the [0.7.4 changes](#074-update).
8
8
 
9
9
  This APK supports Android 10 or later. iPhone and iPad use the [Safari Home Screen web app and optional Web Push](../../docs/WEB_PUSH.en.md), not this Android package; no native iOS app is distributed.
10
10
 
11
11
  ## Install and pair
12
12
 
13
13
  1. Install and enable the plugin using the [project quick start](../../README.en.md#quick-start). Complete LAN setup from the command line or the computer's **Mobile Access** panel.
14
- 2. Install a signed Android APK from [GitHub Releases](https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.2). Choose the compatibility `.apk` for existing HTTPS channels, or the full `-iroh.apk` for experimental iroh on arm64-v8a/x86_64. Both have the same package ID and official signer; install only one and upgrade in place to retain pairings. A differently signed Debug APK cannot replace it; do not uninstall or clear data just to bypass that mismatch.
14
+ 2. Install a signed Android APK from [GitHub Releases](https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.4). Choose the compatibility `.apk` for existing HTTPS channels, or the full `-iroh.apk` for experimental iroh on arm64-v8a/x86_64. Both have the same package ID and official signer; install only one and upgrade in place to retain pairings. A differently signed Debug APK cannot replace it; do not uninstall or clear data just to bypass that mismatch.
15
15
  3. On the computer, generate a pairing key/link under **Mobile Access → Local network**, or configure a remote provider and generate its remote pairing QR code. In the app, choose the matching connection mode and scan or paste the link.
16
16
  4. Name the computer. The app stores each LAN or remote pairing as its own record. The phone does not need a cpolar, Cloudflare or Tailscale app.
17
17
 
@@ -36,6 +36,14 @@ Page zoom changes the whole page and is separate from per-address text preferenc
36
36
 
37
37
  Deleting a local record removes its saved token and pinned CA, not the computer's authorization or every short-lived WebView cookie. Use **Mobile Access** on the computer to revoke access immediately. A full Android clear-app-data reset removes all pairings and web data and is not a normal reconnection step.
38
38
 
39
+ ## 0.7.4 update
40
+
41
+ Cache the revision-addressed mobile page payload on the device, independently of the WebView's HTTP cache: a revalidated boot batch can revalidate with `If-None-Match` and serve the stored body after a 304, and a revision-named plugin combo bundle is addressed by its ordered module list and revision. A body is stored only after its size and SHA-256 match, and a cache miss or any integrity, epoch or ownership failure falls back to the ordinary request; documents, API responses, credentials and non-revisioned assets never qualify, and clearing site data or removing the paired device clears the store. The persistent background-reminder notification now reports the real phase — connecting, connected or not connected — and publishes `connected`, `lastEventAt` and a bounded `lastError` stage through `notification.background.get` and a `DshMobileBg` logcat line, background-service completion notifications carry their own `dsh-task-bg-` tag, the service rebinds to the newly active paired computer instead of retrying the previous Origin, and the opt-in is withdrawn when the active record cannot serve it, including an iroh pairing. A tapped task notification now opens the notified Session inside the live page through the page's in-place hook, falling back to route navigation when the page is not ready or cannot handle the route. Both APK variants retain the established signer and existing pairings; the page-side halves need plugin 0.8.7 or later.
42
+
43
+ ## 0.7.3 update
44
+
45
+ Open the matching conversation after a task-notification tap by carrying a bounded same-origin `dsh-session` route through the native notification, and add an explicit, opt-in `dataSync` foreground service that keeps the current paired-computer event stream alive for completion alerts after Android suspends the page. The service shows a persistent notification, refuses iroh pairings, does not replay events across disconnection, and remains subject to Android foreground-service time limits and battery policy. Both APK variants retain the established signer and existing pairings; the background stream needs plugin 0.8.6 or later.
46
+
39
47
  ## 0.7.2 update
40
48
 
41
49
  Accept the paired gateway's `wss:` certificate callback only when its host and port match the saved HTTPS origin and its certificate passes the pinned CA, validity, signature and SAN checks. Ordinary HTTPS navigation and download rules remain unchanged; third-party WebSocket paths still require computer-side approval. This is an App change and cannot be installed by updating npm. Both APK variants retain the established signer and existing pairings.
@@ -122,7 +130,7 @@ System Back first dismisses supported webpage layers, then handles same-origin W
122
130
 
123
131
  The native soft-keyboard adapter uses plain Enter for a line break only with a visible inset-backed keyboard, no reported hardware keyboard, and a focused active-session composer. The plugin's separate touch-browser rule also uses Enter for draft line breaks, including external keyboards on touch-primary browsers. Menus, composition and modified shortcuts remain DSH-owned; non-touch desktop behavior is unchanged. Use Send for multiline messages or Shift+Enter where DSH's normal keyboard policy applies.
124
132
 
125
- System bars, cutouts and keyboard occupancy are reserved once. WebView 151+ receives a minimum 64 MiB HTTP-cache quota for reusable versioned DSH resources; older engines retain their default quota. A Chromium-below-100 reminder is advisory, not a promise that every DSH API is supported on that engine.
133
+ System bars, cutouts and keyboard occupancy are reserved once. A WebView that supports `HTTP_CACHE_MANAGER` and `MULTI_PROFILE` receives a minimum 64 MiB HTTP-cache quota for reusable versioned DSH resources; older engines retain their default quota. A Chromium-below-100 reminder is advisory, not a promise that every DSH API is supported on that engine.
126
134
 
127
135
  A successful App connection does not establish that its engine can execute the page. The DSH 0.2.1-rc.2 frontend contains syntax Chromium 92 cannot parse. If system WebView cannot be updated, use a browser confirmed to work without clearing pairings. See the [old-engine notes](../../README.en.md#app-or-mobile-browser) for the plugin's startup feedback and support limits.
128
136
 
@@ -132,9 +140,11 @@ DSH records audio through `getUserMedia` and sends it to the configured computer
132
140
 
133
141
  ## Notifications and extensions
134
142
 
135
- Task reminders use Host completion events and pending-input cards while the page remains alive. Lock-screen text is generic and tapping returns to the app. They are not an offline push service: completion reminders require SSE, with no event replay after disconnection. Cloudflare Quick Tunnels do not support this stream; see [channel limits](../../docs/CLOUDFLARE_TUNNEL.en.md#quick-tunnel-feature-limits).
143
+ Task reminders use Host completion events and pending-input cards. While the page is alive it sends notifications through the native bridge; **Settings → General → Task notifications** can explicitly enable **background reminders**, a foreground service that can be turned off in Settings and keeps the active paired-computer connection alive after Android suspends the page. The service remains subject to foreground-service time limits, battery policy and connectivity, displays a persistent notification, does not yet support iroh pairings, and does not replay events across disconnection. A tap may carry a bounded same-origin `dsh-session` route, which opens the matching conversation after a cold or warm start; any other target falls back to the app root. Cloudflare Quick Tunnels do not support the event stream; see [channel limits](../../docs/CLOUDFLARE_TUNNEL.en.md#quick-tunnel-feature-limits).
136
144
 
137
- The authenticated page may use the `dshMobile` bridge for `files.pick`, `camera.capture`, `share`, clipboard read/write, task notifications/settings, computer switching and page scaling. The separate extension `files.pick` returns one file, follows its requested MIME types and limits bridge-returned file bytes to 8 MiB. This is not the standard DSH attachment selector's limit.
145
+ Android's own battery management can still stop delivery, and the persistent notification does not prove the stream is alive: it stays while the service runs, whatever the connection is doing. Settings → General reports the service's real phase — connected, not connected, or the bounded failure stage it last recorded — and a `DshMobileBg` logcat line records the same transitions for `adb logcat` diagnosis. On an OEM build that freezes a background process (for example Xiaomi HyperOS's app battery saver), no App-side change keeps the stream open: allow battery use without restriction for this App, or accept that reminders arrive when the App is next foregrounded. iOS is unaffected because it uses the Web Push path instead.
146
+
147
+ The authenticated page may use the `dshMobile` bridge for `files.pick`, `camera.capture`, `share`, clipboard read/write, task notifications/settings, background reminders (`notification.background.get`/`set`), computer switching and page scaling. The separate extension `files.pick` returns one file, follows its requested MIME types and limits bridge-returned file bytes to 8 MiB. This is not the standard DSH attachment selector's limit.
138
148
 
139
149
  Bridge file/camera operations are serialized with a five-minute deadline. Cancellation, document/session changes or WebView teardown reject stale results and clean up owned resources. Browser media selection waits for an actual result, explicit cancellation, abort or deadline; returning focus is not itself cancellation. Unsupported capabilities return `unsupported`.
140
150
 
@@ -147,7 +157,7 @@ Computer-side `host.mjs` extensions are trusted Node.js code, separate from this
147
157
  | Transport | HTTPS only; Manifest cleartext traffic is disabled. |
148
158
  | Trust | Exact-Origin platform trust or a privately pinned pairing CA. User-installed system CAs are not broadly trusted. |
149
159
  | Navigation | Same-origin main frames remain inside; explicit external HTTPS links open in the system browser. |
150
- | Permissions | Camera for explicit scanning/capture, microphone for DSH recording, notifications through a foreground permission/settings action; standard file selection needs no storage permission. |
160
+ | Permissions | Camera for explicit scanning/capture, microphone for DSH recording, notifications through a foreground permission/settings action, and an explicitly enabled `dataSync` foreground service for background reminders; standard file selection needs no storage permission. |
151
161
  | Bridge | WebMessage listener validates exact top-level Origin and main frame; no `addJavascriptInterface` or arbitrary Android API. |
152
162
  | Limits | Inbound message 1 MiB, clipboard 256 KiB, binary bridge result 8 MiB, reply 12 MiB. |
153
163
  | Credentials | Bridge replies do not automatically include stored pairing credentials; there is no direct bridge API for reading the credential store or private keys. Clipboard contents and selected files may contain sensitive data: use only trusted extensions. |
@@ -178,10 +188,14 @@ Native builds also include the JVM TLS verifier matching `native/Cargo.lock`, fr
178
188
 
179
189
  Current-source Debug builds use package `io.github.sayach.dshmobile.debug` with a `-debug` version suffix. They install beside the official App with separate storage and pairings. They do not upgrade or migrate an older unsuffixed Debug installation; preserve that app and its data rather than uninstalling or clearing it to switch packages. Release builds keep `io.github.sayach.dshmobile` and the established signer.
180
190
 
181
- The verified stable release is [Android 0.7.2](https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.2), build 87. The compatibility and full APKs each have a matching `.sha256` asset. Both public downloads retain the established release signer and package `io.github.sayach.dshmobile`. Earlier release history belongs in [CHANGELOG](../../CHANGELOG.md).
191
+ The verified stable release is [Android 0.7.4](https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.4), build 89. The compatibility and full APKs each have a matching `.sha256` asset. Both public downloads retain the established release signer and package `io.github.sayach.dshmobile`. Earlier release history belongs in [CHANGELOG](../../CHANGELOG.md).
182
192
 
183
193
  ## Acceptance and known limits
184
194
 
195
+ - Both public App 0.7.4 APKs passed checksum, manifest, established-signer and size checks; the compatibility APK contains no native libraries and the full APK carries only the two iroh transport ABIs. There is no new physical-device or public-network run for 0.7.4: the device cache, background-reminder status and in-place notification tap paths are covered by the Android unit tests and CI release builds only, and the Debug-device evidence below belongs to 0.7.3.
196
+
197
+ - A current-source Debug build (0.7.3/build 88) paired over a cloudflared remote origin received a real completed-turn notification while the app was backgrounded and the screen locked, and tapping it opened the `dsh-session` route to the matching conversation; disabling the opt-in stopped the service and removed the notification. This was the Debug signer on one test device over a public tunnel; it does not establish the published APK, iroh, or every network and OEM behavior.
198
+
185
199
  - Both public App 0.7.1 APKs passed checksum, manifest, established-signer, notice and alignment checks. The full APK additionally passed ABI and retained JVM TLS/JNI entry checks; compatibility contains no native libraries. There is no new physical-device or public-relay run for 0.7.1. Earlier arm64 development traffic remains historical evidence, not proof that a current connection uses the relay.
186
200
 
187
201
  - A current-source Debug build was installed beside the official App on TB710FU (Android API 36) and paired to an isolated DSH 0.2.2-rc.1 gateway with a pinned local CA. The DSH page opened, system Back returned to the launcher, the task-notification permission flow opened, and enabling then disabling background reminders started and stopped a `dataSync` foreground service with its persistent notification. This was an isolated Debug package, not the official signer, and did not deliver a real task-completion event through a model run.
@@ -4,14 +4,14 @@
4
4
 
5
5
  DeepSeek Harness 是这个社区维护的 Android WebView App 的显示名称。它直接打开插件提供的已认证 HTTPS 页面,不打包另一套 DSH 前端;App 与手机浏览器获得相同的 DSH 功能,以及电脑端配置的移动页面定制。
6
6
 
7
- 当前正式 App 为 **0.7.2**;构建号为 87。npm 插件与 Android App 独立编号、独立更新;插件升级不代表需要重新安装 APK。此次改进见 [0.7.2 更新](#072-更新)。
7
+ 当前正式 App 为 **0.7.4**;构建号为 89。npm 插件与 Android App 独立编号、独立更新;插件升级不代表需要重新安装 APK。此次改进见 [0.7.4 更新](#074-更新)。
8
8
 
9
9
  此 APK 支持 Android 10 及以上系统。iPhone 和 iPad 使用 [Safari 主屏幕 Web App 与可选网页推送](../../docs/WEB_PUSH.md),不安装 Android 包;本项目不分发原生 iOS App。
10
10
 
11
11
  ## 安装与配对
12
12
 
13
13
  1. 按[项目快速开始](../../README.md#快速开始)安装并启用插件。局域网配置可通过命令行或电脑端的 **移动访问** 面板完成。
14
- 2. 从 [GitHub Releases](https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.2) 安装已签名 APK。原有 HTTPS 通道可选兼容版 `.apk`;arm64-v8a/x86_64 设备使用实验性 iroh 时选完整版 `-iroh.apk`。两包使用相同包名和正式签名,选一个原位升级即可保留配对;不同签名的 Debug 包不能直接覆盖正式版,不要为绕过签名不匹配而卸载或清除数据。
14
+ 2. 从 [GitHub Releases](https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.4) 安装已签名 APK。原有 HTTPS 通道可选兼容版 `.apk`;arm64-v8a/x86_64 设备使用实验性 iroh 时选完整版 `-iroh.apk`。两包使用相同包名和正式签名,选一个原位升级即可保留配对;不同签名的 Debug 包不能直接覆盖正式版,不要为绕过签名不匹配而卸载或清除数据。
15
15
  3. 在电脑 **移动访问 → 局域网访问** 中生成密钥/配对链接,或配置远程通道并生成远程配对二维码。在 App 选择对应方式,扫码或粘贴链接。
16
16
  4. 为电脑命名。每条局域网或远程配对单独保存;手机无需安装 cpolar、Cloudflare 或 Tailscale App。
17
17
 
@@ -36,6 +36,14 @@ DeepSeek Harness 是这个社区维护的 Android WebView App 的显示名称。
36
36
 
37
37
  删除本机记录会移除保存的设备令牌和固定 CA,不等于撤销电脑授权或清除所有 WebView 短期 Cookie。需要立即终止访问时,请在电脑的 **移动访问** 中撤销设备。Android“清除应用数据”会删除全部配对和网页数据,不是普通重连的处理步骤。
38
38
 
39
+ ## 0.7.4 更新
40
+
41
+ 把按修订号寻址的移动端页面载荷缓存在设备上,独立于 WebView 自身的 HTTP 缓存:经重新校验的启动批次可用 `If-None-Match` 校验,并在 304 后直接返回已存正文;按修订号命名的插件组合包按有序模块列表与修订号寻址。只有大小与 SHA-256 都与取回字节一致后才写入缓存;缓存未命中或任何完整性、epoch、归属校验失败都会回退到普通请求;文档、API 响应、凭据与未按修订号命名的资源不参与缓存;清除站点数据或移除已配对设备会清空该存储。后台提醒的常驻通知现在显示真实阶段(连接中、已连接、未连接),并通过 `notification.background.get` 与 `DshMobileBg` logcat 行发布 `connected`、`lastEventAt` 和有界的 `lastError` 阶段;后台服务的完成通知使用独立的 `dsh-task-bg-` 标签,服务会重新绑定到新激活的已配对电脑而不是继续重试原 Origin,活动记录无法提供服务(包括 iroh 配对)时撤回该选项。点击任务通知现在先由页面内的就地钩子在活动页面中打开对应会话,页面未就绪或无法处理该路由时回退到路由跳转。两种 APK 均沿用正式签名,可原位升级并保留已有配对;页面侧的一半需要插件 0.8.7 或更高版本。
42
+
43
+ ## 0.7.3 更新
44
+
45
+ 任务通知点击可携带经校验的同源 `dsh-session` 路由,冷启动或热启动后打开对应会话;并新增可显式开启的 `dataSync` 前台服务,在 Android 挂起页面后继续接收当前已配对电脑的完成事件。该服务显示常驻通知,不支持 iroh 配对,断连期间不补发,仍受 Android 前台服务时限与电池策略限制。两种 APK 均沿用正式签名,可原位升级并保留已有配对;后台事件流需要插件 0.8.6 或更高版本。
46
+
39
47
  ## 0.7.2 更新
40
48
 
41
49
  仅当 `wss:` 证书回调的主机、端口与已保存的 HTTPS 入口一致,且证书通过固定 CA、有效期、签名和 SAN 校验时,才允许该连接。普通 HTTPS 导航与下载规则不变,第三方 WebSocket 路径仍需电脑端明确放行。这是 App 原生改动,仅升级 npm 不会安装;两种 APK 均沿用正式签名,可保留已有配对升级。
@@ -122,7 +130,7 @@ DSH 的文件入口仍在 **添加** 组;当前附件 owner 支持图片时,
122
130
 
123
131
  原生软键盘适配只在屏幕键盘占据窗口、未报告实体键盘且活动会话输入框聚焦时,把普通 Enter 用作换行。插件另有触屏浏览器规则,也将 Enter 用于草稿换行,触屏设备的外置键盘同样可能使用该规则。菜单、输入法组合和组合键仍交给 DSH,非触屏桌面行为不变;多行消息请点发送,DSH 常规键盘策略下也可用 Shift+Enter 换行。
124
132
 
125
- 系统栏、屏幕缺口和键盘空间只预留一次。WebView 151+ 为 App 的可复用版本化 DSH 资源提供至少 64 MiB HTTP 缓存配额;旧内核保持默认配额。Chromium 低于 100 的提醒不阻断使用,也不承诺旧内核支持全部 DSH 接口。
133
+ 系统栏、屏幕缺口和键盘空间只预留一次。支持 `HTTP_CACHE_MANAGER`/`MULTI_PROFILE` 的 WebView 为 App 的可复用版本化 DSH 资源提供至少 64 MiB HTTP 缓存配额;旧内核保持默认配额。Chromium 低于 100 的提醒不阻断使用,也不承诺旧内核支持全部 DSH 接口。
126
134
 
127
135
  App 连接成功不代表网页脚本能够运行。DSH 0.2.1-rc.2 的前端含有 Chromium 92 无法解析的语法;系统内核无法更新时可使用已验证可用的浏览器,不必清除配对。插件的启动反馈与支持范围见[旧内核说明](../../README.md#app-与手机浏览器)。
128
136
 
@@ -132,9 +140,11 @@ DSH 通过 `getUserMedia` 录音并交给电脑已配置的语音提供方,不
132
140
 
133
141
  ## 通知与扩展
134
142
 
135
- 任务提醒依赖页面仍存活时收到的 Host 完成事件和待确认卡片。锁屏只显示通用文案,点击返回 App;它不是离线推送服务,完成事件需要 SSE,断连后不会补发。Cloudflare 快速隧道不支持该事件流,详见[通道限制](../../docs/CLOUDFLARE_TUNNEL.md#快速隧道的功能限制)。
143
+ 任务提醒依赖 Host 完成事件和待确认卡片。页面仍存活时由网页走原生 Bridge 发通知;在**设置 → 通用设置 → 任务通知**下可显式开启**后台提醒**,由可关闭的前台服务保持与当前已配对电脑的连接,页面被系统挂起后仍可收到完成事件。该服务会显示常驻通知,受 Android 前台服务时限、电池策略和网络影响;iroh 配对暂不支持,断连期间不补发。点击通知可携带有界的同源 `dsh-session` 路由,冷启动或热启动后打开对应会话;其他目标一律回退到 App 根入口。Cloudflare 快速隧道不支持事件流,详见[通道限制](../../docs/CLOUDFLARE_TUNNEL.md#快速隧道的功能限制)。
136
144
 
137
- 认证页面可通过 `dshMobile` Bridge 调用 `files.pick`、`camera.capture`、分享、剪贴板读写、任务通知/设置、切换电脑及页面缩放。扩展单独调用的 `files.pick` 返回一个文件,遵循声明的 MIME 类型,通过 Bridge 返回的文件最多 8 MiB;这不是 DSH 标准附件选择器的大小限制。
145
+ Android 自身的电池管理仍可能中断投递,而且常驻通知**不代表**事件流是活的:服务一在跑它就在,与连接状态无关。设置 → 通用设置会显示服务的真实阶段(已连接、未连接或最后一次记录到的有界失败阶段),并写入 `DshMobileBg` logcat 行,便于用 `adb logcat` 定位。在会冻结后台进程的厂商系统上(例如小米 HyperOS 的应用电池省电策略),App 侧无法维持这条流:请为该 App 关闭电池限制,或接受提醒在下一次回到前台时才出现。iOS 走网页推送通道,不受此限。
146
+
147
+ 认证页面可通过 `dshMobile` Bridge 调用 `files.pick`、`camera.capture`、分享、剪贴板读写、任务通知/设置、后台提醒(`notification.background.get`/`set`)、切换电脑及页面缩放。扩展单独调用的 `files.pick` 返回一个文件,遵循声明的 MIME 类型,通过 Bridge 返回的文件最多 8 MiB;这不是 DSH 标准附件选择器的大小限制。
138
148
 
139
149
  Bridge 文件/相机操作串行执行,最长等待五分钟。取消、文档/会话变化或 WebView 销毁会拒绝旧结果并清理资源。浏览器媒体选择等待实际结果、明确取消、中止或超时,恢复焦点不直接视为取消;不支持的能力返回 `unsupported`。
140
150
 
@@ -147,7 +157,7 @@ Bridge 文件/相机操作串行执行,最长等待五分钟。取消、文
147
157
  | 传输 | 仅 HTTPS,Manifest 禁止明文流量。 |
148
158
  | 信任 | 按精确 Origin 使用系统信任或私有配对 CA,不广泛信任用户另装的系统 CA。 |
149
159
  | 导航 | 同源主页面保留,明确点击的外部 HTTPS 链接交给系统浏览器。 |
150
- | 权限 | 明确扫码/拍照时申请相机权限,DSH 录音时申请麦克风权限,通过前台操作申请或设置通知;标准选文件无需存储权限。 |
160
+ | 权限 | 明确扫码/拍照时申请相机权限,DSH 录音时申请麦克风权限,通过前台操作申请或设置通知;后台提醒使用用户显式开启的 `dataSync` 前台服务;标准选文件无需存储权限。 |
151
161
  | Bridge | WebMessage listener 校验精确顶层 Origin 和主框架,不使用 `addJavascriptInterface`,不暴露任意 Android API。 |
152
162
  | 限额 | 入站消息 1 MiB、剪贴板 256 KiB、二进制 Bridge 结果 8 MiB、回复 12 MiB。 |
153
163
  | 凭据 | Bridge 回复不自动附带已保存的配对凭据,也不提供直接读取凭据存储或私钥的接口;剪贴板和所选文件仍可能包含敏感内容,请仅使用可信扩展。 |
@@ -178,10 +188,14 @@ Set-Location apps/mobile/android
178
188
 
179
189
  当前源码的 Debug 构建使用包名 `io.github.sayach.dshmobile.debug` 与 `-debug` 版本后缀,可与正式 App 并存,存储和配对彼此独立。它不会升级或迁移旧版无后缀 Debug 应用;切换包名时应保留旧应用和数据,不要为此卸载或清除。Release 构建继续使用 `io.github.sayach.dshmobile` 与既定正式签名。
180
190
 
181
- 已核验的正式版本为 [Android 0.7.2](https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.2),构建 87。兼容版与完整版分别附有对应的 `.sha256` 校验文件;两个公开下载均沿用正式发布签名及包名 `io.github.sayach.dshmobile`。旧版本历史集中在 [CHANGELOG](../../CHANGELOG.md)。
191
+ 已核验的正式版本为 [Android 0.7.4](https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.7.4),构建 89。兼容版与完整版分别附有对应的 `.sha256` 校验文件;两个公开下载均沿用正式发布签名及包名 `io.github.sayach.dshmobile`。旧版本历史集中在 [CHANGELOG](../../CHANGELOG.md)。
182
192
 
183
193
  ## 验收与已知限制
184
194
 
195
+ - App 0.7.4 的两份公开 APK 均通过校验值、Manifest、既定正式签名与体积检查;兼容版不含原生库,完整版只携带两个 iroh 传输 ABI。本版未新增真机或公网回归:设备端缓存、后台提醒状态与通知就地打开仅由 Android 单元测试与 CI 发布构建覆盖,下方的真机 Debug 证据属于 0.7.3。
196
+
197
+ - 当前源码 Debug 构建(0.7.3/构建 88)经 cloudflared 远程入口配对后,在 App 退到后台且锁屏时收到了真实回合完成通知;点击后打开对应会话的 `dsh-session` 路由,关闭该选项后服务停止并移除通知。这是单台设备、公网隧道和 Debug 签名的验证,不代表正式 APK、iroh 或所有网络与厂商行为。
198
+
185
199
  - App 0.7.1 的两份公开 APK 均通过校验值、Manifest、既定正式签名、许可文本和对齐检查;完整版另检查两个 ABI 及保留的 JVM TLS/JNI 入口,兼容版确认没有原生库。本版未新增真机或公网中继回归。较早 arm64 开发构建的链路记录仍属历史证据,不能据此断言当前连接的数据已经过中继。
186
200
 
187
201
  - 当前源码的 Debug 构建曾与正式 App 并存安装到 TB710FU(Android API 36),通过隔离的 DSH 0.2.2-rc.1 网关和固定本地 CA 配对;DSH 页面成功打开,系统返回键回到桌面,任务通知权限流程可打开,开启和关闭后台提醒分别启动、停止了带常驻通知的 `dataSync` 前台服务。这是隔离 Debug 包,不是正式签名 APK,也没有通过真实模型回合投递一条完成事件。
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.7.2",
3
- "versionCode": 87,
4
- "releaseTag": "android-v0.7.2"
2
+ "version": "0.7.4",
3
+ "versionCode": 89,
4
+ "releaseTag": "android-v0.7.4"
5
5
  }
Binary file