ds-harness-remote 0.3.32 → 0.3.34

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.
Files changed (42) hide show
  1. package/README.md +3 -3
  2. package/dist/client-runtime.d.ts +2 -1
  3. package/dist/client-runtime.d.ts.map +1 -1
  4. package/dist/client-runtime.js +73 -31
  5. package/dist/client-runtime.js.map +1 -1
  6. package/dist/client.d.ts +1 -0
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.github.js +88 -54
  9. package/dist/client.js +88 -54
  10. package/dist/client.js.map +1 -1
  11. package/dist/harness-api-bridge.d.ts.map +1 -1
  12. package/dist/harness-api-bridge.js +2 -5
  13. package/dist/harness-api-bridge.js.map +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1384 -113
  16. package/dist/index.js.map +4 -4
  17. package/dist/native-rtc-helper.d.ts +4 -0
  18. package/dist/native-rtc-helper.d.ts.map +1 -0
  19. package/dist/native-rtc-helper.js +539 -0
  20. package/dist/native-rtc-helper.js.map +1 -0
  21. package/dist/rpc-router.d.ts +1 -6
  22. package/dist/rpc-router.d.ts.map +1 -1
  23. package/dist/rpc-router.js +5 -20
  24. package/dist/rpc-router.js.map +1 -1
  25. package/dist/safe-error.d.ts +8 -0
  26. package/dist/safe-error.d.ts.map +1 -0
  27. package/dist/safe-error.js +20 -0
  28. package/dist/safe-error.js.map +1 -0
  29. package/dist/server-connection.d.ts.map +1 -1
  30. package/dist/server-connection.js +43 -2
  31. package/dist/server-connection.js.map +1 -1
  32. package/dist/service.d.ts.map +1 -1
  33. package/dist/service.js +4 -2
  34. package/dist/service.js.map +1 -1
  35. package/dist/version.d.ts +1 -1
  36. package/dist/version.js +1 -1
  37. package/dist/werift-rtc.d.ts +45 -9
  38. package/dist/werift-rtc.d.ts.map +1 -1
  39. package/dist/werift-rtc.js +356 -35
  40. package/dist/werift-rtc.js.map +1 -1
  41. package/package.json +4 -1
  42. package/public.d.ts +1 -1
package/dist/client.js CHANGED
@@ -1691,7 +1691,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
1691
1691
  var CONTROL_RPC_PREFIX = "/ds-harness-remote";
1692
1692
 
1693
1693
  // src/client.ts
