ds-harness-remote 0.3.31 → 0.3.33

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 (41) hide show
  1. package/README.md +5 -5
  2. package/cordis.patch.yml +1 -1
  3. package/dist/client-runtime.d.ts +2 -1
  4. package/dist/client-runtime.d.ts.map +1 -1
  5. package/dist/client-runtime.js +74 -31
  6. package/dist/client-runtime.js.map +1 -1
  7. package/dist/client.github.js +90 -39
  8. package/dist/client.js +89 -38
  9. package/dist/client.js.map +1 -1
  10. package/dist/control-runtime.d.ts.map +1 -1
  11. package/dist/control-runtime.js +1 -0
  12. package/dist/control-runtime.js.map +1 -1
  13. package/dist/harness-api-bridge.d.ts +2 -1
  14. package/dist/harness-api-bridge.d.ts.map +1 -1
  15. package/dist/harness-api-bridge.js +30 -2
  16. package/dist/harness-api-bridge.js.map +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1372 -94
  20. package/dist/index.js.map +4 -4
  21. package/dist/native-rtc-helper.d.ts +4 -0
  22. package/dist/native-rtc-helper.d.ts.map +1 -0
  23. package/dist/native-rtc-helper.js +539 -0
  24. package/dist/native-rtc-helper.js.map +1 -0
  25. package/dist/server-api.d.ts +2 -0
  26. package/dist/server-api.d.ts.map +1 -1
  27. package/dist/server-api.js +3 -0
  28. package/dist/server-api.js.map +1 -1
  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 +6 -3
  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
