ds-harness-remote 0.4.16 → 0.4.18

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 (74) hide show
  1. package/dist/client-runtime.d.ts.map +1 -1
  2. package/dist/client-runtime.js +3 -3
  3. package/dist/client-runtime.js.map +1 -1
  4. package/dist/client.github.js +77 -36
  5. package/dist/client.js +77 -36
  6. package/dist/client.js.map +1 -1
  7. package/dist/codex/codex-image-codec.d.ts +7 -0
  8. package/dist/codex/codex-image-codec.d.ts.map +1 -0
  9. package/dist/codex/codex-image-codec.js +288 -0
  10. package/dist/codex/codex-image-codec.js.map +1 -0
  11. package/dist/codex/domain.d.ts +2 -0
  12. package/dist/codex/domain.d.ts.map +1 -1
  13. package/dist/codex/domain.js +15 -0
  14. package/dist/codex/domain.js.map +1 -1
  15. package/dist/codex/session-id.d.ts +10 -0
  16. package/dist/codex/session-id.d.ts.map +1 -0
  17. package/dist/codex/session-id.js +15 -0
  18. package/dist/codex/session-id.js.map +1 -0
  19. package/dist/codex/virtual-harness.d.ts +3 -2
  20. package/dist/codex/virtual-harness.d.ts.map +1 -1
  21. package/dist/codex/virtual-harness.js +33 -270
  22. package/dist/codex/virtual-harness.js.map +1 -1
  23. package/dist/codex-workspace-bridge.d.ts +108 -0
  24. package/dist/codex-workspace-bridge.d.ts.map +1 -0
  25. package/dist/codex-workspace-bridge.js +501 -0
  26. package/dist/codex-workspace-bridge.js.map +1 -0
  27. package/dist/config.d.ts +13 -2
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +22 -2
  30. package/dist/config.js.map +1 -1
  31. package/dist/control-runtime.d.ts +17 -3
  32. package/dist/control-runtime.d.ts.map +1 -1
  33. package/dist/control-runtime.js +4 -2
  34. package/dist/control-runtime.js.map +1 -1
  35. package/dist/harness-api-bridge.d.ts.map +1 -1
  36. package/dist/harness-api-bridge.js +2 -53
  37. package/dist/harness-api-bridge.js.map +1 -1
  38. package/dist/harness-api-history.d.ts +3 -0
  39. package/dist/harness-api-history.d.ts.map +1 -0
  40. package/dist/harness-api-history.js +55 -0
  41. package/dist/harness-api-history.js.map +1 -0
  42. package/dist/harness-remote-bridge.d.ts +4 -2
  43. package/dist/harness-remote-bridge.d.ts.map +1 -1
  44. package/dist/harness-remote-bridge.js +61 -3
  45. package/dist/harness-remote-bridge.js.map +1 -1
  46. package/dist/index.d.ts +24 -4
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +1418 -628
  49. package/dist/index.js.map +4 -4
  50. package/dist/remote-api-proxy.d.ts +5 -1
  51. package/dist/remote-api-proxy.d.ts.map +1 -1
  52. package/dist/remote-api-proxy.js +74 -2
  53. package/dist/remote-api-proxy.js.map +1 -1
  54. package/dist/remote-typert-gateway.d.ts +6 -1
  55. package/dist/remote-typert-gateway.d.ts.map +1 -1
  56. package/dist/remote-typert-gateway.js +58 -1
  57. package/dist/remote-typert-gateway.js.map +1 -1
  58. package/dist/service.d.ts +7 -1
  59. package/dist/service.d.ts.map +1 -1
  60. package/dist/service.js +8 -2
  61. package/dist/service.js.map +1 -1
  62. package/dist/terminal-policy.d.ts.map +1 -1
  63. package/dist/terminal-policy.js +8 -2
  64. package/dist/terminal-policy.js.map +1 -1
  65. package/dist/typert-gateway-contract.d.ts +11 -1
  66. package/dist/typert-gateway-contract.d.ts.map +1 -1
  67. package/dist/typert-gateway-switch.d.ts.map +1 -1
  68. package/dist/typert-gateway-switch.js +65 -4
  69. package/dist/typert-gateway-switch.js.map +1 -1
  70. package/dist/version.d.ts +1 -1
  71. package/dist/version.js +1 -1
  72. package/dsh-plugin.json +1 -1
  73. package/package.json +18 -18
  74. package/public.d.ts +2 -2
