dsh-mobile 0.6.2 → 0.6.3
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 +14 -0
- package/CONTRIBUTORS.md +11 -4
- package/README.en.md +11 -7
- package/README.md +11 -7
- package/SECURITY.md +3 -2
- package/apps/mobile/README.md +14 -2
- package/apps/mobile/release.json +3 -3
- package/cordis.patch.yml +2 -1
- package/docs/ATTACH_EXISTING_FRPS.md +1 -1
- package/docs/CADDY_MANAGED.en.md +15 -1
- package/docs/CADDY_MANAGED.md +15 -1
- package/docs/CLOUDFLARE_TUNNEL.en.md +2 -2
- package/docs/CLOUDFLARE_TUNNEL.md +3 -3
- package/docs/EXTENSION_WORKERS.en.md +49 -0
- package/docs/EXTENSION_WORKERS.md +49 -0
- package/docs/MOBILE_COMPOSER_TOOLBAR.en.md +19 -0
- package/docs/MOBILE_COMPOSER_TOOLBAR.md +19 -0
- package/docs/README.md +2 -0
- package/docs/SELF_HOSTED_FRP.en.md +1 -1
- package/docs/SELF_HOSTED_FRP.md +1 -1
- package/docs/TRUSTED_NETWORKS.en.md +1 -1
- package/docs/TRUSTED_NETWORKS.md +1 -1
- package/lib/cli.js +1 -0
- package/lib/cli.js.map +1 -1
- package/lib/client.js +864 -97
- package/lib/client.js.map +1 -1
- package/lib/extension-worker-runtime.mjs +1646 -0
- package/lib/extension-worker-runtime.mjs.map +1 -0
- package/lib/index.d.mts +199 -7
- package/lib/index.mjs +1594 -533
- package/lib/index.mjs.map +1 -1
- package/lib/mobile-layout.js.map +1 -1
- package/package.json +15 -6
- package/packages/question-fixes/LICENSE +201 -0
- package/packages/question-fixes/package.json +9 -2
- package/node_modules/dsh-mobile-question-fixes/lib/client.js +0 -78
- package/node_modules/dsh-mobile-question-fixes/lib/client.js.map +0 -1
- package/node_modules/dsh-mobile-question-fixes/lib/index.mjs +0 -14
- package/node_modules/dsh-mobile-question-fixes/lib/index.mjs.map +0 -1
- package/node_modules/dsh-mobile-question-fixes/package.json +0 -25
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
Notable changes are recorded here. GitHub Releases provide the downloadable packages and generated commit notes.
|
|
4
4
|
|
|
5
|
+
## 0.6.3 - 2026-10-10
|
|
6
|
+
|
|
7
|
+
- Add opt-in, per-local-extension Worker execution with bounded threads/V8/IPC, cooperative cancellation followed by termination, fair streaming credit and explicit recovery without replay. The default remains in-process; Workers expose a logger-only context and are not a security sandbox. Retain @chintoleung's three original prototype commits from [#189](https://github.com/saya-ch/dsh-mobile/issues/189), with integration and lifecycle corrections. [Guide](docs/EXTENSION_WORKERS.en.md).
|
|
8
|
+
- Integrate @abworks-dev's [PR #192](https://github.com/saya-ch/dsh-mobile/pull/192) with plugin-only compact/overflow corrections. Keep native InputBar ownership, model width observation, original handlers, menus and live activity nodes; Send/Stop remain reachable. This is not the proposed shared upper scrollport, which still requires an upstream parent-toolbar seam. [Layout scope](docs/MOBILE_COMPOSER_TOOLBAR.en.md).
|
|
9
|
+
- Protect Android paired-record writes and legacy migration from unreadable encrypted data; retain old ciphertext rather than treating it as an empty list. Prevent cancelled SDK calls from starting queued Native operations after disposal.
|
|
10
|
+
- Correct audit regressions: preserve third-party HTML/iframe routes, reject unknown raw TLS modes, guard managed parent links and cleanup ownership, retain rollback backups, contain file-log failures and stop unverified authenticated SSH fallback before fingerprint confirmation. Await owned process/cleanup completion and align the guides with actual logging, permissions and independent versioning.
|
|
11
|
+
- Fix fresh installation and upgrades through DSH's plugin manager, including hoisted pnpm profiles. The question-card component remains inside the plugin package and independently switchable, without a separate package installation or user workaround. Thanks @MLYR for [#193](https://github.com/saya-ch/dsh-mobile/issues/193).
|
|
12
|
+
- Follow DSH 0.2.1-alpha.2 typography: mobile General settings retain device-local body size and add collapsed body/code font controls and a reset action. Preferences do not change the computer or other devices; existing mobile font settings are retained. Terminal fonts remain owned by DSH.
|
|
13
|
+
- Add Android App 0.6.2 (build 78), separately from plugin 0.6.3. Keep web content inside the native system-bar, cutout and keyboard area; add native-only page zoom in General settings, with 80–125% scaling and a 100% reset, without reloading the conversation. Older App versions and browsers do not show this control.
|
|
14
|
+
- Add a nonblocking update reminder for WebViews reporting Chromium below 100. Users may continue; unknown engine versions are not treated as obsolete, and each detected build is warned about once. This does not promise full compatibility with unsupported old engines.
|
|
15
|
+
- Improve bounded Windows retries and rollback for managed Caddy preparation while keeping official managed installation disabled. Thanks @abworks-dev for [PR #190](https://github.com/saya-ch/dsh-mobile/pull/190).
|
|
16
|
+
- Hide the duplicate passive pin marker on narrow mobile session lists while retaining pin actions and desktop presentation. Thanks @chintoleung for [PR #191](https://github.com/saya-ch/dsh-mobile/pull/191).
|
|
17
|
+
- Add a repository-local Agent maintenance skill and discovery entrypoint covering compatibility, packaging, runtime/ADB, collaboration and independent releases, with guidance for updating demonstrated reusable lessons.
|
|
18
|
+
|
|
5
19
|
## 0.6.2 - 2026-10-08
|
|
6
20
|
|
|
7
21
|
- Supply missing `AbortSignal.throwIfAborted()` and cancellation reasons before DSH starts on older WebViews. Preserve native implementations, cancellation and the first supplied reason, fixing the reported model/provider and other client API failures caused by the missing method. Thanks @luoyangchan for [#187](https://github.com/saya-ch/dsh-mobile/issues/187).
|
package/CONTRIBUTORS.md
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
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-10 的实际参与方式感谢社区成员;仓库维护者与自动依赖更新仍可在 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-10. The repository maintainer and automated dependency updates remain visible in GitHub's history.
|
|
6
|
+
|
|
7
|
+
## 0.6.3 代码贡献 / Code contributions in 0.6.3
|
|
8
|
+
|
|
9
|
+
[@abworks-dev](https://github.com/abworks-dev) 的 [#190](https://github.com/saya-ch/dsh-mobile/pull/190)、[#192](https://github.com/saya-ch/dsh-mobile/pull/192),以及 [@chintoleung](https://github.com/chintoleung) 的 [#191](https://github.com/saya-ch/dsh-mobile/pull/191) 和在 [#189](https://github.com/saya-ch/dsh-mobile/issues/189) 提供的三个 Worker 原型提交参与本版,保留原始提交并追加适配与修正。具体范围见 [更新记录](CHANGELOG.md#063---2026-10-10)。
|
|
10
|
+
|
|
11
|
+
[@abworks-dev](https://github.com/abworks-dev)'s [#190](https://github.com/saya-ch/dsh-mobile/pull/190) and [#192](https://github.com/saya-ch/dsh-mobile/pull/192), plus [@chintoleung](https://github.com/chintoleung)'s [#191](https://github.com/saya-ch/dsh-mobile/pull/191) and three Worker prototype commits supplied through [#189](https://github.com/saya-ch/dsh-mobile/issues/189), contribute to this release with original history and maintainer corrections. See the [release scope](CHANGELOG.md#063---2026-10-10).
|
|
6
12
|
|
|
7
13
|
## 已合并 PR / Merged PRs
|
|
8
14
|
|
|
@@ -57,7 +63,7 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
57
63
|
| [@BrainZombie](https://github.com/BrainZombie) | [#128](https://github.com/saya-ch/dsh-mobile/issues/128) |
|
|
58
64
|
| [@CESAEREE](https://github.com/CESAEREE) | [#1](https://github.com/saya-ch/dsh-mobile/issues/1) |
|
|
59
65
|
| [@CharlesLueng](https://github.com/CharlesLueng) | [#68](https://github.com/saya-ch/dsh-mobile/issues/68) |
|
|
60
|
-
| [@chintoleung](https://github.com/chintoleung) | [#103](https://github.com/saya-ch/dsh-mobile/issues/103), [#166](https://github.com/saya-ch/dsh-mobile/issues/166) |
|
|
66
|
+
| [@chintoleung](https://github.com/chintoleung) | [#103](https://github.com/saya-ch/dsh-mobile/issues/103), [#166](https://github.com/saya-ch/dsh-mobile/issues/166), [#189](https://github.com/saya-ch/dsh-mobile/issues/189) |
|
|
61
67
|
| [@chmzs](https://github.com/chmzs) | [#73](https://github.com/saya-ch/dsh-mobile/issues/73) |
|
|
62
68
|
| [@gjzbbs](https://github.com/gjzbbs) | [#123](https://github.com/saya-ch/dsh-mobile/issues/123) |
|
|
63
69
|
| [@hairyf](https://github.com/hairyf) | [#114](https://github.com/saya-ch/dsh-mobile/issues/114) |
|
|
@@ -70,6 +76,7 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
70
76
|
| [@KMGTPEZY](https://github.com/KMGTPEZY) | [#95](https://github.com/saya-ch/dsh-mobile/issues/95) |
|
|
71
77
|
| [@luoyangchan](https://github.com/luoyangchan) | [#187](https://github.com/saya-ch/dsh-mobile/issues/187) |
|
|
72
78
|
| [@LWping](https://github.com/LWping) | [#94](https://github.com/saya-ch/dsh-mobile/issues/94) |
|
|
79
|
+
| [@MLYR](https://github.com/MLYR) | [#193](https://github.com/saya-ch/dsh-mobile/issues/193) |
|
|
73
80
|
| [@oliverwan97](https://github.com/oliverwan97) | [#26](https://github.com/saya-ch/dsh-mobile/issues/26) |
|
|
74
81
|
| [@optttt](https://github.com/optttt) | [#111](https://github.com/saya-ch/dsh-mobile/issues/111) |
|
|
75
82
|
| [@qjjer](https://github.com/qjjer) | [#156](https://github.com/saya-ch/dsh-mobile/issues/156) |
|
|
@@ -77,7 +84,7 @@ GitHub's Contributors graph counts commits on the default branch; issue reports
|
|
|
77
84
|
| [@reducm](https://github.com/reducm) | [#127](https://github.com/saya-ch/dsh-mobile/issues/127) |
|
|
78
85
|
| [@rgshendong](https://github.com/rgshendong) | [#87](https://github.com/saya-ch/dsh-mobile/issues/87) |
|
|
79
86
|
| [@RonaldinhoL](https://github.com/RonaldinhoL) | [#89](https://github.com/saya-ch/dsh-mobile/issues/89) |
|
|
80
|
-
| [@rushpixy](https://github.com/rushpixy) | [#165](https://github.com/saya-ch/dsh-mobile/issues/165) |
|
|
87
|
+
| [@rushpixy](https://github.com/rushpixy) | [#165](https://github.com/saya-ch/dsh-mobile/issues/165), [#194](https://github.com/saya-ch/dsh-mobile/issues/194) |
|
|
81
88
|
| [@sanmaoAI1432](https://github.com/sanmaoAI1432) | [#169](https://github.com/saya-ch/dsh-mobile/issues/169) |
|
|
82
89
|
| [@shengyvself](https://github.com/shengyvself) | [#13](https://github.com/saya-ch/dsh-mobile/issues/13), [#14](https://github.com/saya-ch/dsh-mobile/issues/14) |
|
|
83
90
|
| [@snailium](https://github.com/snailium) | [#144](https://github.com/saya-ch/dsh-mobile/issues/144) |
|
package/README.en.md
CHANGED
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
|
|
32
32
|
> DSH Mobile is a DeepSeek Harness community plugin; the native app supports Android only.
|
|
33
33
|
>
|
|
34
|
-
> **Current stable release: 0.6.
|
|
34
|
+
> **Current stable release: 0.6.3**. Improve plugin installation, the mobile composer and current DSH compatibility, add optional extension Workers, and strengthen connection and data reliability. [Release notes](https://github.com/saya-ch/dsh-mobile/releases/tag/v0.6.3).
|
|
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/v0.6.
|
|
40
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.6.
|
|
41
|
-
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.6.
|
|
39
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.6.2/dsh-mobile-android-v0.6.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>
|
|
40
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.6.2/dsh-mobile-android-v0.6.2.apk"><strong>Download Android app 0.6.2</strong></a><br>
|
|
41
|
+
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.6.2">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.
|
|
@@ -68,7 +68,7 @@ Install the plugin on the computer, then pair the Android app or a mobile browse
|
|
|
68
68
|
|
|
69
69
|
Install and enable `dsh-mobile` from the app's **Plugins** page, then open **Mobile Access** to configure LAN or a remote channel. The app manages its Desktop profile; the `--profile web` commands below do not apply to it.
|
|
70
70
|
|
|
71
|
-
After installing or updating, quit Desktop from the application menu and reopen it. If it reports `dsh-mobile-question-fixes: failed to import`,
|
|
71
|
+
After installing or updating, quit Desktop from the application menu and reopen it without clearing sessions or pairing data. If it still reports `dsh-mobile-question-fixes: failed to import`, check the installation log; a component-resolution failure may not be fixed by restarting alone.
|
|
72
72
|
|
|
73
73
|
### DSH Web
|
|
74
74
|
|
|
@@ -216,6 +216,8 @@ Extension manifests, scripts, styles, and assets are revisioned. When the plugin
|
|
|
216
216
|
|
|
217
217
|
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.
|
|
218
218
|
|
|
219
|
+
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.
|
|
220
|
+
|
|
219
221
|
<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>
|
|
220
222
|
|
|
221
223
|
> `host.mjs` has the same privileges as a local program. Create and run only computer-side extensions that you understand and trust.
|
|
@@ -385,6 +387,8 @@ On macOS, local network, cloudflared, self-hosted FRP and the own reverse proxy
|
|
|
385
387
|
| --- | --- |
|
|
386
388
|
| `0.5.5` | `0.1.7-alpha.2`, `0.1.7-rc.1`, `0.1.7-rc.2`, `0.2.0-rc.1`, and `0.2.0-rc.2` (npm installation, isolated pairing, mobile-page boot, and WebSocket Workspace baseline) |
|
|
387
389
|
| `0.6.0` | `0.1.7-alpha.2`, `0.1.7-rc.1`, `0.1.7-rc.2`, `0.2.0-rc.1` and `0.2.0-rc.2` (packed installation, pairing, mobile-page boot and WebSocket Workspace reads); additional checks cover the mobile composer, module settings and component loading after a normal official Desktop restart |
|
|
390
|
+
| `0.6.2` | Packed legacy-WebView boot, touch scrolling and missing-API/viewport negative controls passed on `0.2.0-rc.2`, with release CI passing. The reporter's physical old devices in #187 were not claimed as accepted |
|
|
391
|
+
| `0.6.3` | `0.2.0-rc.2` and `0.2.1-alpha.2` (packed installation, isolated pairing, mobile boot and WebSocket Workspace reads); additional checks cover the composer, settings and extension Worker timeout, streaming and explicit recovery |
|
|
388
392
|
|
|
389
393
|
<details>
|
|
390
394
|
<summary>Historical version checks</summary>
|
|
@@ -415,7 +419,7 @@ On macOS, local network, cloudflared, self-hosted FRP and the own reverse proxy
|
|
|
415
419
|
|
|
416
420
|
Existing apps (0.3.3 and later) do not need re-pairing. cpolar users should use app 0.3.15 or later because earlier apps may time out before a slow first load over the free route finishes; earlier apps also use a different status-bar strategy. The 0.4.0 app adds the multi-device list, startup behavior, and computer-side revocation status; older apps continue to connect to their saved single device. App 0.1.3 or earlier requires reinstalling and pairing again.
|
|
417
421
|
|
|
418
|
-
The current stable Android app is 0.6.
|
|
422
|
+
The current stable Android app is 0.6.2 (build 78), adding page zoom and improving system-area handling and encrypted-record reliability. Package identity, signing and the pairing/renewal protocol remain compatible without requiring re-pairing. Plugin and app version numbers do not need to match; connections check protocol and minimum-version requirements. Features with additional native requirements state the app version they need.
|
|
419
423
|
|
|
420
424
|
GitHub Release APKs use a stable signing certificate, so an older official APK with the same signer can be upgraded in place while retaining pairings. A locally built Debug APK with a different signer cannot be overwritten by the official APK; plan to pair again when switching between them.
|
|
421
425
|
|
package/README.md
CHANGED
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
|
|
32
32
|
> DSH Mobile 是 DeepSeek Harness 社区插件,原生 App 仅支持 Android。
|
|
33
33
|
>
|
|
34
|
-
> **当前正式版本:0.6.
|
|
34
|
+
> **当前正式版本:0.6.3**。改善插件安装、移动输入栏与 DSH 新版适配,新增可选扩展 Worker 模式,并加强连接与数据可靠性。[更新记录](https://github.com/saya-ch/dsh-mobile/releases/tag/v0.6.3)。
|
|
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/v0.6.
|
|
40
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.6.
|
|
41
|
-
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.6.
|
|
39
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.6.2/dsh-mobile-android-v0.6.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>
|
|
40
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/android-v0.6.2/dsh-mobile-android-v0.6.2.apk"><strong>下载 Android App 0.6.2</strong></a><br>
|
|
41
|
+
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/android-v0.6.2">版本说明与校验文件</a></sub>
|
|
42
42
|
</p>
|
|
43
43
|
|
|
44
44
|
DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App 通过局域网,或可选的 Tailscale Funnel、cpolar、cloudflared、自建 FRP 或自有反向代理远程通道连接电脑,继续使用同一份会话、工作区、消息和工具。电脑端分别启停局域网与远程访问、分别管理配对授权;Android App 统一显示已配对电脑。插件不修改 DeepSeek Harness 源码。
|
|
@@ -68,7 +68,7 @@ DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App
|
|
|
68
68
|
|
|
69
69
|
在应用的 **插件** 页面安装并启用 `dsh-mobile`,再打开 **移动访问** 配置局域网或远程通道。Desktop 的 profile 由应用管理,不适用下面的 `--profile web` 命令。
|
|
70
70
|
|
|
71
|
-
安装或更新后,请从应用菜单正常退出并重新打开 Desktop
|
|
71
|
+
安装或更新后,请从应用菜单正常退出并重新打开 Desktop,无需清除会话或配对数据。若仍提示 `dsh-mobile-question-fixes: failed to import`,请检查安装日志;这也可能是组件解析问题,单纯重启不一定能解决。
|
|
72
72
|
|
|
73
73
|
### DSH Web
|
|
74
74
|
|
|
@@ -216,6 +216,8 @@ Tailscale Funnel 覆盖范围广,但在中国大陆网络下可能不稳定。
|
|
|
216
216
|
|
|
217
217
|
扩展动作的 `input` 可以直接使用 `api.schema.object(...)` 等 Schemastery schema,也可以使用带 `parse(value)` 的适配器;手机端 `api.host.invoke()` 会按 JSON 请求发送,输入会在电脑端动作执行前完成校验和规范化。
|
|
218
218
|
|
|
219
|
+
0.6.3 新增可选的 [Worker 执行模式](docs/EXTENSION_WORKERS.md),用于约束可信本地扩展的 JavaScript 阻塞;默认关闭,按扩展选择,故障后显式恢复,不自动重放操作。这不是权限沙箱,也不要求 App 同步版本。
|
|
220
|
+
|
|
219
221
|
<sub>你甚至可以通过扩展连接电脑上运行的酒馆,并从同一 App 打开它的简易移动前端。</sub>
|
|
220
222
|
|
|
221
223
|
> `host.mjs` 与本机程序拥有相同权限;仅创建和运行你理解并信任的电脑端扩展。
|
|
@@ -386,6 +388,8 @@ macOS 上局域网、cloudflared、自建 FRP 与自有反向代理可用;Funn
|
|
|
386
388
|
| ----------------------------------------- | -------------------------------------------------------------- |
|
|
387
389
|
| `0.5.5` | `0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2`、`0.2.0-rc.1`、`0.2.0-rc.2`(npm 打包安装、隔离配对、移动页面启动及 WebSocket 工作区读取) |
|
|
388
390
|
| `0.6.0` | `0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2`、`0.2.0-rc.1`、`0.2.0-rc.2`(打包安装、配对、移动页面启动与 WebSocket 工作区读取);另验证移动输入栏、模块设置及官方 Desktop 正常重启后的组件加载 |
|
|
391
|
+
| `0.6.2` | `0.2.0-rc.2` 的打包旧 WebView 启动、触屏滚动与缺失 API/视口负对照通过;发布 CI 通过。未将 #187 报告者的实际旧设备写成已验收 |
|
|
392
|
+
| `0.6.3` | `0.2.0-rc.2`、`0.2.1-alpha.2`(打包安装、隔离配对、移动页面与 WebSocket 工作区读取);另验证输入栏、设置与扩展 Worker 的超时、流式传输和显式恢复 |
|
|
389
393
|
|
|
390
394
|
<details>
|
|
391
395
|
<summary>历史版本验证记录</summary>
|
|
@@ -416,7 +420,7 @@ macOS 上局域网、cloudflared、自建 FRP 与自有反向代理可用;Funn
|
|
|
416
420
|
|
|
417
421
|
现有 App(0.3.3 及更新)无需重新配对;cpolar 用户应使用 0.3.15 或更新 App,较早版本可能在免费线路的慢速首次加载完成前超时;更早的 App 还使用不同的状态栏策略。App 0.4.0 才支持多设备列表、启动行为设置和电脑端撤销状态同步;旧版 App 仍可连接已保存的单台设备。App 0.1.3 及更早版本需卸载重装并重新配对。
|
|
418
422
|
|
|
419
|
-
Android App 当前正式版为 0.6.
|
|
423
|
+
Android App 当前正式版为 0.6.2(build 78),新增页面缩放,改善系统区域处理与加密设备记录的可靠性;包名、签名及配对/续期协议保持兼容,已有配对无需重建。插件和 App 的版本号不要求相同;连接按协议及最低版本要求检查,具体原生功能另有要求时会说明所需 App 版本。
|
|
420
424
|
|
|
421
425
|
GitHub Release 的正式 APK 使用固定签名,可从同一签名的旧正式版原位升级并保留配对。自行构建的 Debug APK 若使用不同签名,不能直接覆盖安装正式版;切换前请准备重新配对。
|
|
422
426
|
|
package/SECURITY.md
CHANGED
|
@@ -45,8 +45,9 @@ The maintainer will acknowledge a complete report within seven days. Publication
|
|
|
45
45
|
- Android stores the paired-device list as an encrypted record. Removing a local row erases its local credential but does not revoke the phone at the computer; use the computer-side device controls to revoke access. A computer-side revocation invalidates the token even if the App retains the row's name for re-pairing. Network timeouts are not evidence of revocation.
|
|
46
46
|
- Android grants WebView microphone access only for an audio-only request from the current paired HTTPS Origin, after Android's `RECORD_AUDIO` permission is granted. Other WebView resources and Origins remain denied. Client plugins within the authenticated page share that Origin and can invoke page APIs; install only trusted plugins before granting microphone access.
|
|
47
47
|
- Treat `mobile.js` as application code with the paired page's same-origin authority. Restrict write access to trusted host-side DSH sessions and review generated API calls or browser-permission use.
|
|
48
|
-
- Treat every extension `host.mjs` as a local program with the desktop user's Node.js privileges.
|
|
49
|
-
- Extension Actions and Routes receive filtered request data, a device identifier, and an abort signal
|
|
48
|
+
- Treat every extension `host.mjs` as a local program with the desktop user's Node.js privileges. The extension/Native Bridge API provides no source-upload or editing endpoint, but a paired DSH operator can still use ordinary DSH tools or `/mobile` to edit files. Only run trusted code.
|
|
49
|
+
- Extension Actions and Routes receive filtered request data, a device identifier, and an abort signal; their provided request fields omit gateway credential/internal headers, and the gateway filters returned headers. These are API restrictions, not an OS sandbox preventing trusted Node.js code from accessing local data or networks.
|
|
50
|
+
- Optional local Worker execution contains synchronous JavaScript blocking without changing that trust model. It has thread, transport and V8 limits and explicit recovery, but native crashes/all native allocations and completed side effects are not isolated or rolled back. See the [Worker guide](docs/EXTENSION_WORKERS.en.md).
|
|
50
51
|
### Framed content and browser policy
|
|
51
52
|
|
|
52
53
|
- Proxied GUI responses allow HTTP iframe sources for compatibility with community surfaces. HTTP content is unauthenticated and unencrypted; Android still blocks mixed HTTP content inside HTTPS pages, and browsers may block it too. Prefer HTTPS and do not treat a gateway framing allowance as a transport-security guarantee.
|
package/apps/mobile/README.md
CHANGED
|
@@ -6,7 +6,15 @@ 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.2** (build 78). 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
|
+
|
|
11
|
+
## 0.6.2 update
|
|
12
|
+
|
|
13
|
+
Build 78 keeps web content clear of system navigation, display cutouts and the keyboard, and adds **Settings → General → Page zoom** (80–125%, reset to 100%). Zoom is saved in this App, independently from the per-address mobile font settings, and does not reload the current conversation. Its settings entry requires plugin 0.6.3 or later; older Apps and browsers do not show an inactive control.
|
|
14
|
+
|
|
15
|
+
WebViews reporting Chromium below 100 receive a nonblocking update reminder once per detected build. You may continue, but an obsolete WebView can still lack APIs required by DSH. Use the official WebView/Chrome update route available on your device; an unknown engine version is not treated as obsolete.
|
|
16
|
+
|
|
17
|
+
This release also protects paired records and legacy migration when encrypted data is temporarily unreadable: it does not treat failed reads as an empty list or replace existing credentials. Storage errors are reported without automatically clearing pairings.
|
|
10
18
|
|
|
11
19
|
## 0.6.1 update
|
|
12
20
|
|
|
@@ -65,6 +73,8 @@ On WebView 151 or later, the app gives its own HTTP cache a 64 MiB minimum quota
|
|
|
65
73
|
|
|
66
74
|
To remove one computer, delete its row from the device list. A full reset uses Android system app information → clear app data (labels vary by system). It deletes all pairings, cookies, cache and Web storage and requires pairing again; do not use it as the first response to an ordinary reconnection failure.
|
|
67
75
|
|
|
76
|
+
Deleting a row removes the App's saved device token and pinned certificate, not computer-side authorization. WebView's short-lived site cookies are separate; revoke the device on the computer when access must end immediately. A full App reset clears all sites, so do not use it to remove only one computer.
|
|
77
|
+
|
|
68
78
|
## Security properties
|
|
69
79
|
|
|
70
80
|
| Control | Android behavior |
|
|
@@ -90,10 +100,12 @@ Task reminders use Host completion events and explicit pending-input cards while
|
|
|
90
100
|
|
|
91
101
|
Only one file-selection or camera interaction runs at a time, with a five-minute deadline. Cancellation, WebView destruction, timeout and stale-session results are cleaned up or rejected. Browsers use corresponding Web APIs and return `unsupported` when unavailable.
|
|
92
102
|
|
|
93
|
-
From 0.4.7,
|
|
103
|
+
From App 0.4.7, its native keyboard adapter uses plain Enter for a new draft line when an inset-backed on-screen keyboard is visible, Android reports no hardware keyboard, and an active session composer is focused. The Send button still submits a multiline draft. Floating keyboards, unknown state and older Apps do not use this native rule; the plugin's touch-browser rule below can still apply. Physical keyboards can use Shift+Enter for a line break.
|
|
94
104
|
|
|
95
105
|
From 0.6.0, the main composer in touch-primary browsers uses Enter to add a line to a nonempty draft and does nothing for an empty draft. DSH retains menus, composition and modified shortcuts. An external keyboard on a touch-primary browser uses that same rule; a non-touch desktop is unchanged. General settings offers a mobile font size of 12–32px, default 16px, saved for the current address only; editable inputs retain a 16px minimum.
|
|
96
106
|
|
|
107
|
+
Plugin 0.6.3 adds **More font settings** for body/code fonts, with **Restore defaults**. These are webpage preferences for the current address, not computer-wide settings; they do not require the new APK. Terminal fonts remain controlled by DSH. **Page zoom** is a separate native control described in the 0.6.2 update above.
|
|
108
|
+
|
|
97
109
|
DSH records through `getUserMedia` and sends audio to the configured computer-side DSH speech provider for transcription, not browser-native SpeechRecognition or the extension bridge. The app requests microphone permission on first use and grants audio-only capture for the paired HTTPS Origin. Computer components, model and network must be available; permission does not guarantee transcription. Same-origin client plugins share the page's permissions, so grant recording only when you trust them.
|
|
98
110
|
|
|
99
111
|
Computer-side extensions are separate: their `host.mjs` runs as trusted local Node.js code on the DSH host, while `mobile.js` calls its scoped actions and routes. The app bridge cannot edit or upload extension source files.
|
package/apps/mobile/release.json
CHANGED
package/cordis.patch.yml
CHANGED
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
# Keep long question titles and answer options in one card scrollport.
|
|
34
34
|
# The component switch restores the upstream layout immediately.
|
|
35
|
+
# DSH anchors this file entry beside the bundle patch, independent of pnpm's linker.
|
|
35
36
|
- id: dsh-ui-fixes
|
|
36
|
-
name:
|
|
37
|
+
name: ./packages/question-fixes/lib/index.mjs
|
|
37
38
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
| 项 | 含义 | 你要做什么 |
|
|
14
14
|
|---|---|---|
|
|
15
|
-
| **`vhostHTTPPort`** | 你 frps 上「Caddy ↔ frps」之间的**回环明文 HTTP**
|
|
15
|
+
| **`vhostHTTPPort`** | 你 frps 上「Caddy ↔ frps」之间的**回环明文 HTTP** 端口;本项目托管部署使用 7080,接入已有服务器以其实际配置为准 | 在面板填写**你真实的那个值**。插件不会替你假定 7080:端口填错会让「明文 vhost 公网可达」的安全闸门失效 |
|
|
16
16
|
| **`proxyBindAddr`** | frps 的全局代理监听地址,同时影响 HTTP vhost 和 TCP 代理 | A 档的明文 HTTP vhost 必须只监听回环;B 档的 TCP `remotePort` 要能从公网访问。若既有 frps 设置为 `127.0.0.1`,仅放行防火墙也不会使 B 档公网可达;不要为 B 档盲目改为 `0.0.0.0`,以免暴露同一 frps 上已有的明文 vhost。需先核对整个 frps 的服务与防火墙,必要时改用另一实例或 A 档。 |
|
|
17
17
|
| **入口证书档 `entryTls`** | 谁终止公网 TLS | 见下两档,按需二选一 |
|
|
18
18
|
|
package/docs/CADDY_MANAGED.en.md
CHANGED
|
@@ -22,7 +22,7 @@ Configure the public HTTPS origin, DNS-01 credentials and local HTTPS port separ
|
|
|
22
22
|
|
|
23
23
|
## Installation, startup, and readiness
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
Official component distribution alone does not enable installation: independently verified assets must first be pinned in a separate reviewed production-catalog PR. After that second stage, installation requires explicit download confirmation. The plugin verifies exact length, SHA-256, Caddy core version, and DNS module version; unavailable or invalid assets are not executed. Installed is not ready: after parsing the local configuration, the proxy starts, and readiness requires verified public HTTPS and discovery identifying the current DSH instance.
|
|
26
26
|
|
|
27
27
|
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
28
|
|
|
@@ -58,4 +58,18 @@ Component tags never start with `v`, avoiding the plugin release trigger. The se
|
|
|
58
58
|
|
|
59
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>). Official production installation stays disabled until maintainers publish and review their own distribution.
|
|
60
60
|
|
|
61
|
+
### Official distribution is a separate, two-stage authorization
|
|
62
|
+
|
|
63
|
+
This change prepares a channel, not a release. Stage 1 requires maintainer approval of this workflow PR on reviewed, protected `main`. Maintainers must preconfigure `caddy-component-release` with required reviewers, nonempty reviewer assignments and **prevent self-review**; administrators must not bypass environment approval. GitHub Actions supplies actual approval before the single publisher job starts. The script additionally fetches the real environment policy and refuses missing, malformed or unprotected policy before its first release mutation. An environment name, a main ancestry comparison or synthetic policy tests do not prove human review/approval.
|
|
64
|
+
|
|
65
|
+
Official publication is restricted to the **public** `saya-ch/dsh-mobile` repository and its existing stable non-`v` tag `caddy-component-2.11.6-tencentcloud-0.4.3`. Both publication inputs default to false; choosing both fails the early native validation. Wrong events, branches, repositories or channel/tag identities cannot publish. Before mutations the publisher resolves `/commits/TAG` to the exact Actions `GITHUB_SHA`; `/compare/main...SHA` must be `identical` or `behind` (main membership/ancestry only, **not code review**). The prepared assets and source metadata use that same SHA and both native builds from the same run, not older downloaded builds.
|
|
66
|
+
|
|
67
|
+
The publisher keeps only `contents: write`, using `GITHUB_TOKEN` for API calls and no token/API headers for public assets. [GitHub's Get an environment documentation](<https://docs.github.com/en/rest/deployments/environments?apiVersion=2022-11-28#get-an-environment>) normally requires Actions read, but explicitly permits public resources without that permission. This narrowly scoped public-resource exception is a prerequisite, not a verified live token capability: any authenticated 401/403/404/5xx or network failure is fatal before release creation; there is no unauthenticated retry, privilege escalation or alternate publication secret. Maintainers must confirm repository visibility, endpoint readability and protected-environment configuration. If authenticated access fails, report missing read capability rather than relaxing policy. Review publication uses `caddy-component-review` and does not apply the official policy requirement.
|
|
68
|
+
|
|
69
|
+
After those prerequisites and explicit publication authorization (not as part of this preparation task), maintainers can dispatch the existing stable tag with `publish_official_release=true` and review input false. The one existing Windows/Linux x64 matrix still builds twice, verifies native installer/TLS/API/WSS/no-system-trust behavior, and runs the full tests/build. The generic publisher creates `--draft --prerelease=false --latest=false`, refuses occupied releases without update/clobber/delete retries, uploads and downloads **all 16 assets**, compares them byte-for-byte, then publishes `--draft=false --prerelease=false --latest=false`. Review flags remain prerelease/non-latest. Official verification permits `/releases/latest` 404 when no latest exists, but rejects this component as latest and any other error or malformed success. The component never replaces the latest plugin, nor publishes npm/APK automatically. Post-publication verification failure leaves the public release in place, fails the job and emits no candidate; it never rolls back destructively.
|
|
70
|
+
|
|
71
|
+
The existing prepare/verify CLI signatures default strictly to review; only an optional trailing `--channel official` (or `--channel review`) selects the shared exact identity rules. Official `COMPONENT-RELEASE.json` has kind `managed-caddy-component-official`; successful public metadata/size/hash and actual HTTPS/validated-redirect verification of every asset emits `official-candidate-not-production`. Both channel indices and candidates retain `productionCatalogEnabled: false`; outputs are bounded and exclusive, never overwritten.
|
|
72
|
+
|
|
73
|
+
Stage 2 is **later**: independently verify the actually published official bytes, then submit a separate reviewed PR that hardcodes the exact source/size/hash pins in `CADDY_COMPONENT_RELEASES`. It remains exactly `Object.freeze({})` during this preparation. Remote candidate JSON is never runtime trust/configuration. Support remains Windows/Linux x64 with Tencent Cloud DNS only. Do not replace a private preview with an official plugin package whose catalog is empty and expect managed restart to work. Human live-network evidence is separate from final-candidate CI; neither isolated tests nor that evidence establish certificate renewal.
|
|
74
|
+
|
|
61
75
|
Isolated tests use ephemeral loopback listeners and a private internal CA with `skip_install_trust`; no system trust, production DNS or existing proxy is changed. They **do not establish public DNS-01/ACME issuance or public-route readiness**. Those need a separately authorized dedicated test hostname, least-privilege DNS credentials and actual reachable ingress.
|
package/docs/CADDY_MANAGED.md
CHANGED
|
@@ -22,7 +22,7 @@ Android App / 浏览器 → 公网 HTTPS 域名(Caddy 终止 TLS)
|
|
|
22
22
|
|
|
23
23
|
## 安装、启动与就绪
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
官方组件分发本身不启用安装:还需独立验证实际资产,并通过后续独立审核的生产目录 PR 固定来源。完成第二阶段后,安装仍需要你明确确认下载。插件检查完整大小、SHA-256、Caddy 核心版本和 DNS 模块版本;来源不可用或验证失败时不执行文件。组件已安装不等于连接就绪:本地配置完成解析后启动代理,只有公网 HTTPS 证书通过验证,并确认 discovery 属于当前 DSH 实例,才显示已就绪。
|
|
26
26
|
|
|
27
27
|
首次 DNS-01 签发需要等待 DNS 生效和证书签发。期间电脑保持在线,避免反复重启触发签发限流。托管模式不安装系统服务、不修改 PATH、不设置开机启动、不导入系统证书;Caddy 的管理 API 和自动配置落盘均关闭。
|
|
28
28
|
|
|
@@ -58,4 +58,18 @@ gh workflow run caddy-component.yml --repo abworks-dev/dsh-mobile --ref caddy-co
|
|
|
58
58
|
|
|
59
59
|
公开定制下载端点曾在请求 v2.11.6 时返回 v2.11.7,动态最新版不能成为信任来源。版本化 GitHub URL 仍可被仓库所有者替换;信任边界是审核过的精确大小/哈希,而非 URL 名称或远端自报校验和。fork 的目录只是审核候选,不会自动写入[生产组件表](<../src/caddy-component.ts>);正式安装仍等待维护者发布并审核官方分发。
|
|
60
60
|
|
|
61
|
+
### 官方分发需要独立的两阶段授权
|
|
62
|
+
|
|
63
|
+
本次仅准备发布通道,不执行发布。第一阶段要求维护者审核工作流 PR,并合入经过审核、受保护的 `main`。维护者必须预先配置 `caddy-component-release`:必需审核者规则、非空审核者列表和 **禁止自我审核**;管理员不得绕过环境批准。GitHub Actions 在唯一发布任务开始前提供真实人工批准;脚本另外读取实际环境策略,在首次修改 Release 前拒绝缺失、格式错误或未保护的环境。环境名称、main 祖先比较、合成策略测试都不能证明人工审核或批准。
|
|
64
|
+
|
|
65
|
+
官方发布仅允许 **公开** 的 `saya-ch/dsh-mobile` 仓库和已有的固定非 `v` 稳定标签 `caddy-component-2.11.6-tencentcloud-0.4.3`。两个发布输入均默认 false;同时启用会在原生构建前明确失败。错误事件、分支、仓库或通道/标签身份不能发布。发布任务先检查 `/commits/TAG` 的 SHA 与 Actions `GITHUB_SHA` 完全一致,且 `/compare/main...SHA` 状态必须为 `identical` 或 `behind`(只证明属于 main/祖先关系,**不证明代码经过审核**)。准备资产和源码元数据使用同一个 SHA、同一次运行中的两平台原生构建,不复用旧运行的产物。
|
|
66
|
+
|
|
67
|
+
发布任务仍仅有 `contents: write`,API 使用 `GITHUB_TOKEN`,公开资产不带令牌或 API 请求头。[GitHub Get an environment 文档](<https://docs.github.com/en/rest/deployments/environments?apiVersion=2022-11-28#get-an-environment>) 通常要求 Actions read,但明确允许公开资源在没有该权限时读取。此处只采用公开资源例外作为前提,不声称已验证真实令牌能力:带认证请求的 401/403/404/5xx 或网络失败均在创建 Release 前关闭路径;不重试未认证请求、不提升权限、不增加发布密钥。维护者需确认仓库公开、端点可读以及环境保护配置;认证读取失败应报告缺少读取能力,不放宽策略。fork 审查通道使用 `caddy-component-review`,不要求官方环境策略。
|
|
68
|
+
|
|
69
|
+
满足以上前提并得到明确发布授权后(不是本次准备任务),维护者才可在已有稳定标签上手动启用 `publish_official_release=true`,保持 review 输入 false。仍只使用现有 Windows/Linux x64 原生矩阵:各独立构建两次,验证原生安装/TLS/API/WSS/不导入信任,并运行完整测试与构建。通用发布器使用 `--draft --prerelease=false --latest=false`,拒绝已占用 Release,不更新、覆盖、删除或破坏性重试;上传并下载 **全部 16 个资产**、逐字节比较,再以 `--draft=false --prerelease=false --latest=false` 公开。fork 仍保留预发布且非 latest 的标志。官方验证允许 `/releases/latest` 的 404(确实没有 latest),但拒绝该组件成为 latest,以及其他错误或格式错误的成功响应。组件不替换 latest 插件,不自动发布 npm/APK。公开后验证失败保留公开 Release、任务失败、不产生候选,不进行破坏性回滚。
|
|
70
|
+
|
|
71
|
+
prepare/verify CLI 原有严格签名默认 review;只有可选尾参数 `--channel official`(或 `--channel review`)选择共享的精确身份校验。官方 `COMPONENT-RELEASE.json` 使用 `managed-caddy-component-official`;全部资产的公开元数据/大小/哈希及实际 HTTPS/受限重定向检查通过后,才生成 `official-candidate-not-production`。两通道索引与候选均保持 `productionCatalogEnabled: false`,输出有界、独占创建且不覆盖。
|
|
72
|
+
|
|
73
|
+
第二阶段在 **以后** 进行:独立验证实际发布的官方字节,再提交单独审核的目录 PR,将精确来源/大小/哈希硬编码到 `CADDY_COMPONENT_RELEASES`。本次准备中它仍严格为 `Object.freeze({})`。远端候选 JSON 不是运行时信任或配置。仅支持 Windows/Linux x64、腾讯云 DNS;不要把私有预览替换为目录为空的官方插件包后期待托管重启正常工作。人工真实网络证据与最终候选 CI 分开记录;隔离测试或该人工证据都不证明证书续期通过。
|
|
74
|
+
|
|
61
75
|
隔离测试仅用回环随机端口、私有内部 CA 和 `skip_install_trust`,不修改系统信任、生产 DNS 或现有代理。**不等于真实公网 DNS-01/ACME 签发或公网路由验收**;后者需要另行授权专用测试域名、最小权限 DNS 凭据和可达入口。
|
|
@@ -53,7 +53,7 @@ Once saved, leaving the token field blank keeps the stored token, and the field
|
|
|
53
53
|
|
|
54
54
|
## Connect the phone to a named tunnel
|
|
55
55
|
|
|
56
|
-
Moving to a fixed hostname means **an already paired phone must pair again**:
|
|
56
|
+
Moving to a fixed hostname means **an already paired phone must pair again**: the App does not send a saved device token to a changed Origin without new pairing. This client-side exact-address policy does not mean the server token automatically expires by hostname; remote channels share the device registry. Use a trusted entry you control and revoke a device on the computer if credential theft is suspected.
|
|
57
57
|
|
|
58
58
|
1. On the computer, open **Remote** in the panel and choose **Create remote pairing QR code**. That is what opens the pairing window, which is time-limited; while it is closed nothing can pair.
|
|
59
59
|
2. In the app, **open the Remote entry first** (the remote access setup page in the connection center), then scan the code.
|
|
@@ -96,7 +96,7 @@ The old address may show **Address may have changed** or temporarily unreachable
|
|
|
96
96
|
| Connection stopped or exited | `cloudflared_stopped` / `cloudflared_exited` | The channel dropped. Reconnect. |
|
|
97
97
|
| Unrecognized output | `cloudflared_invalid_output` / `cloudflared_invalid_origin` | cloudflared output, or the public address it printed, failed validation. Reconnect and copy the diagnostic report. |
|
|
98
98
|
| Gateway start failed | `gateway_start_failed` | The authentication gateway behind the tunnel did not start; this is not a port conflict. Check the local logs. |
|
|
99
|
-
| Download redirect problem | `cloudflared_download_redirect_missing` / `_invalid` / `_rejected` | The official
|
|
99
|
+
| Download redirect problem | `cloudflared_download_redirect_missing` / `_invalid` / `_rejected` | The official page did not redirect to the fixed release asset, or validation rejected the target. Retry later or update the plugin; a global cloudflared installation does not replace its private pinned component. |
|
|
100
100
|
|
|
101
101
|
## Troubleshooting
|
|
102
102
|
|
|
@@ -53,9 +53,9 @@ Cloudflare 提供公网域名与 TLS,插件在本机运行 `cloudflared`,把
|
|
|
53
53
|
|
|
54
54
|
## 用手机连上命名隧道
|
|
55
55
|
|
|
56
|
-
切到固定域名后,**已经配对过的手机必须重新配对**:
|
|
56
|
+
切到固定域名后,**已经配对过的手机必须重新配对**:App 不会把已存设备令牌发送给未经新配对验证的 Origin。这是客户端的精确地址发送策略,不代表服务端令牌自动按域名失效;远程通道共用设备注册表。请使用可信且由你控制的入口,怀疑凭据泄漏时在电脑端撤销设备。
|
|
57
57
|
|
|
58
|
-
1. 电脑面板 → **远程** → 点
|
|
58
|
+
1. 电脑面板 → **远程** → 点 **生成远程配对二维码**。这一步打开有时限的配对窗口;未打开时不能新增配对,已有配对不受影响。
|
|
59
59
|
2. 手机 App → **先进入「远程」入口**(连接中心的远程访问设置页)→ 再扫描二维码。
|
|
60
60
|
|
|
61
61
|
> **命名隧道必须在「远程」入口里扫码。** App 只把 `.ts.net`、cpolar、`.trycloudflare.com` 这类平台后缀当作「无需询问即为远程」;你自己的域名同样会被识别为可远程的候选地址,但「局域网」流程只接受非候选地址,所以在局域网界面扫码会被判为无效并提示**无效二维码 / Invalid QR code**,看起来就像「连不上」。先进入「远程」流程再扫即可。
|
|
@@ -96,7 +96,7 @@ Cloudflare 提供公网域名与 TLS,插件在本机运行 `cloudflared`,把
|
|
|
96
96
|
| 连接已停止 / 意外退出 | `cloudflared_stopped` / `cloudflared_exited` | 通道已断开,点重新连接。 |
|
|
97
97
|
| 返回内容无法识别 | `cloudflared_invalid_output` / `cloudflared_invalid_origin` | cloudflared 输出或公网地址未通过校验。重新连接并复制诊断报告。 |
|
|
98
98
|
| 网关启动失败 | `gateway_start_failed` | 隧道背后的认证网关没能启动(不是端口冲突)。检查本地日志。 |
|
|
99
|
-
| 下载跳转异常 | `cloudflared_download_redirect_missing` / `_invalid` / `_rejected` |
|
|
99
|
+
| 下载跳转异常 | `cloudflared_download_redirect_missing` / `_invalid` / `_rejected` | 官方下载页没有跳到固定发布资源,或目标未通过校验。稍后重试或更新插件;全局安装的 cloudflared 不会替代插件的私有固定组件。 |
|
|
100
100
|
|
|
101
101
|
## 排错
|
|
102
102
|
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Computer-side extension Workers
|
|
2
|
+
|
|
3
|
+
[简体中文](EXTENSION_WORKERS.md) · [Customization](../README.en.md#extend-and-customize)
|
|
4
|
+
|
|
5
|
+
> Added in plugin 0.6.3. This computer-side feature does not require a matching App version or new pairing.
|
|
6
|
+
|
|
7
|
+
Worker mode runs selected local `host.mjs` files in separate threads so synchronous JavaScript does not occupy the gateway's event loop. The default remains `in-process`; existing extensions and ordinary Cordis plugins are not automatically migrated.
|
|
8
|
+
|
|
9
|
+
## Which extensions fit
|
|
10
|
+
|
|
11
|
+
Use trusted local-directory extensions created through `/mobile` or directly, using Node.js and the extension API. Workers retain `api.manifest`, `api.schema`, `api.action`, `api.route` and `api.effect`; `api.context.logger` provides only `debug`, `info`, `warn` and `error`, not the full Cordis Context or Logger API. Extensions needing live Cordis services stay in-process. Incompatible hosts do not silently fall back.
|
|
12
|
+
|
|
13
|
+
Workers are **not a security sandbox**. Code retains local-user access to files, networks and processes. V8 limits do not cover all native/ArrayBuffer memory or prevent every process-wide OOM. Termination does not guarantee cleanup callbacks or undo completed file/remote operations. [Node's limitations](https://nodejs.org/download/release/v22.19.0/docs/api/worker_threads.html#new-workerfilename-options).
|
|
14
|
+
|
|
15
|
+
## Enable selectively
|
|
16
|
+
|
|
17
|
+
Add these fields to the current DSH profile's `mobile-access` configuration, then normally restart or reload the plugin; do not modify `extension.json`:
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
hostExecution:
|
|
21
|
+
mode: worker
|
|
22
|
+
extensions:
|
|
23
|
+
- media-remote
|
|
24
|
+
maxWorkers: 8
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`extensions` selects only these local IDs; other extensions remain in-process. Omitting the list selects all local hosts, while an empty list selects none. Configure the actual profile that loads the plugin rather than mixing Desktop and Web profiles. Restore `mode: in-process` and reload normally to disable Worker execution.
|
|
28
|
+
|
|
29
|
+
## When an extension stops
|
|
30
|
+
|
|
31
|
+
Open **Mobile Access** on the computer. An unavailable Worker appears under “Extensions need a restart”; choose its restart action and confirm. The card is shared across LAN, remote and diagnostics views. Ready Workers do not show the action. Recovery is explicit: no automatic restart or meaningless file edits.
|
|
32
|
+
|
|
33
|
+
The invocation that triggered a deadline keeps its timeout result; other pending calls in that Worker receive `extension_host_unavailable`. Other runtime instances are not terminated together. A stream whose headers were already sent loses its connection; it cannot append a new JSON error after a partial body. Interrupted actions are never replayed. Check whether completed side effects require attention before restarting.
|
|
34
|
+
|
|
35
|
+
New calls can still receive `extension_busy` while abandoned work remains unfinished. Accounting clears only on actual completion or confirmed thread exit. Starting, retained-generation and terminating Workers all occupy the thread budget; exhaustion does not silently switch execution to in-process.
|
|
36
|
+
|
|
37
|
+
## Adjustable budgets
|
|
38
|
+
|
|
39
|
+
| Budget | `hostExecution` fields |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| Threads and registrations | `maxWorkers`, `maxRegistrations` |
|
|
42
|
+
| V8 heap and stack | `maxOldGenerationSizeMb`, `maxYoungGenerationSizeMb`, `stackSizeMb` |
|
|
43
|
+
| Activation, actions, cancellation and cleanup | `activationTimeoutMs`, `operationTimeoutMs`, `cancelGraceMs`, `streamCancelGraceMs`, `disposeGraceMs` |
|
|
44
|
+
| Action JSON and streams | `resultMaxBytes`, `streamWindowBytes`, `streamChunkBytes`, `streamAggregateBytes` |
|
|
45
|
+
| Logging | `logWindowMs`, `logMessagesPerWindow`, `logMessageBytes` |
|
|
46
|
+
|
|
47
|
+
Values must be integers within the accepted ranges. Chunks cannot exceed the per-stream window, and a window cannot exceed the aggregate budget. Start with the defaults. `src/extension-worker-config.ts` owns their definitions and validation. Global Node heap flags can override Worker settings, so detected overriding parent launch flags reject startup before importing the extension with `extension_worker_heap_override`. Check DSH's launch options; keep in-process execution when those flags are required rather than silently bypassing the limits.
|
|
48
|
+
|
|
49
|
+
Consumption refills stream credit, and unread EOF bytes retain their budget. Logs and results are converted to bounded data inside the Worker before reaching the gateway. This contains transport and JavaScript-blocking risks, not all operating-system or process resources.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 电脑端扩展 Worker 模式
|
|
2
|
+
|
|
3
|
+
[English](EXTENSION_WORKERS.en.md) · [返回定制功能](../README.md#扩展与自定义)
|
|
4
|
+
|
|
5
|
+
> 插件 0.6.3 新增功能,由电脑端插件实现,不要求 App 同步版本或重新配对。
|
|
6
|
+
|
|
7
|
+
Worker 模式把选中的本地 `host.mjs` 放到独立工作线程,使同步 JavaScript 循环不再占住网关主线程。默认仍使用 `in-process`;已有扩展和普通 Cordis 插件不会被自动迁移。
|
|
8
|
+
|
|
9
|
+
## 适合哪些扩展
|
|
10
|
+
|
|
11
|
+
适合通过 `/mobile` 或本地目录创建、使用 Node.js 与扩展 API 的可信代码。Worker 内仍可使用 `api.manifest`、`api.schema`、`api.action`、`api.route`、`api.effect`;`api.context.logger` 只提供 `debug`、`info`、`warn`、`error`,不是完整的 Cordis Context 或 Logger。需要直接使用 Cordis 服务的扩展保留进程内模式,不会静默回退。
|
|
12
|
+
|
|
13
|
+
Worker **不是安全沙箱**:代码仍有本机用户权限,可以访问文件、网络和进程。V8 内存限制不覆盖全部原生/ArrayBuffer 内存,也不能保证全进程不会 OOM。停止线程不保证执行清理回调,不撤销已经发生的文件或远程操作。[Node 的限制说明](https://nodejs.org/download/release/v22.19.0/docs/api/worker_threads.html#new-workerfilename-options)。
|
|
14
|
+
|
|
15
|
+
## 按需启用
|
|
16
|
+
|
|
17
|
+
在当前 DSH profile 的 `mobile-access` 配置中添加以下字段,再正常重启或重新加载插件;不要修改 `extension.json`:
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
hostExecution:
|
|
21
|
+
mode: worker
|
|
22
|
+
extensions:
|
|
23
|
+
- media-remote
|
|
24
|
+
maxWorkers: 8
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`extensions` 只选择这些本地扩展 ID,其他扩展继续进程内执行;省略列表选择所有本地 Host,空列表不选择任何 Host。配置放在实际承载插件的 profile,Desktop 与 Web 的 profile 不应混用。恢复 `mode: in-process` 后正常重新加载插件即可关闭 Worker 模式。
|
|
28
|
+
|
|
29
|
+
## 扩展停止后
|
|
30
|
+
|
|
31
|
+
电脑端打开 **移动访问**。停止的 Worker 会显示“扩展需要重启”;点击目标扩展的“重启扩展”并确认。此卡片在局域网、远程和诊断视图共用。只有不可用的 Worker 显示该入口,不自动重启,也不要求改文件来触发恢复。
|
|
32
|
+
|
|
33
|
+
触发截止的调用保留超时结果;同一 Worker 中其他未完成调用会收到 `extension_host_unavailable`。其他运行实例不会被一起终止。已发出响应头的流会结束连接,不能在半截内容后补一份 JSON 错误。未完成动作不自动重放;恢复前请确认已经产生的副作用是否需要处理。
|
|
34
|
+
|
|
35
|
+
同一扩展存在尚未结束的废弃工作时,新请求仍可能收到 `extension_busy`;线程退出确认或对应工作真正结束后才释放记账。正在退出、保留旧版本及启动中的 Worker 都占线程预算;预算耗尽时不会偷偷使用进程内模式绕过。
|
|
36
|
+
|
|
37
|
+
## 可调整的预算
|
|
38
|
+
|
|
39
|
+
| 预算 | `hostExecution` 字段 |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| 线程与注册数量 | `maxWorkers`、`maxRegistrations` |
|
|
42
|
+
| V8 堆与栈 | `maxOldGenerationSizeMb`、`maxYoungGenerationSizeMb`、`stackSizeMb` |
|
|
43
|
+
| 激活、动作、取消与清理 | `activationTimeoutMs`、`operationTimeoutMs`、`cancelGraceMs`、`streamCancelGraceMs`、`disposeGraceMs` |
|
|
44
|
+
| 动作 JSON 与流 | `resultMaxBytes`、`streamWindowBytes`、`streamChunkBytes`、`streamAggregateBytes` |
|
|
45
|
+
| 日志 | `logWindowMs`、`logMessagesPerWindow`、`logMessageBytes` |
|
|
46
|
+
|
|
47
|
+
参数必须是范围内的整数;流块不能大于单流窗口,单流窗口不能大于聚合预算。初次启用建议保留默认值。配置定义与校验由 `src/extension-worker-config.ts` 管理。Node 的全局堆参数可能覆盖 Worker 资源配置,因此检测到会覆盖限制的父进程启动参数时,Worker 会在导入扩展前拒绝启动并报告 `extension_worker_heap_override`。请检查 DSH 的启动参数;需要保留这些参数时可继续使用进程内模式,不会静默绕过。
|
|
48
|
+
|
|
49
|
+
流量按消费确认回填,未读完的 EOF 数据继续占预算;日志和结果在 Worker 内先转换为受限数据,再交给网关。该机制约束传输与 JavaScript 阻塞风险,不是整个操作系统或进程的资源沙箱。
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Mobile composer layout
|
|
2
|
+
|
|
3
|
+
[简体中文](MOBILE_COMPOSER_TOOLBAR.md) · [Third-party compatibility](../README.en.md#third-party-plugin-compatibility)
|
|
4
|
+
|
|
5
|
+
> Layout changes in plugin 0.6.3. Android and mobile browsers use the same plugin-served page; this change does not require reinstalling the App.
|
|
6
|
+
|
|
7
|
+
The narrow-screen composer preserves DSH's native structure and handlers. Model names truncate when space is limited, additional controls wrap, and Send/Stop retain touch dimensions. Entire native groups wrap according to their actual width. Switches are not stretched into action buttons, and inline dialogs, menus and lists do not receive compact toolbar sizing.
|
|
8
|
+
|
|
9
|
+
## Difference from the original PR
|
|
10
|
+
|
|
11
|
+
The original proposal combined plugins into one upper horizontal scrollport with native actions fixed below. Current DSH exposes no parent `conversation.input.toolbar` entry; left and right plugins belong to different React parents, and the core width observer measures those two native groups. This version does not provide a shared upper scrollport, move DOM, copy core callbacks or flatten the tree with `display:contents`.
|
|
12
|
+
|
|
13
|
+
It implements compact/overflow fixes through available public seams, retaining the original author commit with maintainer corrections. A future upstream parent-toolbar capability can be evaluated separately rather than registering a presenter that never renders.
|
|
14
|
+
|
|
15
|
+
## Verification scope
|
|
16
|
+
|
|
17
|
+
The real DSH composer runs with test extensions genuinely registered through the public left/right/activity slots. Checks cover small viewports, landscape, larger text, both themes, model compactness, popups, switches and reachable Send/Stop. Editor, draft and active activity nodes remain mounted without a page reload.
|
|
18
|
+
|
|
19
|
+
The activity fixture verifies slot/mount continuity, not a physical microphone or recognition provider. Arbitrary community combinations can still have their own layout issues; [Mobile page modules](CLIENT_MODULES.en.md) can exclude unneeded optional modules.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# 移动输入栏布局
|
|
2
|
+
|
|
3
|
+
[English](MOBILE_COMPOSER_TOOLBAR.en.md) · [第三方插件适配](../README.md#第三方插件适配)
|
|
4
|
+
|
|
5
|
+
> 0.6.3 的布局调整。Android App 与手机浏览器共用插件提供的页面,不需要为此重装 App。
|
|
6
|
+
|
|
7
|
+
窄屏输入栏保留 DSH 原生结构和事件处理。模型名称在空间不足时截断,附加控件正常换行,发送/停止保持触摸尺寸,整组放不下时按实际宽度换行。插件开关不会被拉成操作按钮;内联弹窗、菜单和列表不会套用工具栏的紧凑尺寸。
|
|
8
|
+
|
|
9
|
+
## 与 PR 原稿的区别
|
|
10
|
+
|
|
11
|
+
原稿提出把所有插件合入一个上层横向滚动条,并把原生操作固定在下层。当前 DSH 没有公开父级 `conversation.input.toolbar` 入口,左右插件属于不同 React 父节点;核心宽度观察器还要测量这两个父组。因此本版不提供共同滚动上栏,也不搬动 DOM、复制原生回调或用 `display:contents` 绕过核心布局。
|
|
12
|
+
|
|
13
|
+
本版采用现有公共插槽能实现的紧凑与溢出修正,保留原稿作者提交并追加维护者调整。若上游以后提供父级工具栏能力,可再评估统一滚动方案,不预先登记一个不会渲染的控件。
|
|
14
|
+
|
|
15
|
+
## 验证范围
|
|
16
|
+
|
|
17
|
+
真实 DSH 输入栏与通过公共 left/right/activity 插槽注册的测试扩展共同运行,检查小屏、横屏、较大字号、明暗主题、模型紧凑状态、弹窗、开关以及发送/停止可达性。编辑器、草稿和活跃 activity 的节点保持,不因此重载页面。
|
|
18
|
+
|
|
19
|
+
activity 夹具只验证插槽和挂载连续性,不代表真实麦克风或语音识别。任意社区插件组合仍可能有自己的布局问题;可使用[移动页面模块](CLIENT_MODULES.md)关闭不需要的可选模块。
|
package/docs/README.md
CHANGED
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
|
|
28
28
|
## 开发与安全 / Development and security
|
|
29
29
|
|
|
30
|
+
0.6.3 的 [扩展 Worker 指南](EXTENSION_WORKERS.md)/[Worker guide](EXTENSION_WORKERS.en.md) 介绍按扩展启用、预算与显式恢复;此功能不迁移普通 Cordis 插件,也不是权限沙箱。
|
|
31
|
+
|
|
30
32
|
- [贡献指南](../CONTRIBUTING.md):本地检查、浏览器与 Android 验证、发布要求。
|
|
31
33
|
- [安全说明](../SECURITY.md):配对授权、TLS、组件清理与私密漏洞反馈。
|
|
32
34
|
- [贡献记录](../CONTRIBUTORS.md)与[更新记录](../CHANGELOG.md):分别查看社区参与和版本变化。
|
|
@@ -61,7 +61,7 @@ curl -v https://PUBLIC_HOST/mobile-access/discovery
|
|
|
61
61
|
|
|
62
62
|
Only public IPv4 mode installs `dsh-mobile-cert-renew.timer`; in that mode, also run `sudo systemctl status dsh-mobile-cert-renew.timer`. Replace `PUBLIC_HOST` with your actual domain or public IPv4 address. Do not add `-k`: verify the public certificate as well as the response. Check the same address from an independent external network and confirm discovery reports this computer's installation identifier; success on the VPS alone does not prove the phone's network can reach it.
|
|
63
63
|
|
|
64
|
-
On the computer, start with the plugin log at `$DSH_HOME/mobile-access/logs/dsh-mobile.log` (JSONL
|
|
64
|
+
On the computer, start with the plugin log at `$DSH_HOME/mobile-access/logs/dsh-mobile.log` (JSONL; existing files of at least 5 MB rotate at startup) and the panel diagnostic report. Custom extensions must not log tokens or keys; inspect and remove sensitive content before sharing logs because this is not a generic secret redactor. Windows antivirus software can quarantine frpc; if it does, create the smallest possible exception for the verified component directory only.
|
|
65
65
|
|
|
66
66
|
When several computers share one frps, proxy names are unique across the server and entry ports cannot overlap. The plugin uses `dsh-mobile-<first 12 characters of the installation identity>` as its name. A name conflict requires checking another computer or an unexpired old connection; a port conflict requires a different entry port. A running frpc process does not mean the public entry was published: verify the public route.
|
|
67
67
|
|