@@ -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 = "dsh-remote", localeNamespace = "dsh-remote", en = {
1694
+ var clientModuleId = "ds-harness-remote", localeNamespace = "dsh-remote", en = {
1695
1695
  pluginTitle: "DeepSeek Remote",
1696
1696
  pluginDescription: "Connect once. Available anytime.",
1697
1697
  expandSettings: "Show settings: {name}",
@@ -1740,6 +1740,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
1740
1740
  local: "Local",
1741
1741
  remoteTarget: "Remote \xB7 {name}",
1742
1742
  thisMachineLocal: "This machine (Local)",
1743
+ currentDevice: "Current device",
1743
1744
  noRemoteHosts: "No authorized remote Host for this account.",
1744
1745
  online: "Online",
1745
1746
  offline: "Offline",
@@ -1796,6 +1797,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
1796
1797
  remoteProgressProbeTurnDetail: "Checking the TURN relay path for restricted networks.",
1797
1798
  remoteProgressProbeRelay: "Preparing Relay",
1798
1799
  remoteProgressProbeRelayDetail: "Preparing the encrypted Server Relay fallback if direct paths do not open.",
1800
+ remoteProgressTryingPrefix: "Trying ",
1801
+ remoteProgressUsingPrefix: "Using ",
1799
1802
  remoteProgressLoadingWorkspaces: "Loading workspaces",
1800
1803
  remoteProgressLoadingWorkspacesDetail: "Reading the remote Harness workspace list through the tunnel.",
1801
1804
  remoteProgressOpeningWorkspace: "Opening workspace",
@@ -1932,6 +1935,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
1932
1935
  local: "\u672C\u5730",
1933
1936
  remoteTarget: "\u8FDC\u7A0B \xB7 {name}",
1934
1937
  thisMachineLocal: "\u6B64\u8BBE\u5907\uFF08\u672C\u5730\uFF09",
1938
+ currentDevice: "\u5F53\u524D\u8BBE\u5907",
1935
1939
  noRemoteHosts: "\u6B64\u8D26\u53F7\u6CA1\u6709\u5DF2\u6388\u6743\u7684\u8FDC\u7A0B Host\u3002",
1936
1940
  online: "\u5728\u7EBF",
1937
1941
  offline: "\u79BB\u7EBF",
@@ -1988,6 +1992,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
1988
1992
  remoteProgressProbeTurnDetail: "\u68C0\u67E5\u53D7\u9650\u7F51\u7EDC\u4E0B\u53EF\u7528\u7684 TURN \u4E2D\u7EE7\u8DEF\u5F84\u3002",
1989
1993
  remoteProgressProbeRelay: "\u6B63\u5728\u51C6\u5907 Relay",
1990
1994
  remoteProgressProbeRelayDetail: "\u5982\u679C\u76F4\u8FDE\u8DEF\u5F84\u672A\u6253\u5F00\uFF0C\u5C06\u56DE\u843D\u5230\u52A0\u5BC6\u7684 Server Relay\u3002",
1995
+ remoteProgressTryingPrefix: "\u6B63\u5728\u5C1D\u8BD5 ",
1996
+ remoteProgressUsingPrefix: "\u5DF2\u8FDE\u63A5 ",
1991
1997
  remoteProgressLoadingWorkspaces: "\u6B63\u5728\u52A0\u8F7D\u5DE5\u4F5C\u533A",
1992
1998
  remoteProgressLoadingWorkspacesDetail: "\u901A\u8FC7\u96A7\u9053\u8BFB\u53D6\u8FDC\u7AEF Harness \u5DE5\u4F5C\u533A\u5217\u8868\u3002",
1993
1999
  remoteProgressOpeningWorkspace: "\u6B63\u5728\u6253\u5F00\u5DE5\u4F5C\u533A",
@@ -2102,24 +2108,46 @@ Minimum version required to store current data is: ` + bestVersion + `.
2102
2108
  function transportLabel(value, t) {
2103
2109
  return t(value === "lan" ? "remoteNetworkLan" : value === "p2p" ? "remoteNetworkP2p" : value === "turn" ? "remoteNetworkTurn" : "remoteNetworkRelay");
2104
2110
  }
2111
+ function transportDiagnosticLabel(value) {
2112
+ return value === "lan" ? "LAN" : value === "p2p" ? "P2P" : value === "turn" ? "TURN" : "Relay";
2113
+ }
2105
2114
  function transportProgressCopy(value) {
2106
2115
  return value === "lan" ? { label: "remoteProgressProbeLan", detail: "remoteProgressProbeLanDetail" } : value === "p2p" ? { label: "remoteProgressProbeP2p", detail: "remoteProgressProbeP2pDetail" } : value === "turn" ? { label: "remoteProgressProbeTurn", detail: "remoteProgressProbeTurnDetail" } : { label: "remoteProgressProbeRelay", detail: "remoteProgressProbeRelayDetail" };
2107
2116
  }
2108
2117
  function connectHostProgressSteps(preferredTransports) {
2109
- let transports = normalizedPreferredTransports(preferredTransports);
2118
+ let transports = normalizedPreferredTransports(preferredTransports), probeTransports = transports.filter((transport) => transport !== "relay" || transports.length === 1);
2110
2119
  return [
2111
2120
  { label: "remoteProgressCheckingHost", detail: "remoteProgressCheckingHostDetail", percent: 12 },
2112
2121
  { label: "remoteProgressAuthorizingPeer", detail: "remoteProgressAuthorizingPeerDetail", percent: 30, delayMs: 280 },
2113
- ...transports.map((transport, index) => ({
2122
+ ...probeTransports.map((transport, index) => ({
2114
2123
  ...transportProgressCopy(transport),
2115
2124
  percent: Math.min(76, 42 + index * 10),
2116
2125
  delayMs: 680 + index * 360,
2117
- transports,
2118
- activeTransport: transport
2126
+ transports: probeTransports,
2127
+ activeTransport: transport,
2128
+ routeVerb: "trying"
2119
2129
  })),
2120
2130
  { label: "remoteProgressLoadingWorkspaces", detail: "remoteProgressLoadingWorkspacesDetail", percent: 84, delayMs: 1520, transports }
2121
2131
  ];
2122
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
+ }
2123
2151
  function connectionErrorMessage(code, t) {
2124
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");
2125
2153
  }
@@ -2136,7 +2164,19 @@ Minimum version required to store current data is: ` + bestVersion + `.
2136
2164
  function RemoteProgressView(props) {
2137
2165
  let progress = props.progress;
2138
2166
  if (progress === void 0) return null;
2139
- let percent = Math.max(0, Math.min(100, Math.round(progress.percent)));
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(
2168
+ "span",
2169
+ { className: "dshRemoteProgressRoute" },
2170
+ props.t(progress.routeVerb === "using" ? "remoteProgressUsingPrefix" : "remoteProgressTryingPrefix"),
2171
+ progress.transports.map((transport, index) => React.createElement(
2172
+ React.Fragment,
2173
+ { key: `${transport}:${index}` },
2174
+ index === 0 ? null : React.createElement("span", { className: "dshRemoteProgressRouteArrow", "aria-hidden": !0 }, " -> "),
2175
+ React.createElement("span", {
2176
+ className: index === activeTransportIndex ? "isActive" : void 0
2177
+ }, transportDiagnosticLabel(transport))
2178
+ ))
2179
+ ) : props.t(progress.detail);
2140
2180
  return React.createElement(
2141
2181
  "div",
2142
2182
  {
@@ -2150,6 +2190,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2150
2190
  React.createElement("strong", null, props.t(progress.label)),
2151
2191
  React.createElement("span", null, `${percent}%`)
2152
2192
  ),
2193
+ React.createElement("p", null, detail),
2153
2194
  React.createElement("div", {
2154
2195
  className: "dshRemoteProgressBar",
2155
2196
  role: "progressbar",
@@ -2157,18 +2198,10 @@ Minimum version required to store current data is: ` + bestVersion + `.
2157
2198
  "aria-valuemax": 100,
2158
2199
  "aria-valuenow": percent,
2159
2200
  "aria-label": props.t(progress.label)
2160
- }, React.createElement("span", { style: { width: `${percent}%` } })),
2161
- progress.transports === void 0 ? null : React.createElement("div", {
2162
- className: "dshRemoteProgressTransports",
2163
- "aria-label": props.t("preferredTransports")
2164
- }, progress.transports.map((transport, index) => React.createElement("span", {
2165
- key: `${transport}:${index}`,
2166
- className: transport === progress.activeTransport ? "isActive" : void 0
2167
- }, React.createElement("i", { "aria-hidden": !0 }, String(index + 1)), transportLabel(transport, props.t)))),
2168
- React.createElement("p", null, props.t(progress.detail))
2201
+ }, React.createElement("span", { style: { width: `${percent}%` } }))
2169
2202
  );
2170
2203
  }
2171
- async function runRemoteProgress(steps, setProgress, progressRun, action) {
2204
+ async function runRemoteProgress(steps, setProgress, progressRun, action, readyProgress) {
2172
2205
  let runId = progressRun.current + 1;
2173
2206
  progressRun.current = runId;
2174
2207
  let apply2 = (next) => {
@@ -2178,7 +2211,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2178
2211
  let timers = rest.map((step) => window.setTimeout(() => apply2(step), step.delayMs ?? 0));
2179
2212
  try {
2180
2213
  let result = await action();
2181
- 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;
2182
2215
  } finally {
2183
2216
  timers.forEach((timer) => window.clearTimeout(timer)), progressRun.current === runId && setProgress(void 0);
2184
2217
  }
@@ -2480,12 +2513,18 @@ Minimum version required to store current data is: ` + bestVersion + `.
2480
2513
  }, t(provider === "github" ? "githubLogin" : "zhihuLogin")), selectHost = async (host) => {
2481
2514
  setBusy(!0), setError(void 0);
2482
2515
  try {
2483
- setWorkspaces(await runRemoteProgress(
2516
+ let result = await runRemoteProgress(
2484
2517
  connectHostProgressSteps(status?.preferredTransports),
2485
2518
  setProgress,
2486
2519
  progressRun,
2487
- () => props.control("workspaces.list", { targetDeviceId: host.deviceId })
2488
- )), 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);
2489
2528
  } catch (reason) {
2490
2529
  setError(messageOf(reason));
2491
2530
  } finally {
@@ -2561,15 +2600,17 @@ Minimum version required to store current data is: ` + bestVersion + `.
2561
2600
  if (!(selectedHost === void 0 || path.trim() === "")) {
2562
2601
  setBusy(!0), setError(void 0);
2563
2602
  try {
2564
- await runRemoteProgress(
2603
+ let nextStatus = await runRemoteProgress(
2565
2604
  openWorkspaceProgressSteps,
2566
2605
  setProgress,
2567
2606
  progressRun,
2568
2607
  () => props.control("workspace.open", {
2569
2608
  targetDeviceId: selectedHost.deviceId,
2570
2609
  path: path.trim()
2571
- })
2572
- ), window.location.reload();
2610
+ }),
2611
+ connectedProgress
2612
+ );
2613
+ setStatus(nextStatus), window.location.reload();
2573
2614
  } catch (reason) {
2574
2615
  setError(messageOf(reason)), setBusy(!1);
2575
2616
  }
@@ -2749,10 +2790,10 @@ Minimum version required to store current data is: ` + bestVersion + `.
2749
2790
  React.createElement(
2750
2791
  "div",
2751
2792
  { className: "dshRemoteSectionHeading" },
2752
- React.createElement("strong", null, t("chooseHost")),
2753
2793
  React.createElement(
2754
2794
  "div",
2755
- { className: "dshRemoteSectionActions" },
2795
+ { className: "dshRemoteSectionTitle" },
2796
+ React.createElement("strong", null, t("chooseHost")),
2756
2797
  status?.hostAuthorizationAvailable ? React.createElement(
2757
2798
  "div",
2758
2799
  { className: "dshRemoteHostControlToggle" },
@@ -2766,18 +2807,22 @@ Minimum version required to store current data is: ` + bestVersion + `.
2766
2807
  onChange: (event) => void setCurrentDeviceControl(event.target.checked)
2767
2808
  })
2768
2809
  ) : null,
2769
- selectedHost === void 0 ? null : React.createElement("button", {
2770
- type: "button",
2771
- onClick: () => {
2772
- setSelectedHost(void 0), setWorkspaces([]), setDirectory(void 0), setPath(""), setAddingWorkspace(!1), setError(void 0);
2773
- }
2774
- }, t("backToHosts")),
2775
2810
  React.createElement("button", {
2776
2811
  type: "button",
2777
2812
  className: "dshRemoteAccountExit",
2778
2813
  disabled: busy,
2779
2814
  onClick: () => void logoutRemote()
2780
2815
  }, t("exitRemoteAccount"))
2816
+ ),
2817
+ selectedHost === void 0 ? null : React.createElement(
2818
+ "div",
2819
+ { className: "dshRemoteSectionActions" },
2820
+ React.createElement("button", {
2821
+ type: "button",
2822
+ onClick: () => {
2823
+ setSelectedHost(void 0), setWorkspaces([]), setDirectory(void 0), setPath(""), setAddingWorkspace(!1), setError(void 0);
2824
+ }
2825
+ }, t("backToHosts"))
2781
2826
  )
2782
2827
  ),
2783
2828
  selectedHost === void 0 ? React.createElement("div", { className: "dshRemoteHostList" }, devices.length === 0 ? React.createElement("p", null, t(busy ? "checkingConnection" : "noRemoteHosts")) : devices.map((device) => React.createElement(
@@ -2911,7 +2956,13 @@ Minimum version required to store current data is: ` + bestVersion + `.
2911
2956
  setBusy(!0), setError(void 0);
2912
2957
  try {
2913
2958
  let action = () => props.control("mode.set", { mode, ...targetDeviceId === void 0 ? {} : { targetDeviceId } });
2914
- 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();
2915
2966
  } catch (reason) {
2916
2967
  setError(messageOf(reason)), setBusy(!1);
2917
2968
  }
@@ -3059,7 +3110,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3059
3110
  } finally {
3060
3111
  setBusy(!1);
3061
3112
  }
3062
- }, 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(
3063
3114
  "div",
3064
3115
  null,
3065
3116
  React.createElement("dt", null, label),
@@ -3218,11 +3269,11 @@ Minimum version required to store current data is: ` + bestVersion + `.
3218
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)}",
3219
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)}",
3220
3271
  ".dshRemotePageBody{padding:24px;overflow:auto;display:flex;flex-direction:column;gap:24px}.dshRemotePageBody button{font:inherit;color:inherit}",
3221
- ".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}",
3222
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)}",
3223
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}",
3224
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)}",
3225
- ".dshRemoteProgress{display:flex;flex-direction:column;gap:8px;margin:12px 0;padding:12px 14px;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;background:var(--dsw-alias-bg-layer-2)}.dshRemoteProgressHeader{display:flex;align-items:center;justify-content:space-between;gap:12px}.dshRemoteProgressHeader strong{font-size:13px;font-weight:600}.dshRemoteProgressHeader span{color:var(--dsw-alias-label-secondary);font-size:12px}.dshRemoteProgressBar{height:6px;overflow:hidden;border-radius:999px;background:var(--dsw-alias-bg-layer-3)}.dshRemoteProgressBar>span{display:block;height:100%;border-radius:inherit;background:var(--dsw-alias-brand-primary);transition:width .22s ease-out}.dshRemoteProgressTransports{display:flex;flex-wrap:wrap;gap:6px}.dshRemoteProgressTransports>span{display:inline-flex;align-items:center;gap:5px;min-height:22px;padding:2px 8px 2px 4px;border-radius:999px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-secondary);font-size:11px;line-height:1}.dshRemoteProgressTransports>span.isActive{color:var(--dsw-alias-label-primary);box-shadow:inset 0 0 0 1px var(--dsw-alias-brand-primary)}.dshRemoteProgressTransports i{display:inline-grid;place-items:center;width:16px;height:16px;border-radius:50%;background:var(--dsw-alias-label-tertiary);color:var(--dsw-alias-bg-layer-1);font-style:normal;font-size:10px}.dshRemoteProgressTransports>span.isActive i{background:var(--dsw-alias-brand-primary)}.dshRemoteProgress p{margin:0;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.45}@media(prefers-reduced-motion:reduce){.dshRemoteProgressBar>span{transition:none}}",
3276
+ ".dshRemoteProgress{display:flex;flex-direction:column;gap:8px;margin:12px 0;padding:12px 14px;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;background:var(--dsw-alias-bg-layer-2)}.dshRemoteProgressHeader{display:flex;align-items:center;justify-content:space-between;gap:12px}.dshRemoteProgressHeader strong{font-size:13px;font-weight:600}.dshRemoteProgressHeader span{color:var(--dsw-alias-label-secondary);font-size:12px}.dshRemoteProgressBar{height:6px;overflow:hidden;border-radius:999px;background:var(--dsw-alias-bg-layer-3)}.dshRemoteProgressBar>span{display:block;height:100%;border-radius:inherit;background:var(--dsw-alias-brand-primary);transition:width .22s ease-out}.dshRemoteProgress p{margin:0;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.45}.dshRemoteProgressRoute{font-weight:500}.dshRemoteProgressRoute .isActive{color:var(--dsw-alias-state-success-primary);font-weight:700}.dshRemoteProgressRouteArrow{color:var(--dsw-alias-label-tertiary)}@media(prefers-reduced-motion:reduce){.dshRemoteProgressBar>span{transition:none}}",
3226
3277
  '.dshRemoteBrowser{display:flex;flex-direction:column}.dshRemoteCrumbs{display:flex;align-items:center;gap:4px;overflow:auto;padding:2px 0 10px}.dshRemoteCrumbs>button{flex:0 0 auto;border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:5px 7px;border-radius:6px;cursor:pointer}.dshRemoteCrumbs>button:not(:last-child)::after{content:" /";color:var(--dsw-alias-label-tertiary)}.dshRemoteCrumbs>button:disabled{color:var(--dsw-alias-label-primary);font-weight:600}',
