@ashlr/hub 3.13.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 (625) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/dist/authority-surface.json +204 -124
  3. package/dist/build-identity.json +2 -2
  4. package/dist/cli/authority.js +112 -18
  5. package/dist/cli/authority.js.map +1 -1
  6. package/dist/cli/comms.d.ts +33 -19
  7. package/dist/cli/comms.js +128 -151
  8. package/dist/cli/comms.js.map +1 -1
  9. package/dist/cli/completions.js +1 -1
  10. package/dist/cli/completions.js.map +1 -1
  11. package/dist/cli/daemon.js +29 -0
  12. package/dist/cli/daemon.js.map +1 -1
  13. package/dist/cli/director.d.ts +8 -12
  14. package/dist/cli/director.js +17 -52
  15. package/dist/cli/director.js.map +1 -1
  16. package/dist/cli/fleet.js +4 -1
  17. package/dist/cli/fleet.js.map +1 -1
  18. package/dist/cli/help.js +1 -0
  19. package/dist/cli/help.js.map +1 -1
  20. package/dist/cli/leader.d.ts +27 -3
  21. package/dist/cli/leader.js +253 -4
  22. package/dist/cli/leader.js.map +1 -1
  23. package/dist/core/authority/server-enforcement.d.ts +110 -0
  24. package/dist/core/authority/server-enforcement.js +260 -0
  25. package/dist/core/authority/server-enforcement.js.map +1 -0
  26. package/dist/core/authority/standing-grant.d.ts +24 -4
  27. package/dist/core/authority/standing-grant.js +19 -3
  28. package/dist/core/authority/standing-grant.js.map +1 -1
  29. package/dist/core/cloud/timeline.js +13 -7
  30. package/dist/core/cloud/timeline.js.map +1 -1
  31. package/dist/core/comms/change-digest.d.ts +130 -0
  32. package/dist/core/comms/change-digest.js +451 -0
  33. package/dist/core/comms/change-digest.js.map +1 -0
  34. package/dist/core/comms/director-prompt.d.ts +4 -5
  35. package/dist/core/comms/director-prompt.js +4 -71
  36. package/dist/core/comms/director-prompt.js.map +1 -1
  37. package/dist/core/comms/director.d.ts +24 -61
  38. package/dist/core/comms/director.js +29 -382
  39. package/dist/core/comms/director.js.map +1 -1
  40. package/dist/core/comms/dispatch.d.ts +37 -12
  41. package/dist/core/comms/dispatch.js +244 -177
  42. package/dist/core/comms/dispatch.js.map +1 -1
  43. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  44. package/dist/core/comms/elon-dialogue.js +36 -307
  45. package/dist/core/comms/elon-dialogue.js.map +1 -1
  46. package/dist/core/comms/fleet-pulse.js +4 -7
  47. package/dist/core/comms/fleet-pulse.js.map +1 -1
  48. package/dist/core/comms/handlers.d.ts +10 -6
  49. package/dist/core/comms/handlers.js +14 -48
  50. package/dist/core/comms/handlers.js.map +1 -1
  51. package/dist/core/comms/migrations.d.ts +47 -0
  52. package/dist/core/comms/migrations.js +125 -0
  53. package/dist/core/comms/migrations.js.map +1 -0
  54. package/dist/core/comms/requests.d.ts +32 -5
  55. package/dist/core/comms/requests.js +101 -5
  56. package/dist/core/comms/requests.js.map +1 -1
  57. package/dist/core/comms/telegram-channel.d.ts +104 -0
  58. package/dist/core/comms/telegram-channel.js +622 -0
  59. package/dist/core/comms/telegram-channel.js.map +1 -0
  60. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  61. package/dist/core/comms/telegram-thread-map.js +144 -0
  62. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  63. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  64. package/dist/core/daemon/capacity-publisher.js +40 -2
  65. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  66. package/dist/core/daemon/loop.js +18 -4
  67. package/dist/core/daemon/loop.js.map +1 -1
  68. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  69. package/dist/core/daemon/tick-deadline.js +83 -0
  70. package/dist/core/daemon/tick-deadline.js.map +1 -0
  71. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  72. package/dist/core/daemon/tick-hooks.js.map +1 -1
  73. package/dist/core/daemon/tick-progress.d.ts +39 -0
  74. package/dist/core/daemon/tick-progress.js +194 -0
  75. package/dist/core/daemon/tick-progress.js.map +1 -0
  76. package/dist/core/dashboard.js +3 -1
  77. package/dist/core/dashboard.js.map +1 -1
  78. package/dist/core/fleet/fleet-merge-state.d.ts +6 -0
  79. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  80. package/dist/core/fleet/host-merge.d.ts +9 -0
  81. package/dist/core/fleet/host-merge.js +13 -2
  82. package/dist/core/fleet/host-merge.js.map +1 -1
  83. package/dist/core/fleet/merge-gates.d.ts +13 -0
  84. package/dist/core/fleet/merge-gates.js +14 -0
  85. package/dist/core/fleet/merge-gates.js.map +1 -1
  86. package/dist/core/fleet/mirrors.d.ts +162 -6
  87. package/dist/core/fleet/mirrors.js +1051 -49
  88. package/dist/core/fleet/mirrors.js.map +1 -1
  89. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  90. package/dist/core/fleet/standing-merge-pass.js +72 -1
  91. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  92. package/dist/core/fleet/status.d.ts +17 -0
  93. package/dist/core/fleet/status.js +22 -0
  94. package/dist/core/fleet/status.js.map +1 -1
  95. package/dist/core/fleet/tick-hooks-live.d.ts +1 -1
  96. package/dist/core/fleet/tick-hooks-live.js +13 -3
  97. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  98. package/dist/core/git.d.ts +17 -0
  99. package/dist/core/git.js +124 -25
  100. package/dist/core/git.js.map +1 -1
  101. package/dist/core/goals/open-goals.d.ts +47 -0
  102. package/dist/core/goals/open-goals.js +33 -0
  103. package/dist/core/goals/open-goals.js.map +1 -0
  104. package/dist/core/inbox/merge.d.ts +5 -0
  105. package/dist/core/inbox/merge.js +58 -2
  106. package/dist/core/inbox/merge.js.map +1 -1
  107. package/dist/core/integrations/locus.d.ts +28 -0
  108. package/dist/core/integrations/locus.js +155 -30
  109. package/dist/core/integrations/locus.js.map +1 -1
  110. package/dist/core/integrations/telegram-format.d.ts +40 -0
  111. package/dist/core/integrations/telegram-format.js +123 -0
  112. package/dist/core/integrations/telegram-format.js.map +1 -0
  113. package/dist/core/integrations/telegram.d.ts +60 -4
  114. package/dist/core/integrations/telegram.js +161 -28
  115. package/dist/core/integrations/telegram.js.map +1 -1
  116. package/dist/core/mcp-registry.d.ts +12 -0
  117. package/dist/core/mcp-registry.js +70 -0
  118. package/dist/core/mcp-registry.js.map +1 -1
  119. package/dist/core/observability/rollup.d.ts +12 -10
  120. package/dist/core/observability/rollup.js +44 -17
  121. package/dist/core/observability/rollup.js.map +1 -1
  122. package/dist/core/resources/connection-monitor.d.ts +9 -0
  123. package/dist/core/resources/connection-monitor.js +19 -9
  124. package/dist/core/resources/connection-monitor.js.map +1 -1
  125. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  126. package/dist/core/resources/quota-refresh-lease.js +34 -1
  127. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  128. package/dist/core/routing/budget-api.d.ts +7 -1
  129. package/dist/core/routing/budget-api.js +56 -2
  130. package/dist/core/routing/budget-api.js.map +1 -1
  131. package/dist/core/routing/readiness-types.d.ts +82 -0
  132. package/dist/core/routing/readiness-types.js +23 -0
  133. package/dist/core/routing/readiness-types.js.map +1 -0
  134. package/dist/core/routing/readiness.d.ts +103 -0
  135. package/dist/core/routing/readiness.js +480 -0
  136. package/dist/core/routing/readiness.js.map +1 -0
  137. package/dist/core/sandbox/confine.js +22 -1
  138. package/dist/core/sandbox/confine.js.map +1 -1
  139. package/dist/core/sandbox/policy.d.ts +23 -0
  140. package/dist/core/sandbox/policy.js +100 -0
  141. package/dist/core/sandbox/policy.js.map +1 -1
  142. package/dist/core/types.d.ts +13 -0
  143. package/dist/core/types.js.map +1 -1
  144. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  145. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  146. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  147. package/dist/core/usage/frontier-usage.d.ts +20 -2
  148. package/dist/core/usage/frontier-usage.js +75 -17
  149. package/dist/core/usage/frontier-usage.js.map +1 -1
  150. package/dist/core/verse/accounts.d.ts +45 -0
  151. package/dist/core/verse/accounts.js +246 -17
  152. package/dist/core/verse/accounts.js.map +1 -1
  153. package/dist/core/verse/apps-api.js +23 -11
  154. package/dist/core/verse/apps-api.js.map +1 -1
  155. package/dist/core/verse/apps.d.ts +11 -9
  156. package/dist/core/verse/apps.js +2 -2
  157. package/dist/core/verse/apps.js.map +1 -1
  158. package/dist/core/verse/authority-api.d.ts +8 -2
  159. package/dist/core/verse/authority-api.js +40 -5
  160. package/dist/core/verse/authority-api.js.map +1 -1
  161. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  162. package/dist/core/verse/autonomy-ladder.js +251 -0
  163. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  164. package/dist/core/verse/context-fit.js +7 -5
  165. package/dist/core/verse/context-fit.js.map +1 -1
  166. package/dist/core/verse/control-api.d.ts +23 -1
  167. package/dist/core/verse/control-api.js +117 -10
  168. package/dist/core/verse/control-api.js.map +1 -1
  169. package/dist/core/verse/fleet-live-api.js +13 -5
  170. package/dist/core/verse/fleet-live-api.js.map +1 -1
  171. package/dist/core/verse/folder-io.d.ts +50 -0
  172. package/dist/core/verse/folder-io.js +142 -0
  173. package/dist/core/verse/folder-io.js.map +1 -0
  174. package/dist/core/verse/git-api.js +5 -4
  175. package/dist/core/verse/git-api.js.map +1 -1
  176. package/dist/core/verse/git-ops.d.ts +10 -1
  177. package/dist/core/verse/git-ops.js +18 -2
  178. package/dist/core/verse/git-ops.js.map +1 -1
  179. package/dist/core/verse/github-api.d.ts +1 -1
  180. package/dist/core/verse/github-api.js +5 -4
  181. package/dist/core/verse/github-api.js.map +1 -1
  182. package/dist/core/verse/github-repo.js +118 -14
  183. package/dist/core/verse/github-repo.js.map +1 -1
  184. package/dist/core/verse/leader-api.d.ts +5 -4
  185. package/dist/core/verse/leader-api.js +237 -10
  186. package/dist/core/verse/leader-api.js.map +1 -1
  187. package/dist/core/verse/local-models.d.ts +10 -0
  188. package/dist/core/verse/local-models.js +10 -1
  189. package/dist/core/verse/local-models.js.map +1 -1
  190. package/dist/core/verse/login-path.d.ts +73 -0
  191. package/dist/core/verse/login-path.js +123 -14
  192. package/dist/core/verse/login-path.js.map +1 -1
  193. package/dist/core/verse/mcp-control-api.js +4 -4
  194. package/dist/core/verse/mcp-control-api.js.map +1 -1
  195. package/dist/core/verse/mcp-scope.d.ts +22 -0
  196. package/dist/core/verse/mcp-scope.js +41 -1
  197. package/dist/core/verse/mcp-scope.js.map +1 -1
  198. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  199. package/dist/core/verse/mcp-seat-view.js +30 -4
  200. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  201. package/dist/core/verse/overnight-api.js +20 -2
  202. package/dist/core/verse/overnight-api.js.map +1 -1
  203. package/dist/core/verse/path-guard.d.ts +24 -0
  204. package/dist/core/verse/path-guard.js +91 -22
  205. package/dist/core/verse/path-guard.js.map +1 -1
  206. package/dist/core/verse/preview-api.js +22 -0
  207. package/dist/core/verse/preview-api.js.map +1 -1
  208. package/dist/core/verse/projects.d.ts +21 -0
  209. package/dist/core/verse/projects.js +82 -0
  210. package/dist/core/verse/projects.js.map +1 -1
  211. package/dist/core/verse/session-controls-api.js +5 -3
  212. package/dist/core/verse/session-controls-api.js.map +1 -1
  213. package/dist/core/verse/session-handoff.d.ts +26 -0
  214. package/dist/core/verse/session-handoff.js +90 -12
  215. package/dist/core/verse/session-handoff.js.map +1 -1
  216. package/dist/core/verse/terminal-api.js +7 -4
  217. package/dist/core/verse/terminal-api.js.map +1 -1
  218. package/dist/core/verse/terminal.js +9 -5
  219. package/dist/core/verse/terminal.js.map +1 -1
  220. package/dist/core/verse/verse-api.js +81 -27
  221. package/dist/core/verse/verse-api.js.map +1 -1
  222. package/dist/core/verse/workspaces.d.ts +51 -0
  223. package/dist/core/verse/workspaces.js +177 -47
  224. package/dist/core/verse/workspaces.js.map +1 -1
  225. package/dist/core/vision/leader-apply.d.ts +40 -0
  226. package/dist/core/vision/leader-apply.js +101 -30
  227. package/dist/core/vision/leader-apply.js.map +1 -1
  228. package/dist/core/vision/leader-cadence.d.ts +114 -0
  229. package/dist/core/vision/leader-cadence.js +127 -0
  230. package/dist/core/vision/leader-cadence.js.map +1 -0
  231. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  232. package/dist/core/vision/leader-goal-evidence.js +36 -0
  233. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  234. package/dist/core/vision/leader-health.d.ts +53 -0
  235. package/dist/core/vision/leader-health.js +92 -0
  236. package/dist/core/vision/leader-health.js.map +1 -0
  237. package/dist/core/vision/leader-operator.d.ts +176 -0
  238. package/dist/core/vision/leader-operator.js +355 -0
  239. package/dist/core/vision/leader-operator.js.map +1 -0
  240. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  241. package/dist/core/vision/leader-run-chain.js +54 -0
  242. package/dist/core/vision/leader-run-chain.js.map +1 -0
  243. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  244. package/dist/core/vision/leader-seat-plan.js +93 -0
  245. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  246. package/dist/core/vision/leader-seat.d.ts +71 -5
  247. package/dist/core/vision/leader-seat.js +235 -33
  248. package/dist/core/vision/leader-seat.js.map +1 -1
  249. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  250. package/dist/core/vision/leader-thread-types.js +9 -0
  251. package/dist/core/vision/leader-thread-types.js.map +1 -0
  252. package/dist/core/vision/leader-thread.d.ts +138 -0
  253. package/dist/core/vision/leader-thread.js +926 -0
  254. package/dist/core/vision/leader-thread.js.map +1 -0
  255. package/dist/core/vision/leader-types.d.ts +75 -1
  256. package/dist/core/vision/leader.d.ts +88 -18
  257. package/dist/core/vision/leader.js +269 -69
  258. package/dist/core/vision/leader.js.map +1 -1
  259. package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js → ActionMenu-CIiX2X8w.js} +2 -2
  260. package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  262. package/dist/core/web/public/next/assets/{Advanced-cVYTAsfB.js.map → Advanced-DHsysoIL.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/{App-IsaWDsdF.js → App-CMeAocmW.js} +5 -5
  264. package/dist/core/web/public/next/assets/{App-IsaWDsdF.js.map → App-CMeAocmW.js.map} +1 -1
  265. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  266. package/dist/core/web/public/next/assets/{AppsSection-DDqeSrty.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  267. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  268. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  269. package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js → AutonomyOffState-CEPSZToP.js} +3 -3
  270. package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js.map → AutonomyOffState-CEPSZToP.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  272. package/dist/core/web/public/next/assets/{AutonomySection-Dwn8UtOy.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  273. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  274. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  275. package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js → BranchBar-BxhdiIpx.js} +2 -2
  276. package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  277. package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js → BudgetControl-C-0KhjRS.js} +2 -2
  278. package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js.map → BudgetControl-C-0KhjRS.js.map} +1 -1
  279. package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js → Button-D90dzI_o.js} +2 -2
  280. package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js.map → Button-D90dzI_o.js.map} +1 -1
  281. package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js → CapacityStrip-qKDBC65C.js} +2 -2
  282. package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  283. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  284. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  285. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  286. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  287. package/dist/core/web/public/next/assets/{ChatSection-C9myY4ei.js.map → ChatSection-DlT4QU6a.js.map} +1 -1
  288. package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  289. package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  290. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  291. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  292. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  293. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  294. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  295. package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  296. package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  297. package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  298. package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  299. package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js → Dialog-D3msQlCj.js} +2 -2
  300. package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js.map → Dialog-D3msQlCj.js.map} +1 -1
  301. package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js → DiffPane-Ix6hvXlY.js} +2 -2
  302. package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  303. package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js → DiffViewer-C4WKsCIe.js} +2 -2
  304. package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  305. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  306. package/dist/core/web/public/next/assets/{DockHost-BcEq2qaS.js.map → DockHost-aWP7liri.js.map} +1 -1
  307. package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js → EmptyState-D2IRy3Cg.js} +2 -2
  308. package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  309. package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js → Epistemic-DMr18muX.js} +2 -2
  310. package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js.map → Epistemic-DMr18muX.js.map} +1 -1
  311. package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js → EvidenceTimeline-DXmmz6Fi.js} +2 -2
  312. package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js.map → EvidenceTimeline-DXmmz6Fi.js.map} +1 -1
  313. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  314. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  315. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  316. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  317. package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js → GearTray-Dt-ee32-.js} +2 -2
  318. package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  319. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  320. package/dist/core/web/public/next/assets/{GrowthSection-BvZezOsX.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  321. package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js → HandoffDialog-CLJQLe7M.js} +2 -2
  322. package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  323. package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js → Input-D_KRJA9V.js} +2 -2
  324. package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js.map → Input-D_KRJA9V.js.map} +1 -1
  325. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  326. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  327. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  328. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  329. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  330. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  331. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  332. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  333. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  334. package/dist/core/web/public/next/assets/{McpSection-nuXer4K-.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  335. package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js → MessageMarkdown-DFvk06qG.js} +3 -3
  336. package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  337. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  338. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js → Meter-CMj-VafN.js} +2 -2
  340. package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js.map → Meter-CMj-VafN.js.map} +1 -1
  341. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  342. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  343. package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  344. package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  346. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  347. package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js → NeedsYouList-CCsijdWt.js} +2 -2
  348. package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  350. package/dist/core/web/public/next/assets/{NewChatDialog-BqFTWgHU.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  351. package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js → OnboardingFlow-Cy9BA9eR.js} +3 -3
  352. package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js.map → OnboardingFlow-Cy9BA9eR.js.map} +1 -1
  353. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  354. package/dist/core/web/public/next/assets/{OnboardingGate-BZafM1Vf.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  355. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  356. package/dist/core/web/public/next/assets/{PreviewPane-zT3gK9TD.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  357. package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  358. package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  359. package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js → RailStatus-Co5UB6We.js} +2 -2
  360. package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  361. package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  362. package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  364. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CAxPQ4sZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  366. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  367. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  368. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  369. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  370. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  371. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  372. package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  373. package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  374. package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js → SeatSelector-J5R3zDkB.js} +3 -3
  375. package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  376. package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js → Segmented-CGh_-tBb.js} +2 -2
  377. package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  378. package/dist/core/web/public/next/assets/{Select-By-V9lMc.js → Select-CWnmUzs3.js} +2 -2
  379. package/dist/core/web/public/next/assets/{Select-By-V9lMc.js.map → Select-CWnmUzs3.js.map} +1 -1
  380. package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js → SessionGate-sp4KsnUo.js} +2 -2
  381. package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  382. package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  383. package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  384. package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js → SessionSearch-DbFjwR1h.js} +2 -2
  385. package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/{SettingsSection-Bf74l0Gj.js → SettingsSection-Ch23msJ5.js} +2 -2
  387. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  388. package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js → SetupChecklist-Bd76MBAR.js} +2 -2
  389. package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js.map → SetupChecklist-Bd76MBAR.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  391. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  392. package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js → Sheet-BZ2AG4Eo.js} +2 -2
  393. package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  394. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  395. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  396. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  397. package/dist/core/web/public/next/assets/{Sidebar-C9YtBYVZ.js.map → Sidebar-DN--cPYN.js.map} +1 -1
  398. package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js → Slider-KVoJLDD6.js} +2 -2
  399. package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js.map → Slider-KVoJLDD6.js.map} +1 -1
  400. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  401. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  402. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  403. package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js → StatusBadge-CXsYqmdU.js} +2 -2
  404. package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  405. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  406. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  407. package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js → Surface-BfDmQcKe.js} +2 -2
  408. package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js.map → Surface-BfDmQcKe.js.map} +1 -1
  409. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  410. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  411. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  412. package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js → Switch-9NtO_6Lj.js} +2 -2
  413. package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  414. package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js → Tag-DscCRFcN.js} +2 -2
  415. package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js.map → Tag-DscCRFcN.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js → TerminalPane-B668-DJW.js} +5 -5
  417. package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  418. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  419. package/dist/core/web/public/next/assets/{UniverseConsoleApp-BpphLqoz.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  420. package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js → UniverseView-DG70zH0W.js} +4 -4
  421. package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  422. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  423. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  424. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  425. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  426. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  427. package/dist/core/web/public/next/assets/{Workspace-RXy0pqp6.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  428. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  429. package/dist/core/web/public/next/assets/{actions-BZTidCXZ.js.map → actions-CY-PjpGc.js.map} +1 -1
  430. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  431. package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js → apps-model-Du02KhAf.js} +2 -2
  432. package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js.map → apps-model-Du02KhAf.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js → authority-model-79SeuKlJ.js} +2 -2
  434. package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  435. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  436. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  437. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  438. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  439. package/dist/core/web/public/next/assets/{budget-queries-DFF-3ICg.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  441. package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  443. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  444. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  445. package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js → cloud-model-BDivRMqv.js} +2 -2
  446. package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  447. package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  448. package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  449. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  450. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  451. package/dist/core/web/public/next/assets/{command-catalog-ffCAijVY.js → command-catalog-BIntSa9l.js} +2 -2
  452. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  453. package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js → context-model-Br8t9jgG.js} +2 -2
  454. package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js.map → context-model-Br8t9jgG.js.map} +1 -1
  455. package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js → context-model-CokrgEUq.js} +3 -3
  456. package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js.map → context-model-CokrgEUq.js.map} +1 -1
  457. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  458. package/dist/core/web/public/next/assets/{context-queries-_9bFWb9v.js.map → context-queries-eL3caKVG.js.map} +1 -1
  459. package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js → control-queries-B9K-wmcB.js} +2 -2
  460. package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  461. package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js → copy-setup-XMgCC5f8.js} +2 -2
  462. package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js.map → copy-setup-XMgCC5f8.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js → dock-icons-BJ6ZqB2t.js} +2 -2
  464. package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js → fleet-model-BvDR3gjp.js} +2 -2
  466. package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  467. package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js → fleet-queries-W2UFVMZJ.js} +2 -2
  468. package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js → focus-trap-CtI1SlMX.js} +2 -2
  470. package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  471. package/dist/core/web/public/next/assets/{format-BmH2yWL6.js → format-CH4g_sl1.js} +2 -2
  472. package/dist/core/web/public/next/assets/{format-BmH2yWL6.js.map → format-CH4g_sl1.js.map} +1 -1
  473. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  474. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  475. package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js → git-model-Dnkd1TnK.js} +2 -2
  476. package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  477. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  478. package/dist/core/web/public/next/assets/{global-y_exIyAP.js.map → global-CMNW_dqn.js.map} +1 -1
  479. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  480. package/dist/core/web/public/next/assets/{guarded-runners-Cd4POBtI.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  481. package/dist/core/web/public/next/assets/{icons-CygCEFWs.js → icons-D1sYbCTQ.js} +2 -2
  482. package/dist/core/web/public/next/assets/{icons-CygCEFWs.js.map → icons-D1sYbCTQ.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{index-CyK31YRm.js → index-DZ-UQ7v8.js} +3 -3
  484. package/dist/core/web/public/next/assets/{index-CyK31YRm.js.map → index-DZ-UQ7v8.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  486. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  487. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  488. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  489. package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js → live-model-D_32RAOR.js} +2 -2
  490. package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js.map → live-model-D_32RAOR.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js → mind.module-7hA92hRg.js} +2 -2
  492. package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js.map → mind.module-7hA92hRg.js.map} +1 -1
  493. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  494. package/dist/core/web/public/next/assets/{mutations-CWlxEMEm.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  495. package/dist/core/web/public/next/assets/{nav-mimleI0R.js → nav-0dOYe2rJ.js} +2 -2
  496. package/dist/core/web/public/next/assets/{nav-mimleI0R.js.map → nav-0dOYe2rJ.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js → overnight-queries-C4wOnFtE.js} +2 -2
  498. package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  500. package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js → queries-BTXWdZzU.js} +2 -2
  501. package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js.map → queries-BTXWdZzU.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  503. package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js → reveal-anchor-DfNLgK_I.js} +2 -2
  505. package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  506. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  507. package/dist/core/web/public/next/assets/{seat-subscription-BhUUz7VL.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  508. package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js → sidebar-model-CLCdqwkR.js} +2 -2
  509. package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  510. package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js → slots-C-qBeu-8.js} +3 -3
  511. package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js.map → slots-C-qBeu-8.js.map} +1 -1
  512. package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js → surface-data-Dj71tdD-.js} +2 -2
  513. package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  514. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  515. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  516. package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js → tasks-model-O8yR5YXp.js} +2 -2
  517. package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js → terminal-icons-CoRZq9iO.js} +2 -2
  519. package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  521. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js → usage-queries-AdjEyEtn.js} +2 -2
  523. package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js → use-guarded-action-CuuMHeDX.js} +2 -2
  525. package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js → use-ticker-BBcp02SZ.js} +2 -2
  527. package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js → use-token-gate-CbXVYQYI.js} +2 -2
  529. package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js → useOnboarding-C_Fpe_sH.js} +2 -2
  531. package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  532. package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  533. package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js → useVerseTranscript-DgbigUlV.js} +2 -2
  535. package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js → verse-icons-S56hIiXS.js} +2 -2
  537. package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  539. package/dist/core/web/public/next/assets/{verse-model-JTuvRBVK.js.map → verse-model-DAVevkNe.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js → warmup-B_RAtNZ_.js} +3 -3
  541. package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  542. package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js → why-seat-model-M_r0wX3b.js} +2 -2
  543. package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js.map → why-seat-model-M_r0wX3b.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js → workspace-model-dji5-Al3.js} +2 -2
  545. package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  546. package/dist/core/web/public/next/index.html +1 -1
  547. package/dist/core/web/read-projection-worker.js +2 -1
  548. package/dist/core/web/read-projection-worker.js.map +1 -1
  549. package/dist/core/web/read-projections.d.ts +3 -0
  550. package/dist/core/web/read-projections.js +2 -2
  551. package/dist/core/web/read-projections.js.map +1 -1
  552. package/dist/core/web/visibility.js +3 -4
  553. package/dist/core/web/visibility.js.map +1 -1
  554. package/dist/release-dependency-inventory.json +1 -1
  555. package/package.json +3 -2
  556. package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +0 -2
  557. package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +0 -2
  558. package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js +0 -2
  559. package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js.map +0 -1
  560. package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +0 -2
  561. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  562. package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js +0 -2
  563. package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js.map +0 -1
  564. package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +0 -3
  565. package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js +0 -2
  566. package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js.map +0 -1
  567. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +0 -3
  568. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +0 -1
  569. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  570. package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +0 -2
  571. package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js +0 -3
  572. package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js.map +0 -1
  573. package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js +0 -2
  574. package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js.map +0 -1
  575. package/dist/core/web/public/next/assets/GrowthSection-BvZezOsX.js +0 -2
  576. package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js +0 -2
  577. package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js.map +0 -1
  578. package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js +0 -2
  579. package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js.map +0 -1
  580. package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +0 -2
  581. package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js +0 -2
  582. package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js.map +0 -1
  583. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +0 -3
  584. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +0 -1
  585. package/dist/core/web/public/next/assets/NewChatDialog-BqFTWgHU.js +0 -3
  586. package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +0 -3
  587. package/dist/core/web/public/next/assets/PreviewPane-zT3gK9TD.js +0 -2
  588. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CAxPQ4sZ.js +0 -7
  589. package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +0 -3
  590. package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js.map +0 -1
  591. package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js +0 -2
  592. package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js.map +0 -1
  593. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  594. package/dist/core/web/public/next/assets/SettingsSection-Bf74l0Gj.js.map +0 -1
  595. package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +0 -3
  596. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  597. package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js +0 -2
  598. package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js.map +0 -1
  599. package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js +0 -2
  600. package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js.map +0 -1
  601. package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js +0 -2
  602. package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js.map +0 -1
  603. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  604. package/dist/core/web/public/next/assets/UniverseConsoleApp-BpphLqoz.js +0 -2
  605. package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js +0 -3
  606. package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js.map +0 -1
  607. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +0 -3
  608. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +0 -1
  609. package/dist/core/web/public/next/assets/Workspace-RXy0pqp6.js +0 -10
  610. package/dist/core/web/public/next/assets/actions-BZTidCXZ.js +0 -2
  611. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  612. package/dist/core/web/public/next/assets/budget-queries-DFF-3ICg.js +0 -2
  613. package/dist/core/web/public/next/assets/charts-CzxWrZn7.js +0 -2
  614. package/dist/core/web/public/next/assets/charts-CzxWrZn7.js.map +0 -1
  615. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  616. package/dist/core/web/public/next/assets/command-catalog-ffCAijVY.js.map +0 -1
  617. package/dist/core/web/public/next/assets/context-queries-_9bFWb9v.js +0 -2
  618. package/dist/core/web/public/next/assets/global-y_exIyAP.js +0 -2
  619. package/dist/core/web/public/next/assets/guarded-runners-Cd4POBtI.js +0 -2
  620. package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +0 -2
  621. package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +0 -1
  622. package/dist/core/web/public/next/assets/seat-subscription-BhUUz7VL.js +0 -2
  623. package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +0 -2
  624. package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js.map +0 -1
  625. package/dist/core/web/public/next/assets/verse-model-JTuvRBVK.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewPane-zT3gK9TD.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":"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"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./index-CyK31YRm.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-AwHn2sKm.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-AwHn2sKm.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-CyK31YRm.js";import{D as r}from"./VerseConsoleApp-DXDv1aOi.js";import{i}from"./CapacityStrip-DKbKA_Aa.js";import{c as a,n as o}from"./capacity-strip-model-5ViUgUlP.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-xHrovWvI.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-xHrovWvI.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-CyK31YRm.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-SEFZlMB2.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-SEFZlMB2.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"}