@ashlr/hub 3.12.0 → 3.14.0

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 (719) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +29 -16
  3. package/dist/authority-surface.json +274 -148
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +145 -33
  6. package/dist/cli/authority.js +1292 -315
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/cloud.js +12 -3
  9. package/dist/cli/cloud.js.map +1 -1
  10. package/dist/cli/comms.d.ts +33 -19
  11. package/dist/cli/comms.js +128 -151
  12. package/dist/cli/comms.js.map +1 -1
  13. package/dist/cli/completions.js +1 -1
  14. package/dist/cli/completions.js.map +1 -1
  15. package/dist/cli/daemon.js +29 -0
  16. package/dist/cli/daemon.js.map +1 -1
  17. package/dist/cli/director.d.ts +8 -12
  18. package/dist/cli/director.js +17 -52
  19. package/dist/cli/director.js.map +1 -1
  20. package/dist/cli/fleet.js +4 -1
  21. package/dist/cli/fleet.js.map +1 -1
  22. package/dist/cli/help.js +1 -0
  23. package/dist/cli/help.js.map +1 -1
  24. package/dist/cli/leader.d.ts +27 -3
  25. package/dist/cli/leader.js +253 -4
  26. package/dist/cli/leader.js.map +1 -1
  27. package/dist/core/authority/protected-paths.js +11 -0
  28. package/dist/core/authority/protected-paths.js.map +1 -1
  29. package/dist/core/authority/resident.d.ts +101 -0
  30. package/dist/core/authority/resident.js +246 -0
  31. package/dist/core/authority/resident.js.map +1 -0
  32. package/dist/core/authority/server-enforcement.d.ts +110 -0
  33. package/dist/core/authority/server-enforcement.js +260 -0
  34. package/dist/core/authority/server-enforcement.js.map +1 -0
  35. package/dist/core/authority/standing-grant.d.ts +24 -4
  36. package/dist/core/authority/standing-grant.js +19 -3
  37. package/dist/core/authority/standing-grant.js.map +1 -1
  38. package/dist/core/authority/types.d.ts +43 -0
  39. package/dist/core/authority/types.js +6 -0
  40. package/dist/core/authority/types.js.map +1 -1
  41. package/dist/core/cloud/budget.js +11 -1
  42. package/dist/core/cloud/budget.js.map +1 -1
  43. package/dist/core/cloud/cloud-api.d.ts +25 -2
  44. package/dist/core/cloud/cloud-api.js +139 -5
  45. package/dist/core/cloud/cloud-api.js.map +1 -1
  46. package/dist/core/cloud/pr-actions.d.ts +93 -0
  47. package/dist/core/cloud/pr-actions.js +436 -0
  48. package/dist/core/cloud/pr-actions.js.map +1 -0
  49. package/dist/core/cloud/pr-preview.d.ts +128 -0
  50. package/dist/core/cloud/pr-preview.js +228 -0
  51. package/dist/core/cloud/pr-preview.js.map +1 -0
  52. package/dist/core/cloud/store.d.ts +2 -0
  53. package/dist/core/cloud/store.js +28 -0
  54. package/dist/core/cloud/store.js.map +1 -1
  55. package/dist/core/cloud/timeline-api.d.ts +24 -0
  56. package/dist/core/cloud/timeline-api.js +46 -0
  57. package/dist/core/cloud/timeline-api.js.map +1 -0
  58. package/dist/core/cloud/timeline-types.d.ts +62 -0
  59. package/dist/core/cloud/timeline-types.js +36 -0
  60. package/dist/core/cloud/timeline-types.js.map +1 -0
  61. package/dist/core/cloud/timeline.d.ts +102 -0
  62. package/dist/core/cloud/timeline.js +925 -0
  63. package/dist/core/cloud/timeline.js.map +1 -0
  64. package/dist/core/cloud/tracker.js +67 -0
  65. package/dist/core/cloud/tracker.js.map +1 -1
  66. package/dist/core/cloud/types.d.ts +38 -0
  67. package/dist/core/cloud/types.js +1 -1
  68. package/dist/core/cloud/types.js.map +1 -1
  69. package/dist/core/comms/change-digest.d.ts +130 -0
  70. package/dist/core/comms/change-digest.js +451 -0
  71. package/dist/core/comms/change-digest.js.map +1 -0
  72. package/dist/core/comms/director-prompt.d.ts +4 -5
  73. package/dist/core/comms/director-prompt.js +4 -71
  74. package/dist/core/comms/director-prompt.js.map +1 -1
  75. package/dist/core/comms/director.d.ts +24 -61
  76. package/dist/core/comms/director.js +29 -382
  77. package/dist/core/comms/director.js.map +1 -1
  78. package/dist/core/comms/dispatch.d.ts +37 -12
  79. package/dist/core/comms/dispatch.js +244 -177
  80. package/dist/core/comms/dispatch.js.map +1 -1
  81. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  82. package/dist/core/comms/elon-dialogue.js +36 -307
  83. package/dist/core/comms/elon-dialogue.js.map +1 -1
  84. package/dist/core/comms/fleet-pulse.js +4 -7
  85. package/dist/core/comms/fleet-pulse.js.map +1 -1
  86. package/dist/core/comms/handlers.d.ts +10 -6
  87. package/dist/core/comms/handlers.js +14 -48
  88. package/dist/core/comms/handlers.js.map +1 -1
  89. package/dist/core/comms/migrations.d.ts +47 -0
  90. package/dist/core/comms/migrations.js +125 -0
  91. package/dist/core/comms/migrations.js.map +1 -0
  92. package/dist/core/comms/requests.d.ts +32 -5
  93. package/dist/core/comms/requests.js +101 -5
  94. package/dist/core/comms/requests.js.map +1 -1
  95. package/dist/core/comms/telegram-channel.d.ts +104 -0
  96. package/dist/core/comms/telegram-channel.js +622 -0
  97. package/dist/core/comms/telegram-channel.js.map +1 -0
  98. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  99. package/dist/core/comms/telegram-thread-map.js +144 -0
  100. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  101. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  102. package/dist/core/daemon/capacity-publisher.js +40 -2
  103. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  104. package/dist/core/daemon/loop.js +18 -4
  105. package/dist/core/daemon/loop.js.map +1 -1
  106. package/dist/core/daemon/service-install-authority.d.ts +10 -2
  107. package/dist/core/daemon/service-install-authority.js +14 -5
  108. package/dist/core/daemon/service-install-authority.js.map +1 -1
  109. package/dist/core/daemon/service.d.ts +15 -0
  110. package/dist/core/daemon/service.js +26 -0
  111. package/dist/core/daemon/service.js.map +1 -1
  112. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  113. package/dist/core/daemon/tick-deadline.js +83 -0
  114. package/dist/core/daemon/tick-deadline.js.map +1 -0
  115. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  116. package/dist/core/daemon/tick-hooks.js.map +1 -1
  117. package/dist/core/daemon/tick-progress.d.ts +39 -0
  118. package/dist/core/daemon/tick-progress.js +194 -0
  119. package/dist/core/daemon/tick-progress.js.map +1 -0
  120. package/dist/core/dashboard.js +3 -1
  121. package/dist/core/dashboard.js.map +1 -1
  122. package/dist/core/fleet/cloud-intake.d.ts +95 -0
  123. package/dist/core/fleet/cloud-intake.js +557 -0
  124. package/dist/core/fleet/cloud-intake.js.map +1 -0
  125. package/dist/core/fleet/dispatch-router.d.ts +13 -0
  126. package/dist/core/fleet/dispatch-router.js +32 -8
  127. package/dist/core/fleet/dispatch-router.js.map +1 -1
  128. package/dist/core/fleet/fleet-merge-state.d.ts +16 -0
  129. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  130. package/dist/core/fleet/host-merge.d.ts +14 -0
  131. package/dist/core/fleet/host-merge.js +24 -2
  132. package/dist/core/fleet/host-merge.js.map +1 -1
  133. package/dist/core/fleet/merge-gates.d.ts +21 -0
  134. package/dist/core/fleet/merge-gates.js +39 -5
  135. package/dist/core/fleet/merge-gates.js.map +1 -1
  136. package/dist/core/fleet/mirrors.d.ts +162 -6
  137. package/dist/core/fleet/mirrors.js +1051 -49
  138. package/dist/core/fleet/mirrors.js.map +1 -1
  139. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  140. package/dist/core/fleet/standing-merge-pass.js +102 -1
  141. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  142. package/dist/core/fleet/status.d.ts +17 -0
  143. package/dist/core/fleet/status.js +22 -0
  144. package/dist/core/fleet/status.js.map +1 -1
  145. package/dist/core/fleet/tick-hooks-live.d.ts +10 -1
  146. package/dist/core/fleet/tick-hooks-live.js +57 -8
  147. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  148. package/dist/core/fleet/verify-check-run.d.ts +90 -0
  149. package/dist/core/fleet/verify-check-run.js +274 -0
  150. package/dist/core/fleet/verify-check-run.js.map +1 -0
  151. package/dist/core/git.d.ts +17 -0
  152. package/dist/core/git.js +124 -25
  153. package/dist/core/git.js.map +1 -1
  154. package/dist/core/goals/open-goals.d.ts +47 -0
  155. package/dist/core/goals/open-goals.js +33 -0
  156. package/dist/core/goals/open-goals.js.map +1 -0
  157. package/dist/core/inbox/merge.d.ts +5 -0
  158. package/dist/core/inbox/merge.js +58 -2
  159. package/dist/core/inbox/merge.js.map +1 -1
  160. package/dist/core/integrations/locus.d.ts +28 -0
  161. package/dist/core/integrations/locus.js +155 -30
  162. package/dist/core/integrations/locus.js.map +1 -1
  163. package/dist/core/integrations/telegram-format.d.ts +40 -0
  164. package/dist/core/integrations/telegram-format.js +123 -0
  165. package/dist/core/integrations/telegram-format.js.map +1 -0
  166. package/dist/core/integrations/telegram.d.ts +60 -4
  167. package/dist/core/integrations/telegram.js +161 -28
  168. package/dist/core/integrations/telegram.js.map +1 -1
  169. package/dist/core/mcp-registry.d.ts +12 -0
  170. package/dist/core/mcp-registry.js +70 -0
  171. package/dist/core/mcp-registry.js.map +1 -1
  172. package/dist/core/observability/rollup.d.ts +12 -10
  173. package/dist/core/observability/rollup.js +44 -17
  174. package/dist/core/observability/rollup.js.map +1 -1
  175. package/dist/core/resources/connection-monitor.d.ts +9 -0
  176. package/dist/core/resources/connection-monitor.js +19 -9
  177. package/dist/core/resources/connection-monitor.js.map +1 -1
  178. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  179. package/dist/core/resources/quota-refresh-lease.js +34 -1
  180. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  181. package/dist/core/routing/budget-api.d.ts +18 -1
  182. package/dist/core/routing/budget-api.js +120 -10
  183. package/dist/core/routing/budget-api.js.map +1 -1
  184. package/dist/core/routing/budget-store.d.ts +22 -1
  185. package/dist/core/routing/budget-store.js +22 -8
  186. package/dist/core/routing/budget-store.js.map +1 -1
  187. package/dist/core/routing/readiness-types.d.ts +82 -0
  188. package/dist/core/routing/readiness-types.js +23 -0
  189. package/dist/core/routing/readiness-types.js.map +1 -0
  190. package/dist/core/routing/readiness.d.ts +103 -0
  191. package/dist/core/routing/readiness.js +480 -0
  192. package/dist/core/routing/readiness.js.map +1 -0
  193. package/dist/core/sandbox/confine.js +22 -1
  194. package/dist/core/sandbox/confine.js.map +1 -1
  195. package/dist/core/sandbox/policy.d.ts +23 -0
  196. package/dist/core/sandbox/policy.js +100 -0
  197. package/dist/core/sandbox/policy.js.map +1 -1
  198. package/dist/core/types.d.ts +13 -0
  199. package/dist/core/types.js.map +1 -1
  200. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  201. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  202. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  203. package/dist/core/usage/frontier-usage.d.ts +20 -2
  204. package/dist/core/usage/frontier-usage.js +75 -17
  205. package/dist/core/usage/frontier-usage.js.map +1 -1
  206. package/dist/core/verse/account-health.js +9 -3
  207. package/dist/core/verse/account-health.js.map +1 -1
  208. package/dist/core/verse/accounts.d.ts +45 -0
  209. package/dist/core/verse/accounts.js +246 -17
  210. package/dist/core/verse/accounts.js.map +1 -1
  211. package/dist/core/verse/activity-api.d.ts +5 -1
  212. package/dist/core/verse/activity-api.js +62 -14
  213. package/dist/core/verse/activity-api.js.map +1 -1
  214. package/dist/core/verse/apps-api.js +23 -11
  215. package/dist/core/verse/apps-api.js.map +1 -1
  216. package/dist/core/verse/apps.d.ts +11 -9
  217. package/dist/core/verse/apps.js +2 -2
  218. package/dist/core/verse/apps.js.map +1 -1
  219. package/dist/core/verse/authority-api.d.ts +17 -3
  220. package/dist/core/verse/authority-api.js +122 -7
  221. package/dist/core/verse/authority-api.js.map +1 -1
  222. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  223. package/dist/core/verse/autonomy-ladder.js +251 -0
  224. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  225. package/dist/core/verse/context-fit.js +7 -5
  226. package/dist/core/verse/context-fit.js.map +1 -1
  227. package/dist/core/verse/control-api.d.ts +23 -1
  228. package/dist/core/verse/control-api.js +117 -10
  229. package/dist/core/verse/control-api.js.map +1 -1
  230. package/dist/core/verse/fleet-live-api.js +13 -5
  231. package/dist/core/verse/fleet-live-api.js.map +1 -1
  232. package/dist/core/verse/folder-io.d.ts +50 -0
  233. package/dist/core/verse/folder-io.js +142 -0
  234. package/dist/core/verse/folder-io.js.map +1 -0
  235. package/dist/core/verse/git-api.js +5 -4
  236. package/dist/core/verse/git-api.js.map +1 -1
  237. package/dist/core/verse/git-ops.d.ts +10 -1
  238. package/dist/core/verse/git-ops.js +18 -2
  239. package/dist/core/verse/git-ops.js.map +1 -1
  240. package/dist/core/verse/github-api.d.ts +1 -1
  241. package/dist/core/verse/github-api.js +5 -4
  242. package/dist/core/verse/github-api.js.map +1 -1
  243. package/dist/core/verse/github-repo.js +118 -14
  244. package/dist/core/verse/github-repo.js.map +1 -1
  245. package/dist/core/verse/leader-api.d.ts +5 -4
  246. package/dist/core/verse/leader-api.js +237 -10
  247. package/dist/core/verse/leader-api.js.map +1 -1
  248. package/dist/core/verse/local-models.d.ts +10 -0
  249. package/dist/core/verse/local-models.js +10 -1
  250. package/dist/core/verse/local-models.js.map +1 -1
  251. package/dist/core/verse/login-path.d.ts +73 -0
  252. package/dist/core/verse/login-path.js +123 -14
  253. package/dist/core/verse/login-path.js.map +1 -1
  254. package/dist/core/verse/mcp-control-api.js +4 -4
  255. package/dist/core/verse/mcp-control-api.js.map +1 -1
  256. package/dist/core/verse/mcp-scope.d.ts +22 -0
  257. package/dist/core/verse/mcp-scope.js +41 -1
  258. package/dist/core/verse/mcp-scope.js.map +1 -1
  259. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  260. package/dist/core/verse/mcp-seat-view.js +30 -4
  261. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  262. package/dist/core/verse/overnight-api.js +20 -2
  263. package/dist/core/verse/overnight-api.js.map +1 -1
  264. package/dist/core/verse/path-guard.d.ts +24 -0
  265. package/dist/core/verse/path-guard.js +91 -22
  266. package/dist/core/verse/path-guard.js.map +1 -1
  267. package/dist/core/verse/preview-api.js +22 -0
  268. package/dist/core/verse/preview-api.js.map +1 -1
  269. package/dist/core/verse/projects.d.ts +21 -0
  270. package/dist/core/verse/projects.js +82 -0
  271. package/dist/core/verse/projects.js.map +1 -1
  272. package/dist/core/verse/seat-readiness.d.ts +25 -0
  273. package/dist/core/verse/seat-readiness.js +43 -6
  274. package/dist/core/verse/seat-readiness.js.map +1 -1
  275. package/dist/core/verse/session-controls-api.js +5 -3
  276. package/dist/core/verse/session-controls-api.js.map +1 -1
  277. package/dist/core/verse/session-handoff.d.ts +26 -0
  278. package/dist/core/verse/session-handoff.js +90 -12
  279. package/dist/core/verse/session-handoff.js.map +1 -1
  280. package/dist/core/verse/terminal-api.js +7 -4
  281. package/dist/core/verse/terminal-api.js.map +1 -1
  282. package/dist/core/verse/terminal.js +9 -5
  283. package/dist/core/verse/terminal.js.map +1 -1
  284. package/dist/core/verse/verse-api.d.ts +3 -1
  285. package/dist/core/verse/verse-api.js +87 -27
  286. package/dist/core/verse/verse-api.js.map +1 -1
  287. package/dist/core/verse/workspaces.d.ts +51 -0
  288. package/dist/core/verse/workspaces.js +177 -47
  289. package/dist/core/verse/workspaces.js.map +1 -1
  290. package/dist/core/vision/leader-apply.d.ts +40 -0
  291. package/dist/core/vision/leader-apply.js +101 -30
  292. package/dist/core/vision/leader-apply.js.map +1 -1
  293. package/dist/core/vision/leader-cadence.d.ts +114 -0
  294. package/dist/core/vision/leader-cadence.js +127 -0
  295. package/dist/core/vision/leader-cadence.js.map +1 -0
  296. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  297. package/dist/core/vision/leader-goal-evidence.js +36 -0
  298. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  299. package/dist/core/vision/leader-health.d.ts +53 -0
  300. package/dist/core/vision/leader-health.js +92 -0
  301. package/dist/core/vision/leader-health.js.map +1 -0
  302. package/dist/core/vision/leader-operator.d.ts +176 -0
  303. package/dist/core/vision/leader-operator.js +355 -0
  304. package/dist/core/vision/leader-operator.js.map +1 -0
  305. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  306. package/dist/core/vision/leader-run-chain.js +54 -0
  307. package/dist/core/vision/leader-run-chain.js.map +1 -0
  308. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  309. package/dist/core/vision/leader-seat-plan.js +93 -0
  310. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  311. package/dist/core/vision/leader-seat.d.ts +71 -5
  312. package/dist/core/vision/leader-seat.js +235 -33
  313. package/dist/core/vision/leader-seat.js.map +1 -1
  314. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  315. package/dist/core/vision/leader-thread-types.js +9 -0
  316. package/dist/core/vision/leader-thread-types.js.map +1 -0
  317. package/dist/core/vision/leader-thread.d.ts +138 -0
  318. package/dist/core/vision/leader-thread.js +926 -0
  319. package/dist/core/vision/leader-thread.js.map +1 -0
  320. package/dist/core/vision/leader-types.d.ts +75 -1
  321. package/dist/core/vision/leader.d.ts +88 -18
  322. package/dist/core/vision/leader.js +269 -69
  323. package/dist/core/vision/leader.js.map +1 -1
  324. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js → ActionMenu-CIiX2X8w.js} +2 -2
  325. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  327. package/dist/core/web/public/next/assets/{Advanced-B-LqYXvd.js.map → Advanced-DHsysoIL.js.map} +1 -1
  328. package/dist/core/web/public/next/assets/App-CMeAocmW.js +7 -0
  329. package/dist/core/web/public/next/assets/{App-E2zCDRxm.js.map → App-CMeAocmW.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  331. package/dist/core/web/public/next/assets/{AppsSection-8wXPPhZb.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  333. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  334. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js +3 -0
  335. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js.map +1 -0
  336. package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
  337. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  338. package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  340. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  341. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js → BranchBar-BxhdiIpx.js} +2 -2
  342. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js +2 -0
  344. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js.map +1 -0
  345. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-D90dzI_o.js} +2 -2
  346. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-D90dzI_o.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-qKDBC65C.js} +2 -2
  348. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  350. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  351. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  352. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  353. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js.map +1 -0
  354. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  355. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  357. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  358. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  359. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  360. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  361. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  362. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-D3msQlCj.js} +2 -2
  366. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-D3msQlCj.js.map} +1 -1
  367. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Ix6hvXlY.js} +2 -2
  368. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-C4WKsCIe.js} +2 -2
  370. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  371. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  372. package/dist/core/web/public/next/assets/{DockHost-DW9q0NdR.js.map → DockHost-aWP7liri.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-D2IRy3Cg.js} +2 -2
  374. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  375. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-DMr18muX.js} +2 -2
  376. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-DMr18muX.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js +2 -0
  378. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js.map +1 -0
  379. package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
  380. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  381. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  382. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  383. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js → GearTray-Dt-ee32-.js} +2 -2
  385. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  387. package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  388. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-CLJQLe7M.js} +2 -2
  389. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-D_KRJA9V.js} +2 -2
  391. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js.map → Input-D_KRJA9V.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  393. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  394. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  395. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  396. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  397. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  398. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  399. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  400. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  401. package/dist/core/web/public/next/assets/{McpSection-BRuCcTjT.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  402. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-DFvk06qG.js} +3 -3
  403. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  404. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  405. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  406. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-CMj-VafN.js} +2 -2
  407. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js.map → Meter-CMj-VafN.js.map} +1 -1
  408. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  409. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  410. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  411. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  412. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  413. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  414. package/dist/core/web/public/next/assets/NeedsYouList-CCsijdWt.js +2 -0
  415. package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
  417. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  418. package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  419. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js +3 -0
  420. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js.map +1 -0
  421. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  422. package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  423. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  424. package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  425. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  426. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  427. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-Co5UB6We.js} +2 -2
  428. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  429. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  430. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  431. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  432. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  434. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  435. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  436. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  437. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  438. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  439. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  441. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-J5R3zDkB.js} +3 -3
  443. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  444. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-CGh_-tBb.js} +2 -2
  445. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  446. package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-CWnmUzs3.js} +2 -2
  447. package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-CWnmUzs3.js.map} +1 -1
  448. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-sp4KsnUo.js} +2 -2
  449. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  450. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  451. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  452. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-DbFjwR1h.js} +2 -2
  453. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  454. package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js → SettingsSection-Ch23msJ5.js} +2 -2
  455. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  456. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js +2 -0
  457. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js.map +1 -0
  458. package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
  459. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  460. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  461. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js → Sheet-BZ2AG4Eo.js} +2 -2
  462. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  464. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  466. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js.map +1 -0
  467. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-KVoJLDD6.js} +2 -2
  468. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js.map → Slider-KVoJLDD6.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  470. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  471. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  472. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXsYqmdU.js} +2 -2
  473. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  474. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  475. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  476. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js → Surface-BfDmQcKe.js} +2 -2
  477. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-BfDmQcKe.js.map} +1 -1
  478. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  479. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  480. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  481. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js → Switch-9NtO_6Lj.js} +2 -2
  482. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-DscCRFcN.js} +2 -2
  484. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-DscCRFcN.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js} +5 -5
  486. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  487. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  488. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  489. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DG70zH0W.js} +4 -4
  490. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  492. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  493. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  494. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  495. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  496. package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  498. package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js.map → actions-CY-PjpGc.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  500. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js → apps-model-Du02KhAf.js} +2 -2
  501. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-Du02KhAf.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-79SeuKlJ.js} +2 -2
  503. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  505. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  506. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  507. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  508. package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  509. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  510. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  511. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  512. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  513. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  514. package/dist/core/web/public/next/assets/cloud-model-BDivRMqv.js +2 -0
  515. package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  516. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  517. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  519. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js → command-catalog-BIntSa9l.js} +2 -2
  521. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js → context-model-Br8t9jgG.js} +2 -2
  523. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-Br8t9jgG.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-CokrgEUq.js} +3 -3
  525. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js.map → context-model-CokrgEUq.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  527. package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js.map → context-queries-eL3caKVG.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-B9K-wmcB.js} +2 -2
  529. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js +2 -0
  531. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js.map +1 -0
  532. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-BJ6ZqB2t.js} +2 -2
  533. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-BvDR3gjp.js} +2 -2
  535. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-W2UFVMZJ.js} +2 -2
  537. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-CtI1SlMX.js} +2 -2
  539. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/format-CH4g_sl1.js +2 -0
  541. package/dist/core/web/public/next/assets/format-CH4g_sl1.js.map +1 -0
  542. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  543. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js → git-model-Dnkd1TnK.js} +2 -2
  545. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  546. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  547. package/dist/core/web/public/next/assets/{global-CNNGMril.js.map → global-CMNW_dqn.js.map} +1 -1
  548. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  549. package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  550. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-D1sYbCTQ.js} +2 -2
  551. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-D1sYbCTQ.js.map} +1 -1
  552. package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-DZ-UQ7v8.js} +3 -3
  553. package/dist/core/web/public/next/assets/{index-QesfXBsb.js.map → index-DZ-UQ7v8.js.map} +1 -1
  554. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  555. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  556. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  557. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  558. package/dist/core/web/public/next/assets/{live-model-De-q0ZFK.js → live-model-D_32RAOR.js} +2 -2
  559. package/dist/core/web/public/next/assets/live-model-D_32RAOR.js.map +1 -0
  560. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-7hA92hRg.js} +2 -2
  561. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js.map → mind.module-7hA92hRg.js.map} +1 -1
  562. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  563. package/dist/core/web/public/next/assets/{mutations-DTCtKCn_.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  564. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-0dOYe2rJ.js} +2 -2
  565. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-0dOYe2rJ.js.map} +1 -1
  566. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-C4wOnFtE.js} +2 -2
  567. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  568. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  569. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js → queries-BTXWdZzU.js} +2 -2
  570. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-BTXWdZzU.js.map} +1 -1
  571. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  572. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  573. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-DfNLgK_I.js} +2 -2
  574. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  575. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  576. package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  577. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-CLCdqwkR.js} +2 -2
  578. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  579. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-C-qBeu-8.js} +3 -3
  580. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-C-qBeu-8.js.map} +1 -1
  581. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-Dj71tdD-.js} +2 -2
  582. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  583. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  584. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  585. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js → tasks-model-O8yR5YXp.js} +2 -2
  586. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  587. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-CoRZq9iO.js} +2 -2
  588. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  589. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  590. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  591. package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
  592. package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
  593. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-AdjEyEtn.js} +2 -2
  594. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  595. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-CuuMHeDX.js} +2 -2
  596. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  597. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BBcp02SZ.js} +2 -2
  598. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  599. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-CbXVYQYI.js} +2 -2
  600. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  601. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-C_Fpe_sH.js} +2 -2
  602. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  603. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  604. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  605. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-DgbigUlV.js} +2 -2
  606. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  607. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-S56hIiXS.js} +2 -2
  608. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  609. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  610. package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js.map → verse-model-DAVevkNe.js.map} +1 -1
  611. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-B_RAtNZ_.js} +3 -3
  612. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  613. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js +2 -0
  614. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js.map +1 -0
  615. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-dji5-Al3.js} +2 -2
  616. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  617. package/dist/core/web/public/next/index.html +1 -1
  618. package/dist/core/web/read-projection-worker.js +2 -1
  619. package/dist/core/web/read-projection-worker.js.map +1 -1
  620. package/dist/core/web/read-projections.d.ts +3 -0
  621. package/dist/core/web/read-projections.js +2 -2
  622. package/dist/core/web/read-projections.js.map +1 -1
  623. package/dist/core/web/visibility.js +3 -4
  624. package/dist/core/web/visibility.js.map +1 -1
  625. package/dist/release-dependency-inventory.json +1 -1
  626. package/docs/AUTONOMY-GAP.md +1 -1
  627. package/package.json +3 -2
  628. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
  629. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
  630. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
  631. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +0 -2
  632. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js.map +0 -1
  633. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
  634. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
  635. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
  636. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
  637. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
  638. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
  639. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  640. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +0 -2
  641. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +0 -1
  642. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
  643. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
  644. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +0 -2
  645. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +0 -1
  646. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  647. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
  648. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
  649. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
  650. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +0 -3
  651. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +0 -1
  652. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +0 -2
  653. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js.map +0 -1
  654. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +0 -2
  655. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +0 -2
  656. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +0 -2
  658. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js.map +0 -1
  659. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
  660. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +0 -2
  661. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +0 -1
  662. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
  664. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
  665. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
  666. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +0 -3
  667. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
  668. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
  669. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
  670. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +0 -2
  671. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BX2nkdmZ.js +0 -7
  672. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
  673. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +0 -1
  674. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  675. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +0 -2
  676. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +0 -1
  677. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +0 -1
  678. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
  679. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
  680. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  681. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +0 -2
  682. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +0 -1
  683. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +0 -2
  684. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js.map +0 -1
  685. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +0 -2
  686. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js.map +0 -1
  687. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  688. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +0 -2
  689. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +0 -3
  690. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +0 -1
  691. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
  692. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
  693. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +0 -10
  694. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  695. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +0 -2
  696. package/dist/core/web/public/next/assets/budget-queries-DsAjH8ac.js +0 -2
  697. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +0 -2
  698. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +0 -1
  699. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  700. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
  701. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +0 -1
  702. package/dist/core/web/public/next/assets/context-queries-CktFQqSS.js +0 -2
  703. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
  704. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
  705. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
  706. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
  707. package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
  708. package/dist/core/web/public/next/assets/guarded-runners-DPh2d32e.js +0 -2
  709. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
  710. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
  711. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
  712. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +0 -2
  713. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
  714. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +0 -1
  715. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
  716. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
  717. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +0 -2
  718. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
  719. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewPane-BPBbcROb.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/preview/preview-client.ts","../../../../../../src/web-ui/routes/verse/dock/preview/PreviewPane.module.css","../../../../../../src/web-ui/routes/verse/dock/preview/PreviewPane.tsx"],"sourcesContent":["/**\n * dock/preview/preview-client.ts — the Preview pane's reads (unit C4) and the\n * address-bar rule.\n *\n * Every call is a header-authenticated GET. An artifact shown in an <iframe>\n * or <img> goes through a short-lived FRAME TICKET (preview.ts \"WHY\n * TICKETS\"): the element's own request cannot carry the read-client header.\n */\nimport type { VersePreviewArtifactKind, VersePreviewTargetsResponse } from '../../../../data/api-types.js';\nimport { getReadClientProof, reportSessionExpired } from '../../../../data/auth-store.js';\nimport { ApiError, apiGet } from '../../../../data/client.js';\nimport {\n VERSE_PREVIEW_RAW_PATH,\n VERSE_PREVIEW_TARGETS_PATH,\n isLoopbackPreviewUrl,\n} from '../../../../../core/verse/workbench-types.js';\n\nexport const VERSE_PREVIEW_TICKET_PATH = '/api/verse/preview/ticket';\n\nexport interface PreviewTicket {\n url: string;\n expiresAt: string;\n kind: VersePreviewArtifactKind;\n}\n\nexport interface PreviewApi {\n targets(sessionId: string, signal?: AbortSignal): Promise<VersePreviewTargetsResponse>;\n ticket(sessionId: string, path: string): Promise<PreviewTicket>;\n /** A markdown artifact's text (rendered by the pane, sanitised). */\n text(sessionId: string, path: string): Promise<string>;\n}\n\nfunction query(params: Record<string, string>): string {\n return new URLSearchParams(params).toString();\n}\n\nexport const previewApi: PreviewApi = {\n targets: (sessionId, signal) => apiGet<VersePreviewTargetsResponse>(`${VERSE_PREVIEW_TARGETS_PATH}?${query({ sessionId })}`, signal),\n ticket: (sessionId, path) => apiGet<PreviewTicket>(`${VERSE_PREVIEW_TICKET_PATH}?${query({ sessionId, path })}`),\n text: async (sessionId, path) => {\n const url = `${VERSE_PREVIEW_RAW_PATH}?${query({ sessionId, path })}`;\n const res = await fetch(url, { credentials: 'same-origin', headers: { 'x-ashlr-read-client': getReadClientProof() } });\n if (res.status === 401) {\n reportSessionExpired();\n throw new ApiError('Read session expired.', 401, url);\n }\n if (!res.ok) throw new ApiError(`GET ${url} failed (HTTP ${res.status}).`, res.status, url);\n return res.text();\n },\n};\n\n// ---------------------------------------------------------------------------\n// The address bar\n// ---------------------------------------------------------------------------\n\nexport type PreviewAddress =\n | { kind: 'loopback'; url: string }\n /** Not loopback http: offered as \"Open in browser ↗\", never framed. */\n | { kind: 'external'; url: string }\n /** Verse's own server: it refuses to be framed, and framing it would only confuse. */\n | { kind: 'self'; url: string }\n | { kind: 'invalid' };\n\nfunction portOf(url: URL): string {\n return url.port || (url.protocol === 'https:' ? '443' : '80');\n}\n\n/**\n * What the operator typed → where it goes. Shorthands: `5173` and `:5173`\n * are localhost ports; `localhost:3000/x` gets `http://`. A bare domain is an\n * EXTERNAL https page. Anything that is not http(s) (javascript:, file:,\n * data:) is invalid. `verseOrigin` is `window.location.origin`.\n */\nexport function parsePreviewAddress(input: string, verseOrigin: string): PreviewAddress {\n const raw = input.trim();\n if (raw.length === 0 || raw.length > 2048 || /\\s/.test(raw)) return { kind: 'invalid' };\n let candidate = raw;\n if (/^:?\\d{2,5}$/.test(raw)) candidate = `http://localhost:${raw.replace(':', '')}/`;\n else if (/^(?:localhost|127\\.0\\.0\\.1)(?::\\d{1,5})?(?:[/?#].*)?$/i.test(raw)) candidate = `http://${raw}`;\n else if (!/^[a-z][a-z0-9+.-]*:/i.test(raw)) {\n if (!/^[\\w-]+(?:\\.[\\w-]+)+(?::\\d{1,5})?(?:[/?#].*)?$/.test(raw)) return { kind: 'invalid' };\n candidate = `https://${raw}`;\n }\n let url: URL;\n try {\n url = new URL(candidate);\n } catch {\n return { kind: 'invalid' };\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return { kind: 'invalid' };\n if (isLoopbackPreviewUrl(url.href)) {\n let verse: URL | null = null;\n try { verse = new URL(verseOrigin); } catch { verse = null; }\n const loopbackVerse = verse && (verse.hostname === 'localhost' || verse.hostname === '127.0.0.1');\n if (loopbackVerse && portOf(verse!) === portOf(url)) return { kind: 'self', url: url.href };\n return { kind: 'loopback', url: url.href };\n }\n if (url.username || url.password) return { kind: 'invalid' };\n return { kind: 'external', url: url.href };\n}\n\n/** \"localhost:5173/admin\" — the tab and history label for a loopback URL. */\nexport function shortUrl(href: string): string {\n try {\n const url = new URL(href);\n const path = url.pathname === '/' ? '' : url.pathname;\n return `${url.host}${path}${url.search}`;\n } catch {\n return href;\n }\n}\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return '—';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/*\n * dock/preview/PreviewPane.module.css — the Preview pane (unit C4).\n * Tokens only (design/style-scan-310: no raw hex, no px font sizes). The\n * chrome (tab strip, toolbar) matches the Terminal pane so the two read as\n * one dock when split.\n */\n\n.pane {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--bg-canvas);\n color: var(--text-primary);\n}\n\n/* ---- tab strip ------------------------------------------------------------ */\n\n.strip {\n display: flex;\n align-items: stretch;\n flex: none;\n min-height: var(--control-h-sm);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n.tabs {\n display: flex;\n align-items: stretch;\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.tabs::-webkit-scrollbar { display: none; }\n\n.tab {\n position: relative;\n display: flex;\n align-items: center;\n flex: none;\n max-width: 220px;\n border-right: 1px solid var(--border-subtle);\n color: var(--text-secondary);\n}\n.tab[data-selected] {\n color: var(--text-primary);\n background: var(--bg-canvas);\n}\n.tab[data-selected]::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: -1px;\n height: 2px;\n background: var(--accent-500);\n}\n\n.tabButton {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n height: 100%;\n padding: 0 var(--space-1) 0 var(--space-3);\n border: 0;\n background: transparent;\n color: inherit;\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n cursor: pointer;\n}\n.tabButton > svg { flex: none; color: var(--text-tertiary); }\n.tabButton:hover { color: var(--text-primary); }\n.tabButton:focus-visible,\n.tabClose:focus-visible,\n.noticeClose:focus-visible,\n.external:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n\n.tabTitle {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tabClose {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n /* One step under the xs control: 20px comfortable, 16px compact. A literal\n 20px stayed comfortable when Density went compact and outgrew the\n shrunken tab row (control-density.test.ts, DESIGN-V2 §2). */\n width: calc(var(--control-h-xs) - var(--space-1));\n height: calc(var(--control-h-xs) - var(--space-1));\n margin-right: var(--space-1);\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.tab:hover .tabClose,\n.tab[data-selected] .tabClose,\n.tabClose:focus-visible { opacity: 1; }\n.tabClose:hover { background: var(--bg-hover); color: var(--text-primary); }\n@media (hover: none) {\n .tabClose { opacity: 1; }\n}\n\n.newTab { align-self: center; margin: 0 var(--space-1); }\n\n/* ---- toolbar -------------------------------------------------------------- */\n\n/* Height, padding, border and surface come from ../pane-chrome.module.css\n (the row every dock pane shares); the toolbar only lays out its parts. */\n/* Starts with icon buttons, so a smaller inset than a text title (and scoped\n under .pane so it outranks the shared padding regardless of CSS order). */\n.pane .toolbar { padding-left: var(--space-2); }\n\n.nav {\n display: flex;\n align-items: center;\n flex: none;\n}\n\n.addressForm {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.address {\n width: 100%;\n min-width: 0;\n height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.address::placeholder { color: var(--text-tertiary); }\n.address:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n.address[readonly] { color: var(--text-secondary); }\n\n.external {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: var(--density-row-sm);\n height: var(--density-row-sm);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n}\n.external:hover { background: var(--bg-hover); color: var(--text-primary); }\n/* No page to open elsewhere: the slot keeps its width, so the address bar does not jump. */\n.external[data-placeholder] { visibility: hidden; }\n\n/* ---- notices -------------------------------------------------------------- */\n\n.addressNote,\n.notice,\n.waiting {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n.addressNote { background: var(--status-info-bg); color: var(--status-info-fg); }\n.notice { background: var(--status-danger-bg); color: var(--status-danger-fg); }\n.waiting { background: var(--status-running-bg); color: var(--status-running-fg); }\n.addressNote > span,\n.notice > span { flex: 1; min-width: 0; }\n.addressNote a { color: inherit; font-weight: var(--font-weight-semibold); }\n.addressNote code,\n.waiting code {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n\n.waitingText {\n flex: 1;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n}\n\n/* The 1.6 s running pulse (DESIGN §13.5); stops under reduced motion. */\n.pulse {\n flex: none;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n background: var(--status-running-solid);\n animation: pulse var(--duration-pulse) ease-in-out infinite;\n}\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n\n.noticeClose {\n display: inline-flex;\n flex: none;\n padding: var(--space-1);\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: inherit;\n cursor: pointer;\n}\n\n/* ---- body ----------------------------------------------------------------- */\n\n.body {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n}\n\n.loading {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--card-pad);\n}\n\n.stage {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n flex: 1 1 auto;\n min-height: 0;\n}\n.stage[data-device='phone'] {\n align-items: center;\n padding: var(--space-3) 0;\n}\n\n.frame {\n flex: 1 1 auto;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--bg-surface);\n}\n.stage[data-device='phone'] .frame {\n flex: 1 1 auto;\n width: 375px;\n max-width: 100%;\n border: 1px solid var(--border-default);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-md);\n}\n\n.frameHint {\n flex: none;\n margin: 0;\n padding: var(--space-1) var(--space-3);\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n}\n.stage[data-device='phone'] .frameHint { align-self: stretch; margin-top: var(--space-3); }\n.frameHint a { color: var(--text-link); }\n\n.imageStage {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1 1 auto;\n min-height: 0;\n padding: var(--card-pad);\n background:\n repeating-conic-gradient(var(--bg-hover) 0 25%, transparent 0 50%) 0 0 / 16px 16px,\n var(--bg-surface);\n}\n.image {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n}\n\n.markdown {\n padding: var(--card-pad) var(--space-6);\n max-width: var(--measure-read);\n background: var(--bg-canvas);\n}\n\n/* ---- launcher ------------------------------------------------------------- */\n\n.launcher {\n display: flex;\n flex-direction: column;\n padding-bottom: var(--space-6);\n}\n\n.section { padding: var(--space-4) var(--card-pad) 0; }\n.section + .section {\n margin-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n}\n\n.sectionTitle {\n margin: 0 0 var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.muted {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-tertiary);\n}\n.muted code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n\n.rows {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.row {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n min-height: var(--density-row);\n padding: var(--space-2) 0;\n}\n.row + .row { border-top: 1px solid var(--border-subtle); }\n\n.dot {\n flex: none;\n width: 8px;\n height: 8px;\n border: 1.5px solid var(--text-tertiary);\n border-radius: var(--radius-full);\n}\n.dot[data-running] {\n border-color: var(--status-success-solid);\n background: var(--status-success-solid);\n}\n\n.fileIcon { flex: none; color: var(--text-tertiary); }\n\n.rowMain {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.rowTitle {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n\n.rowMeta {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n/* What Start will type (a launch.json row's label is only its name). */\n.rowCommand {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n/* ---- compact (375) -------------------------------------------------------- */\n\n.pane[data-compact] .toolbar { flex-wrap: wrap; }\n.pane[data-compact] .addressForm { order: 3; flex-basis: 100%; }\n.pane[data-compact] .section { padding-left: var(--space-3); padding-right: var(--space-3); }\n.pane[data-compact] .markdown { padding: var(--space-3); }\n.pane[data-compact] .tab { max-width: 150px; }\n\n@media (prefers-reduced-motion: reduce) {\n .pulse { animation: none; }\n .tabClose { transition: none; }\n}\n","/**\n * dock/preview/PreviewPane.tsx — the chat dock's Preview (unit C4; SPEC-310C\n * §3). Rendered by C2's Dock through C0's `preview-pane` slot.\n *\n * WHAT IT SHOWS, in tabs:\n * - a LOOPBACK dev server (http://localhost / 127.0.0.1 only) in an iframe,\n * with back / forward / reload, an address bar, and a Desktop / 375 frame;\n * anything else typed in the bar is offered as \"Open in browser ↗\";\n * - a file this chat WROTE — HTML, SVG, image, PDF through a short-lived\n * frame ticket and a CSP sandbox (an opaque origin: its own script runs,\n * Verse's cookies and API stay out of reach); Markdown rendered here,\n * sanitised, like a chat message.\n * An empty pane (or the + tab) is the launcher: the dev servers found in the\n * chat's folders — launch.json, package.json scripts, and anything already\n * listening inside them — and the chat's files. Start runs the server in a\n * TERMINAL tab (through the dock, never directly), then waits for its port\n * and opens it.\n *\n * WHAT THE FRAMES MAY DO. A dev server is a different origin (another port),\n * so `allow-same-origin` gives it ITS origin, never Verse's; the sandbox\n * still withholds top navigation, so a page can never navigate Verse away.\n * Verse's own address is refused outright. Back/forward walk the addresses\n * opened HERE: a cross-origin frame's own history is not readable.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, type FormEvent, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport type { VersePreviewArtifact, VersePreviewArtifactKind, VersePreviewDevServer, VersePreviewTargetsResponse } from '../../../../data/api-types.js';\nimport { ApiError } from '../../../../data/client.js';\nimport { Button, IconButton } from '../../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../../components/primitives/EmptyState.js';\nimport { Segmented } from '../../../../components/primitives/Segmented.js';\nimport { SkeletonLine } from '../../../../components/primitives/Skeleton.js';\nimport { IconExternalLink, IconPlus, IconX } from '../../../../components/primitives/icons.js';\nimport { MessageMarkdown } from '../../MessageMarkdown.js';\nimport { usePollWhileVisible, useSectionVisible } from '../../shell/section-visibility.js';\nimport type { PreviewOpenRequest, PreviewPaneProps } from '../../shell/slots.js';\nimport { useViewport } from '../../shell/viewport.js';\nimport {\n ArrowLeftGlyph,\n ArrowRightGlyph,\n DesktopGlyph,\n FileGlyph,\n PhoneGlyph,\n PlayGlyph,\n PreviewGlyph,\n ReloadGlyph,\n ServerGlyph,\n} from '../terminal/terminal-icons.js';\nimport { formatBytes, parsePreviewAddress, previewApi, shortUrl, type PreviewAddress, type PreviewApi } from './preview-client.js';\nimport chrome from '../pane-chrome.module.css';\nimport styles from './PreviewPane.module.css';\n\n// ---------------------------------------------------------------------------\n// Model\n// ---------------------------------------------------------------------------\n\nexport type PreviewTab =\n | { id: string; kind: 'launcher' }\n | { id: string; kind: 'url'; history: string[]; index: number; reloadKey: number }\n | { id: string; kind: 'artifact'; path: string; artifactKind: VersePreviewArtifactKind; reloadKey: number };\n\ntype Device = 'desktop' | 'phone';\n\ninterface Waiting {\n server: VersePreviewDevServer;\n since: number;\n}\n\ntype ArtifactContent =\n | { status: 'loading' }\n | { status: 'frame'; src: string }\n | { status: 'text'; text: string }\n | { status: 'error'; message: string };\n\nexport interface PreviewPaneDeps {\n api: PreviewApi;\n /** `window.location.origin`: Verse's own address, which is never framed. */\n origin: () => string;\n now: () => number;\n}\n\nconst DEFAULT_DEPS: PreviewPaneDeps = {\n api: previewApi,\n origin: () => window.location.origin,\n now: () => Date.now(),\n};\n\n/** How long Start waits for the server's port before saying so. */\nexport const PREVIEW_START_TIMEOUT_MS = 120_000;\nconst WAIT_POLL_MS = 2_000;\nconst LAUNCHER_POLL_MS = 5_000;\nconst STORAGE_PREFIX = 'ashlr.verse.preview.v1:';\nconst SOURCE_LABEL: Readonly<Record<VersePreviewDevServer['source'], string>> = {\n 'launch-json': 'launch.json',\n 'package-json': 'package.json',\n listening: 'running',\n};\nconst KIND_LABEL: Readonly<Record<VersePreviewArtifactKind, string>> = {\n html: 'HTML',\n md: 'Markdown',\n svg: 'SVG',\n image: 'Image',\n pdf: 'PDF',\n};\n\nlet lastHandledNonce = 0;\nlet idCounter = 0;\nconst nextId = (): string => `p${++idCounter}`;\n\n/** Test hygiene. */\nexport function resetPreviewPaneForTest(): void {\n lastHandledNonce = 0;\n idCounter = 0;\n}\n\nfunction kindFromPath(path: string): VersePreviewArtifactKind | null {\n const ext = path.toLowerCase().slice(path.lastIndexOf('.'));\n if (ext === '.html' || ext === '.htm') return 'html';\n if (ext === '.md' || ext === '.markdown') return 'md';\n if (ext === '.svg') return 'svg';\n if (ext === '.pdf') return 'pdf';\n if (['.png', '.jpg', '.jpeg', '.gif', '.webp', '.avif', '.bmp', '.ico'].includes(ext)) return 'image';\n return null;\n}\n\nfunction baseName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1) || path;\n}\n\nfunction tabLabel(tab: PreviewTab): string {\n if (tab.kind === 'launcher') return 'New tab';\n if (tab.kind === 'url') return shortUrl(tab.history[tab.index] ?? '');\n return baseName(tab.path);\n}\n\nfunction currentUrl(tab: PreviewTab | null): string | null {\n return tab?.kind === 'url' ? tab.history[tab.index] ?? null : null;\n}\n\n/** Tabs worth restoring after a reload (per viewer, per chat; never shared). */\nfunction loadTabs(sessionId: string, origin: string): { tabs: PreviewTab[]; activeId: string | null; device: Device } | null {\n try {\n const raw = localStorage.getItem(`${STORAGE_PREFIX}${sessionId}`);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { tabs?: unknown; active?: unknown; device?: unknown };\n const tabs: PreviewTab[] = [];\n let activeId: string | null = null;\n if (Array.isArray(parsed.tabs)) {\n parsed.tabs.slice(0, 12).forEach((t: unknown, i: number) => {\n if (!t || typeof t !== 'object') return;\n const rec = t as Record<string, unknown>;\n const id = nextId();\n if (rec['url'] && typeof rec['url'] === 'string' && parsePreviewAddress(rec['url'], origin).kind === 'loopback') {\n tabs.push({ id, kind: 'url', history: [rec['url']], index: 0, reloadKey: 0 });\n } else if (typeof rec['path'] === 'string') {\n const kind = kindFromPath(rec['path']);\n if (kind) tabs.push({ id, kind: 'artifact', path: rec['path'], artifactKind: kind, reloadKey: 0 });\n else return;\n } else {\n return;\n }\n if (parsed.active === i) activeId = id;\n });\n }\n return { tabs, activeId: activeId ?? tabs.at(-1)?.id ?? null, device: parsed.device === 'phone' ? 'phone' : 'desktop' };\n } catch {\n return null;\n }\n}\n\nfunction saveTabs(sessionId: string, tabs: readonly PreviewTab[], activeId: string | null, device: Device): void {\n try {\n const kept = tabs.filter((t) => t.kind !== 'launcher');\n localStorage.setItem(`${STORAGE_PREFIX}${sessionId}`, JSON.stringify({\n tabs: kept.map((t) => (t.kind === 'url' ? { url: t.history[t.index] } : t.kind === 'artifact' ? { path: t.path } : {})),\n active: kept.findIndex((t) => t.id === activeId),\n device,\n }));\n } catch {\n /* storage unavailable: tabs last for this page only */\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function PreviewPane({ sessionId, roots, request, onOpenTerminal, visible, deps: depsOverride }: PreviewPaneProps & { deps?: Partial<PreviewPaneDeps> }) {\n const deps = useMemo<PreviewPaneDeps>(() => ({ ...DEFAULT_DEPS, ...depsOverride }), [depsOverride]);\n const sectionVisible = useSectionVisible();\n const shown = visible && sectionVisible;\n const compact = useViewport().compact;\n\n const [restored] = useState(() => loadTabs(sessionId, deps.origin()));\n const [tabs, setTabs] = useState<PreviewTab[]>(() => restored?.tabs ?? []);\n const [activeId, setActiveId] = useState<string | null>(() => restored?.activeId ?? null);\n const [device, setDevice] = useState<Device>(() => restored?.device ?? 'desktop');\n // The dock keeps this pane mounted across chats: another chat brings ITS\n // tabs. Reset during render (not in an effect) so the save below never\n // writes one chat's tabs under another chat's key.\n const [owner, setOwner] = useState(sessionId);\n const [targets, setTargets] = useState<VersePreviewTargetsResponse | null>(null);\n const [targetsError, setTargetsError] = useState<string | null>(null);\n const [address, setAddress] = useState('');\n const [addressNote, setAddressNote] = useState<PreviewAddress | null>(null);\n const [waiting, setWaiting] = useState<Waiting | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [content, setContent] = useState<ReadonlyMap<string, ArtifactContent>>(() => new Map());\n const [clock, setClock] = useState(() => deps.now());\n const mounted = useRef(true);\n const tabRefs = useRef(new Map<string, HTMLButtonElement>());\n const addressRef = useRef<HTMLInputElement>(null);\n\n if (owner !== sessionId) {\n const next = loadTabs(sessionId, deps.origin());\n setOwner(sessionId);\n setTabs(next?.tabs ?? []);\n setActiveId(next?.activeId ?? null);\n setTargets(null);\n setWaiting(null);\n setNotice(null);\n }\n\n const active = tabs.find((t) => t.id === activeId) ?? null;\n const url = currentUrl(active);\n const showLauncher = !active || active.kind === 'launcher';\n\n useEffect(() => {\n mounted.current = true;\n return () => { mounted.current = false; };\n }, []);\n\n useEffect(() => {\n if (owner === sessionId) saveTabs(sessionId, tabs, activeId, device);\n }, [owner, sessionId, tabs, activeId, device]);\n\n // The address bar mirrors the tab shown.\n useEffect(() => {\n setAddress(active?.kind === 'url' ? (active.history[active.index] ?? '') : active?.kind === 'artifact' ? active.path : '');\n setAddressNote(null);\n }, [active]);\n\n // -------------------------------------------------------------------------\n // Targets\n // -------------------------------------------------------------------------\n\n const refreshTargets = useCallback(async (): Promise<VersePreviewTargetsResponse | null> => {\n try {\n const next = await deps.api.targets(sessionId);\n if (!mounted.current) return null;\n setTargets(next);\n setTargetsError(null);\n return next;\n } catch (err) {\n if (mounted.current) setTargetsError(err instanceof ApiError && err.detail ? err.detail : 'Dev servers and files could not be listed.');\n return null;\n }\n }, [deps.api, sessionId]);\n\n const fetchedFor = useRef<string | null>(null);\n useEffect(() => {\n if (!shown || fetchedFor.current === sessionId) return;\n fetchedFor.current = sessionId;\n void refreshTargets();\n }, [shown, sessionId, refreshTargets]);\n\n usePollWhileVisible(() => { void refreshTargets(); }, waiting ? WAIT_POLL_MS : LAUNCHER_POLL_MS, {\n enabled: visible && (waiting !== null || showLauncher),\n });\n\n // -------------------------------------------------------------------------\n // Tabs\n // -------------------------------------------------------------------------\n\n const openUrl = useCallback((href: string, opts: { newTab?: boolean } = {}) => {\n setNotice(null);\n const current = tabs.find((t) => t.id === activeId);\n // Reuse the launcher tab the operator is looking at; otherwise focus an\n // existing tab on that address, or open a new one.\n if (!opts.newTab && current?.kind === 'launcher') {\n setTabs(tabs.map((t) => (t.id === current.id ? { id: t.id, kind: 'url', history: [href], index: 0, reloadKey: 0 } : t)));\n return;\n }\n const existing = tabs.find((t) => t.kind === 'url' && t.history[t.index] === href);\n if (existing && !opts.newTab) {\n setActiveId(existing.id);\n return;\n }\n const id = nextId();\n setTabs([...tabs, { id, kind: 'url', history: [href], index: 0, reloadKey: 0 }]);\n setActiveId(id);\n }, [tabs, activeId]);\n\n const navigateActive = useCallback((href: string) => {\n if (!active || active.kind !== 'url') {\n openUrl(href);\n return;\n }\n setTabs((prev) => prev.map((t) => {\n if (t.id !== active.id || t.kind !== 'url') return t;\n const history = [...t.history.slice(0, t.index + 1), href].slice(-50);\n return { ...t, history, index: history.length - 1 };\n }));\n }, [active, openUrl]);\n\n const openArtifact = useCallback((path: string, kind: VersePreviewArtifactKind) => {\n setNotice(null);\n const existing = tabs.find((t) => t.kind === 'artifact' && t.path === path);\n if (existing) {\n setActiveId(existing.id);\n return;\n }\n const current = tabs.find((t) => t.id === activeId);\n if (current?.kind === 'launcher') {\n setTabs(tabs.map((t) => (t.id === current.id ? { id: t.id, kind: 'artifact', path, artifactKind: kind, reloadKey: 0 } : t)));\n return;\n }\n const id = nextId();\n setTabs([...tabs, { id, kind: 'artifact', path, artifactKind: kind, reloadKey: 0 }]);\n setActiveId(id);\n }, [tabs, activeId]);\n\n const newLauncherTab = () => {\n const existing = tabs.find((t) => t.kind === 'launcher');\n if (existing) {\n setActiveId(existing.id);\n } else {\n const id = nextId();\n setTabs((prev) => [...prev, { id, kind: 'launcher' }]);\n setActiveId(id);\n }\n void refreshTargets();\n };\n\n const closeTab = (tab: PreviewTab) => {\n const index = tabs.findIndex((t) => t.id === tab.id);\n const rest = tabs.filter((t) => t.id !== tab.id);\n setTabs(rest);\n setContent((prev) => { const next = new Map(prev); for (const key of prev.keys()) if (key.startsWith(`${tab.id}:`)) next.delete(key); return next; });\n if (activeId === tab.id) setActiveId((rest[index] ?? rest[index - 1] ?? null)?.id ?? null);\n };\n\n const onTabKeyDown = (event: ReactKeyboardEvent<HTMLButtonElement>, index: number) => {\n let next = -1;\n if (event.key === 'ArrowRight') next = (index + 1) % tabs.length;\n else if (event.key === 'ArrowLeft') next = (index - 1 + tabs.length) % tabs.length;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = tabs.length - 1;\n if (next < 0) return;\n event.preventDefault();\n const tab = tabs[next]!;\n setActiveId(tab.id);\n tabRefs.current.get(tab.id)?.focus();\n };\n\n // -------------------------------------------------------------------------\n // Dev servers: open, start, wait\n // -------------------------------------------------------------------------\n\n const startServer = useCallback((server: VersePreviewDevServer) => {\n setNotice(null);\n onOpenTerminal({ root: server.root, devServerId: server.id });\n setWaiting({ server, since: deps.now() });\n }, [deps, onOpenTerminal]);\n\n const openServer = useCallback((server: VersePreviewDevServer) => {\n if (server.running) openUrl(server.url);\n else startServer(server);\n }, [openUrl, startServer]);\n\n // Waiting for a started server: open it the moment its port answers.\n useEffect(() => {\n if (!waiting || !targets) return;\n const up = targets.devServers.find((s) => s.running && (s.id === waiting.server.id || s.port === waiting.server.port));\n if (up) {\n setWaiting(null);\n openUrl(waiting.server.url);\n return;\n }\n if (deps.now() - waiting.since > PREVIEW_START_TIMEOUT_MS) {\n setWaiting(null);\n setNotice(`Nothing answered on port ${waiting.server.port} within 2 minutes. Check the terminal for errors.`);\n }\n // `clock` ticks every second while waiting, so the timeout is noticed\n // even when a poll brings nothing new.\n }, [targets, waiting, openUrl, deps, clock]);\n\n // The elapsed-time label while waiting (display only; the poll is separate).\n useEffect(() => {\n if (!waiting) return;\n const id = setInterval(() => setClock(deps.now()), 1_000);\n return () => clearInterval(id);\n }, [waiting, deps]);\n\n // -------------------------------------------------------------------------\n // Requests from the dock\n // -------------------------------------------------------------------------\n\n const handleRequest = useCallback(async (req: PreviewOpenRequest) => {\n if (req.url) {\n const parsed = parsePreviewAddress(req.url, deps.origin());\n if (parsed.kind === 'loopback') openUrl(parsed.url);\n else setAddressNote(parsed);\n return;\n }\n if (req.artifactPath) {\n const listed = targets?.artifacts.find((a) => a.path === req.artifactPath);\n const kind = listed?.kind ?? kindFromPath(req.artifactPath);\n if (kind) openArtifact(req.artifactPath, kind);\n else setNotice('That file cannot be previewed.');\n return;\n }\n if (req.devServerId) {\n const list = (await refreshTargets()) ?? targets;\n const server = list?.devServers.find((s) => s.id === req.devServerId);\n if (server) openServer(server);\n else setNotice('That dev server is no longer listed for this chat.');\n }\n }, [deps, openArtifact, openServer, openUrl, refreshTargets, targets]);\n\n useEffect(() => {\n if (!request || request.nonce <= lastHandledNonce) return;\n lastHandledNonce = request.nonce;\n void handleRequest(request);\n }, [request, handleRequest]);\n\n // -------------------------------------------------------------------------\n // Artifact content (visible tab only)\n // -------------------------------------------------------------------------\n\n const contentKey = active?.kind === 'artifact' ? `${active.id}:${active.reloadKey}` : null;\n useEffect(() => {\n if (!shown || !active || active.kind !== 'artifact' || !contentKey || content.has(contentKey)) return;\n const tab = active;\n const key = contentKey;\n setContent((prev) => new Map(prev).set(key, { status: 'loading' }));\n const load = tab.artifactKind === 'md'\n ? deps.api.text(sessionId, tab.path).then((text): ArtifactContent => ({ status: 'text', text }))\n : deps.api.ticket(sessionId, tab.path).then((ticket): ArtifactContent => ({ status: 'frame', src: ticket.url }));\n load.then(\n (value) => { if (mounted.current) setContent((prev) => new Map(prev).set(key, value)); },\n (err: unknown) => {\n const message = err instanceof ApiError && err.status === 404\n ? 'This file is no longer in the chat\\'s folder.'\n : err instanceof ApiError && err.status === 413\n ? 'This file is larger than 5 MB, too large to preview.'\n : 'This file could not be loaded.';\n if (mounted.current) setContent((prev) => new Map(prev).set(key, { status: 'error', message }));\n },\n );\n }, [shown, active, contentKey, content, deps.api, sessionId]);\n\n // -------------------------------------------------------------------------\n // Toolbar\n // -------------------------------------------------------------------------\n\n const go = (delta: -1 | 1) => {\n if (!active || active.kind !== 'url') return;\n setTabs((prev) => prev.map((t) => (t.id === active.id && t.kind === 'url'\n ? { ...t, index: Math.min(t.history.length - 1, Math.max(0, t.index + delta)) }\n : t)));\n };\n\n const reload = () => {\n if (!active) return;\n if (active.kind === 'launcher') {\n void refreshTargets();\n return;\n }\n setTabs((prev) => prev.map((t) => (t.id === active.id && t.kind !== 'launcher' ? { ...t, reloadKey: t.reloadKey + 1 } : t)));\n };\n\n const submitAddress = (event: FormEvent) => {\n event.preventDefault();\n const parsed = parsePreviewAddress(address, deps.origin());\n if (parsed.kind === 'loopback') {\n setAddressNote(null);\n if (active?.kind === 'url') navigateActive(parsed.url);\n else openUrl(parsed.url);\n return;\n }\n setAddressNote(parsed);\n };\n\n const onAddressKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n setAddress(url ?? (active?.kind === 'artifact' ? active.path : ''));\n setAddressNote(null);\n event.currentTarget.blur();\n };\n\n const canBack = active?.kind === 'url' && active.index > 0;\n const canForward = active?.kind === 'url' && active.index < active.history.length - 1;\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n return (\n <div className={styles.pane} data-compact={compact || undefined}>\n <div className={styles.strip}>\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Previews\">\n {tabs.map((tab, index) => {\n const selected = tab.id === activeId;\n const label = tabLabel(tab);\n return (\n <div key={tab.id} className={styles.tab} data-selected={selected || undefined} role=\"presentation\">\n <button\n ref={(node) => { if (node) tabRefs.current.set(tab.id, node); else tabRefs.current.delete(tab.id); }}\n type=\"button\"\n role=\"tab\"\n id={`preview-tab-${tab.id}`}\n aria-selected={selected}\n aria-controls=\"preview-panel\"\n tabIndex={selected ? 0 : -1}\n className={styles.tabButton}\n title={tab.kind === 'url' ? tab.history[tab.index] : tab.kind === 'artifact' ? tab.path : 'Choose what to preview'}\n onClick={() => setActiveId(tab.id)}\n onKeyDown={(event) => onTabKeyDown(event, index)}\n >\n {tab.kind === 'artifact' ? <FileGlyph size={12} /> : tab.kind === 'url' ? <ServerGlyph size={12} /> : <PreviewGlyph size={12} />}\n <span className={styles.tabTitle}>{label}</span>\n </button>\n <button type=\"button\" className={styles.tabClose} aria-label={`Close preview ${label}`} title=\"Close\"\n onClick={() => closeTab(tab)}>\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconPlus />} aria-label=\"New preview tab\" title=\"New preview tab\"\n className={styles.newTab} onClick={newLauncherTab} />\n </div>\n\n <div className={`${chrome.header} ${styles.toolbar}`}>\n <div className={styles.nav}>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ArrowLeftGlyph />} aria-label=\"Back\" title=\"Back\" disabled={!canBack} onClick={() => go(-1)} />\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ArrowRightGlyph />} aria-label=\"Forward\" title=\"Forward\" disabled={!canForward} onClick={() => go(1)} />\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ReloadGlyph />} aria-label={showLauncher ? 'Refresh the list' : 'Reload'}\n title={showLauncher ? 'Refresh the list' : 'Reload'}\n disabled={!active && showLauncher && targets === null} onClick={reload} />\n </div>\n <form className={styles.addressForm} onSubmit={submitAddress} role=\"search\" aria-label=\"Preview address\">\n <input\n ref={addressRef}\n className={styles.address}\n value={address}\n onChange={(event) => setAddress(event.target.value)}\n onKeyDown={onAddressKeyDown}\n onFocus={(event) => event.currentTarget.select()}\n placeholder=\"localhost:5173\"\n aria-label=\"Address\"\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n inputMode=\"url\"\n readOnly={active?.kind === 'artifact'}\n />\n </form>\n <div className={chrome.actions}>\n {!compact ? (\n <Segmented<Device>\n aria-label=\"Frame width\"\n size=\"sm\"\n value={device}\n onChange={setDevice}\n options={[\n { value: 'desktop', label: <DesktopGlyph size={14} />, ariaLabel: 'Desktop width' },\n { value: 'phone', label: <PhoneGlyph size={14} />, ariaLabel: '375 px width' },\n ]}\n />\n ) : null}\n {url ? (\n <a className={styles.external} href={url} target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Open in browser\" title=\"Open in browser\">\n <IconExternalLink />\n </a>\n ) : (\n // Holds the link's place so the address bar keeps its width when a\n // page opens or closes (no link to offer for a file or the launcher).\n <span className={styles.external} data-placeholder=\"true\" aria-hidden=\"true\" />\n )}\n </div>\n </div>\n\n {addressNote ? <AddressNote note={addressNote} onDismiss={() => setAddressNote(null)} /> : null}\n\n {waiting ? (\n <div className={styles.waiting} role=\"status\">\n <span className={styles.pulse} aria-hidden=\"true\" />\n <span className={styles.waitingText}>\n Starting <code>{waiting.server.command ?? waiting.server.label}</code> — waiting for {shortUrl(waiting.server.url)}\n {' · '}\n {Math.max(0, Math.round((clock - waiting.since) / 1000))}s\n </span>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setWaiting(null)}>Stop waiting</Button>\n </div>\n ) : null}\n\n {notice ? (\n <div className={styles.notice} role=\"alert\">\n <span>{notice}</span>\n <button type=\"button\" className={styles.noticeClose} aria-label=\"Dismiss\" title=\"Dismiss\" onClick={() => setNotice(null)}><IconX size={12} /></button>\n </div>\n ) : null}\n\n <div className={styles.body} id=\"preview-panel\" role=\"tabpanel\" aria-labelledby={active ? `preview-tab-${active.id}` : undefined}>\n {showLauncher ? (\n <Launcher\n targets={targets}\n error={targetsError}\n roots={roots}\n onOpenServer={openServer}\n onOpenArtifact={(a) => openArtifact(a.path, a.kind)}\n onRetry={() => void refreshTargets()}\n onOpenTerminal={() => onOpenTerminal(roots[0] ? { root: roots[0] } : {})}\n waitingId={waiting?.server.id ?? null}\n />\n ) : active?.kind === 'url' ? (\n <div className={styles.stage} data-device={device}>\n <iframe\n key={`${active.id}:${active.index}:${active.reloadKey}`}\n className={styles.frame}\n src={active.history[active.index]}\n title={`Preview of ${tabLabel(active)}`}\n // A dev server is another origin: allow-same-origin is ITS origin.\n // No allow-top-navigation: it can never navigate Verse away.\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-downloads\"\n referrerPolicy=\"no-referrer\"\n />\n <p className={styles.frameHint}>\n Blank page? Some servers refuse to be framed.{' '}\n <a href={active.history[active.index]} target=\"_blank\" rel=\"noopener noreferrer\">Open in browser ↗</a>\n </p>\n </div>\n ) : active?.kind === 'artifact' ? (\n <ArtifactView tab={active} content={contentKey ? content.get(contentKey) ?? { status: 'loading' } : { status: 'loading' }} device={device}\n onRetry={reload} />\n ) : null}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Pieces\n// ---------------------------------------------------------------------------\n\nfunction AddressNote({ note, onDismiss }: { note: PreviewAddress; onDismiss: () => void }) {\n return (\n <div className={styles.addressNote} role=\"status\">\n {note.kind === 'external' ? (\n <span>\n Only local dev servers open here.{' '}\n <a href={note.url} target=\"_blank\" rel=\"noopener noreferrer\">Open in browser ↗</a>\n </span>\n ) : note.kind === 'self' ? (\n <span>That address is Verse itself.</span>\n ) : (\n <span>Enter a local address, like <code>localhost:5173</code>.</span>\n )}\n <button type=\"button\" className={styles.noticeClose} aria-label=\"Dismiss\" title=\"Dismiss\" onClick={onDismiss}><IconX size={12} /></button>\n </div>\n );\n}\n\nfunction ArtifactView({ tab, content, device, onRetry }: { tab: Extract<PreviewTab, { kind: 'artifact' }>; content: ArtifactContent; device: Device; onRetry: () => void }) {\n if (content.status === 'loading') {\n return <div className={styles.loading} aria-busy=\"true\"><SkeletonLine width=\"50%\" /><SkeletonLine width=\"80%\" /></div>;\n }\n if (content.status === 'error') {\n return <EmptyState compact tone=\"error\" title=\"Preview unavailable\" body={content.message}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={onRetry}>Try again</Button>} />;\n }\n if (content.status === 'text') {\n return (\n <article className={styles.markdown} aria-label={tab.path}>\n <MessageMarkdown text={content.text} />\n </article>\n );\n }\n if (tab.artifactKind === 'image') {\n return (\n <div className={styles.imageStage}>\n <img className={styles.image} src={content.src} alt={baseName(tab.path)} />\n </div>\n );\n }\n return (\n <div className={styles.stage} data-device={tab.artifactKind === 'pdf' ? 'desktop' : device}>\n <iframe\n key={content.src}\n className={styles.frame}\n src={content.src}\n title={`Preview of ${tab.path}`}\n // HTML and SVG run in a sandbox with NO same-origin (the server's CSP\n // says the same): their own script works, Verse stays out of reach.\n // PDF viewers refuse to run sandboxed (see preview.ts PDF_CSP).\n {...(tab.artifactKind === 'pdf' ? {} : { sandbox: 'allow-scripts' })}\n referrerPolicy=\"no-referrer\"\n />\n </div>\n );\n}\n\nfunction Launcher({ targets, error, roots, onOpenServer, onOpenArtifact, onRetry, onOpenTerminal, waitingId }: {\n targets: VersePreviewTargetsResponse | null;\n error: string | null;\n roots: readonly string[];\n onOpenServer: (server: VersePreviewDevServer) => void;\n onOpenArtifact: (artifact: VersePreviewArtifact) => void;\n onRetry: () => void;\n /** Opens a terminal (below this pane) in the chat's first folder, to start a server by hand. */\n onOpenTerminal: () => void;\n waitingId: string | null;\n}) {\n if (!targets) {\n if (error) {\n return <EmptyState compact tone=\"error\" title=\"Could not list what to preview\" body={error}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={onRetry}>Try again</Button>} />;\n }\n return <div className={styles.loading} aria-busy=\"true\"><SkeletonLine width=\"35%\" /><SkeletonLine width=\"70%\" /><SkeletonLine width=\"60%\" /></div>;\n }\n const multiRoot = roots.length > 1;\n if (targets.devServers.length === 0 && targets.artifacts.length === 0) {\n return (\n <EmptyState\n compact\n icon={<PreviewGlyph size={20} />}\n title=\"Nothing to preview yet\"\n body=\"Start a dev server in the terminal, or ask for an HTML report. Local servers and the files this chat writes show up here.\"\n action={<Button size=\"sm\" variant=\"subtle\" onClick={onOpenTerminal}>Open a terminal</Button>}\n />\n );\n }\n return (\n <div className={styles.launcher}>\n <section className={styles.section} aria-labelledby=\"preview-servers-title\">\n <h3 className={styles.sectionTitle} id=\"preview-servers-title\">Dev servers</h3>\n {targets.devServers.length === 0 ? (\n <p className={styles.muted}>No dev server found in this chat's folders. Add one to <code>.claude/launch.json</code>, or start it in the terminal.</p>\n ) : (\n <ul className={styles.rows}>\n {targets.devServers.map((server) => (\n <li key={server.id} className={styles.row}>\n <span className={styles.dot} data-running={server.running || undefined} aria-hidden=\"true\" />\n <span className={styles.rowMain}>\n <span className={styles.rowTitle} title={server.label}>{server.label}</span>\n <span className={styles.rowMeta}\n title={`${shortUrl(server.url)} · ${server.running ? 'running' : 'stopped'} · ${SOURCE_LABEL[server.source]}${multiRoot ? ` · ${server.root}` : ''}`}>\n {shortUrl(server.url)} · {server.running ? 'running' : 'stopped'} · {SOURCE_LABEL[server.source]}\n {multiRoot ? ` · ${baseName(server.root)}` : ''}\n </span>\n {/* What Start will type, before the click — a launch.json row's\n label is only its name. Skipped when the label already is it. */}\n {!server.running && server.command && server.command !== server.label ? (\n <code className={styles.rowCommand} title={server.command}>{server.command}</code>\n ) : null}\n </span>\n {server.running ? (\n <Button size=\"sm\" variant=\"subtle\" onClick={() => onOpenServer(server)} aria-label={`Open ${server.label}`}>Open</Button>\n ) : (\n <Button size=\"sm\" variant=\"subtle\" icon={<PlayGlyph size={12} />} busy={waitingId === server.id}\n onClick={() => onOpenServer(server)} aria-label={`Start ${server.label}`}\n title={`Runs ${server.command ?? server.label} in a terminal tab`}>\n Start\n </Button>\n )}\n </li>\n ))}\n </ul>\n )}\n </section>\n <section className={styles.section} aria-labelledby=\"preview-files-title\">\n <h3 className={styles.sectionTitle} id=\"preview-files-title\">This chat's files</h3>\n {targets.artifacts.length === 0 ? (\n <p className={styles.muted}>Ask the chat for a report or a page: HTML, Markdown, SVG, images and PDFs it writes appear here.</p>\n ) : (\n <ul className={styles.rows}>\n {targets.artifacts.map((artifact) => {\n const tooBig = artifact.bytes > 5 * 1024 * 1024;\n return (\n <li key={artifact.path} className={styles.row}>\n <FileGlyph size={14} className={styles.fileIcon} />\n <span className={styles.rowMain}>\n <span className={styles.rowTitle} title={artifact.path}>{artifact.path}</span>\n <span className={styles.rowMeta}>{KIND_LABEL[artifact.kind]} · {formatBytes(artifact.bytes)}</span>\n </span>\n <Button size=\"sm\" variant=\"subtle\" disabled={tooBig} title={tooBig ? 'Larger than 5 MB' : undefined}\n onClick={() => onOpenArtifact(artifact)} aria-label={`Open ${artifact.path}`}>\n Open\n </Button>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PreviewPane-COid5A0f.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/preview/preview-client.ts","../../../../../../src/web-ui/routes/verse/dock/preview/PreviewPane.module.css","../../../../../../src/web-ui/routes/verse/dock/preview/PreviewPane.tsx"],"sourcesContent":["/**\n * dock/preview/preview-client.ts — the Preview pane's reads (unit C4) and the\n * address-bar rule.\n *\n * Every call is a header-authenticated GET. An artifact shown in an <iframe>\n * or <img> goes through a short-lived FRAME TICKET (preview.ts \"WHY\n * TICKETS\"): the element's own request cannot carry the read-client header.\n */\nimport type { VersePreviewArtifactKind, VersePreviewTargetsResponse } from '../../../../data/api-types.js';\nimport { getReadClientProof, reportSessionExpired } from '../../../../data/auth-store.js';\nimport { ApiError, apiGet } from '../../../../data/client.js';\nimport {\n VERSE_PREVIEW_RAW_PATH,\n VERSE_PREVIEW_TARGETS_PATH,\n isLoopbackPreviewUrl,\n} from '../../../../../core/verse/workbench-types.js';\n\nexport const VERSE_PREVIEW_TICKET_PATH = '/api/verse/preview/ticket';\n\nexport interface PreviewTicket {\n url: string;\n expiresAt: string;\n kind: VersePreviewArtifactKind;\n}\n\nexport interface PreviewApi {\n targets(sessionId: string, signal?: AbortSignal): Promise<VersePreviewTargetsResponse>;\n ticket(sessionId: string, path: string): Promise<PreviewTicket>;\n /** A markdown artifact's text (rendered by the pane, sanitised). */\n text(sessionId: string, path: string): Promise<string>;\n}\n\nfunction query(params: Record<string, string>): string {\n return new URLSearchParams(params).toString();\n}\n\nexport const previewApi: PreviewApi = {\n targets: (sessionId, signal) => apiGet<VersePreviewTargetsResponse>(`${VERSE_PREVIEW_TARGETS_PATH}?${query({ sessionId })}`, signal),\n ticket: (sessionId, path) => apiGet<PreviewTicket>(`${VERSE_PREVIEW_TICKET_PATH}?${query({ sessionId, path })}`),\n text: async (sessionId, path) => {\n const url = `${VERSE_PREVIEW_RAW_PATH}?${query({ sessionId, path })}`;\n const res = await fetch(url, { credentials: 'same-origin', headers: { 'x-ashlr-read-client': getReadClientProof() } });\n if (res.status === 401) {\n reportSessionExpired();\n throw new ApiError('Read session expired.', 401, url);\n }\n if (!res.ok) throw new ApiError(`GET ${url} failed (HTTP ${res.status}).`, res.status, url);\n return res.text();\n },\n};\n\n// ---------------------------------------------------------------------------\n// The address bar\n// ---------------------------------------------------------------------------\n\nexport type PreviewAddress =\n | { kind: 'loopback'; url: string }\n /** Not loopback http: offered as \"Open in browser ↗\", never framed. */\n | { kind: 'external'; url: string }\n /** Verse's own server: it refuses to be framed, and framing it would only confuse. */\n | { kind: 'self'; url: string }\n | { kind: 'invalid' };\n\nfunction portOf(url: URL): string {\n return url.port || (url.protocol === 'https:' ? '443' : '80');\n}\n\n/**\n * What the operator typed → where it goes. Shorthands: `5173` and `:5173`\n * are localhost ports; `localhost:3000/x` gets `http://`. A bare domain is an\n * EXTERNAL https page. Anything that is not http(s) (javascript:, file:,\n * data:) is invalid. `verseOrigin` is `window.location.origin`.\n */\nexport function parsePreviewAddress(input: string, verseOrigin: string): PreviewAddress {\n const raw = input.trim();\n if (raw.length === 0 || raw.length > 2048 || /\\s/.test(raw)) return { kind: 'invalid' };\n let candidate = raw;\n if (/^:?\\d{2,5}$/.test(raw)) candidate = `http://localhost:${raw.replace(':', '')}/`;\n else if (/^(?:localhost|127\\.0\\.0\\.1)(?::\\d{1,5})?(?:[/?#].*)?$/i.test(raw)) candidate = `http://${raw}`;\n else if (!/^[a-z][a-z0-9+.-]*:/i.test(raw)) {\n if (!/^[\\w-]+(?:\\.[\\w-]+)+(?::\\d{1,5})?(?:[/?#].*)?$/.test(raw)) return { kind: 'invalid' };\n candidate = `https://${raw}`;\n }\n let url: URL;\n try {\n url = new URL(candidate);\n } catch {\n return { kind: 'invalid' };\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return { kind: 'invalid' };\n if (isLoopbackPreviewUrl(url.href)) {\n let verse: URL | null = null;\n try { verse = new URL(verseOrigin); } catch { verse = null; }\n const loopbackVerse = verse && (verse.hostname === 'localhost' || verse.hostname === '127.0.0.1');\n if (loopbackVerse && portOf(verse!) === portOf(url)) return { kind: 'self', url: url.href };\n return { kind: 'loopback', url: url.href };\n }\n if (url.username || url.password) return { kind: 'invalid' };\n return { kind: 'external', url: url.href };\n}\n\n/** \"localhost:5173/admin\" — the tab and history label for a loopback URL. */\nexport function shortUrl(href: string): string {\n try {\n const url = new URL(href);\n const path = url.pathname === '/' ? '' : url.pathname;\n return `${url.host}${path}${url.search}`;\n } catch {\n return href;\n }\n}\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return '—';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/*\n * dock/preview/PreviewPane.module.css — the Preview pane (unit C4).\n * Tokens only (design/style-scan-310: no raw hex, no px font sizes). The\n * chrome (tab strip, toolbar) matches the Terminal pane so the two read as\n * one dock when split.\n */\n\n.pane {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--bg-canvas);\n color: var(--text-primary);\n}\n\n/* ---- tab strip ------------------------------------------------------------ */\n\n.strip {\n display: flex;\n align-items: stretch;\n flex: none;\n min-height: var(--control-h-sm);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n.tabs {\n display: flex;\n align-items: stretch;\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.tabs::-webkit-scrollbar { display: none; }\n\n.tab {\n position: relative;\n display: flex;\n align-items: center;\n flex: none;\n max-width: 220px;\n border-right: 1px solid var(--border-subtle);\n color: var(--text-secondary);\n}\n.tab[data-selected] {\n color: var(--text-primary);\n background: var(--bg-canvas);\n}\n.tab[data-selected]::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: -1px;\n height: 2px;\n background: var(--accent-500);\n}\n\n.tabButton {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n height: 100%;\n padding: 0 var(--space-1) 0 var(--space-3);\n border: 0;\n background: transparent;\n color: inherit;\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n cursor: pointer;\n}\n.tabButton > svg { flex: none; color: var(--text-tertiary); }\n.tabButton:hover { color: var(--text-primary); }\n.tabButton:focus-visible,\n.tabClose:focus-visible,\n.noticeClose:focus-visible,\n.external:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n\n.tabTitle {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tabClose {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n /* One step under the xs control: 20px comfortable, 16px compact. A literal\n 20px stayed comfortable when Density went compact and outgrew the\n shrunken tab row (control-density.test.ts, DESIGN-V2 §2). */\n width: calc(var(--control-h-xs) - var(--space-1));\n height: calc(var(--control-h-xs) - var(--space-1));\n margin-right: var(--space-1);\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.tab:hover .tabClose,\n.tab[data-selected] .tabClose,\n.tabClose:focus-visible { opacity: 1; }\n.tabClose:hover { background: var(--bg-hover); color: var(--text-primary); }\n@media (hover: none) {\n .tabClose { opacity: 1; }\n}\n\n.newTab { align-self: center; margin: 0 var(--space-1); }\n\n/* ---- toolbar -------------------------------------------------------------- */\n\n/* Height, padding, border and surface come from ../pane-chrome.module.css\n (the row every dock pane shares); the toolbar only lays out its parts. */\n/* Starts with icon buttons, so a smaller inset than a text title (and scoped\n under .pane so it outranks the shared padding regardless of CSS order). */\n.pane .toolbar { padding-left: var(--space-2); }\n\n.nav {\n display: flex;\n align-items: center;\n flex: none;\n}\n\n.addressForm {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.address {\n width: 100%;\n min-width: 0;\n height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.address::placeholder { color: var(--text-tertiary); }\n.address:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n.address[readonly] { color: var(--text-secondary); }\n\n.external {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: var(--density-row-sm);\n height: var(--density-row-sm);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n}\n.external:hover { background: var(--bg-hover); color: var(--text-primary); }\n/* No page to open elsewhere: the slot keeps its width, so the address bar does not jump. */\n.external[data-placeholder] { visibility: hidden; }\n\n/* ---- notices -------------------------------------------------------------- */\n\n.addressNote,\n.notice,\n.waiting {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n.addressNote { background: var(--status-info-bg); color: var(--status-info-fg); }\n.notice { background: var(--status-danger-bg); color: var(--status-danger-fg); }\n.waiting { background: var(--status-running-bg); color: var(--status-running-fg); }\n.addressNote > span,\n.notice > span { flex: 1; min-width: 0; }\n.addressNote a { color: inherit; font-weight: var(--font-weight-semibold); }\n.addressNote code,\n.waiting code {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n\n.waitingText {\n flex: 1;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n}\n\n/* The 1.6 s running pulse (DESIGN §13.5); stops under reduced motion. */\n.pulse {\n flex: none;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n background: var(--status-running-solid);\n animation: pulse var(--duration-pulse) ease-in-out infinite;\n}\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n\n.noticeClose {\n display: inline-flex;\n flex: none;\n padding: var(--space-1);\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: inherit;\n cursor: pointer;\n}\n\n/* ---- body ----------------------------------------------------------------- */\n\n.body {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n}\n\n.loading {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--card-pad);\n}\n\n.stage {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n flex: 1 1 auto;\n min-height: 0;\n}\n.stage[data-device='phone'] {\n align-items: center;\n padding: var(--space-3) 0;\n}\n\n.frame {\n flex: 1 1 auto;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--bg-surface);\n}\n.stage[data-device='phone'] .frame {\n flex: 1 1 auto;\n width: 375px;\n max-width: 100%;\n border: 1px solid var(--border-default);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-md);\n}\n\n.frameHint {\n flex: none;\n margin: 0;\n padding: var(--space-1) var(--space-3);\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n}\n.stage[data-device='phone'] .frameHint { align-self: stretch; margin-top: var(--space-3); }\n.frameHint a { color: var(--text-link); }\n\n.imageStage {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1 1 auto;\n min-height: 0;\n padding: var(--card-pad);\n background:\n repeating-conic-gradient(var(--bg-hover) 0 25%, transparent 0 50%) 0 0 / 16px 16px,\n var(--bg-surface);\n}\n.image {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n}\n\n.markdown {\n padding: var(--card-pad) var(--space-6);\n max-width: var(--measure-read);\n background: var(--bg-canvas);\n}\n\n/* ---- launcher ------------------------------------------------------------- */\n\n.launcher {\n display: flex;\n flex-direction: column;\n padding-bottom: var(--space-6);\n}\n\n.section { padding: var(--space-4) var(--card-pad) 0; }\n.section + .section {\n margin-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n}\n\n.sectionTitle {\n margin: 0 0 var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.muted {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-tertiary);\n}\n.muted code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n\n.rows {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.row {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n min-height: var(--density-row);\n padding: var(--space-2) 0;\n}\n.row + .row { border-top: 1px solid var(--border-subtle); }\n\n.dot {\n flex: none;\n width: 8px;\n height: 8px;\n border: 1.5px solid var(--text-tertiary);\n border-radius: var(--radius-full);\n}\n.dot[data-running] {\n border-color: var(--status-success-solid);\n background: var(--status-success-solid);\n}\n\n.fileIcon { flex: none; color: var(--text-tertiary); }\n\n.rowMain {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.rowTitle {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n\n.rowMeta {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n/* What Start will type (a launch.json row's label is only its name). */\n.rowCommand {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n/* ---- compact (375) -------------------------------------------------------- */\n\n.pane[data-compact] .toolbar { flex-wrap: wrap; }\n.pane[data-compact] .addressForm { order: 3; flex-basis: 100%; }\n.pane[data-compact] .section { padding-left: var(--space-3); padding-right: var(--space-3); }\n.pane[data-compact] .markdown { padding: var(--space-3); }\n.pane[data-compact] .tab { max-width: 150px; }\n\n@media (prefers-reduced-motion: reduce) {\n .pulse { animation: none; }\n .tabClose { transition: none; }\n}\n","/**\n * dock/preview/PreviewPane.tsx — the chat dock's Preview (unit C4; SPEC-310C\n * §3). Rendered by C2's Dock through C0's `preview-pane` slot.\n *\n * WHAT IT SHOWS, in tabs:\n * - a LOOPBACK dev server (http://localhost / 127.0.0.1 only) in an iframe,\n * with back / forward / reload, an address bar, and a Desktop / 375 frame;\n * anything else typed in the bar is offered as \"Open in browser ↗\";\n * - a file this chat WROTE — HTML, SVG, image, PDF through a short-lived\n * frame ticket and a CSP sandbox (an opaque origin: its own script runs,\n * Verse's cookies and API stay out of reach); Markdown rendered here,\n * sanitised, like a chat message.\n * An empty pane (or the + tab) is the launcher: the dev servers found in the\n * chat's folders — launch.json, package.json scripts, and anything already\n * listening inside them — and the chat's files. Start runs the server in a\n * TERMINAL tab (through the dock, never directly), then waits for its port\n * and opens it.\n *\n * WHAT THE FRAMES MAY DO. A dev server is a different origin (another port),\n * so `allow-same-origin` gives it ITS origin, never Verse's; the sandbox\n * still withholds top navigation, so a page can never navigate Verse away.\n * Verse's own address is refused outright. Back/forward walk the addresses\n * opened HERE: a cross-origin frame's own history is not readable.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, type FormEvent, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport type { VersePreviewArtifact, VersePreviewArtifactKind, VersePreviewDevServer, VersePreviewTargetsResponse } from '../../../../data/api-types.js';\nimport { ApiError } from '../../../../data/client.js';\nimport { Button, IconButton } from '../../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../../components/primitives/EmptyState.js';\nimport { Segmented } from '../../../../components/primitives/Segmented.js';\nimport { SkeletonLine } from '../../../../components/primitives/Skeleton.js';\nimport { IconExternalLink, IconPlus, IconX } from '../../../../components/primitives/icons.js';\nimport { MessageMarkdown } from '../../MessageMarkdown.js';\nimport { usePollWhileVisible, useSectionVisible } from '../../shell/section-visibility.js';\nimport type { PreviewOpenRequest, PreviewPaneProps } from '../../shell/slots.js';\nimport { useViewport } from '../../shell/viewport.js';\nimport {\n ArrowLeftGlyph,\n ArrowRightGlyph,\n DesktopGlyph,\n FileGlyph,\n PhoneGlyph,\n PlayGlyph,\n PreviewGlyph,\n ReloadGlyph,\n ServerGlyph,\n} from '../terminal/terminal-icons.js';\nimport { formatBytes, parsePreviewAddress, previewApi, shortUrl, type PreviewAddress, type PreviewApi } from './preview-client.js';\nimport chrome from '../pane-chrome.module.css';\nimport styles from './PreviewPane.module.css';\n\n// ---------------------------------------------------------------------------\n// Model\n// ---------------------------------------------------------------------------\n\nexport type PreviewTab =\n | { id: string; kind: 'launcher' }\n | { id: string; kind: 'url'; history: string[]; index: number; reloadKey: number }\n | { id: string; kind: 'artifact'; path: string; artifactKind: VersePreviewArtifactKind; reloadKey: number };\n\ntype Device = 'desktop' | 'phone';\n\ninterface Waiting {\n server: VersePreviewDevServer;\n since: number;\n}\n\ntype ArtifactContent =\n | { status: 'loading' }\n | { status: 'frame'; src: string }\n | { status: 'text'; text: string }\n | { status: 'error'; message: string };\n\nexport interface PreviewPaneDeps {\n api: PreviewApi;\n /** `window.location.origin`: Verse's own address, which is never framed. */\n origin: () => string;\n now: () => number;\n}\n\nconst DEFAULT_DEPS: PreviewPaneDeps = {\n api: previewApi,\n origin: () => window.location.origin,\n now: () => Date.now(),\n};\n\n/** How long Start waits for the server's port before saying so. */\nexport const PREVIEW_START_TIMEOUT_MS = 120_000;\nconst WAIT_POLL_MS = 2_000;\nconst LAUNCHER_POLL_MS = 5_000;\nconst STORAGE_PREFIX = 'ashlr.verse.preview.v1:';\nconst SOURCE_LABEL: Readonly<Record<VersePreviewDevServer['source'], string>> = {\n 'launch-json': 'launch.json',\n 'package-json': 'package.json',\n listening: 'running',\n};\nconst KIND_LABEL: Readonly<Record<VersePreviewArtifactKind, string>> = {\n html: 'HTML',\n md: 'Markdown',\n svg: 'SVG',\n image: 'Image',\n pdf: 'PDF',\n};\n\nlet lastHandledNonce = 0;\nlet idCounter = 0;\nconst nextId = (): string => `p${++idCounter}`;\n\n/** Test hygiene. */\nexport function resetPreviewPaneForTest(): void {\n lastHandledNonce = 0;\n idCounter = 0;\n}\n\nfunction kindFromPath(path: string): VersePreviewArtifactKind | null {\n const ext = path.toLowerCase().slice(path.lastIndexOf('.'));\n if (ext === '.html' || ext === '.htm') return 'html';\n if (ext === '.md' || ext === '.markdown') return 'md';\n if (ext === '.svg') return 'svg';\n if (ext === '.pdf') return 'pdf';\n if (['.png', '.jpg', '.jpeg', '.gif', '.webp', '.avif', '.bmp', '.ico'].includes(ext)) return 'image';\n return null;\n}\n\nfunction baseName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1) || path;\n}\n\nfunction tabLabel(tab: PreviewTab): string {\n if (tab.kind === 'launcher') return 'New tab';\n if (tab.kind === 'url') return shortUrl(tab.history[tab.index] ?? '');\n return baseName(tab.path);\n}\n\nfunction currentUrl(tab: PreviewTab | null): string | null {\n return tab?.kind === 'url' ? tab.history[tab.index] ?? null : null;\n}\n\n/** Tabs worth restoring after a reload (per viewer, per chat; never shared). */\nfunction loadTabs(sessionId: string, origin: string): { tabs: PreviewTab[]; activeId: string | null; device: Device } | null {\n try {\n const raw = localStorage.getItem(`${STORAGE_PREFIX}${sessionId}`);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { tabs?: unknown; active?: unknown; device?: unknown };\n const tabs: PreviewTab[] = [];\n let activeId: string | null = null;\n if (Array.isArray(parsed.tabs)) {\n parsed.tabs.slice(0, 12).forEach((t: unknown, i: number) => {\n if (!t || typeof t !== 'object') return;\n const rec = t as Record<string, unknown>;\n const id = nextId();\n if (rec['url'] && typeof rec['url'] === 'string' && parsePreviewAddress(rec['url'], origin).kind === 'loopback') {\n tabs.push({ id, kind: 'url', history: [rec['url']], index: 0, reloadKey: 0 });\n } else if (typeof rec['path'] === 'string') {\n const kind = kindFromPath(rec['path']);\n if (kind) tabs.push({ id, kind: 'artifact', path: rec['path'], artifactKind: kind, reloadKey: 0 });\n else return;\n } else {\n return;\n }\n if (parsed.active === i) activeId = id;\n });\n }\n return { tabs, activeId: activeId ?? tabs.at(-1)?.id ?? null, device: parsed.device === 'phone' ? 'phone' : 'desktop' };\n } catch {\n return null;\n }\n}\n\nfunction saveTabs(sessionId: string, tabs: readonly PreviewTab[], activeId: string | null, device: Device): void {\n try {\n const kept = tabs.filter((t) => t.kind !== 'launcher');\n localStorage.setItem(`${STORAGE_PREFIX}${sessionId}`, JSON.stringify({\n tabs: kept.map((t) => (t.kind === 'url' ? { url: t.history[t.index] } : t.kind === 'artifact' ? { path: t.path } : {})),\n active: kept.findIndex((t) => t.id === activeId),\n device,\n }));\n } catch {\n /* storage unavailable: tabs last for this page only */\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function PreviewPane({ sessionId, roots, request, onOpenTerminal, visible, deps: depsOverride }: PreviewPaneProps & { deps?: Partial<PreviewPaneDeps> }) {\n const deps = useMemo<PreviewPaneDeps>(() => ({ ...DEFAULT_DEPS, ...depsOverride }), [depsOverride]);\n const sectionVisible = useSectionVisible();\n const shown = visible && sectionVisible;\n const compact = useViewport().compact;\n\n const [restored] = useState(() => loadTabs(sessionId, deps.origin()));\n const [tabs, setTabs] = useState<PreviewTab[]>(() => restored?.tabs ?? []);\n const [activeId, setActiveId] = useState<string | null>(() => restored?.activeId ?? null);\n const [device, setDevice] = useState<Device>(() => restored?.device ?? 'desktop');\n // The dock keeps this pane mounted across chats: another chat brings ITS\n // tabs. Reset during render (not in an effect) so the save below never\n // writes one chat's tabs under another chat's key.\n const [owner, setOwner] = useState(sessionId);\n const [targets, setTargets] = useState<VersePreviewTargetsResponse | null>(null);\n const [targetsError, setTargetsError] = useState<string | null>(null);\n const [address, setAddress] = useState('');\n const [addressNote, setAddressNote] = useState<PreviewAddress | null>(null);\n const [waiting, setWaiting] = useState<Waiting | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [content, setContent] = useState<ReadonlyMap<string, ArtifactContent>>(() => new Map());\n const [clock, setClock] = useState(() => deps.now());\n const mounted = useRef(true);\n const tabRefs = useRef(new Map<string, HTMLButtonElement>());\n const addressRef = useRef<HTMLInputElement>(null);\n\n if (owner !== sessionId) {\n const next = loadTabs(sessionId, deps.origin());\n setOwner(sessionId);\n setTabs(next?.tabs ?? []);\n setActiveId(next?.activeId ?? null);\n setTargets(null);\n setWaiting(null);\n setNotice(null);\n }\n\n const active = tabs.find((t) => t.id === activeId) ?? null;\n const url = currentUrl(active);\n const showLauncher = !active || active.kind === 'launcher';\n\n useEffect(() => {\n mounted.current = true;\n return () => { mounted.current = false; };\n }, []);\n\n useEffect(() => {\n if (owner === sessionId) saveTabs(sessionId, tabs, activeId, device);\n }, [owner, sessionId, tabs, activeId, device]);\n\n // The address bar mirrors the tab shown.\n useEffect(() => {\n setAddress(active?.kind === 'url' ? (active.history[active.index] ?? '') : active?.kind === 'artifact' ? active.path : '');\n setAddressNote(null);\n }, [active]);\n\n // -------------------------------------------------------------------------\n // Targets\n // -------------------------------------------------------------------------\n\n const refreshTargets = useCallback(async (): Promise<VersePreviewTargetsResponse | null> => {\n try {\n const next = await deps.api.targets(sessionId);\n if (!mounted.current) return null;\n setTargets(next);\n setTargetsError(null);\n return next;\n } catch (err) {\n if (mounted.current) setTargetsError(err instanceof ApiError && err.detail ? err.detail : 'Dev servers and files could not be listed.');\n return null;\n }\n }, [deps.api, sessionId]);\n\n const fetchedFor = useRef<string | null>(null);\n useEffect(() => {\n if (!shown || fetchedFor.current === sessionId) return;\n fetchedFor.current = sessionId;\n void refreshTargets();\n }, [shown, sessionId, refreshTargets]);\n\n usePollWhileVisible(() => { void refreshTargets(); }, waiting ? WAIT_POLL_MS : LAUNCHER_POLL_MS, {\n enabled: visible && (waiting !== null || showLauncher),\n });\n\n // -------------------------------------------------------------------------\n // Tabs\n // -------------------------------------------------------------------------\n\n const openUrl = useCallback((href: string, opts: { newTab?: boolean } = {}) => {\n setNotice(null);\n const current = tabs.find((t) => t.id === activeId);\n // Reuse the launcher tab the operator is looking at; otherwise focus an\n // existing tab on that address, or open a new one.\n if (!opts.newTab && current?.kind === 'launcher') {\n setTabs(tabs.map((t) => (t.id === current.id ? { id: t.id, kind: 'url', history: [href], index: 0, reloadKey: 0 } : t)));\n return;\n }\n const existing = tabs.find((t) => t.kind === 'url' && t.history[t.index] === href);\n if (existing && !opts.newTab) {\n setActiveId(existing.id);\n return;\n }\n const id = nextId();\n setTabs([...tabs, { id, kind: 'url', history: [href], index: 0, reloadKey: 0 }]);\n setActiveId(id);\n }, [tabs, activeId]);\n\n const navigateActive = useCallback((href: string) => {\n if (!active || active.kind !== 'url') {\n openUrl(href);\n return;\n }\n setTabs((prev) => prev.map((t) => {\n if (t.id !== active.id || t.kind !== 'url') return t;\n const history = [...t.history.slice(0, t.index + 1), href].slice(-50);\n return { ...t, history, index: history.length - 1 };\n }));\n }, [active, openUrl]);\n\n const openArtifact = useCallback((path: string, kind: VersePreviewArtifactKind) => {\n setNotice(null);\n const existing = tabs.find((t) => t.kind === 'artifact' && t.path === path);\n if (existing) {\n setActiveId(existing.id);\n return;\n }\n const current = tabs.find((t) => t.id === activeId);\n if (current?.kind === 'launcher') {\n setTabs(tabs.map((t) => (t.id === current.id ? { id: t.id, kind: 'artifact', path, artifactKind: kind, reloadKey: 0 } : t)));\n return;\n }\n const id = nextId();\n setTabs([...tabs, { id, kind: 'artifact', path, artifactKind: kind, reloadKey: 0 }]);\n setActiveId(id);\n }, [tabs, activeId]);\n\n const newLauncherTab = () => {\n const existing = tabs.find((t) => t.kind === 'launcher');\n if (existing) {\n setActiveId(existing.id);\n } else {\n const id = nextId();\n setTabs((prev) => [...prev, { id, kind: 'launcher' }]);\n setActiveId(id);\n }\n void refreshTargets();\n };\n\n const closeTab = (tab: PreviewTab) => {\n const index = tabs.findIndex((t) => t.id === tab.id);\n const rest = tabs.filter((t) => t.id !== tab.id);\n setTabs(rest);\n setContent((prev) => { const next = new Map(prev); for (const key of prev.keys()) if (key.startsWith(`${tab.id}:`)) next.delete(key); return next; });\n if (activeId === tab.id) setActiveId((rest[index] ?? rest[index - 1] ?? null)?.id ?? null);\n };\n\n const onTabKeyDown = (event: ReactKeyboardEvent<HTMLButtonElement>, index: number) => {\n let next = -1;\n if (event.key === 'ArrowRight') next = (index + 1) % tabs.length;\n else if (event.key === 'ArrowLeft') next = (index - 1 + tabs.length) % tabs.length;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = tabs.length - 1;\n if (next < 0) return;\n event.preventDefault();\n const tab = tabs[next]!;\n setActiveId(tab.id);\n tabRefs.current.get(tab.id)?.focus();\n };\n\n // -------------------------------------------------------------------------\n // Dev servers: open, start, wait\n // -------------------------------------------------------------------------\n\n const startServer = useCallback((server: VersePreviewDevServer) => {\n setNotice(null);\n onOpenTerminal({ root: server.root, devServerId: server.id });\n setWaiting({ server, since: deps.now() });\n }, [deps, onOpenTerminal]);\n\n const openServer = useCallback((server: VersePreviewDevServer) => {\n if (server.running) openUrl(server.url);\n else startServer(server);\n }, [openUrl, startServer]);\n\n // Waiting for a started server: open it the moment its port answers.\n useEffect(() => {\n if (!waiting || !targets) return;\n const up = targets.devServers.find((s) => s.running && (s.id === waiting.server.id || s.port === waiting.server.port));\n if (up) {\n setWaiting(null);\n openUrl(waiting.server.url);\n return;\n }\n if (deps.now() - waiting.since > PREVIEW_START_TIMEOUT_MS) {\n setWaiting(null);\n setNotice(`Nothing answered on port ${waiting.server.port} within 2 minutes. Check the terminal for errors.`);\n }\n // `clock` ticks every second while waiting, so the timeout is noticed\n // even when a poll brings nothing new.\n }, [targets, waiting, openUrl, deps, clock]);\n\n // The elapsed-time label while waiting (display only; the poll is separate).\n useEffect(() => {\n if (!waiting) return;\n const id = setInterval(() => setClock(deps.now()), 1_000);\n return () => clearInterval(id);\n }, [waiting, deps]);\n\n // -------------------------------------------------------------------------\n // Requests from the dock\n // -------------------------------------------------------------------------\n\n const handleRequest = useCallback(async (req: PreviewOpenRequest) => {\n if (req.url) {\n const parsed = parsePreviewAddress(req.url, deps.origin());\n if (parsed.kind === 'loopback') openUrl(parsed.url);\n else setAddressNote(parsed);\n return;\n }\n if (req.artifactPath) {\n const listed = targets?.artifacts.find((a) => a.path === req.artifactPath);\n const kind = listed?.kind ?? kindFromPath(req.artifactPath);\n if (kind) openArtifact(req.artifactPath, kind);\n else setNotice('That file cannot be previewed.');\n return;\n }\n if (req.devServerId) {\n const list = (await refreshTargets()) ?? targets;\n const server = list?.devServers.find((s) => s.id === req.devServerId);\n if (server) openServer(server);\n else setNotice('That dev server is no longer listed for this chat.');\n }\n }, [deps, openArtifact, openServer, openUrl, refreshTargets, targets]);\n\n useEffect(() => {\n if (!request || request.nonce <= lastHandledNonce) return;\n lastHandledNonce = request.nonce;\n void handleRequest(request);\n }, [request, handleRequest]);\n\n // -------------------------------------------------------------------------\n // Artifact content (visible tab only)\n // -------------------------------------------------------------------------\n\n const contentKey = active?.kind === 'artifact' ? `${active.id}:${active.reloadKey}` : null;\n useEffect(() => {\n if (!shown || !active || active.kind !== 'artifact' || !contentKey || content.has(contentKey)) return;\n const tab = active;\n const key = contentKey;\n setContent((prev) => new Map(prev).set(key, { status: 'loading' }));\n const load = tab.artifactKind === 'md'\n ? deps.api.text(sessionId, tab.path).then((text): ArtifactContent => ({ status: 'text', text }))\n : deps.api.ticket(sessionId, tab.path).then((ticket): ArtifactContent => ({ status: 'frame', src: ticket.url }));\n load.then(\n (value) => { if (mounted.current) setContent((prev) => new Map(prev).set(key, value)); },\n (err: unknown) => {\n const message = err instanceof ApiError && err.status === 404\n ? 'This file is no longer in the chat\\'s folder.'\n : err instanceof ApiError && err.status === 413\n ? 'This file is larger than 5 MB, too large to preview.'\n : 'This file could not be loaded.';\n if (mounted.current) setContent((prev) => new Map(prev).set(key, { status: 'error', message }));\n },\n );\n }, [shown, active, contentKey, content, deps.api, sessionId]);\n\n // -------------------------------------------------------------------------\n // Toolbar\n // -------------------------------------------------------------------------\n\n const go = (delta: -1 | 1) => {\n if (!active || active.kind !== 'url') return;\n setTabs((prev) => prev.map((t) => (t.id === active.id && t.kind === 'url'\n ? { ...t, index: Math.min(t.history.length - 1, Math.max(0, t.index + delta)) }\n : t)));\n };\n\n const reload = () => {\n if (!active) return;\n if (active.kind === 'launcher') {\n void refreshTargets();\n return;\n }\n setTabs((prev) => prev.map((t) => (t.id === active.id && t.kind !== 'launcher' ? { ...t, reloadKey: t.reloadKey + 1 } : t)));\n };\n\n const submitAddress = (event: FormEvent) => {\n event.preventDefault();\n const parsed = parsePreviewAddress(address, deps.origin());\n if (parsed.kind === 'loopback') {\n setAddressNote(null);\n if (active?.kind === 'url') navigateActive(parsed.url);\n else openUrl(parsed.url);\n return;\n }\n setAddressNote(parsed);\n };\n\n const onAddressKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n setAddress(url ?? (active?.kind === 'artifact' ? active.path : ''));\n setAddressNote(null);\n event.currentTarget.blur();\n };\n\n const canBack = active?.kind === 'url' && active.index > 0;\n const canForward = active?.kind === 'url' && active.index < active.history.length - 1;\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n return (\n <div className={styles.pane} data-compact={compact || undefined}>\n <div className={styles.strip}>\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Previews\">\n {tabs.map((tab, index) => {\n const selected = tab.id === activeId;\n const label = tabLabel(tab);\n return (\n <div key={tab.id} className={styles.tab} data-selected={selected || undefined} role=\"presentation\">\n <button\n ref={(node) => { if (node) tabRefs.current.set(tab.id, node); else tabRefs.current.delete(tab.id); }}\n type=\"button\"\n role=\"tab\"\n id={`preview-tab-${tab.id}`}\n aria-selected={selected}\n aria-controls=\"preview-panel\"\n tabIndex={selected ? 0 : -1}\n className={styles.tabButton}\n title={tab.kind === 'url' ? tab.history[tab.index] : tab.kind === 'artifact' ? tab.path : 'Choose what to preview'}\n onClick={() => setActiveId(tab.id)}\n onKeyDown={(event) => onTabKeyDown(event, index)}\n >\n {tab.kind === 'artifact' ? <FileGlyph size={12} /> : tab.kind === 'url' ? <ServerGlyph size={12} /> : <PreviewGlyph size={12} />}\n <span className={styles.tabTitle}>{label}</span>\n </button>\n <button type=\"button\" className={styles.tabClose} aria-label={`Close preview ${label}`} title=\"Close\"\n onClick={() => closeTab(tab)}>\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconPlus />} aria-label=\"New preview tab\" title=\"New preview tab\"\n className={styles.newTab} onClick={newLauncherTab} />\n </div>\n\n <div className={`${chrome.header} ${styles.toolbar}`}>\n <div className={styles.nav}>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ArrowLeftGlyph />} aria-label=\"Back\" title=\"Back\" disabled={!canBack} onClick={() => go(-1)} />\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ArrowRightGlyph />} aria-label=\"Forward\" title=\"Forward\" disabled={!canForward} onClick={() => go(1)} />\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ReloadGlyph />} aria-label={showLauncher ? 'Refresh the list' : 'Reload'}\n title={showLauncher ? 'Refresh the list' : 'Reload'}\n disabled={!active && showLauncher && targets === null} onClick={reload} />\n </div>\n <form className={styles.addressForm} onSubmit={submitAddress} role=\"search\" aria-label=\"Preview address\">\n <input\n ref={addressRef}\n className={styles.address}\n value={address}\n onChange={(event) => setAddress(event.target.value)}\n onKeyDown={onAddressKeyDown}\n onFocus={(event) => event.currentTarget.select()}\n placeholder=\"localhost:5173\"\n aria-label=\"Address\"\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n inputMode=\"url\"\n readOnly={active?.kind === 'artifact'}\n />\n </form>\n <div className={chrome.actions}>\n {!compact ? (\n <Segmented<Device>\n aria-label=\"Frame width\"\n size=\"sm\"\n value={device}\n onChange={setDevice}\n options={[\n { value: 'desktop', label: <DesktopGlyph size={14} />, ariaLabel: 'Desktop width' },\n { value: 'phone', label: <PhoneGlyph size={14} />, ariaLabel: '375 px width' },\n ]}\n />\n ) : null}\n {url ? (\n <a className={styles.external} href={url} target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Open in browser\" title=\"Open in browser\">\n <IconExternalLink />\n </a>\n ) : (\n // Holds the link's place so the address bar keeps its width when a\n // page opens or closes (no link to offer for a file or the launcher).\n <span className={styles.external} data-placeholder=\"true\" aria-hidden=\"true\" />\n )}\n </div>\n </div>\n\n {addressNote ? <AddressNote note={addressNote} onDismiss={() => setAddressNote(null)} /> : null}\n\n {waiting ? (\n <div className={styles.waiting} role=\"status\">\n <span className={styles.pulse} aria-hidden=\"true\" />\n <span className={styles.waitingText}>\n Starting <code>{waiting.server.command ?? waiting.server.label}</code> — waiting for {shortUrl(waiting.server.url)}\n {' · '}\n {Math.max(0, Math.round((clock - waiting.since) / 1000))}s\n </span>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setWaiting(null)}>Stop waiting</Button>\n </div>\n ) : null}\n\n {notice ? (\n <div className={styles.notice} role=\"alert\">\n <span>{notice}</span>\n <button type=\"button\" className={styles.noticeClose} aria-label=\"Dismiss\" title=\"Dismiss\" onClick={() => setNotice(null)}><IconX size={12} /></button>\n </div>\n ) : null}\n\n <div className={styles.body} id=\"preview-panel\" role=\"tabpanel\" aria-labelledby={active ? `preview-tab-${active.id}` : undefined}>\n {showLauncher ? (\n <Launcher\n targets={targets}\n error={targetsError}\n roots={roots}\n onOpenServer={openServer}\n onOpenArtifact={(a) => openArtifact(a.path, a.kind)}\n onRetry={() => void refreshTargets()}\n onOpenTerminal={() => onOpenTerminal(roots[0] ? { root: roots[0] } : {})}\n waitingId={waiting?.server.id ?? null}\n />\n ) : active?.kind === 'url' ? (\n <div className={styles.stage} data-device={device}>\n <iframe\n key={`${active.id}:${active.index}:${active.reloadKey}`}\n className={styles.frame}\n src={active.history[active.index]}\n title={`Preview of ${tabLabel(active)}`}\n // A dev server is another origin: allow-same-origin is ITS origin.\n // No allow-top-navigation: it can never navigate Verse away.\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-downloads\"\n referrerPolicy=\"no-referrer\"\n />\n <p className={styles.frameHint}>\n Blank page? Some servers refuse to be framed.{' '}\n <a href={active.history[active.index]} target=\"_blank\" rel=\"noopener noreferrer\">Open in browser ↗</a>\n </p>\n </div>\n ) : active?.kind === 'artifact' ? (\n <ArtifactView tab={active} content={contentKey ? content.get(contentKey) ?? { status: 'loading' } : { status: 'loading' }} device={device}\n onRetry={reload} />\n ) : null}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Pieces\n// ---------------------------------------------------------------------------\n\nfunction AddressNote({ note, onDismiss }: { note: PreviewAddress; onDismiss: () => void }) {\n return (\n <div className={styles.addressNote} role=\"status\">\n {note.kind === 'external' ? (\n <span>\n Only local dev servers open here.{' '}\n <a href={note.url} target=\"_blank\" rel=\"noopener noreferrer\">Open in browser ↗</a>\n </span>\n ) : note.kind === 'self' ? (\n <span>That address is Verse itself.</span>\n ) : (\n <span>Enter a local address, like <code>localhost:5173</code>.</span>\n )}\n <button type=\"button\" className={styles.noticeClose} aria-label=\"Dismiss\" title=\"Dismiss\" onClick={onDismiss}><IconX size={12} /></button>\n </div>\n );\n}\n\nfunction ArtifactView({ tab, content, device, onRetry }: { tab: Extract<PreviewTab, { kind: 'artifact' }>; content: ArtifactContent; device: Device; onRetry: () => void }) {\n if (content.status === 'loading') {\n return <div className={styles.loading} aria-busy=\"true\"><SkeletonLine width=\"50%\" /><SkeletonLine width=\"80%\" /></div>;\n }\n if (content.status === 'error') {\n return <EmptyState compact tone=\"error\" title=\"Preview unavailable\" body={content.message}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={onRetry}>Try again</Button>} />;\n }\n if (content.status === 'text') {\n return (\n <article className={styles.markdown} aria-label={tab.path}>\n <MessageMarkdown text={content.text} />\n </article>\n );\n }\n if (tab.artifactKind === 'image') {\n return (\n <div className={styles.imageStage}>\n <img className={styles.image} src={content.src} alt={baseName(tab.path)} />\n </div>\n );\n }\n return (\n <div className={styles.stage} data-device={tab.artifactKind === 'pdf' ? 'desktop' : device}>\n <iframe\n key={content.src}\n className={styles.frame}\n src={content.src}\n title={`Preview of ${tab.path}`}\n // HTML and SVG run in a sandbox with NO same-origin (the server's CSP\n // says the same): their own script works, Verse stays out of reach.\n // PDF viewers refuse to run sandboxed (see preview.ts PDF_CSP).\n {...(tab.artifactKind === 'pdf' ? {} : { sandbox: 'allow-scripts' })}\n referrerPolicy=\"no-referrer\"\n />\n </div>\n );\n}\n\nfunction Launcher({ targets, error, roots, onOpenServer, onOpenArtifact, onRetry, onOpenTerminal, waitingId }: {\n targets: VersePreviewTargetsResponse | null;\n error: string | null;\n roots: readonly string[];\n onOpenServer: (server: VersePreviewDevServer) => void;\n onOpenArtifact: (artifact: VersePreviewArtifact) => void;\n onRetry: () => void;\n /** Opens a terminal (below this pane) in the chat's first folder, to start a server by hand. */\n onOpenTerminal: () => void;\n waitingId: string | null;\n}) {\n if (!targets) {\n if (error) {\n return <EmptyState compact tone=\"error\" title=\"Could not list what to preview\" body={error}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={onRetry}>Try again</Button>} />;\n }\n return <div className={styles.loading} aria-busy=\"true\"><SkeletonLine width=\"35%\" /><SkeletonLine width=\"70%\" /><SkeletonLine width=\"60%\" /></div>;\n }\n const multiRoot = roots.length > 1;\n if (targets.devServers.length === 0 && targets.artifacts.length === 0) {\n return (\n <EmptyState\n compact\n icon={<PreviewGlyph size={20} />}\n title=\"Nothing to preview yet\"\n body=\"Start a dev server in the terminal, or ask for an HTML report. Local servers and the files this chat writes show up here.\"\n action={<Button size=\"sm\" variant=\"subtle\" onClick={onOpenTerminal}>Open a terminal</Button>}\n />\n );\n }\n return (\n <div className={styles.launcher}>\n <section className={styles.section} aria-labelledby=\"preview-servers-title\">\n <h3 className={styles.sectionTitle} id=\"preview-servers-title\">Dev servers</h3>\n {targets.devServers.length === 0 ? (\n <p className={styles.muted}>No dev server found in this chat's folders. Add one to <code>.claude/launch.json</code>, or start it in the terminal.</p>\n ) : (\n <ul className={styles.rows}>\n {targets.devServers.map((server) => (\n <li key={server.id} className={styles.row}>\n <span className={styles.dot} data-running={server.running || undefined} aria-hidden=\"true\" />\n <span className={styles.rowMain}>\n <span className={styles.rowTitle} title={server.label}>{server.label}</span>\n <span className={styles.rowMeta}\n title={`${shortUrl(server.url)} · ${server.running ? 'running' : 'stopped'} · ${SOURCE_LABEL[server.source]}${multiRoot ? ` · ${server.root}` : ''}`}>\n {shortUrl(server.url)} · {server.running ? 'running' : 'stopped'} · {SOURCE_LABEL[server.source]}\n {multiRoot ? ` · ${baseName(server.root)}` : ''}\n </span>\n {/* What Start will type, before the click — a launch.json row's\n label is only its name. Skipped when the label already is it. */}\n {!server.running && server.command && server.command !== server.label ? (\n <code className={styles.rowCommand} title={server.command}>{server.command}</code>\n ) : null}\n </span>\n {server.running ? (\n <Button size=\"sm\" variant=\"subtle\" onClick={() => onOpenServer(server)} aria-label={`Open ${server.label}`}>Open</Button>\n ) : (\n <Button size=\"sm\" variant=\"subtle\" icon={<PlayGlyph size={12} />} busy={waitingId === server.id}\n onClick={() => onOpenServer(server)} aria-label={`Start ${server.label}`}\n title={`Runs ${server.command ?? server.label} in a terminal tab`}>\n Start\n </Button>\n )}\n </li>\n ))}\n </ul>\n )}\n </section>\n <section className={styles.section} aria-labelledby=\"preview-files-title\">\n <h3 className={styles.sectionTitle} id=\"preview-files-title\">This chat's files</h3>\n {targets.artifacts.length === 0 ? (\n <p className={styles.muted}>Ask the chat for a report or a page: HTML, Markdown, SVG, images and PDFs it writes appear here.</p>\n ) : (\n <ul className={styles.rows}>\n {targets.artifacts.map((artifact) => {\n const tooBig = artifact.bytes > 5 * 1024 * 1024;\n return (\n <li key={artifact.path} className={styles.row}>\n <FileGlyph size={14} className={styles.fileIcon} />\n <span className={styles.rowMain}>\n <span className={styles.rowTitle} title={artifact.path}>{artifact.path}</span>\n <span className={styles.rowMeta}>{KIND_LABEL[artifact.kind]} · {formatBytes(artifact.bytes)}</span>\n </span>\n <Button size=\"sm\" variant=\"subtle\" disabled={tooBig} title={tooBig ? 'Larger than 5 MB' : undefined}\n onClick={() => onOpenArtifact(artifact)} aria-label={`Open ${artifact.path}`}>\n Open\n </Button>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n </div>\n );\n}\n"],"mappings":"snBAiBa,EAA4B,4BAezC,SAAS,EAAM,EAAwC,CACrD,OAAO,IAAI,gBAAgB,CAAM,CAAC,CAAC,SAAS,CAC9C,CAEA,IAAa,EAAyB,CACpC,SAAU,EAAW,IAAW,EAAoC,GAAG,GAA2B,GAAG,EAAM,CAAE,WAAU,CAAC,IAAK,CAAM,EACnI,QAAS,EAAW,IAAS,EAAsB,GAAG,EAA0B,GAAG,EAAM,CAAE,YAAW,MAAK,CAAC,GAAG,EAC/G,KAAM,MAAO,EAAW,IAAS,CAC/B,IAAM,EAAM,GAAG,EAAuB,GAAG,EAAM,CAAE,YAAW,MAAK,CAAC,IAC5D,EAAM,MAAM,MAAM,EAAK,CAAE,YAAa,cAAe,QAAS,CAAE,sBAAuB,EAAmB,CAAE,CAAE,CAAC,EACrH,GAAI,EAAI,SAAW,IAEjB,MADA,EAAqB,EACf,IAAI,EAAS,wBAAyB,IAAK,CAAG,EAEtD,GAAI,CAAC,EAAI,GAAI,MAAM,IAAI,EAAS,OAAO,EAAI,gBAAgB,EAAI,OAAO,IAAK,EAAI,OAAQ,CAAG,EAC1F,OAAO,EAAI,KAAK,CAClB,CACF,EAcA,SAAS,EAAO,EAAkB,CAChC,OAAO,EAAI,OAAS,EAAI,WAAa,SAAW,MAAQ,KAC1D,CAQA,SAAgB,EAAoB,EAAe,EAAqC,CACtF,IAAM,EAAM,EAAM,KAAK,EACvB,GAAI,EAAI,SAAW,GAAK,EAAI,OAAS,MAAQ,KAAK,KAAK,CAAG,EAAG,MAAO,CAAE,KAAM,SAAU,EACtF,IAAI,EAAY,EAChB,GAAI,cAAc,KAAK,CAAG,EAAG,EAAY,oBAAoB,EAAI,QAAQ,IAAK,EAAE,EAAE,QAC7E,GAAI,yDAAyD,KAAK,CAAG,EAAG,EAAY,UAAU,SAC9F,GAAI,CAAC,uBAAuB,KAAK,CAAG,EAAG,CAC1C,GAAI,CAAC,iDAAiD,KAAK,CAAG,EAAG,MAAO,CAAE,KAAM,SAAU,EAC1F,EAAY,WAAW,GACzB,CACA,IAAI,EACJ,GAAI,CACF,EAAM,IAAI,IAAI,CAAS,CACzB,MAAQ,CACN,MAAO,CAAE,KAAM,SAAU,CAC3B,CACA,GAAI,EAAI,WAAa,SAAW,EAAI,WAAa,SAAU,MAAO,CAAE,KAAM,SAAU,EACpF,GAAI,EAAqB,EAAI,IAAI,EAAG,CAClC,IAAI,EAAoB,KACxB,GAAI,CAAE,EAAQ,IAAI,IAAI,CAAW,CAAG,MAAQ,CAAE,EAAQ,IAAM,CAG5D,OAFsB,IAAU,EAAM,WAAa,aAAe,EAAM,WAAa,cAChE,EAAO,CAAM,IAAM,EAAO,CAAG,EAAU,CAAE,KAAM,OAAQ,IAAK,EAAI,IAAK,EACnF,CAAE,KAAM,WAAY,IAAK,EAAI,IAAK,CAC3C,CAEA,OADI,EAAI,UAAY,EAAI,SAAiB,CAAE,KAAM,SAAU,EACpD,CAAE,KAAM,WAAY,IAAK,EAAI,IAAK,CAC3C,CAGA,SAAgB,EAAS,EAAsB,CAC7C,GAAI,CACF,IAAM,EAAM,IAAI,IAAI,CAAI,EAClB,EAAO,EAAI,WAAa,IAAM,GAAK,EAAI,SAC7C,MAAO,GAAG,EAAI,OAAO,IAAO,EAAI,QAClC,MAAQ,CACN,OAAO,CACT,CACF,CAEA,SAAgB,EAAY,EAAuB,CAIjD,MAHI,CAAC,OAAO,SAAS,CAAK,GAAK,EAAQ,EAAU,IAC7C,EAAQ,KAAa,GAAG,EAAM,IAC9B,EAAQ,QAAoB,IAAI,EAAQ,KAAA,CAAM,QAAQ,IAAQ,MAAiB,EAAE,KAC9E,IAAI,EAAS,QAAA,CAAc,QAAQ,CAAC,EAAE,IAC/C,umCErCM,GAAgC,CACpC,IAAK,EACL,WAAc,OAAO,SAAS,OAC9B,QAAW,KAAK,IAAI,CACtB,EAGa,GAA2B,KAClC,GAAe,IACf,GAAmB,IACnB,EAAiB,0BACjB,EAA0E,CAC9E,cAAe,cACf,eAAgB,eAChB,UAAW,SACb,EACM,GAAiE,CACrE,KAAM,OACN,GAAI,WACJ,IAAK,MACL,MAAO,QACP,IAAK,KACP,EAEI,EAAmB,EACnB,EAAY,EACV,MAAuB,IAAI,EAAE,IAGnC,SAAgB,GAAgC,CAC9C,EAAmB,EACnB,EAAY,CACd,CAEA,SAAS,EAAa,EAA+C,CACnE,IAAM,EAAM,EAAK,YAAY,CAAC,CAAC,MAAM,EAAK,YAAY,GAAG,CAAC,EAM1D,OALI,IAAQ,SAAW,IAAQ,OAAe,OAC1C,IAAQ,OAAS,IAAQ,YAAoB,KAC7C,IAAQ,OAAe,MACvB,IAAQ,OAAe,MACvB,CAAC,OAAQ,OAAQ,QAAS,OAAQ,QAAS,QAAS,OAAQ,MAAM,CAAC,CAAC,SAAS,CAAG,EAAU,QACvF,IACT,CAEA,SAAS,EAAS,EAAsB,CACtC,OAAO,EAAK,MAAM,EAAK,YAAY,GAAG,EAAI,CAAC,GAAK,CAClD,CAEA,SAAS,GAAS,EAAyB,CAGzC,OAFI,EAAI,OAAS,WAAmB,UAChC,EAAI,OAAS,MAAc,EAAS,EAAI,QAAQ,EAAI,QAAU,EAAE,EAC7D,EAAS,EAAI,IAAI,CAC1B,CAEA,SAAS,GAAW,EAAuC,CACzD,OAAO,GAAK,OAAS,MAAQ,EAAI,QAAQ,EAAI,QAAU,KAAO,IAChE,CAGA,SAAS,GAAS,EAAmB,EAAwF,CAC3H,GAAI,CACF,IAAM,EAAM,aAAa,QAAQ,GAAG,IAAiB,GAAW,EAChE,GAAI,CAAC,EAAK,OAAO,KACjB,IAAM,EAAS,KAAK,MAAM,CAAG,EACvB,EAAqB,CAAC,EACxB,EAA0B,KAkB9B,OAjBI,MAAM,QAAQ,EAAO,IAAI,GAC3B,EAAO,KAAK,MAAM,EAAG,EAAE,CAAC,CAAC,SAAS,EAAY,IAAc,CAC1D,GAAI,CAAC,GAAK,OAAO,GAAM,SAAU,OACjC,IAAM,EAAM,EACN,EAAK,EAAO,EAClB,GAAI,EAAI,KAAU,OAAO,EAAI,KAAW,UAAY,EAAoB,EAAI,IAAQ,CAAM,CAAC,CAAC,OAAS,WACnG,EAAK,KAAK,CAAE,KAAI,KAAM,MAAO,QAAS,CAAC,EAAI,GAAM,EAAG,MAAO,EAAG,UAAW,CAAE,CAAC,OACvE,GAAI,OAAO,EAAI,MAAY,SAAU,CAC1C,IAAM,EAAO,EAAa,EAAI,IAAO,EACrC,GAAI,EAAM,EAAK,KAAK,CAAE,KAAI,KAAM,WAAY,KAAM,EAAI,KAAS,aAAc,EAAM,UAAW,CAAE,CAAC,OAC5F,MACP,MACE,OAEE,EAAO,SAAW,IAAG,EAAW,EACtC,CAAC,EAEI,CAAE,OAAM,SAAU,GAAY,EAAK,GAAG,EAAE,CAAC,EAAE,IAAM,KAAM,OAAQ,EAAO,SAAW,QAAU,QAAU,SAAU,CACxH,MAAQ,CACN,OAAO,IACT,CACF,CAEA,SAAS,GAAS,EAAmB,EAA6B,EAAyB,EAAsB,CAC/G,GAAI,CACF,IAAM,EAAO,EAAK,OAAQ,GAAM,EAAE,OAAS,UAAU,EACrD,aAAa,QAAQ,GAAG,IAAiB,IAAa,KAAK,UAAU,CACnE,KAAM,EAAK,IAAK,GAAO,EAAE,OAAS,MAAQ,CAAE,IAAK,EAAE,QAAQ,EAAE,MAAO,EAAI,EAAE,OAAS,WAAa,CAAE,KAAM,EAAE,IAAK,EAAI,CAAC,CAAE,EACtH,OAAQ,EAAK,UAAW,GAAM,EAAE,KAAO,CAAQ,EAC/C,QACF,CAAC,CAAC,CACJ,MAAQ,CAER,CACF,CAMA,SAAgB,EAAY,CAAE,YAAW,QAAO,UAAS,iBAAgB,UAAS,KAAM,GAAwE,CAC9J,IAAM,GAAA,EAAO,EAAA,QAAA,MAAgC,CAAE,GAAG,GAAc,GAAG,CAAa,GAAI,CAAC,CAAY,CAAC,EAC5F,GAAiB,EAAkB,EACnC,EAAQ,GAAW,GACnB,EAAU,GAAY,CAAC,CAAC,QAExB,CAAC,IAAA,EAAY,EAAA,SAAA,KAAe,GAAS,EAAW,EAAK,OAAO,CAAC,CAAC,EAC9D,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,KAA6B,GAAU,MAAQ,CAAC,CAAC,EACnE,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,KAA8B,GAAU,UAAY,IAAI,EAClF,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,KAAuB,GAAU,QAAU,SAAS,EAI1E,CAAC,EAAO,KAAA,EAAY,EAAA,SAAA,CAAS,CAAS,EACtC,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAA6C,IAAI,EACzE,CAAC,GAAc,IAAA,EAAmB,EAAA,SAAA,CAAwB,IAAI,EAC9D,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAS,EAAE,EACnC,CAAC,EAAa,IAAA,EAAkB,EAAA,SAAA,CAAgC,IAAI,EACpE,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAyB,IAAI,EACrD,CAAC,GAAQ,IAAA,EAAa,EAAA,SAAA,CAAwB,IAAI,EAClD,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,KAAqD,IAAI,GAAK,EACtF,CAAC,GAAO,KAAA,EAAY,EAAA,SAAA,KAAe,EAAK,IAAI,CAAC,EAC7C,GAAA,EAAU,EAAA,OAAA,CAAO,EAAI,EACrB,GAAA,EAAU,EAAA,OAAA,CAAO,IAAI,GAAgC,EACrD,IAAA,EAAa,EAAA,OAAA,CAAyB,IAAI,EAEhD,GAAI,IAAU,EAAW,CACvB,IAAM,EAAO,GAAS,EAAW,EAAK,OAAO,CAAC,EAC9C,GAAS,CAAS,EAClB,EAAQ,GAAM,MAAQ,CAAC,CAAC,EACxB,EAAY,GAAM,UAAY,IAAI,EAClC,EAAW,IAAI,EACf,EAAW,IAAI,EACf,EAAU,IAAI,CAChB,CAEA,IAAM,EAAS,EAAK,KAAM,GAAM,EAAE,KAAO,CAAQ,GAAK,KAChD,EAAM,GAAW,CAAM,EACvB,EAAe,CAAC,GAAU,EAAO,OAAS,YAEhD,EAAA,EAAA,UAAA,MACE,EAAQ,QAAU,OACL,CAAE,EAAQ,QAAU,EAAO,GACvC,CAAC,CAAC,GAEL,EAAA,EAAA,UAAA,KAAgB,CACV,IAAU,GAAW,GAAS,EAAW,EAAM,EAAU,CAAM,CACrE,EAAG,CAAC,EAAO,EAAW,EAAM,EAAU,CAAM,CAAC,GAG7C,EAAA,EAAA,UAAA,KAAgB,CACd,EAAW,GAAQ,OAAS,MAAS,EAAO,QAAQ,EAAO,QAAU,GAAM,GAAQ,OAAS,WAAa,EAAO,KAAO,EAAE,EACzH,EAAe,IAAI,CACrB,EAAG,CAAC,CAAM,CAAC,EAMX,IAAM,GAAA,EAAiB,EAAA,YAAA,CAAY,SAAyD,CAC1F,GAAI,CACF,IAAM,EAAO,MAAM,EAAK,IAAI,QAAQ,CAAS,EAI7C,OAHK,EAAQ,SACb,EAAW,CAAI,EACf,EAAgB,IAAI,EACb,GAHsB,IAI/B,OAAS,EAAK,CAEZ,OADI,EAAQ,SAAS,EAAgB,aAAe,GAAY,EAAI,OAAS,EAAI,OAAS,4CAA4C,EAC/H,IACT,CACF,EAAG,CAAC,EAAK,IAAK,CAAS,CAAC,EAElB,IAAA,EAAa,EAAA,OAAA,CAAsB,IAAI,GAC7C,EAAA,EAAA,UAAA,KAAgB,CACT,GAAS,GAAW,UAAY,IACrC,GAAW,QAAU,EACrB,EAAoB,EACtB,EAAG,CAAC,EAAO,EAAW,CAAc,CAAC,EAErC,MAA0B,CAAE,EAAoB,CAAG,EAAG,EAAU,GAAe,GAAkB,CAC/F,QAAS,IAAY,IAAY,MAAQ,EAC3C,CAAC,EAMD,IAAM,GAAA,EAAU,EAAA,YAAA,EAAa,EAAc,EAA6B,CAAC,IAAM,CAC7E,EAAU,IAAI,EACd,IAAM,EAAU,EAAK,KAAM,GAAM,EAAE,KAAO,CAAQ,EAGlD,GAAI,CAAC,EAAK,QAAU,GAAS,OAAS,WAAY,CAChD,EAAQ,EAAK,IAAK,GAAO,EAAE,KAAO,EAAQ,GAAK,CAAE,GAAI,EAAE,GAAI,KAAM,MAAO,QAAS,CAAC,CAAI,EAAG,MAAO,EAAG,UAAW,CAAE,EAAI,CAAE,CAAC,EACvH,MACF,CACA,IAAM,EAAW,EAAK,KAAM,GAAM,EAAE,OAAS,OAAS,EAAE,QAAQ,EAAE,SAAW,CAAI,EACjF,GAAI,GAAY,CAAC,EAAK,OAAQ,CAC5B,EAAY,EAAS,EAAE,EACvB,MACF,CACA,IAAM,EAAK,EAAO,EAClB,EAAQ,CAAC,GAAG,EAAM,CAAE,KAAI,KAAM,MAAO,QAAS,CAAC,CAAI,EAAG,MAAO,EAAG,UAAW,CAAE,CAAC,CAAC,EAC/E,EAAY,CAAE,CAChB,EAAG,CAAC,EAAM,CAAQ,CAAC,EAEb,IAAA,EAAiB,EAAA,YAAA,CAAa,GAAiB,CACnD,GAAI,CAAC,GAAU,EAAO,OAAS,MAAO,CACpC,EAAQ,CAAI,EACZ,MACF,CACA,EAAS,GAAS,EAAK,IAAK,GAAM,CAChC,GAAI,EAAE,KAAO,EAAO,IAAM,EAAE,OAAS,MAAO,OAAO,EACnD,IAAM,EAAU,CAAC,GAAG,EAAE,QAAQ,MAAM,EAAG,EAAE,MAAQ,CAAC,EAAG,CAAI,CAAC,CAAC,MAAM,GAAG,EACpE,MAAO,CAAE,GAAG,EAAG,UAAS,MAAO,EAAQ,OAAS,CAAE,CACpD,CAAC,CAAC,CACJ,EAAG,CAAC,EAAQ,CAAO,CAAC,EAEd,GAAA,EAAe,EAAA,YAAA,EAAa,EAAc,IAAmC,CACjF,EAAU,IAAI,EACd,IAAM,EAAW,EAAK,KAAM,GAAM,EAAE,OAAS,YAAc,EAAE,OAAS,CAAI,EAC1E,GAAI,EAAU,CACZ,EAAY,EAAS,EAAE,EACvB,MACF,CACA,IAAM,EAAU,EAAK,KAAM,GAAM,EAAE,KAAO,CAAQ,EAClD,GAAI,GAAS,OAAS,WAAY,CAChC,EAAQ,EAAK,IAAK,GAAO,EAAE,KAAO,EAAQ,GAAK,CAAE,GAAI,EAAE,GAAI,KAAM,WAAY,OAAM,aAAc,EAAM,UAAW,CAAE,EAAI,CAAE,CAAC,EAC3H,MACF,CACA,IAAM,EAAK,EAAO,EAClB,EAAQ,CAAC,GAAG,EAAM,CAAE,KAAI,KAAM,WAAY,OAAM,aAAc,EAAM,UAAW,CAAE,CAAC,CAAC,EACnF,EAAY,CAAE,CAChB,EAAG,CAAC,EAAM,CAAQ,CAAC,EAEb,OAAuB,CAC3B,IAAM,EAAW,EAAK,KAAM,GAAM,EAAE,OAAS,UAAU,EACvD,GAAI,EACF,EAAY,EAAS,EAAE,MAClB,CACL,IAAM,EAAK,EAAO,EAClB,EAAS,GAAS,CAAC,GAAG,EAAM,CAAE,KAAI,KAAM,UAAW,CAAC,CAAC,EACrD,EAAY,CAAE,CAChB,CACA,EAAoB,CACtB,EAEM,GAAY,GAAoB,CACpC,IAAM,EAAQ,EAAK,UAAW,GAAM,EAAE,KAAO,EAAI,EAAE,EAC7C,EAAO,EAAK,OAAQ,GAAM,EAAE,KAAO,EAAI,EAAE,EAC/C,EAAQ,CAAI,EACZ,EAAY,GAAS,CAAE,IAAM,EAAO,IAAI,IAAI,CAAI,EAAG,IAAK,IAAM,KAAO,EAAK,KAAK,EAAO,EAAI,WAAW,GAAG,EAAI,GAAG,EAAE,GAAG,EAAK,OAAO,CAAG,EAAG,OAAO,CAAM,CAAC,EAChJ,IAAa,EAAI,IAAI,GAAa,EAAK,IAAU,EAAK,EAAQ,IAAM,KAAA,EAAO,IAAM,IAAI,CAC3F,EAEM,IAAgB,EAA8C,IAAkB,CACpF,IAAI,EAAO,GAKX,GAJI,EAAM,MAAQ,aAAc,GAAQ,EAAQ,GAAK,EAAK,OACjD,EAAM,MAAQ,YAAa,GAAQ,EAAQ,EAAI,EAAK,QAAU,EAAK,OACnE,EAAM,MAAQ,OAAQ,EAAO,EAC7B,EAAM,MAAQ,QAAO,EAAO,EAAK,OAAS,GAC/C,EAAO,EAAG,OACd,EAAM,eAAe,EACrB,IAAM,EAAM,EAAK,GACjB,EAAY,EAAI,EAAE,EAClB,EAAQ,QAAQ,IAAI,EAAI,EAAE,CAAC,EAAE,MAAM,CACrC,EAMM,IAAA,EAAc,EAAA,YAAA,CAAa,GAAkC,CACjE,EAAU,IAAI,EACd,EAAe,CAAE,KAAM,EAAO,KAAM,YAAa,EAAO,EAAG,CAAC,EAC5D,EAAW,CAAE,SAAQ,MAAO,EAAK,IAAI,CAAE,CAAC,CAC1C,EAAG,CAAC,EAAM,CAAc,CAAC,EAEnB,GAAA,EAAa,EAAA,YAAA,CAAa,GAAkC,CAC5D,EAAO,QAAS,EAAQ,EAAO,GAAG,EACjC,GAAY,CAAM,CACzB,EAAG,CAAC,EAAS,EAAW,CAAC,GAGzB,EAAA,EAAA,UAAA,KAAgB,CACV,GAAC,GAAY,EAEjB,IADW,EAAQ,WAAW,KAAM,GAAM,EAAE,UAAY,EAAE,KAAO,EAAQ,OAAO,IAAM,EAAE,OAAS,EAAQ,OAAO,KAC5G,EAAI,CACN,EAAW,IAAI,EACf,EAAQ,EAAQ,OAAO,GAAG,EAC1B,MACF,CACI,EAAK,IAAI,EAAI,EAAQ,MAAA,OACvB,EAAW,IAAI,EACf,EAAU,4BAA4B,EAAQ,OAAO,KAAK,kDAAkD,EAH9G,CAOF,EAAG,CAAC,EAAS,EAAS,EAAS,EAAM,EAAK,CAAC,GAG3C,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,EAAS,OACd,IAAM,EAAK,gBAAkB,GAAS,EAAK,IAAI,CAAC,EAAG,GAAK,EACxD,UAAa,cAAc,CAAE,CAC/B,EAAG,CAAC,EAAS,CAAI,CAAC,EAMlB,IAAM,GAAA,EAAgB,EAAA,YAAA,CAAY,KAAO,IAA4B,CACnE,GAAI,EAAI,IAAK,CACX,IAAM,EAAS,EAAoB,EAAI,IAAK,EAAK,OAAO,CAAC,EACrD,EAAO,OAAS,WAAY,EAAQ,EAAO,GAAG,EAC7C,EAAe,CAAM,EAC1B,MACF,CACA,GAAI,EAAI,aAAc,CAEpB,IAAM,EADS,GAAS,UAAU,KAAM,GAAM,EAAE,OAAS,EAAI,YAAY,CAAA,EACpD,MAAQ,EAAa,EAAI,YAAY,EACtD,EAAM,EAAa,EAAI,aAAc,CAAI,EACxC,EAAU,gCAAgC,EAC/C,MACF,CACA,GAAI,EAAI,YAAa,CAEnB,IAAM,GADQ,MAAM,EAAe,GAAM,EAAA,EACpB,WAAW,KAAM,GAAM,EAAE,KAAO,EAAI,WAAW,EAChE,EAAQ,EAAW,CAAM,EACxB,EAAU,oDAAoD,CACrE,CACF,EAAG,CAAC,EAAM,EAAc,EAAY,EAAS,EAAgB,CAAO,CAAC,GAErE,EAAA,EAAA,UAAA,KAAgB,CACV,CAAC,GAAW,EAAQ,OAAS,IACjC,EAAmB,EAAQ,MAC3B,EAAmB,CAAO,EAC5B,EAAG,CAAC,EAAS,CAAa,CAAC,EAM3B,IAAM,EAAa,GAAQ,OAAS,WAAa,GAAG,EAAO,GAAG,GAAG,EAAO,YAAc,MACtF,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,GAAS,CAAC,GAAU,EAAO,OAAS,YAAc,CAAC,GAAc,EAAQ,IAAI,CAAU,EAAG,OAC/F,IAAM,EAAM,EACN,EAAM,EACZ,EAAY,GAAS,IAAI,IAAI,CAAI,CAAC,CAAC,IAAI,EAAK,CAAE,OAAQ,SAAU,CAAC,CAAC,GACrD,EAAI,eAAiB,KAC9B,EAAK,IAAI,KAAK,EAAW,EAAI,IAAI,CAAC,CAAC,KAAM,IAA2B,CAAE,OAAQ,OAAQ,MAAK,EAAE,EAC7F,EAAK,IAAI,OAAO,EAAW,EAAI,IAAI,CAAC,CAAC,KAAM,IAA6B,CAAE,OAAQ,QAAS,IAAK,EAAO,GAAI,EAAE,EAAA,CAC5G,KACF,GAAU,CAAM,EAAQ,SAAS,EAAY,GAAS,IAAI,IAAI,CAAI,CAAC,CAAC,IAAI,EAAK,CAAK,CAAC,CAAG,EACtF,GAAiB,CAChB,IAAM,EAAU,aAAe,GAAY,EAAI,SAAW,IACtD,+CACA,aAAe,GAAY,EAAI,SAAW,IACxC,uDACA,iCACF,EAAQ,SAAS,EAAY,GAAS,IAAI,IAAI,CAAI,CAAC,CAAC,IAAI,EAAK,CAAE,OAAQ,QAAS,SAAQ,CAAC,CAAC,CAChG,CACF,CACF,EAAG,CAAC,EAAO,EAAQ,EAAY,EAAS,EAAK,IAAK,CAAS,CAAC,EAM5D,IAAM,GAAM,GAAkB,CACvB,GAAU,EAAO,OAAS,OAC/B,EAAS,GAAS,EAAK,IAAK,GAAO,EAAE,KAAO,EAAO,IAAM,EAAE,OAAS,MAChE,CAAE,GAAG,EAAG,MAAO,KAAK,IAAI,EAAE,QAAQ,OAAS,EAAG,KAAK,IAAI,EAAG,EAAE,MAAQ,CAAK,CAAC,CAAE,EAC5E,CAAE,CAAC,CACT,EAEM,OAAe,CACd,KACL,IAAI,EAAO,OAAS,WAAY,CAC9B,EAAoB,EACpB,MACF,CACA,EAAS,GAAS,EAAK,IAAK,GAAO,EAAE,KAAO,EAAO,IAAM,EAAE,OAAS,WAAa,CAAE,GAAG,EAAG,UAAW,EAAE,UAAY,CAAE,EAAI,CAAE,CAAC,CAD3H,CAEF,EAEM,GAAiB,GAAqB,CAC1C,EAAM,eAAe,EACrB,IAAM,EAAS,EAAoB,EAAS,EAAK,OAAO,CAAC,EACzD,GAAI,EAAO,OAAS,WAAY,CAC9B,EAAe,IAAI,EACf,GAAQ,OAAS,MAAO,GAAe,EAAO,GAAG,EAChD,EAAQ,EAAO,GAAG,EACvB,MACF,CACA,EAAe,CAAM,CACvB,EAEM,GAAoB,GAAgD,CACpE,EAAM,MAAQ,WAClB,EAAM,eAAe,EACrB,EAAW,IAAQ,GAAQ,OAAS,WAAa,EAAO,KAAO,GAAG,EAClE,EAAe,IAAI,EACnB,EAAM,cAAc,KAAK,EAC3B,EAEM,GAAU,GAAQ,OAAS,OAAS,EAAO,MAAQ,EACnD,GAAa,GAAQ,OAAS,OAAS,EAAO,MAAQ,EAAO,QAAQ,OAAS,EAMpF,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,eAAc,GAAW,IAAA,GAAtD,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,KAAK,UAAU,aAAW,WACpD,SAAA,EAAK,KAAK,EAAK,IAAU,CACxB,IAAM,EAAW,EAAI,KAAO,EACtB,EAAQ,GAAS,CAAG,EAC1B,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAkB,UAAW,EAAO,IAAK,gBAAe,GAAY,IAAA,GAAW,KAAK,eAApF,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,IAAM,GAAS,CAAM,EAAM,EAAQ,QAAQ,IAAI,EAAI,GAAI,CAAI,EAAQ,EAAQ,QAAQ,OAAO,EAAI,EAAE,CAAG,EACnG,KAAK,SACL,KAAK,MACL,GAAI,eAAe,EAAI,KACvB,gBAAe,EACf,gBAAc,gBACd,SAAU,EAAW,EAAI,GACzB,UAAW,EAAO,UAClB,MAAO,EAAI,OAAS,MAAQ,EAAI,QAAQ,EAAI,OAAS,EAAI,OAAS,WAAa,EAAI,KAAO,yBAC1F,YAAe,EAAY,EAAI,EAAE,EACjC,UAAY,GAAU,GAAa,EAAO,CAAK,EAXjD,SAAA,CAaG,EAAI,OAAS,YAAa,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,KAAM,EAAK,CAAA,EAAI,EAAI,OAAS,OAAQ,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAK,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,KAAM,EAAK,CAAA,GAC/H,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAW,SAAA,CAAY,CAAA,CACzC,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,SAAU,aAAY,iBAAiB,IAAS,MAAM,QAC5F,YAAe,GAAS,CAAG,EAC3B,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,KAAM,EAAK,CAAA,CACZ,CAAA,CACL,CArBK,EAAA,EAAI,EAqBT,CAET,CAAC,CACE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,CAAA,EAAG,aAAW,kBAAkB,MAAM,kBAC3F,UAAW,EAAO,OAAQ,QAAS,EAAiB,CAAA,CACnD,KAEL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,GAAO,OAAO,GAAG,EAAO,UAA3C,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAiB,CAAA,EAAG,aAAW,OAAO,MAAM,OAAO,SAAU,CAAC,GAAS,YAAe,GAAG,EAAE,CAAI,CAAA,GAC3I,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,CAAA,EAAG,aAAW,UAAU,MAAM,UAAU,SAAU,CAAC,GAAY,YAAe,GAAG,CAAC,CAAI,CAAA,GACpJ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,CAAA,EAAG,aAAY,EAAe,mBAAqB,SAC3G,MAAO,EAAe,mBAAqB,SAC3C,SAAU,CAAC,GAAU,GAAgB,IAAY,KAAM,QAAS,EAAS,CAAA,CACxE,KACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAa,SAAU,GAAe,KAAK,SAAS,aAAW,kBACrF,UAAA,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,IAAK,GACL,UAAW,EAAO,QAClB,MAAO,EACP,SAAW,GAAU,EAAW,EAAM,OAAO,KAAK,EAClD,UAAW,GACX,QAAU,GAAU,EAAM,cAAc,OAAO,EAC/C,YAAY,iBACZ,aAAW,UACX,WAAY,GACZ,eAAe,MACf,YAAY,MACZ,UAAU,MACV,SAAU,GAAQ,OAAS,UAC5B,CAAA,CACG,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAO,QAAvB,SAAA,CACI,EAWE,MAVF,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,aAAW,cACX,KAAK,KACL,MAAO,EACP,SAAU,EACV,QAAS,CACP,CAAE,MAAO,UAAW,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,KAAM,EAAK,CAAA,EAAG,UAAW,eAAgB,EAClF,CAAE,MAAO,QAAS,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,KAAM,EAAK,CAAA,EAAG,UAAW,cAAe,CAC/E,CACD,CAAA,EAEF,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,SAAU,KAAM,EAAK,OAAO,SAAS,IAAI,sBAAsB,aAAW,kBAAkB,MAAM,kBACrH,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAmB,CAAA,CAClB,CAAA,GAIH,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,mBAAiB,OAAO,cAAY,MAAQ,CAAA,CAE7E,GACF,IAEJ,GAAc,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAa,cAAiB,EAAe,IAAI,CAAI,CAAA,EAAI,KAE1F,GACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAS,KAAK,SAArC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,cAAY,MAAQ,CAAA,GACnD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAxB,SAAA,CAAqC,aAC1B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAQ,OAAO,SAAW,EAAQ,OAAO,KAAY,CAAA,EAAC,kBAAgB,EAAS,EAAQ,OAAO,GAAG,EAChH,MACA,KAAK,IAAI,EAAG,KAAK,OAAO,GAAQ,EAAQ,OAAS,GAAI,CAAC,EAAE,GACrD,KACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,KAAK,QAAQ,QAAQ,YAAe,EAAW,IAAI,EAAG,SAAA,cAAoB,CAAA,CACpF,CACH,CAAA,EAAA,KAEH,IACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAQ,KAAK,QAApC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAa,CAAA,GACpB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,YAAa,aAAW,UAAU,MAAM,UAAU,YAAe,EAAU,IAAI,EAAG,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,KAAM,EAAK,CAAA,CAAS,CAAA,CAClJ,CACH,CAAA,EAAA,MAEJ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,GAAG,gBAAgB,KAAK,WAAW,kBAAiB,EAAS,eAAe,EAAO,KAAO,IAAA,GACpH,SAAA,GACC,EAAA,EAAA,IAAA,CAAC,GAAD,CACW,UACT,MAAO,GACA,QACP,aAAc,EACd,eAAiB,GAAM,EAAa,EAAE,KAAM,EAAE,IAAI,EAClD,YAAe,KAAK,EAAe,EACnC,mBAAsB,EAAe,EAAM,GAAK,CAAE,KAAM,EAAM,EAAG,EAAI,CAAC,CAAC,EACvE,UAAW,GAAS,OAAO,IAAM,IAClC,CAAA,EACC,GAAQ,OAAS,OACnB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAO,cAAa,EAA3C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAEE,UAAW,EAAO,MAClB,IAAK,EAAO,QAAQ,EAAO,OAC3B,MAAO,cAAc,GAAS,CAAM,IAGpC,QAAQ,wFACR,eAAe,aAChB,EARM,GAAG,EAAO,GAAG,GAAG,EAAO,MAAM,GAAG,EAAO,WAQ7C,GACD,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CAAgC,gDACgB,KAC9C,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,KAAM,EAAO,QAAQ,EAAO,OAAQ,OAAO,SAAS,IAAI,sBAAsB,SAAA,mBAAoB,CAAA,CACpG,CACA,CAAA,CAAA,CACH,CAAA,EAAA,GAAQ,OAAS,YACnB,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,IAAK,EAAQ,QAAS,EAAa,EAAQ,IAAI,CAAU,GAAK,CAAE,OAAQ,SAAU,EAAI,CAAE,OAAQ,SAAU,EAAW,SACjI,QAAS,EAAS,CAAA,EAClB,IACD,CAAA,CACF,GAET,CAMA,SAAS,GAAY,CAAE,OAAM,aAA8D,CACzF,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAa,KAAK,SAAzC,SAAA,CACG,EAAK,OAAS,YACb,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,oCAC8B,KAClC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,KAAM,EAAK,IAAK,OAAO,SAAS,IAAI,sBAAsB,SAAA,mBAAoB,CAAA,CAC7E,CAAA,CAAA,EACJ,EAAK,OAAS,QAChB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,+BAAmC,CAAA,GAEzC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,gCAA4B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,gBAAoB,CAAA,EAAC,GAAO,CAAA,CAAA,GAEtE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,YAAa,aAAW,UAAU,MAAM,UAAU,QAAS,EAAW,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,KAAM,EAAK,CAAA,CAAS,CAAA,CACtI,GAET,CAEA,SAAS,GAAa,CAAE,MAAK,UAAS,SAAQ,WAA8H,CAsB1K,OArBI,EAAQ,SAAW,WACd,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAS,YAAU,OAA1C,SAAA,EAAiD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,CAAM,IAEnH,EAAQ,SAAW,SACd,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAA,GAAQ,KAAK,QAAQ,MAAM,sBAAsB,KAAM,EAAQ,QAChF,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,KAAK,QAAQ,SAAS,QAAS,EAAS,SAAA,WAAiB,CAAA,CAAI,CAAA,EAElF,EAAQ,SAAW,QAEnB,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW,EAAO,SAAU,aAAY,EAAI,KACnD,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,KAAM,EAAQ,IAAO,CAAA,CAC/B,CAAA,EAGT,EAAI,eAAiB,SAErB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WACrB,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAO,IAAK,EAAQ,IAAK,IAAK,EAAS,EAAI,IAAI,CAAI,CAAA,CACvE,CAAA,GAIP,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAO,cAAa,EAAI,eAAiB,MAAQ,UAAY,EAClF,UAAA,EAAA,EAAA,IAAA,CAAC,SAAD,CAEE,UAAW,EAAO,MAClB,IAAK,EAAQ,IACb,MAAO,cAAc,EAAI,OAIzB,GAAK,EAAI,eAAiB,MAAQ,CAAC,EAAI,CAAE,QAAS,eAAgB,EAClE,eAAe,aAChB,EATM,EAAQ,GASd,CACE,CAAA,CAET,CAEA,SAAS,GAAS,CAAE,UAAS,QAAO,QAAO,eAAc,iBAAgB,UAAS,iBAAgB,aAU/F,CACD,GAAI,CAAC,EAKH,OAJI,GACK,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAA,GAAQ,KAAK,QAAQ,MAAM,iCAAiC,KAAM,EACnF,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,KAAK,QAAQ,SAAS,QAAS,EAAS,SAAA,WAAiB,CAAA,CAAI,CAAA,GAE/E,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAS,YAAU,OAA1C,SAAA,EAAiD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,CAAM,IAEnJ,IAAM,EAAY,EAAM,OAAS,EAYjC,OAXI,EAAQ,WAAW,SAAW,GAAK,EAAQ,UAAU,SAAW,GAEhE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAA,GACA,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,KAAM,EAAK,CAAA,EAC/B,MAAM,yBACN,KAAK,4HACL,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,KAAK,QAAQ,SAAS,QAAS,EAAgB,SAAA,iBAAuB,CAAA,CAC5F,CAAA,GAIH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,QAAS,kBAAgB,wBAApD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,aAAc,GAAG,wBAAwB,SAAA,aAAe,CAAA,EAC7E,EAAQ,WAAW,SAAW,GAC7B,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAArB,SAAA,CAA4B,2DAAuD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,qBAAyB,CAAA,EAAC,gCAAiC,CAEpJ,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAQ,WAAW,IAAK,IACvB,EAAA,EAAA,KAAA,CAAC,KAAD,CAAoB,UAAW,EAAO,IAAtC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,eAAc,EAAO,SAAW,IAAA,GAAW,cAAY,MAAQ,CAAA,GAC5F,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,MAAO,EAAO,MAAQ,SAAA,EAAO,KAAY,CAAA,GAC3E,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QACtB,MAAO,GAAG,EAAS,EAAO,GAAG,EAAE,KAAK,EAAO,QAAU,UAAY,UAAU,KAAK,EAAa,EAAO,UAAU,EAAY,MAAM,EAAO,OAAS,KADlJ,SAAA,CAEG,EAAS,EAAO,GAAG,EAAE,MAAI,EAAO,QAAU,UAAY,UAAU,MAAI,EAAa,EAAO,QACxF,EAAY,MAAM,EAAS,EAAO,IAAI,IAAM,EACzC,IAGL,CAAC,EAAO,SAAW,EAAO,SAAW,EAAO,UAAY,EAAO,OAC9D,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAY,MAAO,EAAO,QAAU,SAAA,EAAO,OAAc,CAAA,EAC/E,IACA,IACL,EAAO,SACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,KAAK,QAAQ,SAAS,YAAe,EAAa,CAAM,EAAG,aAAY,QAAQ,EAAO,QAAS,SAAA,MAAY,CAAA,GAExH,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,KAAK,QAAQ,SAAS,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,EAAG,KAAM,IAAc,EAAO,GAC3F,YAAe,EAAa,CAAM,EAAG,aAAY,SAAS,EAAO,QACjE,MAAO,QAAQ,EAAO,SAAW,EAAO,MAAM,oBAAqB,SAAA,OAE7D,CAAA,CAER,CAxBK,EAAA,EAAO,EAwBZ,CACL,CACC,CAAA,CAEC,CACT,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,QAAS,kBAAgB,sBAApD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,aAAc,GAAG,sBAAsB,SAAA,mBAAqB,CAAA,EACjF,EAAQ,UAAU,SAAW,GAC5B,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,SAAA,kGAAmG,CAAA,GAE/H,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAQ,UAAU,IAAK,GAAa,CACnC,IAAM,EAAS,EAAS,MAAQ,QAChC,OACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAwB,UAAW,EAAO,IAA1C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,KAAM,GAAI,UAAW,EAAO,QAAW,CAAA,GAClD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,MAAO,EAAS,KAAO,SAAA,EAAS,IAAW,CAAA,GAC7E,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAxB,SAAA,CAAkC,GAAW,EAAS,MAAM,MAAI,EAAY,EAAS,KAAK,CAAQ,CAC9F,CAAA,CAAA,KACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,KAAK,QAAQ,SAAS,SAAU,EAAQ,MAAO,EAAS,mBAAqB,IAAA,GACxF,YAAe,EAAe,CAAQ,EAAG,aAAY,QAAQ,EAAS,OAAQ,SAAA,MAExE,CAAA,CACN,CAVK,EAAA,EAAS,IAUd,CAER,CAAC,CACC,CAAA,CAEC,CACN,CAAA,CAAA,GAET"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./index-QesfXBsb.js";var t=e(),n={claude:{name:`Anthropic Claude`,fill:`#D97757`,rule:`nonzero`,d:`M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z`},codex:{name:`OpenAI`,fill:null,rule:`evenodd`,d:`M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z`},grok:{name:`xAI Grok`,fill:null,rule:`evenodd`,d:`M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815`},local:{name:`Ollama`,fill:null,rule:`evenodd`,d:`M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z`}};function r({engine:e,size:r=16,className:i,style:a,title:o,x:s,y:c}){let l=n[e];return l?(0,t.jsx)(`svg`,{viewBox:`0 0 24 24`,x:s,y:c,width:r,height:r,className:i,style:{flex:`none`,...a},role:o?`img`:void 0,"aria-hidden":!o||void 0,"aria-label":o,focusable:`false`,"data-provider":e,children:(0,t.jsx)(`path`,{d:l.d,fill:l.fill??`currentColor`,fillRule:l.rule})}):null}export{r as t};
