dsh-zen-remote 2.3.11 → 2.4.1

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 (249) hide show
  1. package/CHANGELOG.md +45 -78
  2. package/README.md +94 -84
  3. package/README.zh-CN.md +90 -81
  4. package/bin/zen-remote.mjs +5 -0
  5. package/docs/interface.md +6 -6
  6. package/docs/remote-access.en.md +6 -4
  7. package/docs/remote-access.md +6 -4
  8. package/dsh-push.mjs +96 -10
  9. package/lib/adapters/dsh-better-sidebar/index.js +7 -3
  10. package/lib/adapters/dsh-better-sidebar/index.js.map +1 -1
  11. package/lib/admin-routes.js +10 -2
  12. package/lib/admin-routes.js.map +1 -1
  13. package/lib/cli/args.js +251 -0
  14. package/lib/cli/args.js.map +1 -0
  15. package/lib/cli/bootstrap.js +449 -0
  16. package/lib/cli/bootstrap.js.map +1 -0
  17. package/lib/cli/command-setup.js +484 -0
  18. package/lib/cli/command-setup.js.map +1 -0
  19. package/lib/cli/commands-client.js +359 -0
  20. package/lib/cli/commands-client.js.map +1 -0
  21. package/lib/cli/commands-host.js +1108 -0
  22. package/lib/cli/commands-host.js.map +1 -0
  23. package/lib/cli/commands-status.js +279 -0
  24. package/lib/cli/commands-status.js.map +1 -0
  25. package/lib/cli/config-writer.js +334 -0
  26. package/lib/cli/config-writer.js.map +1 -0
  27. package/lib/cli/context.js +10 -0
  28. package/lib/cli/context.js.map +1 -0
  29. package/lib/cli/i18n.js +620 -0
  30. package/lib/cli/i18n.js.map +1 -0
  31. package/lib/cli/ipc-client.js +160 -0
  32. package/lib/cli/ipc-client.js.map +1 -0
  33. package/lib/cli/ipc-server.js +464 -0
  34. package/lib/cli/ipc-server.js.map +1 -0
  35. package/lib/cli/main.js +245 -0
  36. package/lib/cli/main.js.map +1 -0
  37. package/lib/cli/qr-terminal.js +48 -0
  38. package/lib/cli/qr-terminal.js.map +1 -0
  39. package/lib/client-data/qr.js +286 -0
  40. package/lib/client-data/qr.js.map +1 -0
  41. package/lib/client-routes.js +308 -25
  42. package/lib/client-routes.js.map +1 -1
  43. package/lib/client.js +1013 -229
  44. package/lib/config.js +50 -12
  45. package/lib/config.js.map +1 -1
  46. package/lib/debug-report.js +28 -1
  47. package/lib/debug-report.js.map +1 -1
  48. package/lib/fetch-route-intercept.js +334 -26
  49. package/lib/fetch-route-intercept.js.map +1 -1
  50. package/lib/index.js +608 -375
  51. package/lib/index.js.map +1 -1
  52. package/lib/intercept.js +1833 -280
  53. package/lib/intercept.js.map +1 -1
  54. package/lib/lan-gate-server.cjs +36 -10
  55. package/lib/merge-streams.js +103 -11
  56. package/lib/merge-streams.js.map +1 -1
  57. package/lib/plugin-route-intercept.js +93 -63
  58. package/lib/plugin-route-intercept.js.map +1 -1
  59. package/lib/relay-access.js +8 -1
  60. package/lib/relay-access.js.map +1 -1
  61. package/lib/relay-client.js +133 -4
  62. package/lib/relay-client.js.map +1 -1
  63. package/lib/relay-pool.js +275 -0
  64. package/lib/relay-pool.js.map +1 -0
  65. package/lib/relay-server.js +269 -17
  66. package/lib/relay-server.js.map +1 -1
  67. package/lib/restart-fields.js +6 -4
  68. package/lib/restart-fields.js.map +1 -1
  69. package/lib/share-ops.js +68 -0
  70. package/lib/share-ops.js.map +1 -1
  71. package/lib/share-store.js +65 -27
  72. package/lib/share-store.js.map +1 -1
  73. package/lib/state-store.js +400 -0
  74. package/lib/state-store.js.map +1 -0
  75. package/lib/types/adapters/dsh-better-sidebar/index.d.ts +3 -2
  76. package/lib/types/adapters/dsh-better-sidebar/index.d.ts.map +1 -1
  77. package/lib/types/admin-routes.d.ts.map +1 -1
  78. package/lib/types/cli/args.d.ts +78 -0
  79. package/lib/types/cli/args.d.ts.map +1 -0
  80. package/lib/types/cli/bootstrap.d.ts +170 -0
  81. package/lib/types/cli/bootstrap.d.ts.map +1 -0
  82. package/lib/types/cli/command-setup.d.ts +72 -0
  83. package/lib/types/cli/command-setup.d.ts.map +1 -0
  84. package/lib/types/cli/commands-client.d.ts +36 -0
  85. package/lib/types/cli/commands-client.d.ts.map +1 -0
  86. package/lib/types/cli/commands-host.d.ts +82 -0
  87. package/lib/types/cli/commands-host.d.ts.map +1 -0
  88. package/lib/types/cli/commands-status.d.ts +46 -0
  89. package/lib/types/cli/commands-status.d.ts.map +1 -0
  90. package/lib/types/cli/config-writer.d.ts +92 -0
  91. package/lib/types/cli/config-writer.d.ts.map +1 -0
  92. package/lib/types/cli/context.d.ts +39 -0
  93. package/lib/types/cli/context.d.ts.map +1 -0
  94. package/lib/types/cli/i18n.d.ts +32 -0
  95. package/lib/types/cli/i18n.d.ts.map +1 -0
  96. package/lib/types/cli/ipc-client.d.ts +83 -0
  97. package/lib/types/cli/ipc-client.d.ts.map +1 -0
  98. package/lib/types/cli/ipc-server.d.ts +113 -0
  99. package/lib/types/cli/ipc-server.d.ts.map +1 -0
  100. package/lib/types/cli/main.d.ts +57 -0
  101. package/lib/types/cli/main.d.ts.map +1 -0
  102. package/lib/types/cli/qr-terminal.d.ts +17 -0
  103. package/lib/types/cli/qr-terminal.d.ts.map +1 -0
  104. package/lib/types/client/RemoteStatusIcon.d.ts.map +1 -1
  105. package/lib/types/client/current-session-report.d.ts +4 -0
  106. package/lib/types/client/current-session-report.d.ts.map +1 -1
  107. package/lib/types/client/effects/model-group-side.d.ts.map +1 -1
  108. package/lib/types/client/effects/remote-session.d.ts.map +1 -1
  109. package/lib/types/client/locales.d.ts +47 -3
  110. package/lib/types/client/locales.d.ts.map +1 -1
  111. package/lib/types/client/settings/SettingsSection.d.ts.map +1 -1
  112. package/lib/types/client/settings/settings-css.d.ts +1 -1
  113. package/lib/types/client/settings/settings-css.d.ts.map +1 -1
  114. package/lib/types/client/styles/remote-session.css.d.ts +1 -1
  115. package/lib/types/client/styles/remote-session.css.d.ts.map +1 -1
  116. package/lib/types/client/wizard/GatewayWizard.d.ts.map +1 -1
  117. package/lib/types/client/wizard/cards/ProxyCard.d.ts.map +1 -1
  118. package/lib/types/client/wizard/wizard-css.d.ts +1 -1
  119. package/lib/types/client/wizard/wizard-css.d.ts.map +1 -1
  120. package/lib/types/client-data/model-group-side.d.ts +23 -2
  121. package/lib/types/client-data/model-group-side.d.ts.map +1 -1
  122. package/lib/types/client-data/remote-status.d.ts +47 -1
  123. package/lib/types/client-data/remote-status.d.ts.map +1 -1
  124. package/lib/types/client-data/settings-form.d.ts +85 -1
  125. package/lib/types/client-data/settings-form.d.ts.map +1 -1
  126. package/lib/types/client-data/wizard.d.ts +56 -1
  127. package/lib/types/client-data/wizard.d.ts.map +1 -1
  128. package/lib/types/client-routes.d.ts +25 -1
  129. package/lib/types/client-routes.d.ts.map +1 -1
  130. package/lib/types/config.d.ts +40 -14
  131. package/lib/types/config.d.ts.map +1 -1
  132. package/lib/types/debug-report.d.ts.map +1 -1
  133. package/lib/types/fetch-route-intercept.d.ts +66 -8
  134. package/lib/types/fetch-route-intercept.d.ts.map +1 -1
  135. package/lib/types/index.d.ts +9 -2
  136. package/lib/types/index.d.ts.map +1 -1
  137. package/lib/types/intercept.d.ts +72 -10
  138. package/lib/types/intercept.d.ts.map +1 -1
  139. package/lib/types/merge-streams.d.ts +79 -1
  140. package/lib/types/merge-streams.d.ts.map +1 -1
  141. package/lib/types/plugin-route-intercept.d.ts +25 -9
  142. package/lib/types/plugin-route-intercept.d.ts.map +1 -1
  143. package/lib/types/relay-access.d.ts +3 -1
  144. package/lib/types/relay-access.d.ts.map +1 -1
  145. package/lib/types/relay-client.d.ts +23 -2
  146. package/lib/types/relay-client.d.ts.map +1 -1
  147. package/lib/types/relay-pool.d.ts +148 -0
  148. package/lib/types/relay-pool.d.ts.map +1 -0
  149. package/lib/types/relay-server.d.ts +30 -3
  150. package/lib/types/relay-server.d.ts.map +1 -1
  151. package/lib/types/restart-fields.d.ts +5 -5
  152. package/lib/types/restart-fields.d.ts.map +1 -1
  153. package/lib/types/share-ops.d.ts +47 -1
  154. package/lib/types/share-ops.d.ts.map +1 -1
  155. package/lib/types/share-store.d.ts.map +1 -1
  156. package/lib/types/state-store.d.ts +179 -0
  157. package/lib/types/state-store.d.ts.map +1 -0
  158. package/lib/types/upload-limits.d.ts +15 -0
  159. package/lib/types/upload-limits.d.ts.map +1 -1
  160. package/lib/types/virtual-id.d.ts +21 -0
  161. package/lib/types/virtual-id.d.ts.map +1 -1
  162. package/lib/types/wizard/probe.d.ts.map +1 -1
  163. package/lib/types/wizard/proxy-snippets.d.ts +3 -0
  164. package/lib/types/wizard/proxy-snippets.d.ts.map +1 -1
  165. package/lib/types/wizard/routes.d.ts +1 -0
  166. package/lib/types/wizard/routes.d.ts.map +1 -1
  167. package/lib/types/wizard/status.d.ts +9 -0
  168. package/lib/types/wizard/status.d.ts.map +1 -1
  169. package/lib/types/wizard/verify.d.ts +3 -0
  170. package/lib/types/wizard/verify.d.ts.map +1 -1
  171. package/lib/upload-limits.js +15 -0
  172. package/lib/upload-limits.js.map +1 -1
  173. package/lib/virtual-id.js +60 -0
  174. package/lib/virtual-id.js.map +1 -1
  175. package/lib/wizard/probe.js +46 -1
  176. package/lib/wizard/probe.js.map +1 -1
  177. package/lib/wizard/proxy-snippets.js +14 -1
  178. package/lib/wizard/proxy-snippets.js.map +1 -1
  179. package/lib/wizard/routes.js +23 -4
  180. package/lib/wizard/routes.js.map +1 -1
  181. package/lib/wizard/status.js +21 -0
  182. package/lib/wizard/status.js.map +1 -1
  183. package/lib/wizard/verify.js +31 -8
  184. package/lib/wizard/verify.js.map +1 -1
  185. package/package.json +8 -4
  186. package/pwa/icons/badge-96.png +0 -0
  187. package/pwa/icons/badge.svg +1 -0
  188. package/pwa/manifest.json +2 -1
  189. package/pwa/sw.js +3 -1
  190. package/scripts/check-debug-report.mjs +41 -1
  191. package/scripts/check-settings-form.mjs +14 -3
  192. package/scripts/check-settings-view.mjs +247 -0
  193. package/scripts/check-wizard-ui.mjs +37 -0
  194. package/src/adapters/dsh-better-sidebar/index.ts +7 -3
  195. package/src/admin-routes.ts +10 -2
  196. package/src/cli/args.ts +289 -0
  197. package/src/cli/bootstrap.ts +569 -0
  198. package/src/cli/command-setup.ts +540 -0
  199. package/src/cli/commands-client.ts +369 -0
  200. package/src/cli/commands-host.ts +1127 -0
  201. package/src/cli/commands-status.ts +296 -0
  202. package/src/cli/config-writer.ts +354 -0
  203. package/src/cli/context.ts +38 -0
  204. package/src/cli/i18n.ts +645 -0
  205. package/src/cli/ipc-client.ts +216 -0
  206. package/src/cli/ipc-server.ts +531 -0
  207. package/src/cli/main.ts +285 -0
  208. package/src/cli/qr-terminal.ts +49 -0
  209. package/src/client/RemoteStatusIcon.tsx +4 -1
  210. package/src/client/current-session-report.ts +28 -4
  211. package/src/client/effects/model-group-side.ts +19 -5
  212. package/src/client/effects/remote-session.ts +26 -6
  213. package/src/client/locales.ts +96 -6
  214. package/src/client/settings/SettingsSection.tsx +287 -92
  215. package/src/client/settings/settings-css.ts +18 -0
  216. package/src/client/styles/remote-session.css.ts +15 -1
  217. package/src/client/wizard/GatewayWizard.tsx +470 -109
  218. package/src/client/wizard/cards/ProxyCard.tsx +2 -1
  219. package/src/client/wizard/wizard-css.ts +23 -0
  220. package/src/client-data/model-group-side.ts +37 -10
  221. package/src/client-data/remote-status.ts +112 -17
  222. package/src/client-data/settings-form.ts +164 -8
  223. package/src/client-data/wizard.ts +112 -2
  224. package/src/client-routes.ts +334 -26
  225. package/src/config.ts +62 -16
  226. package/src/debug-report.ts +27 -1
  227. package/src/fetch-route-intercept.ts +381 -32
  228. package/src/index.ts +608 -380
  229. package/src/intercept.ts +1866 -286
  230. package/src/merge-streams.ts +155 -10
  231. package/src/plugin-route-intercept.ts +120 -71
  232. package/src/relay-access.ts +14 -3
  233. package/src/relay-client.ts +163 -5
  234. package/src/relay-pool.ts +387 -0
  235. package/src/relay-server.ts +312 -16
  236. package/src/restart-fields.ts +6 -4
  237. package/src/share-ops.ts +82 -1
  238. package/src/share-store.ts +59 -26
  239. package/src/state-store.ts +428 -0
  240. package/src/upload-limits.ts +16 -0
  241. package/src/virtual-id.ts +57 -0
  242. package/src/wizard/probe.ts +54 -2
  243. package/src/wizard/proxy-snippets.ts +17 -2
  244. package/src/wizard/routes.ts +24 -5
  245. package/src/wizard/status.ts +28 -0
  246. package/src/wizard/verify.ts +33 -11
  247. package/AGENTS.md +0 -185
  248. package/docs/adr/0001-plugin-bridge-forwards-plugin-routes.md +0 -15
  249. package/docs/adr/0002-relay-emulates-websocket.md +0 -8
