ds-harness-remote 0.4.16 → 0.4.17

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 (39) hide show
  1. package/dist/client-runtime.js +1 -1
  2. package/dist/client-runtime.js.map +1 -1
  3. package/dist/client.github.js +57 -18
  4. package/dist/client.js +57 -18
  5. package/dist/client.js.map +1 -1
  6. package/dist/codex/domain.d.ts +2 -0
  7. package/dist/codex/domain.d.ts.map +1 -1
  8. package/dist/codex/domain.js +15 -0
  9. package/dist/codex/domain.js.map +1 -1
  10. package/dist/codex/session-id.d.ts +10 -0
  11. package/dist/codex/session-id.d.ts.map +1 -0
  12. package/dist/codex/session-id.js +15 -0
  13. package/dist/codex/session-id.js.map +1 -0
  14. package/dist/codex/virtual-harness.d.ts +3 -2
  15. package/dist/codex/virtual-harness.d.ts.map +1 -1
  16. package/dist/codex/virtual-harness.js +32 -3
  17. package/dist/codex/virtual-harness.js.map +1 -1
  18. package/dist/codex-workspace-bridge.d.ts +108 -0
  19. package/dist/codex-workspace-bridge.d.ts.map +1 -0
  20. package/dist/codex-workspace-bridge.js +475 -0
  21. package/dist/codex-workspace-bridge.js.map +1 -0
  22. package/dist/harness-remote-bridge.d.ts +4 -2
  23. package/dist/harness-remote-bridge.d.ts.map +1 -1
  24. package/dist/harness-remote-bridge.js +22 -2
  25. package/dist/harness-remote-bridge.js.map +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +616 -78
  28. package/dist/index.js.map +4 -4
  29. package/dist/service.d.ts +7 -1
  30. package/dist/service.d.ts.map +1 -1
  31. package/dist/service.js +8 -2
  32. package/dist/service.js.map +1 -1
  33. package/dist/terminal-policy.d.ts.map +1 -1
  34. package/dist/terminal-policy.js +8 -2
  35. package/dist/terminal-policy.js.map +1 -1
  36. package/dist/version.d.ts +1 -1
  37. package/dist/version.js +1 -1
  38. package/dsh-plugin.json +1 -1
  39. package/package.json +1 -1
package/dist/client.js CHANGED
@@ -1976,6 +1976,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
1976
1976
  signInClientDescription: "Connect once. Available anytime.",
1977
1977
  startSignIn: "Start sign-in",
1978
1978
  allowControlCurrentDevice: "Allow control of this device",
1979
+ allowControlDevice: "Allow control of device",
1980
+ allowRemoteTerminal: "Allow remote terminal",
1979
1981
  connectedClientCount: "{count} connected",
1980
1982
  checkAcp: "Check ACP",
1981
1983
  checkingAcp: "Checking ACP\u2026",
@@ -2212,6 +2214,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
2212
2214
  signInClientDescription: "\u4E00\u6B21\u8FDE\u63A5\uFF0C\u968F\u65F6\u53EF\u7528\u3002",
2213
2215
  startSignIn: "\u5F00\u59CB\u767B\u5F55",
2214
2216
  allowControlCurrentDevice: "\u5141\u8BB8\u63A7\u5236\u5F53\u524D\u8BBE\u5907",
2217
+ allowControlDevice: "\u5141\u8BB8\u63A7\u5236\u8BBE\u5907",
2218
+ allowRemoteTerminal: "\u5141\u8BB8\u8FDC\u7A0B\u7EC8\u7AEF",
2215
2219
  connectedClientCount: "{count} \u53F0\u5DF2\u8FDE\u63A5",
2216
2220
  checkAcp: "\u68C0\u6D4B ACP",
2217
2221
  checkingAcp: "\u6B63\u5728\u68C0\u6D4B ACP\u2026",
@@ -2853,7 +2857,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2853
2857
  );
2854
2858
  }
2855
2859
  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);
2860
+ 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
2861
  React.useEffect(() => {
2858
2862
  open || setDevicesOpen(!1);
2859
2863
  }, [open]), React.useEffect(() => {
@@ -2881,6 +2885,9 @@ Minimum version required to store current data is: ` + bestVersion + `.
2881
2885
  props.control("status").then(setStatus).catch(() => {
2882
2886
  });
2883
2887
  }, []), React.useEffect(() => {
2888
+ status?.hostAuthorizationAvailable === !0 && props.control("settings.get").then((view) => setTerminalEnabled(view.config.terminal?.enabled === !0)).catch(() => {
2889
+ });
2890
+ }, [status?.hostAuthorizationAvailable]), React.useEffect(() => {
2884
2891
  status?.serverUrl !== void 0 && loginServerUrl === "https://dsh.r2049.cn" && setLoginServerUrl(status.serverUrl);
2885
2892
  }, [status?.serverUrl]), React.useEffect(() => {
2886
2893
  let remoteActive = status?.mode === "remote";
@@ -2951,7 +2958,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2951
2958
  disabled: busy,
2952
2959
  onClick: () => selectLoginMethod(provider)
2953
2960
  }, t(provider === "github" ? "githubLogin" : "zhihuLogin")), selectHost = async (host) => {
2954
- setBusy(!0), setError(void 0), setCodexWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1);
2961
+ setBusy(!0), setError(void 0), setConnectingHost(host), setCodexWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1);
2955
2962
  try {
2956
2963
  let result = await runConnectHostProgress(
2957
2964
  status?.preferredTransports,
@@ -2975,7 +2982,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2975
2982
  } catch (reason) {
2976
2983
  setError(messageOf(reason));
2977
2984
  } finally {
2978
- setBusy(!1);
2985
+ setConnectingHost(void 0), setBusy(!1);
2979
2986
  }
2980
2987
  }, browseDirectory = async (nextPath) => {
2981
2988
  if (selectedHost !== void 0) {
@@ -3059,6 +3066,17 @@ Minimum version required to store current data is: ` + bestVersion + `.
3059
3066
  } finally {
3060
3067
  setBusy(!1);
3061
3068
  }
3069
+ }, setRemoteTerminal = async (enabled) => {
3070
+ let previous = terminalEnabled;
3071
+ setTerminalEnabled(enabled), setTerminalBusy(!0), setError(void 0);
3072
+ try {
3073
+ let view = await props.control("settings.development.set", { terminalEnabled: enabled });
3074
+ setTerminalEnabled(view.config.terminal?.enabled === !0);
3075
+ } catch (reason) {
3076
+ setTerminalEnabled(previous), setError(messageOf(reason));
3077
+ } finally {
3078
+ setTerminalBusy(!1);
3079
+ }
3062
3080
  }, logoutRemote = async () => {
3063
3081
  setBusy(!0), setError(void 0);
3064
3082
  try {
@@ -3139,7 +3157,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3139
3157
  ))