1694
- var clientModuleId = "ds-harness-remote", localeNamespace = "dsh-remote", en = {
1694
+ var clientModuleId = "ds-harness-remote", localeNamespace = "ds-harness-remote", en = {
1695
1695
  pluginTitle: "DeepSeek Remote",
1696
1696
  pluginDescription: "Connect once. Available anytime.",
1697
1697
  expandSettings: "Show settings: {name}",
@@ -1798,6 +1798,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
1798
1798
  remoteProgressProbeRelay: "Preparing Relay",
1799
1799
  remoteProgressProbeRelayDetail: "Preparing the encrypted Server Relay fallback if direct paths do not open.",
1800
1800
  remoteProgressTryingPrefix: "Trying ",
1801
+ remoteProgressUsingPrefix: "Using ",
1801
1802
  remoteProgressLoadingWorkspaces: "Loading workspaces",
1802
1803
  remoteProgressLoadingWorkspacesDetail: "Reading the remote Harness workspace list through the tunnel.",
1803
1804
  remoteProgressOpeningWorkspace: "Opening workspace",
@@ -1992,6 +1993,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
1992
1993
  remoteProgressProbeRelay: "\u6B63\u5728\u51C6\u5907 Relay",
1993
1994
  remoteProgressProbeRelayDetail: "\u5982\u679C\u76F4\u8FDE\u8DEF\u5F84\u672A\u6253\u5F00\uFF0C\u5C06\u56DE\u843D\u5230\u52A0\u5BC6\u7684 Server Relay\u3002",
1994
1995
  remoteProgressTryingPrefix: "\u6B63\u5728\u5C1D\u8BD5 ",
1996
+ remoteProgressUsingPrefix: "\u5DF2\u8FDE\u63A5 ",
1995
1997
  remoteProgressLoadingWorkspaces: "\u6B63\u5728\u52A0\u8F7D\u5DE5\u4F5C\u533A",
1996
1998
  remoteProgressLoadingWorkspacesDetail: "\u901A\u8FC7\u96A7\u9053\u8BFB\u53D6\u8FDC\u7AEF Harness \u5DE5\u4F5C\u533A\u5217\u8868\u3002",
1997
1999
  remoteProgressOpeningWorkspace: "\u6B63\u5728\u6253\u5F00\u5DE5\u4F5C\u533A",
@@ -2113,20 +2115,39 @@ Minimum version required to store current data is: ` + bestVersion + `.
2113
2115
  return value === "lan" ? { label: "remoteProgressProbeLan", detail: "remoteProgressProbeLanDetail" } : value === "p2p" ? { label: "remoteProgressProbeP2p", detail: "remoteProgressProbeP2pDetail" } : value === "turn" ? { label: "remoteProgressProbeTurn", detail: "remoteProgressProbeTurnDetail" } : { label: "remoteProgressProbeRelay", detail: "remoteProgressProbeRelayDetail" };
2114
2116
  }
2115
2117
  function connectHostProgressSteps(preferredTransports) {
2116
- let transports = normalizedPreferredTransports(preferredTransports);
2118
+ let transports = normalizedPreferredTransports(preferredTransports), probeTransports = transports.filter((transport) => transport !== "relay" || transports.length === 1);
2117
2119
  return [
2118
2120
  { label: "remoteProgressCheckingHost", detail: "remoteProgressCheckingHostDetail", percent: 12 },
2119
2121
  { label: "remoteProgressAuthorizingPeer", detail: "remoteProgressAuthorizingPeerDetail", percent: 30, delayMs: 280 },
2120
- ...transports.map((transport, index) => ({
2122
+ ...probeTransports.map((transport, index) => ({
2121
2123
  ...transportProgressCopy(transport),
2122
2124
  percent: Math.min(76, 42 + index * 10),
2123
2125
  delayMs: 680 + index * 360,
2124
- transports,
2125
- activeTransport: transport
2126
+ transports: probeTransports,
2127
+ activeTransport: transport,
2128
+ routeVerb: "trying"
2126
2129
  })),
2127
2130
  { label: "remoteProgressLoadingWorkspaces", detail: "remoteProgressLoadingWorkspacesDetail", percent: 84, delayMs: 1520, transports }
2128
2131
  ];
2129
2132
  }
2133
+ function statusTransportPreference(status) {
2134
+ if (status?.transport === "LAN") return "lan";
2135
+ if (status?.transport === "P2P") return "p2p";
2136
+ if (status?.transport === "TURN") return "turn";
2137
+ if (status?.transport === "Relay") return "relay";
2138
+ }
2139
+ function connectedProgress(status) {
2140
+ let activeTransport = statusTransportPreference(status);
2141
+ if (activeTransport !== void 0)
2142
+ return {
2143
+ label: "remoteProgressReady",
2144
+ detail: "remoteProgressReadyDetail",
2145
+ percent: 100,
2146
+ transports: [activeTransport],
2147
+ activeTransport,
2148
+ routeVerb: "using"
2149
+ };
2150
+ }
2130
2151
  function connectionErrorMessage(code, t) {
2131
2152
  return t(code === "ACCOUNT_AUTH_REQUIRED" || code === "AUTH_INVALID" || code === "TOKEN_EXPIRED" ? "connectionAuthorizationExpired" : code === "DEVICE_REVOKED" ? "connectionDeviceRevoked" : code === "DEVICE_OWNERSHIP_REQUIRED" ? "connectionOwnershipRequired" : code === "RATE_LIMITED" ? "connectionRateLimited" : code === "UNSUPPORTED_VERSION" ? "connectionVersionMismatch" : code === "INVALID_MESSAGE" ? "connectionInvalidResponse" : code === "CONNECTION_FAILED" || code === "SERVER_NOT_CONFIGURED" ? "connectionReachability" : "connectionUnexpected");
2132
2153
  }
@@ -2146,7 +2167,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2146
2167
  let percent = Math.max(0, Math.min(100, Math.round(progress.percent))), activeTransportIndex = progress.transports?.findIndex((transport) => transport === progress.activeTransport) ?? -1, detail = progress.transports !== void 0 && progress.activeTransport !== void 0 && activeTransportIndex > -1 ? React.createElement(
2147
2168
  "span",
2148
2169
  { className: "dshRemoteProgressRoute" },
2149
- props.t("remoteProgressTryingPrefix"),
2170
+ props.t(progress.routeVerb === "using" ? "remoteProgressUsingPrefix" : "remoteProgressTryingPrefix"),
2150
2171
  progress.transports.map((transport, index) => React.createElement(
2151
2172
  React.Fragment,
2152
2173
  { key: `${transport}:${index}` },
@@ -2180,7 +2201,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2180
2201
  }, React.createElement("span", { style: { width: `${percent}%` } }))
2181
2202
  );
2182
2203
  }
2183
- async function runRemoteProgress(steps, setProgress, progressRun, action) {
2204
+ async function runRemoteProgress(steps, setProgress, progressRun, action, readyProgress) {
2184
2205
  let runId = progressRun.current + 1;
2185
2206
  progressRun.current = runId;
2186
2207
  let apply2 = (next) => {
@@ -2190,7 +2211,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2190
2211
  let timers = rest.map((step) => window.setTimeout(() => apply2(step), step.delayMs ?? 0));
2191
2212
  try {
2192
2213
  let result = await action();
2193
- return apply2({ label: "remoteProgressReady", detail: "remoteProgressReadyDetail", percent: 100 }), await new Promise((resolve) => window.setTimeout(resolve, 220)), result;
2214
+ return apply2(readyProgress?.(result) ?? { label: "remoteProgressReady", detail: "remoteProgressReadyDetail", percent: 100 }), await new Promise((resolve) => window.setTimeout(resolve, 520)), result;
2194
2215
  } finally {
2195
2216
  timers.forEach((timer) => window.clearTimeout(timer)), progressRun.current === runId && setProgress(void 0);
2196
2217
  }
@@ -2492,12 +2513,18 @@ Minimum version required to store current data is: ` + bestVersion + `.
2492
2513
  }, t(provider === "github" ? "githubLogin" : "zhihuLogin")), selectHost = async (host) => {
2493
2514
  setBusy(!0), setError(void 0);
2494
2515
  try {
2495
- setWorkspaces(await runRemoteProgress(
2516
+ let result = await runRemoteProgress(
2496
2517
  connectHostProgressSteps(status?.preferredTransports),
2497
2518
  setProgress,
2498
2519
  progressRun,
2499
- () => props.control("workspaces.list", { targetDeviceId: host.deviceId })
2500
- )), setSelectedHost(host), setPath(""), setAddingWorkspace(!1), setDirectory(void 0);
2520
+ async () => {
2521
+ let nextWorkspaces = await props.control("workspaces.list", { targetDeviceId: host.deviceId }), nextStatus = await props.control("status").catch(() => {
2522
+ });
2523
+ return nextStatus !== void 0 && setStatus(nextStatus), { workspaces: nextWorkspaces, status: nextStatus };
2524
+ },
2525
+ (result2) => connectedProgress(result2.status)
2526
+ );
2527
+ setWorkspaces(result.workspaces), setSelectedHost(host), setPath(""), setAddingWorkspace(!1), setDirectory(void 0);
2501
2528
  } catch (reason) {
2502
2529
  setError(messageOf(reason));
2503
2530
  } finally {
@@ -2573,20 +2600,22 @@ Minimum version required to store current data is: ` + bestVersion + `.
2573
2600
  if (!(selectedHost === void 0 || path.trim() === "")) {
2574
2601
  setBusy(!0), setError(void 0);
2575
2602
  try {
2576
- await runRemoteProgress(
2603
+ let nextStatus = await runRemoteProgress(
2577
2604
  openWorkspaceProgressSteps,
2578
2605
  setProgress,
2579
2606
  progressRun,
2580
2607
  () => props.control("workspace.open", {
2581
2608
  targetDeviceId: selectedHost.deviceId,
2582
2609
  path: path.trim()
2583
- })
2584
- ), window.location.reload();
2610
+ }),
2611
+ connectedProgress
2612
+ );
2613
+ setStatus(nextStatus), window.location.reload();
2585
2614
  } catch (reason) {
2586
2615
  setError(messageOf(reason)), setBusy(!1);
2587
2616
  }
2588
2617
  }
2589
- }, remoteLabel = status?.mode === "remote" ? t("activeRemote", { name: status.target?.name ?? t("host") }) : t("remoteEntry"), currentDeviceName = status?.deviceName ?? t("currentDevice");
2618
+ }, remoteLabel = status?.mode === "remote" ? t("activeRemote", { name: status.target?.name ?? t("host") }) : t("remoteEntry");
2590
2619
  return React.createElement(
2591
2620
  React.Fragment,
2592
2621
  null,
@@ -2761,39 +2790,34 @@ Minimum version required to store current data is: ` + bestVersion + `.
2761
2790
  React.createElement(
2762
2791
  "div",
2763
2792
  { className: "dshRemoteSectionHeading" },
2764
- React.createElement("strong", null, t("chooseHost")),
2765
2793
  React.createElement(
2766
2794
  "div",
2767
- { className: "dshRemoteSectionActions" },
2768
- React.createElement(
2795
+ { className: "dshRemoteSectionTitle" },
2796
+ React.createElement("strong", null, t("chooseHost")),
2797
+ status?.hostAuthorizationAvailable ? React.createElement(
2769
2798
  "div",
2770
- { className: "dshRemoteCurrentDeviceControl" },
2771
- React.createElement(
2772
- "div",
2773
- { className: "dshRemoteCurrentDeviceTitle" },
2774
- React.createElement("span", { className: "dshRemoteCurrentDeviceName" }, currentDeviceName),
2775
- React.createElement("button", {
2776
- type: "button",
2777
- className: "dshRemoteAccountExit",
2778
- disabled: busy,
2779
- onClick: () => void logoutRemote()
2780
- }, t("exitRemoteAccount"))
2781
- ),
2782
- status?.hostAuthorizationAvailable ? React.createElement(
2783
- "div",
2784
- { className: "dshRemoteHostControlToggle" },
2785
- React.createElement("span", null, t("allowControlCurrentDevice")),
2786
- React.createElement("input", {
2787
- type: "checkbox",
2788
- role: "switch",
2789
- disabled: busy,
2790
- "aria-label": t("allowControlCurrentDevice"),
2791
- checked: status.host?.authorized === !0,
2792
- onChange: (event) => void setCurrentDeviceControl(event.target.checked)
2793
- })
2794
- ) : null
2795
- ),
2796
- selectedHost === void 0 ? null : React.createElement("button", {
2799
+ { className: "dshRemoteHostControlToggle" },
2800
+ React.createElement("span", null, t("allowControlCurrentDevice")),
2801
+ React.createElement("input", {
2802
+ type: "checkbox",
2803
+ role: "switch",
2804
+ disabled: busy,
2805
+ "aria-label": t("allowControlCurrentDevice"),
2806
+ checked: status.host?.authorized === !0,
2807
+ onChange: (event) => void setCurrentDeviceControl(event.target.checked)
2808
+ })
2809
+ ) : null,
2810
+ React.createElement("button", {
2811
+ type: "button",
2812
+ className: "dshRemoteAccountExit",
2813
+ disabled: busy,
2814
+ onClick: () => void logoutRemote()
2815
+ }, t("exitRemoteAccount"))
2816
+ ),
2817
+ selectedHost === void 0 ? null : React.createElement(
2818
+ "div",
2819
+ { className: "dshRemoteSectionActions" },
2820
+ React.createElement("button", {
2797
2821
  type: "button",
2798
2822
  onClick: () => {
2799
2823
  setSelectedHost(void 0), setWorkspaces([]), setDirectory(void 0), setPath(""), setAddingWorkspace(!1), setError(void 0);
@@ -2932,7 +2956,13 @@ Minimum version required to store current data is: ` + bestVersion + `.
2932
2956
  setBusy(!0), setError(void 0);
2933
2957
  try {
2934
2958
  let action = () => props.control("mode.set", { mode, ...targetDeviceId === void 0 ? {} : { targetDeviceId } });
2935
- mode === "remote" ? await runRemoteProgress(connectHostProgressSteps(status?.preferredTransports), setProgress, progressRun, action) : await action(), window.location.reload();
2959
+ setStatus(mode === "remote" ? await runRemoteProgress(
2960
+ connectHostProgressSteps(status?.preferredTransports),
2961
+ setProgress,
2962
+ progressRun,
2963
+ action,
2964
+ connectedProgress
2965
+ ) : await action()), window.location.reload();
2936
2966
  } catch (reason) {
2937
2967
  setError(messageOf(reason)), setBusy(!1);
2938
2968
  }
@@ -3080,7 +3110,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3080
3110
  } finally {
3081
3111
  setBusy(!1);
3082
3112
  }
3083
- }, transport = status.transport ?? "Disconnected", networkLabel = t(transport === "P2P" ? "remoteNetworkP2p" : transport === "TURN" ? "remoteNetworkTurn" : transport === "Relay" ? "remoteNetworkRelay" : transport === "LAN" ? "remoteNetworkLan" : "remoteNetworkOffline"), networkOnline = status.connected === !0 && transport !== "Disconnected", routeVia = t(transport === "P2P" ? "connectionRouteP2p" : transport === "TURN" ? "connectionRouteTurn" : transport === "Relay" ? "connectionRouteRelay" : "connectionRouteLan"), routeViaDetail = t(transport === "P2P" ? "connectionRouteP2pDetail" : transport === "TURN" ? "connectionRouteTurnDetail" : transport === "Relay" ? "connectionRouteRelayDetail" : "connectionRouteLanDetail"), network = status.network, webRtc = network?.webRtc, controlStateLabel = network?.controlChannelState === "connecting" ? t("controlStateConnecting") : network?.controlChannelState === "open" ? t("controlStateOpen") : network?.controlChannelState === "closing" ? t("controlStateClosing") : t("controlStateClosed"), detailValue = (value) => value === void 0 || value === "" ? t("notProvided") : String(value), candidateLabel = (value) => value === "host" ? t("candidateHost") : value === "srflx" ? t("candidateSrflx") : value === "prflx" ? t("candidatePrflx") : value === "relay" ? t("candidateRelay") : detailValue(value), fact = (label, value, mono = !1) => React.createElement(
3113
+ }, transport = status.network?.webRtc?.mode ?? status.transport ?? "Disconnected", networkLabel = t(transport === "P2P" ? "remoteNetworkP2p" : transport === "TURN" ? "remoteNetworkTurn" : transport === "Relay" ? "remoteNetworkRelay" : transport === "LAN" ? "remoteNetworkLan" : "remoteNetworkOffline"), networkOnline = status.connected === !0 && transport !== "Disconnected", routeVia = t(transport === "P2P" ? "connectionRouteP2p" : transport === "TURN" ? "connectionRouteTurn" : transport === "Relay" ? "connectionRouteRelay" : "connectionRouteLan"), routeViaDetail = t(transport === "P2P" ? "connectionRouteP2pDetail" : transport === "TURN" ? "connectionRouteTurnDetail" : transport === "Relay" ? "connectionRouteRelayDetail" : "connectionRouteLanDetail"), network = status.network, webRtc = network?.webRtc, controlStateLabel = network?.controlChannelState === "connecting" ? t("controlStateConnecting") : network?.controlChannelState === "open" ? t("controlStateOpen") : network?.controlChannelState === "closing" ? t("controlStateClosing") : t("controlStateClosed"), detailValue = (value) => value === void 0 || value === "" ? t("notProvided") : String(value), candidateLabel = (value) => value === "host" ? t("candidateHost") : value === "srflx" ? t("candidateSrflx") : value === "prflx" ? t("candidatePrflx") : value === "relay" ? t("candidateRelay") : detailValue(value), fact = (label, value, mono = !1) => React.createElement(
3084
3114
  "div",
3085
3115
  null,
3086
3116
  React.createElement("dt", null, label),
@@ -3239,7 +3269,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3239
3269
  ".dshRemotePage{width:min(720px,100%);max-height:min(760px,calc(100vh - 40px));display:flex;flex-direction:column;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:14px;overflow:hidden;animation:dshRemotePageIn .18s cubic-bezier(.25,1,.5,1)}",
3240
3270
  ".dshRemotePageHeader{min-height:72px;display:flex;align-items:center;justify-content:space-between;gap:24px;padding:14px 24px;border-bottom:1px solid var(--dsw-alias-border-l2)}.dshRemotePageIntro{min-width:0;flex:1}.dshRemotePageHeader strong{display:block;font-size:18px;line-height:1.4}.dshRemotePageHeader p{min-width:0;max-width:70ch;margin:3px 0 0;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.5}.dshRemotePageHeader>button{width:40px;height:40px;flex:0 0 auto;border:0;border-radius:8px;background:transparent;color:inherit;font-size:24px;cursor:pointer}.dshRemotePageHeader>button:hover{background:var(--dsw-alias-interactive-bg-hover)}",
3241
3271
  ".dshRemotePageBody{padding:24px;overflow:auto;display:flex;flex-direction:column;gap:24px}.dshRemotePageBody button{font:inherit;color:inherit}",
3242
- ".dshRemoteSectionHeading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:10px}.dshRemoteSectionHeading>strong{font-size:14px}.dshRemoteSectionActions{display:flex;align-items:center;gap:14px}.dshRemoteSectionActions>button{border:0;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;padding:5px 0;font-size:12px}.dshRemoteSectionActions>button:hover:not(:disabled){color:var(--dsw-alias-label-primary);text-decoration:underline}",
3272
+ ".dshRemoteSectionHeading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:10px}.dshRemoteSectionTitle{min-width:0;display:flex;align-items:center;gap:10px}.dshRemoteSectionTitle>strong{font-size:14px}.dshRemoteSectionActions{display:flex;align-items:center;gap:14px}.dshRemoteSectionActions>button{border:0;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;padding:5px 0;font-size:12px}.dshRemoteSectionActions>button:hover:not(:disabled){color:var(--dsw-alias-label-primary);text-decoration:underline}",
3243
3273
  ".dshRemoteSectionHeading>.dshRemoteAddWorkspace{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;padding:0;border-radius:50%;font-size:20px;line-height:1}.dshRemoteSectionHeading>.dshRemoteAddWorkspace:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}",
3244
3274
  ".dshRemoteHostList{display:flex;flex-direction:column;border-top:1px solid var(--dsw-alias-border-l2)}.dshRemoteHostList>button{min-height:58px;display:flex;align-items:center;justify-content:space-between;gap:16px;text-align:left;border:0;border-bottom:1px solid var(--dsw-alias-border-l2);background:transparent;padding:10px 4px;cursor:pointer}.dshRemoteHostList>button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.dshRemoteHostList>button:disabled{opacity:.5;cursor:default}.dshRemoteHostList>button>span{min-width:0;display:flex;flex-direction:column;gap:3px}.dshRemoteHostList>button strong{font-size:14px;font-weight:500}.dshRemoteHostList small,.dshRemoteSelectedHost small{color:var(--dsw-alias-label-secondary);font-size:12px}",
3245
3275
  ".dshRemoteSelectedHost{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 14px;border-radius:10px;background:var(--dsw-alias-bg-layer-2)}",
@@ -3254,7 +3284,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3254
3284
  ".dshRemoteClientLogin{width:min(440px,100%);display:flex;flex-direction:column;gap:8px}.dshRemoteClientLogin input{min-height:40px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:inherit;padding:0 12px;font:inherit}.dshRemoteClientLogin button{align-self:flex-start;min-height:40px;border:0;border-radius:8px;background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-1);padding:8px 16px;cursor:pointer}",
3255
3285
  ".dshRemoteQrLogin{width:min(440px,100%);display:flex;flex-direction:column;align-items:center;gap:8px;padding:6px 0 2px;text-align:center}.dshRemoteQrLogin img,.dshRemoteQrPlaceholder{box-sizing:border-box;width:200px;height:200px;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:#fff;padding:8px}.dshRemoteQrOpen{display:flex;flex-direction:column;align-items:center;gap:5px;color:var(--dsw-alias-label-secondary);font-size:12px;text-decoration:none}.dshRemoteQrOpen:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteQrOpen:hover img{border-color:var(--dsw-alias-label-dimmed)}.dshRemoteQrOpen:focus-visible{border-radius:12px;outline:2px solid var(--dsw-alias-brand-primary);outline-offset:3px}.dshRemoteQrPlaceholder{display:flex;align-items:center;justify-content:center;color:var(--dsw-alias-label-secondary)}.dshRemoteQrLogin>strong{font-size:14px}.dshRemoteQrLogin>p{max-width:48ch;margin:0;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.5}.dshRemoteQrLogin>.dshRemoteServiceAddress{margin-top:2px;color:var(--dsw-alias-label-tertiary)}.dshRemoteServiceAddress>a{color:var(--dsw-alias-label-secondary);text-decoration:none}.dshRemoteServiceAddress>a:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteQrLogin>button,.dshRemoteClientLogin>.dshRemoteLoginSwitch{min-height:32px;border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:4px 8px;font:inherit;font-size:12px;cursor:pointer}.dshRemoteQrLogin>button:hover,.dshRemoteClientLogin>.dshRemoteLoginSwitch:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteClientLogin>.dshRemoteLoginSwitch{align-self:flex-start;background:transparent;color:var(--dsw-alias-label-secondary);padding-left:0}",
3256
3286
  ".dshRemoteEnable{box-sizing:border-box;width:100%;min-height:388px}.dshRemoteLoginHeading{max-width:100%;display:flex;align-items:baseline;gap:10px;overflow:hidden;white-space:nowrap}.dshRemoteLoginTitle{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dshRemoteLoginHeading>span{flex:0 0 auto;color:var(--dsw-alias-label-secondary);font-size:13px;font-weight:400}.dshRemoteLoginTabs{width:100%}.dshRemoteLoginTabs>button{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dshRemoteLoginTabs>button.isActive::after{right:0;left:0;border-radius:0}.dshRemoteClientLogin,.dshRemoteQrLogin{box-sizing:border-box;width:min(440px,100%);height:300px;min-height:300px;align-self:center}.dshRemoteClientLogin{align-items:stretch;padding-top:16px}.dshRemoteClientLogin>button{align-self:stretch;width:100%}.dshRemoteQrLogin{padding-top:12px}",
3257
- '.dshRemoteCurrentDeviceControl{min-width:0;display:flex;align-items:center;gap:14px}.dshRemoteCurrentDeviceTitle{min-width:0;display:flex;align-items:center;gap:8px}.dshRemoteCurrentDeviceName{min-width:0;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);font-size:12px;font-weight:500;line-height:1.5}.dshRemoteHostControlToggle{display:flex;align-items:center;gap:8px;color:var(--dsw-alias-label-secondary);font-size:12px;white-space:nowrap;cursor:default}.dshRemoteHostControlToggle>input{appearance:none;position:relative;width:38px;height:22px;flex:0 0 auto;margin:0;border:1px solid var(--dsw-alias-label-secondary);border-radius:999px;background:var(--dsw-alias-bg-layer-3);cursor:pointer;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);transition:background .16s ease-out,border-color .16s ease-out,box-shadow .16s ease-out}.dshRemoteHostControlToggle>input::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--dsw-alias-label-secondary);transition:transform .16s ease-out,background .16s ease-out}.dshRemoteHostControlToggle>input:checked{border-color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-state-success-primary);box-shadow:none}.dshRemoteHostControlToggle>input:checked::after{transform:translateX(16px);background:var(--dsw-alias-bg-layer-1)}.dshRemoteHostControlToggle>input:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.dshRemoteHostControlToggle>input:disabled{opacity:.5;cursor:default}@media(prefers-reduced-motion:reduce){.dshRemoteHostControlToggle>input,.dshRemoteHostControlToggle>input::after{transition:none}}',
3287
+ '.dshRemoteHostControlToggle{display:flex;align-items:center;gap:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px;white-space:nowrap;cursor:default}.dshRemoteHostControlToggle>input{appearance:none;box-sizing:border-box;position:relative;width:32px;height:18px;flex:0 0 auto;margin:0;border:1px solid var(--dsw-alias-label-secondary);border-radius:999px;background:var(--dsw-alias-bg-layer-3);cursor:pointer;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);transition:background .16s ease-out,border-color .16s ease-out,box-shadow .16s ease-out}.dshRemoteHostControlToggle>input::after{content:"";position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:var(--dsw-alias-label-secondary);transition:transform .16s ease-out,background .16s ease-out}.dshRemoteHostControlToggle>input:checked{border-color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-state-success-primary);box-shadow:none}.dshRemoteHostControlToggle>input:checked::after{transform:translateX(14px);background:var(--dsw-alias-bg-layer-1)}.dshRemoteHostControlToggle>input:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.dshRemoteHostControlToggle>input:disabled{opacity:.5;cursor:default}@media(prefers-reduced-motion:reduce){.dshRemoteHostControlToggle>input,.dshRemoteHostControlToggle>input::after{transition:none}}',
3258
3288
  ".dshRemoteAccountExit{flex:0 0 auto;border:0;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;padding:5px 0;font-size:12px;line-height:1.5;white-space:nowrap}.dshRemoteAccountExit:hover:not(:disabled){color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteAccountExit:disabled{opacity:.5;cursor:default;text-decoration:none}",
3259
3289
  ".dshRemoteLocalLink{align-self:flex-start;border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:4px 0;cursor:pointer}.dshRemoteLocalLink:hover{color:var(--dsw-alias-label-primary)}",
3260
3290
  "@keyframes dshRemotePageIn{from{opacity:0;transform:translateY(6px) scale(.99)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.dshRemotePage{animation:none}}@media(max-width:620px){.dshRemoteBackdrop{padding:12px}.dshRemotePage{max-height:calc(100vh - 24px)}.dshRemotePageHeader{padding:12px 16px}.dshRemoteSectionHeading{align-items:flex-start;flex-direction:column;gap:8px}.dshRemoteSectionActions{width:100%;justify-content:space-between}.dshRemotePageBody{padding:20px 16px}.dshRemoteOpenBar{align-items:flex-end}.dshRemoteOpenBar>button{min-height:48px}}",
@@ -3281,6 +3311,10 @@ Minimum version required to store current data is: ` + bestVersion + `.
3281
3311
  ].join(""), document.head.append(style), () => style.remove();
3282
3312
  }
3283
3313
  function apply(ctx) {
3314
+ if (window.__DS_HARNESS_REMOTE_CLIENT_ACTIVE__) return;
3315
+ window.__DS_HARNESS_REMOTE_CLIENT_ACTIVE__ = !0, ctx.effect(() => () => {
3316
+ window.__DS_HARNESS_REMOTE_CLIENT_ACTIVE__ = !1;
3317
+ }, "ds-harness-remote: client singleton");
3284
3318
  let t = ctx.locale.bind(localeNamespace), control = async (endpoint, payload = {}) => {
3285
3319
  let result;
3286
3320
  for (let attempt = 0; ; attempt += 1)
@@ -3311,7 +3345,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3311
3345
  }), () => {
3312
3346
  disposed = !0, unsubscribe?.();
3313
3347
  };
3314
- }, "dsh-remote: resume selected workspace"), ctx.inject(["fileViewer"], (fileViewerContext) => {
3348
+ }, "ds-harness-remote: resume selected workspace"), ctx.inject(["fileViewer"], (fileViewerContext) => {
3315
3349
  let viewer = fileViewerContext.get("fileViewer");
3316
3350
  viewer !== void 0 && fileViewerContext.effect(() => {
3317
3351
  let active = !0, unregister, latestSaveAsAllowed = !1, sync = async () => {
@@ -3333,16 +3367,16 @@ Minimum version required to store current data is: ` + bestVersion + `.
3333
3367
  return () => {
3334
3368
  active = !1, window.clearInterval(timer), unregister?.();
3335
3369
  };
3336
- }, "dsh-remote: remote file viewer provider");
3337
- }), ctx.effect(() => ctx.locale.register(localeNamespace, { zh, en }), "dsh-remote: dictionaries"), ctx.effect(installStyle, "dsh-remote: client styles"), ctx.slots.inject("shell.overlay", () => ctx.slots.register({
3370
+ }, "ds-harness-remote: remote file viewer provider");
3371
+ }), ctx.effect(() => ctx.locale.register(localeNamespace, { zh, en }), "ds-harness-remote: dictionaries"), ctx.effect(installStyle, "ds-harness-remote: client styles"), ctx.slots.inject("shell.overlay", () => ctx.slots.register({
3338
3372
  name: "shell.overlay",
3339
- id: "dsh-remote-global-context",
3373
+ id: "ds-harness-remote-global-context",
3340
3374
  order: 20,
3341
3375
  locale: localeNamespace,
3342
3376
  inject: () => ({ control })
3343
3377
  }, RemoteSessionHeaderAction)), ctx.slots.inject("sidebar.footer.action", () => ctx.slots.register({
3344
3378
  name: "sidebar.footer.action",
3345
- id: "dsh-remote-workspace",
3379
+ id: "ds-harness-remote-workspace",
3346
3380
  order: -20,
3347
3381
  locale: localeNamespace,
3348
3382
  inject: () => ({