@@ -1 +1 @@
1
- {"version":3,"file":"ProxyCard.d.ts","sourceRoot":"","sources":["../../../../../src/client/wizard/cards/ProxyCard.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAG9C,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,OAAO,CAAA;IACV,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,cAAc,GAAG,SAAS,CAgClG"}
1
+ {"version":3,"file":"ProxyCard.d.ts","sourceRoot":"","sources":["../../../../../src/client/wizard/cards/ProxyCard.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAG9C,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,OAAO,CAAA;IACV,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,cAAc,GAAG,SAAS,CAiClG"}
@@ -6,5 +6,5 @@
6
6
  * the component mounts. Same transcription discipline as settings-css.ts
7
7
  * (host design tokens only, no literal colors).
8
8
  */
9
- export declare const WIZARD_CSS = "\n[data-plugin-detail=\"dsh-zen-remote\"] section[data-plugin-config]:empty {\n display: none;\n}\n\n[data-zen-remote=\"wizard\"] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n margin-inline: auto;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n padding: 18px 20px;\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-headerText {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-subtitle {\n font-size: 12.5px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-statusBadge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n padding: 4px 10px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n white-space: nowrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-statusBadge[data-state=\"pass\"] {\n color: var(--dsw-alias-label-primary);\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-notice {\n font-size: 12.5px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n padding: 9px 12px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-notice[data-tone=\"error\"] {\n border-color: var(--dsw-alias-state-error-primary, #d5304f);\n color: var(--dsw-alias-state-error-primary, #d5304f);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-notice[data-tone=\"ok\"] {\n border-color: var(--dsw-alias-state-success-primary, #16a34a);\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n/* Inline Status Overview Card (2x2 spacious layout, full text visibility) */\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewGrid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n@media (max-width: 560px) {\n [data-zen-remote=\"wizard\"] .zr-wizard-overviewGrid {\n grid-template-columns: 1fr;\n }\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewItem {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 13px 15px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewLabel {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewValue {\n display: flex;\n align-items: center;\n gap: 7px;\n font-size: 13.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n line-height: 1.45;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewSub {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-emptyBanner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n padding: 14px 16px;\n border-radius: 10px;\n border: 1px dashed var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-emptyText {\n font-size: 12.5px;\n color: var(--dsw-alias-label-secondary);\n line-height: 1.5;\n margin: 0;\n flex: 1;\n min-width: 220px;\n}\n\n/* Wizard Modal Dialog (above app chrome, below helper sub-cards) */\n[data-zen-remote=\"wizard-modal\"] {\n position: fixed;\n inset: 0;\n z-index: 950;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(2px);\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalDialog {\n width: min(680px, calc(100vw - 32px));\n max-height: min(88vh, 760px);\n display: flex;\n flex-direction: column;\n border-radius: 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n box-shadow: 0 20px 48px rgba(0, 0, 0, 0.28);\n overflow: hidden;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 16px 22px 14px;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalTitle {\n font-size: 15.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalBody {\n padding: 18px 22px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalFooter {\n padding: 14px 22px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* Non-clickable 3-step visual progress indicator */\n[data-zen-remote=\"wizard\"] .zr-wizard-stepper {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 13px 22px;\n margin: 0;\n list-style: none;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n border-top: 1px solid var(--dsw-alias-border-l2);\n border-bottom: 1px solid var(--dsw-alias-border-l2);\n user-select: none;\n pointer-events: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepCircle {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n border: 1.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-tertiary);\n flex: none;\n transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease, box-shadow 160ms ease;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"current\"] .zr-wizard-stepCircle {\n background: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-2, #fff);\n box-shadow: 0 0 0 3px var(--dsw-alias-border-l2);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"done\"] .zr-wizard-stepCircle {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n border-color: var(--dsw-alias-state-success-primary, #16a34a);\n color: #fff;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepText {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepTag {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary);\n line-height: 1.2;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"current\"] .zr-wizard-stepTag {\n color: var(--dsw-alias-label-secondary);\n font-weight: 500;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"done\"] .zr-wizard-stepTag {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepName {\n font-size: 13px;\n font-weight: 500;\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"current\"] .zr-wizard-stepName {\n color: var(--dsw-alias-label-primary);\n font-weight: 600;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"done\"] .zr-wizard-stepName {\n color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepConnector {\n flex: 1;\n height: 2px;\n min-width: 18px;\n border-radius: 2px;\n background: var(--dsw-alias-border-l2);\n transition: background-color 200ms ease;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepConnector[data-done=\"true\"] {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepIntro {\n font-size: 12.5px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-body {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* Step 1: 3-column path cards */\n[data-zen-remote=\"wizard\"] .zr-wizard-paths {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n margin: 0;\n padding: 0;\n border: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path {\n display: flex;\n flex-direction: column;\n gap: 6px;\n text-align: left;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 10px;\n padding: 12px 14px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n cursor: pointer;\n font: inherit;\n color: inherit;\n transition: border-color 120ms ease, box-shadow 120ms ease;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path:hover:not(:disabled) {\n border-color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path[data-selected=\"true\"] {\n border-color: var(--dsw-alias-label-primary);\n box-shadow: 0 0 0 1px var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathHead {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathRadio {\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: 1.5px solid var(--dsw-alias-label-tertiary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathRadio[data-selected=\"true\"] {\n border-color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-label-primary);\n box-shadow: inset 0 0 0 2.5px var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathName {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathDesc {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-sectionTitle {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-roleGrid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: 10px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-checkRow {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12.5px;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n user-select: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-checkRow input[type=\"checkbox\"] {\n margin: 0;\n cursor: pointer;\n}\n\n/* Step 2: form controls */\n[data-zen-remote=\"wizard\"] .zr-wizard-selectedBar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-selectedLabel {\n font-size: 12.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-formStack {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-formGrid {\n display: grid;\n grid-template-columns: 1fr 120px;\n gap: 12px;\n align-items: start;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-labelRow {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-label {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-savedTag {\n font-size: 11px;\n padding: 1px 7px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-hint {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n line-height: 1.4;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-input {\n height: 34px;\n font: inherit;\n font-size: 13px;\n padding: 0 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n width: 100%;\n box-sizing: border-box;\n}\n[data-zen-remote=\"wizard\"] code.zr-wizard-input {\n display: flex;\n align-items: center;\n min-height: 36px;\n height: auto;\n padding: 6px 12px;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n line-height: 1.4;\n overflow-wrap: anywhere;\n word-break: break-all;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-input:focus {\n outline: none;\n border-color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-link {\n background: none;\n border: none;\n padding: 0;\n font: inherit;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n text-decoration: underline;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-link:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-linkBtn {\n font: inherit;\n font-size: 12px;\n padding: 4px 10px;\n border-radius: 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-linkBtn:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-secondary);\n}\n\n/* Primary & Secondary action buttons + Footer */\n[data-zen-remote=\"wizard\"] .zr-wizard-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding-top: 8px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-footerHint {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btn,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btn {\n font: inherit;\n font-size: 12.5px;\n font-weight: 500;\n height: 32px;\n padding: 0 14px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btn:hover:not(:disabled),\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btn:hover:not(:disabled) {\n border-color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btnPrimary,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btnPrimary {\n background: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-2, #fff);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btnPrimary:hover:not(:disabled),\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btnPrimary:hover:not(:disabled) {\n opacity: 0.9;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btn:disabled,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Step 3: service control bar, 3-column lights, and QR pairing panel */\n[data-zen-remote=\"wizard\"] .zr-wizard-serviceBar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-serviceInfo {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lights {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 8px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-light {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 9px 12px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n font-size: 12.5px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightMain {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightName {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightState {\n font-size: 11.5px;\n color: var(--dsw-alias-label-tertiary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightState[data-state=\"pass\"] {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightState[data-state=\"fail\"] {\n color: var(--dsw-alias-state-error-primary, #d5304f);\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dsw-alias-label-tertiary);\n flex: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-dot[data-state=\"pass\"] {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-dot[data-state=\"fail\"] {\n background: var(--dsw-alias-state-error-primary, #d5304f);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-dot[data-state=\"pending\"] {\n background: var(--dsw-alias-state-warning-primary, #b8860b);\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-pairPanel {\n display: flex;\n align-items: center;\n gap: 18px;\n flex-wrap: wrap;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pairMeta {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n min-width: 180px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 24px;\n letter-spacing: 4px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 2px 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-countdown {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-qr {\n width: 156px;\n height: 156px;\n image-rendering: pixelated;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: #fff;\n display: block;\n flex: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-qr[data-usable=\"false\"] {\n display: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-targetTabs {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 6px;\n padding: 4px;\n border-radius: 9px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-targetTab {\n font: inherit;\n font-size: 12.5px;\n font-weight: 500;\n padding: 7px 12px;\n border-radius: 6px;\n border: 1px solid transparent;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n text-align: center;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-targetTab[data-selected=\"true\"] {\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n border-color: var(--dsw-alias-border-l2);\n color: var(--dsw-alias-label-primary);\n font-weight: 600;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-desktopBox,\n[data-zen-remote=\"wizard\"] .zr-wizard-clientBox {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceList {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceItem {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px 14px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n font-size: 12.5px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceTitleRow {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceBadge {\n font-size: 11px;\n font-weight: 500;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceActions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-select {\n height: 30px;\n font: inherit;\n font-size: 12px;\n padding: 0 8px;\n border-radius: 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n}\n\n/* The modal card: a body-level overlay, above the app chrome. */\n[data-zen-remote=\"wizard-card\"] {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.45);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardPanel {\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n width: min(560px, calc(100vw - 32px));\n max-height: min(82vh, 660px);\n overflow: auto;\n padding: 18px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTitle {\n font-size: 15px;\n font-weight: 600;\n margin: 0;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-cardCloseIcon,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardCloseIcon {\n border: none;\n background: none;\n color: var(--dsw-alias-label-secondary);\n font-size: 18px;\n line-height: 1;\n padding: 2px 6px;\n border-radius: 6px;\n cursor: pointer;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-cardCloseIcon:hover,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardCloseIcon:hover {\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardBody {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardSteps {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardSubhead {\n font-size: 12.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 4px 0 0;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTable {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n overflow: hidden;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTable td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--dsw-alias-border-l2);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTable tr:last-child td {\n border-bottom: none;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardPerm {\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardWhy {\n color: var(--dsw-alias-label-tertiary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTabs {\n display: flex;\n gap: 6px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTab {\n font: inherit;\n font-size: 12px;\n font-weight: 500;\n padding: 4px 12px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTab[data-selected=\"true\"] {\n color: var(--dsw-alias-bg-layer-2, #fff);\n background: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardStep {\n font-size: 12.5px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardCode {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n white-space: pre;\n background: var(--dsw-alias-bg-layer-3, rgba(127, 127, 127, 0.12));\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n padding: 10px 12px;\n overflow: auto;\n max-height: 260px;\n margin: 0;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-label {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-input {\n height: 34px;\n font: inherit;\n font-size: 13px;\n padding: 0 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n width: 100%;\n box-sizing: border-box;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardActions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n}\n";
9
+ export declare const WIZARD_CSS = "\n[data-plugin-detail=\"dsh-zen-remote\"] section[data-plugin-config]:empty {\n display: none;\n}\n\n[data-zen-remote=\"wizard\"] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n margin-inline: auto;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n padding: 18px 20px;\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-headerText {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-subtitle {\n font-size: 12.5px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-statusBadge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n padding: 4px 10px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n white-space: nowrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-statusBadge[data-state=\"pass\"] {\n color: var(--dsw-alias-label-primary);\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-notice {\n font-size: 12.5px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n padding: 9px 12px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-notice[data-tone=\"error\"] {\n border-color: var(--dsw-alias-state-error-primary, #d5304f);\n color: var(--dsw-alias-state-error-primary, #d5304f);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-notice[data-tone=\"ok\"] {\n border-color: var(--dsw-alias-state-success-primary, #16a34a);\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n/* Inline Status Overview Card (2x2 spacious layout, full text visibility) */\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewGrid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n@media (max-width: 560px) {\n [data-zen-remote=\"wizard\"] .zr-wizard-overviewGrid {\n grid-template-columns: 1fr;\n }\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewItem {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 13px 15px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewLabel {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewValue {\n display: flex;\n align-items: center;\n gap: 7px;\n font-size: 13.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n line-height: 1.45;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewSub {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n/* MS-8: the pool cap's loud form \u2014 the \u5DF2\u914D\u5BF9\u670D\u52A1\u7AEF cell's value and sub\n wear data-limit=\"true\" at 8/8 and turn bold red (the same loudness the\n settings page's limit alert uses). */\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewValue[data-limit=\"true\"] {\n color: var(--dsw-alias-state-error-primary, #d5304f);\n font-weight: 700;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewSub[data-limit=\"true\"],\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-subtitle[data-limit=\"true\"] {\n color: var(--dsw-alias-state-error-primary, #d5304f);\n font-weight: 600;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-emptyBanner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n padding: 14px 16px;\n border-radius: 10px;\n border: 1px dashed var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-emptyText {\n font-size: 12.5px;\n color: var(--dsw-alias-label-secondary);\n line-height: 1.5;\n margin: 0;\n flex: 1;\n min-width: 220px;\n}\n\n/* Wizard Modal Dialog (above app chrome, below helper sub-cards) */\n[data-zen-remote=\"wizard-modal\"] {\n position: fixed;\n inset: 0;\n z-index: 950;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(2px);\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalDialog {\n width: min(680px, calc(100vw - 32px));\n max-height: min(88vh, 760px);\n display: flex;\n flex-direction: column;\n border-radius: 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n box-shadow: 0 20px 48px rgba(0, 0, 0, 0.28);\n overflow: hidden;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 16px 22px 14px;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalTitle {\n font-size: 15.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalBody {\n padding: 18px 22px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalFooter {\n padding: 14px 22px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* Non-clickable 3-step visual progress indicator */\n[data-zen-remote=\"wizard\"] .zr-wizard-stepper {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 13px 22px;\n margin: 0;\n list-style: none;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n border-top: 1px solid var(--dsw-alias-border-l2);\n border-bottom: 1px solid var(--dsw-alias-border-l2);\n user-select: none;\n pointer-events: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepCircle {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n border: 1.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-tertiary);\n flex: none;\n transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease, box-shadow 160ms ease;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"current\"] .zr-wizard-stepCircle {\n background: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-2, #fff);\n box-shadow: 0 0 0 3px var(--dsw-alias-border-l2);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"done\"] .zr-wizard-stepCircle {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n border-color: var(--dsw-alias-state-success-primary, #16a34a);\n color: #fff;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepText {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepTag {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary);\n line-height: 1.2;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"current\"] .zr-wizard-stepTag {\n color: var(--dsw-alias-label-secondary);\n font-weight: 500;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"done\"] .zr-wizard-stepTag {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepName {\n font-size: 13px;\n font-weight: 500;\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"current\"] .zr-wizard-stepName {\n color: var(--dsw-alias-label-primary);\n font-weight: 600;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"done\"] .zr-wizard-stepName {\n color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepConnector {\n flex: 1;\n height: 2px;\n min-width: 18px;\n border-radius: 2px;\n background: var(--dsw-alias-border-l2);\n transition: background-color 200ms ease;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepConnector[data-done=\"true\"] {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepIntro {\n font-size: 12.5px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-body {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* Step 1: 3-column path cards */\n[data-zen-remote=\"wizard\"] .zr-wizard-paths {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n margin: 0;\n padding: 0;\n border: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path {\n display: flex;\n flex-direction: column;\n gap: 6px;\n text-align: left;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 10px;\n padding: 12px 14px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n cursor: pointer;\n font: inherit;\n color: inherit;\n transition: border-color 120ms ease, box-shadow 120ms ease;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path:hover:not(:disabled) {\n border-color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path[data-selected=\"true\"] {\n border-color: var(--dsw-alias-label-primary);\n box-shadow: 0 0 0 1px var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathHead {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathRadio {\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: 1.5px solid var(--dsw-alias-label-tertiary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathRadio[data-selected=\"true\"] {\n border-color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-label-primary);\n box-shadow: inset 0 0 0 2.5px var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathName {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathDesc {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-sectionTitle {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-roleGrid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: 10px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-checkRow {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12.5px;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n user-select: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-checkRow input[type=\"checkbox\"] {\n margin: 0;\n cursor: pointer;\n}\n\n/* Step 2: form controls */\n[data-zen-remote=\"wizard\"] .zr-wizard-selectedBar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-selectedLabel {\n font-size: 12.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-formStack {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-formGrid {\n display: grid;\n grid-template-columns: 1fr 120px;\n gap: 12px;\n align-items: start;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-labelRow {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-label {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-savedTag {\n font-size: 11px;\n padding: 1px 7px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-hint {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n line-height: 1.4;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-input {\n height: 34px;\n font: inherit;\n font-size: 13px;\n padding: 0 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n width: 100%;\n box-sizing: border-box;\n}\n[data-zen-remote=\"wizard\"] code.zr-wizard-input {\n display: flex;\n align-items: center;\n min-height: 36px;\n height: auto;\n padding: 6px 12px;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n line-height: 1.4;\n overflow-wrap: anywhere;\n word-break: break-all;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-input:focus {\n outline: none;\n border-color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-link {\n background: none;\n border: none;\n padding: 0;\n font: inherit;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n text-decoration: underline;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-link:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-linkBtn {\n font: inherit;\n font-size: 12px;\n padding: 4px 10px;\n border-radius: 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-linkBtn:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-secondary);\n}\n\n/* Primary & Secondary action buttons + Footer */\n[data-zen-remote=\"wizard\"] .zr-wizard-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding-top: 8px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-footerHint {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btn,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btn {\n font: inherit;\n font-size: 12.5px;\n font-weight: 500;\n height: 32px;\n padding: 0 14px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btn:hover:not(:disabled),\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btn:hover:not(:disabled) {\n border-color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btnPrimary,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btnPrimary {\n background: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-2, #fff);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btnPrimary:hover:not(:disabled),\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btnPrimary:hover:not(:disabled) {\n opacity: 0.9;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btn:disabled,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Step 3: service control bar, 3-column lights, and QR pairing panel */\n[data-zen-remote=\"wizard\"] .zr-wizard-serviceBar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-serviceInfo {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lights {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 8px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-light {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 9px 12px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n font-size: 12.5px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightMain {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightName {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightState {\n font-size: 11.5px;\n color: var(--dsw-alias-label-tertiary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightState[data-state=\"pass\"] {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightState[data-state=\"fail\"] {\n color: var(--dsw-alias-state-error-primary, #d5304f);\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dsw-alias-label-tertiary);\n flex: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-dot[data-state=\"pass\"] {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-dot[data-state=\"fail\"] {\n background: var(--dsw-alias-state-error-primary, #d5304f);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-dot[data-state=\"pending\"] {\n background: var(--dsw-alias-state-warning-primary, #b8860b);\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-pairPanel {\n display: flex;\n align-items: center;\n gap: 18px;\n flex-wrap: wrap;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pairMeta {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n min-width: 180px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 24px;\n letter-spacing: 4px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 2px 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-countdown {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-qr {\n width: 156px;\n height: 156px;\n image-rendering: pixelated;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: #fff;\n display: block;\n flex: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-qr[data-usable=\"false\"] {\n display: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-targetTabs {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 6px;\n padding: 4px;\n border-radius: 9px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-targetTab {\n font: inherit;\n font-size: 12.5px;\n font-weight: 500;\n padding: 7px 12px;\n border-radius: 6px;\n border: 1px solid transparent;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n text-align: center;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-targetTab[data-selected=\"true\"] {\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n border-color: var(--dsw-alias-border-l2);\n color: var(--dsw-alias-label-primary);\n font-weight: 600;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-desktopBox,\n[data-zen-remote=\"wizard\"] .zr-wizard-clientBox {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceList {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceItem {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px 14px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n font-size: 12.5px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceTitleRow {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceBadge {\n font-size: 11px;\n font-weight: 500;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n}\n/* MS-8: the servers-modal state badge tones \u2014 green online, amber offline,\n red for a verdict only a re-pair or an upgrade fixes. */\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceBadge[data-tone=\"live\"] {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceBadge[data-tone=\"warn\"] {\n color: var(--dsw-alias-state-warning-primary, #b8860b);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceBadge[data-tone=\"invalid\"] {\n color: var(--dsw-alias-state-error-primary, #d5304f);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceActions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-select {\n height: 30px;\n font: inherit;\n font-size: 12px;\n padding: 0 8px;\n border-radius: 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n}\n\n/* The modal card: a body-level overlay, above the app chrome. */\n[data-zen-remote=\"wizard-card\"] {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.45);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardPanel {\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n width: min(560px, calc(100vw - 32px));\n max-height: min(82vh, 660px);\n overflow: auto;\n padding: 18px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTitle {\n font-size: 15px;\n font-weight: 600;\n margin: 0;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-cardCloseIcon,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardCloseIcon {\n border: none;\n background: none;\n color: var(--dsw-alias-label-secondary);\n font-size: 18px;\n line-height: 1;\n padding: 2px 6px;\n border-radius: 6px;\n cursor: pointer;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-cardCloseIcon:hover,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardCloseIcon:hover {\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardBody {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardSteps {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardSubhead {\n font-size: 12.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 4px 0 0;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTable {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n overflow: hidden;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTable td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--dsw-alias-border-l2);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTable tr:last-child td {\n border-bottom: none;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardPerm {\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardWhy {\n color: var(--dsw-alias-label-tertiary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTabs {\n display: flex;\n gap: 6px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTab {\n font: inherit;\n font-size: 12px;\n font-weight: 500;\n padding: 4px 12px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTab[data-selected=\"true\"] {\n color: var(--dsw-alias-bg-layer-2, #fff);\n background: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardStep {\n font-size: 12.5px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardCode {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n white-space: pre;\n background: var(--dsw-alias-bg-layer-3, rgba(127, 127, 127, 0.12));\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n padding: 10px 12px;\n overflow: auto;\n max-height: 260px;\n margin: 0;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-label {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-input {\n height: 34px;\n font: inherit;\n font-size: 13px;\n padding: 0 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n width: 100%;\n box-sizing: border-box;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardActions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n}\n";
10
10
  //# sourceMappingURL=wizard-css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wizard-css.d.ts","sourceRoot":"","sources":["../../../../src/client/wizard/wizard-css.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,UAAU,w42BA06BtB,CAAA"}
1
+ {"version":3,"file":"wizard-css.d.ts","sourceRoot":"","sources":["../../../../src/client/wizard/wizard-css.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,UAAU,4h5BAi8BtB,CAAA"}
@@ -27,6 +27,11 @@
27
27
  * Defensive like the rest of client-data: an empty or missing heading never
28
28
  * counts as a mark, so it can never decide a container by accident.
29
29
  */
30
+ /** MS-4: the <html> attribute carrying the open REMOTE session's server id
31
+ * (`zr~<serverId>~…`'s middle half). Written by effects/remote-session.ts
32
+ * together with `data-zr-remote-session`, read by
33
+ * effects/model-group-side.ts as the `activeRemoteServerId`. */
34
+ export declare const REMOTE_SERVER_ATTRIBUTE = "data-zr-remote-server";
30
35
  /** One group's display description, as the DOM shows it. */
31
36
  export interface ModelGroupHeading {
32
37
  /** Groups sharing one container share one key (the effect numbers the
@@ -38,7 +43,23 @@ export interface ModelGroupHeading {
38
43
  /** Per-group verdict, in input order: `remote` for marked headings, `local`
39
44
  * for the rest of a container that has at least one, and `undefined` —
40
45
  * "stamp nothing" — for every group of a container that holds no mark at
41
- * all. */
42
- export type ModelGroupSide = 'remote' | 'local' | undefined;
46
+ * all. MS-4 adds `remote-other`: with a session's own server id known
47
+ * ({@link classifyModelGroupsForSession}'s `activeRemoteServerId`), a
48
+ * marked group whose DECODED server id is a DIFFERENT paired server — the
49
+ * model menu must show only the models of the server the open session
50
+ * lives on. */
51
+ export type ModelGroupSide = 'remote' | 'local' | 'remote-other' | undefined;
43
52
  export declare function classifyModelGroups(groups: readonly ModelGroupHeading[]): ModelGroupSide[];
53
+ /**
54
+ * The MS-4 extension: with `activeRemoteServerId` set (the `zr~<serverId>~`
55
+ * half of the session the browser has open, effects/remote-session.ts),
56
+ * each marked heading's embedded server id (decodeServerIdZeroWidth)
57
+ * decides between plain `remote` (the open session's own server, or a
58
+ * heading whose server cannot be decoded — shown, never hidden) and
59
+ * `remote-other` (a DIFFERENT paired server's group — hidden in a remote
60
+ * session by remote-session.css.ts). Without the argument the verdicts
61
+ * are exactly {@link classifyModelGroups}'s — the single-paired-server
62
+ * behavior, byte for byte.
63
+ */
64
+ export declare function classifyModelGroupsForSession(groups: readonly ModelGroupHeading[], activeRemoteServerId?: string): ModelGroupSide[];
44
65
  //# sourceMappingURL=model-group-side.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-group-side.d.ts","sourceRoot":"","sources":["../../../src/client-data/model-group-side.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC;oCACgC;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;UAGU;AACV,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;AAE3D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,cAAc,EAAE,CAiB1F"}
1
+ {"version":3,"file":"model-group-side.d.ts","sourceRoot":"","sources":["../../../src/client-data/model-group-side.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH;;;gEAGgE;AAChE,eAAO,MAAM,uBAAuB,0BAA0B,CAAA;AAE9D,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC;oCACgC;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;eAOe;AACf,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,cAAc,GAAG,SAAS,CAAA;AAE5E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,cAAc,EAAE,CAE1F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CAmBnI"}
@@ -8,6 +8,10 @@
8
8
  * - `parseRemoteStatusBody(body, now)` maps the
9
9
  * `GET /_dsh/zen-remote/client/remote-status` body
10
10
  * (`{ state, versionMismatch, serverName, closed }`) into a tolerant view;
11
+ * since MS-6 the body's `servers` dict (per handshake serverId) parses
12
+ * alongside, and `resolveServerStatusView(view, sessionId)` picks the
13
+ * session's OWN server entry — falling back to the top-level mirror (the
14
+ * FIRST pool entry) whenever the dict cannot answer;
11
15
  * - `describeRemoteStatus(view)` maps one view to the icon's three states —
12
16
  * online (lit) / offline (grey; `revoked` / `unpaired` count as offline —
13
17
  * the link is not serving either way) / mismatch (yellow, only ever while
@@ -38,6 +42,20 @@ export declare const CLIENT_UNSHARE_ROUTE = "/_dsh/zen-remote/client/unshare";
38
42
  export type RemoteStatusState = 'online' | 'offline' | 'revoked' | 'unpaired';
39
43
  /** Why the server closed a session's remote access. */
40
44
  export type RemoteClosedReason = 'manual' | 'client' | 'idle';
45
+ /**
46
+ * ONE paired server's serving state (MS-6): the same four facts the top
47
+ * level has always carried, scoped to the server whose handshake minted the
48
+ * `serverId`. The route (src/client-routes.ts, MS-5) serves these under
49
+ * `servers`, keyed by serverId; the top level mirrors the FIRST pool entry
50
+ * for the pre-MS-6 page.
51
+ */
52
+ export interface RemoteServerStatusView {
53
+ state: RemoteStatusState;
54
+ versionMismatch: boolean;
55
+ serverName: string;
56
+ /** The plugins whose bridge verdict is bridged RIGHT NOW on THIS server. */
57
+ bridgedPlugins: readonly string[];
58
+ }
41
59
  /** One parsed status body, stamped with the parse time for future decay. */
42
60
  export interface RemoteStatusView {
43
61
  state: RemoteStatusState;
@@ -49,6 +67,10 @@ export interface RemoteStatusView {
49
67
  * nothing is ever considered bridged on a shape the parse does not
50
68
  * trust. */
51
69
  bridgedPlugins: readonly string[];
70
+ /** Per-server views keyed by the handshake serverId (MS-6). A legacy body
71
+ * without the field parses to the empty dict — the parts then fall back to
72
+ * the top-level mirror. */
73
+ servers: Readonly<Record<string, RemoteServerStatusView>>;
52
74
  /** When this view was parsed off a GET body. */
53
75
  asOf: number;
54
76
  }
@@ -73,6 +95,26 @@ export declare function parseRemoteStatusBody(body: unknown, now: number): Remot
73
95
  * spends.
74
96
  */
75
97
  export declare function shouldStampBridgeAttribute(bridgedPlugins: unknown, plugin: string): boolean;
98
+ /**
99
+ * Which server's facts ONE session reads (MS-6): given the session id on
100
+ * screen, its virtual form names the owning serverId, and THAT server's
101
+ * entry answers — per-server isolation for the icon, the banner and the
102
+ * bridge stamp. Everything else falls back to the TOP-LEVEL view, the
103
+ * pre-MS-6 answer: a session id that is not virtual (a local session), a
104
+ * serverId the dict never answered (its entry never handshook), a legacy
105
+ * body without a dict, or no session id at all. Tolerant the same way as
106
+ * the parse: hand-rolled views without `servers` never throw here.
107
+ */
108
+ export declare function resolveServerStatusView(view: RemoteStatusView | undefined | null, sessionId?: string): RemoteServerStatusView | undefined;
109
+ /**
110
+ * Whether the remote session CURRENTLY ON SCREEN has its own server's bridge
111
+ * verdict going its way (MS-6): the verdict comes from the session's server
112
+ * entry ({@link resolveServerStatusView}), not the page-wide mirror of the
113
+ * FIRST pool entry — with several servers paired, A bridging a plugin must
114
+ * not un-hide it over B's sessions. Tolerant like the 2-argument core it
115
+ * wraps: a garbage or missing list reads as "not bridged".
116
+ */
117
+ export declare function shouldStampBridgeForSession(view: RemoteStatusView | undefined, sessionId: string | undefined, plugin: string): boolean;
76
118
  /** The plugin the bridge stamp names. */
77
119
  export declare const BRIDGE_STAMP_PLUGIN = "dsh-better-sidebar";
78
120
  /** The html attribute the stamp writes (`data-zr-bridge-dsh-better-sidebar`). */
@@ -94,7 +136,11 @@ export interface RemoteStatusDescription {
94
136
  state: 'online' | 'offline' | 'mismatch' | 'revoked' | 'unpaired';
95
137
  hoverText: string;
96
138
  }
97
- export declare function describeRemoteStatus(view: RemoteStatusView | undefined | null, t?: RemoteStatusFormatter): RemoteStatusDescription;
139
+ export declare function describeRemoteStatus(view: RemoteStatusView | undefined | null, t?: RemoteStatusFormatter,
140
+ /** MS-6: the session on screen — its virtual id picks its OWN server's
141
+ * entry; omitted (or unanswered by the dict) keeps the pre-MS-6 top-level
142
+ * read. */
143
+ sessionId?: string): RemoteStatusDescription;
98
144
  /** The locale keys `bannerText` needs. */
99
145
  export type RemoteBannerTextKey = 'remoteBannerOffline' | 'remoteBannerRevoked' | 'remoteBannerUnpaired' | 'remoteBannerClosedIdle' | 'remoteBannerClosedManual' | 'remoteBannerClosedClient';
100
146
  export type RemoteBannerFormatter = (key: RemoteBannerTextKey) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"remote-status.d.ts","sourceRoot":"","sources":["../../../src/client-data/remote-status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote-status.d.ts","sourceRoot":"","sources":["../../../src/client-data/remote-status.ts"],"names":[],"mappings":"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"}
@@ -86,9 +86,20 @@ export declare const CLIENT_CLAIM_ROUTE = "/_dsh/zen-remote/client/claim";
86
86
  export declare const CLIENT_STATUS_ROUTE = "/_dsh/zen-remote/client/status";
87
87
  /** T43: one immediate reconnect — answered 409 unless the client is offline. */
88
88
  export declare const CLIENT_RECONNECT_ROUTE = "/_dsh/zen-remote/client/reconnect";
89
+ /** MS-6: POST `{ entryId }` (or `{ all: true }`) removes one / all paired
90
+ * servers from the pool (host half: src/client-routes.ts, mirrored here
91
+ * because the browser half cannot import the host module). */
92
+ export declare const CLIENT_UNPAIR_ROUTE = "/_dsh/zen-remote/client/unpair";
89
93
  /** CU-4: the redacted diagnostic report (GET, both roles, machine-local only
90
94
  * — a gateway-forwarded fetch is refused server-side). */
91
95
  export declare const CLIENT_DEBUG_REPORT_ROUTE = "/_dsh/zen-remote/client/debug-report";
96
+ /**
97
+ * MS-6: the paired-server pool's cap — the browser mirror of
98
+ * src/state-store.ts's constant of the same name (the host module cannot be
99
+ * imported here). The settings page and the wizard read it for the
100
+ * `已配对 N / 8 台` counters and the limit gating.
101
+ */
102
+ export declare const MAX_PAIRED_SERVERS = 8;
92
103
  /** The lightweight client-facing config route (host half, both roles): the
93
104
  * settings page's FALLBACK role probe (T17) — it registers wherever a
94
105
  * webServer exists, and since T17 its body carries the effective `role`
@@ -152,6 +163,12 @@ export interface ClientStatusBody {
152
163
  /** RD-6: the upload-redirect service probe (presence-gated — an older
153
164
  * plugin answers without it). */
154
165
  serviceProbe?: unknown;
166
+ /** MS-6: the pool list, one row per paired server (`poolStatusBodyOf`'s
167
+ * `servers`), presence-gated like every diagnostic field — a pre-MS-5
168
+ * server (or the row-probe fallback) answers without it. */
169
+ servers?: unknown;
170
+ /** MS-6: the pool cap as the body reports it (8). */
171
+ maxServers?: unknown;
155
172
  }
156
173
  /** One remote-call failure line in the diagnostics lists. `time` is epoch
157
174
  * milliseconds — ISO-stamped rings are parsed at derive time; `method`
@@ -180,6 +197,27 @@ export interface ClientCompatView {
180
197
  /** The most recent incompatible calls (at most 10). */
181
198
  recentCalls: ClientDiagFailureView[];
182
199
  }
200
+ /**
201
+ * MS-6: ONE paired server of the pool, as the per-server list renders it —
202
+ * the parsed form of one `client/status` `servers[]` row (no token ever
203
+ * rides any status answer). `state` speaks the same view vocabulary as the
204
+ * top level (the wire aliases mapped); every field degrades to its default
205
+ * on a junk row, and a row without an `entryId` (the route's stable key)
206
+ * drops whole.
207
+ */
208
+ export interface ClientServerView {
209
+ entryId: string;
210
+ serverId: string;
211
+ serverUrl: string;
212
+ serverName: string;
213
+ /** The pool's deduplicated display name (`-1` / `-2` suffixes included). */
214
+ displayName: string;
215
+ state: ClientConnectionView['state'];
216
+ nextRetryAt: number | undefined;
217
+ lastError: string;
218
+ compat: ClientCompatView | undefined;
219
+ pluginBridge: PluginBridgeStatusView[];
220
+ }
183
221
  /** One client connection as the block renders it. */
184
222
  export interface ClientConnectionView {
185
223
  state: 'unpaired' | 'connected' | 'revoked' | 'unreachable' | 'unexpected' | 'invalid-url' | 'incompatible';
@@ -209,6 +247,15 @@ export interface ClientConnectionView {
209
247
  * through tolerantly (undefined when the body carried none — an older
210
248
  * plugin — and the diagnostics row stays hidden). */
211
249
  uploadProbe: Readonly<Record<string, unknown>> | undefined;
250
+ /** MS-6: every paired server of the pool, in pairing order. Empty on a
251
+ * legacy body (or a row-less unpaired answer) — the pre-MS-6 page shape. */
252
+ servers: readonly ClientServerView[];
253
+ /** MS-6: the pool's cap, from the body when it carried a sane number,
254
+ * {@link MAX_PAIRED_SERVERS} otherwise. */
255
+ maxServers: number;
256
+ /** MS-6: `servers.length >= maxServers` — the red 已配满 note and the
257
+ * new-address submit gate both read this. */
258
+ limitReached: boolean;
212
259
  }
213
260
  /**
214
261
  * Map one `client/status` body into the view the client group renders.
@@ -259,6 +306,11 @@ export interface ClaimRouteBody {
259
306
  token?: unknown;
260
307
  deviceId?: unknown;
261
308
  deviceName?: unknown;
309
+ /** MS-8: the pool entry the pairing landed in (pool-mode answers carry it;
310
+ * the legacy single-server answer carries `token` instead and no
311
+ * `entryId` — the token never reaches the browser in pool mode). The
312
+ * wizard records it as the step-3 selected server. */
313
+ entryId?: unknown;
262
314
  /** The normalized address the backend validated — what the form writes. */
263
315
  serverUrl?: unknown;
264
316
  code?: string;
@@ -273,6 +325,36 @@ export declare const PAIRING_CODE_LENGTH = 8;
273
325
  * 32-character pairing-code alphabet (excluding 0/O/1/I/L and symbols), and
274
326
  * capped at 8 characters. */
275
327
  export declare function normalizePairingCode(input: string): string;
328
+ /** What {@link canSubmitClientPairing} decides. */
329
+ export interface CanSubmitClientPairingVerdict {
330
+ /** The 配对 button may act: everything locally checkable passes. */
331
+ allowed: boolean;
332
+ /** The typed address names an already-paired server — the claim will
333
+ * UPDATE that entry's token in place, not add a ninth one. */
334
+ isOverwrite: boolean;
335
+ /** A NEW address while the pool is full (`servers.length >= maxServers`):
336
+ * the claim must not even leave the page (the route would answer
337
+ * `limit-reached`). An overwrite never sets this. */
338
+ blockedByLimit: boolean;
339
+ }
340
+ /**
341
+ * The 配对 button's whole gate, as one pure truth table (MS-6): the claim
342
+ * needs an address and a COMPLETE 8-character pairing code (the input box
343
+ * normalizes as the user types; this judge is the same bar the route's code
344
+ * grammar enforces), a quiet page (`busy`), and a valid device-name draft
345
+ * (`deviceNameInvalid`, T60 — a red-boxed name would silently pair under the
346
+ * fallback copy). The pool cap blocks only NEW addresses: a full pool still
347
+ * accepts re-pairing an existing one in place, which is how a user whose
348
+ * token was revoked at 8/8 gets back in.
349
+ */
350
+ export declare function canSubmitClientPairing(input: {
351
+ pairUrl: string;
352
+ pairCode: string;
353
+ servers: readonly ClientServerView[];
354
+ maxServers?: number;
355
+ busy?: boolean;
356
+ deviceNameInvalid?: boolean;
357
+ }): CanSubmitClientPairingVerdict;
276
358
  /**
277
359
  * Whether the settings page may follow the SERVER's record of this device's
278
360
  * name into the row (T59): the body carried a name, it differs from the row
@@ -507,7 +589,7 @@ export declare function boolField(field: string): SettingsFieldSpec;
507
589
  */
508
590
  export declare function consentField(field: string): SettingsFieldSpec;
509
591
  /** Names of the row fields the settings page edits, in group order. */
510
- export type SettingsFieldName = 'role' | 'host' | 'port' | 'trustedProxies' | 'rateLimit' | 'vapidSubject' | 'pushSummary' | 'pushTurnEnd' | 'pushTool' | 'pushDebounceMs' | 'lang' | 'serverName' | 'idleHours' | 'autoShareNewSessions' | 'pluginBridgeConsent';
592
+ export type SettingsFieldName = 'role' | 'host' | 'port' | 'trustedProxies' | 'rateLimit' | 'vapidSubject' | 'pushSummary' | 'pushTurnEnd' | 'pushTool' | 'pushEnabled' | 'pushSessionName' | 'pushDebounceMs' | 'lang' | 'serverName' | 'idleHours' | 'autoShareNewSessions' | 'pluginBridgeConsent';
511
593
  /** Longest legal `serverName`, mirroring src/config.ts's cap. */
512
594
  export declare const SERVER_NAME_MAX = 40;
513
595
  /** Upper bound of `idleHours`, mirroring src/config.ts. */
@@ -624,6 +706,8 @@ export interface ZenRemoteFormState extends SettingsFormShellState {
624
706
  pushSummary: SettingsFieldState;
625
707
  pushTurnEnd: SettingsFieldState;
626
708
  pushTool: SettingsFieldState;
709
+ pushEnabled: SettingsFieldState;
710
+ pushSessionName: SettingsFieldState;
627
711
  pushDebounceMs: SettingsFieldState;
628
712
  lang: SettingsFieldState;
629
713
  serverName: SettingsFieldState;
@@ -1 +1 @@
1
- {"version":3,"file":"settings-form.d.ts","sourceRoot":"","sources":["../../../src/client-data/settings-form.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings-form.d.ts","sourceRoot":"","sources":["../../../src/client-data/settings-form.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,14 @@
12
12
  * row layer applies the same rule when the fields land there, so a client
13
13
  * that accepts something the resolver would silently drop would only set
14
14
  * the user up for a mystery.
15
+ *
16
+ * MS-6 adds the paired-pool overview pieces: the pool count is a first-class
17
+ * "configured" signal (MS-5 pairs straight into the pool store, not the
18
+ * row), and {@link deriveClientOverviewSummary} derives the overview card's
19
+ * counters and its two lights (connection health / pool fill) off the
20
+ * `client/status` pool list.
15
21
  */
22
+ import type { ClientServerView } from './settings-form.ts';
16
23
  /** Wizard route constants — mirror of src/wizard/routes.ts. */
17
24
  export declare const WIZARD_STATUS_ROUTE = "/_dsh/zen-remote/admin/wizard/status";
18
25
  export declare const WIZARD_VERIFY_ROUTE = "/_dsh/zen-remote/admin/wizard/verify";
@@ -129,7 +136,12 @@ export type WizardPath = 'caddy' | 'external' | 'cloudflared' | 'lan';
129
136
  export declare function initialStep(status: WizardStatusBody | undefined): WizardStep;
130
137
  /**
131
138
  * Whether the inline overview card should render the configured status
132
- * dashboard instead of the first-time setup prompt.
139
+ * dashboard instead of the first-time setup prompt. MS-6: the paired pool's
140
+ * size is the client's first-class signal — since MS-5 a claim lands in the
141
+ * pool store and never touches the row's `serverUrl` / `deviceToken`, so a
142
+ * freshly multi-paired machine with an empty row must still read as
143
+ * configured. `> 0` answers true no matter what the other inputs say; the
144
+ * field is optional and an omitted one (or a zero) changes nothing.
133
145
  */
134
146
  export declare function isWizardConfigured(input: {
135
147
  effectiveClient: boolean;
@@ -139,6 +151,7 @@ export declare function isWizardConfigured(input: {
139
151
  tokenConfigured: boolean;
140
152
  clientServerUrl: string;
141
153
  clientState: string | undefined;
154
+ pairedServerCount?: number;
142
155
  }): boolean;
143
156
  export interface WizardFormSeed {
144
157
  domain: string;
@@ -211,6 +224,35 @@ export interface ClientWizardLights {
211
224
  /** Whether the session-sync and plugin-bridge interceptors are active. */
212
225
  sync: LightState;
213
226
  }
227
+ /** The overview card's derived counters and lights (MS-6): the 第 3 格
228
+ * 「连接状态」 shows `M / N 台在线` with {@link WizardOverviewSummary.connectionLight}
229
+ * summarizing the pool's health, and the 第 4 格 「已配对服务端」 shows
230
+ * `已配对 N / maxServers 台` with {@link WizardOverviewSummary.serversLight}
231
+ * turning red exactly at the cap. Input is the DERIVED pool list
232
+ * ({@link ClientServerView} — the view vocabulary's state words), in pairing
233
+ * order; order never matters to the counts. */
234
+ export interface WizardOverviewSummary {
235
+ totalCount: number;
236
+ onlineCount: number;
237
+ /** Everything that is neither connected nor revoked (unreachable,
238
+ * unexpected, incompatible, invalid-url, …). */
239
+ offlineCount: number;
240
+ revokedCount: number;
241
+ maxServers: number;
242
+ limitReached: boolean;
243
+ connectionLight: LightState;
244
+ serversLight: LightState;
245
+ }
246
+ /**
247
+ * Derive the sub-client overview summary off one derived pool list: green
248
+ * only when EVERY paired server is connected; red when any server is in a
249
+ * state that will not recover on its own (revoked / incompatible /
250
+ * invalid-url) or when the pool is FULL — the cap is a servers fact, so a
251
+ * full pool of healthy connections still shows a red servers light while its
252
+ * connection light stays green; amber for the rest (nothing paired yet, or
253
+ * servers the retry ladder is still working on).
254
+ */
255
+ export declare function deriveClientOverviewSummary(servers: readonly ClientServerView[], maxServers?: number): WizardOverviewSummary;
214
256
  /**
215
257
  * Derive the three status lights for the desktop sub-client verification
216
258
  * step (`role === 'client'`).
@@ -220,6 +262,18 @@ export declare function deriveClientWizardLights(input: {
220
262
  clientState: string | undefined;
221
263
  interceptInstalled?: boolean | undefined;
222
264
  }): ClientWizardLights;
265
+ /**
266
+ * The wizard step-3's three lights for ONE selected paired server (MS-8):
267
+ * the credential is green by the row's own existence (the token lives in the
268
+ * pool store, never in the row) and red only when the server refused it
269
+ * (`revoked`); the connection follows the same fail-set the global lights
270
+ * use (an offline server mid-retry is red here too — the step is staring at
271
+ * THAT one server, not the pool); sync is green on a connected row whose
272
+ * interface groups all match, red on a compat mismatch, amber otherwise.
273
+ * `undefined` (nothing paired, or nothing selected yet) keeps all three
274
+ * amber.
275
+ */
276
+ export declare function deriveClientServerLights(server: ClientServerView | undefined): ClientWizardLights;
223
277
  /** Pairing-code countdown, whole seconds, never negative. */
224
278
  export declare function pairingSecondsLeft(expiresAt: number, now: number): number;
225
279
  /**
@@ -236,6 +290,7 @@ export interface SnippetInput {
236
290
  domain: string;
237
291
  upstreamHost: string;
238
292
  upstreamPort: number;
293
+ lang?: 'zh' | 'en' | undefined;
239
294
  }
240
295
  export declare function nginxSnippetText(input: SnippetInput): string | null;
241
296
  export declare function caddySnippetText(input: SnippetInput): string | null;