package/dist/client.js CHANGED
@@ -1873,6 +1873,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
1873
1873
  remoteEntry: "Remote",
1874
1874
  remoteTitle: "Open a remote workspace",
1875
1875
  remoteDescription: "Choose one of your Hosts, then select a working directory. The Harness interface stays on this device.",
1876
+ starProject: "Star us on GitHub \u2014 your support matters to this project",
1876
1877
  chooseHost: "Host",
1877
1878
  chooseDirectory: "Working directory",
1878
1879
  selectHostHint: "Select an online Host to browse its directories.",
@@ -1976,6 +1977,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
1976
1977
  signInClientDescription: "Connect once. Available anytime.",
1977
1978
  startSignIn: "Start sign-in",
1978
1979
  allowControlCurrentDevice: "Allow control of this device",
1980
+ allowControlDevice: "Allow control of device",
1981
+ allowRemoteTerminal: "Allow remote terminal",
1979
1982
  connectedClientCount: "{count} connected",
1980
1983
  checkAcp: "Check ACP",
1981
1984
  checkingAcp: "Checking ACP\u2026",
@@ -2109,6 +2112,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2109
2112
  remoteEntry: "Remote",
2110
2113
  remoteTitle: "\u6253\u5F00\u8FDC\u7AEF\u5DE5\u4F5C\u533A",
2111
2114
  remoteDescription: "\u9009\u62E9\u60F3\u8981\u8FDE\u63A5\u4E3B\u673A\u548C\u5DE5\u4F5C\u76EE\u5F55\u3002",
2115
+ starProject: "\u6B22\u8FCE\u70B9\u4E2A Star\uFF0C\u4F60\u7684\u652F\u6301\u5BF9\u9879\u76EE\u5F88\u91CD\u8981",
2112
2116
  chooseHost: "\u4E3B\u673A",
2113
2117
  chooseDirectory: "\u5DE5\u4F5C\u76EE\u5F55",
2114
2118
  selectHostHint: "\u9009\u62E9\u4E00\u53F0\u5728\u7EBF\u4E3B\u673A\u4EE5\u6D4F\u89C8\u5176\u76EE\u5F55\u3002",
@@ -2212,6 +2216,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
2212
2216
  signInClientDescription: "\u4E00\u6B21\u8FDE\u63A5\uFF0C\u968F\u65F6\u53EF\u7528\u3002",
2213
2217
  startSignIn: "\u5F00\u59CB\u767B\u5F55",
2214
2218
  allowControlCurrentDevice: "\u5141\u8BB8\u63A7\u5236\u5F53\u524D\u8BBE\u5907",
2219
+ allowControlDevice: "\u5141\u8BB8\u63A7\u5236\u8BBE\u5907",
2220
+ allowRemoteTerminal: "\u5141\u8BB8\u8FDC\u7A0B\u7EC8\u7AEF",
2215
2221
  connectedClientCount: "{count} \u53F0\u5DF2\u8FDE\u63A5",
2216
2222
  checkAcp: "\u68C0\u6D4B ACP",
2217
2223
  checkingAcp: "\u6B63\u5728\u68C0\u6D4B ACP\u2026",
@@ -2853,7 +2859,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2853
2859
  );
2854
2860
  }
