dsh-mobile 0.3.7 → 0.3.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 +9 -4
- package/README.en.md +9 -7
- package/README.md +9 -7
- package/cordis.patch.yml +0 -1
- package/lib/index.mjs +19 -12
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,9 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Notable changes to DSH Mobile are recorded here. GitHub Releases remain the source for downloadable packages and complete generated commit notes.
|
|
4
4
|
|
|
5
|
+
## 0.3.8 - 2026-09-03
|
|
6
|
+
|
|
7
|
+
- Preserve the WeChat Mini-Program compatibility changes contributed in PR #34 by @StrawberryAO while deriving an unset upstream from the active DSH WebServer port. Standalone Web defaults, Desktop's configured port, and Desktop's bind-conflict retry port therefore use the same proxy target.
|
|
8
|
+
- Accept the observed `allowed-origin,undefined` WebSocket Origin form while rejecting mixed values that include an untrusted Origin.
|
|
9
|
+
|
|
5
10
|
## 0.3.7 - 2026-09-02
|
|
6
11
|
|
|
7
|
-
- Fix the Windows DSH Desktop startup failure reported in [#22](https://github.com/saya-ch/dsh-mobile/issues/22): capture subprocess output through the callback API instead of relying on `execFile` promisify metadata that a host wrapper may omit. Thanks @XChen446 for the precise 0.3.6 stack trace.
|
|
12
|
+
- Fix the Windows DSH Desktop startup failure reported in [#22#22](https://github.com/saya-ch/dsh-mobile/issues/22): capture subprocess output through the callback API instead of relying on `execFile` promisify metadata that a host wrapper may omit. Thanks @XChen446 for the precise 0.3.6 stack trace.
|
|
8
13
|
- Apply the same output handling to Windows SID resolution, private-file ACLs, route selection, and firewall diagnostics/setup. Invalid SID output and ACL failures still reject the operation; a failed SID lookup can be retried and Windows permission commands have bounded execution time.
|
|
9
14
|
- Retain the 0.3.6 removal of the exact DSH version allowlist. Existing 0.3.3-0.3.6 Android apps and paired devices remain compatible; the 0.3.7 APK updates version metadata only.
|
|
10
15
|
|
|
@@ -16,7 +21,7 @@ Notable changes to DSH Mobile are recorded here. GitHub Releases remain the sour
|
|
|
16
21
|
|
|
17
22
|
## 0.3.5 - 2026-09-01
|
|
18
23
|
|
|
19
|
-
- Fix [#26](https://github.com/saya-ch/dsh-mobile/issues/26): prevent mobile startup from remaining on “Loading plugins” over LAN or remote access when DSH sends the WebSocket upgrade response and initial snapshot together. The gateway now preserves that snapshot without relaxing its 16 KiB response-header limit. Thanks @oliverwan97 for the detailed report.
|
|
24
|
+
- Fix [#26#26](https://github.com/saya-ch/dsh-mobile/issues/26): prevent mobile startup from remaining on “Loading plugins” over LAN or remote access when DSH sends the WebSocket upgrade response and initial snapshot together. The gateway now preserves that snapshot without relaxing its 16 KiB response-header limit. Thanks @oliverwan97 for the detailed report.
|
|
20
25
|
|
|
21
26
|
## 0.3.4 - 2026-08-31
|
|
22
27
|
|
|
@@ -39,7 +44,7 @@ Notable changes to DSH Mobile are recorded here. GitHub Releases remain the sour
|
|
|
39
44
|
|
|
40
45
|
## 0.3.2 - 2026-08-29
|
|
41
46
|
|
|
42
|
-
- Special thanks to @JackRushante for [#16](https://github.com/saya-ch/dsh-mobile/pull/16): the secure Android media bridge, image attachments, localization foundation, bounded extension requests, and Funnel lifecycle hardening. This release retains all four original commits and their author metadata.
|
|
47
|
+
- Special thanks to @JackRushante for [#16#16](https://github.com/saya-ch/dsh-mobile/pull/16): the secure Android media bridge, image attachments, localization foundation, bounded extension requests, and Funnel lifecycle hardening. This release retains all four original commits and their author metadata.
|
|
43
48
|
- Move image selection and camera capture into a dedicated top row of the composer command menu, without focusing the message editor.
|
|
44
49
|
- Push extension and `/mobile` changes to authenticated phones immediately, while retaining bounded polling as a network-recovery fallback.
|
|
45
50
|
- Bind each mobile UI to its matching Host, script, style, and asset generation; retain the previous Host through a bounded refresh window, fail closed on client activation errors, and tighten scoped requests against encoded path traversal.
|
|
@@ -49,7 +54,7 @@ Notable changes to DSH Mobile are recorded here. GitHub Releases remain the sour
|
|
|
49
54
|
|
|
50
55
|
## 0.3.1 - 2026-08-28
|
|
51
56
|
|
|
52
|
-
- Credit @BlueandwhiteXD ([#15](https://github.com/saya-ch/dsh-mobile/pull/15)) for the Android keyboard inset report and fix incorporated into the 0.3 mobile layout.
|
|
57
|
+
- Credit @BlueandwhiteXD ([#15#15](https://github.com/saya-ch/dsh-mobile/pull/15)) for the Android keyboard inset report and fix incorporated into the 0.3 mobile layout.
|
|
53
58
|
|
|
54
59
|
## 0.3.0 - 2026-08-28
|
|
55
60
|
|
package/README.en.md
CHANGED
|
@@ -19,14 +19,14 @@
|
|
|
19
19
|
|
|
20
20
|
> DSH Mobile is a DeepSeek Harness community plugin; the native app supports Android only.
|
|
21
21
|
>
|
|
22
|
-
> **0.3.
|
|
22
|
+
> **0.3.8 update**: thanks to @StrawberryAO for the WeChat Mini-Program compatibility fix covering its automatic `Sec-Fetch-Site` and comma-joined Origin headers. The gateway also follows the active DSH WebServer port and rejects mixed untrusted Origins. [Details](CHANGELOG.md).
|
|
23
23
|
>
|
|
24
|
-
> **Upgrade reminder**: Windows DSH Desktop users should update to plugin 0.3.
|
|
24
|
+
> **Upgrade reminder**: Windows DSH Desktop users should update to plugin 0.3.8. Existing 0.3.3-0.3.7 apps and paired devices remain compatible without re-pairing. [Compatibility notes](#compatibility).
|
|
25
25
|
|
|
26
26
|
<p align="center">
|
|
27
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.3.
|
|
28
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.3.
|
|
29
|
-
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.3.
|
|
27
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.3.8/dsh-mobile-android-v0.3.8.apk"><img src="assets/brand/app-icon-rounded.svg" alt="DSH Mobile Android app icon" width="72" height="72"></a><br>
|
|
28
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.3.8/dsh-mobile-android-v0.3.8.apk"><strong>Download Android app 0.3.8</strong></a><br>
|
|
29
|
+
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.3.8">Release notes and checksums</a></sub>
|
|
30
30
|
</p>
|
|
31
31
|
|
|
32
32
|
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, or self-hosted FRP remote path. Local and remote access keep the same sessions, Workspaces, messages, and tools while using separate switches and paired-device stores without modifying DeepSeek Harness source.
|
|
@@ -190,10 +190,12 @@ See [SECURITY.md](SECURITY.md).
|
|
|
190
190
|
|
|
191
191
|
## Compatibility
|
|
192
192
|
|
|
193
|
-
DSH Mobile 0.3.6
|
|
193
|
+
DSH Mobile 0.3.8 keeps the open DSH version policy introduced in 0.3.6, fixes WeChat Mini-Program request headers, follows the active Desktop upstream port, and has verified the mobile frontend and connection interfaces in DSH 0.1.2-alpha.3/alpha.4. Existing 0.3.3-0.3.7 apps do not need re-pairing. Earlier apps use a different status-bar strategy, so updating both is recommended. App 0.1.3 or earlier requires reinstalling and pairing again.
|
|
194
194
|
|
|
195
195
|
| DSH Mobile | Verified DeepSeek Harness releases |
|
|
196
196
|
| --- | --- |
|
|
197
|
+
| `0.3.8` | `0.1.0-rc.5`, `0.1.0-rc.6`, `0.1.0-rc.7`, `0.1.1-rc.2`, and `0.1.2-alpha.1` through `alpha.4`; unlisted versions are no longer rejected by version alone |
|
|
198
|
+
| `0.3.7` | `0.1.0-rc.5`, `0.1.0-rc.6`, `0.1.0-rc.7`, `0.1.1-rc.2`, and `0.1.2-alpha.1` through `alpha.4`; unlisted versions are no longer rejected by version alone |
|
|
197
199
|
| `0.3.6` | `0.1.0-rc.5`, `rc.6`, `rc.7`, `0.1.1-rc.2`, and `0.1.2-alpha.1` through `alpha.4`; unlisted versions are no longer rejected by version alone |
|
|
198
200
|
| `0.3.5` | `0.1.0-rc.5`, `0.1.0-rc.6`, `0.1.0-rc.7`, `0.1.1-rc.2`, `0.1.2-alpha.1`, `0.1.2-alpha.2` |
|
|
199
201
|
| `0.3.4` | `0.1.0-rc.5`, `0.1.0-rc.6`, `0.1.0-rc.7`, `0.1.1-rc.2`, `0.1.2-alpha.1`, `0.1.2-alpha.2` |
|
|
@@ -208,7 +210,7 @@ DSH Mobile 0.3.6 no longer blocks startup by exact DSH version and has verified
|
|
|
208
210
|
|
|
209
211
|
The plugin no longer uses a runtime version allowlist. CI continuously checks the frontend, connection, and trust interfaces used from the DSH main branch, so adaptation is required only when those interfaces actually change. If a future DSH update causes a real display or connection failure, update DSH Mobile and include diagnostics in the report.
|
|
210
212
|
|
|
211
|
-
0.3.4 fixes duplicate directory-picker registration in Windows [DSH Desktop](https://github.com/anywhere-labs/dsh-desktop). It reuses the desktop host's in-page directory browser; standalone Web launches still let phones select workspaces on the computer. Mobile access through Desktop requires compatibility mode and browser access enabled
|
|
213
|
+
0.3.4 fixes duplicate directory-picker registration in Windows [DSH Desktop](https://github.com/anywhere-labs/dsh-desktop). It reuses the desktop host's in-page directory browser; standalone Web launches still let phones select workspaces on the computer. Mobile access through Desktop requires compatibility mode and browser access enabled. When no setup file specifies an upstream, the gateway follows the active DSH WebServer's actual port; a managed setup continues to use the `--dsh-port` value written by `dsh-mobile setup`.
|
|
212
214
|
|
|
213
215
|
## Uninstall
|
|
214
216
|
|
package/README.md
CHANGED
|
@@ -26,14 +26,14 @@
|
|
|
26
26
|
|
|
27
27
|
> DSH Mobile 是 DeepSeek Harness 社区插件,原生 App 仅支持 Android。
|
|
28
28
|
>
|
|
29
|
-
> **0.3.
|
|
29
|
+
> **0.3.8 更新**:感谢 @StrawberryAO 贡献微信小程序兼容修复,支持微信自动附加的 `Sec-Fetch-Site` 和逗号合并 Origin;同时让网关跟随 DSH WebServer 实际端口,并拒绝混合不受信任的 Origin。[详细记录](CHANGELOG.md)。
|
|
30
30
|
>
|
|
31
|
-
> **升级提醒**:Windows DSH Desktop 用户请更新至插件 0.3.
|
|
31
|
+
> **升级提醒**:Windows DSH Desktop 用户请更新至插件 0.3.8;现有 0.3.3-0.3.7 App 可继续使用,无需重新配对。[兼容说明](#兼容性)。
|
|
32
32
|
|
|
33
33
|
<p align="center">
|
|
34
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.3.
|
|
35
|
-
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.3.
|
|
36
|
-
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.3.
|
|
34
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.3.8/dsh-mobile-android-v0.3.8.apk"><img src="assets/brand/app-icon-rounded.svg" alt="DSH Mobile 安卓应用图标" width="72" height="72"></a><br>
|
|
35
|
+
<a href="https://github.com/saya-ch/dsh-mobile/releases/download/v0.3.8/dsh-mobile-android-v0.3.8.apk"><strong>下载 Android App 0.3.8</strong></a><br>
|
|
36
|
+
<sub><a href="https://github.com/saya-ch/dsh-mobile/releases/tag/v0.3.8">版本说明与校验文件</a></sub>
|
|
37
37
|
</p>
|
|
38
38
|
|
|
39
39
|
DSH Mobile 是一个 DeepSeek Harness 插件,让手机浏览器或 Android App 通过局域网,或可选的 Tailscale Funnel、cpolar、自建 FRP 远程通道连接电脑,继续使用同一份会话、工作区、消息和工具。局域网与远程访问分别启停、分别管理设备,且都不修改 DeepSeek Harness 源码。
|
|
@@ -199,10 +199,12 @@ flowchart LR
|
|
|
199
199
|
|
|
200
200
|
## 兼容性
|
|
201
201
|
|
|
202
|
-
DSH Mobile 0.3.6
|
|
202
|
+
DSH Mobile 0.3.8 在 0.3.6 开放版本兼容策略的基础上,修复微信小程序请求头兼容和 Desktop upstream 端口跟随,并已验证 DSH 0.1.2-alpha.3/alpha.4 的移动前端与连接接口。现有 0.3.3-0.3.7 App 无需重新配对;更早的 App 使用不同的状态栏策略,建议同步升级;App 0.1.3 及更早版本需卸载重装并重新配对。
|
|
203
203
|
|
|
204
204
|
| DSH Mobile | 已验证的 DeepSeek Harness |
|
|
205
205
|
| ------------ | ------------------------------------------------------------------------- |
|
|
206
|
+
| `0.3.8` | `0.1.0-rc.5`、`0.1.0-rc.6`、`0.1.0-rc.7`、`0.1.1-rc.2`、`0.1.2-alpha.1` 至 `alpha.4`;未列版本不再仅因版本号被拒绝 |
|
|
207
|
+
| `0.3.7` | `0.1.0-rc.5`、`0.1.0-rc.6`、`0.1.0-rc.7`、`0.1.1-rc.2`、`0.1.2-alpha.1` 至 `alpha.4`;未列版本不再仅因版本号被拒绝 |
|
|
206
208
|
| `0.3.6` | `0.1.0-rc.5`、`0.1.0-rc.6`、`0.1.0-rc.7`、`0.1.1-rc.2`、`0.1.2-alpha.1` 至 `alpha.4`;未列版本不再仅因版本号被拒绝 |
|
|
207
209
|
| `0.3.5` | `0.1.0-rc.5`、`0.1.0-rc.6`、`0.1.0-rc.7`、`0.1.1-rc.2`、`0.1.2-alpha.1`、`0.1.2-alpha.2` |
|
|
208
210
|
| `0.3.4` | `0.1.0-rc.5`、`0.1.0-rc.6`、`0.1.0-rc.7`、`0.1.1-rc.2`、`0.1.2-alpha.1`、`0.1.2-alpha.2` |
|
|
@@ -217,7 +219,7 @@ DSH Mobile 0.3.6 不再按 DSH 精确版本号阻止启动,并已验证 DSH 0.
|
|
|
217
219
|
|
|
218
220
|
插件不再使用运行时版本白名单;CI 会持续检查 DSH 主分支真实使用的前端、连接与信任接口,只有接口变化才需要适配。未来 DSH 更新若出现实际显示或连接异常,请升级 DSH Mobile 并提交诊断信息。
|
|
219
221
|
|
|
220
|
-
0.3.4 修复 Windows [DSH Desktop](https://github.com/anywhere-labs/dsh-desktop) 的目录选择器重复注册问题:复用桌面宿主的页面内目录浏览器,普通 Web 启动仍保留手机选择电脑工作区的能力。Desktop
|
|
222
|
+
0.3.4 修复 Windows [DSH Desktop](https://github.com/anywhere-labs/dsh-desktop) 的目录选择器重复注册问题:复用桌面宿主的页面内目录浏览器,普通 Web 启动仍保留手机选择电脑工作区的能力。Desktop 连接手机时需使用兼容模式并启用浏览器访问。未在 setup 文件中指定 upstream 时,网关会跟随当前 DSH WebServer 的实际端口;managed setup 则继续使用 `dsh-mobile setup` 写入的 `--dsh-port`。
|
|
221
223
|
|
|
222
224
|
## 卸载
|
|
223
225
|
|
package/cordis.patch.yml
CHANGED
package/lib/index.mjs
CHANGED
|
@@ -529,14 +529,21 @@ var RequestTrustPolicy = class {
|
|
|
529
529
|
canonicalOrigin(header) {
|
|
530
530
|
if (header === void 0) return void 0;
|
|
531
531
|
let normalized;
|
|
532
|
-
|
|
533
|
-
const
|
|
534
|
-
if (
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
532
|
+
for (const part of header.split(",")) {
|
|
533
|
+
const trimmed = part.trim();
|
|
534
|
+
if (trimmed === "undefined") continue;
|
|
535
|
+
let candidate;
|
|
536
|
+
try {
|
|
537
|
+
const parsed = new URL(trimmed);
|
|
538
|
+
if (parsed.pathname !== "/" || parsed.search !== "" || parsed.hash !== "" || parsed.username !== "" || parsed.password !== "") return;
|
|
539
|
+
candidate = parsed.origin.toLowerCase();
|
|
540
|
+
} catch {
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
if (!this.origins.has(candidate) || normalized !== void 0) return void 0;
|
|
544
|
+
normalized = candidate;
|
|
538
545
|
}
|
|
539
|
-
return
|
|
546
|
+
return normalized;
|
|
540
547
|
}
|
|
541
548
|
};
|
|
542
549
|
//#endregion
|
|
@@ -1128,8 +1135,8 @@ function assertExternalTrust(request, policy, requireOrigin) {
|
|
|
1128
1135
|
const origin = request.headers.origin;
|
|
1129
1136
|
if (origin !== void 0 && !policy.acceptsOrigin(origin)) throw new HttpError(403, "forbidden");
|
|
1130
1137
|
const site = request.headers["sec-fetch-site"];
|
|
1131
|
-
if (site !== void 0 && site !== "same-origin" && site !== "none") throw new HttpError(403, "forbidden");
|
|
1132
|
-
if (requireOrigin &&
|
|
1138
|
+
if (site !== void 0 && site !== "same-origin" && site !== "same-site" && site !== "cross-site" && site !== "none") throw new HttpError(403, "forbidden");
|
|
1139
|
+
if (requireOrigin && !policy.acceptsOrigin(origin)) throw new HttpError(403, "forbidden");
|
|
1133
1140
|
}
|
|
1134
1141
|
function localAuthority(header) {
|
|
1135
1142
|
if (header === void 0 || /[/?#@\\]/u.test(header)) return void 0;
|
|
@@ -7321,10 +7328,10 @@ async function loadSetup(config) {
|
|
|
7321
7328
|
}
|
|
7322
7329
|
};
|
|
7323
7330
|
}
|
|
7324
|
-
function loopbackTemplate(loaded) {
|
|
7331
|
+
function loopbackTemplate(loaded, webServerPort) {
|
|
7325
7332
|
return parseGatewayConfig({
|
|
7326
7333
|
...withoutSetupKeys(loaded.config),
|
|
7327
|
-
...loaded.kind === "managed" ? { upstreamOrigin: loaded.setup.upstreamOrigin } :
|
|
7334
|
+
...loaded.kind === "managed" ? { upstreamOrigin: loaded.setup.upstreamOrigin } : { upstreamOrigin: loaded.config.upstreamOrigin ?? `http://127.0.0.1:${String(webServerPort)}` },
|
|
7328
7335
|
listenHost: "127.0.0.1",
|
|
7329
7336
|
listenPort: 0,
|
|
7330
7337
|
publicAuthorities: ["127.0.0.1"],
|
|
@@ -7391,7 +7398,7 @@ async function apply(ctx, config) {
|
|
|
7391
7398
|
const dshVersion = installedDshVersion();
|
|
7392
7399
|
const loaded = await loadSetup(config);
|
|
7393
7400
|
const mobileAccess = createMobileAccessService(ctx);
|
|
7394
|
-
const template = loopbackTemplate(loaded);
|
|
7401
|
+
const template = loopbackTemplate(loaded, ctx.webServer.port);
|
|
7395
7402
|
const upstreamLoginUrl = upstreamAuthenticatedUrl(ctx, template.upstreamOrigin);
|
|
7396
7403
|
const instanceId = await stableInstanceId(loaded, template);
|
|
7397
7404
|
const stateDirectory = dirname(template.stateFile);
|