dsh-mobile 0.8.3 → 0.8.5
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 +18 -0
- package/CONTRIBUTORS.md +12 -0
- package/README.en.md +8 -6
- package/README.md +8 -6
- package/docs/CONNECTION_DIAGNOSTICS.en.md +4 -0
- package/docs/CONNECTION_DIAGNOSTICS.md +4 -0
- package/docs/IROH.en.md +1 -0
- package/docs/IROH.md +1 -0
- package/docs/SLOW_CONNECTIONS.en.md +8 -0
- package/docs/SLOW_CONNECTIONS.md +8 -0
- package/docs/TRUSTED_NETWORKS.en.md +6 -0
- package/docs/TRUSTED_NETWORKS.md +6 -0
- package/lib/cli.js +59 -22
- package/lib/cli.js.map +1 -1
- package/lib/client.js +60 -4
- package/lib/client.js.map +1 -1
- package/lib/index.d.mts +19 -0
- package/lib/index.mjs +770 -42
- package/lib/index.mjs.map +1 -1
- package/lib/mobile-layout.js +3 -2
- package/lib/mobile-layout.js.map +1 -1
- package/package.json +1 -1
- package/packages/question-fixes/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -803,7 +803,7 @@ window.__ModuleLoader__.load({
|
|
|
803
803
|
lanSetupConfiguring: "Creating private certificates and local network rules…",
|
|
804
804
|
lanSetupRequired: "Local network setup has not been completed. Choose a network above to continue.",
|
|
805
805
|
lanSetupRestart: "Setup complete for {origin}. Restart DSH once to start local network access.",
|
|
806
|
-
lanSetupFailed: "Setup was not completed.
|
|
806
|
+
lanSetupFailed: "Setup was not completed. Existing firewall rules were retained when possible. Approve the Windows prompt and retry; if it still fails, check dsh-mobile.log for the exact firewall error.",
|
|
807
807
|
lanChangeTitle: "Change network",
|
|
808
808
|
lanChangeIntro: "Move local network access to another interface. The private CA and paired devices are kept; connected phones reconnect with the new address.",
|
|
809
809
|
lanChangeSelect: "New network",
|
|
@@ -833,7 +833,7 @@ window.__ModuleLoader__.load({
|
|
|
833
833
|
lanSetupConfiguring: "Creazione dei certificati privati e delle regole di rete locale…",
|
|
834
834
|
lanSetupRequired: "La configurazione della rete locale non è completa. Scegli una rete qui sopra per continuare.",
|
|
835
835
|
lanSetupRestart: "Configurazione completata per {origin}. Riavvia DSH una volta per attivare l’accesso locale.",
|
|
836
|
-
lanSetupFailed: "Configurazione non completata.
|
|
836
|
+
lanSetupFailed: "Configurazione non completata. Le regole firewall esistenti sono state mantenute quando possibile. Approva la richiesta di Windows e riprova; se fallisce ancora, controlla dsh-mobile.log per l’errore esatto.",
|
|
837
837
|
lanChangeTitle: "Cambia rete",
|
|
838
838
|
lanChangeIntro: "Sposta l’accesso alla rete locale su un’altra interfaccia. La CA privata e i dispositivi abbinati restano; i telefoni collegati si riconnettono con il nuovo indirizzo.",
|
|
839
839
|
lanChangeSelect: "Nuova rete",
|
|
@@ -863,7 +863,7 @@ window.__ModuleLoader__.load({
|
|
|
863
863
|
lanSetupConfiguring: "正在生成私有证书并配置局域网规则…",
|
|
864
864
|
lanSetupRequired: "尚未完成局域网配置,请选择上方网络继续。",
|
|
865
865
|
lanSetupRestart: "已为 {origin} 完成配置。请重启一次 DSH,局域网访问会自动开启。",
|
|
866
|
-
lanSetupFailed: "
|
|
866
|
+
lanSetupFailed: "配置未完成。原有防火墙规则已尽量保留;请允许 Windows 授权提示后重试,若仍失败请查看 dsh-mobile.log 中的具体错误。",
|
|
867
867
|
lanChangeTitle: "更换网络",
|
|
868
868
|
lanChangeIntro: "把局域网访问切换到另一块网卡。私有 CA 与已配对设备都会保留,已连接的手机需要用新地址重新连接。",
|
|
869
869
|
lanChangeSelect: "新网络",
|
|
@@ -1172,6 +1172,7 @@ window.__ModuleLoader__.load({
|
|
|
1172
1172
|
irohConnecting: "Sidecar connected; starting the DSH authentication gateway…",
|
|
1173
1173
|
irohCompanionMissing: "No verified iroh sidecar is available. Use Install official component below; a separate companion plugin is optional.",
|
|
1174
1174
|
irohDataDirectoryInvalid: "Could not prepare the private sidecar directory. Check that DSH can manage its own profile directory, then retry.",
|
|
1175
|
+
irohDataDirectoryInsecure: "Windows parent folders of the iroh state path must not grant write or replacement rights to other users. Choose a private profile directory or correct the parent ACLs, then retry.",
|
|
1175
1176
|
irohSidecarInvalid: "The installed sidecar failed checksum verification. Reinstall the component.",
|
|
1176
1177
|
irohDownloadFailed: "The sidecar download failed before verification. Check the network and retry.",
|
|
1177
1178
|
irohPlatformUnsupported: "iroh sidecars are published for Windows x64 and Linux x64 only.",
|
|
@@ -1207,6 +1208,7 @@ window.__ModuleLoader__.load({
|
|
|
1207
1208
|
irohConnecting: "Sidecar connesso; avvio del gateway di autenticazione DSH…",
|
|
1208
1209
|
irohCompanionMissing: "Nessun sidecar iroh verificato disponibile. Usa Installa componente ufficiale qui sotto; il plugin complementare è facoltativo.",
|
|
1209
1210
|
irohDataDirectoryInvalid: "Impossibile preparare la directory privata del sidecar. Verifica che DSH possa gestire la propria directory del profilo, poi riprova.",
|
|
1211
|
+
irohDataDirectoryInsecure: "Le cartelle Windows superiori del percorso di stato iroh non devono concedere ad altri utenti diritti di scrittura o sostituzione. Scegli una directory profilo privata o correggi le ACL superiori, poi riprova.",
|
|
1210
1212
|
irohSidecarInvalid: "Il sidecar installato non ha superato la verifica del checksum. Reinstalla il componente.",
|
|
1211
1213
|
irohDownloadFailed: "Download del sidecar non riuscito prima della verifica. Controlla la rete e riprova.",
|
|
1212
1214
|
irohPlatformUnsupported: "I sidecar iroh sono pubblicati solo per Windows x64 e Linux x64.",
|
|
@@ -1242,6 +1244,7 @@ window.__ModuleLoader__.load({
|
|
|
1242
1244
|
irohConnecting: "Sidecar 已连接,正在启动 DSH 认证网关…",
|
|
1243
1245
|
irohCompanionMissing: "尚无校验通过的 iroh 组件,请点击下方「安装官方组件」;无需另装配套插件。",
|
|
1244
1246
|
irohDataDirectoryInvalid: "无法准备 sidecar 私有目录。请确认 DSH 能管理自己的配置目录后重试。",
|
|
1247
|
+
irohDataDirectoryInsecure: "iroh 状态路径的 Windows 上级目录不能向其他用户授予写入或替换权限;请改用私有配置目录或修正上级目录 ACL 后重试。",
|
|
1245
1248
|
irohSidecarInvalid: "已安装的 sidecar 哈希校验失败,请重装组件。",
|
|
1246
1249
|
irohDownloadFailed: "下载 sidecar 失败,还没开始校验。请检查网络后重试。",
|
|
1247
1250
|
irohPlatformUnsupported: "iroh sidecar 仅发布 Windows x64 与 Linux x64 版本。",
|
|
@@ -2213,6 +2216,27 @@ window.__ModuleLoader__.load({
|
|
|
2213
2216
|
frpConfigurationMissingAttach: "填写既有 frps 信息,在本机安装 frpc,然后保存并验证连接。",
|
|
2214
2217
|
purgeFrpConfirmSelfSigned: "要停止 FRP 并删除本机 frpc、Token、配置、证书、私钥、身份记录、临时文件和日志吗?通过此自签入口配对的手机都需重新配对;VPS 不会改变。"
|
|
2215
2218
|
});
|
|
2219
|
+
Object.assign(MOBILE_CONTROL_MESSAGES.zh, {
|
|
2220
|
+
macPermissionTitle: "请确认已开启「完全磁盘访问权限」",
|
|
2221
|
+
macPermissionSummary: "开启后,远程使用期间不会再弹出需要确认的文件夹授权窗口,连接也不会因此中断。",
|
|
2222
|
+
macPermissionSteps: "系统设置 → 隐私与安全性 → 完全磁盘访问权限 → 打开 DeepSeek Harness",
|
|
2223
|
+
macPermissionOpen: "打开系统设置",
|
|
2224
|
+
macPermissionDismiss: "我知道了"
|
|
2225
|
+
});
|
|
2226
|
+
Object.assign(MOBILE_CONTROL_MESSAGES.en, {
|
|
2227
|
+
macPermissionTitle: "Confirm Full Disk Access is enabled",
|
|
2228
|
+
macPermissionSummary: "With it enabled, remote use will not raise folder authorization dialogs, and the connection will not stall on them.",
|
|
2229
|
+
macPermissionSteps: "System Settings → Privacy & Security → Full Disk Access → turn on DeepSeek Harness",
|
|
2230
|
+
macPermissionOpen: "Open System Settings",
|
|
2231
|
+
macPermissionDismiss: "Got it"
|
|
2232
|
+
});
|
|
2233
|
+
Object.assign(MOBILE_CONTROL_MESSAGES.it, {
|
|
2234
|
+
macPermissionTitle: "Verifica che l’accesso completo al disco sia attivo",
|
|
2235
|
+
macPermissionSummary: "Se attivo, durante l’uso remoto non compariranno finestre di autorizzazione per le cartelle e la connessione non si bloccherà.",
|
|
2236
|
+
macPermissionSteps: "Impostazioni di Sistema → Privacy e sicurezza → Accesso completo al disco → attiva DeepSeek Harness",
|
|
2237
|
+
macPermissionOpen: "Apri Impostazioni di Sistema",
|
|
2238
|
+
macPermissionDismiss: "Ho capito"
|
|
2239
|
+
});
|
|
2216
2240
|
/** Caddy snippet owned entirely by DSH Mobile; the main Caddyfile only imports it. */
|
|
2217
2241
|
const FRP_CADDY_SNIPPET_PATH = "/etc/caddy/dsh-mobile-dsh.caddy";
|
|
2218
2242
|
/** First line of the owned snippet; also the legacy whole-file marker. */
|
|
@@ -11617,6 +11641,7 @@ dialog.dshm-picker[open]{display:grid;place-items:center}dialog.dshm-picker::bac
|
|
|
11617
11641
|
frp_exited: "frpExited",
|
|
11618
11642
|
iroh_companion_missing: "irohCompanionMissing",
|
|
11619
11643
|
iroh_data_directory_invalid: "irohDataDirectoryInvalid",
|
|
11644
|
+
iroh_data_directory_insecure: "irohDataDirectoryInsecure",
|
|
11620
11645
|
iroh_sidecar_invalid: "irohSidecarInvalid",
|
|
11621
11646
|
iroh_download_failed: "irohDownloadFailed",
|
|
11622
11647
|
iroh_download_size_mismatch: "irohDownloadFailed",
|
|
@@ -12950,6 +12975,7 @@ dialog.dshm-picker[open]{display:grid;place-items:center}dialog.dshm-picker::bac
|
|
|
12950
12975
|
remoteStatus.setAttribute("aria-live", "polite");
|
|
12951
12976
|
const remoteGuide = element("section", "dsh-mobile-control__guide");
|
|
12952
12977
|
remoteGuide.hidden = true;
|
|
12978
|
+
remoteGuide.dataset.dshMobileGuide = "funnel";
|
|
12953
12979
|
remoteGuide.setAttribute("aria-label", t("funnelGuideAria"));
|
|
12954
12980
|
const remoteGuideTitle = element("h3", "dsh-mobile-control__guide-title");
|
|
12955
12981
|
remoteGuideTitle.textContent = t("funnelGuideTitle");
|
|
@@ -12976,6 +13002,26 @@ dialog.dshm-picker[open]{display:grid;place-items:center}dialog.dshm-picker::bac
|
|
|
12976
13002
|
remoteSetupRetry.textContent = t("retryNow");
|
|
12977
13003
|
remoteGuideActions.append(remoteSetup, remoteSetupRetry);
|
|
12978
13004
|
remoteGuide.append(remoteGuideTitle, remoteGuideSummary, remoteGuideSteps, remoteGuideNote, remoteGuideActions);
|
|
13005
|
+
const remotePermission = element("section", "dsh-mobile-control__guide");
|
|
13006
|
+
remotePermission.hidden = true;
|
|
13007
|
+
remotePermission.dataset.dshMobileGuide = "mac-file-access";
|
|
13008
|
+
remotePermission.setAttribute("aria-label", t("macPermissionTitle"));
|
|
13009
|
+
remotePermission.setAttribute("role", "status");
|
|
13010
|
+
const remotePermissionTitle = element("h3", "dsh-mobile-control__guide-title");
|
|
13011
|
+
remotePermissionTitle.textContent = t("macPermissionTitle");
|
|
13012
|
+
const remotePermissionSummary = element("p", "dsh-mobile-control__guide-summary");
|
|
13013
|
+
remotePermissionSummary.textContent = t("macPermissionSummary");
|
|
13014
|
+
const remotePermissionSteps = element("p", "dsh-mobile-control__guide-note");
|
|
13015
|
+
remotePermissionSteps.textContent = t("macPermissionSteps");
|
|
13016
|
+
const remotePermissionActions = element("div", "dsh-mobile-control__guide-actions");
|
|
13017
|
+
const remotePermissionOpen = element("button", "dsh-mobile-control__primary");
|
|
13018
|
+
remotePermissionOpen.type = "button";
|
|
13019
|
+
remotePermissionOpen.textContent = t("macPermissionOpen");
|
|
13020
|
+
const remotePermissionDismissButton = element("button", "dsh-mobile-control__secondary");
|
|
13021
|
+
remotePermissionDismissButton.type = "button";
|
|
13022
|
+
remotePermissionDismissButton.textContent = t("macPermissionDismiss");
|
|
13023
|
+
remotePermissionActions.append(remotePermissionOpen, remotePermissionDismissButton);
|
|
13024
|
+
remotePermission.append(remotePermissionTitle, remotePermissionSummary, remotePermissionSteps, remotePermissionActions);
|
|
12979
13025
|
const remoteActions = element("div", "dsh-mobile-control__actions");
|
|
12980
13026
|
const remoteToggle = element("button", "dsh-mobile-control__primary");
|
|
12981
13027
|
remoteToggle.type = "button";
|
|
@@ -13224,7 +13270,7 @@ dialog.dshm-picker[open]{display:grid;place-items:center}dialog.dshm-picker::bac
|
|
|
13224
13270
|
macosFolderHelpBody.append(macosFolderHelpNote);
|
|
13225
13271
|
macosFolderHelp.append(macosFolderHelpSummary, macosFolderHelpBody);
|
|
13226
13272
|
setupDetailsRow.append(macosFolderHelp);
|
|
13227
|
-
remoteWorkspace.append(remoteStatus, remoteAccess, remoteGuide, providerSetupBody, remoteQr, pairingValidity, providerInstallRow, remoteActions, remotePairLink, setupDetailsRow);
|
|
13273
|
+
remoteWorkspace.append(remoteStatus, remoteAccess, remoteGuide, remotePermission, providerSetupBody, remoteQr, pairingValidity, providerInstallRow, remoteActions, remotePairLink, setupDetailsRow);
|
|
13228
13274
|
const diagnosticsView = element("div", "dsh-mobile-control__view is-diagnostics");
|
|
13229
13275
|
diagnosticsView.hidden = true;
|
|
13230
13276
|
const devicesView = element("div", "dsh-mobile-control__view is-devices");
|
|
@@ -13323,6 +13369,7 @@ dialog.dshm-picker[open]{display:grid;place-items:center}dialog.dshm-picker::bac
|
|
|
13323
13369
|
let remoteLoginUrl = "";
|
|
13324
13370
|
let remoteSetupUrl = "";
|
|
13325
13371
|
let remoteSetupPending = false;
|
|
13372
|
+
let remotePermissionDismissed = false;
|
|
13326
13373
|
let remoteSetupOpenedAt = 0;
|
|
13327
13374
|
let remoteReconnectBusy = false;
|
|
13328
13375
|
let remoteProviderBusy = false;
|
|
@@ -14202,6 +14249,8 @@ dialog.dshm-picker[open]{display:grid;place-items:center}dialog.dshm-picker::bac
|
|
|
14202
14249
|
const needsFunnelSetup = state === "error" && remoteSetupUrl !== "";
|
|
14203
14250
|
remoteReady = remoteRunning && state === "ready" && remoteOrigin !== "";
|
|
14204
14251
|
macosFolderHelp.hidden = data.macosHost !== true || !remoteReady;
|
|
14252
|
+
const macFileAccess = data.macFileAccess === "missing" ? "missing" : data.macFileAccess === "ok" ? "ok" : void 0;
|
|
14253
|
+
remotePermission.hidden = macFileAccess !== "missing" || remotePermissionDismissed || !remoteReady;
|
|
14205
14254
|
frpChoiceBadge.textContent = frpConfigured && frpInstalled ? t("ready") : t("advanced");
|
|
14206
14255
|
originChoiceBadge.textContent = managedOrigin ? t(remoteReady ? "ready" : "advanced") : originListening ? t("originBackendReady") : t("advanced");
|
|
14207
14256
|
if (remoteStatus.style) remoteStatus.style.display = state === "off" && remoteFailureText === "" ? "none" : "";
|
|
@@ -15620,6 +15669,13 @@ dialog.dshm-picker[open]{display:grid;place-items:center}dialog.dshm-picker::bac
|
|
|
15620
15669
|
remoteSetupPending = false;
|
|
15621
15670
|
reconnectRemote();
|
|
15622
15671
|
});
|
|
15672
|
+
remotePermissionOpen.addEventListener("click", () => {
|
|
15673
|
+
controlRequestJson("/api/mobile-access/remote/macos-file-access/open-settings", { method: "POST" }).catch(() => {});
|
|
15674
|
+
});
|
|
15675
|
+
remotePermissionDismissButton.addEventListener("click", () => {
|
|
15676
|
+
remotePermissionDismissed = true;
|
|
15677
|
+
remotePermission.hidden = true;
|
|
15678
|
+
});
|
|
15623
15679
|
remoteSetup.addEventListener("click", () => {
|
|
15624
15680
|
if (remoteSetupUrl === "") return;
|
|
15625
15681
|
remoteSetupPending = true;
|