2855
2861
  function RemoteWorkspaceAction(props) {
2856
- let { t } = props, [open, setOpen] = React.useState(!1), [status, setStatus] = React.useState(void 0), [devices, setDevices] = React.useState([]), [selectedHost, setSelectedHost] = React.useState(void 0), [workspaces, setWorkspaces] = React.useState([]), [codexWorkspaces, setCodexWorkspaces] = React.useState([]), [workspaceBackend, setWorkspaceBackend] = React.useState("harness"), [codexWorkspaceId, setCodexWorkspaceId] = React.useState(void 0), [directory, setDirectory] = React.useState(void 0), [path, setPath] = React.useState(""), [addingWorkspace, setAddingWorkspace] = React.useState(!1), [showAllWorkspaces, setShowAllWorkspaces] = React.useState(!1), [showAllCodexWorkspaces, setShowAllCodexWorkspaces] = React.useState(!1), [devicesOpen, setDevicesOpen] = React.useState(!1), workspaceListId = "dsh-remote-workspace-list", codexWorkspaceHeadingId = "dsh-remote-codex-workspace-heading", codexWorkspaceListId = "dsh-remote-codex-workspace-list", [busy, setBusy] = React.useState(!1), [needsAuthorization, setNeedsAuthorization] = React.useState(!1), [email, setEmail] = React.useState(""), [password, setPassword] = React.useState(""), [loginServerUrl, setLoginServerUrl] = React.useState("https://dsh.r2049.cn"), [loginMethod, setLoginMethod] = React.useState(props.preferredQrProvider), [loginMethodManuallySelected, setLoginMethodManuallySelected] = React.useState(!1), [qrSession, setQrSession] = React.useState(void 0), [qrImage, setQrImage] = React.useState(void 0), [qrExpired, setQrExpired] = React.useState(!1), [progress, setProgress] = React.useState(void 0), progressRun = React.useRef(0), qrFlowRun = React.useRef(0), [notice, setNotice] = React.useState(void 0), [error, setError] = React.useState(void 0);
2862
+ let { t } = props, [open, setOpen] = React.useState(!1), [status, setStatus] = React.useState(void 0), [devices, setDevices] = React.useState([]), [selectedHost, setSelectedHost] = React.useState(void 0), [connectingHost, setConnectingHost] = React.useState(void 0), [workspaces, setWorkspaces] = React.useState([]), [codexWorkspaces, setCodexWorkspaces] = React.useState([]), [workspaceBackend, setWorkspaceBackend] = React.useState("harness"), [codexWorkspaceId, setCodexWorkspaceId] = React.useState(void 0), [directory, setDirectory] = React.useState(void 0), [path, setPath] = React.useState(""), [addingWorkspace, setAddingWorkspace] = React.useState(!1), [showAllWorkspaces, setShowAllWorkspaces] = React.useState(!1), [showAllCodexWorkspaces, setShowAllCodexWorkspaces] = React.useState(!1), [devicesOpen, setDevicesOpen] = React.useState(!1), workspaceListId = "dsh-remote-workspace-list", codexWorkspaceHeadingId = "dsh-remote-codex-workspace-heading", codexWorkspaceListId = "dsh-remote-codex-workspace-list", [busy, setBusy] = React.useState(!1), [terminalEnabled, setTerminalEnabled] = React.useState(!1), [terminalBusy, setTerminalBusy] = React.useState(!1), [needsAuthorization, setNeedsAuthorization] = React.useState(!1), [email, setEmail] = React.useState(""), [password, setPassword] = React.useState(""), [loginServerUrl, setLoginServerUrl] = React.useState("https://dsh.r2049.cn"), [loginMethod, setLoginMethod] = React.useState(props.preferredQrProvider), [loginMethodManuallySelected, setLoginMethodManuallySelected] = React.useState(!1), [qrSession, setQrSession] = React.useState(void 0), [qrImage, setQrImage] = React.useState(void 0), [qrExpired, setQrExpired] = React.useState(!1), [progress, setProgress] = React.useState(void 0), progressRun = React.useRef(0), qrFlowRun = React.useRef(0), [notice, setNotice] = React.useState(void 0), [error, setError] = React.useState(void 0);
2857
2863
  React.useEffect(() => {
2858
2864
  open || setDevicesOpen(!1);
2859
2865
  }, [open]), React.useEffect(() => {
@@ -2881,6 +2887,9 @@ Minimum version required to store current data is: ` + bestVersion + `.
2881
2887
  props.control("status").then(setStatus).catch(() => {
2882
2888
  });
2883
2889
  }, []), React.useEffect(() => {
2890
+ status?.hostAuthorizationAvailable === !0 && props.control("settings.get").then((view) => setTerminalEnabled(view.config.terminal?.enabled === !0)).catch(() => {
2891
+ });
2892
+ }, [status?.hostAuthorizationAvailable]), React.useEffect(() => {
2884
2893
  status?.serverUrl !== void 0 && loginServerUrl === "https://dsh.r2049.cn" && setLoginServerUrl(status.serverUrl);
2885
2894
  }, [status?.serverUrl]), React.useEffect(() => {
2886
2895
  let remoteActive = status?.mode === "remote";
@@ -2951,7 +2960,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2951
2960
  disabled: busy,
2952
2961
  onClick: () => selectLoginMethod(provider)
2953
2962
  }, t(provider === "github" ? "githubLogin" : "zhihuLogin")), selectHost = async (host) => {
2954
- setBusy(!0), setError(void 0), setCodexWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1);
2963
+ setBusy(!0), setError(void 0), setConnectingHost(host), setCodexWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1);
2955
2964
  try {
2956
2965
  let result = await runConnectHostProgress(
2957
2966
  status?.preferredTransports,
@@ -2975,7 +2984,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2975
2984
  } catch (reason) {
2976
2985
  setError(messageOf(reason));
2977
2986
  } finally {
2978
- setBusy(!1);
2987
+ setConnectingHost(void 0), setBusy(!1);
2979
2988
  }
2980
2989
  }, browseDirectory = async (nextPath) => {
2981
2990
  if (selectedHost !== void 0) {
@@ -3059,6 +3068,17 @@ Minimum version required to store current data is: ` + bestVersion + `.
3059
3068
  } finally {
3060
3069
  setBusy(!1);
3061
3070
  }
3071
+ }, setRemoteTerminal = async (enabled) => {
3072
+ let previous = terminalEnabled;
3073
+ setTerminalEnabled(enabled), setTerminalBusy(!0), setError(void 0);
3074
+ try {
3075
+ let view = await props.control("settings.development.set", { terminalEnabled: enabled });
3076
+ setTerminalEnabled(view.config.terminal?.enabled === !0);
3077
+ } catch (reason) {
3078
+ setTerminalEnabled(previous), setError(messageOf(reason));
3079
+ } finally {
3080
+ setTerminalBusy(!1);
3081
+ }
3062
3082
  }, logoutRemote = async () => {
3063
3083
  setBusy(!0), setError(void 0);
3064
3084
  try {
@@ -3139,7 +3159,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3139
3159
  ))