3227
3278
  ".dshRemoteDirectoryList{min-height:72px;display:flex;flex-direction:column;border-top:1px solid var(--dsw-alias-border-l2)}.dshRemoteDirectoryList>button{min-height:52px;display:grid;grid-template-columns:auto 1fr;column-gap:10px;text-align:left;border:0;border-bottom:1px solid var(--dsw-alias-border-l2);background:transparent;padding:8px 4px;cursor:pointer}.dshRemoteDirectoryList>button:hover,.dshRemoteDirectoryList>button.isSelected{background:var(--dsw-alias-interactive-bg-hover)}.dshRemoteDirectoryList>button.isSelected{color:var(--dsw-alias-label-primary)}.dshRemoteDirectoryList>button>span:first-child{grid-row:1/3}.dshRemoteDirectoryList>button>small{grid-column:2;color:var(--dsw-alias-label-secondary);overflow:hidden;text-overflow:ellipsis}.dshRemoteDirectoryList>p,.dshRemoteHint{margin:12px 0;color:var(--dsw-alias-label-secondary);font-size:13px}",
3228
3279
  ".dshRemoteFolderBrowser{margin-top:14px}.dshRemoteFolderBrowser>p,.dshRemoteFolderList>p{margin:12px 0;color:var(--dsw-alias-label-secondary);font-size:13px}.dshRemoteFolderList{max-height:260px;overflow:auto;border-block:1px solid var(--dsw-alias-border-l2)}.dshRemoteFolderList>button{width:100%;min-height:42px;display:flex;align-items:center;gap:9px;border:0;border-bottom:1px solid var(--dsw-alias-border-l2);background:transparent;padding:7px 6px;text-align:left;cursor:pointer}.dshRemoteFolderList>button:hover{background:var(--dsw-alias-interactive-bg-hover)}.dshRemoteFolderBrowser>small{display:block;margin-top:8px;color:var(--dsw-alias-state-warn-label)}",
@@ -3233,8 +3284,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
3233
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}",
3234
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}",
3235
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}",
3236
- '.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}}',
3237
- ".dshRemoteAccountExit{flex:0 0 auto}.dshRemoteAccountExit:disabled{opacity:.5;cursor:default;text-decoration: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}}',
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}",
3238
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)}",
3239
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}}",
3240
3291
  ".dshRemoteBackdrop{position:fixed;inset:0;z-index:1000;background:var(--dsw-alias-bg-mask-3);display:grid;place-items:center;padding:20px}",
@@ -3330,8 +3381,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
3330
3381
  })
3331
3382
  }, RemoteWorkspaceAction)), ctx.slots.inject("settings.plugin.item", () => ctx.slots.register({
3332
3383
  name: "settings.plugin.item",
3333
- key: "dsh-remote",
3334
- id: "dsh-remote",
3384
+ key: "ds-harness-remote",
3385
+ id: "ds-harness-remote",
3335
3386
  order: 30,
3336
3387
  locale: localeNamespace,
3337
3388
  inject: () => ({ control })