@songsid/agend 2.3.4-beta.6 → 2.3.5-alpha.2

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 (386) hide show
  1. package/README.md +2 -0
  2. package/README.zh-TW.md +2 -0
  3. package/THIRD_PARTY_NOTICES.md +53 -0
  4. package/dist/agent-endpoint.d.ts +5 -1
  5. package/dist/agent-endpoint.js +12 -2
  6. package/dist/agent-endpoint.js.map +1 -1
  7. package/dist/backend/claude-code.d.ts +15 -12
  8. package/dist/backend/claude-code.js +137 -133
  9. package/dist/backend/claude-code.js.map +1 -1
  10. package/dist/backend/codex-package.d.ts +5 -2
  11. package/dist/backend/codex-package.js +1 -5
  12. package/dist/backend/codex-package.js.map +1 -1
  13. package/dist/backend/codex.d.ts +136 -113
  14. package/dist/backend/codex.js +1271 -1219
  15. package/dist/backend/codex.js.map +1 -1
  16. package/dist/backend/grok-model-cache.d.ts +7 -0
  17. package/dist/backend/grok-model-cache.js +65 -0
  18. package/dist/backend/grok-model-cache.js.map +1 -0
  19. package/dist/backend/grok.d.ts +2 -0
  20. package/dist/backend/grok.js +22 -0
  21. package/dist/backend/grok.js.map +1 -1
  22. package/dist/backend/native-pane.d.ts +9 -0
  23. package/dist/backend/native-pane.js +59 -0
  24. package/dist/backend/native-pane.js.map +1 -0
  25. package/dist/backend/types.d.ts +7 -0
  26. package/dist/backend/types.js.map +1 -1
  27. package/dist/channel/ipc-bridge.d.ts +2 -0
  28. package/dist/channel/mcp-tools.js +1 -1
  29. package/dist/channel/mcp-tools.js.map +1 -1
  30. package/dist/cli.js +6 -2
  31. package/dist/cli.js.map +1 -1
  32. package/dist/config-validator.js +59 -0
  33. package/dist/config-validator.js.map +1 -1
  34. package/dist/config.js +16 -0
  35. package/dist/config.js.map +1 -1
  36. package/dist/daemon.d.ts +62 -5
  37. package/dist/daemon.js +749 -267
  38. package/dist/daemon.js.map +1 -1
  39. package/dist/delivery-consumed-watch.d.ts +15 -3
  40. package/dist/delivery-consumed-watch.js +23 -1
  41. package/dist/delivery-consumed-watch.js.map +1 -1
  42. package/dist/delivery-outbox.d.ts +5 -0
  43. package/dist/delivery-outbox.js +32 -4
  44. package/dist/delivery-outbox.js.map +1 -1
  45. package/dist/delivery-reconciliation.d.ts +2 -35
  46. package/dist/delivery-reconciliation.js +2 -156
  47. package/dist/delivery-reconciliation.js.map +1 -1
  48. package/dist/fleet-context.d.ts +2 -2
  49. package/dist/fleet-level-config.d.ts +1 -1
  50. package/dist/fleet-level-config.js +2 -0
  51. package/dist/fleet-level-config.js.map +1 -1
  52. package/dist/fleet-manager.d.ts +125 -2
  53. package/dist/fleet-manager.js +1157 -27
  54. package/dist/fleet-manager.js.map +1 -1
  55. package/dist/fleet-windows-runtime.d.ts +92 -0
  56. package/dist/fleet-windows-runtime.js +373 -0
  57. package/dist/fleet-windows-runtime.js.map +1 -0
  58. package/dist/instance-config-impact.js +4 -0
  59. package/dist/instance-config-impact.js.map +1 -1
  60. package/dist/instance-lifecycle.d.ts +20 -3
  61. package/dist/instance-lifecycle.js +358 -156
  62. package/dist/instance-lifecycle.js.map +1 -1
  63. package/dist/local-pane-endpoint.d.ts +46 -0
  64. package/dist/local-pane-endpoint.js +189 -0
  65. package/dist/local-pane-endpoint.js.map +1 -0
  66. package/dist/local-pane-launcher.d.ts +2 -0
  67. package/dist/local-pane-launcher.js +38 -0
  68. package/dist/local-pane-launcher.js.map +1 -0
  69. package/dist/local-pane-stage.ps1 +101 -0
  70. package/dist/locale.js +34 -0
  71. package/dist/locale.js.map +1 -1
  72. package/dist/model-catalog-defaults.d.ts +14 -0
  73. package/dist/model-catalog-defaults.js +20 -0
  74. package/dist/model-catalog-defaults.js.map +1 -0
  75. package/dist/native-agent-admission.d.ts +7 -0
  76. package/dist/native-agent-admission.js +26 -0
  77. package/dist/native-agent-admission.js.map +1 -0
  78. package/dist/native-daemon-client.d.ts +13 -0
  79. package/dist/native-daemon-client.js +28 -0
  80. package/dist/native-daemon-client.js.map +1 -0
  81. package/dist/native-instance-api.d.ts +14 -0
  82. package/dist/native-instance-api.js +205 -0
  83. package/dist/native-instance-api.js.map +1 -0
  84. package/dist/native-instance-input.d.ts +84 -0
  85. package/dist/native-instance-input.js +54 -0
  86. package/dist/native-instance-input.js.map +1 -0
  87. package/dist/native-instance-registry.d.ts +32 -0
  88. package/dist/native-instance-registry.js +105 -0
  89. package/dist/native-instance-registry.js.map +1 -0
  90. package/dist/native-mcp.d.ts +40 -0
  91. package/dist/native-mcp.js +278 -0
  92. package/dist/native-mcp.js.map +1 -0
  93. package/dist/native-model-catalog.d.ts +5 -0
  94. package/dist/native-model-catalog.js +76 -0
  95. package/dist/native-model-catalog.js.map +1 -0
  96. package/dist/native-pane-crash-budget.d.ts +20 -0
  97. package/dist/native-pane-crash-budget.js +60 -0
  98. package/dist/native-pane-crash-budget.js.map +1 -0
  99. package/dist/native-pane-create.d.ts +26 -0
  100. package/dist/native-pane-create.js +53 -0
  101. package/dist/native-pane-create.js.map +1 -0
  102. package/dist/native-pane-lifecycle.d.ts +65 -0
  103. package/dist/native-pane-lifecycle.js +227 -0
  104. package/dist/native-pane-lifecycle.js.map +1 -0
  105. package/dist/native-pane-manager.d.ts +58 -0
  106. package/dist/native-pane-manager.js +563 -0
  107. package/dist/native-pane-manager.js.map +1 -0
  108. package/dist/native-pane-output-log.d.ts +15 -0
  109. package/dist/native-pane-output-log.js +108 -0
  110. package/dist/native-pane-output-log.js.map +1 -0
  111. package/dist/native-pane-reconciliation.d.ts +4 -0
  112. package/dist/native-pane-reconciliation.js +40 -0
  113. package/dist/native-pane-reconciliation.js.map +1 -0
  114. package/dist/native-pane-recovery.d.ts +12 -0
  115. package/dist/native-pane-recovery.js +10 -0
  116. package/dist/native-pane-recovery.js.map +1 -0
  117. package/dist/native-pane-tools.d.ts +2 -0
  118. package/dist/native-pane-tools.js +14 -0
  119. package/dist/native-pane-tools.js.map +1 -0
  120. package/dist/needs-you-hub.d.ts +2 -0
  121. package/dist/needs-you-hub.js +1 -0
  122. package/dist/needs-you-hub.js.map +1 -1
  123. package/dist/needs-you.d.ts +12 -1
  124. package/dist/needs-you.js +8 -1
  125. package/dist/needs-you.js.map +1 -1
  126. package/dist/outbound-handlers.d.ts +16 -2
  127. package/dist/outbound-handlers.js +67 -3
  128. package/dist/outbound-handlers.js.map +1 -1
  129. package/dist/outbound-schemas.d.ts +38 -0
  130. package/dist/outbound-schemas.js +12 -0
  131. package/dist/outbound-schemas.js.map +1 -1
  132. package/dist/pane-port.d.ts +107 -0
  133. package/dist/pane-port.js +2 -0
  134. package/dist/pane-port.js.map +1 -0
  135. package/dist/runtime-api.d.ts +8 -0
  136. package/dist/runtime-api.js +96 -0
  137. package/dist/runtime-api.js.map +1 -0
  138. package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +21 -0
  139. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
  140. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +19 -0
  141. package/dist/runtime-assets/@xterm/addon-serialize/package.json +29 -0
  142. package/dist/runtime-assets/@xterm/headless/LICENSE +21 -0
  143. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +2 -0
  144. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +46 -0
  145. package/dist/runtime-assets/@xterm/headless/package.json +29 -0
  146. package/dist/runtime-assets/node-pty/CONPTY-LICENSE +21 -0
  147. package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +503 -0
  148. package/dist/runtime-assets/node-pty/LICENSE +69 -0
  149. package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +16 -0
  150. package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +47 -0
  151. package/dist/runtime-assets/node-pty/lib/index.js +52 -0
  152. package/dist/runtime-assets/node-pty/lib/interfaces.js +7 -0
  153. package/dist/runtime-assets/node-pty/lib/shared/conout.js +11 -0
  154. package/dist/runtime-assets/node-pty/lib/terminal.js +190 -0
  155. package/dist/runtime-assets/node-pty/lib/types.js +7 -0
  156. package/dist/runtime-assets/node-pty/lib/unixTerminal.js +346 -0
  157. package/dist/runtime-assets/node-pty/lib/utils.js +39 -0
  158. package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +125 -0
  159. package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +320 -0
  160. package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +199 -0
  161. package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  162. package/dist/runtime-assets/node-pty/package.json +64 -0
  163. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  164. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  165. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  166. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  167. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  168. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  169. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  170. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  171. package/dist/runtime-bundle.d.ts +17 -0
  172. package/dist/runtime-bundle.js +147 -0
  173. package/dist/runtime-bundle.js.map +1 -0
  174. package/dist/runtime-cli.d.ts +2 -0
  175. package/dist/runtime-cli.js +117 -0
  176. package/dist/runtime-cli.js.map +1 -0
  177. package/dist/runtime-client-store.d.ts +49 -0
  178. package/dist/runtime-client-store.js +292 -0
  179. package/dist/runtime-client-store.js.map +1 -0
  180. package/dist/runtime-client.d.ts +100 -0
  181. package/dist/runtime-client.js +700 -0
  182. package/dist/runtime-client.js.map +1 -0
  183. package/dist/runtime-coordinator.d.ts +82 -0
  184. package/dist/runtime-coordinator.js +864 -0
  185. package/dist/runtime-coordinator.js.map +1 -0
  186. package/dist/runtime-pane-assets.d.ts +17 -0
  187. package/dist/runtime-pane-assets.js +23 -0
  188. package/dist/runtime-pane-assets.js.map +1 -0
  189. package/dist/runtime-pane-boot.d.ts +2 -0
  190. package/dist/runtime-pane-boot.js +24 -0
  191. package/dist/runtime-pane-boot.js.map +1 -0
  192. package/dist/runtime-pane-codex-index.d.ts +1 -0
  193. package/dist/runtime-pane-codex-index.js +47 -0
  194. package/dist/runtime-pane-codex-index.js.map +1 -0
  195. package/dist/runtime-pane-config.d.ts +16 -0
  196. package/dist/runtime-pane-config.js +54 -0
  197. package/dist/runtime-pane-config.js.map +1 -0
  198. package/dist/runtime-pane-host.d.ts +43 -0
  199. package/dist/runtime-pane-host.js +403 -0
  200. package/dist/runtime-pane-host.js.map +1 -0
  201. package/dist/runtime-pane-job-owner.d.ts +1 -0
  202. package/dist/runtime-pane-job-owner.js +29 -0
  203. package/dist/runtime-pane-job-owner.js.map +1 -0
  204. package/dist/runtime-pane-job.ps1 +116 -0
  205. package/dist/runtime-pane-link.d.ts +40 -0
  206. package/dist/runtime-pane-link.js +246 -0
  207. package/dist/runtime-pane-link.js.map +1 -0
  208. package/dist/runtime-pane-mcp-protocol.d.ts +32 -0
  209. package/dist/runtime-pane-mcp-protocol.js +39 -0
  210. package/dist/runtime-pane-mcp-protocol.js.map +1 -0
  211. package/dist/runtime-pane-mcp-relay.d.ts +17 -0
  212. package/dist/runtime-pane-mcp-relay.js +70 -0
  213. package/dist/runtime-pane-mcp-relay.js.map +1 -0
  214. package/dist/runtime-pane-mcp.d.ts +43 -0
  215. package/dist/runtime-pane-mcp.js +137 -0
  216. package/dist/runtime-pane-mcp.js.map +1 -0
  217. package/dist/runtime-pane-native.d.ts +45 -0
  218. package/dist/runtime-pane-native.js +65 -0
  219. package/dist/runtime-pane-native.js.map +1 -0
  220. package/dist/runtime-pane-output.d.ts +19 -0
  221. package/dist/runtime-pane-output.js +53 -0
  222. package/dist/runtime-pane-output.js.map +1 -0
  223. package/dist/runtime-pane-port.d.ts +134 -0
  224. package/dist/runtime-pane-port.js +537 -0
  225. package/dist/runtime-pane-port.js.map +1 -0
  226. package/dist/runtime-pane-private.d.ts +14 -0
  227. package/dist/runtime-pane-private.js +51 -0
  228. package/dist/runtime-pane-private.js.map +1 -0
  229. package/dist/runtime-pane-private.ps1 +14 -0
  230. package/dist/runtime-pane-process.d.ts +4 -0
  231. package/dist/runtime-pane-process.js +108 -0
  232. package/dist/runtime-pane-process.js.map +1 -0
  233. package/dist/runtime-pane-protocol.d.ts +169 -0
  234. package/dist/runtime-pane-protocol.js +189 -0
  235. package/dist/runtime-pane-protocol.js.map +1 -0
  236. package/dist/runtime-pane-screen.d.ts +19 -0
  237. package/dist/runtime-pane-screen.js +76 -0
  238. package/dist/runtime-pane-screen.js.map +1 -0
  239. package/dist/runtime-pane-service.d.ts +11 -0
  240. package/dist/runtime-pane-service.js +221 -0
  241. package/dist/runtime-pane-service.js.map +1 -0
  242. package/dist/runtime-pane-stdio-protocol.d.ts +54 -0
  243. package/dist/runtime-pane-stdio-protocol.js +94 -0
  244. package/dist/runtime-pane-stdio-protocol.js.map +1 -0
  245. package/dist/runtime-pane-stdio.d.ts +3 -0
  246. package/dist/runtime-pane-stdio.js +123 -0
  247. package/dist/runtime-pane-stdio.js.map +1 -0
  248. package/dist/runtime-pane-store.d.ts +33 -0
  249. package/dist/runtime-pane-store.js +164 -0
  250. package/dist/runtime-pane-store.js.map +1 -0
  251. package/dist/runtime-pane-transcript-protocol.d.ts +43 -0
  252. package/dist/runtime-pane-transcript-protocol.js +58 -0
  253. package/dist/runtime-pane-transcript-protocol.js.map +1 -0
  254. package/dist/runtime-pane-transcript.d.ts +45 -0
  255. package/dist/runtime-pane-transcript.js +605 -0
  256. package/dist/runtime-pane-transcript.js.map +1 -0
  257. package/dist/runtime-pane-worker.d.ts +1 -0
  258. package/dist/runtime-pane-worker.js +154 -0
  259. package/dist/runtime-pane-worker.js.map +1 -0
  260. package/dist/runtime-protocol.d.ts +149 -0
  261. package/dist/runtime-protocol.js +19 -0
  262. package/dist/runtime-protocol.js.map +1 -0
  263. package/dist/runtime-switches.d.ts +79 -0
  264. package/dist/runtime-switches.js +90 -0
  265. package/dist/runtime-switches.js.map +1 -0
  266. package/dist/runtime-transcript-delta-reader.d.ts +23 -0
  267. package/dist/runtime-transcript-delta-reader.js +74 -0
  268. package/dist/runtime-transcript-delta-reader.js.map +1 -0
  269. package/dist/runtime-transcript-source.d.ts +36 -0
  270. package/dist/runtime-transcript-source.js +189 -0
  271. package/dist/runtime-transcript-source.js.map +1 -0
  272. package/dist/runtime-windows-bridge.d.ts +41 -0
  273. package/dist/runtime-windows-bridge.js +157 -0
  274. package/dist/runtime-windows-bridge.js.map +1 -0
  275. package/dist/settings-api.js +58 -0
  276. package/dist/settings-api.js.map +1 -1
  277. package/dist/settings-change.js +28 -0
  278. package/dist/settings-change.js.map +1 -1
  279. package/dist/settings-confirmation.d.ts +15 -1
  280. package/dist/settings-confirmation.js +46 -9
  281. package/dist/settings-confirmation.js.map +1 -1
  282. package/dist/settings-effect.js +23 -1
  283. package/dist/settings-effect.js.map +1 -1
  284. package/dist/settings-http-confirmation.js +11 -2
  285. package/dist/settings-http-confirmation.js.map +1 -1
  286. package/dist/tmux-control.d.ts +2 -1
  287. package/dist/tmux-control.js.map +1 -1
  288. package/dist/tmux-manager.d.ts +2 -1
  289. package/dist/tmux-manager.js.map +1 -1
  290. package/dist/tmux-pane-host.d.ts +26 -0
  291. package/dist/tmux-pane-host.js +25 -0
  292. package/dist/tmux-pane-host.js.map +1 -0
  293. package/dist/topic-commands.js +3 -0
  294. package/dist/topic-commands.js.map +1 -1
  295. package/dist/transcript-delta-reader.d.ts +1 -1
  296. package/dist/transcript-delta-reader.js +1 -1
  297. package/dist/transcript-delta-reader.js.map +1 -1
  298. package/dist/transcript-monitor.d.ts +3 -0
  299. package/dist/transcript-monitor.js +22 -46
  300. package/dist/transcript-monitor.js.map +1 -1
  301. package/dist/transcript-needles.d.ts +35 -0
  302. package/dist/transcript-needles.js +158 -0
  303. package/dist/transcript-needles.js.map +1 -0
  304. package/dist/transcript-records.d.ts +21 -0
  305. package/dist/transcript-records.js +140 -0
  306. package/dist/transcript-records.js.map +1 -0
  307. package/dist/transcript-sources.d.ts +5 -0
  308. package/dist/transcript-sources.js +8 -79
  309. package/dist/transcript-sources.js.map +1 -1
  310. package/dist/types.d.ts +21 -0
  311. package/dist/ui/agent-proposals.js +90 -0
  312. package/dist/ui/agent-runtime.js +106 -0
  313. package/dist/ui/chat-store.js +13 -2
  314. package/dist/ui/chat-strings.js +48 -0
  315. package/dist/ui/cli-picker.js +42 -0
  316. package/dist/ui/native-instance-settings.js +47 -0
  317. package/dist/ui/native-pane-recovery.js +45 -0
  318. package/dist/ui/panel-chat.js +61 -32
  319. package/dist/ui/panel-details.js +2 -1
  320. package/dist/ui/panel-fleet.js +99 -18
  321. package/dist/ui/panel-needs.js +152 -3
  322. package/dist/ui/panel-runtimes.js +231 -0
  323. package/dist/ui/panel-settings.js +14 -8
  324. package/dist/ui/panel-windows-agent.js +86 -0
  325. package/dist/ui/panel-windows-cli.js +143 -0
  326. package/dist/ui/provider-marks.js +83 -0
  327. package/dist/ui/runtime-catalog.js +55 -0
  328. package/dist/ui/settings-catalog.js +37 -10
  329. package/dist/ui/settings-confirm.js +3 -1
  330. package/dist/ui/settings-dialogs.js +14 -5
  331. package/dist/ui/settings-registry.js +5 -0
  332. package/dist/ui/settings-strings.js +14 -0
  333. package/dist/ui/shared/app-i18n.js +2 -2
  334. package/dist/ui/shared/app-route.js +6 -2
  335. package/dist/ui/shared/app-shell.js +3 -2
  336. package/dist/ui/shared/app-store.js +1 -0
  337. package/dist/ui/shared/app-stream.js +3 -1
  338. package/dist/ui/shared/app.css +301 -0
  339. package/dist/ui/shared/app.js +4 -0
  340. package/dist/ui/shared/header-tools.js +6 -4
  341. package/dist/ui/shared/instance-nav.js +20 -4
  342. package/dist/ui/shared/instance-switch.js +4 -3
  343. package/dist/ui/shared/ui-menu.js +28 -8
  344. package/dist/ui/shared/view-strings.js +6 -0
  345. package/dist/ui/windows-agents-nav.js +2 -0
  346. package/dist/ui/windows-cli-catalog.js +79 -0
  347. package/dist/update-check.d.ts +8 -2
  348. package/dist/update-check.js +5 -2
  349. package/dist/update-check.js.map +1 -1
  350. package/dist/web-api.d.ts +25 -0
  351. package/dist/web-api.js +171 -6
  352. package/dist/web-api.js.map +1 -1
  353. package/dist/web-chat-history.d.ts +19 -2
  354. package/dist/web-chat-history.js +72 -3
  355. package/dist/web-chat-history.js.map +1 -1
  356. package/dist/web-shell-routes.d.ts +4 -1
  357. package/dist/web-shell-routes.js +7 -2
  358. package/dist/web-shell-routes.js.map +1 -1
  359. package/dist/windows-agents.d.ts +112 -0
  360. package/dist/windows-agents.js +463 -0
  361. package/dist/windows-agents.js.map +1 -0
  362. package/dist/windows-cli-api.d.ts +23 -0
  363. package/dist/windows-cli-api.js +158 -0
  364. package/dist/windows-cli-api.js.map +1 -0
  365. package/dist/windows-cli-providers.d.ts +115 -0
  366. package/dist/windows-cli-providers.js +429 -0
  367. package/dist/windows-cli-providers.js.map +1 -0
  368. package/dist/windows-cli-worker.d.ts +58 -0
  369. package/dist/windows-cli-worker.js +479 -0
  370. package/dist/windows-cli-worker.js.map +1 -0
  371. package/dist/windows-cli.d.ts +115 -0
  372. package/dist/windows-cli.js +402 -0
  373. package/dist/windows-cli.js.map +1 -0
  374. package/dist/windows-native-mcp.d.ts +19 -0
  375. package/dist/windows-native-mcp.js +143 -0
  376. package/dist/windows-native-mcp.js.map +1 -0
  377. package/dist/windows-pane-mcp.d.ts +26 -0
  378. package/dist/windows-pane-mcp.js +187 -0
  379. package/dist/windows-pane-mcp.js.map +1 -0
  380. package/package.json +9 -3
  381. package/templates/runtime-assets/conpty-LICENSE +21 -0
  382. package/templates/runtime-assets/conpty-NOTICE.md +503 -0
  383. package/templates/runtime-assets/local-pane-stage.ps1 +101 -0
  384. package/templates/runtime-assets/runtime-pane-job.ps1 +116 -0
  385. package/templates/runtime-assets/runtime-pane-private.ps1 +14 -0
  386. package/templates/runtime-assets/xterm-LICENSE +21 -0