3140
3160
  )
3141
3161
  ) : null
3142
- ) : null;
3162
+ ) : null, listedHosts = connectingHost === void 0 ? devices : [connectingHost];
3143
3163
  return React.createElement(
3144
3164
  React.Fragment,
3145
3165
  null,
@@ -3193,7 +3213,17 @@ Minimum version required to store current data is: ` + bestVersion + `.
3193
3213
  React.createElement(
3194
3214
  "div",
3195
3215
  { className: "dshRemotePageIntro" },
3196
- React.createElement("strong", null, selectedHost?.name ?? t("remoteTitle")),
3216
+ React.createElement(
3217
+ "div",
3218
+ { className: "dshRemotePageTitleRow" },
3219
+ React.createElement("strong", null, selectedHost?.name ?? t("remoteTitle")),
3220
+ selectedHost === void 0 ? React.createElement("a", {
3221
+ className: "dshRemoteStarLink",
3222
+ href: "https://github.com/liguobao/ds-harness-remote",
3223
+ target: "_blank",
3224
+ rel: "noreferrer"
3225
+ }, t("starProject")) : null
3226
+ ),
3197
3227
  React.createElement("p", null, selectedHostDetails ?? t("remoteDescription"))
3198
3228
  ),
3199
3229
  React.createElement(
@@ -3353,16 +3383,33 @@ Minimum version required to store current data is: ` + bestVersion + `.
3353
3383
  React.createElement("strong", null, t("chooseHost")),
3354
3384
  status?.hostAuthorizationAvailable ? React.createElement(
3355
3385
  "div",
3356
- { className: "dshRemoteHostControlToggle" },
3357
- React.createElement("span", null, t("allowControlCurrentDevice")),
3358
- React.createElement("input", {
3359
- type: "checkbox",
3360
- role: "switch",
3361
- disabled: busy,
3362
- "aria-label": t("allowControlCurrentDevice"),
3363
- checked: status.host?.authorized === !0,
3364
- onChange: (event) => void setCurrentDeviceControl(event.target.checked)
3365
- })
3386
+ { className: "dshRemoteHostControlToggles" },
3387
+ React.createElement(
3388
+ "label",
3389
+ { className: "dshRemoteHostControlToggle" },
3390
+ React.createElement("span", null, t("allowControlDevice")),
3391
+ React.createElement("input", {
3392
+ type: "checkbox",
3393
+ role: "switch",
3394
+ disabled: busy,
3395
+ "aria-label": t("allowControlDevice"),
3396
+ checked: status.host?.authorized === !0,
3397
+ onChange: (event) => void setCurrentDeviceControl(event.target.checked)
3398
+ })
3399
+ ),
3400
+ React.createElement(
3401
+ "label",
3402
+ { className: "dshRemoteHostControlToggle" },
3403
+ React.createElement("span", null, t("allowRemoteTerminal")),
3404
+ React.createElement("input", {
3405
+ type: "checkbox",
3406
+ role: "switch",
3407
+ disabled: busy || terminalBusy,
3408
+ "aria-label": t("allowRemoteTerminal"),
3409
+ checked: terminalEnabled,
3410
+ onChange: (event) => void setRemoteTerminal(event.target.checked)
3411
+ })
3412
+ )
3366
3413
  ) : null,
3367
3414
  React.createElement("button", {
3368
3415
  type: "button",
@@ -3373,12 +3420,16 @@ Minimum version required to store current data is: ` + bestVersion + `.
3373
3420
  connectedMenu
3374
3421
  )
3375
3422
  ),
3376
- React.createElement("div", { className: "dshRemoteHostList" }, devices.length === 0 ? React.createElement("p", null, t(busy ? "checkingConnection" : "noRemoteHosts")) : devices.map((device) => React.createElement(
3423
+ React.createElement("div", {
3424
+ className: `dshRemoteHostList${connectingHost === void 0 ? "" : " isCollapsed"}`,
3425
+ "aria-busy": connectingHost === void 0 ? void 0 : !0
3426
+ }, listedHosts.length === 0 ? React.createElement("p", null, t(busy ? "checkingConnection" : "noRemoteHosts")) : listedHosts.map((device) => React.createElement(
3377
3427
  "button",
3378
3428
  {
3379
3429
  type: "button",
3380
3430
  key: device.deviceId,
3381
3431
  disabled: busy || !device.online,
3432
+ "aria-current": connectingHost?.deviceId === device.deviceId ? "true" : void 0,
3382
3433
  onClick: () => void selectHost(device)
3383
3434
  },
3384
3435
  React.createElement(
@@ -3395,7 +3446,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3395
3446
  )))
3396
3447
  ) : null,
3397
3448
  React.createElement(RemoteProgressView, { progress, t }),
3398
- selectedHost === void 0 ? React.createElement("p", { className: "dshRemoteHint" }, t("selectHostHint")) : React.createElement(
3449
+ selectedHost === void 0 ? connectingHost === void 0 ? React.createElement("p", { className: "dshRemoteHint" }, t("selectHostHint")) : null : React.createElement(
3399
3450
  "section",
3400
3451
  { className: "dshRemoteBrowser", "aria-label": t("chooseDirectory") },
3401
3452
  React.createElement(
@@ -3907,7 +3958,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3907
3958
  ".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)}",
3908
3959
  ".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;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:18px;line-height:1.4}.dshRemotePageHeader p{min-width:0;max-width:70ch;margin:3px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.5}.dshRemotePageActions{flex:0 0 auto;display:flex;align-items:center;gap:4px}.dshRemotePageActions>button{height:40px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;border:0;border-radius:8px;background:transparent;color:inherit;line-height:1;cursor:pointer}.dshRemotePageActions>button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.dshRemotePageActions>button:disabled{opacity:.45;cursor:default}.dshRemotePageBack,.dshRemotePageRefresh{min-width:48px;padding:0 10px;font:inherit;font-size:13px}.dshRemotePageBack{color:var(--dsw-alias-label-secondary)!important}.dshRemotePageClose{width:40px;padding:0;font-size:24px}",
3909
3960
  ".dshRemotePageBody{padding:24px;overflow:auto;display:flex;flex-direction:column;gap:24px}.dshRemotePageBody button{font:inherit;color:inherit}",
3910
- ".dshRemotePageTitleRow{display:flex;align-items:center;gap:10px;min-width:0}.dshRemotePageTitleRow>strong{min-width:0}",
3961
+ ".dshRemotePageTitleRow{display:flex;align-items:center;gap:10px;min-width:0}.dshRemotePageTitleRow>strong{min-width:0;flex:0 1 auto}.dshRemoteStarLink{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:400;text-decoration:none}.dshRemoteStarLink:hover{color:var(--dsw-alias-label-primary);text-decoration:underline;text-underline-offset:3px}.dshRemoteStarLink:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:3px;border-radius:3px}",
3911
3962
  ".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}",
3912
3963
  ".dshRemoteSectionTitle{flex:1}.dshRemoteSectionTitle>.dshRemoteConnectedMenu{margin-left:auto}",
3913
3964
  '.dshRemoteAcpSetting{display:block!important;width:100%;padding:0}.dshRemoteAcpSetting>summary{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;cursor:pointer;list-style:none}.dshRemoteAcpSetting>summary::-webkit-details-marker{display:none}.dshRemoteAcpSetting>summary::after{content:"\u2304";color:var(--dsw-alias-label-secondary);transition:transform .18s ease-out}.dshRemoteAcpSetting[open]>summary::after{transform:rotate(180deg)}.dshRemoteAcpSummaryText{min-width:0}.dshRemoteAcpSummaryText strong{display:block}.dshRemoteAcpSummaryText p{margin:4px 0 0;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.4}.dshRemoteAcpCheckLink{grid-column:2;grid-row:1;color:var(--dsw-alias-brand-primary);font-size:12px;text-decoration:underline;text-underline-offset:3px}.dshRemoteAcpCheckLink:hover{color:var(--dsw-alias-label-primary)}.dshRemoteAcpCheckResult{grid-column:3;grid-row:1;font-size:11px;line-height:1.4;white-space:nowrap}.dshRemoteAcpCheckResult.isPassed{color:var(--dsw-alias-state-success-primary)}.dshRemoteAcpCheckResult.isFailed{color:var(--dsw-alias-state-danger-primary)}.dshRemoteAcpList{display:flex;flex-direction:column;gap:0;margin-top:12px;padding-top:0;border-top:0}.dshRemoteAcpList>.dshRemoteAuthorizationSetting{display:grid;width:100%;grid-template-columns:minmax(0,1fr) auto auto auto auto;align-items:center;column-gap:18px;line-height:1.4}.dshRemoteAcpList>.dshRemoteAuthorizationSetting>span:first-child{min-width:0;line-height:1.4}.dshRemoteAcpList>.dshRemoteAuthorizationSetting>input{grid-column:4;grid-row:1}',
@@ -3916,7 +3967,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3916
3967
  ".dshRemoteAcpList>.dshRemoteAuthorizationSetting{grid-template-columns:minmax(0,1fr) 190px 40px 56px;column-gap:18px}.dshRemoteAcpCheckCell{grid-column:2;display:flex;align-items:center;gap:10px;min-width:0}.dshRemoteAcpCheckLink,.dshRemoteAcpRemoveLink{justify-self:start}.dshRemoteAcpCheckResult{position:static}",
3917
3968
  ".dshRemoteAcpCheckLink.isPassed{color:var(--dsw-alias-state-success-primary)}.dshRemoteAcpCheckLink.isFailed{color:var(--dsw-alias-state-danger-primary)}.dshRemoteAcpCheckLink.isChecking{color:var(--dsw-alias-label-secondary)}",
3918
3969
  ".dshRemoteCancelWorkspace{min-height:36px;border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:6px 0;cursor:pointer}.dshRemoteCancelWorkspace:hover:not(:disabled){color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteCancelWorkspace:disabled{opacity:.5;cursor:default}",
3919
- ".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{color:var(--dsw-alias-label-secondary);font-size:12px}",
3970
+ '.dshRemoteHostList{display:flex;flex-direction:column;border-top:1px solid var(--dsw-alias-border-l2);max-height:296px;overflow-y:auto;overscroll-behavior:contain;scrollbar-gutter:stable}.dshRemoteHostList.isCollapsed{max-height:none;overflow-y:visible}.dshRemoteHostList>button{min-height:58px;flex:0 0 auto;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[aria-current="true"]{background:var(--dsw-alias-interactive-bg-hover)}.dshRemoteHostList>button>span{min-width:0;display:flex;flex-direction:column;gap:3px}.dshRemoteHostList>button strong{font-size:14px;font-weight:500}.dshRemoteHostList small{color:var(--dsw-alias-label-secondary);font-size:12px}',
3920
3971
  '.dshRemoteConnectedMenu{position:relative;flex:0 0 auto;margin-right:4px}.dshRemoteConnectedCount{appearance:none;display:inline-flex;align-items:center;justify-content:center;height:22px;border:0;border-radius:999px;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);box-shadow:0 1px 2px rgba(0,0,0,.18),0 0 0 1px rgba(255,255,255,.04) inset;padding:0 10px;font:inherit;font-size:11px;font-weight:500;line-height:17px;white-space:nowrap;cursor:default}.dshRemoteConnectedCount.isOnline{color:var(--dsw-alias-state-success-primary)}.dshRemoteConnectedCount.isInteractive{cursor:pointer}.dshRemoteConnectedCount.isInteractive:hover{filter:brightness(1.08)}.dshRemoteConnectedCount:disabled{opacity:1;cursor:default}.dshRemoteConnectedCount:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.dshRemoteConnectedPanel{position:absolute;top:calc(100% + 8px);right:0;z-index:4;width:min(320px,calc(100vw - 48px));max-height:min(280px,40vh);overflow:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:var(--dsw-alias-bg-layer-2);box-shadow:0 10px 28px rgba(0,0,0,.28);padding:10px 12px}.dshRemoteConnectedPanelTitle{display:block;margin:0 0 6px;color:var(--dsw-alias-label-primary);font-size:12px;font-weight:600}.dshRemoteClientList{display:flex;flex-direction:column}.dshRemoteClientRow{min-height:44px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid var(--dsw-alias-border-l2)}.dshRemoteClientRow:last-child{border-bottom:0}.dshRemoteClientRow>span{min-width:0;display:flex;flex-direction:column;gap:2px}.dshRemoteClientRow strong{font-size:13px;font-weight:500}.dshRemoteClientRow small{color:var(--dsw-alias-label-secondary);font-size:11px}.dshRemoteClientOnline{display:inline-flex;align-items:center;gap:6px;color:var(--dsw-alias-state-success-primary)!important}.dshRemoteClientOnline::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}',
3921
3972
  ".dshRemoteConnectedCount{height:auto;border-radius:0;background:transparent;box-shadow:none;padding:0 4px;text-decoration:underline;text-decoration-color:color-mix(in srgb,currentColor 45%,transparent);text-underline-offset:3px}.dshRemoteConnectedCount.isInteractive:hover{filter:none;text-decoration-color:currentColor}.dshRemoteConnectedCount:focus-visible{outline-offset:3px;border-radius:3px}",
3922
3973
  '.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;width:100%;height:100%;border-radius:inherit;background:var(--dsw-alias-brand-primary);transform-origin:left center;transition:transform .22s ease-out}[dir="rtl"] .dshRemoteProgressBar>span{transform-origin:right center}.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}}',
@@ -3933,7 +3984,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3933
3984
  ".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}",
3934
3985
  ".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}",
3935
3986
  ".dshRemoteLoginHeading{box-sizing:border-box;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{box-sizing:border-box;width:100%}.dshRemoteLoginTabs>button{min-width:0;flex:1;display:flex;align-items:center;justify-content:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.dshRemoteLoginTabs>button.isActive::after{right:0;left:0;border-radius:0}.dshRemoteClientLogin,.dshRemoteQrLogin{box-sizing:border-box;width:100%;height:300px;min-height:300px}.dshRemoteClientLogin{align-items:stretch;padding-top:16px}.dshRemoteClientLogin>button{align-self:stretch;width:100%}.dshRemoteQrLogin{padding-top:12px}",
3936
- '.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}}',
3987
+ '.dshRemoteHostControlToggles{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.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}}',
3937
3988
  ".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}",
3938
3989
  ".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)}",
3939
3990
  "@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{gap:8px;padding:12px 16px}.dshRemotePage.hasSelectedHost .dshRemotePageBack{max-width:112px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dshRemoteSectionHeading{align-items:flex-start;flex-direction:column;gap:8px}.dshRemoteWorkspaceHeading{align-items:center;flex-direction:row}.dshRemoteSectionActions{width:100%;justify-content:space-between}.dshRemotePageBody{padding:20px 16px}.dshRemoteOpenBar{align-items:flex-end}.dshRemoteOpenBar>button{min-height:48px}}",
@@ -4037,22 +4088,12 @@ Minimum version required to store current data is: ` + bestVersion + `.
4037
4088
  statusFeed,
4038
4089
  preferredQrProvider: ctx.locale.getLocale().active === "zh" ? "zhihu" : "github"
4039
4090
  })
4040
- }, RemoteWorkspaceAction));
4041
- let registerSettingsItem = (slotName) => {
4042
- try {
4043
- ctx.slots.inject(slotName, () => ctx.slots.register({
4044
- name: slotName,
4045
- label: () => t("pluginTitle"),
4046
- key: "ds-harness-remote",
4047
- id: "ds-harness-remote",
4048
- order: 30,
4049
- locale: localeNamespace,
4050
- inject: () => ({ control, statusFeed })
4051
- }, RemotePluginOptions));
4052
- } catch {
4053
- }
4054
- };
4055
- registerSettingsItem("plugins.item"), registerSettingsItem("settings.plugin.item"), ctx.slots.inject("plugins.bundle.config", () => ctx.slots.register({
4091
+ }, RemoteWorkspaceAction)), ctx.slots.inject("plugins.row.config", () => ctx.slots.register({
4092
+ name: "plugins.row.config",
4093
+ key: "ds-harness-remote#ds-harness-remote",
4094
+ locale: localeNamespace,
4095
+ inject: () => ({ control, statusFeed })
4096
+ }, RemotePluginOptions)), ctx.slots.inject("plugins.bundle.config", () => ctx.slots.register({
4056
4097
  name: "plugins.bundle.config",
4057
4098
  key: "ds-harness-remote",
4058
4099
  locale: localeNamespace,