2
- //# sourceMappingURL=ProviderLogo-CT2cSfkg.js.map
1
+ import{n as e}from"./index-DZ-UQ7v8.js";var t=e(),n={claude:{name:`Anthropic Claude`,fill:`#D97757`,rule:`nonzero`,d:`M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z`},codex:{name:`OpenAI`,fill:null,rule:`evenodd`,d:`M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z`},grok:{name:`xAI Grok`,fill:null,rule:`evenodd`,d:`M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815`},local:{name:`Ollama`,fill:null,rule:`evenodd`,d:`M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z`}};function r({engine:e,size:r=16,className:i,style:a,title:o,x:s,y:c}){let l=n[e];return l?(0,t.jsx)(`svg`,{viewBox:`0 0 24 24`,x:s,y:c,width:r,height:r,className:i,style:{flex:`none`,...a},role:o?`img`:void 0,"aria-hidden":!o||void 0,"aria-label":o,focusable:`false`,"data-provider":e,children:(0,t.jsx)(`path`,{d:l.d,fill:l.fill??`currentColor`,fillRule:l.rule})}):null}export{r as t};
2
+ //# sourceMappingURL=ProviderLogo-Cq-CYIwT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderLogo-CT2cSfkg.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/ProviderLogo.tsx"],"sourcesContent":["/**\n * Provider marks for the four engines Verse runs on — Claude (Anthropic),\n * Codex (OpenAI), Grok (xAI) and local models (Ollama).\n *\n * Path data from @lobehub/icons (MIT, https://github.com/lobehub/lobe-icons),\n * inlined so the marks need no network and no runtime dependency. The marks\n * themselves are the owners' trademarks, used only to identify the provider\n * an account belongs to. Claude keeps its brand colour; the others draw in\n * currentColor so they follow the theme (light and dark) like any glyph.\n *\n * Decorative by default (aria-hidden): the provider NAME is always rendered\n * as text beside the mark. Pass `title` only where the mark stands alone.\n */\nimport type { CSSProperties } from 'react';\n\nexport type ProviderEngine = 'claude' | 'codex' | 'grok' | 'local';\n\ninterface Mark { d: string; fill: string | null; rule: 'evenodd' | 'nonzero'; name: string }\n\nconst MARKS: Readonly<Record<ProviderEngine, Mark>> = {\n claude: { name: 'Anthropic Claude', fill: \"#D97757\", rule: 'nonzero', d: \"M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z\" },\n codex: { name: 'OpenAI', fill: null, rule: 'evenodd', d: \"M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z\" },\n grok: { name: 'xAI Grok', fill: null, rule: 'evenodd', d: \"M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815\" },\n local: { name: 'Ollama', fill: null, rule: 'evenodd', d: \"M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z\" },\n};\n\nexport function providerName(engine: ProviderEngine): string {\n return MARKS[engine].name;\n}\n\nexport function ProviderLogo({ engine, size = 16, className, style, title, x, y }: {\n engine: ProviderEngine;\n size?: number;\n /** Position when nested inside an SVG chart (e.g. a lane label). */\n x?: number;\n y?: number;\n className?: string;\n style?: CSSProperties;\n /** Accessible name; omit when the provider's name is shown as text nearby. */\n title?: string;\n}) {\n const mark = MARKS[engine];\n if (!mark) return null;\n return (\n <svg\n viewBox=\"0 0 24 24\"\n x={x}\n y={y}\n width={size}\n height={size}\n className={className}\n style={{ flex: 'none', ...style }}\n role={title ? 'img' : undefined}\n aria-hidden={title ? undefined : true}\n aria-label={title}\n focusable=\"false\"\n data-provider={engine}\n >\n <path d={mark.d} fill={mark.fill ?? 'currentColor'} fillRule={mark.rule} />\n </svg>\n );\n}\n"],"mappings":"kDAmBM,EAAgD,CACpD,OAAQ,CAAE,KAAM,mBAAoB,KAAM,UAAW,KAAM,UAAW,EAAG,69CAA89C,EACviD,MAAO,CAAE,KAAM,SAAU,KAAM,KAAM,KAAM,UAAW,EAAG,+8CAAg9C,EACzgD,KAAM,CAAE,KAAM,WAAY,KAAM,KAAM,KAAM,UAAW,EAAG,8iBAA+iB,EACzmB,MAAO,CAAE,KAAM,SAAU,KAAM,KAAM,KAAM,UAAW,EAAG,khGAAmhG,CAC9kG,EAMA,SAAgB,EAAa,CAAE,SAAQ,OAAO,GAAI,YAAW,QAAO,QAAO,IAAG,KAU3E,CACD,IAAM,EAAO,EAAM,GAEnB,OADK,GAEH,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,QAAQ,YACL,IACA,IACH,MAAO,EACP,OAAQ,EACG,YACX,MAAO,CAAE,KAAM,OAAQ,GAAG,CAAM,EAChC,KAAM,EAAQ,MAAQ,IAAA,GACtB,cAAa,IAAQ,IAAA,GACrB,aAAY,EACZ,UAAU,QACV,gBAAe,EAEf,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAG,EAAK,EAAG,KAAM,EAAK,MAAQ,eAAgB,SAAU,EAAK,IAAO,CAAA,CACvE,CAAA,EAjBW,IAmBpB"}
1
+ {"version":3,"file":"ProviderLogo-Cq-CYIwT.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/ProviderLogo.tsx"],"sourcesContent":["/**\n * Provider marks for the four engines Verse runs on — Claude (Anthropic),\n * Codex (OpenAI), Grok (xAI) and local models (Ollama).\n *\n * Path data from @lobehub/icons (MIT, https://github.com/lobehub/lobe-icons),\n * inlined so the marks need no network and no runtime dependency. The marks\n * themselves are the owners' trademarks, used only to identify the provider\n * an account belongs to. Claude keeps its brand colour; the others draw in\n * currentColor so they follow the theme (light and dark) like any glyph.\n *\n * Decorative by default (aria-hidden): the provider NAME is always rendered\n * as text beside the mark. Pass `title` only where the mark stands alone.\n */\nimport type { CSSProperties } from 'react';\n\nexport type ProviderEngine = 'claude' | 'codex' | 'grok' | 'local';\n\ninterface Mark { d: string; fill: string | null; rule: 'evenodd' | 'nonzero'; name: string }\n\nconst MARKS: Readonly<Record<ProviderEngine, Mark>> = {\n claude: { name: 'Anthropic Claude', fill: \"#D97757\", rule: 'nonzero', d: \"M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z\" },\n codex: { name: 'OpenAI', fill: null, rule: 'evenodd', d: \"M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z\" },\n grok: { name: 'xAI Grok', fill: null, rule: 'evenodd', d: \"M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815\" },\n local: { name: 'Ollama', fill: null, rule: 'evenodd', d: \"M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z\" },\n};\n\nexport function providerName(engine: ProviderEngine): string {\n return MARKS[engine].name;\n}\n\nexport function ProviderLogo({ engine, size = 16, className, style, title, x, y }: {\n engine: ProviderEngine;\n size?: number;\n /** Position when nested inside an SVG chart (e.g. a lane label). */\n x?: number;\n y?: number;\n className?: string;\n style?: CSSProperties;\n /** Accessible name; omit when the provider's name is shown as text nearby. */\n title?: string;\n}) {\n const mark = MARKS[engine];\n if (!mark) return null;\n return (\n <svg\n viewBox=\"0 0 24 24\"\n x={x}\n y={y}\n width={size}\n height={size}\n className={className}\n style={{ flex: 'none', ...style }}\n role={title ? 'img' : undefined}\n aria-hidden={title ? undefined : true}\n aria-label={title}\n focusable=\"false\"\n data-provider={engine}\n >\n <path d={mark.d} fill={mark.fill ?? 'currentColor'} fillRule={mark.rule} />\n </svg>\n );\n}\n"],"mappings":"kDAmBM,EAAgD,CACpD,OAAQ,CAAE,KAAM,mBAAoB,KAAM,UAAW,KAAM,UAAW,EAAG,69CAA89C,EACviD,MAAO,CAAE,KAAM,SAAU,KAAM,KAAM,KAAM,UAAW,EAAG,+8CAAg9C,EACzgD,KAAM,CAAE,KAAM,WAAY,KAAM,KAAM,KAAM,UAAW,EAAG,8iBAA+iB,EACzmB,MAAO,CAAE,KAAM,SAAU,KAAM,KAAM,KAAM,UAAW,EAAG,khGAAmhG,CAC9kG,EAMA,SAAgB,EAAa,CAAE,SAAQ,OAAO,GAAI,YAAW,QAAO,QAAO,IAAG,KAU3E,CACD,IAAM,EAAO,EAAM,GAEnB,OADK,GAEH,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,QAAQ,YACL,IACA,IACH,MAAO,EACP,OAAQ,EACG,YACX,MAAO,CAAE,KAAM,OAAQ,GAAG,CAAM,EAChC,KAAM,EAAQ,MAAQ,IAAA,GACtB,cAAa,IAAQ,IAAA,GACrB,aAAY,EACZ,UAAU,QACV,gBAAe,EAEf,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAG,EAAK,EAAG,KAAM,EAAK,MAAQ,eAAgB,SAAU,EAAK,IAAO,CAAA,CACvE,CAAA,EAjBW,IAmBpB"}
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,n}from"./index-QesfXBsb.js";import{D as r}from"./VerseConsoleApp-BCY5uSok.js";import{i}from"./CapacityStrip-CkFz5vq2.js";import{c as a,n as o}from"./capacity-strip-model-Dn1cNOhz.js";var s=t(e(),1),c={count:`_count_16gc0_5`,dot:`_dot_16gc0_26`,pulse:`_pulse_16gc0_27`,autonomy:`_autonomy_16gc0_41`,ring:`_ring_16gc0_57`,ringTrack:`_ringTrack_16gc0_58`,ringFill:`_ringFill_16gc0_59`},l=n();function u(e){return e.stopped?`danger`:e.paused?`warning`:e.mode===`autonomous`?`success`:e.mode===`propose`?`info`:`neutral`}function d(e,t){if(!t)return null;switch(e){case`command`:{let e=t.counts.needsYou;return e>0?{kind:`count`,count:e,spoken:`, ${e} need${e===1?`s`:``} you`,tone:`warning`}:null}case`chat`:{let e=t.counts.running;if(e>0)return{kind:`pulse`,spoken:`, ${e} running`,tone:`running`};let n=t.counts.unread;return n>0?{kind:`dot`,spoken:`, ${n} unread`,tone:`info`}:null}case`fleet`:return t.autonomy?{kind:`autonomy`,spoken:`, ${t.autonomy.label}`,autonomy:t.autonomy,tone:u(t.autonomy)}:null;case`mind`:return t.mind?.unseen?{kind:`dot`,spoken:`, new memo`,tone:`info`}:null;default:return null}}function f({badge:e}){if(e.kind===`count`){let t=e.count??0;return(0,l.jsx)(`span`,{className:c.count,"data-tone":e.tone,"aria-hidden":`true`,"data-badge":`count`,children:t>99?`99+`:t})}if(e.kind===`autonomy`&&e.autonomy){let t=e.autonomy,n=t.stopped?`stopped`:t.paused?`paused`:t.mode;return(0,l.jsx)(`span`,{className:c.autonomy,"data-shape":n,"data-tone":e.tone,"aria-hidden":`true`,"data-badge":`autonomy`})}return(0,l.jsx)(`span`,{className:e.kind===`pulse`?c.pulse:c.dot,"data-tone":e.tone,"aria-hidden":`true`,"data-badge":e.kind})}function p(e){return e>=90?`critical`:e>=70?`tight`:`ok`}function m(e){if(!e)return null;let t=e.windows.find(e=>e.binding)??null,n=t?.limitReached===!0,r=e.cls===`blocked`||n?100:t?.usedPercent??null;return r===null?null:{seatId:e.seatId,label:e.label,windowLabel:t?.label??null,usedPercent:Math.max(0,Math.min(100,r)),limitReached:n,resetText:t?.resetText??null,word:e.word}}function h(e){let t=e.resetText?` · ${e.resetText}`:``;return e.limitReached?`${e.label}: ${e.windowLabel??`window`} limit reached${t}`:e.windowLabel===null?`${e.label}: ${e.word}`:`${e.label}: ${e.windowLabel} ${r(e.usedPercent)} used${t}`}function g(){let e=i({withBudget:!1});return(0,s.useMemo)(()=>m(a(o(e.seats,{health:e.health,local:`hide`}))),[e.seats,e.health])}var _=7,v=2*Math.PI*_;function y({badge:e}){let t=Math.max(0,Math.min(100,e.usedPercent)),n=p(t);return(0,l.jsxs)(`svg`,{className:c.ring,"data-tone":n,viewBox:`0 0 18 18`,width:18,height:18,"aria-hidden":`true`,focusable:`false`,children:[(0,l.jsx)(`circle`,{className:c.ringTrack,cx:`9`,cy:`9`,r:_}),(0,l.jsx)(`circle`,{className:c.ringFill,cx:`9`,cy:`9`,r:_,strokeDasharray:`${t/100*v} ${v}`,transform:`rotate(-90 9 9)`})]})}export{y as CapacityRing,f as RailBadgeMark,u as autonomyTone,p as capacityTone,h as describeRailCapacity,d as railBadgeFor,m as railCapacityFromRow,g as useRailCapacity};
2
- //# sourceMappingURL=RailStatus-Vgl0GYtd.js.map
1
+ import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{D as r}from"./VerseConsoleApp-CWU6R3By.js";import{i}from"./CapacityStrip-qKDBC65C.js";import{c as a,n as o}from"./capacity-strip-model-BwZ1ZbkU.js";var s=t(e(),1),c={count:`_count_16gc0_5`,dot:`_dot_16gc0_26`,pulse:`_pulse_16gc0_27`,autonomy:`_autonomy_16gc0_41`,ring:`_ring_16gc0_57`,ringTrack:`_ringTrack_16gc0_58`,ringFill:`_ringFill_16gc0_59`},l=n();function u(e){return e.stopped?`danger`:e.paused?`warning`:e.mode===`autonomous`?`success`:e.mode===`propose`?`info`:`neutral`}function d(e,t){if(!t)return null;switch(e){case`command`:{let e=t.counts.needsYou;return e>0?{kind:`count`,count:e,spoken:`, ${e} need${e===1?`s`:``} you`,tone:`warning`}:null}case`chat`:{let e=t.counts.running;if(e>0)return{kind:`pulse`,spoken:`, ${e} running`,tone:`running`};let n=t.counts.unread;return n>0?{kind:`dot`,spoken:`, ${n} unread`,tone:`info`}:null}case`fleet`:return t.autonomy?{kind:`autonomy`,spoken:`, ${t.autonomy.label}`,autonomy:t.autonomy,tone:u(t.autonomy)}:null;case`mind`:return t.mind?.unseen?{kind:`dot`,spoken:`, new memo`,tone:`info`}:null;default:return null}}function f({badge:e}){if(e.kind===`count`){let t=e.count??0;return(0,l.jsx)(`span`,{className:c.count,"data-tone":e.tone,"aria-hidden":`true`,"data-badge":`count`,children:t>99?`99+`:t})}if(e.kind===`autonomy`&&e.autonomy){let t=e.autonomy,n=t.stopped?`stopped`:t.paused?`paused`:t.mode;return(0,l.jsx)(`span`,{className:c.autonomy,"data-shape":n,"data-tone":e.tone,"aria-hidden":`true`,"data-badge":`autonomy`})}return(0,l.jsx)(`span`,{className:e.kind===`pulse`?c.pulse:c.dot,"data-tone":e.tone,"aria-hidden":`true`,"data-badge":e.kind})}function p(e){return e>=90?`critical`:e>=70?`tight`:`ok`}function m(e){if(!e)return null;let t=e.windows.find(e=>e.binding)??null,n=t?.limitReached===!0,r=e.cls===`blocked`||n?100:t?.usedPercent??null;return r===null?null:{seatId:e.seatId,label:e.label,windowLabel:t?.label??null,usedPercent:Math.max(0,Math.min(100,r)),limitReached:n,resetText:t?.resetText??null,word:e.word}}function h(e){let t=e.resetText?` · ${e.resetText}`:``;return e.limitReached?`${e.label}: ${e.windowLabel??`window`} limit reached${t}`:e.windowLabel===null?`${e.label}: ${e.word}`:`${e.label}: ${e.windowLabel} ${r(e.usedPercent)} used${t}`}function g(){let e=i({withBudget:!1});return(0,s.useMemo)(()=>m(a(o(e.seats,{health:e.health,local:`hide`}))),[e.seats,e.health])}var _=7,v=2*Math.PI*_;function y({badge:e}){let t=Math.max(0,Math.min(100,e.usedPercent)),n=p(t);return(0,l.jsxs)(`svg`,{className:c.ring,"data-tone":n,viewBox:`0 0 18 18`,width:18,height:18,"aria-hidden":`true`,focusable:`false`,children:[(0,l.jsx)(`circle`,{className:c.ringTrack,cx:`9`,cy:`9`,r:_}),(0,l.jsx)(`circle`,{className:c.ringFill,cx:`9`,cy:`9`,r:_,strokeDasharray:`${t/100*v} ${v}`,transform:`rotate(-90 9 9)`})]})}export{y as CapacityRing,f as RailBadgeMark,u as autonomyTone,p as capacityTone,h as describeRailCapacity,d as railBadgeFor,m as railCapacityFromRow,g as useRailCapacity};
2
+ //# sourceMappingURL=RailStatus-Co5UB6We.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RailStatus-Vgl0GYtd.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/RailStatus.module.css","../../../../../../src/web-ui/routes/verse/shell/RailStatus.tsx"],"sourcesContent":["/* Rail badges: pinned to the icon's own 16px box (RailIcon), so they read the\n same in the 56px and the labelled rail. Shape carries meaning; colour\n confirms it. */\n\n.count {\n position: absolute;\n top: -6px;\n right: -9px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: var(--radius-full);\n /* The status pair, not solid + ink: the bg/fg tokens are the ones tuned\n for text contrast in BOTH themes (the solid flips nothing). */\n background: var(--status-warning-bg);\n box-shadow: 0 0 0 2px var(--bg-canvas), inset 0 0 0 1px var(--status-warning-solid);\n color: var(--status-warning-fg);\n font-family: var(--font-ui);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n line-height: 16px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n}\n\n.dot,\n.pulse {\n position: absolute;\n top: -3px;\n right: -3px;\n width: 7px;\n height: 7px;\n border-radius: var(--radius-full);\n box-shadow: 0 0 0 2px var(--bg-canvas);\n background: var(--status-info-solid);\n}\n.pulse { background: var(--status-running-solid); animation: pulse var(--duration-pulse) ease-in-out infinite; }\n\n/* Autonomy: off = hollow ring, propose = half, autonomous = full,\n paused = a bar, stopped = a square. */\n.autonomy {\n position: absolute;\n top: -3px;\n right: -4px;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n box-shadow: 0 0 0 2px var(--bg-canvas);\n border: 1.5px solid var(--text-tertiary);\n background: transparent;\n}\n.autonomy[data-shape='propose'] { border-color: var(--status-info-solid); background: linear-gradient(90deg, var(--status-info-solid) 50%, transparent 50%); }\n.autonomy[data-shape='autonomous'] { border-color: var(--status-success-solid); background: var(--status-success-solid); }\n.autonomy[data-shape='paused'] { border-radius: 1px; border: 0; width: 8px; height: 3px; top: 0; background: var(--status-warning-solid); }\n.autonomy[data-shape='stopped'] { border-radius: 1px; border-color: var(--status-danger-solid); background: var(--status-danger-solid); }\n\n.ring { display: block; }\n.ringTrack { fill: none; stroke: var(--meter-track); stroke-width: 2.5; }\n.ringFill { fill: none; stroke: var(--data-seq-5); stroke-width: 2.5; stroke-linecap: round; }\n.ring[data-tone='tight'] .ringFill { stroke: var(--status-warning-solid); }\n.ring[data-tone='critical'] .ringFill { stroke: var(--status-danger-solid); }\n\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.55; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .pulse { animation: none; }\n}\n:root[data-motion='reduce'] .pulse { animation: none; }\n","/**\n * routes/verse/shell/RailStatus.tsx — what the rail says without being\n * opened (unit C1; SPEC-310C §1 \"Rail badges\"):\n *\n * Command the Needs-you count\n * Chat a pulsing amber dot while chats run (the count rides the\n * accessible name); a quiet dot for unread replies\n * Fleet the autonomy state (off / propose / autonomous, paused, stopped)\n * Mind a dot when there is a memo the operator has not opened\n * foot a capacity ring for the scarcest seat — C6's `scarcestSeat`\n * over the shared capacity rows, so the ring and Apps & Accounts\n * can never describe the same seat two ways\n *\n * Every badge is a SHAPE plus words in the accessible name — never colour\n * alone — and an unknown state draws nothing at all: no dot is \"we do not\n * know\", never \"zero\" (the activity route may not be in this build yet).\n */\nimport { useMemo } from 'react';\nimport type {\n VerseActivityResponse,\n VerseAutonomyBadge,\n VerseCapacityBadge,\n} from '../../../../core/verse/workbench-types.js';\nimport { buildCapacityRows, scarcestSeat, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport type { VerseSectionId } from '../verse-ui-store.js';\nimport styles from './RailStatus.module.css';\nimport { usedPercentText } from '../percent-text.js';\n\nexport interface RailBadge {\n /** Appended to the rail button's accessible name (\", 3 need you\"). */\n spoken: string;\n kind: 'count' | 'pulse' | 'dot' | 'autonomy';\n /** The visible count, for `count`. */\n count?: number;\n tone?: 'running' | 'info' | 'warning' | 'danger' | 'success' | 'neutral';\n autonomy?: VerseAutonomyBadge;\n}\n\nexport function autonomyTone(badge: VerseAutonomyBadge): NonNullable<RailBadge['tone']> {\n if (badge.stopped) return 'danger';\n if (badge.paused) return 'warning';\n if (badge.mode === 'autonomous') return 'success';\n if (badge.mode === 'propose') return 'info';\n return 'neutral';\n}\n\n/** The badge a rail item shows, or null (nothing to say, or not known). */\nexport function railBadgeFor(section: VerseSectionId, data: VerseActivityResponse | null): RailBadge | null {\n if (!data) return null;\n switch (section) {\n case 'command': {\n const n = data.counts.needsYou;\n return n > 0 ? { kind: 'count', count: n, spoken: `, ${n} need${n === 1 ? 's' : ''} you`, tone: 'warning' } : null;\n }\n case 'chat': {\n const running = data.counts.running;\n if (running > 0) return { kind: 'pulse', spoken: `, ${running} running`, tone: 'running' };\n const unread = data.counts.unread;\n return unread > 0 ? { kind: 'dot', spoken: `, ${unread} unread`, tone: 'info' } : null;\n }\n case 'fleet':\n return data.autonomy ? { kind: 'autonomy', spoken: `, ${data.autonomy.label}`, autonomy: data.autonomy, tone: autonomyTone(data.autonomy) } : null;\n case 'mind':\n return data.mind?.unseen ? { kind: 'dot', spoken: ', new memo', tone: 'info' } : null;\n default:\n return null;\n }\n}\n\nexport function RailBadgeMark({ badge }: { badge: RailBadge }) {\n if (badge.kind === 'count') {\n const n = badge.count ?? 0;\n return (\n <span className={styles.count} data-tone={badge.tone} aria-hidden=\"true\" data-badge=\"count\">\n {n > 99 ? '99+' : n}\n </span>\n );\n }\n if (badge.kind === 'autonomy' && badge.autonomy) {\n const a = badge.autonomy;\n const shape = a.stopped ? 'stopped' : a.paused ? 'paused' : a.mode;\n return <span className={styles.autonomy} data-shape={shape} data-tone={badge.tone} aria-hidden=\"true\" data-badge=\"autonomy\" />;\n }\n return <span className={badge.kind === 'pulse' ? styles.pulse : styles.dot} data-tone={badge.tone} aria-hidden=\"true\" data-badge={badge.kind} />;\n}\n\n// ---------------------------------------------------------------------------\n// Capacity ring\n// ---------------------------------------------------------------------------\n\nexport function capacityTone(usedPercent: number): 'ok' | 'tight' | 'critical' {\n if (usedPercent >= 90) return 'critical';\n if (usedPercent >= 70) return 'tight';\n return 'ok';\n}\n\n/**\n * What the rail foot shows for the scarcest seat: one CapacityRow (C6's\n * projection) reduced to a ring and a sentence. Built ONLY from a row that\n * `scarcestSeat` chose, so there is always a measured binding window or a\n * blocked seat behind it — never an invented percent.\n */\nexport interface RailCapacity {\n seatId: string;\n label: string;\n /** \"5-hour window\", \"weekly fable window\"; null when the seat is blocked with no window read. */\n windowLabel: string | null;\n /** 0–100 for the ring. A reached limit or a blocked seat fills it. */\n usedPercent: number;\n limitReached: boolean;\n /** Provider prose or a formatted instant; null when neither. */\n resetText: string | null;\n /** \"blocked\", \"tight\", … — C6's word for the class. */\n word: string;\n}\n\nexport function railCapacityFromRow(row: CapacityRow | null): RailCapacity | null {\n if (!row) return null;\n const binding = row.windows.find((w) => w.binding) ?? null;\n const limitReached = binding?.limitReached === true;\n // Blocked (signed out, out of usage) reads as a full ring whatever the last\n // window said: the engine will refuse a turn on it.\n const used = row.cls === 'blocked' || limitReached ? 100 : binding?.usedPercent ?? null;\n if (used === null) return null;\n return {\n seatId: row.seatId,\n label: row.label,\n windowLabel: binding?.label ?? null,\n usedPercent: Math.max(0, Math.min(100, used)),\n limitReached,\n resetText: binding?.resetText ?? null,\n word: row.word,\n };\n}\n\n/** \"Claude Max: weekly fable window 92% used · resets Sep 25\" — the tooltip and the accessible name. */\nexport function describeRailCapacity(c: RailCapacity): string {\n const reset = c.resetText ? ` · ${c.resetText}` : '';\n if (c.limitReached) return `${c.label}: ${c.windowLabel ?? 'window'} limit reached${reset}`;\n if (c.windowLabel === null) return `${c.label}: ${c.word}`;\n return `${c.label}: ${c.windowLabel} ${usedPercentText(c.usedPercent)} used${reset}`;\n}\n\n/**\n * The rail's scarcest seat, live. Reads the app-wide seat + health caches the\n * capacity strip uses (mounting it costs no extra request when Apps or Usage\n * is also mounted). Budget is NOT read: the reserve does not change which\n * seat is closest to running out, and the rail is on screen on every surface,\n * so it should not keep the 60 s budget poll alive by itself. Local seats are\n * left out — they have no quota to run out of.\n */\nexport function useRailCapacity(): RailCapacity | null {\n const data = useCapacityData({ withBudget: false });\n return useMemo(\n () => railCapacityFromRow(scarcestSeat(buildCapacityRows(data.seats, { health: data.health, local: 'hide' }))),\n [data.seats, data.health],\n );\n}\n\nconst R = 7;\nconst C = 2 * Math.PI * R;\n\nexport function CapacityRing({ badge }: { badge: Pick<VerseCapacityBadge, 'usedPercent'> }) {\n const used = Math.max(0, Math.min(100, badge.usedPercent));\n const tone = capacityTone(used);\n return (\n <svg className={styles.ring} data-tone={tone} viewBox=\"0 0 18 18\" width={18} height={18} aria-hidden=\"true\" focusable=\"false\">\n <circle className={styles.ringTrack} cx=\"9\" cy=\"9\" r={R} />\n <circle\n className={styles.ringFill}\n cx=\"9\"\n cy=\"9\"\n r={R}\n strokeDasharray={`${(used / 100) * C} ${C}`}\n transform=\"rotate(-90 9 9)\"\n />\n </svg>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RailStatus-Co5UB6We.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/RailStatus.module.css","../../../../../../src/web-ui/routes/verse/shell/RailStatus.tsx"],"sourcesContent":["/* Rail badges: pinned to the icon's own 16px box (RailIcon), so they read the\n same in the 56px and the labelled rail. Shape carries meaning; colour\n confirms it. */\n\n.count {\n position: absolute;\n top: -6px;\n right: -9px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: var(--radius-full);\n /* The status pair, not solid + ink: the bg/fg tokens are the ones tuned\n for text contrast in BOTH themes (the solid flips nothing). */\n background: var(--status-warning-bg);\n box-shadow: 0 0 0 2px var(--bg-canvas), inset 0 0 0 1px var(--status-warning-solid);\n color: var(--status-warning-fg);\n font-family: var(--font-ui);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n line-height: 16px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n}\n\n.dot,\n.pulse {\n position: absolute;\n top: -3px;\n right: -3px;\n width: 7px;\n height: 7px;\n border-radius: var(--radius-full);\n box-shadow: 0 0 0 2px var(--bg-canvas);\n background: var(--status-info-solid);\n}\n.pulse { background: var(--status-running-solid); animation: pulse var(--duration-pulse) ease-in-out infinite; }\n\n/* Autonomy: off = hollow ring, propose = half, autonomous = full,\n paused = a bar, stopped = a square. */\n.autonomy {\n position: absolute;\n top: -3px;\n right: -4px;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n box-shadow: 0 0 0 2px var(--bg-canvas);\n border: 1.5px solid var(--text-tertiary);\n background: transparent;\n}\n.autonomy[data-shape='propose'] { border-color: var(--status-info-solid); background: linear-gradient(90deg, var(--status-info-solid) 50%, transparent 50%); }\n.autonomy[data-shape='autonomous'] { border-color: var(--status-success-solid); background: var(--status-success-solid); }\n.autonomy[data-shape='paused'] { border-radius: 1px; border: 0; width: 8px; height: 3px; top: 0; background: var(--status-warning-solid); }\n.autonomy[data-shape='stopped'] { border-radius: 1px; border-color: var(--status-danger-solid); background: var(--status-danger-solid); }\n\n.ring { display: block; }\n.ringTrack { fill: none; stroke: var(--meter-track); stroke-width: 2.5; }\n.ringFill { fill: none; stroke: var(--data-seq-5); stroke-width: 2.5; stroke-linecap: round; }\n.ring[data-tone='tight'] .ringFill { stroke: var(--status-warning-solid); }\n.ring[data-tone='critical'] .ringFill { stroke: var(--status-danger-solid); }\n\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.55; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .pulse { animation: none; }\n}\n:root[data-motion='reduce'] .pulse { animation: none; }\n","/**\n * routes/verse/shell/RailStatus.tsx — what the rail says without being\n * opened (unit C1; SPEC-310C §1 \"Rail badges\"):\n *\n * Command the Needs-you count\n * Chat a pulsing amber dot while chats run (the count rides the\n * accessible name); a quiet dot for unread replies\n * Fleet the autonomy state (off / propose / autonomous, paused, stopped)\n * Mind a dot when there is a memo the operator has not opened\n * foot a capacity ring for the scarcest seat — C6's `scarcestSeat`\n * over the shared capacity rows, so the ring and Apps & Accounts\n * can never describe the same seat two ways\n *\n * Every badge is a SHAPE plus words in the accessible name — never colour\n * alone — and an unknown state draws nothing at all: no dot is \"we do not\n * know\", never \"zero\" (the activity route may not be in this build yet).\n */\nimport { useMemo } from 'react';\nimport type {\n VerseActivityResponse,\n VerseAutonomyBadge,\n VerseCapacityBadge,\n} from '../../../../core/verse/workbench-types.js';\nimport { buildCapacityRows, scarcestSeat, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport type { VerseSectionId } from '../verse-ui-store.js';\nimport styles from './RailStatus.module.css';\nimport { usedPercentText } from '../percent-text.js';\n\nexport interface RailBadge {\n /** Appended to the rail button's accessible name (\", 3 need you\"). */\n spoken: string;\n kind: 'count' | 'pulse' | 'dot' | 'autonomy';\n /** The visible count, for `count`. */\n count?: number;\n tone?: 'running' | 'info' | 'warning' | 'danger' | 'success' | 'neutral';\n autonomy?: VerseAutonomyBadge;\n}\n\nexport function autonomyTone(badge: VerseAutonomyBadge): NonNullable<RailBadge['tone']> {\n if (badge.stopped) return 'danger';\n if (badge.paused) return 'warning';\n if (badge.mode === 'autonomous') return 'success';\n if (badge.mode === 'propose') return 'info';\n return 'neutral';\n}\n\n/** The badge a rail item shows, or null (nothing to say, or not known). */\nexport function railBadgeFor(section: VerseSectionId, data: VerseActivityResponse | null): RailBadge | null {\n if (!data) return null;\n switch (section) {\n case 'command': {\n const n = data.counts.needsYou;\n return n > 0 ? { kind: 'count', count: n, spoken: `, ${n} need${n === 1 ? 's' : ''} you`, tone: 'warning' } : null;\n }\n case 'chat': {\n const running = data.counts.running;\n if (running > 0) return { kind: 'pulse', spoken: `, ${running} running`, tone: 'running' };\n const unread = data.counts.unread;\n return unread > 0 ? { kind: 'dot', spoken: `, ${unread} unread`, tone: 'info' } : null;\n }\n case 'fleet':\n return data.autonomy ? { kind: 'autonomy', spoken: `, ${data.autonomy.label}`, autonomy: data.autonomy, tone: autonomyTone(data.autonomy) } : null;\n case 'mind':\n return data.mind?.unseen ? { kind: 'dot', spoken: ', new memo', tone: 'info' } : null;\n default:\n return null;\n }\n}\n\nexport function RailBadgeMark({ badge }: { badge: RailBadge }) {\n if (badge.kind === 'count') {\n const n = badge.count ?? 0;\n return (\n <span className={styles.count} data-tone={badge.tone} aria-hidden=\"true\" data-badge=\"count\">\n {n > 99 ? '99+' : n}\n </span>\n );\n }\n if (badge.kind === 'autonomy' && badge.autonomy) {\n const a = badge.autonomy;\n const shape = a.stopped ? 'stopped' : a.paused ? 'paused' : a.mode;\n return <span className={styles.autonomy} data-shape={shape} data-tone={badge.tone} aria-hidden=\"true\" data-badge=\"autonomy\" />;\n }\n return <span className={badge.kind === 'pulse' ? styles.pulse : styles.dot} data-tone={badge.tone} aria-hidden=\"true\" data-badge={badge.kind} />;\n}\n\n// ---------------------------------------------------------------------------\n// Capacity ring\n// ---------------------------------------------------------------------------\n\nexport function capacityTone(usedPercent: number): 'ok' | 'tight' | 'critical' {\n if (usedPercent >= 90) return 'critical';\n if (usedPercent >= 70) return 'tight';\n return 'ok';\n}\n\n/**\n * What the rail foot shows for the scarcest seat: one CapacityRow (C6's\n * projection) reduced to a ring and a sentence. Built ONLY from a row that\n * `scarcestSeat` chose, so there is always a measured binding window or a\n * blocked seat behind it — never an invented percent.\n */\nexport interface RailCapacity {\n seatId: string;\n label: string;\n /** \"5-hour window\", \"weekly fable window\"; null when the seat is blocked with no window read. */\n windowLabel: string | null;\n /** 0–100 for the ring. A reached limit or a blocked seat fills it. */\n usedPercent: number;\n limitReached: boolean;\n /** Provider prose or a formatted instant; null when neither. */\n resetText: string | null;\n /** \"blocked\", \"tight\", … — C6's word for the class. */\n word: string;\n}\n\nexport function railCapacityFromRow(row: CapacityRow | null): RailCapacity | null {\n if (!row) return null;\n const binding = row.windows.find((w) => w.binding) ?? null;\n const limitReached = binding?.limitReached === true;\n // Blocked (signed out, out of usage) reads as a full ring whatever the last\n // window said: the engine will refuse a turn on it.\n const used = row.cls === 'blocked' || limitReached ? 100 : binding?.usedPercent ?? null;\n if (used === null) return null;\n return {\n seatId: row.seatId,\n label: row.label,\n windowLabel: binding?.label ?? null,\n usedPercent: Math.max(0, Math.min(100, used)),\n limitReached,\n resetText: binding?.resetText ?? null,\n word: row.word,\n };\n}\n\n/** \"Claude Max: weekly fable window 92% used · resets Sep 25\" — the tooltip and the accessible name. */\nexport function describeRailCapacity(c: RailCapacity): string {\n const reset = c.resetText ? ` · ${c.resetText}` : '';\n if (c.limitReached) return `${c.label}: ${c.windowLabel ?? 'window'} limit reached${reset}`;\n if (c.windowLabel === null) return `${c.label}: ${c.word}`;\n return `${c.label}: ${c.windowLabel} ${usedPercentText(c.usedPercent)} used${reset}`;\n}\n\n/**\n * The rail's scarcest seat, live. Reads the app-wide seat + health caches the\n * capacity strip uses (mounting it costs no extra request when Apps or Usage\n * is also mounted). Budget is NOT read: the reserve does not change which\n * seat is closest to running out, and the rail is on screen on every surface,\n * so it should not keep the 60 s budget poll alive by itself. Local seats are\n * left out — they have no quota to run out of.\n */\nexport function useRailCapacity(): RailCapacity | null {\n const data = useCapacityData({ withBudget: false });\n return useMemo(\n () => railCapacityFromRow(scarcestSeat(buildCapacityRows(data.seats, { health: data.health, local: 'hide' }))),\n [data.seats, data.health],\n );\n}\n\nconst R = 7;\nconst C = 2 * Math.PI * R;\n\nexport function CapacityRing({ badge }: { badge: Pick<VerseCapacityBadge, 'usedPercent'> }) {\n const used = Math.max(0, Math.min(100, badge.usedPercent));\n const tone = capacityTone(used);\n return (\n <svg className={styles.ring} data-tone={tone} viewBox=\"0 0 18 18\" width={18} height={18} aria-hidden=\"true\" focusable=\"false\">\n <circle className={styles.ringTrack} cx=\"9\" cy=\"9\" r={R} />\n <circle\n className={styles.ringFill}\n cx=\"9\"\n cy=\"9\"\n r={R}\n strokeDasharray={`${(used / 100) * C} ${C}`}\n transform=\"rotate(-90 9 9)\"\n />\n </svg>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./index-QesfXBsb.js";var t={root:`_root_1lgxn_1`,spinner:`_spinner_1lgxn_9`,spin:`_spin_1lgxn_9`},n=e();function r({label:e=`Refreshing`}){return(0,n.jsxs)(`span`,{className:t.root,role:`status`,"aria-live":`polite`,children:[(0,n.jsx)(`span`,{className:t.spinner,"aria-hidden":`true`}),(0,n.jsx)(`span`,{className:`visually-hidden`,children:e})]})}export{r as t};
2
- //# sourceMappingURL=RefreshIndicator-CSyqpY_q.js.map
1
+ import{n as e}from"./index-DZ-UQ7v8.js";var t={root:`_root_1lgxn_1`,spinner:`_spinner_1lgxn_9`,spin:`_spin_1lgxn_9`},n=e();function r({label:e=`Refreshing`}){return(0,n.jsxs)(`span`,{className:t.root,role:`status`,"aria-live":`polite`,children:[(0,n.jsx)(`span`,{className:t.spinner,"aria-hidden":`true`}),(0,n.jsx)(`span`,{className:`visually-hidden`,children:e})]})}export{r as t};
2
+ //# sourceMappingURL=RefreshIndicator-DO9ibnSq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RefreshIndicator-CSyqpY_q.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/RefreshIndicator.module.css","../../../../../../src/web-ui/components/primitives/RefreshIndicator.tsx"],"sourcesContent":[".root {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n}\n\n.spinner {\n width: 12px;\n height: 12px;\n border-radius: var(--radius-full);\n border: 2px solid var(--border-strong);\n border-top-color: var(--accent-500);\n animation: spin 0.7s linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .spinner {\n animation: none;\n border-top-color: var(--border-strong);\n }\n}\n\n:root[data-motion=\"reduce\"] .spinner {\n animation: none;\n border-top-color: var(--border-strong);\n}\n","/**\n * components/primitives/RefreshIndicator.tsx — the \"stale data, quietly\n * refreshing\" signal (foundation brief item 4: never blank the screen on\n * refresh). Pair with a QueryEntry's `status`:\n *\n * loading -> render a Skeleton instead of the view\n * refreshing -> render the view with data, plus <RefreshIndicator />\n * success -> render the view with data, no indicator\n * error -> render the view's error state\n */\nimport styles from './RefreshIndicator.module.css';\n\nexport function RefreshIndicator({ label = 'Refreshing' }: { label?: string }) {\n return (\n <span className={styles.root} role=\"status\" aria-live=\"polite\">\n <span className={styles.spinner} aria-hidden=\"true\" />\n <span className=\"visually-hidden\">{label}</span>\n </span>\n );\n}\n"],"mappings":"2HCYA,SAAgB,EAAiB,CAAE,QAAQ,cAAoC,CAC7E,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,KAAK,SAAS,YAAU,SAAtD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,cAAY,MAAQ,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,kBAAmB,SAAA,CAAY,CAAA,CAC3C,GAEV"}
1
+ {"version":3,"file":"RefreshIndicator-DO9ibnSq.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/RefreshIndicator.module.css","../../../../../../src/web-ui/components/primitives/RefreshIndicator.tsx"],"sourcesContent":[".root {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n}\n\n.spinner {\n width: 12px;\n height: 12px;\n border-radius: var(--radius-full);\n border: 2px solid var(--border-strong);\n border-top-color: var(--accent-500);\n animation: spin 0.7s linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .spinner {\n animation: none;\n border-top-color: var(--border-strong);\n }\n}\n\n:root[data-motion=\"reduce\"] .spinner {\n animation: none;\n border-top-color: var(--border-strong);\n}\n","/**\n * components/primitives/RefreshIndicator.tsx — the \"stale data, quietly\n * refreshing\" signal (foundation brief item 4: never blank the screen on\n * refresh). Pair with a QueryEntry's `status`:\n *\n * loading -> render a Skeleton instead of the view\n * refreshing -> render the view with data, plus <RefreshIndicator />\n * success -> render the view with data, no indicator\n * error -> render the view's error state\n */\nimport styles from './RefreshIndicator.module.css';\n\nexport function RefreshIndicator({ label = 'Refreshing' }: { label?: string }) {\n return (\n <span className={styles.root} role=\"status\" aria-live=\"polite\">\n <span className={styles.spinner} aria-hidden=\"true\" />\n <span className=\"visually-hidden\">{label}</span>\n </span>\n );\n}\n"],"mappings":"2HCYA,SAAgB,EAAiB,CAAE,QAAQ,cAAoC,CAC7E,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,KAAK,SAAS,YAAU,SAAtD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,cAAY,MAAQ,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,kBAAmB,SAAA,CAAY,CAAA,CAC3C,GAEV"}