@@ -259,6 +259,11 @@ register("settings", {
259
259
  backendNotInstalled: "not installed", backendNotSignedIn: "not signed in (use /login)", backendTooOld: "needs {0} or newer", backendUnchecked: "not checked yet",
260
260
  modelNotListed: "current — not in this CLI's list", modelOther: "Other…", modelOtherLabel: "Model name", modelOtherPlaceholder: "a model name this CLI accepts",
261
261
  modelNone: "— none —", inheritValue: "inherit ({0})", modelCliDefault: "the CLI's own default",
262
+ modelCatalogLoading: "Loading this CLI's models…", modelCatalogFailed: "Could not load models. Keep the default or enter a model name.",
263
+ modelCatalogEmpty: "No model list is available. Use the default or enter a model name.",
264
+ modelCatalogCliList: "Source: CLI model listing.", modelCatalogCliCache: "Source: local CLI model cache.",
265
+ modelCatalogOfficial: "Source: official candidate list. Availability depends on your account and provider.",
266
+ modelCatalogCached: "Source: AgEnD's cached CLI/account model list.", modelCatalogRetry: "Retry", modelCatalogRefresh: "Refresh models",
262
267
  readyApply: "Ready to apply",
263
268
  copied: "Copied",
264
269
  expectedMapping: "expected a mapping",
@@ -284,6 +289,8 @@ register("settings", {
284
289
  syncedPublicLink: "On the public link these are read-only: a change here stays in this browser.",
285
290
  deviceTitle: "This device only", deviceLead: "The tour, text size, view fit, the sidebar shown or hidden, panel widths and desktop notifications stay on each device.",
286
291
  sec_agents: "Agents",
292
+ "sec_windows-cli": "Windows CLI",
293
+ sec_runtimes: "Runtime",
287
294
  "sec_agent-defaults": "Agent defaults", sec_chat: "Chat & connections", "sec_web-dashboard": "Web dashboard", sec_access: "Access & security",
288
295
  sec_advanced: "Advanced", sec_look: "Look", grp_you: "You", grp_fleet: "Fleet",
289
296
  classicDefaultsTitle: "ClassicBot defaults", publicLinkTitle: "Public link & fixed address", webDashboardTitle: "Dashboard features", webSettingsLabel: "Web settings",
@@ -916,6 +923,11 @@ register("settings", {
916
923
  backendNotInstalled: "未安裝", backendNotSignedIn: "未登入(請用 /login)", backendTooOld: "需要 {0} 以上版本", backendUnchecked: "尚未檢查",
917
924
  modelNotListed: "目前使用中 — 不在這個 CLI 的清單裡", modelOther: "其他…", modelOtherLabel: "模型名稱", modelOtherPlaceholder: "這個 CLI 接受的模型名稱",
918
925
  modelNone: "— 無 —", inheritValue: "沿用({0})", modelCliDefault: "CLI 自己的預設",
926
+ modelCatalogLoading: "正在載入這個 CLI 的模型…", modelCatalogFailed: "模型清單載入失敗,可先使用預設或輸入模型名稱。",
927
+ modelCatalogEmpty: "目前沒有可讀取的模型清單,可使用預設或輸入模型名稱。",
928
+ modelCatalogCliList: "來源:CLI 列舉結果。", modelCatalogCliCache: "來源:本機 CLI 模型快取。",
929
+ modelCatalogOfficial: "來源:官方候選清單,實際可用性依帳戶與服務設定。",
930
+ modelCatalogCached: "來源:AgEnD 已快取的 CLI/帳號模型清單。", modelCatalogRetry: "重試", modelCatalogRefresh: "更新模型",
919
931
  readyApply: "可套用變更",
920
932
  copied: "已複製",
921
933
  expectedMapping: "預期為 mapping",
@@ -941,6 +953,8 @@ register("settings", {
941
953
  syncedPublicLink: "公開連結只能讀取這些設定:在這裡變更只會留在這個瀏覽器。",
942
954
  deviceTitle: "只限這台裝置", deviceLead: "導覽、文字大小、視圖寬度、側欄顯示或隱藏、面板寬度與桌面通知,每台裝置各自保留。",
943
955
  sec_agents: "Agent",
956
+ "sec_windows-cli": "Windows CLI",
957
+ sec_runtimes: "Runtime",
944
958
  "sec_agent-defaults": "Agent 預設值", sec_chat: "聊天與連線", "sec_web-dashboard": "網頁儀表板", sec_access: "存取與安全",
945
959
  sec_advanced: "進階", sec_look: "外觀", grp_you: "你自己", grp_fleet: "整個 Fleet",
946
960
  classicDefaultsTitle: "ClassicBot 預設值", publicLinkTitle: "公開連結與固定網址", webDashboardTitle: "儀表板功能", webSettingsLabel: "網頁設定",
@@ -111,7 +111,7 @@ register("app", {
111
111
  confirmTitle: "Please confirm", confirmOk: "Continue", cancel: "Cancel",
112
112
  sidePanelLeave: "Leave {0} without saving? Your changes there will be lost.", sidePanelDiscard: "Discard changes",
113
113
  // The server's own wording (src/locale.ts needs.reason.*), so the web says what Discord says.
114
- needs_reason_hang: "Not responding", needs_reason_exited: "Exited", needs_reason_assist: "Waiting at its terminal", needs_reason_question: "Asking you a question", needs_reason_permission: "Permission needed", needs_reason_dangerous_command: "Dangerous command waiting", needs_reason_login: "Sign-in needed", needs_reason_dialog: "Waiting at a dialog", needs_reason_terminal_input: "May be waiting for input", needs_reason_auth_paused: "Paused: sign-in needed", needs_reason_backend_signin: "Backend sign-in needed", needs_reason_config_invalid: "Configuration file needs attention", needs_reason_config_fallback: "Running on stored configuration", config_history_edit: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. The next restart would use the stored valid copy from {4}. Correct the YAML error; the file has not been changed by AgEnD.", config_history_no_history: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. No stored valid copy is available, so the next restart cannot recover automatically. Correct the YAML error before restarting; the file has not been changed by AgEnD.", config_history_fallback: "{0}, line {1}, column {2}: {3}. AgEnD started using the stored valid copy from {4}. Correct the YAML error and reload the settings. The file on disk has not been changed by AgEnD.", needs_reason_crashed: "Crashed", needs_reason_usage_limit: "Usage limit reached · reset time unknown", needs_reason_delivery_uncertain: "Could not confirm delivery", needs_reason_delivery_failed: "Delivery failed", needs_reason_task_review: "Waiting for your confirmation", needs_reason_task_blocked: "Blocked: asks you",
114
+ needs_reason_hang: "Not responding", needs_reason_exited: "Exited", needs_reason_assist: "Waiting at its terminal", needs_reason_question: "Asking you a question", needs_reason_permission: "Permission needed", needs_reason_dangerous_command: "Dangerous command waiting", needs_reason_login: "Sign-in needed", needs_reason_dialog: "Waiting at a dialog", needs_reason_terminal_input: "May be waiting for input", needs_reason_auth_paused: "Paused: sign-in needed", needs_reason_backend_signin: "Backend sign-in needed", needs_reason_config_invalid: "Configuration file needs attention", needs_reason_config_fallback: "Running on stored configuration", config_history_edit: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. The next restart would use the stored valid copy from {4}. Correct the YAML error; the file has not been changed by AgEnD.", config_history_no_history: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. No stored valid copy is available, so the next restart cannot recover automatically. Correct the YAML error before restarting; the file has not been changed by AgEnD.", config_history_fallback: "{0}, line {1}, column {2}: {3}. AgEnD started using the stored valid copy from {4}. Correct the YAML error and reload the settings. The file on disk has not been changed by AgEnD.", needs_reason_native_pane_hold: "Windows agent needs attention", needs_reason_crashed: "Crashed", needs_reason_usage_limit: "Usage limit reached · reset time unknown", needs_reason_delivery_uncertain: "Could not confirm delivery", needs_reason_delivery_failed: "Delivery failed", needs_reason_task_review: "Waiting for your confirmation", needs_reason_task_blocked: "Blocked: asks you",
115
115
  },
116
116
  "zh-TW": {
117
117
  brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet 概覽", view: "檢視", settings: "設定", instances: "Instances", newInstance: "新增 instance", newAgent: "新增 Agent",
@@ -156,6 +156,6 @@ register("app", {
156
156
  search: "搜尋", searchTitle: "搜尋聊天、agent 之間的訊息與任務({0})",
157
157
  confirmTitle: "請確認", confirmOk: "繼續", cancel: "取消",
158
158
  sidePanelLeave: "不儲存就離開「{0}」?你在那裡的修改會遺失。", sidePanelDiscard: "捨棄修改",
159
- needs_reason_hang: "沒有回應", needs_reason_exited: "已結束", needs_reason_assist: "在終端機上等待", needs_reason_question: "正在問你問題", needs_reason_permission: "需要權限", needs_reason_dangerous_command: "危險指令待確認", needs_reason_login: "需要登入", needs_reason_dialog: "停在對話框", needs_reason_terminal_input: "可能在等輸入", needs_reason_auth_paused: "已暫停:需要登入", needs_reason_backend_signin: "後端需要登入", needs_reason_config_invalid: "設定檔需要處理", needs_reason_config_fallback: "正在使用儲存的設定副本", config_history_edit: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。下次重新啟動會改用 {4} 儲存的有效副本。請修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_no_history: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。沒有可用的有效副本,下次重新啟動將無法自動恢復。請在重新啟動前修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_fallback: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 已使用 {4} 儲存的有效副本啟動。請修正 YAML 錯誤並重新載入設定。AgEnD 未更動磁碟上的檔案。", needs_reason_crashed: "已崩潰", needs_reason_usage_limit: "用量已達上限 · 恢復時間未知", needs_reason_delivery_uncertain: "無法確認是否送達", needs_reason_delivery_failed: "傳送失敗", needs_reason_task_review: "等你確認", needs_reason_task_blocked: "卡住,在問你",
159
+ needs_reason_hang: "沒有回應", needs_reason_exited: "已結束", needs_reason_assist: "在終端機上等待", needs_reason_question: "正在問你問題", needs_reason_permission: "需要權限", needs_reason_dangerous_command: "危險指令待確認", needs_reason_login: "需要登入", needs_reason_dialog: "停在對話框", needs_reason_terminal_input: "可能在等輸入", needs_reason_auth_paused: "已暫停:需要登入", needs_reason_backend_signin: "後端需要登入", needs_reason_config_invalid: "設定檔需要處理", needs_reason_config_fallback: "正在使用儲存的設定副本", config_history_edit: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。下次重新啟動會改用 {4} 儲存的有效副本。請修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_no_history: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。沒有可用的有效副本,下次重新啟動將無法自動恢復。請在重新啟動前修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_fallback: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 已使用 {4} 儲存的有效副本啟動。請修正 YAML 錯誤並重新載入設定。AgEnD 未更動磁碟上的檔案。", needs_reason_native_pane_hold: "Windows 代理需要處理", needs_reason_crashed: "已崩潰", needs_reason_usage_limit: "用量已達上限 · 恢復時間未知", needs_reason_delivery_uncertain: "無法確認是否送達", needs_reason_delivery_failed: "傳送失敗", needs_reason_task_review: "等你確認", needs_reason_task_blocked: "卡住,在問你",
160
160
  },
161
161
  });
@@ -6,11 +6,11 @@ export const FLEET_TABS = ["tasks", "schedules", "teams", "org", "cache", "usage
6
6
  // #2347: two groups — "You" changes only you or this browser; "Fleet" changes AgEnD for everyone.
7
7
  export const SETTINGS_GROUPS = Object.freeze([
8
8
  Object.freeze({ id: "you", sections: Object.freeze(["preferences", "look"]) }),
9
- Object.freeze({ id: "fleet", sections: Object.freeze(["agents", "agent-defaults", "chat", "web-dashboard", "access", "advanced"]) }),
9
+ Object.freeze({ id: "fleet", sections: Object.freeze(["agents", "runtimes", "agent-defaults", "chat", "web-dashboard", "access", "advanced"]) }),
10
10
  ]);
11
11
  export const SETTINGS_SECTIONS = Object.freeze(SETTINGS_GROUPS.flatMap((g) => g.sections));
12
12
  /** #2347: the sections' names before the regrouping (links and bookmarks keep working) and where each one went. */
13
- export const LEGACY_SETTINGS = Object.freeze({ device: "preferences", appearance: "look", general: "agent-defaults", bots: "chat", classic: "chat#classicbot", web: "access" });
13
+ export const LEGACY_SETTINGS = Object.freeze({ device: "preferences", appearance: "look", general: "agent-defaults", bots: "chat", classic: "chat#classicbot", web: "access", "windows-cli":"runtimes" });
14
14
  const legacySection = (name) => (Object.prototype.hasOwnProperty.call(LEGACY_SETTINGS, name) ? LEGACY_SETTINGS[name] : null);
15
15
  const MAX_INSTANCE_NAME = 128;
16
16
  const PATH_SEPARATOR_OR_CONTROL = /[/\\\u0000-\u001f\u007f]/;
@@ -28,6 +28,9 @@ export function isSafeInstanceName(name) {
28
28
  */
29
29
  export function parseRoute(pathname) {
30
30
  if (pathname === "/ui") return { panel: "chat", instance: null };
31
+ if (pathname === "/ui/windows-cli") return { panel: "settings", section: "runtimes" };
32
+ const windowsAgent = /^\/ui\/windows-agents\/([a-f0-9-]{36})$/i.exec(pathname);
33
+ if (windowsAgent) return { panel: "windows-agent", instance: windowsAgent[1] };
31
34
  if (pathname === "/ui/fleet") return { panel: "fleet", tab: "tasks" };
32
35
  if (pathname === "/ui/needs") return { panel: "needs" };
33
36
  if (pathname === NOTICES_PATH) return { panel: "notices" }; // #2910 D2: a web-only fleet's Notices
@@ -108,6 +111,7 @@ export function legacySettingsTarget(pathname) {
108
111
  }
109
112
  export function routePath(route) {
110
113
  if (!route) return "/ui";
114
+ if (route.panel === "windows-agent") return `/ui/windows-agents/${route.instance}`;
111
115
  if (route.panel === "fleet") return fleetPath(route.tab);
112
116
  if (route.panel === "settings") return settingsPath(route.section);
113
117
  if (route.panel === "needs") return NEEDS_PATH;
@@ -331,7 +331,8 @@ function Sidebar({ route, onNewInstance, viewOnly }) {
331
331
  const navLink = (panel, href, icon, label, count = 0, countText = "app.needsCount") => html`<a class=${`side-row${on(panel) ? " active" : ""}`} href=${href}
332
332
  aria-current=${on(panel) ? "page" : undefined} aria-label=${count ? `${label} (${t(countText, count)})` : undefined} onClick=${closeDrawer}>
333
333
  <${Icon} name=${icon} /><span class="grow">${label}</span>${count ? html`<span class="nav-count" aria-hidden="true">${count}</span>` : null}</a>`;
334
- const needsCount = Array.isArray(app.needs) ? app.needs.length : 0;
334
+ // alpha.2 (M-2300): an agent's request waiting for this web-only fleet's owner counts too (only the owner's page has any).
335
+ const needsCount = (Array.isArray(app.needs) ? app.needs.length : 0) + (Array.isArray(app.proposals) ? app.proposals.length : 0);
335
336
  // View-only (an anonymous reader, #1408 §3): View and a way to sign in — nothing that needs a session is rendered.
336
337
  if (viewOnly) {
337
338
  return html`<aside id="sidebar" class="sidebar" aria-label=${t("app.menu")}>
@@ -502,7 +503,7 @@ function BottomTabs({ route, viewOnly }) {
502
503
  // last tab), Settings.
503
504
  return html`<nav data-trust="navigation" class="tabs" aria-label=${t("app.menu")}>
504
505
  ${tab(chatHref, "chat", t("app.chat"), !!open || (!!route && route.panel === "chat"), anyAwaiting)}
505
- ${tab(NEEDS_PATH, "inbox", t("app.needsTab"), route && route.panel === "needs", (app.needs || []).length, t("app.needsCount", (app.needs || []).length))}
506
+ ${tab(NEEDS_PATH, "inbox", t("app.needsTab"), route && route.panel === "needs", (app.needs || []).length + (app.proposals || []).length, t("app.needsCount", (app.needs || []).length + (app.proposals || []).length))}
506
507
  ${tab(fleetEntryPath(route), "fleet", t("app.fleet"), route && route.panel === "fleet")}
507
508
  ${tab(settingsPath(), "settings", t("app.settings"), route && route.panel === "settings")}
508
509
  </nav>`;
@@ -56,6 +56,7 @@ export function applyStatus(d) {
56
56
  appStore.set({ ready: true, instances: d.instances, uptime: d.uptime ?? 0, exec, awaiting,
57
57
  startup: d.startup?.phase === "starting" ? d.startup : null,
58
58
  connections: typeof d.connections === "number" ? d.connections : null,
59
+ windowsCli: d.windows_cli === true,
59
60
  // #1665: the host preferences' revision (app-prefs.js re-reads them when it moves).
60
61
  prefsRev: typeof d.prefs_rev === "number" ? d.prefs_rev : null,
61
62
  // #1629: the agents' themes' revision (app-themes.js re-reads them when it moves).
@@ -36,11 +36,13 @@
36
36
  // #1918: traffic — a message between instances moved; delegation — a task opened, or its report closed it (SSE only: the
37
37
  // org canvas reads /ui/traffic when it has no stream).
38
38
  // #2233: backend_login — a dashboard sign-in started, moved or ended (no details: the page reads its own view).
39
+ // alpha.2 (M-2300): agent_proposals — an agent's Windows request came or was decided (no details: a web-only fleet's
40
+ // owner reads GET /ui/agent-proposals).
39
41
  // tasks — the task board changed: the card numbers a write touched (SSE only: the board reads again when it is shown).
40
42
  // offices — the stored offices changed ({ rev }; SSE only: the Office view reads /ui/offices again).
41
43
  // office_skins — a skin pack was uploaded or deleted ({ rev }; SSE only: the Office view reads /ui/office-skins again).
42
44
  // office_acts — the agents' live acts in the Office view changed ({ acts }, #2578; a poll page reads /ui/office-acts).
43
- const EVENTS = ["status", "message", "agent_reply_live", "delivery", "deliveries", "prompt", "prompts", "prompt_resolved", "activity", "needs", "reply_buttons", "reactions", "steps_tick", "clock", "traffic", "delegation", "backend_login", "tasks", "offices", "office_skins", "office_acts", "office_pack_changes", "notice"];
45
+ const EVENTS = ["status", "message", "agent_reply_live", "delivery", "deliveries", "prompt", "prompts", "prompt_resolved", "activity", "needs", "reply_buttons", "reactions", "steps_tick", "clock", "traffic", "delegation", "backend_login", "tasks", "offices", "office_skins", "office_acts", "office_pack_changes", "agent_proposals", "notice"];
44
46
  const MAX_HELD = 1000; // live events held during one catch-up read; more → read again afterwards
45
47
  const RETRY_DELAYS = [1000, 2000, 4000]; // after the first failed catch-up read; then it waits for Retry
46
48
  const POLL_LIMIT_MS = 10000; // a poll that has not answered by then counts as failed
@@ -285,6 +285,14 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
285
285
  .panel-title { flex: 1; min-width: 0; display: flex; align-items: center; gap: var(--s-3); min-height: calc(var(--header-h) - 2 * var(--s-1)); }
286
286
  .panel-title h1 { font-size: var(--fs-lg); line-height: var(--lh-lg); font-weight: var(--fw-semibold); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; outline: none; }
287
287
  .panel-sub { color: var(--text-2); font-size: var(--fs-sm); white-space: nowrap; }
288
+ /* S-30: on a phone the chat's state and chips (Windows, computer, model…) left the agent's name two letters. There the
289
+ header keeps the name (at least ~10 characters) and the state ("idle", "閒置"); the chips are on the sidebar row and
290
+ in Details. */
291
+ @media (max-width: 479px) {
292
+ .p-chat .panel-title h1 { flex: 0 1 auto; min-width: min(10ch, 45%); }
293
+ .p-chat .panel-sub { flex: 0 0 auto; }
294
+ .p-chat .panel-sub > :not(.status) { display: none; }
295
+ }
288
296
  .status { display: inline-flex; align-items: center; gap: 6px; }
289
297
  /* #2015: the largest processes, after the host memory chip's text. */
290
298
  .host-mem-top { margin-left: var(--s-2); opacity: 0.8; overflow-wrap: anywhere; }
@@ -425,6 +433,9 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
425
433
  /* #2072: a model field — the list, and the text box "Other…" opens under it. */
426
434
  .model-pick { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
427
435
  .model-pick > select, .model-pick > input { width: 100%; }
436
+ .model-catalog-status { display: flex; gap: var(--s-2); align-items: center; justify-content: space-between; }
437
+ .model-catalog-status > .note { line-height: 1.5; }
438
+ .model-catalog-status > button { flex-shrink: 0; }
428
439
  .note { font-size: var(--fs-xs); color: var(--text-3); }
429
440
  .checks { display: flex; flex-direction: column; gap: var(--s-1); max-height: 180px; overflow-y: auto; }
430
441
  .check { display: flex; gap: var(--s-2); align-items: center; font-size: var(--fs-sm); }
@@ -936,6 +947,8 @@ img.amb-p { object-fit: contain; }
936
947
  .failed-send { padding: var(--s-2) var(--s-3); border-radius: var(--r-md); font-size: var(--fs-xs); background: var(--danger-bg); border: 1px solid var(--danger-line); display: flex; gap: var(--s-2); align-items: center; flex-wrap: wrap; }
937
948
  .failed-send .txt { flex: 1; min-width: 120px; white-space: pre-wrap; overflow-wrap: anywhere; max-height: 4.5em; overflow: hidden; }
938
949
  .composer-box { background: var(--surface); border-radius: var(--r-xl); box-shadow: var(--shadow-1); }
950
+ /* S-30: a state note above the composer ("Connection revoked…", "still working") sat flush on the box's edge. */
951
+ .composer-box > .note { margin: 0; padding: var(--s-2) var(--s-3) 0; }
939
952
  .composer-box:focus-within { box-shadow: 0 0 0 1px var(--border-strong), var(--shadow-1); }
940
953
  .composer { display: flex; align-items: flex-end; gap: var(--s-1); padding: var(--s-2); }
941
954
  .composer textarea {
@@ -2658,3 +2671,291 @@ html.oo-immersive .p-fleet > .panel-body { z-index: 50; }
2658
2671
  .os-none { margin: 0; }
2659
2672
  .os-form .os-err { grid-column: 1 / -1; margin: 0; padding: var(--s-2) var(--s-3); border: 1px solid var(--danger); border-radius: var(--r-sm); }
2660
2673
  @media (max-width: 480px) { .os-form { grid-template-columns: 1fr; } }
2674
+ /* Windows CLI preview: local providers, a task composer and a compact execution history. */
2675
+ .p-windows-cli .windows-cli-content { width: 100%; max-width: 1160px; margin: 0 auto; padding: 28px 28px 48px; }
2676
+ .p-windows-cli .windows-cli-intro { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-bottom: 24px; }
2677
+ .p-windows-cli .windows-cli-eyebrow { display: inline-flex; align-items: center; gap: 6px; color: var(--text-2); font-size: 11px; font-weight: 600; letter-spacing: .06em; }
2678
+ .p-windows-cli .windows-cli-intro h2 { margin-top: 7px; font-size: 26px; font-weight: 600; line-height: 1.3; letter-spacing: -.04em; }
2679
+ .p-windows-cli .windows-cli-intro p { margin-top: 7px; font-size: 13px; color: var(--text-2); line-height: 1.7; }
2680
+ .p-windows-cli .windows-cli-probe { flex-shrink: 0; min-height: 38px; border-radius: 9px; }
2681
+ .p-windows-cli .windows-cli-cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin-bottom: 24px; }
2682
+ .p-windows-cli .windows-cli-provider { min-width: 0; padding: 20px 20px 0; border: 1px solid var(--border); border-radius: 14px; background: var(--bg); }
2683
+ .p-windows-cli .windows-cli-provider-head { display: flex; align-items: center; gap: 12px; }
2684
+ .p-windows-cli .windows-cli-brand { width: 48px; height: 48px; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; border-radius: 12px; }
2685
+ .p-windows-cli .brand-openai { color: #fff; background: #141413; }
2686
+ .p-windows-cli .brand-anthropic { color: #141413; background: #f0e9df; }
2687
+ .p-windows-cli .windows-cli-provider-name { flex: 1; min-width: 0; }
2688
+ .p-windows-cli .windows-cli-provider-name > span { font-size: 11px; color: var(--text-2); }
2689
+ .p-windows-cli .windows-cli-provider-name h3 { font-size: 18px; line-height: 1.4; font-weight: 600; letter-spacing: -.025em; }
2690
+ .p-windows-cli .windows-cli-badge { display: inline-flex; align-items: center; flex-shrink: 0; padding: 3px 8px; border-radius: 6px; font-size: 11px; font-weight: 600; }
2691
+ .p-windows-cli .tone-ready { color: var(--ok); }
2692
+ .p-windows-cli .tone-neutral { color: var(--text-2); }
2693
+ .p-windows-cli .tone-failed { color: var(--danger); }
2694
+ .p-windows-cli .tone-working { color: var(--accent); }
2695
+ .p-windows-cli .windows-cli-badge.tone-ready { background: var(--ok-bg); }
2696
+ .p-windows-cli .windows-cli-badge.tone-neutral { background: var(--surface); }
2697
+ .p-windows-cli .windows-cli-provider-status { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 6px 14px; margin: 17px 0 14px; font-size: 12px; }
2698
+ .p-windows-cli .windows-cli-auth, .p-windows-cli .windows-cli-readiness, .p-windows-cli .windows-cli-task-state { display: inline-flex; align-items: center; gap: 7px; }
2699
+ .p-windows-cli .windows-cli-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex-shrink: 0; }
2700
+ .p-windows-cli .windows-cli-version { color: var(--text-3); font-family: var(--font-mono); font-size: 11px; overflow-wrap: anywhere; }
2701
+ .p-windows-cli .windows-cli-location { border-top: 1px solid var(--border); }
2702
+ .p-windows-cli summary { cursor: pointer; list-style: none; }
2703
+ .p-windows-cli summary::-webkit-details-marker { display: none; }
2704
+ .p-windows-cli .windows-cli-location summary { display: flex; justify-content: space-between; align-items: center; min-height: 37px; color: var(--text-2); font-size: 11px; }
2705
+ .p-windows-cli details[open] > summary > .icon:last-child { transform: rotate(180deg); }
2706
+ .p-windows-cli .windows-cli-path { display: block; white-space: pre-wrap; overflow-wrap: anywhere; font: 11px/1.7 var(--font-mono); color: var(--text-2); }
2707
+ .p-windows-cli .windows-cli-location .windows-cli-path { padding: 0 0 12px; }
2708
+ .p-windows-cli .windows-cli-workbench { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); align-items: start; gap: 20px; }
2709
+ .p-windows-cli .windows-cli-card { min-width: 0; border: 1px solid var(--border); border-radius: 14px; background: var(--bg); }
2710
+ .p-windows-cli .windows-cli-composer { padding: 22px; }
2711
+ .p-windows-cli .windows-cli-section-head { display: flex; align-items: center; gap: 10px; margin-bottom: 22px; }
2712
+ .p-windows-cli .windows-cli-section-icon { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 34px; height: 34px; border-radius: 9px; background: var(--surface); color: var(--text-2); }
2713
+ .p-windows-cli .windows-cli-section-head > div { flex: 1; min-width: 0; }
2714
+ .p-windows-cli .windows-cli-section-head h2 { display: flex; align-items: center; gap: 7px; font-size: 15px; line-height: 1.4; font-weight: 600; letter-spacing: -.02em; }
2715
+ .p-windows-cli .windows-cli-section-head p { margin-top: 4px; color: var(--text-2); font-size: 11px; line-height: 1.6; }
2716
+ .p-windows-cli .windows-cli-field { margin-bottom: 18px; }
2717
+ .p-windows-cli .windows-cli-field > label, .p-windows-cli .windows-cli-access > legend { display: block; margin-bottom: 8px; font-size: 12px; font-weight: 600; }
2718
+ .p-windows-cli .windows-cli-field > input, .p-windows-cli .windows-cli-field > textarea { display: block; width: 100%; max-width: 100%; padding: 10px 12px; border: 1px solid var(--border-strong); border-radius: 8px; background: var(--bg); color: var(--text); font-size: var(--fs-sm); line-height: 1.6; }
2719
+ .p-windows-cli .windows-cli-field > input:focus, .p-windows-cli .windows-cli-field > textarea:focus { border-color: var(--focus); outline: none; box-shadow: 0 0 0 3px var(--accent-dim); }
2720
+ .p-windows-cli .windows-cli-field > textarea { min-height: 120px; resize: vertical; }
2721
+ .p-windows-cli .windows-cli-field .windows-cli-directory { font-family: var(--font-mono); font-size: var(--fs-xs); }
2722
+ .p-windows-cli .windows-cli-field > p { margin-top: 6px; font-size: 11px; line-height: 1.6; color: var(--text-3); }
2723
+ .p-windows-cli .windows-cli-field ::placeholder { color: var(--text-3); }
2724
+ .p-windows-cli .windows-cli-access-options { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
2725
+ .p-windows-cli .windows-cli-access-option { display: flex; align-items: flex-start; gap: 8px; padding: 11px 10px; border: 1px solid var(--border); border-radius: 9px; cursor: pointer; }
2726
+ .p-windows-cli .windows-cli-access-option.selected { background: var(--accent-dim); border-color: var(--focus); }
2727
+ .p-windows-cli .windows-cli-access-option input { margin: 3px 0 0; accent-color: var(--accent); width: 13px; height: 13px; flex-shrink: 0; }
2728
+ .p-windows-cli .windows-cli-access-option strong { display: flex; align-items: center; gap: 5px; font-size: 12px; line-height: 1.6; font-weight: 600; }
2729
+ .p-windows-cli .windows-cli-access-option small { display: block; margin-top: 3px; font-size: 10px; line-height: 1.6; color: var(--text-2); }
2730
+ .p-windows-cli .windows-cli-policy { margin-top: 14px; color: var(--text-2); font-size: 11px; }
2731
+ .p-windows-cli .windows-cli-policy summary { display: flex; align-items: center; gap: 6px; min-height: 28px; }
2732
+ .p-windows-cli .windows-cli-policy p { padding: 4px 0 10px; line-height: 1.8; }
2733
+ .p-windows-cli .windows-cli-submit { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; padding-top: 16px; margin-top: 10px; border-top: 1px solid var(--border); }
2734
+ .p-windows-cli .windows-cli-readiness { font-size: 11px; line-height: 1.6; }
2735
+ .p-windows-cli .windows-cli-submit .btn { min-height: 40px; border-radius: 8px; }
2736
+ .p-windows-cli .windows-cli-limits { display: flex; align-items: center; gap: 5px; margin-top: 10px; color: var(--text-3); font-size: 10px; line-height: 1.6; }
2737
+ .p-windows-cli .windows-cli-history { padding: 22px 20px 0; }
2738
+ .p-windows-cli .windows-cli-history .windows-cli-section-head { margin-bottom: 18px; }
2739
+ .p-windows-cli .windows-cli-history .icon-btn { width: 30px; height: 30px; }
2740
+ .p-windows-cli .windows-cli-count { color: var(--text-2); background: var(--surface); padding: 1px 6px; border-radius: 5px; font-size: 10px; font-weight: 500; }
2741
+ .p-windows-cli .windows-cli-task { margin-top: 10px; border: 1px solid var(--border); border-radius: 9px; overflow: hidden; }
2742
+ .p-windows-cli .windows-cli-task > summary { display: flex; align-items: center; gap: 10px; padding: 12px; font-size: 12px; }
2743
+ .p-windows-cli .windows-cli-task > summary:hover { background: var(--surface); }
2744
+ .p-windows-cli .windows-cli-task-state { flex: 1; font-weight: 600; }
2745
+ .p-windows-cli .windows-cli-task time { font-size: 10px; color: var(--text-3); font-variant-numeric: tabular-nums; }
2746
+ .p-windows-cli .windows-cli-task-cwd { padding: 0 12px 12px; font-size: 10px; }
2747
+ .p-windows-cli .windows-cli-task-detail { padding: 0 12px 12px; }
2748
+ .p-windows-cli .windows-cli-output-label { display: flex; align-items: center; gap: 5px; padding: 9px 10px; border-radius: 6px 6px 0 0; background: var(--code-head); color: var(--text-2); font-size: 10px; }
2749
+ .p-windows-cli .windows-cli-output { padding: 12px; margin: 0; max-height: 320px; overflow: auto; border-radius: 0 0 6px 6px; background: var(--code-bg); white-space: pre-wrap; overflow-wrap: anywhere; font: 11px/1.8 var(--font-mono); }
2750
+ .p-windows-cli .windows-cli-task-detail > .btn { margin-top: 10px; }
2751
+ .p-windows-cli .windows-cli-history-note { margin-top: 18px; padding: 12px 0; border-top: 1px solid var(--border); color: var(--text-3); text-align: center; font-size: 10px; }
2752
+ .p-windows-cli .windows-cli-empty { display: flex; flex-direction: column; align-items: center; padding: 42px 16px; text-align: center; }
2753
+ .p-windows-cli .windows-cli-empty > span { display: grid; place-items: center; width: 58px; height: 58px; border-radius: 16px; background: var(--surface); color: var(--text-3); margin-bottom: 16px; }
2754
+ .p-windows-cli .windows-cli-empty h3 { font-size: 13px; font-weight: 600; }
2755
+ .p-windows-cli .windows-cli-empty p { max-width: 220px; margin-top: 7px; font-size: 12px; line-height: 1.8; color: var(--text-3); }
2756
+ .p-windows-cli .error { white-space: pre-wrap; overflow-wrap: anywhere; color: var(--danger); font-size: 12px; }
2757
+ .p-windows-cli .windows-cli-error { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 20px; padding: 14px; border-radius: 10px; background: var(--danger-bg); }
2758
+ .p-windows-cli .windows-cli-error .icon { margin-top: 2px; }
2759
+ .p-windows-cli .windows-cli-spin { animation: windows-cli-rotate 1.4s linear infinite; }
2760
+ @keyframes windows-cli-rotate { to { transform: rotate(360deg); } }
2761
+ @media (max-width: 1130px) { .p-windows-cli .windows-cli-workbench { grid-template-columns: minmax(0, 1fr); } }
2762
+ @media (max-width: 620px) {
2763
+ .p-windows-cli .windows-cli-content { padding: 20px 16px 32px; }
2764
+ .p-windows-cli .windows-cli-intro { flex-direction: column; align-items: flex-start; gap: 14px; margin-bottom: 20px; }
2765
+ .p-windows-cli .windows-cli-intro h2 { font-size: 23px; }
2766
+ .p-windows-cli .windows-cli-cards { grid-template-columns: minmax(0, 1fr); gap: 12px; margin-bottom: 20px; }
2767
+ .p-windows-cli .windows-cli-provider { padding: 16px 16px 0; }
2768
+ .p-windows-cli .windows-cli-composer, .p-windows-cli .windows-cli-history { padding: 18px 16px; }
2769
+ .p-windows-cli .windows-cli-history { padding-bottom: 0; }
2770
+ .p-windows-cli .windows-cli-field > input, .p-windows-cli .windows-cli-field > textarea { font-size: 16px; }
2771
+ .p-windows-cli .windows-cli-submit { flex-direction: column; align-items: stretch; }
2772
+ .p-windows-cli .windows-cli-access-option { padding: 10px 8px; }
2773
+ .p-windows-cli .windows-cli-access-option strong { font-size: 11px; }
2774
+ }
2775
+ @media (prefers-reduced-motion: reduce) { .p-windows-cli .windows-cli-spin { animation: none; } }
2776
+ .p-windows-cli.windows-cli-settings .windows-cli-content { padding: 0; }
2777
+ .p-settings .col:has(> .windows-cli-settings) { max-width: 1160px; }
2778
+ .p-settings .windows-cli-settings .windows-cli-workbench { grid-template-columns: minmax(0, 1fr); }
2779
+ @media (min-width: 1500px) { .p-settings .windows-cli-settings .windows-cli-workbench { grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); } }
2780
+ /* Runtime-first agent creation and native Windows conversations. */
2781
+ .agent-runtime-picker > legend, .agent-runtime-fields > legend { font-size: 13px; font-weight: 600; margin-bottom: 12px; }
2782
+ .agent-runtime-picker > div { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 10px; }
2783
+ .agent-runtime-choice { display: flex; align-items: center; gap: 9px; padding: 14px 11px; border: 1px solid var(--border); border-radius: 10px; cursor: pointer; }
2784
+ .agent-runtime-choice.selected { border-color: var(--focus); background: var(--accent-dim); }
2785
+ .agent-runtime-choice > input { width: 13px; height: 13px; margin: 0; accent-color: var(--accent); flex-shrink: 0; }
2786
+ .agent-runtime-choice > span { min-width: 0; }
2787
+ .agent-runtime-choice strong { display: block; font-size: 12px; line-height: 1.6; }
2788
+ .agent-runtime-choice small { display: block; margin-top: 3px; color: var(--text-2); font-size: 10px; line-height: 1.6; }
2789
+ .agent-runtime-fields { border-top: 1px solid var(--border); padding-top: 14px; }
2790
+ .agent-draft-assistant { padding: 12px; border: 1px solid var(--border); border-radius: 9px; background: var(--surface); }
2791
+ .agent-draft-assistant > summary { display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 600; cursor: pointer; }
2792
+ .agent-draft-assistant > .note { margin: 10px 0; font-size: 11px; }
2793
+ .agent-draft-assistant .btn { margin-top: 10px; }
2794
+ .agent-draft-assistant textarea { resize: vertical; }
2795
+ .windows-agent-nav { flex-shrink: 0; padding: 8px; border-top: 1px solid var(--border); max-height: 25vh; overflow: auto; }
2796
+ .windows-agent-nav h3 { padding: 0 12px 5px; color: var(--text-3); font-size: 11px; font-weight: 500; }
2797
+ .windows-agent-nav svg { flex-shrink: 0; }
2798
+ .p-windows-agent .windows-agent-conversation { max-width: 960px; }
2799
+ .windows-agent-identity { display: flex; align-items: center; gap: 12px; padding: 16px 0; border-bottom: 1px solid var(--border); margin-bottom: 16px; }
2800
+ .windows-agent-identity > span:first-child { display: grid; place-items: center; width: 44px; height: 44px; border-radius: 10px; color: white; background: #141413; flex-shrink: 0; }
2801
+ .windows-agent-identity > div { flex: 1; min-width: 0; }
2802
+ .windows-agent-identity strong { font-size: 13px; }
2803
+ .windows-agent-identity code { display: block; overflow-wrap: anywhere; color: var(--text-2); font: 11px/1.7 var(--font-mono); }
2804
+ .windows-agent-empty { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 60px 12px; color: var(--text-2); }
2805
+ .windows-agent-empty h2 { margin: 18px 0 8px; color: var(--text); font-size: 20px; }
2806
+ .windows-agent-empty p { max-width: 400px; font-size: 13px; line-height: 1.8; }
2807
+ .windows-agent-turn { margin-bottom: 26px; }
2808
+ .windows-agent-human { padding: 14px 18px; margin-left: 15%; border-radius: 12px; background: var(--surface); }
2809
+ .windows-agent-human strong { font-size: 12px; }
2810
+ .windows-agent-human p { white-space: pre-wrap; overflow-wrap: anywhere; margin-top: 6px; }
2811
+ .windows-agent-reply { padding: 20px 0 0; }
2812
+ .windows-agent-reply > strong { display: flex; gap: 8px; align-items: center; font-size: 13px; }
2813
+ .windows-agent-reply pre { margin: 14px 0 7px; white-space: pre-wrap; overflow-wrap: anywhere; font: 13px/1.8 var(--font-mono); }
2814
+ .windows-agent-reply small { color: var(--text-3); font-size: 11px; }
2815
+ .windows-agent-composer { padding: 12px 24px 18px; border-top: 1px solid var(--border); }
2816
+ .windows-agent-composer > div, .windows-agent-composer > p { max-width: 900px; margin-left: auto; margin-right: auto; }
2817
+ .windows-agent-input { padding: 12px; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; }
2818
+ .windows-agent-input > textarea { display: block; width: 100%; border: 0; resize: vertical; padding: 4px; background: transparent; color: var(--text); font-family: var(--font-ui); font-size: var(--fs-md); min-height: 60px; max-height: 180px; }
2819
+ .runtime-settings { max-width: 1080px; }
2820
+ .runtime-heading, .runtime-heading > div:last-child, .runtime-machine > header, .runtime-machine-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
2821
+ .runtime-heading { justify-content: space-between; margin-bottom: 20px; }
2822
+ .runtime-heading h2, .runtime-machine h3 { margin: 0; }
2823
+ .runtime-local, .runtime-machine, .runtime-pairing { padding: 18px; margin: 16px 0; border: 1px solid var(--border); border-radius: 12px; background: var(--surface); }
2824
+ .runtime-local h3 { display: flex; align-items: center; gap: 8px; }
2825
+ /* M-2255: Settings → Runtime's switches. */
2826
+ .runtime-switches { padding: 18px; margin: 16px 0; border: 1px solid var(--border); border-radius: 12px; background: var(--surface); }
2827
+ .runtime-switches > h3 { margin: 0 0 6px; }
2828
+ .runtime-switch { padding: 12px 0; border-bottom: 1px solid var(--border); }
2829
+ .runtime-switch-row { display: flex; align-items: flex-start; gap: 12px; cursor: pointer; }
2830
+ .runtime-switch-row input { flex: none; width: 20px; height: 20px; margin: 2px 0 0; accent-color: var(--accent); }
2831
+ .runtime-switch-row input:disabled { cursor: not-allowed; }
2832
+ .runtime-switch-row > span { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
2833
+ .runtime-switch-row small { color: var(--text-3); font-size: var(--fs-sm); line-height: 1.5; overflow-wrap: anywhere; }
2834
+ .runtime-switch-env, .runtime-switch-pending { display: block; margin: 8px 0 0 32px; font-size: var(--fs-sm); }
2835
+ .runtime-switch-env { color: var(--warn); }
2836
+ .runtime-switches > .note { margin: 12px 0 0; font-size: var(--fs-sm); color: var(--text-3); }
2837
+ .runtime-guide { margin: 10px 0 0 32px; font-size: var(--fs-sm); }
2838
+ .runtime-guide > summary { cursor: pointer; font-weight: 600; padding: 4px 0; }
2839
+ .runtime-guide p { margin: 8px 0; line-height: 1.5; }
2840
+ /* A command wraps only between its words (never inside an address), so all of it is in view, on a phone too. */
2841
+ .runtime-guide pre { margin: 6px 0 10px; padding: 8px 10px; border-radius: 8px; background: var(--bg); overflow-x: auto; white-space: pre-wrap; overflow-wrap: normal; word-break: normal; max-width: 100%; }
2842
+ .runtime-guide-link { display: inline-flex; align-items: center; gap: 4px; color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
2843
+ .runtime-guide-warn { color: var(--warn); }
2844
+ .runtime-limit { display: flex; flex-direction: column; gap: 8px; padding: 12px 0; border-bottom: 1px solid var(--border); }
2845
+ .runtime-limit label { display: flex; flex-direction: column; gap: 4px; }
2846
+ .runtime-limit small { color: var(--text-3); font-size: var(--fs-sm); line-height: 1.5; }
2847
+ .runtime-limit > div { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
2848
+ .runtime-limit input { width: 6em; font-size: var(--fs-md); }
2849
+ @media (max-width: 600px) { .runtime-guide, .runtime-switch-env, .runtime-switch-pending { margin-left: 0; } }
2850
+ .runtime-machine > header > div { flex: 1; min-width: 140px; }
2851
+ .runtime-machine > header p, .runtime-machine .note { margin: 7px 0; font-size: var(--fs-sm); color: var(--text-3); }
2852
+ .runtime-machine-icon { display: grid; place-items: center; width: 42px; height: 42px; border-radius: 10px; background: var(--bg); }
2853
+ .runtime-status { padding: 4px 10px; border: 1px solid var(--border); border-radius: 20px; font-size: var(--fs-sm); }
2854
+ .runtime-status.is-online { color: var(--ok); }
2855
+ .runtime-status.is-pending { color: var(--warn); }
2856
+ .runtime-status.is-offline, .runtime-status.is-revoked { color: var(--text-3); }
2857
+ .runtime-machine-id { display: block; margin: 8px 0; overflow-wrap: anywhere; }
2858
+ .runtime-cli-list { padding: 0; margin: 14px 0; list-style: none; }
2859
+ .runtime-cli-list li { display: flex; align-items: center; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--border); }
2860
+ .runtime-cli-list li > span:nth-child(2) { flex: 1; }
2861
+ .runtime-cli-list small { display: block; color: var(--text-3); font-size: var(--fs-sm); }
2862
+ .runtime-machine-actions { margin-top: 14px; }
2863
+ /* S-30: the ZIP step is a button with its hint beside it (wrapping under it on a phone), not text flush against it. */
2864
+ .runtime-bundle-step { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin: 12px 0; }
2865
+ .runtime-bundle-step .note { margin: 0; flex: 1 1 220px; }
2866
+ .runtime-pairing label, .runtime-rename label { display: flex; flex-direction: column; gap: 7px; margin: 12px 0; }
2867
+ .runtime-pairing input, .runtime-rename input { width: 100%; min-width: 0; font-family: var(--font-ui); font-size: var(--fs-md); }
2868
+ .runtime-pair-code { letter-spacing: .14em; }
2869
+ .runtime-error { border: 1px solid var(--danger); padding: 12px; border-radius: 10px; overflow-wrap: anywhere; }
2870
+ .runtime-local-diagnostics { margin-top: 22px; }
2871
+ .runtime-local-diagnostics > summary { cursor: pointer; font-weight: 600; padding: 12px 0; }
2872
+ .runtime-remote-targets { display: grid; gap: 8px; margin-top: 16px; }
2873
+ .runtime-remote-targets h4 { margin: 0 0 4px; font-size: var(--fs-md); }
2874
+ .runtime-remote-targets .agent-runtime-choice { min-width: 0; width: 100%; }
2875
+ .runtime-manage-link { display: inline-block; margin-top: 12px; }
2876
+ .inst-machine { display: flex; gap: 5px; overflow: hidden; white-space: nowrap; font-size: var(--fs-xs); color: var(--text-3); }
2877
+ /* S-30: the machine name gives way; "Connection revoked" / "Offline" always stays readable. */
2878
+ .inst-machine-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
2879
+ .inst-machine-status { flex: none; }
2880
+ .inst-machine.offline, .runtime-machine-offline { color: var(--warn); }
2881
+ .runtime-machine-tag { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2882
+ @media (max-width: 600px) {
2883
+ .runtime-heading > div:last-child { width: 100%; }
2884
+ .runtime-machine, .runtime-pairing, .runtime-local { padding: 14px; }
2885
+ .runtime-cli-list li { flex-wrap: wrap; }
2886
+ .runtime-cli-list li > .note { width: 100%; }
2887
+ }
2888
+ .windows-agent-input > div { display: flex; justify-content: flex-end; gap: 8px; align-items: center; }
2889
+ .windows-agent-composer > .note { margin-top: 8px; font-size: 10px; }
2890
+ .p-windows-agent .error, .agent-draft-assistant .error { color: var(--danger); font-size: 12px; overflow-wrap: anywhere; }
2891
+ .windows-agent-blocked { padding: 16px; background: var(--warn-bg); border-radius: 10px; }
2892
+ .windows-agent-blocked p { margin-bottom: 12px; }
2893
+ @media (max-width: 620px) {
2894
+ .agent-runtime-choice { flex-wrap: wrap; padding: 12px; }
2895
+ .agent-runtime-choice > span { flex-basis: 100%; }
2896
+ .windows-agent-composer { padding: 10px 12px; }
2897
+ .windows-agent-identity { flex-wrap: wrap; }
2898
+ }
2899
+ /* Agent creation wizard: one active stage per screen, with persistent navigation actions. */
2900
+ .agent-create-wizard { display: flex; flex-direction: column; gap: 24px; }
2901
+ /* S-30: the body's top padding scrolled content through above the sticky steps (a phone showed card edges there); a
2902
+ background-coloured copy of the bar, shifted up, covers that strip. */
2903
+ .agent-create-steps { position: sticky; top: 0; z-index: 2; background: var(--bg); box-shadow: 0 calc(-1 * var(--s-5)) 0 var(--bg); display: flex; align-items: center; gap: 8px; padding-bottom: 20px; margin: 0; list-style: none; border-bottom: 1px solid var(--border); }
2904
+ .agent-create-steps > li { display: flex; align-items: center; gap: 7px; color: var(--text-3); font-size: 12px; min-width: 0; }
2905
+ .agent-create-steps > li:not(:last-child)::after { content: ""; width: 28px; height: 1px; background: var(--border); margin: 0 6px; }
2906
+ .agent-create-steps > li.current { color: var(--text); font-weight: 600; }
2907
+ .agent-create-step-number { display: grid; place-items: center; width: 22px; height: 22px; flex-shrink: 0; border: 1px solid var(--border-strong); border-radius: 50%; font-size: 11px; }
2908
+ .agent-create-steps .current .agent-create-step-number { color: var(--on-accent); background: var(--accent-fill); border-color: var(--accent-fill); }
2909
+ .agent-create-steps .complete .agent-create-step-number { color: var(--ok); border-color: var(--ok); background: var(--ok-bg); }
2910
+ .agent-create-stage { display: flex; flex-direction: column; gap: 18px; min-width: 0; }
2911
+ .agent-create-stage > h3 { margin: 0; font-size: 21px; font-weight: 600; line-height: 1.4; letter-spacing: -.025em; }
2912
+ .agent-create-stage > h3:focus { outline: none; }
2913
+ .agent-create-stage > .note { margin-top: -12px; font-size: 12px; line-height: 1.8; }
2914
+ .agent-create-cli { padding: 16px; background: var(--surface); border: 1px solid var(--border); border-radius: 10px; }
2915
+ .agent-create-cli .field { margin: 0; }
2916
+ .agent-create-selection { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border: 1px solid var(--border); border-radius: 10px; background: var(--surface); }
2917
+ .agent-create-selection > div { flex: 1; min-width: 0; }
2918
+ .agent-create-selection strong { display: block; font-size: 12px; }
2919
+ .agent-create-selection span { display: block; color: var(--text-2); font-size: 11px; overflow-wrap: anywhere; }
2920
+ .agent-create-wizard .agent-runtime-fields { padding-top: 0; border-top: 0; }
2921
+ .agent-create-success { align-items: center; text-align: center; padding: 18px 0 8px; }
2922
+ .agent-create-success-icon { display: grid; place-items: center; width: 64px; height: 64px; color: var(--ok); background: var(--ok-bg); border-radius: 50%; }
2923
+ .agent-create-success dl { display: grid; grid-template-columns: max-content minmax(0,1fr); gap: 12px 20px; width: 100%; margin: 0; padding: 18px; border: 1px solid var(--border); border-radius: 10px; text-align: left; font-size: 13px; }
2924
+ .agent-create-success dt { color: var(--text-2); }
2925
+ .agent-create-success dd { margin: 0; overflow-wrap: anywhere; }
2926
+ .agent-create-success code { font-family: var(--font-mono); font-size: 12px; }
2927
+ @media (max-width: 620px) {
2928
+ .agent-create-steps { gap: 6px; }
2929
+ .agent-create-steps > li { gap: 5px; font-size: 11px; }
2930
+ .agent-create-steps > li:not(:last-child)::after { width: 12px; margin: 0 2px; }
2931
+ .agent-create-selection { gap: 8px; padding: 10px; }
2932
+ .agent-create-selection .btn { padding: 0 8px; }
2933
+ .agent-create-stage > h3 { font-size: 20px; }
2934
+ }
2935
+ .cli-picker { width: 100%; min-width: 0; }
2936
+ .cli-picker-trigger { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 40px; padding: 8px 12px; border: 1px solid var(--border-strong); border-radius: var(--r-sm); background: var(--surface); color: var(--text); font: inherit; text-align: left; cursor: pointer; }
2937
+ .cli-picker-trigger:hover:not(:disabled) { border-color: var(--accent); }
2938
+ .cli-picker-trigger:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
2939
+ .cli-picker-trigger:disabled { opacity: .5; cursor: not-allowed; }
2940
+ .cli-product-mark { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; line-height: 0; }
2941
+ .cli-product-mark svg, .cli-product-mark img { display: block; flex-shrink: 0; }
2942
+ .cli-picker-value { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2943
+ .cli-picker-chevron { display: inline-flex; color: var(--text-3); }
2944
+ .cli-picker .menu-list { left: 0; right: 0; min-width: 0; max-height: 280px; overflow-y: auto; }
2945
+ .cli-picker .menu-list.menu-up { top: auto; bottom: calc(100% + 6px); }
2946
+ .cli-picker .menu-list.menu-compact { max-height: 180px; }
2947
+ .cli-picker .menu-list.menu-short { max-height: 96px; }
2948
+ .cli-picker .menu-item { padding-top: 8px; padding-bottom: 8px; }
2949
+ .cli-picker .menu-radio > span:last-child { flex: 1; min-width: 0; }
2950
+ .cli-picker-option { display: flex; align-items: center; gap: 10px; min-width: 0; }
2951
+ .cli-picker-copy { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
2952
+ .cli-picker-description { color: var(--text-2); font-size: var(--fs-xs); line-height: 1.4; }
2953
+ .cli-discovery-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 32px; }
2954
+ .cli-discovery-status { display: flex; align-items: flex-start; gap: 12px; padding: 14px; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface); }
2955
+ .cli-discovery-status > .out-spin { flex: 0 0 16px; width: 16px; height: 16px; margin-top: 3px; color: var(--accent); }
2956
+ .cli-discovery-status > div { min-width: 0; }
2957
+ .cli-discovery-status strong { display: block; font-size: var(--fs-sm); line-height: 1.5; }
2958
+ .cli-discovery-status p, .cli-discovery-status small { display: block; color: var(--text-2); font-size: var(--fs-xs); line-height: 1.6; margin: 4px 0 0; overflow-wrap: anywhere; }
2959
+ .cli-discovery-status .btn { margin-top: 10px; }
2960
+ .cli-discovery-status.is-error { border-color: var(--border-strong); }
2961
+ .cli-discovery-status.is-error > svg { flex: 0 0 auto; margin-top: 2px; }
@@ -85,6 +85,8 @@ if (mode === "full") {
85
85
  let chatLoads = 0;
86
86
  panels.set("chat", { load: () => (chatLoads++ === 0 ? chatBoot : loadChat()).then((m) => m.ChatPanel) });
87
87
  if (!guest) {
88
+ const loadWindowsAgent = retryable((a) => import(retryUrl("/ui/js/panel-windows-agent.js", a)));
89
+ panels.set("windows-agent", { load: () => loadWindowsAgent().then((m) => m.WindowsAgentPanel) });
88
90
  panels.set("fleet", { load: () => loadFleet().then((m) => m.FleetPanel) });
89
91
  panels.set("settings", { load: () => loadSettings().then((m) => m.SettingsPanel) });
90
92
  // #2347: the restart banner's Restart now, in any panel — the Settings runner (behind the session) does it.
@@ -120,6 +122,8 @@ if (mode === "full") {
120
122
  startNeedsNotifier({ open: (instance) => navigate(chatPath(instance)) });
121
123
  // #2233: a backend sign-in running anywhere is shown on every admin page (the module lives behind the session gate).
122
124
  import("/ui/js/backend-signin.js").then((m) => m.installSignIn(), () => {});
125
+ // alpha.2 (M-2300): an agent's Windows request waiting for a web-only fleet's owner — counted in Needs you everywhere.
126
+ import("/ui/js/agent-proposals.js").then((m) => m.installProposals(), () => {});
123
127
  }
124
128
  // #1665: this device's first upload of its own choices (once), then another device's changes at each status frame.
125
129
  // A guest's page (#2855) uploads and saves only its own keys (prefsWritable(key)); another device's changes reach it at
@@ -7,7 +7,7 @@
7
7
  // Fleet read (#1300: no style attribute). View's terminal multiplies its fitted size by VIEW_SCALE, as its density did.
8
8
  import { html, useEffect, useState } from "./app-html.js";
9
9
  import { t } from "./app-i18n.js";
10
- import { createStore, useStore } from "./app-store.js";
10
+ import { appStore, createStore, useStore } from "./app-store.js";
11
11
  import { Icon } from "./ui-icons.js";
12
12
  import { UsageBody, UsageCompactToggle, UsageDialog } from "./usage-dialog.js";
13
13
 
@@ -124,7 +124,9 @@ export function useRailWidth() {
124
124
  export function UsageRail({ route }) {
125
125
  const wide = useRailWidth();
126
126
  const { open } = useStore(usageRailStore);
127
- if (!wide || !open || !route || !RAIL_PANELS.includes(route.panel) || !usageOffered()) return null;
127
+ const { instances = [] } = useStore(appStore);
128
+ const instance = instances.find(item => item.name === route?.instance);
129
+ if (!wide || !open || !route || !RAIL_PANELS.includes(route.panel) || !usageOffered() || instance?.capabilities?.usage === false) return null;
128
130
  return html`<aside data-trust="usage" class="u-rail" aria-label=${t("view.usage.title_plain")}>
129
131
  <div class="u-rail-head"><h2>${t("view.usage.title")}</h2><${UsageCompactToggle} />
130
132
  <button type="button" class="icon-btn" onClick=${() => setUsageRail(false)} aria-label=${t("app.usageHide")} title=${t("app.usageHide")}><${Icon} name="close" size=${16} /></button></div>
@@ -154,8 +156,8 @@ export function UsageButton({ navKey }) {
154
156
  }
155
157
 
156
158
  /** The shared controls, in the one order every page uses. `navKey`: the page's navigation (the usage dialog's owner). */
157
- export function HeaderTools({ view = false, navKey }) {
158
- return html`<${TextSizeButton} view=${view} /><${UsageButton} navKey=${navKey} />`;
159
+ export function HeaderTools({ view = false, navKey, usage = true }) {
160
+ return html`<${TextSizeButton} view=${view} />${usage ? html`<${UsageButton} navKey=${navKey} />` : null}`;
159
161
  }
160
162
  /** Where a page with no control of its own after the shared ones (Log) keeps the room Chat's ⋯ takes: the same box on every tab. */
161
163
  export function HeaderSlot() {