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/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. Confirm the network selection and approve the Windows prompt, then try again.",
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. Controlla la rete e approva la richiesta di Windows, quindi riprova.",
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: "配置未完成。请确认网卡选择并允许 Windows 授权提示,然后重试。",
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;