3140
3158
  )
3141
3159
  ) : null
3142
- ) : null;
3160
+ ) : null, listedHosts = connectingHost === void 0 ? devices : [connectingHost];
3143
3161
  return React.createElement(
3144
3162
  React.Fragment,
3145
3163
  null,
@@ -3353,16 +3371,33 @@ Minimum version required to store current data is: ` + bestVersion + `.
3353
3371
  React.createElement("strong", null, t("chooseHost")),
3354
3372
  status?.hostAuthorizationAvailable ? React.createElement(
3355
3373
  "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
- })
3374
+ { className: "dshRemoteHostControlToggles" },
3375
+ React.createElement(
3376
+ "label",
3377
+ { className: "dshRemoteHostControlToggle" },
3378
+ React.createElement("span", null, t("allowControlDevice")),
3379
+ React.createElement("input", {
3380
+ type: "checkbox",
3381
+ role: "switch",
3382
+ disabled: busy,
3383
+ "aria-label": t("allowControlDevice"),
3384
+ checked: status.host?.authorized === !0,
3385
+ onChange: (event) => void setCurrentDeviceControl(event.target.checked)
3386
+ })
3387
+ ),
3388
+ React.createElement(
3389
+ "label",
3390
+ { className: "dshRemoteHostControlToggle" },
3391
+ React.createElement("span", null, t("allowRemoteTerminal")),
3392
+ React.createElement("input", {
3393
+ type: "checkbox",
3394
+ role: "switch",
3395
+ disabled: busy || terminalBusy,
3396
+ "aria-label": t("allowRemoteTerminal"),
3397
+ checked: terminalEnabled,
3398
+ onChange: (event) => void setRemoteTerminal(event.target.checked)
3399
+ })
3400
+ )
3366
3401
  ) : null,
3367
3402
  React.createElement("button", {
3368
3403
  type: "button",
@@ -3373,12 +3408,16 @@ Minimum version required to store current data is: ` + bestVersion + `.
3373
3408
  connectedMenu
3374
3409
  )
3375
3410
  ),
3376
- React.createElement("div", { className: "dshRemoteHostList" }, devices.length === 0 ? React.createElement("p", null, t(busy ? "checkingConnection" : "noRemoteHosts")) : devices.map((device) => React.createElement(
3411
+ React.createElement("div", {
3412
+ className: `dshRemoteHostList${connectingHost === void 0 ? "" : " isCollapsed"}`,
3413
+ "aria-busy": connectingHost === void 0 ? void 0 : !0
3414
+ }, listedHosts.length === 0 ? React.createElement("p", null, t(busy ? "checkingConnection" : "noRemoteHosts")) : listedHosts.map((device) => React.createElement(
3377
3415
  "button",
3378
3416
  {
3379
3417
  type: "button",
3380
3418
  key: device.deviceId,
3381
3419
  disabled: busy || !device.online,
3420
+ "aria-current": connectingHost?.deviceId === device.deviceId ? "true" : void 0,
3382
3421
  onClick: () => void selectHost(device)
3383
3422
  },
3384
3423
  React.createElement(
@@ -3395,7 +3434,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3395
3434
  )))
3396
3435
  ) : null,
3397
3436
  React.createElement(RemoteProgressView, { progress, t }),
3398
- selectedHost === void 0 ? React.createElement("p", { className: "dshRemoteHint" }, t("selectHostHint")) : React.createElement(
3437
+ selectedHost === void 0 ? connectingHost === void 0 ? React.createElement("p", { className: "dshRemoteHint" }, t("selectHostHint")) : null : React.createElement(
3399
3438
  "section",
3400
3439
  { className: "dshRemoteBrowser", "aria-label": t("chooseDirectory") },
3401
3440
  React.createElement(
@@ -3916,7 +3955,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3916
3955
  ".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
3956
  ".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
3957
  ".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}",
3958
+ '.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
3959
  '.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
3960
  ".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
3961
  '.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 +3972,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3933
3972
  ".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
3973
  ".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
3974
  ".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}}',
3975
+ '.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
3976
  ".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
3977
  ".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
3978
  "@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}}",