@ashlr/hub 3.12.0 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (719) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +29 -16
  3. package/dist/authority-surface.json +274 -148
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +145 -33
  6. package/dist/cli/authority.js +1292 -315
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/cloud.js +12 -3
  9. package/dist/cli/cloud.js.map +1 -1
  10. package/dist/cli/comms.d.ts +33 -19
  11. package/dist/cli/comms.js +128 -151
  12. package/dist/cli/comms.js.map +1 -1
  13. package/dist/cli/completions.js +1 -1
  14. package/dist/cli/completions.js.map +1 -1
  15. package/dist/cli/daemon.js +29 -0
  16. package/dist/cli/daemon.js.map +1 -1
  17. package/dist/cli/director.d.ts +8 -12
  18. package/dist/cli/director.js +17 -52
  19. package/dist/cli/director.js.map +1 -1
  20. package/dist/cli/fleet.js +4 -1
  21. package/dist/cli/fleet.js.map +1 -1
  22. package/dist/cli/help.js +1 -0
  23. package/dist/cli/help.js.map +1 -1
  24. package/dist/cli/leader.d.ts +27 -3
  25. package/dist/cli/leader.js +253 -4
  26. package/dist/cli/leader.js.map +1 -1
  27. package/dist/core/authority/protected-paths.js +11 -0
  28. package/dist/core/authority/protected-paths.js.map +1 -1
  29. package/dist/core/authority/resident.d.ts +101 -0
  30. package/dist/core/authority/resident.js +246 -0
  31. package/dist/core/authority/resident.js.map +1 -0
  32. package/dist/core/authority/server-enforcement.d.ts +110 -0
  33. package/dist/core/authority/server-enforcement.js +260 -0
  34. package/dist/core/authority/server-enforcement.js.map +1 -0
  35. package/dist/core/authority/standing-grant.d.ts +24 -4
  36. package/dist/core/authority/standing-grant.js +19 -3
  37. package/dist/core/authority/standing-grant.js.map +1 -1
  38. package/dist/core/authority/types.d.ts +43 -0
  39. package/dist/core/authority/types.js +6 -0
  40. package/dist/core/authority/types.js.map +1 -1
  41. package/dist/core/cloud/budget.js +11 -1
  42. package/dist/core/cloud/budget.js.map +1 -1
  43. package/dist/core/cloud/cloud-api.d.ts +25 -2
  44. package/dist/core/cloud/cloud-api.js +139 -5
  45. package/dist/core/cloud/cloud-api.js.map +1 -1
  46. package/dist/core/cloud/pr-actions.d.ts +93 -0
  47. package/dist/core/cloud/pr-actions.js +436 -0
  48. package/dist/core/cloud/pr-actions.js.map +1 -0
  49. package/dist/core/cloud/pr-preview.d.ts +128 -0
  50. package/dist/core/cloud/pr-preview.js +228 -0
  51. package/dist/core/cloud/pr-preview.js.map +1 -0
  52. package/dist/core/cloud/store.d.ts +2 -0
  53. package/dist/core/cloud/store.js +28 -0
  54. package/dist/core/cloud/store.js.map +1 -1
  55. package/dist/core/cloud/timeline-api.d.ts +24 -0
  56. package/dist/core/cloud/timeline-api.js +46 -0
  57. package/dist/core/cloud/timeline-api.js.map +1 -0
  58. package/dist/core/cloud/timeline-types.d.ts +62 -0
  59. package/dist/core/cloud/timeline-types.js +36 -0
  60. package/dist/core/cloud/timeline-types.js.map +1 -0
  61. package/dist/core/cloud/timeline.d.ts +102 -0
  62. package/dist/core/cloud/timeline.js +925 -0
  63. package/dist/core/cloud/timeline.js.map +1 -0
  64. package/dist/core/cloud/tracker.js +67 -0
  65. package/dist/core/cloud/tracker.js.map +1 -1
  66. package/dist/core/cloud/types.d.ts +38 -0
  67. package/dist/core/cloud/types.js +1 -1
  68. package/dist/core/cloud/types.js.map +1 -1
  69. package/dist/core/comms/change-digest.d.ts +130 -0
  70. package/dist/core/comms/change-digest.js +451 -0
  71. package/dist/core/comms/change-digest.js.map +1 -0
  72. package/dist/core/comms/director-prompt.d.ts +4 -5
  73. package/dist/core/comms/director-prompt.js +4 -71
  74. package/dist/core/comms/director-prompt.js.map +1 -1
  75. package/dist/core/comms/director.d.ts +24 -61
  76. package/dist/core/comms/director.js +29 -382
  77. package/dist/core/comms/director.js.map +1 -1
  78. package/dist/core/comms/dispatch.d.ts +37 -12
  79. package/dist/core/comms/dispatch.js +244 -177
  80. package/dist/core/comms/dispatch.js.map +1 -1
  81. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  82. package/dist/core/comms/elon-dialogue.js +36 -307
  83. package/dist/core/comms/elon-dialogue.js.map +1 -1
  84. package/dist/core/comms/fleet-pulse.js +4 -7
  85. package/dist/core/comms/fleet-pulse.js.map +1 -1
  86. package/dist/core/comms/handlers.d.ts +10 -6
  87. package/dist/core/comms/handlers.js +14 -48
  88. package/dist/core/comms/handlers.js.map +1 -1
  89. package/dist/core/comms/migrations.d.ts +47 -0
  90. package/dist/core/comms/migrations.js +125 -0
  91. package/dist/core/comms/migrations.js.map +1 -0
  92. package/dist/core/comms/requests.d.ts +32 -5
  93. package/dist/core/comms/requests.js +101 -5
  94. package/dist/core/comms/requests.js.map +1 -1
  95. package/dist/core/comms/telegram-channel.d.ts +104 -0
  96. package/dist/core/comms/telegram-channel.js +622 -0
  97. package/dist/core/comms/telegram-channel.js.map +1 -0
  98. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  99. package/dist/core/comms/telegram-thread-map.js +144 -0
  100. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  101. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  102. package/dist/core/daemon/capacity-publisher.js +40 -2
  103. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  104. package/dist/core/daemon/loop.js +18 -4
  105. package/dist/core/daemon/loop.js.map +1 -1
  106. package/dist/core/daemon/service-install-authority.d.ts +10 -2
  107. package/dist/core/daemon/service-install-authority.js +14 -5
  108. package/dist/core/daemon/service-install-authority.js.map +1 -1
  109. package/dist/core/daemon/service.d.ts +15 -0
  110. package/dist/core/daemon/service.js +26 -0
  111. package/dist/core/daemon/service.js.map +1 -1
  112. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  113. package/dist/core/daemon/tick-deadline.js +83 -0
  114. package/dist/core/daemon/tick-deadline.js.map +1 -0
  115. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  116. package/dist/core/daemon/tick-hooks.js.map +1 -1
  117. package/dist/core/daemon/tick-progress.d.ts +39 -0
  118. package/dist/core/daemon/tick-progress.js +194 -0
  119. package/dist/core/daemon/tick-progress.js.map +1 -0
  120. package/dist/core/dashboard.js +3 -1
  121. package/dist/core/dashboard.js.map +1 -1
  122. package/dist/core/fleet/cloud-intake.d.ts +95 -0
  123. package/dist/core/fleet/cloud-intake.js +557 -0
  124. package/dist/core/fleet/cloud-intake.js.map +1 -0
  125. package/dist/core/fleet/dispatch-router.d.ts +13 -0
  126. package/dist/core/fleet/dispatch-router.js +32 -8
  127. package/dist/core/fleet/dispatch-router.js.map +1 -1
  128. package/dist/core/fleet/fleet-merge-state.d.ts +16 -0
  129. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  130. package/dist/core/fleet/host-merge.d.ts +14 -0
  131. package/dist/core/fleet/host-merge.js +24 -2
  132. package/dist/core/fleet/host-merge.js.map +1 -1
  133. package/dist/core/fleet/merge-gates.d.ts +21 -0
  134. package/dist/core/fleet/merge-gates.js +39 -5
  135. package/dist/core/fleet/merge-gates.js.map +1 -1
  136. package/dist/core/fleet/mirrors.d.ts +162 -6
  137. package/dist/core/fleet/mirrors.js +1051 -49
  138. package/dist/core/fleet/mirrors.js.map +1 -1
  139. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  140. package/dist/core/fleet/standing-merge-pass.js +102 -1
  141. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  142. package/dist/core/fleet/status.d.ts +17 -0
  143. package/dist/core/fleet/status.js +22 -0
  144. package/dist/core/fleet/status.js.map +1 -1
  145. package/dist/core/fleet/tick-hooks-live.d.ts +10 -1
  146. package/dist/core/fleet/tick-hooks-live.js +57 -8
  147. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  148. package/dist/core/fleet/verify-check-run.d.ts +90 -0
  149. package/dist/core/fleet/verify-check-run.js +274 -0
  150. package/dist/core/fleet/verify-check-run.js.map +1 -0
  151. package/dist/core/git.d.ts +17 -0
  152. package/dist/core/git.js +124 -25
  153. package/dist/core/git.js.map +1 -1
  154. package/dist/core/goals/open-goals.d.ts +47 -0
  155. package/dist/core/goals/open-goals.js +33 -0
  156. package/dist/core/goals/open-goals.js.map +1 -0
  157. package/dist/core/inbox/merge.d.ts +5 -0
  158. package/dist/core/inbox/merge.js +58 -2
  159. package/dist/core/inbox/merge.js.map +1 -1
  160. package/dist/core/integrations/locus.d.ts +28 -0
  161. package/dist/core/integrations/locus.js +155 -30
  162. package/dist/core/integrations/locus.js.map +1 -1
  163. package/dist/core/integrations/telegram-format.d.ts +40 -0
  164. package/dist/core/integrations/telegram-format.js +123 -0
  165. package/dist/core/integrations/telegram-format.js.map +1 -0
  166. package/dist/core/integrations/telegram.d.ts +60 -4
  167. package/dist/core/integrations/telegram.js +161 -28
  168. package/dist/core/integrations/telegram.js.map +1 -1
  169. package/dist/core/mcp-registry.d.ts +12 -0
  170. package/dist/core/mcp-registry.js +70 -0
  171. package/dist/core/mcp-registry.js.map +1 -1
  172. package/dist/core/observability/rollup.d.ts +12 -10
  173. package/dist/core/observability/rollup.js +44 -17
  174. package/dist/core/observability/rollup.js.map +1 -1
  175. package/dist/core/resources/connection-monitor.d.ts +9 -0
  176. package/dist/core/resources/connection-monitor.js +19 -9
  177. package/dist/core/resources/connection-monitor.js.map +1 -1
  178. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  179. package/dist/core/resources/quota-refresh-lease.js +34 -1
  180. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  181. package/dist/core/routing/budget-api.d.ts +18 -1
  182. package/dist/core/routing/budget-api.js +120 -10
  183. package/dist/core/routing/budget-api.js.map +1 -1
  184. package/dist/core/routing/budget-store.d.ts +22 -1
  185. package/dist/core/routing/budget-store.js +22 -8
  186. package/dist/core/routing/budget-store.js.map +1 -1
  187. package/dist/core/routing/readiness-types.d.ts +82 -0
  188. package/dist/core/routing/readiness-types.js +23 -0
  189. package/dist/core/routing/readiness-types.js.map +1 -0
  190. package/dist/core/routing/readiness.d.ts +103 -0
  191. package/dist/core/routing/readiness.js +480 -0
  192. package/dist/core/routing/readiness.js.map +1 -0
  193. package/dist/core/sandbox/confine.js +22 -1
  194. package/dist/core/sandbox/confine.js.map +1 -1
  195. package/dist/core/sandbox/policy.d.ts +23 -0
  196. package/dist/core/sandbox/policy.js +100 -0
  197. package/dist/core/sandbox/policy.js.map +1 -1
  198. package/dist/core/types.d.ts +13 -0
  199. package/dist/core/types.js.map +1 -1
  200. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  201. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  202. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  203. package/dist/core/usage/frontier-usage.d.ts +20 -2
  204. package/dist/core/usage/frontier-usage.js +75 -17
  205. package/dist/core/usage/frontier-usage.js.map +1 -1
  206. package/dist/core/verse/account-health.js +9 -3
  207. package/dist/core/verse/account-health.js.map +1 -1
  208. package/dist/core/verse/accounts.d.ts +45 -0
  209. package/dist/core/verse/accounts.js +246 -17
  210. package/dist/core/verse/accounts.js.map +1 -1
  211. package/dist/core/verse/activity-api.d.ts +5 -1
  212. package/dist/core/verse/activity-api.js +62 -14
  213. package/dist/core/verse/activity-api.js.map +1 -1
  214. package/dist/core/verse/apps-api.js +23 -11
  215. package/dist/core/verse/apps-api.js.map +1 -1
  216. package/dist/core/verse/apps.d.ts +11 -9
  217. package/dist/core/verse/apps.js +2 -2
  218. package/dist/core/verse/apps.js.map +1 -1
  219. package/dist/core/verse/authority-api.d.ts +17 -3
  220. package/dist/core/verse/authority-api.js +122 -7
  221. package/dist/core/verse/authority-api.js.map +1 -1
  222. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  223. package/dist/core/verse/autonomy-ladder.js +251 -0
  224. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  225. package/dist/core/verse/context-fit.js +7 -5
  226. package/dist/core/verse/context-fit.js.map +1 -1
  227. package/dist/core/verse/control-api.d.ts +23 -1
  228. package/dist/core/verse/control-api.js +117 -10
  229. package/dist/core/verse/control-api.js.map +1 -1
  230. package/dist/core/verse/fleet-live-api.js +13 -5
  231. package/dist/core/verse/fleet-live-api.js.map +1 -1
  232. package/dist/core/verse/folder-io.d.ts +50 -0
  233. package/dist/core/verse/folder-io.js +142 -0
  234. package/dist/core/verse/folder-io.js.map +1 -0
  235. package/dist/core/verse/git-api.js +5 -4
  236. package/dist/core/verse/git-api.js.map +1 -1
  237. package/dist/core/verse/git-ops.d.ts +10 -1
  238. package/dist/core/verse/git-ops.js +18 -2
  239. package/dist/core/verse/git-ops.js.map +1 -1
  240. package/dist/core/verse/github-api.d.ts +1 -1
  241. package/dist/core/verse/github-api.js +5 -4
  242. package/dist/core/verse/github-api.js.map +1 -1
  243. package/dist/core/verse/github-repo.js +118 -14
  244. package/dist/core/verse/github-repo.js.map +1 -1
  245. package/dist/core/verse/leader-api.d.ts +5 -4
  246. package/dist/core/verse/leader-api.js +237 -10
  247. package/dist/core/verse/leader-api.js.map +1 -1
  248. package/dist/core/verse/local-models.d.ts +10 -0
  249. package/dist/core/verse/local-models.js +10 -1
  250. package/dist/core/verse/local-models.js.map +1 -1
  251. package/dist/core/verse/login-path.d.ts +73 -0
  252. package/dist/core/verse/login-path.js +123 -14
  253. package/dist/core/verse/login-path.js.map +1 -1
  254. package/dist/core/verse/mcp-control-api.js +4 -4
  255. package/dist/core/verse/mcp-control-api.js.map +1 -1
  256. package/dist/core/verse/mcp-scope.d.ts +22 -0
  257. package/dist/core/verse/mcp-scope.js +41 -1
  258. package/dist/core/verse/mcp-scope.js.map +1 -1
  259. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  260. package/dist/core/verse/mcp-seat-view.js +30 -4
  261. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  262. package/dist/core/verse/overnight-api.js +20 -2
  263. package/dist/core/verse/overnight-api.js.map +1 -1
  264. package/dist/core/verse/path-guard.d.ts +24 -0
  265. package/dist/core/verse/path-guard.js +91 -22
  266. package/dist/core/verse/path-guard.js.map +1 -1
  267. package/dist/core/verse/preview-api.js +22 -0
  268. package/dist/core/verse/preview-api.js.map +1 -1
  269. package/dist/core/verse/projects.d.ts +21 -0
  270. package/dist/core/verse/projects.js +82 -0
  271. package/dist/core/verse/projects.js.map +1 -1
  272. package/dist/core/verse/seat-readiness.d.ts +25 -0
  273. package/dist/core/verse/seat-readiness.js +43 -6
  274. package/dist/core/verse/seat-readiness.js.map +1 -1
  275. package/dist/core/verse/session-controls-api.js +5 -3
  276. package/dist/core/verse/session-controls-api.js.map +1 -1
  277. package/dist/core/verse/session-handoff.d.ts +26 -0
  278. package/dist/core/verse/session-handoff.js +90 -12
  279. package/dist/core/verse/session-handoff.js.map +1 -1
  280. package/dist/core/verse/terminal-api.js +7 -4
  281. package/dist/core/verse/terminal-api.js.map +1 -1
  282. package/dist/core/verse/terminal.js +9 -5
  283. package/dist/core/verse/terminal.js.map +1 -1
  284. package/dist/core/verse/verse-api.d.ts +3 -1
  285. package/dist/core/verse/verse-api.js +87 -27
  286. package/dist/core/verse/verse-api.js.map +1 -1
  287. package/dist/core/verse/workspaces.d.ts +51 -0
  288. package/dist/core/verse/workspaces.js +177 -47
  289. package/dist/core/verse/workspaces.js.map +1 -1
  290. package/dist/core/vision/leader-apply.d.ts +40 -0
  291. package/dist/core/vision/leader-apply.js +101 -30
  292. package/dist/core/vision/leader-apply.js.map +1 -1
  293. package/dist/core/vision/leader-cadence.d.ts +114 -0
  294. package/dist/core/vision/leader-cadence.js +127 -0
  295. package/dist/core/vision/leader-cadence.js.map +1 -0
  296. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  297. package/dist/core/vision/leader-goal-evidence.js +36 -0
  298. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  299. package/dist/core/vision/leader-health.d.ts +53 -0
  300. package/dist/core/vision/leader-health.js +92 -0
  301. package/dist/core/vision/leader-health.js.map +1 -0
  302. package/dist/core/vision/leader-operator.d.ts +176 -0
  303. package/dist/core/vision/leader-operator.js +355 -0
  304. package/dist/core/vision/leader-operator.js.map +1 -0
  305. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  306. package/dist/core/vision/leader-run-chain.js +54 -0
  307. package/dist/core/vision/leader-run-chain.js.map +1 -0
  308. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  309. package/dist/core/vision/leader-seat-plan.js +93 -0
  310. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  311. package/dist/core/vision/leader-seat.d.ts +71 -5
  312. package/dist/core/vision/leader-seat.js +235 -33
  313. package/dist/core/vision/leader-seat.js.map +1 -1
  314. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  315. package/dist/core/vision/leader-thread-types.js +9 -0
  316. package/dist/core/vision/leader-thread-types.js.map +1 -0
  317. package/dist/core/vision/leader-thread.d.ts +138 -0
  318. package/dist/core/vision/leader-thread.js +926 -0
  319. package/dist/core/vision/leader-thread.js.map +1 -0
  320. package/dist/core/vision/leader-types.d.ts +75 -1
  321. package/dist/core/vision/leader.d.ts +88 -18
  322. package/dist/core/vision/leader.js +269 -69
  323. package/dist/core/vision/leader.js.map +1 -1
  324. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js → ActionMenu-CIiX2X8w.js} +2 -2
  325. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  327. package/dist/core/web/public/next/assets/{Advanced-B-LqYXvd.js.map → Advanced-DHsysoIL.js.map} +1 -1
  328. package/dist/core/web/public/next/assets/App-CMeAocmW.js +7 -0
  329. package/dist/core/web/public/next/assets/{App-E2zCDRxm.js.map → App-CMeAocmW.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  331. package/dist/core/web/public/next/assets/{AppsSection-8wXPPhZb.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  333. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  334. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js +3 -0
  335. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js.map +1 -0
  336. package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
  337. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  338. package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  340. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  341. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js → BranchBar-BxhdiIpx.js} +2 -2
  342. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js +2 -0
  344. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js.map +1 -0
  345. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-D90dzI_o.js} +2 -2
  346. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-D90dzI_o.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-qKDBC65C.js} +2 -2
  348. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  350. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  351. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  352. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  353. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js.map +1 -0
  354. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  355. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  357. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  358. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  359. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  360. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  361. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  362. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-D3msQlCj.js} +2 -2
  366. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-D3msQlCj.js.map} +1 -1
  367. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Ix6hvXlY.js} +2 -2
  368. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-C4WKsCIe.js} +2 -2
  370. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  371. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  372. package/dist/core/web/public/next/assets/{DockHost-DW9q0NdR.js.map → DockHost-aWP7liri.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-D2IRy3Cg.js} +2 -2
  374. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  375. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-DMr18muX.js} +2 -2
  376. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-DMr18muX.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js +2 -0
  378. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js.map +1 -0
  379. package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
  380. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  381. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  382. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  383. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js → GearTray-Dt-ee32-.js} +2 -2
  385. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  387. package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  388. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-CLJQLe7M.js} +2 -2
  389. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-D_KRJA9V.js} +2 -2
  391. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js.map → Input-D_KRJA9V.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  393. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  394. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  395. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  396. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  397. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  398. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  399. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  400. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  401. package/dist/core/web/public/next/assets/{McpSection-BRuCcTjT.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  402. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-DFvk06qG.js} +3 -3
  403. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  404. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  405. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  406. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-CMj-VafN.js} +2 -2
  407. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js.map → Meter-CMj-VafN.js.map} +1 -1
  408. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  409. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  410. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  411. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  412. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  413. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  414. package/dist/core/web/public/next/assets/NeedsYouList-CCsijdWt.js +2 -0
  415. package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
  417. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  418. package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  419. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js +3 -0
  420. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js.map +1 -0
  421. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  422. package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  423. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  424. package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  425. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  426. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  427. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-Co5UB6We.js} +2 -2
  428. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  429. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  430. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  431. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  432. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  434. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  435. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  436. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  437. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  438. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  439. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  441. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-J5R3zDkB.js} +3 -3
  443. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  444. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-CGh_-tBb.js} +2 -2
  445. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  446. package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-CWnmUzs3.js} +2 -2
  447. package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-CWnmUzs3.js.map} +1 -1
  448. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-sp4KsnUo.js} +2 -2
  449. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  450. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  451. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  452. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-DbFjwR1h.js} +2 -2
  453. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  454. package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js → SettingsSection-Ch23msJ5.js} +2 -2
  455. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  456. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js +2 -0
  457. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js.map +1 -0
  458. package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
  459. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  460. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  461. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js → Sheet-BZ2AG4Eo.js} +2 -2
  462. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  464. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  466. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js.map +1 -0
  467. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-KVoJLDD6.js} +2 -2
  468. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js.map → Slider-KVoJLDD6.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  470. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  471. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  472. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXsYqmdU.js} +2 -2
  473. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  474. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  475. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  476. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js → Surface-BfDmQcKe.js} +2 -2
  477. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-BfDmQcKe.js.map} +1 -1
  478. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  479. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  480. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  481. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js → Switch-9NtO_6Lj.js} +2 -2
  482. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-DscCRFcN.js} +2 -2
  484. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-DscCRFcN.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js} +5 -5
  486. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  487. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  488. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  489. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DG70zH0W.js} +4 -4
  490. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  492. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  493. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  494. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  495. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  496. package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  498. package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js.map → actions-CY-PjpGc.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  500. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js → apps-model-Du02KhAf.js} +2 -2
  501. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-Du02KhAf.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-79SeuKlJ.js} +2 -2
  503. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  505. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  506. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  507. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  508. package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  509. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  510. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  511. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  512. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  513. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  514. package/dist/core/web/public/next/assets/cloud-model-BDivRMqv.js +2 -0
  515. package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  516. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  517. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  519. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js → command-catalog-BIntSa9l.js} +2 -2
  521. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js → context-model-Br8t9jgG.js} +2 -2
  523. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-Br8t9jgG.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-CokrgEUq.js} +3 -3
  525. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js.map → context-model-CokrgEUq.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  527. package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js.map → context-queries-eL3caKVG.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-B9K-wmcB.js} +2 -2
  529. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js +2 -0
  531. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js.map +1 -0
  532. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-BJ6ZqB2t.js} +2 -2
  533. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-BvDR3gjp.js} +2 -2
  535. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-W2UFVMZJ.js} +2 -2
  537. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-CtI1SlMX.js} +2 -2
  539. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/format-CH4g_sl1.js +2 -0
  541. package/dist/core/web/public/next/assets/format-CH4g_sl1.js.map +1 -0
  542. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  543. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js → git-model-Dnkd1TnK.js} +2 -2
  545. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  546. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  547. package/dist/core/web/public/next/assets/{global-CNNGMril.js.map → global-CMNW_dqn.js.map} +1 -1
  548. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  549. package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  550. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-D1sYbCTQ.js} +2 -2
  551. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-D1sYbCTQ.js.map} +1 -1
  552. package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-DZ-UQ7v8.js} +3 -3
  553. package/dist/core/web/public/next/assets/{index-QesfXBsb.js.map → index-DZ-UQ7v8.js.map} +1 -1
  554. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  555. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  556. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  557. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  558. package/dist/core/web/public/next/assets/{live-model-De-q0ZFK.js → live-model-D_32RAOR.js} +2 -2
  559. package/dist/core/web/public/next/assets/live-model-D_32RAOR.js.map +1 -0
  560. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-7hA92hRg.js} +2 -2
  561. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js.map → mind.module-7hA92hRg.js.map} +1 -1
  562. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  563. package/dist/core/web/public/next/assets/{mutations-DTCtKCn_.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  564. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-0dOYe2rJ.js} +2 -2
  565. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-0dOYe2rJ.js.map} +1 -1
  566. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-C4wOnFtE.js} +2 -2
  567. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  568. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  569. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js → queries-BTXWdZzU.js} +2 -2
  570. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-BTXWdZzU.js.map} +1 -1
  571. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  572. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  573. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-DfNLgK_I.js} +2 -2
  574. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  575. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  576. package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  577. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-CLCdqwkR.js} +2 -2
  578. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  579. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-C-qBeu-8.js} +3 -3
  580. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-C-qBeu-8.js.map} +1 -1
  581. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-Dj71tdD-.js} +2 -2
  582. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  583. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  584. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  585. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js → tasks-model-O8yR5YXp.js} +2 -2
  586. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  587. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-CoRZq9iO.js} +2 -2
  588. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  589. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  590. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  591. package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
  592. package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
  593. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-AdjEyEtn.js} +2 -2
  594. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  595. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-CuuMHeDX.js} +2 -2
  596. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  597. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BBcp02SZ.js} +2 -2
  598. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  599. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-CbXVYQYI.js} +2 -2
  600. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  601. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-C_Fpe_sH.js} +2 -2
  602. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  603. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  604. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  605. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-DgbigUlV.js} +2 -2
  606. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  607. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-S56hIiXS.js} +2 -2
  608. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  609. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  610. package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js.map → verse-model-DAVevkNe.js.map} +1 -1
  611. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-B_RAtNZ_.js} +3 -3
  612. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  613. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js +2 -0
  614. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js.map +1 -0
  615. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-dji5-Al3.js} +2 -2
  616. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  617. package/dist/core/web/public/next/index.html +1 -1
  618. package/dist/core/web/read-projection-worker.js +2 -1
  619. package/dist/core/web/read-projection-worker.js.map +1 -1
  620. package/dist/core/web/read-projections.d.ts +3 -0
  621. package/dist/core/web/read-projections.js +2 -2
  622. package/dist/core/web/read-projections.js.map +1 -1
  623. package/dist/core/web/visibility.js +3 -4
  624. package/dist/core/web/visibility.js.map +1 -1
  625. package/dist/release-dependency-inventory.json +1 -1
  626. package/docs/AUTONOMY-GAP.md +1 -1
  627. package/package.json +3 -2
  628. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
  629. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
  630. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
  631. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +0 -2
  632. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js.map +0 -1
  633. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
  634. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
  635. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
  636. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
  637. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
  638. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
  639. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  640. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +0 -2
  641. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +0 -1
  642. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
  643. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
  644. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +0 -2
  645. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +0 -1
  646. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  647. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
  648. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
  649. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
  650. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +0 -3
  651. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +0 -1
  652. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +0 -2
  653. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js.map +0 -1
  654. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +0 -2
  655. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +0 -2
  656. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +0 -2
  658. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js.map +0 -1
  659. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
  660. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +0 -2
  661. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +0 -1
  662. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
  664. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
  665. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
  666. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +0 -3
  667. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
  668. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
  669. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
  670. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +0 -2
  671. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BX2nkdmZ.js +0 -7
  672. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
  673. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +0 -1
  674. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  675. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +0 -2
  676. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +0 -1
  677. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +0 -1
  678. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
  679. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
  680. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  681. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +0 -2
  682. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +0 -1
  683. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +0 -2
  684. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js.map +0 -1
  685. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +0 -2
  686. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js.map +0 -1
  687. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  688. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +0 -2
  689. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +0 -3
  690. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +0 -1
  691. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
  692. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
  693. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +0 -10
  694. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  695. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +0 -2
  696. package/dist/core/web/public/next/assets/budget-queries-DsAjH8ac.js +0 -2
  697. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +0 -2
  698. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +0 -1
  699. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  700. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
  701. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +0 -1
  702. package/dist/core/web/public/next/assets/context-queries-CktFQqSS.js +0 -2
  703. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
  704. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
  705. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
  706. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
  707. package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
  708. package/dist/core/web/public/next/assets/guarded-runners-DPh2d32e.js +0 -2
  709. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
  710. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
  711. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
  712. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +0 -2
  713. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
  714. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +0 -1
  715. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
  716. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
  717. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +0 -2
  718. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
  719. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"charts-C_xJbJiw.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/ChartContainer.module.css","../../../../../../src/web-ui/components/charts/ChartContainer.tsx","../../../../../../src/web-ui/components/charts/Legend.module.css","../../../../../../src/web-ui/components/charts/Legend.tsx","../../../../../../src/web-ui/components/charts/LineChart.module.css","../../../../../../src/web-ui/components/charts/LineChart.tsx","../../../../../../src/web-ui/components/charts/BarChart.module.css","../../../../../../src/web-ui/components/charts/BarChart.tsx","../../../../../../src/web-ui/components/charts/BurnDown.tsx"],"sourcesContent":[".figure {\n margin: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n padding: var(--space-4);\n /* Fixed heights must include the axis-label band — this container instead\n grows with its content so a chart's x-axis labels never get clipped or\n forced into a nested scroll (dataviz anti-patterns). */\n}\n\n.caption {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-3);\n margin-bottom: var(--space-3);\n}\n\n.title {\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.description {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n\n.plot {\n width: 100%;\n overflow-x: auto;\n}\n\n.tableDisclosure {\n margin-top: var(--space-3);\n border-top: 1px solid var(--border-subtle);\n padding-top: var(--space-2);\n}\n\n.tableDisclosure > summary {\n cursor: pointer;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n list-style: none;\n}\n\n.tableDisclosure > summary::-webkit-details-marker {\n display: none;\n}\n\n.tableDisclosure > summary::before {\n content: '▸ ';\n}\n\n.tableDisclosure[open] > summary::before {\n content: '▾ ';\n}\n\n.tableBody {\n margin-top: var(--space-2);\n}\n\n.caveat {\n margin: 0 0 var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-md);\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-size: var(--text-xs-size);\n line-height: var(--text-sm-line);\n}\n\n.empty {\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n padding: var(--space-6) 0;\n text-align: center;\n}\n","/**\n * components/charts/ChartContainer.tsx — the figure every chart mounts\n * inside: title/description, the plot itself, an optional caveat banner\n * (epistemic-honesty-adjacent: for a chart built on data with a known,\n * disclosed limitation — see ProductionView's judge-verdict caveat), an\n * optional table-view twin (the WCAG-clean accessibility equivalent every\n * chart should ship per the dataviz skill), and an empty state that never\n * lies about missing data.\n */\nimport type { ReactNode } from 'react';\nimport './chart-tokens.css';\nimport styles from './ChartContainer.module.css';\n\nexport interface ChartContainerProps {\n title: string;\n description?: string;\n /** A short, honest note about a known limitation of the data behind this\n * chart (e.g. \"counts may include X, not yet separable\"). Never omit a\n * caveat to make a chart look cleaner than the data actually is. */\n caveat?: string;\n /** The chart itself (SVG + legend). */\n children: ReactNode;\n /** The accessibility twin — same data as a real HTML table. Omit only\n * when the chart already IS a table. */\n table?: ReactNode;\n /** When true, renders the empty state instead of `children`. */\n empty?: boolean;\n emptyMessage?: string;\n}\n\nexport function ChartContainer({\n title,\n description,\n caveat,\n children,\n table,\n empty,\n emptyMessage = 'No data for this window.',\n}: ChartContainerProps) {\n return (\n <figure className={styles.figure}>\n <figcaption className={styles.caption}>\n <span className={styles.title}>{title}</span>\n {description ? <span className={styles.description}>{description}</span> : null}\n </figcaption>\n {caveat ? (\n <p className={styles.caveat} role=\"note\">\n {caveat}\n </p>\n ) : null}\n {empty ? (\n <p className={styles.empty}>{emptyMessage}</p>\n ) : (\n <div className={styles.plot}>{children}</div>\n )}\n {table ? (\n <details className={styles.tableDisclosure}>\n <summary>View as table</summary>\n <div className={styles.tableBody}>{table}</div>\n </details>\n ) : null}\n </figure>\n );\n}\n",".legend {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-4);\n margin: var(--space-2) 0 0;\n padding: 0;\n list-style: none;\n}\n\n.item {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: var(--radius-full);\n flex: none;\n}\n\n.swatchLine {\n width: 14px;\n height: 2px;\n border-radius: var(--radius-full);\n flex: none;\n}\n","/**\n * components/charts/Legend.tsx — the dependable identity channel. A legend\n * is always present for two or more series (never rely on color-matching\n * alone); a single series needs no legend box because the chart's own title\n * already names it (see marks-and-anatomy.md \"Labels & legend\").\n */\nimport styles from './Legend.module.css';\n\nexport interface LegendItem {\n label: string;\n color: string;\n /** 'line' for line charts (a short stroke key), 'swatch' for bar/area. */\n kind?: 'line' | 'swatch';\n}\n\nexport function Legend({ items }: { items: LegendItem[] }) {\n if (items.length < 2) return null;\n return (\n <ul className={styles.legend}>\n {items.map((it) => (\n <li key={it.label} className={styles.item}>\n <span\n className={it.kind === 'line' ? styles.swatchLine : styles.swatch}\n style={{ background: it.color }}\n aria-hidden=\"true\"\n />\n {it.label}\n </li>\n ))}\n </ul>\n );\n}\n","/* Drawn at its measured width and a fixed height (width/height attributes\n set by LineChart). Never `width: 100%; height: auto` — that stretches the\n viewBox, text included, with the window. `max-width` keeps a not-yet-\n measured first paint from pushing its container wider. */\n.svg {\n display: block;\n max-width: 100%;\n}\n\n.gridline {\n stroke: var(--chart-grid);\n stroke-width: 1;\n}\n\n.axis {\n stroke: var(--chart-axis);\n stroke-width: 1;\n}\n\n.axisLabel {\n font-size: var(--text-xs-size);\n fill: var(--text-tertiary);\n font-family: var(--font-ui);\n}\n\n.line {\n fill: none;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.area {\n opacity: 0.1;\n stroke: none;\n}\n\n.marker {\n stroke: var(--chart-surface);\n stroke-width: 2;\n}\n\n.endLabel {\n font-size: var(--text-xs-size);\n font-family: var(--font-ui);\n font-weight: var(--font-weight-medium);\n}\n\n.crosshairLine {\n stroke: var(--chart-axis);\n stroke-width: 1;\n pointer-events: none;\n}\n\n.overlay {\n fill: transparent;\n cursor: crosshair;\n}\n\n.wrap {\n position: relative;\n width: 100%;\n min-width: 0;\n}\n\n.tooltip {\n position: absolute;\n pointer-events: none;\n background: var(--chart-tooltip-bg);\n border: 1px solid var(--chart-tooltip-border);\n border-radius: var(--radius-sm);\n box-shadow: var(--shadow-md);\n padding: var(--space-2);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n white-space: nowrap;\n z-index: var(--z-dropdown);\n transform: translate(-50%, -100%);\n margin-top: -10px;\n}\n\n.tooltipDate {\n color: var(--text-tertiary);\n margin-bottom: var(--space-1);\n}\n\n.tooltipRow {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n.tooltipKey {\n width: 12px;\n height: 2px;\n flex: none;\n}\n\n.tooltipValue {\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n}\n\n.tooltipGap {\n color: var(--text-tertiary);\n font-style: italic;\n}\n","/**\n * components/charts/LineChart.tsx — trend over time. A gap (`null` y) is\n * split into a separate path segment so it renders as a visible break in\n * the line, never as a straight line through a missing value and never as\n * a silent zero. Single series gets an optional soft area fill; two-plus\n * series always render a legend (never color-matching alone).\n *\n * Sizing (after 3.11.3): the chart draws at its MEASURED pixel width and a fixed\n * pixel `height` — one user unit is one CSS pixel — like the V3.10 kit\n * (useChartWidth). It used to draw into a fixed 640-unit viewBox stretched\n * with `width: 100%; height: auto`, so on a 1900 px window the whole figure,\n * text included, scaled ~2.8×: 12 px tick labels rendered at ~34 px, the\n * 200 px chart stood ~560 px tall, and the end label (\"Tokens in\") dwarfed\n * the card. Now the coordinate system scales and the text never does.\n */\nimport { useRef, useState } from 'react';\nimport type { Series } from './types.js';\nimport { seriesColor, CHART_GRID, CHART_AXIS } from './colors.js';\nimport { Legend } from './Legend.js';\nimport {\n MIN_TIME_SPAN_MS,\n allIntegers,\n axisTicks,\n dodgeLabels,\n ensureSpan,\n isTimeAxis,\n labelCharPx,\n layoutAxisLabels,\n xKeeper,\n} from './chart-math.js';\nimport { timeLabelLadder } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.js';\nimport './chart-tokens.css';\nimport styles from './LineChart.module.css';\n\n/** Width drawn at before the container is measured (jsdom, first paint). */\nconst FALLBACK_W = 640;\n/** Minimum left gutter; it widens when the y tick labels need more (see padL). */\nconst PAD_L = 44;\nconst PAD_R = 12;\nconst PAD_T = 12;\nconst PAD_B = 24;\nconst TICKS_Y = 4;\n/* Direct end-of-line labels need a gutter of their own. User units are CSS\n pixels here (the viewBox matches the measured width), and `--text-xs-size`\n is 12 px, where the UI sans averages a shade over 6 px per character at\n medium weight. 6.4 rounds that up so the reserve errs\n wide rather than clipping. Without the reserve the label was drawn at\n `width - PAD_R + 4` with only PAD_R (12 px) of room and the svg's own\n `overflow: hidden` cropped it to its first glyph — \"Estimated spend\"\n rendered as a lone \"E\".\n Every text measure here (END_LABEL_CH, END_LABEL_GAP_Y, the axis label\n advance) is for 12 px text and is multiplied by the operator's Display\n size (useTextScale): --text-xs-size is 12px × --ui-text-scale, so at\n XLarge the same label is 15 units tall and 25% wider. END_LABEL_MAX is a\n budget of plot width, not a text measure, and stays as it is. */\nconst END_LABEL_CH = 6.4;\nconst END_LABEL_GAP = 4;\n/* Past this the gutter would cost more plot than the label is worth, so the\n label is dropped rather than shrinking the chart around it. Nothing is lost:\n Legend.tsx deliberately renders nothing below two series because the panel\n heading already names a lone series, and two-plus series always have the\n legend regardless. */\nconst END_LABEL_MAX = 150;\n/** Line height of a direct end label at 12 px (user units): two closer than this overlap. */\nconst END_LABEL_GAP_Y = 14;\n\ninterface Run {\n x: number;\n y: number;\n}\n\nfunction splitRuns(points: Series['points']): Run[][] {\n const runs: Run[][] = [];\n let current: Run[] = [];\n for (const p of points) {\n if (p.y === null) {\n if (current.length) runs.push(current);\n current = [];\n continue;\n }\n current.push({ x: p.x, y: p.y });\n }\n if (current.length) runs.push(current);\n return runs;\n}\n\nexport function LineChart({\n series: seriesProp,\n height = 200,\n area = false,\n formatX: formatXProp,\n formatY: formatYProp,\n ariaLabel,\n width: fixedWidth,\n}: {\n series: Series[];\n /** Plot height in px, including the x-axis band. Fixed at every width. */\n height?: number;\n /** Fixed width in px (tests, print). Omit to fill the container. */\n width?: number;\n area?: boolean;\n formatX?: (x: number) => string;\n formatY?: (y: number) => string;\n ariaLabel: string;\n}) {\n const svgRef = useRef<SVGSVGElement>(null);\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth, FALLBACK_W);\n const textScale = useTextScale();\n /* Axis labels' estimated advance per character, at the size they render. */\n const axisLabelCh = labelCharPx(textScale);\n const [hoverX, setHoverX] = useState<number | null>(null);\n const [tooltipPos, setTooltipPos] = useState<{ left: number; top: number } | null>(null);\n\n const formatX = formatXProp ?? ((x: number) => String(x));\n const formatY = formatYProp ?? ((y: number) => String(y));\n /* On a time axis a 0 / NaN / pre-2000 x is a null timestamp that leaked\n through, not a moment: it would start the axis at \"Dec 31\" 1969. Such\n points are left out of the domain AND the drawing. */\n const keepX = xKeeper(seriesProp.flatMap((s) => s.points.map((p) => p.x)));\n const series = seriesProp.map((s) => ({ ...s, points: s.points.filter((p) => keepX(p.x)) }));\n const allX = series.flatMap((s) => s.points.map((p) => p.x));\n const knownY = series.flatMap((s) => s.points.map((p) => p.y)).filter((y): y is number => y !== null && Number.isFinite(y));\n if (allX.length === 0) {\n return (\n <div ref={wrapRef} className={styles.wrap}>\n <p>No data.</p>\n </div>\n );\n }\n const rawXMin = Math.min(...allX);\n const rawXMax = Math.max(...allX);\n const timeAxis = isTimeAxis(allX);\n // A burst of points seconds apart is widened to MIN_TIME_SPAN_MS around\n // itself instead of stretched edge to edge under identical labels.\n const [xMin, xMax] = timeAxis && rawXMax > rawXMin ? ensureSpan(rawXMin, rawXMax, MIN_TIME_SPAN_MS) : [rawXMin, rawXMax];\n const xRange = xMax - xMin || 1;\n\n // Nice ticks whose labels are exact: integer data get integer ticks, and a\n // caller's formatter never prints a rounded label on a precise tick.\n const yAxis = axisTicks(Math.min(0, ...knownY), Math.max(0, ...knownY), {\n count: TICKS_Y,\n integer: knownY.length > 0 && allIntegers(knownY),\n format: formatYProp,\n });\n const yTicks = yAxis.ticks;\n const yMin = yTicks[0]!;\n const yMax = yTicks[yTicks.length - 1]!;\n const yRange = yMax - yMin || 1;\n const plotH = height - PAD_T - PAD_B;\n const yScale = (y: number) => PAD_T + plotH - ((y - yMin) / yRange) * plotH;\n /* The y labels hang right-aligned 6 units left of the plot, and the svg\n clips at its edge: the gutter grows to fit the widest one (+2 of air) —\n 44 still fits five 12 px characters, a larger Display size fewer. */\n const padL = Math.max(PAD_L, Math.ceil(Math.max(0, ...yAxis.labels.map((l) => l.length)) * axisLabelCh) + 8);\n\n /* Decided before the x scale, because the reserved gutter is what plotW is\n measured against — and the gridlines and x-axis stop at the same edge.\n End labels are dodged vertically so two lines ending on one value never\n print their names over each other; if they cannot all fit, the legend\n (always present for 2+ series) names them instead. */\n const wantEndLabels = series.length >= 1 && series.length <= 4;\n const endLabelW = wantEndLabels\n ? Math.max(...series.map((s) => s.label.length)) * END_LABEL_CH * textScale\n : 0;\n const endPoints = series.flatMap((s) => {\n for (let i = s.points.length - 1; i >= 0; i--) {\n const y = s.points[i]!.y;\n if (y !== null && Number.isFinite(y)) return [{ key: s.id, y: yScale(y) }];\n }\n return [];\n });\n const dodged = wantEndLabels && endLabelW <= END_LABEL_MAX ? dodgeLabels(endPoints, END_LABEL_GAP_Y * textScale, PAD_T, PAD_T + plotH) : null;\n const showEndLabels = dodged !== null && endPoints.length > 0;\n const padR = PAD_R + (showEndLabels ? END_LABEL_GAP + endLabelW : 0);\n const showLegend = series.length >= 2;\n\n const plotW = Math.max(40, width - padL - padR);\n const xScale = (x: number) => padL + ((x - xMin) / xRange) * plotW;\n\n // Nearest-x lookup across a reference axis (the union of all distinct x\n // values, since series may not share every point).\n const xAxis = Array.from(new Set(allX)).sort((a, b) => a - b);\n\n /* First and last x labels, collision-free: the end outranks the start;\n on a time axis both walk one detail ladder (the caller's format → a\n shorter date/time; clock time only inside one day) until they fit. */\n const xEnds = xAxis.length > 1 ? [xAxis[0]!, xAxis[xAxis.length - 1]!] : [];\n const ladder = timeAxis ? timeLabelLadder(rawXMin, rawXMax, formatXProp, xEnds) : [formatX];\n const xLabels = layoutAxisLabels(\n xEnds.map((x, i) => {\n const px = xScale(x);\n const edge = i === 0 ? px <= padL + 0.5 : px >= width - padR - 0.5;\n return {\n key: i === 0 ? 'start' : 'end',\n x: px,\n anchor: edge ? (i === 0 ? 'start' as const : 'end' as const) : 'middle' as const,\n priority: i === 0 ? 2 : 3,\n variants: ladder.map((f) => f(x)),\n };\n }),\n { min: padL, max: width - padR, charPx: axisLabelCh },\n );\n\n function nearestX(clientX: number): number | null {\n const svg = svgRef.current;\n if (!svg) return null;\n const rect = svg.getBoundingClientRect();\n // rect.width equals `width` once measured; the ratio only matters while the\n // fallback width is still being drawn (or a CSS max-width squeezes it).\n const svgX = ((clientX - rect.left) / (rect.width || width)) * width;\n const dataX = xMin + ((svgX - padL) / plotW) * xRange;\n let nearest = xAxis[0];\n let best = Infinity;\n for (const x of xAxis) {\n const d = Math.abs(x - dataX);\n if (d < best) {\n best = d;\n nearest = x;\n }\n }\n return nearest;\n }\n\n function handleMove(e: React.PointerEvent<SVGSVGElement>) {\n const x = nearestX(e.clientX);\n if (x === null) return;\n setHoverX(x);\n const svg = svgRef.current;\n if (svg) {\n const rect = svg.getBoundingClientRect();\n const px = (xScale(x) / width) * (rect.width || width);\n setTooltipPos({ left: px, top: 0 });\n }\n }\n\n const hoverPoints =\n hoverX !== null\n ? series.map((s) => ({\n series: s,\n point: s.points.find((p) => p.x === hoverX) ?? null,\n }))\n : null;\n\n return (\n <div ref={wrapRef} className={styles.wrap}>\n <svg\n ref={svgRef}\n className={styles.svg}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={ariaLabel}\n onPointerMove={handleMove}\n onPointerLeave={() => setHoverX(null)}\n >\n {yTicks.map((t, i) => (\n <g key={i}>\n <line\n x1={padL}\n x2={width - padR}\n y1={yScale(t)}\n y2={yScale(t)}\n className={styles.gridline}\n stroke={CHART_GRID}\n />\n <text x={padL - 6} y={yScale(t)} dy=\"0.32em\" textAnchor=\"end\" className={styles.axisLabel}>\n {yAxis.labels[i]}\n </text>\n </g>\n ))}\n <line\n x1={padL}\n x2={width - padR}\n y1={height - PAD_B}\n y2={height - PAD_B}\n className={styles.axis}\n stroke={CHART_AXIS}\n />\n {xLabels.map((l) => (\n <text key={l.key} data-axis-label={l.key} x={l.x} y={height - 6} textAnchor={l.anchor} className={styles.axisLabel}>\n {l.text}\n </text>\n ))}\n\n {series.map((s, si) => {\n const color = seriesColor(si);\n const runs = splitRuns(s.points);\n return (\n <g key={s.id}>\n {area && series.length === 1\n ? runs.map((run, ri) => {\n const d =\n run.map((p, j) => `${j === 0 ? 'M' : 'L'}${xScale(p.x)},${yScale(p.y)}`).join(' ') +\n ` L${xScale(run[run.length - 1].x)},${yScale(yMin)} L${xScale(run[0].x)},${yScale(yMin)} Z`;\n return <path key={ri} d={d} fill={color} className={styles.area} />;\n })\n : null}\n {runs.map((run, ri) => (\n <path\n key={ri}\n d={run.map((p, j) => `${j === 0 ? 'M' : 'L'}${xScale(p.x)},${yScale(p.y)}`).join(' ')}\n stroke={color}\n className={styles.line}\n />\n ))}\n {showEndLabels && runs.length ? (\n (() => {\n const lastRun = runs[runs.length - 1];\n const last = lastRun[lastRun.length - 1];\n return (\n <text\n data-end-label={s.id}\n x={xScale(last.x) + END_LABEL_GAP}\n y={dodged?.get(s.id) ?? yScale(last.y)}\n dy=\"0.32em\"\n className={styles.endLabel}\n fill={color}\n >\n {s.label}\n </text>\n );\n })()\n ) : null}\n </g>\n );\n })}\n\n {hoverX !== null ? (\n <line\n x1={xScale(hoverX)}\n x2={xScale(hoverX)}\n y1={PAD_T}\n y2={height - PAD_B}\n className={styles.crosshairLine}\n />\n ) : null}\n {hoverX !== null\n ? series.map((s, si) => {\n const p = s.points.find((pt) => pt.x === hoverX);\n if (!p || p.y === null) return null;\n return (\n <circle\n key={s.id}\n cx={xScale(p.x)}\n cy={yScale(p.y)}\n r={4}\n fill={seriesColor(si)}\n className={styles.marker}\n />\n );\n })\n : null}\n\n <rect\n x={padL}\n y={PAD_T}\n width={plotW}\n height={plotH}\n className={styles.overlay}\n onFocus={() => setHoverX(xAxis[xAxis.length - 1] ?? null)}\n />\n </svg>\n {hoverPoints && tooltipPos ? (\n <div className={styles.tooltip} style={{ left: tooltipPos.left, top: tooltipPos.top }}>\n <div className={styles.tooltipDate}>{formatX(hoverX as number)}</div>\n {hoverPoints.map(({ series: s, point }, i) => (\n <div className={styles.tooltipRow} key={s.id}>\n <span className={styles.tooltipKey} style={{ background: seriesColor(i) }} aria-hidden=\"true\" />\n {point && point.y !== null ? (\n <>\n <span className={styles.tooltipValue}>{formatY(point.y)}</span>\n {showLegend ? <span>{s.label}</span> : null}\n </>\n ) : (\n <span className={styles.tooltipGap}>no data{showLegend ? ` — ${s.label}` : ''}</span>\n )}\n </div>\n ))}\n </div>\n ) : null}\n {showLegend ? (\n <Legend items={series.map((s, i) => ({ label: s.label, color: seriesColor(i), kind: 'line' }))} />\n ) : null}\n </div>\n );\n}\n",".svg {\n display: block;\n overflow: visible;\n}\n\n.bar {\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n\n.bar:hover,\n.bar:focus-visible {\n opacity: 0.82;\n}\n\n.baseline {\n stroke: var(--chart-axis);\n stroke-width: 1;\n}\n\n.gridline {\n stroke: var(--chart-grid);\n stroke-width: 1;\n}\n\n.axisLabel {\n font-size: 10px;\n fill: var(--text-tertiary);\n font-family: var(--font-ui);\n}\n\n.valueLabel {\n font-size: 10px;\n fill: var(--text-secondary);\n font-family: var(--font-ui);\n font-variant-numeric: tabular-nums;\n}\n\n.categoryLabel {\n font-size: 10px;\n fill: var(--text-secondary);\n font-family: var(--font-ui);\n}\n\n.hitArea {\n fill: transparent;\n cursor: pointer;\n}\n\n.tooltip {\n position: absolute;\n pointer-events: none;\n background: var(--chart-tooltip-bg);\n border: 1px solid var(--chart-tooltip-border);\n border-radius: var(--radius-sm);\n box-shadow: var(--shadow-md);\n padding: var(--space-1) var(--space-2);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n white-space: nowrap;\n z-index: var(--z-dropdown);\n}\n\n.tooltipValue {\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n}\n\n.tooltipLabel {\n color: var(--text-tertiary);\n margin-left: var(--space-1);\n}\n\n.wrap {\n position: relative;\n}\n","/**\n * components/charts/BarChart.tsx — categorical magnitude comparison.\n * Single hue by default (nominal categories never get a value-ramp — see\n * dataviz anti-patterns \"a value-ramp on nominal categories\"). Vertical for\n * a handful of short-named categories, horizontal for many or long-named\n * ones (dataviz choosing-a-form.md). Null values render as an explicit\n * \"no data\" dash, never a silent zero-height bar indistinguishable from a\n * real zero.\n */\nimport { useId, useRef, useState } from 'react';\nimport type { CategoricalDatum } from './types.js';\nimport { CHART_SEQUENTIAL, CHART_AXIS, CHART_GRID } from './colors.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport './chart-tokens.css';\nimport styles from './BarChart.module.css';\n\nconst BAR_MAX = 24;\nconst GAP = 10;\n\nexport function BarChart({\n data,\n height = 160,\n orientation = 'vertical',\n color = CHART_SEQUENTIAL,\n formatValue = (v: number) => String(v),\n ariaLabel,\n width: fixedWidth,\n}: {\n data: CategoricalDatum[];\n height?: number;\n orientation?: 'vertical' | 'horizontal';\n /** Horizontal only: fixed width in px (tests, print). Omit to fill the container. */\n width?: number;\n color?: string;\n formatValue?: (v: number) => string;\n ariaLabel: string;\n}) {\n const uid = useId();\n const wrapRef = useRef<HTMLDivElement>(null);\n // Horizontal bars take the container's measured width (fallback: the old\n // fixed 588 px). A fixed-width svg under the global `svg { max-width: 100% }`\n // was scaled DOWN in a narrower card, shrinking its 10 px labels with it.\n const measuredW = useChartWidth(wrapRef, fixedWidth, 588);\n const [hover, setHover] = useState<number | null>(null);\n\n const known = data.map((d) => d.value).filter((v): v is number => v !== null);\n const maxVal = Math.max(0, ...known, 0.0001);\n const minVal = Math.min(0, ...known);\n const range = maxVal - minVal || 1;\n\n if (orientation === 'horizontal') {\n const LABEL_W = 120;\n const PAD_R = 48;\n const rowH = Math.min(BAR_MAX, Math.max(14, Math.floor((height - GAP) / data.length) - GAP));\n const svgH = data.length * (rowH + GAP) + GAP;\n const svgW = measuredW;\n const plotW = Math.max(40, svgW - LABEL_W - PAD_R);\n\n return (\n <div ref={wrapRef} className={styles.wrap}>\n <svg\n className={styles.svg}\n width={svgW}\n height={svgH}\n viewBox={`0 0 ${svgW} ${svgH}`}\n role=\"img\"\n aria-label={ariaLabel}\n >\n <line x1={LABEL_W} y1={0} x2={LABEL_W} y2={svgH} className={styles.baseline} stroke={CHART_AXIS} />\n {data.map((d, i) => {\n const y = GAP + i * (rowH + GAP);\n const barW = d.value !== null ? ((d.value - minVal) / range) * plotW : 0;\n return (\n <g key={d.label + i}>\n <text\n x={LABEL_W - 8}\n y={y + rowH / 2}\n dy=\"0.32em\"\n textAnchor=\"end\"\n className={styles.categoryLabel}\n >\n {d.label.length > 22 ? `${d.label.slice(0, 21)}…` : d.label}\n </text>\n {d.value === null ? (\n <line\n x1={LABEL_W + 4}\n y1={y + rowH / 2}\n x2={LABEL_W + 14}\n y2={y + rowH / 2}\n stroke={CHART_GRID}\n strokeWidth={2}\n strokeDasharray=\"2 2\"\n />\n ) : (\n <>\n <rect\n x={LABEL_W}\n y={y}\n width={Math.max(2, barW)}\n height={rowH}\n rx={4}\n fill={color}\n className={styles.bar}\n />\n <text\n x={LABEL_W + Math.max(2, barW) + 6}\n y={y + rowH / 2}\n dy=\"0.32em\"\n className={styles.valueLabel}\n >\n {formatValue(d.value)}\n </text>\n </>\n )}\n <rect\n className={styles.hitArea}\n x={0}\n y={y - GAP / 2}\n width={svgW}\n height={rowH + GAP}\n tabIndex={0}\n role=\"img\"\n aria-label={`${d.label}: ${d.value === null ? 'no data' : formatValue(d.value)}`}\n onPointerEnter={() => setHover(i)}\n onPointerLeave={() => setHover((h) => (h === i ? null : h))}\n onFocus={() => setHover(i)}\n onBlur={() => setHover((h) => (h === i ? null : h))}\n />\n </g>\n );\n })}\n </svg>\n {hover !== null ? (\n <div\n className={styles.tooltip}\n style={{ left: LABEL_W + 8, top: GAP + hover * (rowH + GAP) - 4 }}\n >\n <span className={styles.tooltipValue}>\n {data[hover].value === null ? 'no data' : formatValue(data[hover].value as number)}\n </span>\n <span className={styles.tooltipLabel}>{data[hover].label}</span>\n </div>\n ) : null}\n </div>\n );\n }\n\n // Vertical orientation.\n const barSlot = data.length ? Math.max(BAR_MAX, 0) : BAR_MAX;\n const barW = Math.min(BAR_MAX, barSlot);\n const PAD_T = 20;\n const PAD_B = 30;\n const plotH = height;\n const svgH = plotH + PAD_T + PAD_B;\n const svgW = data.length * (barW + GAP) + GAP;\n const zeroY = PAD_T + plotH - ((0 - minVal) / range) * plotH;\n\n return (\n <div className={styles.wrap}>\n <svg\n className={styles.svg}\n width={svgW}\n height={svgH}\n viewBox={`0 0 ${svgW} ${svgH}`}\n role=\"img\"\n aria-label={ariaLabel}\n >\n <line x1={0} y1={zeroY} x2={svgW} y2={zeroY} className={styles.baseline} stroke={CHART_AXIS} />\n {data.map((d, i) => {\n const x = GAP + i * (barW + GAP);\n const barH = d.value !== null ? (Math.abs(d.value - minVal) / range) * plotH : 0;\n const top = d.value !== null && d.value >= 0 ? zeroY - barH : zeroY;\n return (\n <g key={d.label + i}>\n {d.value === null ? (\n <line\n x1={x + barW / 2 - 5}\n y1={zeroY}\n x2={x + barW / 2 + 5}\n y2={zeroY}\n stroke={CHART_GRID}\n strokeWidth={2}\n strokeDasharray=\"2 2\"\n />\n ) : (\n <>\n <rect\n x={x}\n y={top}\n width={barW}\n height={Math.max(2, barH)}\n rx={4}\n fill={color}\n className={styles.bar}\n />\n <text x={x + barW / 2} y={top - 4} textAnchor=\"middle\" className={styles.valueLabel}>\n {formatValue(d.value)}\n </text>\n </>\n )}\n <text\n x={x + barW / 2}\n y={svgH - 8}\n textAnchor=\"middle\"\n className={styles.axisLabel}\n >\n {d.label.length > 10 ? `${d.label.slice(0, 9)}…` : d.label}\n </text>\n <rect\n className={styles.hitArea}\n x={x - GAP / 2}\n y={0}\n width={barW + GAP}\n height={svgH}\n tabIndex={0}\n role=\"img\"\n aria-label={`${d.label}: ${d.value === null ? 'no data' : formatValue(d.value)}`}\n onPointerEnter={() => setHover(i)}\n onPointerLeave={() => setHover((h) => (h === i ? null : h))}\n onFocus={() => setHover(i)}\n onBlur={() => setHover((h) => (h === i ? null : h))}\n />\n </g>\n );\n })}\n </svg>\n {hover !== null ? (\n <div\n className={styles.tooltip}\n style={{ left: GAP + hover * (barW + GAP), top: 0 }}\n id={`${uid}-tooltip`}\n >\n <span className={styles.tooltipValue}>\n {data[hover].value === null ? 'no data' : formatValue(data[hover].value as number)}\n </span>\n <span className={styles.tooltipLabel}>{data[hover].label}</span>\n </div>\n ) : null}\n </div>\n );\n}\n","/**\n * components/charts/BurnDown.tsx — a quota window burning down to its reset:\n * remaining capacity over time (solid line + wash), the even-pace reference\n * from full at window start to empty at reset (thin dashed), a projection\n * from the recent slope (dashed), an optional reserve line (the headroom kept\n * for interactive use) and the reset marker.\n *\n * The verdict is written in words under the plot — \"At this pace: reserve\n * reached 14:20, 3h 40m before reset\" — so the chart's point never depends on\n * reading slopes. With fewer than two readings it says it cannot project,\n * rather than drawing a guess — and with no plausible reset (0 / NaN /\n * pre-2000) it draws neither pace nor projection and says the reset is\n * unknown, rather than projecting to an invented one.\n */\nimport { useRef } from 'react';\nimport { CHART_SEQUENTIAL, toneColor } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport {\n MIN_TIME_SPAN_MS,\n areaPath,\n axisTicks,\n ensureSpan,\n isPlausibleTime,\n labelCharPx,\n layoutAxisLabels,\n linePath,\n linearScale,\n projectBurnDown,\n splitRuns,\n tickGutter,\n type BurnPoint,\n} from './chart-math.js';\nimport { formatCompact, timeLabelLadder } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.js';\nimport plot from './plot.module.css';\n\nexport interface BurnDownProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n points: BurnPoint[];\n /** Full capacity of the window (e.g. 100 for percent). */\n capacity: number;\n /** Window start and reset, epoch ms. */\n start: number;\n resetAt: number;\n now: number;\n /** Capacity to keep in reserve (same units as `remaining`). */\n reserve?: { value: number; label: string };\n height?: number;\n width?: number;\n formatValue?: (v: number) => string;\n formatTime?: (ms: number) => string;\n ariaLabel?: string;\n}\n\nconst PAD_T = 16;\nconst PAD_B = 26;\nconst PAD_R = 14;\n\nfunction defaultFormatTime(ms: number): string {\n const d = new Date(ms);\n return Number.isNaN(d.getTime()) ? '' : d.toLocaleString('en-US', { weekday: 'short', hour: 'numeric', minute: '2-digit' });\n}\n\nexport function formatLead(ms: number): string {\n const m = Math.max(0, Math.round(ms / 60_000));\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 48) return m % 60 ? `${h}h ${m % 60}m` : `${h}h`;\n return `${Math.round(h / 24)}d`;\n}\n\n/**\n * The verdict in words. `resetAt` null (or non-finite) is an UNKNOWN reset:\n * what the window has already crossed is still said, but nothing is\n * projected — \"about 40% left at reset\" needs a reset (V3.10.1 review: an\n * epoch-0 reset printed a green verdict for a seat burning 10%/h, and a NaN\n * one printed \"about NaN% left at reset\").\n */\nexport function burnVerdict(\n projection: ReturnType<typeof projectBurnDown>,\n resetAt: number | null,\n formatValue: (v: number) => string,\n formatTime: (ms: number) => string,\n reserveLabel?: string,\n): { text: string; severity: 'ok' | 'warn' | 'danger' | 'unknown' } {\n const reset = resetAt !== null && Number.isFinite(resetAt) ? resetAt : null;\n // Already past a line: say where it IS, not a \"projection\" to a moment\n // that has passed (a used-up seat is not \"running out at 3:02\").\n if (projection.from && projection.from.remaining <= 0) {\n return { text: reset === null ? 'Used up — reset time unknown.' : `Used up — resets ${formatTime(reset)}.`, severity: 'danger' };\n }\n if (projection.from && reserveLabel !== undefined && projection.reserveAt !== null && projection.reserveAt <= projection.from.t) {\n const until = reset === null ? 'until it resets (reset time unknown)' : `until ${formatTime(reset)}`;\n return { text: `Inside ${reserveLabel.toLowerCase()} — autonomy has stopped using this window ${until}.`, severity: 'warn' };\n }\n if (reset === null) return { text: 'Reset time unknown — not projecting this window.', severity: 'unknown' };\n if (projection.slopePerMs === null) return { text: 'Not enough readings to project this window yet.', severity: 'unknown' };\n if (projection.exhaustAt !== null) {\n return {\n text: `At this pace: runs out ${formatTime(projection.exhaustAt)}, ${formatLead(reset - projection.exhaustAt)} before reset.`,\n severity: 'danger',\n };\n }\n if (projection.reserveAt !== null) {\n return {\n text: `At this pace: ${reserveLabel ?? 'reserve'} reached ${formatTime(projection.reserveAt)}, ${formatLead(reset - projection.reserveAt)} before reset.`,\n severity: 'warn',\n };\n }\n return {\n text: `At this pace: about ${formatValue(projection.remainingAtReset ?? 0)} left at reset.`,\n severity: 'ok',\n };\n}\n\nexport function BurnDown({\n title,\n description,\n caveat,\n status,\n points,\n capacity,\n start,\n resetAt,\n now,\n reserve,\n height = 200,\n width: fixedWidth,\n formatValue: formatValueProp,\n formatTime: formatTimeProp,\n ariaLabel,\n}: BurnDownProps) {\n const formatValue = formatValueProp ?? formatCompact;\n const formatTime = formatTimeProp ?? defaultFormatTime;\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n // A reading stamped 0 / NaN / pre-2000 is a null timestamp that leaked\n // through: it is not on this window's time axis, and it would drag both\n // the axis and the projection's slope back to 1970.\n const sorted = points.filter((p) => isPlausibleTime(p.t)).sort((a, b) => a.t - b.t);\n const anyKnown = sorted.some((p) => p.remaining !== null);\n const resolvedStatus: ChartStatus = status ?? (sorted.length === 0 ? { kind: 'empty', message: 'No readings in this window yet.' } : anyKnown ? { kind: 'ready' } : { kind: 'unknown' });\n\n // A reset of 0 / NaN / pre-2000 is a null that leaked through (an epoch-0\n // machine reset parses as a finite 0). It is UNKNOWN, not a moment: the\n // axis ends at the latest reading or now with no \"Resets\" on it, no even\n // pace or projection is drawn toward it, and the verdict says the reset is\n // unknown instead of inventing one (V3.10.1 review).\n const resetKnown = isPlausibleTime(resetAt);\n const reset = resetKnown ? resetAt : null;\n const projection = projectBurnDown(sorted, reset, { reserve: reserve?.value ?? null });\n const verdict = burnVerdict(projection, reset, formatValue, formatTime, reserve?.label);\n\n // Always 0 → capacity (100 for percent seats), so sibling cards share one\n // scale; widened only if a reading overshoots, never clipped.\n const known = sorted.flatMap((p) => (p.remaining !== null && Number.isFinite(p.remaining) ? [p.remaining] : []));\n const yAxis = axisTicks(0, Math.max(capacity, ...known, 1), {\n count: 4,\n integer: Number.isInteger(capacity) && known.every((v) => Number.isInteger(v)),\n format: formatValueProp,\n });\n const ticks = yAxis.ticks;\n const top = ticks[ticks.length - 1]!;\n const padL = tickGutter(yAxis.labels, 28, 56, textScale);\n const plotW = Math.max(40, width - padL - PAD_R);\n const plotH = height - PAD_T - PAD_B;\n // The window runs start → reset. An implausible bound (0 / NaN) falls back\n // to the readings; a degenerate one widens to MIN_TIME_SPAN_MS, keeping the\n // right edge where it is.\n const lastT = sorted.length ? sorted[sorted.length - 1]!.t : now;\n const rawEnd = reset ?? Math.max(now, lastT);\n const rawStart = isPlausibleTime(start) ? start : sorted[0]?.t ?? rawEnd;\n const [x0, xEnd] = ensureSpan(rawStart, rawEnd, MIN_TIME_SPAN_MS, 'end');\n const xs = linearScale(x0, xEnd, padL, padL + plotW);\n const ys = linearScale(0, top, PAD_T + plotH, PAD_T);\n const clampX = (t: number) => Math.min(xEnd, Math.max(x0, t));\n\n // x labels: the reset marker outranks the window start. Both walk the same\n // detail ladder (the caller's format → \"Fri 11:46 PM\" → \"Sep 18\"; clock\n // time only inside one day) until they fit side by side; if even the\n // shortest pair collides, the start is dropped rather than overprinted.\n // Widths are budgeted at the operator's Display size. With no known reset\n // the right edge is only the latest reading / now, and says just its time.\n const ladder = timeLabelLadder(x0, xEnd, formatTimeProp ?? defaultFormatTime, [x0, xEnd]);\n const xLabels = layoutAxisLabels(\n [\n { key: 'start', x: padL, anchor: 'start', priority: 2, variants: ladder.map((f) => f(x0)) },\n resetKnown\n ? { key: 'reset', x: padL + plotW, anchor: 'end', priority: 3, variants: ladder.map((f) => `Resets ${f(xEnd)}`) }\n : { key: 'end', x: padL + plotW, anchor: 'end', priority: 3, variants: ladder.map((f) => f(xEnd)) },\n ],\n { min: padL, max: padL + plotW, charPx: labelCharPx(textScale) },\n );\n\n const runs = splitRuns(sorted.map((p) => ({ x: clampX(p.t), y: p.remaining })))\n .map((run) => run.map((p) => ({ x: xs(p.x), y: ys(Math.max(0, p.y)) })));\n\n let projectionPath = '';\n if (reset !== null && projection.from && projection.slopePerMs !== null) {\n const endT = projection.exhaustAt ?? reset;\n const endR = projection.exhaustAt !== null ? 0 : projection.remainingAtReset ?? projection.from.remaining;\n if (endT > projection.from.t) {\n projectionPath = linePath([\n { x: xs(clampX(projection.from.t)), y: ys(projection.from.remaining) },\n { x: xs(clampX(endT)), y: ys(Math.max(0, endR)) },\n ]);\n }\n }\n const projectionColor = verdict.severity === 'danger' ? toneColor('danger') : verdict.severity === 'warn' ? toneColor('warning') : 'var(--text-tertiary)';\n\n const summary = ariaLabel ?? `${title}: ${projection.from ? `${formatValue(projection.from.remaining)} of ${formatValue(capacity)} left at ${formatTime(projection.from.t)}` : 'no readings'}; ${reset === null ? 'reset time unknown' : `resets ${formatTime(reset)}`}. ${verdict.text}`;\n\n const columns: TableColumn<BurnPoint>[] = [\n { key: 't', label: 'When', render: (p) => formatTime(p.t) },\n { key: 'r', label: 'Remaining', numeric: true, render: (p) => (p.remaining === null ? '—' : formatValue(p.remaining)) },\n ];\n\n const legendItems = [\n { label: 'Remaining', color: CHART_SEQUENTIAL, kind: 'line' as const },\n // Even pace runs from full at the window's start to empty AT RESET: with\n // no reset there is no pace to draw.\n ...(resetKnown ? [{ label: 'Even pace', color: 'var(--text-tertiary)', kind: 'line' as const }] : []),\n ...(projectionPath ? [{ label: 'Projection', color: projectionColor, kind: 'line' as const }] : []),\n ];\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={sorted} rowKey={(p) => String(p.t)} />}\n footer={\n <>\n <p className={plot.note} data-severity={verdict.severity} role=\"status\">{verdict.text}</p>\n <ChartLegend items={legendItems} />\n </>\n }\n >\n <div ref={wrapRef} className={plot.plotWrap}>\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n {ticks.map((t, i) => (\n <g key={t}>\n <line className={plot.grid} x1={padL} x2={padL + plotW} y1={ys(t)} y2={ys(t)} />\n <text className={plot.tick} x={padL - 6} y={ys(t)} dy=\"0.32em\" textAnchor=\"end\">{yAxis.labels[i]}</text>\n </g>\n ))}\n <line className={plot.axis} x1={padL} x2={padL + plotW} y1={ys(0)} y2={ys(0)} />\n {xLabels.map((l) => (\n <text key={l.key} data-axis-label={l.key} className={plot.tick} x={l.x} y={height - 8} textAnchor={l.anchor}>{l.text}</text>\n ))}\n\n {resetKnown ? (\n <path data-role=\"pace\" className={plot.reference} d={linePath([{ x: xs(x0), y: ys(capacity) }, { x: xs(xEnd), y: ys(0) }])} />\n ) : null}\n {reserve ? (\n <g data-role=\"reserve\">\n <line className={plot.reference} x1={padL} x2={padL + plotW} y1={ys(reserve.value)} y2={ys(reserve.value)} />\n {/* Above-left of the line, over a surface halo (SPEC-310C §6): the\n window's start is the one place the remaining line is always\n high, and the projection only ever runs to the right, so the\n label never sits on the data. */}\n <text data-role=\"reserve-label\" className={`${plot.tick} ${plot.halo}`} x={padL + 4} y={ys(reserve.value) - 5} textAnchor=\"start\">\n {reserve.label} · {formatValue(reserve.value)}\n </text>\n </g>\n ) : null}\n {now > x0 && now < xEnd ? (\n <line className={plot.crosshair} x1={xs(now)} x2={xs(now)} y1={PAD_T} y2={PAD_T + plotH} />\n ) : null}\n {runs.map((run, i) => (\n <g key={i} data-role=\"remaining\">\n <path className={plot.wash} fill={CHART_SEQUENTIAL} d={areaPath(run, run.map((p) => ({ x: p.x, y: ys(0) })))} />\n <path className={plot.line} stroke={CHART_SEQUENTIAL} d={linePath(run)} />\n </g>\n ))}\n {projectionPath ? (\n <path data-role=\"projection\" className={plot.projection} stroke={projectionColor} d={projectionPath} />\n ) : null}\n {projection.from ? (\n <circle className={plot.marker} cx={xs(clampX(projection.from.t))} cy={ys(projection.from.remaining)} r={4} fill={CHART_SEQUENTIAL} />\n ) : null}\n </svg>\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- ._figure_1si9v_1{border:1px solid var(--border-subtle);border-radius:var(--radius-lg);background:var(--bg-surface);padding:var(--space-4);margin:0}._caption_1si9v_12{justify-content:space-between;align-items:baseline;gap:var(--space-3);margin-bottom:var(--space-3);display:flex}._title_1si9v_20{font-size:var(--text-sm-size);font-weight:var(--font-weight-semibold);color:var(--text-primary)}._description_1si9v_26{font-size:var(--text-xs-size);color:var(--text-tertiary)}._plot_1si9v_31{width:100%;overflow-x:auto}._tableDisclosure_1si9v_36{margin-top:var(--space-3);border-top:1px solid var(--border-subtle);padding-top:var(--space-2)}._tableDisclosure_1si9v_36>summary{cursor:pointer;font-size:var(--text-xs-size);color:var(--text-secondary);list-style:none}._tableDisclosure_1si9v_36>summary::-webkit-details-marker{display:none}._tableDisclosure_1si9v_36>summary:before{content:"▸ "}._tableDisclosure_1si9v_36[open]>summary:before{content:"▾ "}._tableBody_1si9v_61{margin-top:var(--space-2)}._caveat_1si9v_65{margin:0 0 var(--space-3);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);background:var(--status-unknown-bg);color:var(--status-unknown-fg);font-size:var(--text-xs-size);line-height:var(--text-sm-line)}._empty_1si9v_75{color:var(--text-tertiary);font-size:var(--text-sm-size);padding:var(--space-6) 0;text-align:center}._legend_4pgvn_1{gap:var(--space-1) var(--space-4);margin:var(--space-2) 0 0;flex-wrap:wrap;padding:0;list-style:none;display:flex}._item_4pgvn_10{align-items:center;gap:var(--space-2);font-size:var(--text-xs-size);color:var(--text-secondary);display:inline-flex}._swatch_4pgvn_18{border-radius:var(--radius-full);flex:none;width:10px;height:10px}._swatchLine_4pgvn_25{border-radius:var(--radius-full);flex:none;width:14px;height:2px}._svg_1jc17_5{max-width:100%;display:block}._gridline_1jc17_10{stroke:var(--chart-grid);stroke-width:1px}._axis_1jc17_15{stroke:var(--chart-axis);stroke-width:1px}._axisLabel_1jc17_20{font-size:var(--text-xs-size);fill:var(--text-tertiary);font-family:var(--font-ui)}._line_1jc17_26{fill:none;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}._area_1jc17_33{opacity:.1;stroke:none}._marker_1jc17_38{stroke:var(--chart-surface);stroke-width:2px}._endLabel_1jc17_43{font-size:var(--text-xs-size);font-family:var(--font-ui);font-weight:var(--font-weight-medium)}._crosshairLine_1jc17_49{stroke:var(--chart-axis);stroke-width:1px;pointer-events:none}._overlay_1jc17_55{fill:#0000;cursor:crosshair}._wrap_1jc17_60{width:100%;min-width:0;position:relative}._tooltip_1jc17_66{pointer-events:none;background:var(--chart-tooltip-bg);border:1px solid var(--chart-tooltip-border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);padding:var(--space-2);font-size:var(--text-xs-size);color:var(--text-primary);white-space:nowrap;z-index:var(--z-dropdown);margin-top:-10px;position:absolute;transform:translate(-50%,-100%)}._tooltipDate_1jc17_82{color:var(--text-tertiary);margin-bottom:var(--space-1)}._tooltipRow_1jc17_87{align-items:center;gap:var(--space-1);display:flex}._tooltipKey_1jc17_93{flex:none;width:12px;height:2px}._tooltipValue_1jc17_99{font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}._tooltipGap_1jc17_104{color:var(--text-tertiary);font-style:italic}._svg_o4jfa_1{display:block;overflow:visible}._bar_o4jfa_6{transition:opacity var(--duration-fast) var(--ease-standard)}._bar_o4jfa_6:hover,._bar_o4jfa_6:focus-visible{opacity:.82}._baseline_o4jfa_15{stroke:var(--chart-axis);stroke-width:1px}._gridline_o4jfa_20{stroke:var(--chart-grid);stroke-width:1px}._axisLabel_o4jfa_25{fill:var(--text-tertiary);font-size:10px;font-family:var(--font-ui)}._valueLabel_o4jfa_31{fill:var(--text-secondary);font-size:10px;font-family:var(--font-ui);font-variant-numeric:tabular-nums}._categoryLabel_o4jfa_38{fill:var(--text-secondary);font-size:10px;font-family:var(--font-ui)}._hitArea_o4jfa_44{fill:#0000;cursor:pointer}._tooltip_o4jfa_49{pointer-events:none;background:var(--chart-tooltip-bg);border:1px solid var(--chart-tooltip-border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);padding:var(--space-1) var(--space-2);font-size:var(--text-xs-size);color:var(--text-primary);white-space:nowrap;z-index:var(--z-dropdown);position:absolute}._tooltipValue_o4jfa_63{font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}._tooltipLabel_o4jfa_68{color:var(--text-tertiary);margin-left:var(--space-1)}._wrap_o4jfa_73{position:relative}
@@ -1,2 +0,0 @@
1
- import{o as e}from"./index-QesfXBsb.js";import{D as t}from"./VerseConsoleApp-BCY5uSok.js";import{b as n,y as r}from"./format-Dk4Fmxax.js";import{v as i}from"./context-model-DV1zCfAm.js";import{a,i as o,n as s}from"./types-D5XOdyw8.js";e(((e,t)=>{t.exports={}}))();var c=`[REDACTED]`;function l(e){if(/^[0-9a-fA-F]{40}$/.test(e))return e;let t=e.replace(/^\+/,``).replace(/=+$/,``);return/^(.)\1{39,}$/.test(t)?e:c}var ee=/\d{6,12}:[A-Za-z0-9_-]{33,35}(?![A-Za-z0-9_-])/g;function u(e,t,n){let r=e=>e<0||!/[A-Za-z0-9_]/.test(n[e]);return r(t-1)||n.slice(t-3,t)===`bot`&&r(t-4)?c:e}var d=/(https?:\/\/(?:hooks\.slack\.com\/(?:services|workflows|triggers)|(?:ptb\.|canary\.)?discord(?:app)?\.com\/api\/webhooks)\/)[A-Za-z0-9_/-]{8,}/gi,f=/(?<![A-Za-z0-9_-])xai-[A-Za-z0-9]{20,}/g,p=String.raw`\s*[=:]\s*["']?[^\s,;'"]{8,}["']?`,m=new RegExp(String.raw`(?<![A-Za-z0-9_$])([A-Z][A-Z0-9_]*_(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|PWD|CREDENTIALS?|AUTH|DSN))`+p,`g`),h=new RegExp(String.raw`(?<![A-Za-z0-9_$])([a-z][a-z0-9_]*_(?:api_key|token|secret|password|passwd|pwd|credentials?|private_key|access_key|secret_key|signing_key))`+p,`g`),g=/_(?:api_key|token|secret|password|passwd|pwd|credentials?|private_key|access_key|secret_key|signing_key)\s*[=:]/,_=/(?:Token|Secret|Password|Passwd|ApiKey|PrivateKey|AccessKey|SecretKey|SigningKey|Credentials?)\s*[=:]/,v=new RegExp(String.raw`(?<![A-Za-z0-9_$])([a-z][A-Za-z0-9]*(?:Token|Secret|Password|Passwd|ApiKey|PrivateKey|AccessKey|SecretKey|SigningKey|Credentials?))`+p,`g`),te=/(\\?["'])([A-Za-z0-9_.-]*(?:api[_-]?key|token|secret|password|passwd|pwd|credentials?|private[_-]?key|access[_-]?key|secret[_-]?key|signing[_-]?key|auth|connection[_-]?string))\1(\s*:\s*)(\\?["'])([^"'\s\\]{8,})\4/gi;function y(e){let t=e.replace(/^["']|["']$/g,``);return/^[A-Za-z_$][\w$]*(?:\??\.[A-Za-z_$][\w$]*)+[)\]]*$/.test(t)||/^[A-Za-z_$][\w$.]*\(/.test(t)||/^(?:\$\{|\$[A-Za-z_]|`|<)/.test(t)}function ne(e){let t=e.replace(/^["']|["']$/g,``);return!/\d/.test(t)&&/^[A-Za-z_$][A-Za-z_$.<>[\]|&?!()]*$/.test(t)}function b(e){return e.replace(/^["']|["']$/g,``)===c}function x(e,t,n,r){return b(n)||y(n)||r&&ne(n)?t:`${e}=${c}`}function S(e,t){return e.slice(t.length).replace(/^\s*[=:]\s*/,``)}function C(e){try{let t=e.replace(/-----BEGIN[ A-Z]*PRIVATE KEY-----[\s\S]*?-----END[ A-Z]*PRIVATE KEY-----/g,c).replace(/-----BEGIN[ A-Z]*PRIVATE KEY-----[^\n]*/g,c).replace(ee,u).replace(d,`$1[REDACTED]`).replace(f,c).replace(/\bsk-[A-Za-z0-9_-]{16,}/g,c).replace(/\bgh[poursa]_[A-Za-z0-9]{16,}/g,c).replace(/\bgithub_pat_[A-Za-z0-9_]{22,}/g,c).replace(/\b(Bearer|Token|Authorization)\s+[A-Za-z0-9\-._~+/]+=*/gi,`$1 [REDACTED]`).replace(/\b(api[_-]?key|api[_-]?token|secret|secret[_-]?key|token|password|passwd|pwd|auth|credential|client[_-]?secret|private[_-]?key|access[_-]?token|auth[_-]?token|refresh[_-]?token|id[_-]?token|session[_-]?token|connection[_-]?string|conn[_-]?str|_?auth[_-]?token|ASHLR_[A-Z_]+)\s*[=:]\s*["']?[^\s,;'"]{8,}["']?/gi,`$1=[REDACTED]`).replace(/\bxox[baprs]-[A-Za-z0-9-]{10,}/gi,c).replace(/\bAKIA[0-9A-Z]{16}\b/g,c).replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,c).replace(/\b[0-9a-fA-F]{64,}\b/g,c).replace(/\bglpat-[A-Za-z0-9_-]{16,}/g,c).replace(/\bhf_[A-Za-z0-9]{16,}\b/g,c).replace(/\bnpm_[A-Za-z0-9]{16,}\b/g,c).replace(/\bAIza[0-9A-Za-z_-]{35}\b/g,c).replace(/(:\/\/[^:\s/@]*:)[^@\s]+(@)/g,`$1[REDACTED]$2`).replace(/(?<![/\w])[A-Za-z0-9+]{40,}={0,2}(?![/\w])/g,l).replace(m,(e,t)=>x(t,e,S(e,t),!1));return g.test(t)&&(t=t.replace(h,(e,t)=>x(t,e,S(e,t),!0))),_.test(t)&&(t=t.replace(v,(e,t)=>x(t,e,S(e,t),!0))),t.replace(te,(e,t,n,r,i,a)=>b(a)||y(a)?e:`${t}${n}${t}${r}${i}${c}${i}`)}catch{return e}}function w(e,t){return r(C(e),t)}var T=a.selfImprove.repo,E=/^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/,D=/^[A-Za-z0-9._/+-]{1,200}$/;function O(e){return!D.test(e)||e.startsWith(`-`)||e.startsWith(`/`)||e.endsWith(`/`)||e.endsWith(`.`)||e.endsWith(`.lock`)?!1:!e.includes(`..`)&&!e.includes(`//`)}function k(e,t){if(typeof e!=`string`||e.length>2048)return null;try{let n=new URL(e);return n.protocol===`https:`&&n.hostname===t?n.toString():null}catch{return null}}function A(e){if(!Number.isFinite(e))return`—`;let t=Math.abs(e)<.005?0:e,n=Number.isInteger(t)?String(Math.abs(t)):Math.abs(t).toFixed(2);return`${t<0?`−`:``}$${n}`}function j(e){let n=e.creditsTotalUsd,r=e.estimatedRemainingUsd,i=e.budget.selfImprove.reserveUsd,a=n>0?n:null,o=a===null?null:(n-Math.max(0,r))/n*100,s=r<=0?`danger`:r<i?`warning`:`accent`,c=r<=0?`The estimate says the credits are spent. Check the real balance on claude.ai and adjust the budget.`:r<i?`Under the ${A(i)} reserve, so Verse stops launching self-improvement tasks.`:null;return{value:Math.max(0,r),max:a,text:`${A(Math.max(0,r))} of ${A(n)} · estimate`,usedText:o===null?`no credit total set`:`${t(o)} used`,tone:s,warning:c}}function M(e){let t=new Date(e);return t.setHours(24,0,0,0),t.getTime()}function N(e,t=Date.now()){let r=n(new Date(M(t)).toISOString(),t),i=e.running===1?`1 running`:`${e.running} running`;return`${e.sessionsToday} of ${e.budget.maxSessionsPerDay} sessions today · ${i}${r?` · resets ${r}`:``}`}function P(e){let t=e.budget.selfImprove;return t.enabled?`${e.selfImproveToday} of ${t.maxPerDay} self-improvement launches today, on ${t.repo}. Stops under a ${A(t.reserveUsd)} estimated balance.`:`Self-improvement is off. Verse launches cloud tasks only when you ask.`}function F(e,t){return e.ok?null:e.reason?w(e.reason):t}var I=`The Claude seat isn't set up on this Mac.`;function L(e){return e.ready?null:e.reason?w(e.reason):I}var R=`Not set up`;function z(e){return`~$${Number.isFinite(e)?Math.max(0,Math.round(e)):0} credits`}function re(e){return`Cloud: not set up · ${z(e)}`}function B(e,t){return L(e)??F(t.canLaunch,`The cloud budget does not allow another launch right now.`)}var V={queued:`Queued`,launching:`Launching`,running:`Running`,"pr-open":`PR open`,merged:`Merged`,closed:`Closed`,failed:`Failed`,expired:`Expired`},H={queued:`info`,launching:`info`,running:`running`,"pr-open":`warning`,merged:`success`,closed:`neutral`,failed:`danger`,expired:`unknown`};function U(e){return e.state===`pr-open`&&!e.pr?`PR unverified`:e.state===`pr-open`&&e.pr?.draft?`Draft PR`:V[e.state]??e.state}function W(e){return o.includes(e)}function G(e){return e===`queued`||e===`launching`||e===`running`}var K=864e5;function q(e,t=Date.now()){let n=e=>{let n=Date.parse(e.updatedAt);return Number.isFinite(n)&&t-n<K},r=e.filter(e=>!W(e.state)||n(e)).sort((e,t)=>(Date.parse(t.createdAt)||0)-(Date.parse(e.createdAt)||0));return{shown:r.slice(0,6),hidden:Math.max(0,r.length-6)}}function J(e){return e.filter(e=>G(e.state)).length}function Y(e,t=Date.now()){let n=e.state===`queued`||e.state===`launching`?e.createdAt:e.launchedAt??e.createdAt,r=i(n,t),a=e.state===`queued`?`queued`:e.state===`failed`?`tried`:`started`;return`${e.repo} from ${e.baseBranch}${r?` · ${a} ${r}`:``}`}function X(e,t=Date.now()){return e.report?.summary&&(e.state===`pr-open`||e.state===`merged`)?`Cloud session reports (unverified): ${w(e.report.summary,t)}`:e.stateReason?w(e.stateReason,t):null}function ie(e){return e.state!==`merged`&&e.state!==`closed`}var Z=new Intl.NumberFormat(`en-US`);function ae(e){let t={},n=e.repo.trim(),r=e.baseBranch.trim(),i=e.prompt.trim();return n?E.test(n)||(t.repo=`Use the GitHub owner/name form, like ashlrai/ashlr-hub.`):t.repo=`Enter the GitHub repository as owner/name.`,r&&!O(r)&&(t.baseBranch=`That isn't a branch name git accepts.`),i?i.length>2e4&&(t.prompt=`The task is ${Z.format(i.length)} characters; the limit is ${Z.format(s)}.`):t.prompt=`Describe the task for the cloud session.`,Object.keys(t).length>0?{ok:!1,errors:t}:{ok:!0,request:{repo:n,...r?{baseBranch:r}:{},prompt:i}}}var Q=[{field:`total`,label:`Credits on the account`,hint:`What claude.ai says you have.`,money:!0,integer:!1,min:0,max:1e5},{field:`spent`,label:`Already spent`,hint:`Spent before Verse tracked it, or a correction after checking.`,money:!0,integer:!1,min:-1e5,max:1e5},{field:`perSession`,label:`Estimate per session`,hint:`Flat cost Verse counts for each launch.`,money:!0,integer:!1,min:.01,max:1e3},{field:`maxPerDay`,label:`Sessions per day`,hint:`From every origin, counted per local day.`,money:!1,integer:!0,min:0,max:500},{field:`maxConcurrent`,label:`Running at once`,hint:`Launching or running together.`,money:!1,integer:!0,min:1,max:50},{field:`selfImproveMax`,label:`Self-improvement per day`,hint:`Launches Verse may make on its own.`,money:!1,integer:!0,min:0,max:100},{field:`reserve`,label:`Reserve`,hint:`Self-improvement stops under this estimated balance.`,money:!0,integer:!1,min:0,max:1e5}];function $(e){return String(Number.isInteger(e)?e:Math.round(e*100)/100)}function oe(e){return{total:$(e.creditsTotalUsd),spent:$(e.creditsSpentAdjustmentUsd),perSession:$(e.estimatedCostPerSessionUsd),maxPerDay:$(e.maxSessionsPerDay),maxConcurrent:$(e.maxConcurrent),selfImprove:e.selfImprove.enabled,selfImproveMax:$(e.selfImprove.maxPerDay),reserve:$(e.selfImprove.reserveUsd)}}function se(e,t){let n={},r={};for(let t of Q){let i=e[t.field].trim().replace(/^\$/,``),a=i===``?NaN:Number(i);Number.isFinite(a)?t.integer&&!Number.isInteger(a)?n[t.field]=`Enter a whole number.`:a<t.min||a>t.max?n[t.field]=t.money?`Between ${A(t.min)} and ${A(t.max)}.`:`Between ${Z.format(t.min)} and ${Z.format(t.max)}.`:r[t.field]=a:n[t.field]=`Enter a number.`}if(Object.keys(n).length>0)return{ok:!1,errors:n};let i={},a=(e,t)=>Math.abs(e-t)<.005;a(r.total,t.creditsTotalUsd)||(i.creditsTotalUsd=r.total),a(r.spent,t.creditsSpentAdjustmentUsd)||(i.creditsSpentAdjustmentUsd=r.spent),a(r.perSession,t.estimatedCostPerSessionUsd)||(i.estimatedCostPerSessionUsd=r.perSession),a(r.maxPerDay,t.maxSessionsPerDay)||(i.maxSessionsPerDay=r.maxPerDay),a(r.maxConcurrent,t.maxConcurrent)||(i.maxConcurrent=r.maxConcurrent);let o={};return e.selfImprove!==t.selfImprove.enabled&&(o.enabled=e.selfImprove),a(r.selfImproveMax,t.selfImprove.maxPerDay)||(o.maxPerDay=r.selfImproveMax),a(r.reserve,t.selfImprove.reserveUsd)||(o.reserveUsd=r.reserve),Object.keys(o).length>0&&(i.selfImprove=o),{ok:!0,update:i,changed:Object.keys(i).length>0}}function ce(e){return e.overview?L(e.overview.seat)||(e.repo?F(e.overview.budget.canLaunch,`The cloud budget does not allow another launch right now.`)||(e.prompt.trim()?e.prompt.trim().length>2e4?`The message is over ${Z.format(s)} characters — trim it to run it in the cloud.`:null:`Type the task in the message box first.`):e.rootsLoading?`Reading this chat's project…`:`This chat's project has no GitHub origin, so a cloud session has nothing to clone.`):e.overviewReason??`The cloud lane did not answer.`}export{Y as C,X as S,k as _,z as a,N as b,ie as c,A as d,F as f,ce as g,re as h,H as i,q as l,B as m,T as n,oe as o,J as p,R as r,se as s,Q as t,j as u,L as v,ae as w,U as x,P as y};
2
- //# sourceMappingURL=cloud-model-CX407gPY.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-catalog-CF0cQQac.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/command-catalog.ts"],"sourcesContent":["/**\n * routes/verse/shell/command-catalog.ts — every workbench command, in ONE\n * table (unit C0; SPEC-310C §1).\n *\n * The ⌘K palette (C1), the shortcuts overlay (⌘/), the drawer and every\n * surface's buttons read this table; the key test reads it too, which is how\n * \"no two commands share a key\" and \"no key the native menu already owns\"\n * stay true as units add commands.\n *\n * KEYS are written in ./command-keys.ts, the half of the catalog the chat\n * first paint needs (a key press, a shortcut hint, the desktop menu bridge);\n * a row with keys takes them from there with `bind(id)`, so each key is\n * still written once. This module — titles, palette groups, keywords,\n * guards, the keyless palette actions — loads with the palette's chunk, not\n * with first paint, and re-exports ./command-keys.ts so its importers keep\n * one import site.\n *\n * Pure data plus pure helpers — no React, no DOM — so the palette can import\n * it without pulling a surface into its chunk.\n *\n * Adding a command: one entry below (a change request to C0 when another\n * unit needs it), plus its keys in command-keys.ts if it has any. The\n * handler lives with the unit that owns the behaviour and dispatches on the\n * command `id`.\n */\nimport {\n COMMAND_KEYS,\n matchKey,\n detectKeyPlatform,\n registerCommandCatalog,\n type CommandScope,\n type KeyChord,\n type KeyedCommandId,\n type KeyEventLike,\n type KeyPlatform,\n type NativeBinding,\n} from './command-keys.js';\n\nexport * from './command-keys.js';\n\n// ===========================================================================\n// The palette\n// ===========================================================================\n\n/** Result groups, in the order the palette shows them (SPEC-310C §1). */\nexport const PALETTE_GROUPS = [\n { id: 'needs-you', label: 'Needs you' },\n { id: 'chats', label: 'Chats' },\n { id: 'actions', label: 'Actions' },\n { id: 'go-to', label: 'Go to' },\n { id: 'seats-apps', label: 'Seats & Apps' },\n { id: 'projects', label: 'Projects' },\n] as const;\nexport type PaletteGroupId = (typeof PALETTE_GROUPS)[number]['id'];\n\n/** A leading `>` limits results to actions; `#` to chats. */\nexport const PALETTE_PREFIXES: Readonly<Record<'>' | '#', PaletteGroupId>> = { '>': 'actions', '#': 'chats' };\n\n/** An empty query shows the last this-many actions run. */\nexport const PALETTE_RECENT_LIMIT = 5;\n\n/** The palette opens in under this (it lives in the shell chunk). */\nexport const PALETTE_OPEN_BUDGET_MS = 50;\n\n// ===========================================================================\n// Commands\n// ===========================================================================\n\nexport type CommandArgumentKind = 'seat' | 'project' | 'section' | 'session';\n\n/**\n * A guarded command asks for confirmation FIRST, then the mutation token\n * (the palette must never be a shortcut around the confirm step its regular\n * UI requires).\n */\nexport interface CommandGuard {\n confirm: { title: string; body: string; confirmLabel: string; destructive: boolean };\n token: boolean;\n}\n\n/** Sections of the shortcuts overlay (⌘/), in display order. */\nexport const SHORTCUT_SECTIONS = ['Surfaces', 'Navigation', 'Chat', 'Dock', 'Composer', 'Needs you', 'Charts', 'App'] as const;\nexport type ShortcutSection = (typeof SHORTCUT_SECTIONS)[number];\n\nexport interface WorkbenchCommand {\n id: string;\n /** Palette / overlay text: a verb phrase, operator language. */\n title: string;\n scope: CommandScope;\n /** Empty = reachable from the palette (or a button) only. */\n keys: readonly KeyChord[];\n /** Where the palette lists it; null = not a palette entry (drawer and chart keys). */\n group: 'actions' | 'go-to' | null;\n section: ShortcutSection;\n keywords?: readonly string[];\n /** Tab fills this argument (\"New chat on…\" → a seat). */\n argument?: { kind: CommandArgumentKind; prompt: string };\n guard?: CommandGuard;\n native?: NativeBinding;\n /** A qualifier the overlay prints under the title. */\n note?: string;\n /**\n * The surface that serves it. The command's behaviour — and the dialogs it\n * may open (the Touch ID sheet, the token prompt) — live on that surface,\n * so the shell brings it forward and parks the command until the surface\n * registers its handler (run-command.ts). The palette says where it runs.\n */\n surface?: 'command';\n}\n\n/** A keyed row's id, scope, keys and native binding — from command-keys.ts, never re-declared here. */\nfunction bind<I extends KeyedCommandId>(id: I): { id: I; scope: CommandScope; keys: readonly KeyChord[]; native?: NativeBinding } {\n const spec: { scope: CommandScope; keys: readonly KeyChord[]; native?: NativeBinding } = COMMAND_KEYS[id];\n return spec.native ? { id, scope: spec.scope, keys: spec.keys, native: spec.native } : { id, scope: spec.scope, keys: spec.keys };\n}\n\nconst STOP_CHATS_GUARD: CommandGuard = {\n confirm: {\n title: 'Stop every running chat?',\n body: 'Each running turn is cancelled. Queued follow-ups are held, not sent.',\n confirmLabel: 'Stop chats',\n destructive: true,\n },\n token: true,\n};\n\nconst STOP_FLEET_GUARD: CommandGuard = {\n confirm: {\n title: 'Stop the fleet?',\n body: 'Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.',\n confirmLabel: 'Stop fleet',\n destructive: true,\n },\n token: true,\n};\n\n/** Where the copy-setup command points: the one CLI step that turns autonomy on. */\nexport const AUTONOMY_SETUP_COMMAND = 'ashlr authority setup';\n\n/**\n * A palette-only App action (no key) — shared shape of the autonomy, grant,\n * budget and setup entries below.\n */\nconst appAction = (id: string, title: string, keywords: readonly string[], surface?: 'command'): WorkbenchCommand => ({\n id,\n title,\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'App',\n keywords,\n ...(surface ? { surface } : {}),\n});\n\n/**\n * The Command surface's autonomy switch, one palette entry per position.\n * Served by AutonomyBar with the switch's own rules: lowering is instant,\n * raising past the installed grant opens the Touch ID sheet instead.\n */\nconst autonomySwitch = (to: 'off' | 'propose' | 'autonomous', label: string, keywords: readonly string[]) =>\n appAction(`autonomy.${to}`, `Autonomy: ${label}`, ['autonomy', 'switch', ...keywords], 'command');\n\n/** A9's budget mode, set from the palette — clamped to the grant's ceiling like the Budget pill. */\nconst budgetMode = (mode: 'all-in' | 'balanced' | 'reserve', label: string, keywords: readonly string[]) =>\n appAction(`budget.${mode}`, `Budget mode: ${label}`, ['budget', 'spend', ...keywords], 'command');\n\nconst surface = <I extends KeyedCommandId>(id: I, name: string) => ({\n ...bind(id),\n title: `Go to ${name}`,\n group: 'go-to',\n section: 'Surfaces',\n keywords: [name.toLowerCase()],\n} as const);\n\nexport const WORKBENCH_COMMANDS = [\n // ── Surfaces (⌘1 Command … ⌘5 Chat) and the gear tray ────────────────────\n surface('surface.command', 'Command'),\n surface('surface.fleet', 'Fleet'),\n surface('surface.growth', 'Growth'),\n surface('surface.mind', 'Mind'),\n surface('surface.chat', 'Chat'),\n { ...bind('section.settings'), title: 'Open Settings', group: 'go-to', section: 'Surfaces', keywords: ['preferences', 'appearance'] },\n { id: 'section.apps', title: 'Open Apps & Accounts', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['mcp', 'accounts', 'seats', 'integrations', 'ollama'] },\n { id: 'section.usage', title: 'Open Usage', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['capacity', 'spend', 'limits'] },\n\n // ── Navigation ───────────────────────────────────────────────────────────\n { ...bind('palette.open'), title: 'Command palette', group: null, section: 'Navigation' },\n { ...bind('needs-you.open'), title: 'Open Needs you', group: 'actions', section: 'Navigation', keywords: ['approvals', 'inbox', 'triage'] },\n { ...bind('shortcuts.open'), title: 'Keyboard shortcuts', group: 'actions', section: 'Navigation', keywords: ['keys', 'help'] },\n // The Resources drawer (3.11 C6): the key toggles it, the palette opens it.\n {\n ...bind('resources.toggle'),\n title: 'Open Resources',\n group: 'actions',\n section: 'Navigation',\n // The composer claims ⌘. to stop a running turn (Composer.tsx) — say so\n // where the key is listed, so the same chord is never a surprise.\n note: 'stops the running turn instead while one runs',\n keywords: ['show resources', 'accounts', 'seats', 'capacity', 'credits', 'cloud', 'local models'],\n },\n {\n id: 'resources.bar.toggle',\n title: 'Show or hide the resource bar',\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'Navigation',\n keywords: ['battery', 'usage bars', 'accounts', 'capacity', 'rail', 'resources'],\n },\n { ...bind('history.back'), title: 'Back', group: null, section: 'Navigation', note: 'through surfaces and chats' },\n { ...bind('history.forward'), title: 'Forward', group: null, section: 'Navigation', note: 'through surfaces and chats' },\n { ...bind('chat.recent-next'), title: 'Next recent chat', group: null, section: 'Navigation' },\n { ...bind('chat.recent-prev'), title: 'Previous recent chat', group: null, section: 'Navigation' },\n { ...bind('rail.toggle-labels'), title: 'Show or hide rail labels', group: 'actions', section: 'Navigation' },\n\n // ── Chats ────────────────────────────────────────────────────────────────\n { ...bind('chat.new'), title: 'New chat', group: 'actions', section: 'Chat' },\n {\n id: 'chat.new-on',\n title: 'New chat on…',\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'Chat',\n argument: { kind: 'seat', prompt: 'Seat' },\n keywords: ['seat', 'account', 'engine'],\n },\n { ...bind('chat.sidebar'), title: 'Show or hide the chat list', group: 'actions', section: 'Chat' },\n { ...bind('chat.find'), title: 'Find in chat', group: 'actions', section: 'Chat', keywords: ['search'] },\n { ...bind('chat.turn-prev'), title: 'Previous turn', group: null, section: 'Chat' },\n { ...bind('chat.turn-next'), title: 'Next turn', group: null, section: 'Chat' },\n { id: 'chats.stop-all', title: 'Stop running chats…', scope: 'global', keys: [], group: 'actions', section: 'Chat', guard: STOP_CHATS_GUARD, keywords: ['cancel', 'halt'] },\n // ── Git (C5's BranchBar serves these) ─────────────────────────────────────\n // Palette-only and unguarded ON PURPOSE: each OPENS BranchBar's own dialog\n // (CreatePrDialog / MergeDialog), which carries the before-click disclosure,\n // and every write inside it still goes through the mutation-token gate —\n // so the palette is never a shortcut around a confirm step. No key: a\n // merge is never one keystroke away. Chat-scoped because the bar lives\n // above the composer; from another surface the shell switches to Chat and\n // parks the command until BranchBar registers (command-bus).\n // ── Cloud (3.11 C3) ──────────────────────────────────────────────────────\n // Opens the composer's Chat settings sheet, where \"Run in cloud\" lives with\n // its own disabled reasons (no GitHub origin, seat not ready, budget gate,\n // empty box) and the token gate — the palette never launches by itself.\n { id: 'composer.cloud', title: 'Run in cloud…', scope: 'chat', keys: [], group: 'actions', section: 'Composer', keywords: ['cloud', 'remote', 'launch', 'draft pr'] },\n { id: 'git.create-pr', title: 'Create pull request…', scope: 'chat', keys: [], group: 'actions', section: 'Chat', keywords: ['pr', 'github', 'git', 'open pull request'] },\n { id: 'git.merge-pr', title: 'Merge pull request…', scope: 'chat', keys: [], group: 'actions', section: 'Chat', keywords: ['pr', 'github', 'git', 'land', 'ship'] },\n\n // ── Dock (C2 container; panes from dock-catalog.ts) ───────────────────────\n { ...bind('dock.toggle'), title: 'Show or hide the dock', group: 'actions', section: 'Dock' },\n { ...bind('dock.terminal'), title: 'Terminal', group: 'actions', section: 'Dock', keywords: ['shell', 'console'] },\n { ...bind('dock.terminal-new'), title: 'New terminal tab', group: 'actions', section: 'Dock' },\n { ...bind('dock.preview'), title: 'Preview', group: 'actions', section: 'Dock', keywords: ['browser', 'dev server'] },\n { ...bind('dock.diff'), title: 'Review changes', group: 'actions', section: 'Dock', keywords: ['diff', 'git'] },\n\n // ── Composer ─────────────────────────────────────────────────────────────\n { ...bind('composer.permission'), title: 'Permission mode…', group: 'actions', section: 'Composer', keywords: ['plan', 'bypass', 'auto'] },\n { ...bind('composer.model'), title: 'Model…', group: 'actions', section: 'Composer' },\n { ...bind('composer.effort'), title: 'Effort…', group: 'actions', section: 'Composer', keywords: ['reasoning', 'thinking'] },\n { ...bind('composer.attach'), title: 'Attach files…', group: 'actions', section: 'Composer', keywords: ['upload', 'image'] },\n { ...bind('composer.send'), title: 'Send', group: null, section: 'Composer', note: 'queues while a turn runs (up to 3)' },\n { ...bind('composer.stop-and-send'), title: 'Stop and send', group: null, section: 'Composer' },\n { ...bind('composer.stop'), title: 'Stop the running turn', group: null, section: 'Composer', note: 'only from an empty composer with no overlay open' },\n\n // ── Needs-you drawer ─────────────────────────────────────────────────────\n { ...bind('drawer.next'), title: 'Next item', group: null, section: 'Needs you' },\n { ...bind('drawer.prev'), title: 'Previous item', group: null, section: 'Needs you' },\n { ...bind('drawer.open'), title: 'Open item', group: null, section: 'Needs you' },\n { ...bind('drawer.approve'), title: 'Approve', group: null, section: 'Needs you', note: 'confirms, then asks for the token' },\n { ...bind('drawer.reject'), title: 'Reject', group: null, section: 'Needs you', note: 'confirms, then asks for the token' },\n { ...bind('drawer.veto'), title: 'Veto', group: null, section: 'Needs you', note: 'confirms, then asks for the token' },\n { ...bind('drawer.done'), title: 'Mark done', group: null, section: 'Needs you' },\n { ...bind('drawer.split-prev'), title: 'Previous split', group: null, section: 'Needs you' },\n { ...bind('drawer.split-next'), title: 'Next split', group: null, section: 'Needs you' },\n\n // ── Charts ───────────────────────────────────────────────────────────────\n { ...bind('chart.table'), title: 'Show as a table', group: null, section: 'Charts', note: 'when a chart card has focus' },\n\n // ── App ──────────────────────────────────────────────────────────────────\n { ...bind('appearance.toggle-theme'), title: 'Toggle light / dark', group: 'actions', section: 'App', keywords: ['theme', 'dark mode'] },\n { ...bind('app.summon'), title: 'Show Verse and focus the composer', group: null, section: 'App', note: 'system-wide; turn on in Settings ▸ Desktop' },\n { id: 'fleet.stop', title: 'Stop the fleet…', scope: 'global', keys: [], group: 'actions', section: 'App', guard: STOP_FLEET_GUARD, keywords: ['kill', 'halt', 'autonomy'] },\n\n // ── Autonomy (Command's AutonomyBar serves these) ────────────────────────\n // No keys on purpose: raising authority is never one keystroke away, and\n // each entry runs the bar's own path (Touch ID sheet, token, read-only).\n autonomySwitch('off', 'Off', ['disable', 'lower']),\n autonomySwitch('propose', 'Propose', ['proposals', 'review']),\n autonomySwitch('autonomous', 'Autonomous', ['auto', 'turn on', 'enable']),\n appAction('autonomy.grant', 'Approve grant…', ['touch id', 're-approve', 'renew', 'authority', 'autonomy'], 'command'),\n budgetMode('all-in', 'All-in', ['all in', 'max']),\n budgetMode('balanced', 'Balanced', ['default']),\n budgetMode('reserve', 'Reserve', ['save', 'conserve']),\n // Served by the shell (run-command.ts → copy-setup.ts), wherever you are.\n appAction('autonomy.copy-setup', 'Copy autonomy setup command', [AUTONOMY_SETUP_COMMAND, 'autonomy', 'turn on', 'clipboard']),\n] as const satisfies readonly WorkbenchCommand[];\n\nexport type CommandId = (typeof WORKBENCH_COMMANDS)[number]['id'];\n\nconst BY_ID: ReadonlyMap<string, WorkbenchCommand> = new Map(WORKBENCH_COMMANDS.map((c) => [c.id, c as WorkbenchCommand]));\n\nexport function findCommand(id: string): WorkbenchCommand | null {\n return BY_ID.get(id) ?? null;\n}\n\n// run-command.ts resolves keyless ids (palette actions, guards, surfaces) through this.\nregisterCommandCatalog(findCommand);\n\n/** Palette entries of one group, in catalog order. */\nexport function paletteCommands(group: 'actions' | 'go-to'): WorkbenchCommand[] {\n return (WORKBENCH_COMMANDS as readonly WorkbenchCommand[]).filter((c) => c.group === group);\n}\n\n/** The shortcuts overlay: every command with keys, grouped by section, in display order. */\nexport function shortcutSections(): Array<{ section: ShortcutSection; commands: WorkbenchCommand[] }> {\n const withKeys = (WORKBENCH_COMMANDS as readonly WorkbenchCommand[]).filter((c) => c.keys.length > 0);\n return SHORTCUT_SECTIONS.map((section) => ({ section, commands: withKeys.filter((c) => c.section === section) })).filter(\n (s) => s.commands.length > 0,\n );\n}\n\n/**\n * The command a key press runs, given the scopes live right now (innermost\n * first, e.g. ['composer', 'chat', 'global']). Null when nothing is bound —\n * the caller must then leave the event alone. The full catalog entry; first\n * paint matches with command-keys.ts matchKey().\n */\nexport function matchCommand(event: KeyEventLike, liveScopes: readonly CommandScope[], platform: KeyPlatform = detectKeyPlatform()): WorkbenchCommand | null {\n const binding = matchKey(event, liveScopes, platform);\n return binding ? findCommand(binding.id) : null;\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{D as e,E as t,H as n,P as r,U as i,j as a,l as o,o as s}from"./global-CNNGMril.js";import{f as c,i as l,r as u,w as d}from"./VerseConsoleApp-BCY5uSok.js";import{l as f}from"./verse-store-DNVRuiJL.js";import{t as p}from"./format-Dk4Fmxax.js";var m=`verse-preferences`,h=`verse-memory:`;async function g(e){try{let t=await e.json();if(typeof t.error==`string`&&t.error)return t.error;if(typeof t.note==`string`&&t.note)return t.note}catch{}return null}async function _(t,n){let r=await fetch(t,{method:`GET`,credentials:`same-origin`,headers:{"x-ashlr-read-client":e()},signal:n});if(r.status===401)throw a(),new s(`Read session expired.`,401,t);if(!r.ok){let e=await g(r);throw new s(`GET ${t} failed (HTTP ${r.status})${e?`: ${p(e)}`:``}.`,r.status,t,e)}return await r.json()}async function v(e,n){let i=t();if(!i)throw new l;let a=await o(e,n,i);return r(),a}function y(e,t){let n=t.toString();return n?`${e}?${n}`:e}async function b(e,t){let r={mode:t},i=await v(d(e,`/context-mode`),r);return f(e,i),n(u),i}async function x(e,t={}){let n={};t.includeLastAssistant===!0&&(n.includeLastAssistant=!0);let r=typeof t.focus==`string`?t.focus.trim().slice(0,500):``;return r&&(n.focus=r),v(d(e,`/handoff-preview`),n)}async function S(e){let{source:t}=e,n={projectPath:t.projectPath,seatId:e.seatId,handoffFromSessionId:t.id},r=(t.extraRoots??[]).filter(e=>typeof e==`string`&&e.length>0&&e!==t.projectPath);r.length>0&&(n.extraRoots=r),e.model&&(n.model=e.model),e.contextMode&&(n.contextMode=e.contextMode);let i=e.title?.trim();i&&(n.title=i);let a=await v(`/api/verse/sessions`,n);return c(),a}function C(e){return _(`/api/verse/preferences`,e)}var w={key:m,fetch:e=>C(e)};async function T(e){let t=await v(`/api/verse/preferences`,e);return n(m),i(h),t}function E(e){let t=new URLSearchParams,n=e.workspaceId?.trim()??``,r=e.projectPath?.trim()??``,i=(e.extraRoots??[]).map(e=>e.trim()).filter(e=>e.length>0);if(n){if(r||i.length>0)throw Error(`Estimate a workspace or a folder set, not both.`);t.set(`workspaceId`,n)}else if(r){t.set(`projectPath`,r);for(let e of i)t.append(`extraRoots`,e)}else throw Error(`Pick a project or a workspace to estimate.`);return y(`/api/verse/context-fit`,t)}function D(e,t){return _(E(e),t)}function O(e,t,n){let r=new URLSearchParams({q:e});return typeof t==`number`&&Number.isFinite(t)&&r.set(`limit`,String(Math.max(1,Math.min(50,Math.floor(t))))),_(y(`/api/verse/search`,r),n)}function k(e){return`${h}${e}`}function A(e,t){return _(y(`/api/verse/memory`,new URLSearchParams({projectPath:e})),t)}function j(e){return{key:k(e),fetch:t=>A(e,t)}}async function M(e,t){let r=await v(`/api/verse/memory`,{projectPath:e,content:t});return n(k(e)),r}export{A as a,T as c,M as d,C as i,w as l,D as n,O as o,x as r,b as s,S as t,j as u};
2
- //# sourceMappingURL=context-queries-CktFQqSS.js.map
@@ -1,2 +0,0 @@
1
- import{B as e}from"./VerseConsoleApp-BCY5uSok.js";import{t}from"./command-catalog-CF0cQQac.js";import{t as n}from"./clipboard-DkZdqlxf.js";async function r(){let r=await n(t);return e(r?`Copied \`${t}\`. Run it in a terminal; add --dry-run to see every step first.`:`Could not reach the clipboard. Run \`${t}\` in a terminal.`,r?`success`:`neutral`),r}export{r as copyAutonomySetupCommand};
2
- //# sourceMappingURL=copy-setup-CqRSfELB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"copy-setup-CqRSfELB.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/copy-setup.ts"],"sourcesContent":["/**\n * routes/verse/shell/copy-setup.ts — ⌘K \"Copy autonomy setup command\" and\n * onboarding's Copy button: put `ashlr authority setup` on the clipboard and\n * say what to do with it.\n *\n * Split from run-command.ts for the same reason guarded-runners.ts is:\n * run-command is on the chat first-paint path (the shell's key handler runs\n * through it), and nothing here is needed until someone asks to copy — so\n * run-command loads this module with import() when the command runs.\n */\nimport { copyText } from '../../../components/primitives/clipboard.js';\nimport { AUTONOMY_SETUP_COMMAND } from './command-catalog.js';\nimport { shellNotify } from './run-command.js';\n\n/** Copy the setup command and toast the outcome; resolves to whether it was copied. */\nexport async function copyAutonomySetupCommand(): Promise<boolean> {\n const ok = await copyText(AUTONOMY_SETUP_COMMAND);\n shellNotify(\n ok\n ? `Copied \\`${AUTONOMY_SETUP_COMMAND}\\`. Run it in a terminal; add --dry-run to see every step first.`\n : `Could not reach the clipboard. Run \\`${AUTONOMY_SETUP_COMMAND}\\` in a terminal.`,\n ok ? 'success' : 'neutral',\n );\n return ok;\n}\n"],"mappings":"2IAeA,eAAsB,GAA6C,CACjE,IAAM,EAAK,MAAM,EAAS,CAAsB,EAOhD,OANA,EACE,EACI,YAAY,EAAuB,kEACnC,wCAAwC,EAAuB,mBACnE,EAAK,UAAY,SACnB,EACO,CACT"}
@@ -1,2 +0,0 @@
1
- import{n as e,r as t}from"./format-DKrNjdwD.js";import{D as n}from"./VerseConsoleApp-BCY5uSok.js";import{_ as r,f as i}from"./verse-model-MMySehjj.js";function a(e,t){if(!e)return null;for(let n of e)if(n.seatId===t)return n;return null}function o(e,t=Date.now()){if(typeof e!=`string`||e.length===0)return null;let n=Date.parse(e);if(!Number.isFinite(n))return null;let r=new Date(n),i=r.toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`});return new Date(t).toDateString()===r.toDateString()?`today ${i}`:n>t&&n-t<5184e5?`${r.toLocaleDateString([],{weekday:`short`})} ${i}`:`${r.toLocaleDateString([],{month:`short`,day:`numeric`})}, ${i}`}function s(e){return(e.capacity?.binding??null)?.resetDescription??null}function c(e,t,n=Date.now()){let r=null,i=null;if(t!==null)(t.connection===`signed-out`||t.connection===`exhausted`)&&(r=t.connection,i=t.resetAt);else if(e.engine!==`local`){let t=e.capacity?.usability;(t===`signed-out`||t===`exhausted`)&&(r=t,i=t===`exhausted`?e.capacity?.binding?.resetsAt??null:null)}if(r===null)return null;if(r===`signed-out`)return{connection:r,resetAt:null,reason:`${e.label} is signed out — reconnect it to use this seat.`};let a=o(i,n),c=a===null?s(e):null,l=a===null?c===null?``:` — ${c}`:` — resets ${a}`;return{connection:r,resetAt:i,reason:`${e.label} is out of usage${l}.`}}function l(e){return e.models.some(e=>!e.unavailableReason)}function u(e){return e.engine===`local`?2:e.capacity?.usability===`ready`?0:1}function d(e){let t=e.capacity?.binding?.usedPercent;return typeof t==`number`&&Number.isFinite(t)?t:101}function f(e,t,n){return!(!l(e)||e.health.state===`unavailable`||c(e,t,n)!==null||e.engine===`local`&&t!==null&&t.connection===`unknown`&&t.reasons.length>0)}function p(e,t,n,r=Date.now()){let i=t.find(t=>t.id===e)??null,o=t.map((e,t)=>({seat:e,index:t})).filter(({seat:t})=>t.id!==e&&f(t,a(n,t.id),r));return o.sort((e,t)=>{let n=u(e.seat)-u(t.seat);if(n!==0)return n;if(i!==null){let n=e.seat.engine===i.engine?0:1,r=t.seat.engine===i.engine?0:1;if(n!==r)return n-r}let r=d(e.seat)-d(t.seat);return r===0?e.index-t.index:r}),o.slice(0,5).map(({seat:e})=>e.id)}function m(e){return typeof e!=`number`||!Number.isFinite(e)?`—`:e>0&&e<.01?`<1%`:t(e)}function h(e){return n(e)}var g=/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:?\d{2})?(?![\w:])/g,_=String.raw`[\p{L}\p{N}%…)\]"'’”\x60]`,v=RegExp(`(${_})\\.{1,2}\\s*;`,`gu`),y=RegExp(`(${_})\\.\\.(?=\\s|$)`,`gu`);function b(e,t=Date.now()){return e.replace(g,e=>o(e,t)??e).replace(v,`$1;`).replace(y,`$1.`)}function x(e){let t=e.trim();return t.endsWith(`...`)||t.endsWith(`…`)?t:t.replace(/\.+$/,``)}function S(e){let t=e.trim().replace(/[\s;,:]+$/,``);return t?/[.!?…]$/.test(t)?t:`${t}.`:``}function C(e){return i(e)?r(e):e}function w(e){return typeof e!=`number`||!Number.isFinite(e)?`—`:`$${e.toFixed(2)}`}function T(e){return typeof e!=`number`||!Number.isFinite(e)?`—`:String(e)}function E(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let n=Math.floor(t/60),r=t%60;return n<60?`${n}m ${String(r).padStart(2,`0`)}s`:`${Math.floor(n/60)}h ${String(n%60).padStart(2,`0`)}m`}function D(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.max(0,Math.round((Date.now()-t)/1e3));if(n<60)return`${n}s`;let r=Math.round(n/60);if(r<60)return`${r}m`;let i=Math.round(r/60);return i<24?`${i}h`:`${Math.round(i/24)}d`}function O(e){let t=D(e);return t===`—`?`—`:`${t} ago`}function k(e=new Date){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function A(e,t=new Date){return e===k(t)||e===t.toISOString().slice(0,10)}function j(e,t=new Date){if(!e)return`—`;let n=Date.parse(e);if(Number.isNaN(n))return`—`;let r=new Date(n),i=r.toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`});return k(r)===k(t)?i:`${r.toLocaleDateString(void 0,{month:`short`,day:`numeric`})} ${i}`}function M(e){return typeof e!=`number`||!Number.isFinite(e)||e<=0?`—`:`every ${E(e).replace(/ 00[ms]$/,``)}`}var N=70;function P(t,n,r,i=new Date){let a=typeof t==`number`&&Number.isFinite(t)?Math.max(0,t):null,o=typeof n==`number`&&Number.isFinite(n)?n:null,s=typeof r==`string`&&!A(r,i);if(o===0)return{state:`stopped`,percent:100,label:`${w(a)} spent today · budget $0.00`,note:`Daily budget is $0 — the loop is stopped.`};if(s)return{state:`unknown`,percent:null,label:`— spent today · budget ${w(o)}`,note:`Nothing has been recorded today — the last ledger day is ${e(r)}.`};if(o===null||a===null)return{state:`unknown`,percent:null,label:o===null?`${w(a)} spent today · budget —`:`— spent today · budget ${w(o)}`,note:o===null?`Daily budget is not configured.`:`Today's spend is not observable right now.`};let c=a/o*100,l=Math.min(100,Math.round(c)),u=c>=100?`over`:c>=N?`warn`:`ok`;return{state:u,percent:l,label:`${w(a)} of ${w(o)} today · ${h(a/o*100)}`,note:u===`over`?`Daily budget reached — the loop idles until the date rolls over.`:u===`warn`?`${w(o-a)} left before the loop idles today.`:`${w(o-a)} left today.`}}function F(e,t){if(!e)return null;let n=Date.parse(e);return Number.isNaN(n)||typeof t!=`number`||!Number.isFinite(t)||t<=0?null:n+t}function I(e,t){if(e===null)return`—`;let n=e-t;return n>1e3?`in ${E(n)}`:n>-1e3?`due now`:`overdue by ${E(-n)}`}function L(e){if(!e)return{label:`no tick recorded`,tone:`unknown`};switch(e){case`ok`:return{label:`ok`,tone:`success`};case`kill-switch`:return{label:`refused — emergency stop engaged`,tone:`danger`};case`budget-exhausted`:return{label:`stopped — daily budget spent`,tone:`warning`};case`no-enrolled-repos`:return{label:`nothing to do — no repos enrolled`,tone:`warning`};case`no-backlog`:return{label:`nothing to do — backlog empty`,tone:`neutral`};case`dry-run`:return{label:`dry run`,tone:`neutral`};default:return{label:e,tone:`neutral`}}}export{c as S,h as _,L as a,o as b,E as c,j as d,w as f,F as g,k as h,I as i,M as l,A as m,S as n,D as o,m as p,P as r,T as s,x as t,O as u,C as v,p as x,b as y};
2
- //# sourceMappingURL=format-Dk4Fmxax.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format-Dk4Fmxax.js","names":[],"sources":["../../../../../../src/core/verse/seat-readiness.ts","../../../../../../src/web-ui/routes/verse/autonomy/format.ts"],"sourcesContent":["/**\n * core/verse/seat-readiness.ts — \"can this seat run a turn right now, and if\n * not, where else can the operator go?\" (V3.10, unit A2).\n *\n * PURE and BROWSER-SAFE on purpose: the engine's admission gate\n * (`getSeatReadiness` in core/verse/seats.ts) and the Composer's block\n * (web-ui/routes/verse/health/ComposerSeatBlock.tsx) must give the SAME\n * answer, with the SAME ranked alternatives, or the UI would offer a seat the\n * server then refuses. One implementation, imported by both. Type-only\n * imports and `Intl` only — no node: modules.\n *\n * ── WHAT BLOCKS A SEAT ─────────────────────────────────────────────────────\n * Only POSITIVE evidence that a turn would fail at the provider:\n * - `signed-out` — the CLI said so (status command or the live collector).\n * - `exhausted` — every window that carried a reading is spent and no\n * Codex credit balance remains (`seatUsability` in seats.ts;\n * a spent per-model window beside a healthy account-wide\n * one is `tight`, not exhausted).\n * `unknown`, `expiring` and `binary-skew` are WARNINGS, never refusals: an\n * admission gate that refused on \"we could not read it\" would lock Mason out\n * of his own seats every time a probe hiccuped (docs/VERSE-TELEMETRY-V2.md —\n * no signal is not a verdict).\n *\n * ── HOW ALTERNATIVES ARE RANKED ────────────────────────────────────────────\n * (research r2/accounts.md, recommendation 4): other subscription seats with\n * measured headroom first, then subscription seats whose headroom is tight or\n * unread, then local models (free, always last because they are the weakest).\n * Inside a tier the SAME ENGINE leads (a Codex user blocked on one account most\n * likely wants the other Codex account), then the lower binding-window\n * percentage, then discovery order. A seat with no runnable model, a local\n * seat whose runtime is not answering, or a seat that is itself blocked is\n * never offered.\n */\nimport type { SeatConnection, SeatHealthReport, SeatReadiness } from './health-types.js';\nimport type { VerseSeat } from './types.js';\n\n/** The only connections that refuse a turn. Everything else is a warning. */\nexport const SEAT_BLOCKING_CONNECTIONS: ReadonlySet<SeatConnection> = new Set<SeatConnection>(['signed-out', 'exhausted']);\n\n/** At most this many alternatives are offered — a list, not a directory. */\nexport const SEAT_MAX_ALTERNATIVES = 5;\n\nexport interface SeatBlock {\n connection: 'signed-out' | 'exhausted';\n /** One plain sentence naming the seat and the fact (\"Personal Codex is out of usage — resets Fri 2:25 PM.\"). */\n reason: string;\n /** Machine-readable reset instant, when the provider gave one. */\n resetAt: string | null;\n}\n\nfunction reportFor(reports: readonly SeatHealthReport[] | null | undefined, seatId: string): SeatHealthReport | null {\n if (!reports) return null;\n for (const report of reports) if (report.seatId === seatId) return report;\n return null;\n}\n\n/**\n * A reset instant as a short local phrase (\"Fri 2:25 PM\", \"Sep 30, 2:25 PM\"),\n * or null when `iso` is not a valid instant. Only a MACHINE-READABLE instant\n * is ever formatted — Claude's prose reset never reaches this function.\n */\nexport function describeResetAt(iso: string | null | undefined, now: number = Date.now()): string | null {\n if (typeof iso !== 'string' || iso.length === 0) return null;\n const at = Date.parse(iso);\n if (!Number.isFinite(at)) return null;\n const date = new Date(at);\n const time = date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n if (new Date(now).toDateString() === date.toDateString()) return `today ${time}`;\n // Within the coming week the weekday is the clearest name for a day.\n if (at > now && at - now < 6 * 24 * 60 * 60 * 1000) {\n return `${date.toLocaleDateString([], { weekday: 'short' })} ${time}`;\n }\n return `${date.toLocaleDateString([], { month: 'short', day: 'numeric' })}, ${time}`;\n}\n\n/** The provider's own reset wording for the seat's binding window (Claude publishes prose only). */\nfunction bindingResetDescription(seat: VerseSeat): string | null {\n const binding = seat.capacity?.binding ?? null;\n return binding?.resetDescription ?? null;\n}\n\n/**\n * Why `seat` cannot take a turn, or null when nothing positively blocks it.\n *\n * The health report (sweep + live telemetry) wins when present; without one\n * the seat's own `capacity.usability` — which is on every native seat the\n * server serves — is the fallback, so the seat picker can mark a blocked seat\n * before the health endpoint has ever been read.\n */\nexport function seatBlock(\n seat: VerseSeat,\n report: SeatHealthReport | null,\n now: number = Date.now(),\n): SeatBlock | null {\n let connection: SeatBlock['connection'] | null = null;\n let resetAt: string | null = null;\n if (report !== null) {\n if (report.connection === 'signed-out' || report.connection === 'exhausted') {\n connection = report.connection;\n resetAt = report.resetAt;\n }\n } else if (seat.engine !== 'local') {\n const usability = seat.capacity?.usability;\n if (usability === 'signed-out' || usability === 'exhausted') {\n connection = usability;\n resetAt = usability === 'exhausted' ? seat.capacity?.binding?.resetsAt ?? null : null;\n }\n }\n if (connection === null) return null;\n if (connection === 'signed-out') {\n return { connection, resetAt: null, reason: `${seat.label} is signed out — reconnect it to use this seat.` };\n }\n const when = describeResetAt(resetAt, now);\n const prose = when === null ? bindingResetDescription(seat) : null;\n const tail = when !== null ? ` — resets ${when}` : prose !== null ? ` — ${prose}` : '';\n return { connection, resetAt, reason: `${seat.label} is out of usage${tail}.` };\n}\n\nfunction hasRunnableModel(seat: VerseSeat): boolean {\n return seat.models.some((model) => !model.unavailableReason);\n}\n\n/** 0 = subscription seat with measured headroom, 1 = tight/unread subscription seat, 2 = local. */\nfunction tier(seat: VerseSeat): number {\n if (seat.engine === 'local') return 2;\n return seat.capacity?.usability === 'ready' ? 0 : 1;\n}\n\nfunction bindingPercent(seat: VerseSeat): number {\n const used = seat.capacity?.binding?.usedPercent;\n // Unread sorts after every reading: no signal is not \"0% used\".\n return typeof used === 'number' && Number.isFinite(used) ? used : 101;\n}\n\n/** Can `seat` be offered as somewhere else to go? */\nfunction offerable(seat: VerseSeat, report: SeatHealthReport | null, now: number): boolean {\n if (!hasRunnableModel(seat)) return false;\n if (seat.health.state === 'unavailable') return false;\n if (seatBlock(seat, report, now) !== null) return false;\n // A local seat is only worth offering while its runtime answers. `unknown`\n // with reasons is the sweep saying Ollama did not respond.\n if (seat.engine === 'local' && report !== null && report.connection === 'unknown' && report.reasons.length > 0) {\n return false;\n }\n return true;\n}\n\n/** Ranked ids of seats that could take the turn instead of `seatId` (see the file header). */\nexport function rankSeatAlternatives(\n seatId: string,\n seats: readonly VerseSeat[],\n reports: readonly SeatHealthReport[] | null | undefined,\n now: number = Date.now(),\n): string[] {\n const blocked = seats.find((seat) => seat.id === seatId) ?? null;\n const candidates = seats\n .map((seat, index) => ({ seat, index }))\n .filter(({ seat }) => seat.id !== seatId && offerable(seat, reportFor(reports, seat.id), now));\n candidates.sort((a, b) => {\n const byTier = tier(a.seat) - tier(b.seat);\n if (byTier !== 0) return byTier;\n if (blocked !== null) {\n const sameA = a.seat.engine === blocked.engine ? 0 : 1;\n const sameB = b.seat.engine === blocked.engine ? 0 : 1;\n if (sameA !== sameB) return sameA - sameB;\n }\n const byUse = bindingPercent(a.seat) - bindingPercent(b.seat);\n if (byUse !== 0) return byUse;\n return a.index - b.index;\n });\n return candidates.slice(0, SEAT_MAX_ALTERNATIVES).map(({ seat }) => seat.id);\n}\n\n/**\n * The admission answer for one seat. A seat that is not in `seats` at all is\n * reported READY with no reason: the readiness layer has no evidence about\n * it, and \"seat not found\" is the engine's own error to raise.\n */\nexport function seatReadiness(\n seatId: string,\n seats: readonly VerseSeat[],\n reports: readonly SeatHealthReport[] | null | undefined,\n now: number = Date.now(),\n): SeatReadiness {\n const seat = seats.find((candidate) => candidate.id === seatId) ?? null;\n if (seat === null) return { seatId, ready: true, reason: null, alternatives: [] };\n const block = seatBlock(seat, reportFor(reports, seatId), now);\n if (block === null) return { seatId, ready: true, reason: null, alternatives: [] };\n return { seatId, ready: false, reason: block.reason, alternatives: rankSeatAlternatives(seatId, seats, reports, now) };\n}\n","/**\n * routes/verse/autonomy/format.ts — the small pure functions the cockpit's\n * numerals go through. Kept framework-free so they unit-test without a DOM,\n * and kept in ONE place so \"unknown\" never renders as 0 in one panel and as\n * an em-dash in the next.\n *\n * The rule every function here obeys: absent is not zero. A null spend is\n * \"—\", a null budget is \"not configured\", and a budget of exactly 0 is\n * \"stopped\" — which is the single most misread number in the whole product.\n */\nimport { describeResetAt } from '../../../../core/verse/seat-readiness.js';\nimport { formatDayLabel, formatPercent } from '../../../components/charts/format.js';\nimport { isAbsolutePath, projectName } from '../verse-model.js';\nimport { usedPercentText } from '../percent-text.js';\n\n/** What we render when a value genuinely is not known. */\nexport const UNKNOWN = '—';\n\n/**\n * A share as a whole percentage — \"18%\" — except a non-zero share under one\n * percent, which reads \"<1%\". One precision per panel: \"0%\" for a sliver of\n * real spend or progress would state that nothing happened.\n */\nexport function formatWholePercent(fraction: number | null | undefined): string {\n if (typeof fraction !== 'number' || !Number.isFinite(fraction)) return UNKNOWN;\n if (fraction > 0 && fraction < 0.01) return '<1%';\n return formatPercent(fraction);\n}\n\n/**\n * THE ONE PERCENT RULE — a measured share of a window (or of anything capped\n * at 100), printed the same way on every panel: a whole percent, except that a\n * real reading under 1% is \"<1%\" (never \"0%\", which would read as \"untouched\")\n * and one just short of 100 is \"99%\" (never a rounded \"100%\", which would read\n * as \"spent\"). `used` is 0–100 and is clamped; not a number is \"—\".\n *\n * Every place that prints a used percent goes through this — a bar reading\n * \"99%\" beside a summary reading \"100% of 5-hour window used\" is one seat\n * described two ways. Bar WIDTHS stay numeric; only the words use this.\n */\nexport function percentText(used: number): string {\n return usedPercentText(used);\n}\n\n/** An ISO-8601 instant (a date WITH a time) anywhere inside a sentence. */\nconst ISO_INSTANT_IN_TEXT = /\\b\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,9})?)?(?:Z|[+-]\\d{2}:?\\d{2})?(?![\\w:])/g;\n\n/**\n * What may end a sentence right before its full stop: a letter, a digit, a\n * percent sign, an ellipsis, or a closing quote / bracket / backtick. NOT a\n * dot, a slash or a space — so a path segment (`../x`, `cd ..;`) never looks\n * like doubled punctuation.\n */\nconst SENTENCE_END = String.raw`[\\p{L}\\p{N}%…)\\]\"'’”\\x60]`;\n/** \"failed.; next\" / \"failed..; next\" → \"failed; next\". */\nconst STOP_BEFORE_SEMICOLON = new RegExp(`(${SENTENCE_END})\\\\.{1,2}\\\\s*;`, 'gu');\n/**\n * \"failed.. Next\" / \"exhausted..\" → one stop. The pair must be FOLLOWED by\n * whitespace or the end, so a git range (`a1b2c3d..e4f5a6b`, `HEAD~1..HEAD`)\n * and a traversal (`x/../y`) pass through untouched; a third dot (`...`) is\n * an ellipsis, not a doubled stop.\n */\nconst DOUBLED_STOP = new RegExp(`(${SENTENCE_END})\\\\.\\\\.(?=\\\\s|$)`, 'gu');\n\n/**\n * Server prose made fit to print: every ISO instant becomes the viewer's\n * local time (\"today 11:46 PM\", \"Fri 11:46 PM\", \"Sep 26, 11:46 PM\" — the\n * wording `describeResetAt` gives resets everywhere else), and the \".;\" / \"..\"\n * that a sentence joined onto another sentence leaves behind is collapsed.\n *\n * For text the server wrote for a person (`ApiError.detail`, action notes,\n * audit summaries, fleet notes): it is shown verbatim otherwise. That matters\n * on the trust surfaces this runs on (approval summaries, the audit trail):\n * a `../../.ssh/authorized_keys` rewritten to `././.ssh/…` would hide the very\n * traversal the operator is deciding about, so only sentence punctuation is\n * ever touched.\n */\nexport function tidyProse(text: string, now: number = Date.now()): string {\n return text\n .replace(ISO_INSTANT_IN_TEXT, (iso) => describeResetAt(iso, now) ?? iso)\n .replace(STOP_BEFORE_SEMICOLON, '$1;')\n .replace(DOUBLED_STOP, '$1.');\n}\n\n/**\n * A sentence ready to be embedded in another one: trimmed, with its own\n * closing period dropped so \"… unavailable: quota exhausted.\" does not become\n * \"quota exhausted..\". An ellipsis is kept — it is not a full stop.\n */\nexport function asClause(text: string): string {\n const trimmed = text.trim();\n if (trimmed.endsWith('...') || trimmed.endsWith('…')) return trimmed;\n return trimmed.replace(/\\.+$/, '');\n}\n\n/**\n * One sentence: trimmed and closed by exactly one full stop — added only when\n * the text does not already end in `.`, `!`, `?` or `…` (a trailing \";\", \",\"\n * or \":\" is dropped first). The fix for \"local Qwen offline..\" when a server\n * reason already carries its own stop. Never re-cased — a sentence may open on\n * a seat id.\n */\nexport function asSentence(text: string): string {\n const t = text.trim().replace(/[\\s;,:]+$/, '');\n if (!t) return '';\n return /[.!?…]$/.test(t) ? t : `${t}.`;\n}\n\n/**\n * What a repo cell shows: the folder's own name for an absolute checkout path\n * (the full path belongs in the cell's `title`), and a `owner/name` slug or a\n * bare name as it came — cutting a slug to its last segment would drop the\n * owner, which is half of what identifies it.\n */\nexport function repoDisplayName(repo: string): string {\n return isAbsolutePath(repo) ? projectName(repo) : repo;\n}\n\nexport function formatUsd(value: number | null | undefined): string {\n if (typeof value !== 'number' || !Number.isFinite(value)) return UNKNOWN;\n return `$${value.toFixed(2)}`;\n}\n\nexport function formatCount(value: number | null | undefined): string {\n if (typeof value !== 'number' || !Number.isFinite(value)) return UNKNOWN;\n return String(value);\n}\n\n/** \"4m 12s\" / \"1h 06m\" / \"12s\" — for durations and countdowns alike. */\nexport function formatDuration(ms: number): string {\n const total = Math.max(0, Math.round(ms / 1000));\n if (total < 60) return `${total}s`;\n const minutes = Math.floor(total / 60);\n const seconds = total % 60;\n if (minutes < 60) return `${minutes}m ${String(seconds).padStart(2, '0')}s`;\n const hours = Math.floor(minutes / 60);\n return `${hours}h ${String(minutes % 60).padStart(2, '0')}m`;\n}\n\n/** Compact age for dense table cells: \"42s\", \"7m\", \"3h\", \"5d\". */\nexport function formatAge(iso: string | null | undefined): string {\n if (!iso) return UNKNOWN;\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return UNKNOWN;\n const seconds = Math.max(0, Math.round((Date.now() - ms) / 1000));\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.round(minutes / 60);\n if (hours < 24) return `${hours}h`;\n return `${Math.round(hours / 24)}d`;\n}\n\nexport function formatRelative(iso: string | null | undefined): string {\n const age = formatAge(iso);\n return age === UNKNOWN ? UNKNOWN : `${age} ago`;\n}\n\n/** Local wall-clock time, for the audit table's second column. */\nexport function formatClock(iso: string | null | undefined): string {\n if (!iso) return UNKNOWN;\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return UNKNOWN;\n return new Date(ms).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n}\n\n/** The viewer's local calendar day as `YYYY-MM-DD` — NOT the UTC slice. */\nexport function localDateKey(at: Date = new Date()): string {\n const y = at.getFullYear();\n const m = String(at.getMonth() + 1).padStart(2, '0');\n const d = String(at.getDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\n/**\n * Is `todayDate` still the current ledger day?\n *\n * The daemon stamps it in UTC (`resetDayIfNeeded` in core/daemon/state.ts is\n * `new Date().toISOString().slice(0, 10)`) but the operator reads the screen\n * in local time, and the two disagree for part of every day at any offset but\n * zero. Comparing against the local day alone would announce \"nothing has been\n * recorded today\" every evening west of UTC — a false alarm on the meter whose\n * whole purpose is to be trustworthy.\n *\n * So either spelling counts as current. That is deliberately conservative: it\n * can call a day current for a few hours after the UTC rollover, and it will\n * never call a genuinely current day stale. The case this exists for is a\n * ledger day weeks old, which neither spelling matches.\n */\nexport function isCurrentLedgerDay(todayDate: string, now: Date = new Date()): boolean {\n return todayDate === localDateKey(now) || todayDate === now.toISOString().slice(0, 10);\n}\n\n/**\n * Time-of-day for a row from today; date + time for anything older.\n *\n * `formatClock` alone is only honest inside a single-day window, and the\n * tables that use it are not one: the audit trail defaults to 200 rows and\n * offers 500, which on a real machine spans days. Two rows reading \"03:12:44\"\n * could be last night and last week, and the only date was in a hover title\n * that a touch viewport never fires.\n */\nexport function formatStamp(iso: string | null | undefined, now: Date = new Date()): string {\n if (!iso) return UNKNOWN;\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return UNKNOWN;\n const at = new Date(ms);\n const clock = at.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n if (localDateKey(at) === localDateKey(now)) return clock;\n const day = at.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n return `${day} ${clock}`;\n}\n\n/** Human tick interval, e.g. \"every 15m\". */\nexport function formatInterval(intervalMs: number | null | undefined): string {\n if (typeof intervalMs !== 'number' || !Number.isFinite(intervalMs) || intervalMs <= 0) return UNKNOWN;\n // A configured interval is a round number far more often than not; \"every\n // 15m\" reads better than \"every 15m 00s\" and loses nothing when it isn't.\n return `every ${formatDuration(intervalMs).replace(/ 00[ms]$/, '')}`;\n}\n\nexport type BudgetState = 'stopped' | 'unknown' | 'ok' | 'warn' | 'over';\n\nexport interface BudgetMeter {\n state: BudgetState;\n /** 0-100, clamped. Null when there is nothing honest to draw. */\n percent: number | null;\n /** One line: \"$4.50 of $25.00 today · 18%\". */\n label: string;\n /** The plain-language verdict shown next to the meter. */\n note: string;\n}\n\nconst BUDGET_WARN_PERCENT = 70;\n\n/**\n * Today's spend against the configured daily cap, as ONE line.\n *\n * A cap of exactly 0 is the contract's guard rail: it means the loop is\n * stopped, and it must never render as an empty (i.e. \"plenty left\") meter.\n *\n * `todayDate` is the ledger day `spend.todayUsd` was counted for. It is NOT\n * optional decoration: the daemon writes the figure once per day and leaves it\n * there, so a machine that last ticked three weeks ago answers\n * `{todayUsd: 0, todayDate: \"2026-09-01\"}`. Rendering that as \"$0.00 of $50.00\n * today\" is a fabricated statement about today on the one number an operator\n * checks before walking away from an autonomous loop. Pass `null` only when\n * the source genuinely has no date to offer (the legacy daemon observation).\n */\nexport function budgetMeter(\n spentUsd: number | null | undefined,\n capUsd: number | null | undefined,\n todayDate?: string | null,\n now: Date = new Date(),\n): BudgetMeter {\n const spend = typeof spentUsd === 'number' && Number.isFinite(spentUsd) ? Math.max(0, spentUsd) : null;\n const cap = typeof capUsd === 'number' && Number.isFinite(capUsd) ? capUsd : null;\n // A cap of 0 is a statement about configuration, not about the ledger, so\n // it still reads true on a stale day and is checked first.\n const stale = typeof todayDate === 'string' && !isCurrentLedgerDay(todayDate, now);\n\n if (cap === 0) {\n return {\n state: 'stopped',\n percent: 100,\n label: `${formatUsd(spend)} spent today · budget $0.00`,\n note: 'Daily budget is $0 — the loop is stopped.',\n };\n }\n if (stale) {\n return {\n state: 'unknown',\n percent: null,\n label: `${UNKNOWN} spent today · budget ${formatUsd(cap)}`,\n // \"Sep 1\", not \"2026-09-01\": the ledger day is a calendar date, so it is\n // read as one (formatDayLabel parses it in UTC and cannot shift a day).\n note: `Nothing has been recorded today — the last ledger day is ${formatDayLabel(todayDate)}.`,\n };\n }\n if (cap === null || spend === null) {\n return {\n state: 'unknown',\n percent: null,\n label: cap === null ? `${formatUsd(spend)} spent today · budget ${UNKNOWN}` : `${UNKNOWN} spent today · budget ${formatUsd(cap)}`,\n note: cap === null ? 'Daily budget is not configured.' : \"Today's spend is not observable right now.\",\n };\n }\n\n const raw = (spend / cap) * 100;\n const percent = Math.min(100, Math.round(raw));\n const state: BudgetState = raw >= 100 ? 'over' : raw >= BUDGET_WARN_PERCENT ? 'warn' : 'ok';\n return {\n state,\n percent,\n // The text follows the one percent rule (\"<1%\", \"99%\" short of the cap); `percent` (the bar) stays numeric.\n label: `${formatUsd(spend)} of ${formatUsd(cap)} today · ${percentText((spend / cap) * 100)}`,\n note:\n state === 'over'\n ? 'Daily budget reached — the loop idles until the date rolls over.'\n : state === 'warn'\n ? `${formatUsd(cap - spend)} left before the loop idles today.`\n : `${formatUsd(cap - spend)} left today.`,\n };\n}\n\n/** Epoch ms of the next expected tick, or null when it cannot be derived. */\nexport function nextTickAt(lastTickAt: string | null | undefined, intervalMs: number | null | undefined): number | null {\n if (!lastTickAt) return null;\n const last = Date.parse(lastTickAt);\n if (Number.isNaN(last)) return null;\n if (typeof intervalMs !== 'number' || !Number.isFinite(intervalMs) || intervalMs <= 0) return null;\n return last + intervalMs;\n}\n\n/** \"in 4m 12s\" / \"due now\" / \"overdue by 2m 03s\". */\nexport function countdownLabel(nextAt: number | null, now: number): string {\n if (nextAt === null) return UNKNOWN;\n const delta = nextAt - now;\n if (delta > 1000) return `in ${formatDuration(delta)}`;\n if (delta > -1000) return 'due now';\n return `overdue by ${formatDuration(-delta)}`;\n}\n\n/** Last tick outcome, phrased the way a person would say it out loud. */\nexport function describeTickOutcome(reason: string | null | undefined): { label: string; tone: 'success' | 'warning' | 'danger' | 'neutral' | 'unknown' } {\n if (!reason) return { label: 'no tick recorded', tone: 'unknown' };\n switch (reason) {\n case 'ok':\n return { label: 'ok', tone: 'success' };\n case 'kill-switch':\n return { label: 'refused — emergency stop engaged', tone: 'danger' };\n case 'budget-exhausted':\n return { label: 'stopped — daily budget spent', tone: 'warning' };\n case 'no-enrolled-repos':\n return { label: 'nothing to do — no repos enrolled', tone: 'warning' };\n case 'no-backlog':\n return { label: 'nothing to do — backlog empty', tone: 'neutral' };\n case 'dry-run':\n return { label: 'dry run', tone: 'neutral' };\n default:\n return { label: reason, tone: 'neutral' };\n }\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as e,c as t,n,r}from"./index-QesfXBsb.js";var i=t(e(),1),a={data:void 0,error:void 0,status:`idle`,updatedAt:null},o=new Map,s=0,c=[],l=0,u=0;function ee(){--s;let e=c.shift();e&&e()}function te(e){let t=()=>{let t=u;s+=1,s>l&&(l=s);let n=()=>{t===u&&ee()},r;try{r=e()}catch(e){return n(),Promise.reject(e instanceof Error?e:Error(String(e)))}return r.then(e=>(n(),e),e=>{throw n(),e})};return s<4?t():new Promise((e,n)=>{c.push(()=>{t().then(e,n)})})}function ne(){u+=1,s=0,l=0;for(let e of c.splice(0))e()}function re(){return{active:s,queued:c.length,peak:l}}function d(e){let t=o.get(e);return t||(t={snapshot:a,inFlight:null,fetcher:null,subscribers:new Set,issued:0,issuedAt:0,applied:0},o.set(e,t)),t}function f(e,t){e.snapshot={...e.snapshot,...t}}function p(e){let t=o.get(e);if(t)for(let e of t.subscribers)e()}function m(e,t){if(Object.is(e,t))return!0;if(typeof e!=typeof t||e===null||t===null||typeof e!=`object`||Array.isArray(e)!==Array.isArray(t))return!1;if(Array.isArray(e)&&Array.isArray(t))return e.length===t.length&&e.every((e,n)=>m(e,t[n]));let n=e,r=t,i=Object.keys(n);return i.length===Object.keys(r).length&&i.every(e=>Object.prototype.hasOwnProperty.call(r,e)&&m(n[e],r[e]))}function ie(e,t){let n=d(e);return n.subscribers.add(t),()=>{n.subscribers.delete(t)}}function ae(e){return d(e).snapshot}function oe(e,t){return e.snapshot.updatedAt===null||e.snapshot.status===`error`?!1:Date.now()-e.snapshot.updatedAt<t}function se(e,t){return e.inFlight===null?!1:t.joinWindowMs===void 0||Date.now()-e.issuedAt<t.joinWindowMs}function ce(e,t,n){let r=d(e);if(r.fetcher=t,!n.force){if(se(r,n))return r.inFlight;if(n.maxAgeMs!==void 0&&oe(r,n.maxAgeMs))return Promise.resolve()}let i=r.issued+=1;r.issuedAt=Date.now(),f(r,{status:r.snapshot.data===void 0?`loading`:`refreshing`}),p(e);let a=te(t).then(e=>{if(i<r.applied)return;r.applied=i;let t=r.snapshot.data!==void 0&&m(r.snapshot.data,e);f(r,{data:t?r.snapshot.data:e,error:void 0,status:`success`,updatedAt:Date.now()})}).catch(e=>{i<r.applied||(r.applied=i,f(r,{error:e instanceof Error?e:Error(String(e)),status:`error`}))}).finally(()=>{r.issued===i&&(r.inFlight=null),p(e)});return r.inFlight=a,a}function le(e,t){return ce(e,t,{})}function ue(e,t,n){return ce(e,t,{maxAgeMs:n})}function h(e,t,n=!1){return ce(e,t,n?{force:!0}:{joinWindowMs:250})}function g(e){let t=o.get(e);t&&t.fetcher&&le(e,t.fetcher)}function _(e){for(let t of o.keys())t.startsWith(e)&&g(t)}function de(e){for(let[t,n]of o)n.subscribers.size>0&&t.startsWith(e)&&g(t)}function fe(e,t){t.snapshot=a,t.fetcher=null,t.inFlight=null,t.issued+=1,t.applied=t.issued,p(e)}function pe(){ne();for(let[e,t]of[...o]){if(t.subscribers.size===0){o.delete(e);continue}fe(e,t)}}var v=`ashlr.verse.drafts.v1`,y=`ashlr.verse.sent.v1`,me=40,b=65536;function x(e,t){let n={};try{let r=localStorage.getItem(e),i=r?JSON.parse(r):null;if(i&&typeof i==`object`&&!Array.isArray(i))for(let[e,r]of Object.entries(i)){let i=t(r);i!==null&&(n[e]=i)}}catch{}return n}function S(e,t){let n=Object.keys(t);for(let e of n.slice(0,Math.max(0,n.length-me)))delete t[e];try{return localStorage.setItem(e,JSON.stringify(t)),!0}catch{return!1}}var C=e=>typeof e==`string`&&e.length>0?e.slice(0,b):null,he=e=>{if(!Array.isArray(e))return null;let t=e.filter(e=>typeof e==`string`&&e.length>0).slice(-25).map(e=>e.slice(0,b));return t.length>0?t:null},w=new Map;function ge(e){if(!e)return``;let t=w.get(e);return t===void 0?x(v,C)[e]??``:t}function _e(e,t){if(!e)return;let n=t.trim().length>0?t.slice(0,b):``,r=x(v,C);if(delete r[e],n&&(r[e]=n),w.delete(e),!S(v,r)){w.set(e,n);for(let e of[...w.keys()].slice(0,Math.max(0,w.size-me)))w.delete(e)}}function ve(e){return e?x(y,he)[e]??[]:[]}function ye(e,t){if(!e||t.trim().length===0)return;let n=x(y,he),r=n[e]??[];delete n[e],n[e]=(r[r.length-1]===t?r:[...r,t.slice(0,b)]).slice(-25),S(y,n)}function be(e){if(e){w.delete(e);for(let[t,n]of[[v,C],[y,he]]){let r=x(t,n);e in r&&(delete r[e],S(t,r))}}}function xe(){w.clear();for(let e of[v,y])try{localStorage.removeItem(e)}catch{}}var Se=`ashlr.readClientProof.v1`,Ce=/^[a-f0-9]{64}$/,we=12e5;function Te(){let e=new Uint8Array(32);return crypto.getRandomValues(e),Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``)}function Ee(){try{let e=sessionStorage.getItem(Se);if(e&&Ce.test(e))return e}catch{}let e=Te();try{sessionStorage.setItem(Se,e)}catch{}return e}var De=Ee(),T=null,E=null,Oe=!1,D=null,O=null,k=null,A={phase:`checking`,checked:!1,mutationTokenHeldUntil:null},j=new Set;function ke(){for(let e of j)e()}function M(e){A={...A,...e},ke()}function N(e){return j.add(e),()=>j.delete(e)}function P(){return A}function F(){return De}async function I(e){let t=e.trim();if(!/^[a-f0-9]{64}$/.test(t))throw Error(`That does not look like a read token — expected 64 hex characters.`);let n=await fetch(`/api/session`,{method:`POST`,credentials:`same-origin`,headers:{"x-ashlr-token":t,"x-ashlr-read-client":De}});if(n.status===204){D=t,M({phase:`authenticated`,checked:!0});return}throw n.status===401?Error(`Server rejected that token. Double-check the read token printed by this server at startup.`):Error(`Unexpected response establishing session (HTTP ${n.status}).`)}async function Ae(){try{await fetch(`/api/session`,{method:`DELETE`,credentials:`same-origin`,headers:{"x-ashlr-read-client":De}})}catch{}D=null,k=null,L()}function L(){V(),pe(),xe(),M({phase:`unauthenticated`,checked:!0})}function R(){if(A.phase===`authenticated`){if(D){je();return}L()}}function je(){if(O)return O;let e=D;return e?(O=(async()=>{try{return await I(e),de(``),!0}catch{return D=null,k=null,L(),!1}finally{O=null}})(),O):Promise.resolve(!1)}function Me(e){M({phase:e?`authenticated`:`unauthenticated`,checked:!0})}function Ne(){let e=window.__ASHLR_TOKENS__;if(e&&typeof e==`object`){try{delete window.__ASHLR_TOKENS__}catch{window.__ASHLR_TOKENS__=void 0}typeof e.readToken==`string`&&(k={readToken:e.readToken,...typeof e.token==`string`?{token:e.token}:{}})}return k?{...k}:null}async function Pe(){let e=Ne();if(!e)return!1;try{await I(e.readToken)}catch{return k=null,!1}return e.token&&/^[a-f0-9]{64}$/.test(e.token.trim())&&z(e.token.trim(),{host:!0}),!0}function Fe(){return T}function Ie(){return T!==null}function Le(){E&&clearTimeout(E),E=setTimeout(()=>{Oe&&T!==null?B():V()},we)}function z(e,t={}){T=e,Oe=t.host===!0,M({mutationTokenHeldUntil:Date.now()+we}),Le()}function B(){T!==null&&(M({mutationTokenHeldUntil:Date.now()+we}),Le())}function V(){T=null,Oe=!1,E&&=(clearTimeout(E),null),M({mutationTokenHeldUntil:null})}var Re=[`runs`,`swarms`,`inbox`,`daemon`,`daemon-observation`,`fleet-activity-ping`,`fleet-activity-observation`,`snapshot`,`session-expired`],ze={runs:[`runs`],swarms:[`swarms`],inbox:[`inbox`],daemon:[`daemon`,`control-snapshot`,`verse-control`,`verse-usage-control`,`verse-caps`],"daemon-observation":[`daemon`,`control-snapshot`,`verse-control`,`verse-usage-control`,`verse-caps`],"fleet-activity-ping":[`fleet-activity`,`fleet`],"fleet-activity-observation":[`fleet-activity`,`fleet`],snapshot:[`dashboard-snapshot`,`agent-os-snapshot`],"session-expired":[]},Be=new Map,H=null,U=null,W=0;function Ve(){return Math.min(1e3*2**W,15e3)}function G(){H&&=(H.close(),null),U&&=(clearTimeout(U),null)}function He(){U||=setTimeout(()=>{U=null,W+=1,Ue()},Ve())}function Ue(){if(r()){G();return}if(P().phase!==`authenticated`)return;G();let e=`/api/events?client=${encodeURIComponent(F())}`,t=new EventSource(e,{withCredentials:!0});H=t,t.onopen=()=>{W=0};for(let e of Re)t.addEventListener(e,t=>{let n=t,r;try{r=JSON.parse(n.data)}catch{r=void 0}for(let t of ze[e])g(t);e===`inbox`&&(_(`inbox-list:`),_(`proposal-detail-`)),e===`session-expired`&&R();let i=Be.get(e);if(i)for(let e of i)e(r)});t.onerror=()=>{t.close(),H===t&&(H=null),P().phase===`authenticated`&&He()}}N(()=>{P().phase===`authenticated`?(W=0,Ue()):G()});var We=`ashlr.theme.v1`;function Ge(e){let t=document.documentElement;e===`system`?t.removeAttribute(`data-theme`):t.setAttribute(`data-theme`,e)}function Ke(){try{let e=localStorage.getItem(We);if(e===`light`||e===`dark`||e===`system`)return e}catch{}return`system`}var K=Ke();Ge(K);var qe=new Set;function Je(){for(let e of qe)e()}function Ye(e){return qe.add(e),()=>qe.delete(e)}function q(){return K}function J(e){K=e,Ge(K);try{localStorage.setItem(We,K)}catch{}Je()}function Xe(){J(K===`system`?`light`:K===`light`?`dark`:`system`)}var Ze=`ashlr.verse.appearance.v1`,Qe=30,$e=78,Y={h:245,s:72,l:58};function et(){try{return typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}catch{return!1}}function tt(){return{theme:`system`,accentH:Y.h,accentS:Y.s,accentL:Y.l,density:`comfortable`,uiScale:`default`,displayFont:`grotesk`,radius:`default`,motion:`system`,reduceMotion:et()}}function nt(e){return e===`system`||e===`reduce`||e===`full`}function rt(e){return e===`reduce`||e!==`full`&&et()}var it=(e,t,n)=>Math.min(n,Math.max(t,e));function at(e){return e===`comfortable`||e===`compact`}function ot(e){return e==="default"||e===`large`||e===`xlarge`}function st(e){return e===`grotesk`||e===`ui`||e===`mono`}function ct(e){return e===`sharp`||e==="default"||e===`soft`}function lt(e,t){let n={...e,...t},r=t.reduceMotion,i=nt(t.motion)?t.motion:typeof r==`boolean`?r?`reduce`:`full`:nt(e.motion)?e.motion:`system`;return{theme:n.theme===`light`||n.theme===`dark`?n.theme:`system`,accentH:Number.isFinite(n.accentH)?(Math.round(n.accentH)%360+360)%360:Y.h,accentS:Number.isFinite(n.accentS)?it(Math.round(n.accentS),0,100):Y.s,accentL:Number.isFinite(n.accentL)?it(Math.round(n.accentL),Qe,$e):Y.l,density:at(n.density)?n.density:`comfortable`,uiScale:ot(n.uiScale)?n.uiScale:`default`,displayFont:st(n.displayFont)?n.displayFont:`grotesk`,radius:ct(n.radius)?n.radius:`default`,motion:i,reduceMotion:rt(i)}}function ut(){let e=tt(),t={};try{let e=localStorage.getItem(Ze);if(e){let n=JSON.parse(e);n&&typeof n==`object`&&(t=n)}}catch{}let{reduceMotion:n,...r}=t;return lt(e,{...r,theme:q()})}function dt(e){try{let{theme:t,reduceMotion:n,...r}=e;localStorage.setItem(Ze,JSON.stringify(r))}catch{}}var ft={grotesk:null,ui:`var(--font-ui)`,mono:`var(--font-mono)`};function pt(e){if(typeof document>`u`)return;let t=document.documentElement;t.style.setProperty(`--accent-h`,String(e.accentH)),t.style.setProperty(`--accent-s`,`${e.accentS}%`),t.style.setProperty(`--accent-l`,`${e.accentL}%`);let n=ft[e.displayFont];n===null?t.style.removeProperty(`--font-display`):t.style.setProperty(`--font-display`,n),t.setAttribute(`data-density`,e.density),t.setAttribute(`data-ui-scale`,e.uiScale),t.setAttribute(`data-radius`,e.radius),e.motion===`system`?t.removeAttribute(`data-motion`):t.setAttribute(`data-motion`,e.motion)}var X=ut();pt(X);var mt=new Set;function ht(){for(let e of mt)e()}Ye(()=>{X.theme!==q()&&(X={...X,theme:q()},ht())});function gt(e){return mt.add(e),()=>mt.delete(e)}function _t(){return X}function vt(e){let t=lt(X,e),n=t.theme!==X.theme;X=t,pt(X),dt(X),n&&J(X.theme),ht()}function yt(){try{localStorage.removeItem(Ze)}catch{}X=tt(),pt(X),J(`system`),ht()}var bt={min:Qe,max:$e};function xt(e,t){let n=t?.freshMs??1e4,r=(0,i.useSyncExternalStore)((0,i.useCallback)(t=>ie(e.key,t),[e.key]),()=>ae(e.key),()=>ae(e.key));return(0,i.useEffect)(()=>{ue(e.key,()=>e.fetch(),n)},[e.key,n]),r}function St(e){return(0,i.useCallback)(()=>{h(e.key,()=>e.fetch())},[e])}function Ct(e){return(0,i.useCallback)(()=>{h(e.key,()=>e.fetch(),!0)},[e])}function wt(){return(0,i.useSyncExternalStore)(N,()=>P().phase,()=>P().phase)}function Tt(){let e=(0,i.useSyncExternalStore)(N,()=>P().mutationTokenHeldUntil,()=>P().mutationTokenHeldUntil);return{hasHold:Ie(),token:Fe(),heldUntil:e,setToken:z,touch:B,clear:V}}function Et(){return{theme:(0,i.useSyncExternalStore)(Ye,q,q),set:J,cycle:Xe}}function Dt(){return{appearance:(0,i.useSyncExternalStore)(gt,_t,_t),set:vt,reset:yt}}var Z=class extends Error{status;path;detail;code;constructor(e,t,n,r=null,i=null){super(e),this.status=t,this.path=n,this.detail=r,this.code=i,this.name=`ApiError`}},Ot=class extends Z{constructor(e){super(`This server was started without --allow-dispatch, so mutations are disabled.`,404,e),this.name=`DispatchDisabledError`}};async function kt(e,t){let n=await fetch(e,{method:`GET`,credentials:`same-origin`,headers:{"x-ashlr-read-client":F()},signal:t});if(n.status===401)throw R(),new Z(`Read session expired.`,401,e);if(!n.ok){let{detail:t,code:r}=await jt(n);throw new Z(`GET ${e} failed (HTTP ${n.status}).`,n.status,e,t||null,r)}return await n.json()}async function At(e,t,n,r){let i=await fetch(e,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/json`,"x-ashlr-token":n},body:JSON.stringify(t??{}),signal:r});if(i.status===401)throw new Z(`Mutation token was rejected.`,401,e);if(!i.ok){let{detail:t,code:n}=await jt(i);throw i.status===404&&n===null?new Ot(e):new Z(`POST ${e} failed (HTTP ${i.status})${t?`: ${t}`:``}.`,i.status,e,t||null,n)}if(i.status!==204)return await i.json()}async function jt(e){try{let t=await e.json();return{detail:typeof t.error==`string`&&t.error?t.error:typeof t.note==`string`?t.note:``,code:typeof t.code==`string`&&t.code?t.code:null}}catch{return{detail:``,code:null}}}var Q={grid:`_grid_x7p2y_1`,card:`_card_x7p2y_10`,title:`_title_x7p2y_19`,stat:`_stat_x7p2y_25`,caption:`_caption_x7p2y_31`,line:`_line_x7p2y_37`,row:`_row_x7p2y_42`,cell:`_cell_x7p2y_51`},$=n();function Mt({width:e=`100%`}){return(0,$.jsx)(`div`,{className:`skeleton ${Q.line}`,style:{width:e}})}function Nt(){return(0,$.jsxs)(`div`,{className:Q.card,children:[(0,$.jsx)(`div`,{className:`skeleton ${Q.title}`}),(0,$.jsx)(`div`,{className:`skeleton ${Q.stat}`}),(0,$.jsx)(`div`,{className:`skeleton ${Q.caption}`})]})}function Pt(){return(0,$.jsxs)(`div`,{className:Q.row,children:[(0,$.jsx)(`div`,{className:`skeleton ${Q.cell}`,style:{width:`18%`}}),(0,$.jsx)(`div`,{className:`skeleton ${Q.cell}`,style:{width:`38%`}}),(0,$.jsx)(`div`,{className:`skeleton ${Q.cell}`,style:{width:`14%`}}),(0,$.jsx)(`div`,{className:`skeleton ${Q.cell}`,style:{width:`10%`}})]})}function Ft({count:e=4}){return(0,$.jsx)(`div`,{className:Q.grid,children:Array.from({length:e},(e,t)=>(0,$.jsx)(Nt,{},t))})}var It={skipLink:`_skipLink_1uply_1`};function Lt(){return(0,$.jsx)(`button`,{type:`button`,className:It.skipLink,onClick:()=>{let e=document.getElementById(`main-content`);e?.focus(),e?.scrollIntoView({block:`start`})},children:`Skip to content`})}export{je as A,ue as B,Ae as C,F as D,Fe as E,be as F,h as G,g as H,ge as I,le as K,ve as L,z as M,N,Ie as O,B as P,ye as R,V as S,P as T,_ as U,ae as V,re as W,bt as _,Pt as a,Xe as b,kt as c,wt as d,Tt as f,Et as g,Ct as h,Mt as i,R as j,Me as k,At as l,St as m,Nt as n,Z as o,xt as p,ie as q,Ft as r,Ot as s,Lt as t,Dt as u,tt as v,I as w,Pe as x,_t as y,_e as z};
2
- //# sourceMappingURL=global-CNNGMril.js.map
@@ -1,2 +0,0 @@
1
- import{E as e,P as t,l as n,o as r}from"./global-CNNGMril.js";import{B as i,F as a,P as o,a as s}from"./VerseConsoleApp-BCY5uSok.js";function c(t){let n=e();if(!n)throw new r(`Mutation token was rejected.`,401,t);return n}async function l(){await a();let e=o().data?.running??[];if(e.length===0){i(`Nothing is running.`,`neutral`);return}c(`/api/verse/sessions`);let n=await Promise.allSettled(e.map(e=>s(e.sessionId)));t();let r=n.filter(e=>e.status===`rejected`).length;if(a(),r>0)throw Error(`Stopped ${e.length-r} of ${e.length} chats; ${r} did not answer.`);i(e.length===1?`Stopped 1 chat.`:`Stopped ${e.length} chats.`,`success`)}async function u(){let e=c(`/api/verse/authority`),o=null;try{o=await n(`/api/verse/authority`,{action:`stop`},e)}catch(t){if(!(t instanceof r&&t.status===404&&t.code===null))throw t;await n(`/api/verse/daemon`,{action:`stop`},e)}t(),a(),i(d(o),`success`)}function d(e){let t=`Fleet stopped. It stays stopped until you resume it.`,n=e?.result?.stop;if(typeof n!=`object`||!n)return t;let{quiesced:r,liveExecutionLeases:i,mergeRevokeFailures:a}=n,o=[t];if(r===!1){let e=typeof i==`number`&&Number.isFinite(i)&&i>0?i:null;o.push(e===null?`Agents already running are finishing.`:`${e} agent${e===1?` is`:`s are`} still finishing work started before Stop.`)}if(Array.isArray(a)&&a.length>0){let e=a.length;o.push(`${e} armed merge${e===1?``:`s`} could not be revoked; Stop still blocks ${e===1?`it`:`them`}.`)}return o.join(` `)}var f={"chats.stop-all":l,"fleet.stop":u};function p(e){let t=f[e];return t?t():Promise.reject(Error(`No shell runner for ${e}.`))}export{p as runGuardedShellCommand};
2
- //# sourceMappingURL=guarded-runners-DPh2d32e.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"live-model-De-q0ZFK.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/fleet/live-model.ts"],"sourcesContent":["/**\n * routes/verse/fleet/live-model.ts — FleetLiveSnapshotV1 → chart props\n * (unit C7; SPEC-310B §6 Fleet, SPEC-310C §5). Shared by Command's 12 h\n * swimlane and every Fleet card, so both make the same decisions:\n *\n * - rows are LANES × SLOTS: runs overlapping in one lane stack into\n * numbered slot rows (\"Grok · 2\"), so a bar never hides behind another;\n * - bar colour is STATUS (running amber, merged green, reverted red …);\n * the lane's ENGINE is the tick + monogram beside its label;\n * - queued and parked work draws as an outline (it holds a place; nothing\n * runs) — the Parked Gantt runs from \"parked since\" to `nextEligibleAt`,\n * and an unknown `nextEligibleAt` stays open-ended with \"unknown\" in words.\n *\n * Framework-free; tested directly.\n */\nimport type { FleetEngine, FleetGateFunnel, FleetLaneState, FleetLiveRun, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { SeatDecision } from '../../../../core/routing/types.js';\nimport type { ChartEngine, ChartTone } from '../../../components/charts/colors.js';\nimport { CHART_NEUTRAL, seriesColor } from '../../../components/charts/colors.js';\nimport type { SwimlaneLane } from '../../../components/charts/Swimlane.js';\nimport type { FunnelStage } from '../../../components/charts/Funnel.js';\nimport type { BarStackSegment } from '../../../components/charts/BarStack.js';\nimport { laneReasonText, localTimes } from './why-seat-model.js';\n\nexport const LANE_ENGINE: Readonly<Record<FleetEngine, ChartEngine>> = {\n local: 'local',\n 'grok-cli': 'grok',\n 'claude-cli': 'claude',\n codex: 'codex',\n};\n\nexport const LANE_LABEL: Readonly<Record<FleetEngine, string>> = {\n local: 'Local',\n 'grok-cli': 'Grok',\n 'claude-cli': 'Claude',\n codex: 'Codex',\n};\n\n/** A lane chip's words: \"Local · off\", \"Grok · 1/2\". The why is a separate line (`laneNotes`). */\nexport function laneChipText(lane: FleetLaneState): { name: string; slots: string } {\n return { name: LANE_LABEL[lane.lane], slots: lane.slots === 0 ? 'off' : `${lane.busy}/${lane.slots}` };\n}\n\nexport interface LaneNote {\n /** The lanes this reason applies to, in strip order. */\n lanes: FleetEngine[];\n /** True when every lane shares it — then it is said once, without names. */\n all: boolean;\n reason: string;\n}\n\n/** A lane's cap reason as the operator reads it (`laneReasonText`); null when it has none. */\nexport function laneReason(lane: FleetLaneState): string | null {\n const reason = lane.capReason?.trim();\n return reason ? laneReasonText(reason) : null;\n}\n\n/**\n * Each distinct lane cap reason ONCE, with the lanes it covers, in plain\n * words (the router's \"slot(s)\" and \"class-B action\" never reach the\n * operator). A dark fleet gives every lane the same sentence; 3.10.0\n * repeated it inside every chip and truncated it there.\n */\nexport function laneNotes(lanes: readonly FleetLaneState[]): LaneNote[] {\n const byReason = new Map<string, FleetEngine[]>();\n for (const lane of lanes) {\n const reason = laneReason(lane);\n if (!reason) continue;\n const list = byReason.get(reason) ?? [];\n list.push(lane.lane);\n byReason.set(reason, list);\n }\n return [...byReason.entries()].map(([reason, covered]) => ({\n lanes: covered,\n all: covered.length === lanes.length && lanes.length > 1,\n reason,\n }));\n}\n\n/** The word a bar is labelled with: the outcome once it ended, else the phase. */\nexport function runStatus(run: FleetLiveRun): string {\n if (run.phase === 'queued' || run.phase === 'parked') return run.phase;\n if (run.phase === 'reverting') return 'reverting';\n return run.outcome ?? run.phase;\n}\n\nconst TONES: Readonly<Record<string, ChartTone>> = {\n producing: 'running',\n verifying: 'running',\n judging: 'running',\n landing: 'running',\n watching: 'info',\n reverting: 'danger',\n merged: 'success',\n proposed: 'info',\n 'owner-lane': 'warning',\n refused: 'warning',\n failed: 'danger',\n reverted: 'danger',\n cancelled: 'neutral',\n queued: 'neutral',\n parked: 'neutral',\n};\n\nexport function runTone(status: string): ChartTone {\n return TONES[status] ?? 'unknown';\n}\n\nfunction startOf(run: FleetLiveRun): number | null {\n const t = Date.parse(run.startedAt ?? run.phaseStartedAt ?? '');\n return Number.isFinite(t) ? t : null;\n}\n\nfunction endOf(run: FleetLiveRun): number | null {\n if (!run.endedAt) return null;\n const t = Date.parse(run.endedAt);\n return Number.isFinite(t) ? t : null;\n}\n\nfunction runDetail(run: FleetLiveRun): string {\n const where = run.repo.includes('/') ? run.repo.split('/')[1] : run.repo;\n return [where, run.title, run.model, run.prNumber ? `PR #${run.prNumber}` : null].filter(Boolean).join(' · ');\n}\n\nconst LANE_ORDER: readonly (FleetEngine | 'none')[] = ['local', 'grok-cli', 'claude-cli', 'codex', 'none'];\n\n/**\n * Runs within [from, now] packed into lane × slot rows. `parkedAsGantt`\n * leaves parked runs out (the Fleet surface draws them in their own Gantt);\n * Command keeps them in, as outlines.\n */\nexport function laneRows(runs: readonly FleetLiveRun[], from: number, now: number, opts: { includeParked?: boolean } = {}): SwimlaneLane[] {\n const includeParked = opts.includeParked ?? true;\n const byLane = new Map<FleetEngine | 'none', FleetLiveRun[]>();\n for (const run of runs) {\n if (!includeParked && run.phase === 'parked') continue;\n const s = startOf(run);\n if (s === null) continue;\n const e = endOf(run) ?? now;\n if (e < from || s > now) continue;\n const key = run.lane ?? 'none';\n if (!byLane.has(key)) byLane.set(key, []);\n byLane.get(key)!.push(run);\n }\n const lanes: SwimlaneLane[] = [];\n for (const key of LANE_ORDER) {\n const list = byLane.get(key);\n if (!list?.length) continue;\n list.sort((a, b) => startOf(a)! - startOf(b)!);\n const slotEnds: number[] = [];\n const slotItems: FleetLiveRun[][] = [];\n for (const run of list) {\n const s = startOf(run)!;\n const e = endOf(run) ?? now;\n let slot = slotEnds.findIndex((end) => end <= s);\n if (slot === -1) {\n slot = slotEnds.length;\n slotEnds.push(e);\n slotItems.push([]);\n } else {\n slotEnds[slot] = e;\n }\n slotItems[slot]!.push(run);\n }\n const name = key === 'none' ? 'Unassigned' : LANE_LABEL[key];\n slotItems.forEach((items, i) => {\n lanes.push({\n id: `${key}:${i}`,\n label: slotItems.length > 1 ? `${name} · ${i + 1}` : name,\n ...(key === 'none' ? {} : { engine: LANE_ENGINE[key] }),\n items: items.map((run) => ({\n id: run.id,\n start: startOf(run)!,\n end: endOf(run),\n status: runStatus(run),\n detail: runDetail(run),\n })),\n });\n });\n }\n return lanes;\n}\n\nexport interface GanttRow {\n lanes: SwimlaneLane[];\n from: number;\n to: number;\n /** Rows whose release time is unknown (drawn open-ended). */\n unknownRelease: number;\n}\n\n/**\n * The Parked Gantt: one row per parked item, from when it parked to when its\n * seat should free up. The window always shows \"now\" plus the furthest known\n * release (capped at 48 h — a week-long wait still reads, it just runs off\n * the right edge and the table carries the exact time).\n */\nexport function parkedGantt(runs: readonly FleetLiveRun[], now: number): GanttRow {\n const parked = runs.filter((r) => r.phase === 'parked' || r.hold !== null);\n const releases = parked.map((r) => (r.hold?.nextEligibleAt ? Date.parse(r.hold.nextEligibleAt) : NaN)).filter(Number.isFinite);\n const starts = parked.map((r) => startOf(r) ?? now);\n const from = Math.min(now - 60 * 60_000, ...starts);\n const to = Math.min(now + 48 * 3_600_000, Math.max(now + 2 * 3_600_000, ...releases));\n let unknownRelease = 0;\n const lanes: SwimlaneLane[] = parked.map((r) => {\n const release = r.hold?.nextEligibleAt ? Date.parse(r.hold.nextEligibleAt) : NaN;\n if (!Number.isFinite(release)) unknownRelease++;\n const where = r.repo.includes('/') ? r.repo.split('/')[1] : r.repo;\n return {\n id: r.id,\n label: `${where}: ${r.title}`,\n ...(r.lane ? { engine: LANE_ENGINE[r.lane] } : {}),\n items: [{\n id: r.id,\n start: startOf(r) ?? now,\n end: Number.isFinite(release) ? release : null,\n status: r.hold?.kind === 'split' ? 'split' : 'parked',\n outline: true,\n detail: `${localTimes(r.hold?.reason ?? 'parked', now)}${Number.isFinite(release) ? '' : ' · release time unknown'}`,\n }],\n };\n });\n return { lanes, from, to, unknownRelease };\n}\n\n// ---------------------------------------------------------------------------\n// Gate funnel + refusal reasons\n// ---------------------------------------------------------------------------\n\n/** Gate names in operator words (the funnel's stage labels). */\nexport const GATE_LABEL: Readonly<Record<string, string>> = {\n G0: 'Authority',\n G1: 'Protected paths',\n G1b: 'Tamper',\n G2: 'Scope',\n G3: 'Verify',\n G4: 'Claims',\n G5: 'Blast radius',\n G6: 'Judge',\n G7: 'GitHub checks',\n};\n\n/** Entered G0, then how many passed each gate — a strictly narrowing pipeline. */\nexport function funnelStages(funnel: FleetGateFunnel | null): FunnelStage[] {\n if (!funnel || funnel.stages.length === 0) return [];\n return [\n { id: 'entered', label: 'Proposals', value: funnel.stages[0]!.entered },\n ...funnel.stages.map((s) => ({ id: s.gate, label: `${s.gate} ${GATE_LABEL[s.gate] ?? ''}`.trim(), value: s.passed })),\n ];\n}\n\nexport interface RefusalStack {\n categories: string[];\n segments: BarStackSegment[];\n values: (number | null)[][];\n total: number;\n}\n\n/**\n * Refusals per gate, stacked by reason. The top five reasons (by count over\n * the window) keep FIXED identity slots — a reason's colour never changes\n * when another is filtered out — and the rest fold into a neutral \"Other\".\n */\nexport function refusalStack(funnel: FleetGateFunnel | null, topN = 5): RefusalStack {\n if (!funnel) return { categories: [], segments: [], values: [], total: 0 };\n const totals = new Map<string, { reason: string; count: number }>();\n for (const s of funnel.stages) for (const r of s.refusals) {\n const prev = totals.get(r.code);\n totals.set(r.code, { reason: prev?.reason ?? r.reason, count: (prev?.count ?? 0) + r.count });\n }\n const ranked = [...totals.entries()].sort((a, b) => b[1].count - a[1].count || a[0].localeCompare(b[0]));\n const top = ranked.slice(0, topN).map(([code]) => code);\n const hasOther = ranked.length > topN;\n const segments: BarStackSegment[] = [\n ...top.map((code, i) => ({ id: code, label: totals.get(code)!.reason, color: seriesColor(i) })),\n ...(hasOther ? [{ id: '__other', label: 'Other reasons', color: CHART_NEUTRAL }] : []),\n ];\n const stages = funnel.stages.filter((s) => s.refusals.length > 0 || s.entered !== s.passed);\n return {\n categories: stages.map((s) => s.gate),\n segments,\n values: stages.map((s) => {\n const row = top.map((code) => s.refusals.find((r) => r.code === code)?.count ?? 0);\n if (hasOther) row.push(s.refusals.filter((r) => !top.includes(r.code)).reduce((n, r) => n + r.count, 0));\n return row;\n }),\n total: ranked.reduce((n, [, v]) => n + v.count, 0),\n };\n}\n\n/**\n * No run of any kind and no proposal at the gates: every chart card on Fleet\n * (live swimlane, gate funnel, refusals, parked) would be an empty state.\n */\nexport function nothingToDraw(fleet: FleetLiveSnapshotV1): boolean {\n return fleet.runs.length === 0 && funnelStages(fleet.funnel).length === 0 && refusalStack(fleet.funnel).total === 0;\n}\n\n/** The newest seat decision behind a live dispatch (\"why this seat\"). */\nexport function latestDecision(fleet: FleetLiveSnapshotV1 | null): { decision: SeatDecision; run: FleetLiveRun } | null {\n if (!fleet) return null;\n const withDecision = fleet.runs.filter((r) => r.seatDecision !== null);\n if (!withDecision.length) return null;\n withDecision.sort((a, b) => (startOf(b) ?? 0) - (startOf(a) ?? 0));\n const run = withDecision[0]!;\n return { decision: run.seatDecision!, run };\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{E as e,H as t,P as n,U as r,l as i}from"./global-CNNGMril.js";var a=class extends Error{constructor(){super(`No mutation token held for this session yet.`),this.name=`MissingMutationTokenError`}};async function o(t,r){let o=e();if(!o)throw new a;let s=await i(t,r,o);return n(),s}async function s(){await o(`/api/fleet/pause`,{}),t(`dashboard-snapshot`),t(`control-snapshot`),t(`fleet`),t(`fleet-activity`)}async function c(){await o(`/api/fleet/resume`,{}),t(`dashboard-snapshot`),t(`control-snapshot`),t(`fleet`),t(`fleet-activity`)}async function l(e){await o(`/api/inbox/${encodeURIComponent(e)}/approve`,{}),t(`inbox`),t(`dashboard-snapshot`),t(`proposal-detail-${e}`),r(`inbox-list:`)}async function u(e){await o(`/api/inbox/${encodeURIComponent(e)}/reject`,{}),t(`inbox`),t(`dashboard-snapshot`),t(`proposal-detail-${e}`),r(`inbox-list:`)}export{c as i,s as n,u as r,l as t};
2
- //# sourceMappingURL=mutations-DTCtKCn_.js.map
@@ -1 +0,0 @@
1
- import"./global-CNNGMril.js";import"./focus-trap-BdrbWfC4.js";import"./Dialog-BSsIFNqD.js";import"./Epistemic-D7MxSmED.js";import"./StatusBadge-DHKRtttH.js";import"./RouteErrorBoundary-BaC7YVzR.js";import"./RefreshIndicator-CSyqpY_q.js";import"./VerseConsoleApp-BCY5uSok.js";import"./Segmented-CametjLt.js";import"./Tag-fordBsrJ.js";import"./Button-BhO-WKPp.js";import"./EmptyState-DPrd2aak.js";import"./Meter-CFNLpwA-.js";import"./Slider-Bwd9HfXl.js";import"./Switch-PMixU6b0.js";import"./Select-De52fghU.js";import"./Input-C0MQxEM6.js";import"./Sheet-CJhK9Dqv.js";
@@ -1,2 +0,0 @@
1
- import{S as e,r as t,x as n,y as r}from"./verse-model-MMySehjj.js";import{_ as i,b as a}from"./format-Dk4Fmxax.js";var o={ready:`ready`,tight:`tight`,exhausted:`blocked`,"signed-out":`blocked`,unknown:`unread`};function s(e,t=Date.now()){let n=a(e,t);return n===null?null:`resets ${n}`}function c(t,n){let r=`${t}_`,i=n;for(;i.startsWith(r)&&i.length>r.length;)i=i.slice(r.length);return e(i)}function l(e,t,n){let r=t.resetDescription??(t.resetsAt===null?null:s(t.resetsAt,n));return{id:t.id,label:c(e,t.id),usedPercent:t.limitReached||!t.measured?null:t.usedPercent,limitReached:t.limitReached,resetText:r,resetsAt:t.resetsAt}}function u(t,n){let r=typeof t.usedPercent==`number`&&Number.isFinite(t.usedPercent)?Math.max(0,Math.min(100,t.usedPercent)):null,i=r!==null&&r>=100;return{id:t.id,label:e(t.id),usedPercent:i?null:r,limitReached:i,resetText:t.resetsAt===null?null:s(t.resetsAt,n),resetsAt:t.resetsAt}}function d(e){if(e===null)return{phrase:null,title:null};if(e.unlimited)return{phrase:`credits unlimited`,title:null};if(!e.hasCredits)return{phrase:null,title:null};if(e.balance===null)return{phrase:`credits available`,title:null};let t=Number.parseFloat(e.balance);return Number.isFinite(t)?{phrase:`${t.toFixed(2)} credits left`,title:e.balance}:{phrase:`credits available`,title:e.balance}}function f(e){let r=n(e),i=e.health.state===`ready`,a=r===null?i?`ready`:`unread`:`blocked`;return{kind:`local`,plan:null,cls:a,word:t[a],summary:r??(i?`runs on this machine`:`readiness not reported`),binding:null,others:[],credits:null,creditsTitle:null,notes:e.health.summary===null?[]:[e.health.summary],evidenceSource:null,observedAt:e.health.observedAt,extended:!1}}function p(e,i){let a=r(e),o=e.health.windows.map(e=>u(e,i)),s=o.find(e=>e.limitReached)??null,c=o.filter(e=>e.usedPercent!==null),l=c.length===0?null:c.reduce((e,t)=>(t.usedPercent??0)>(e.usedPercent??0)?t:e),d=s??l,f=n(e),p=f===null?a.cls:`blocked`;return{kind:`subscription`,plan:null,cls:p,word:t[p],summary:f??a.text,binding:d,others:d===null?o:o.filter(e=>e.id!==d.id),credits:null,creditsTitle:null,notes:[],evidenceSource:null,observedAt:e.health.observedAt,extended:!1}}function m(e,r=Date.now()){if(e.engine===`local`)return f(e);let a=e.capacity;if(a===void 0)return p(e,r);let s=a.windows.map(t=>l(e.engine,t,r)),c=a.binding,u=c===null?null:s.find(e=>e.id===c.id)??l(e.engine,c,r),m=u===null?s:s.filter(e=>e.id!==u.id),h=e.health.state===`degraded`&&a.usability===`unknown`,g=h?{phrase:null,title:null}:d(a.credits),_=n(e),v=_===null?o[a.usability]:`blocked`,y;return y=a.usability===`signed-out`?`signed out — reconnect this account`:_===null?u===null?`no capacity reading`:u.limitReached?a.usability===`tight`&&g.phrase!==null?`${u.label} limit reached · credits still spendable`:`${u.label} limit reached`:u.usedPercent===null?`no capacity reading`:`${i(u.usedPercent)} of ${u.label} used`:_,h&&(y=u===null?`No current capacity reading; current access unconfirmed`:`Last verified reading: ${y}; current access unconfirmed`),{kind:`subscription`,plan:a.planType,cls:v,word:t[v],summary:y,binding:u,others:m,credits:g.phrase,creditsTitle:g.title,notes:[...a.notes],evidenceSource:a.evidenceSource,observedAt:a.observedAt??e.health.observedAt,extended:!0}}function h(e){return typeof e==`string`&&Number.isFinite(Date.parse(e))}function g(e){return e.limitReached||e.usedPercent!==null&&e.usedPercent>=100}function _(e,t){let n=h(t)?t:null,r=(e.binding===null?e.others:[e.binding,...e.others]).filter(g);if(r.length>0){if(r.some(e=>!h(e.resetsAt)))return null;let e=r.map(e=>e.resetsAt);return n!==null&&e.push(n),e.reduce((e,t)=>Date.parse(t)>Date.parse(e)?t:e)}return n===null?e.binding!==null&&h(e.binding.resetsAt)?e.binding.resetsAt:null:n}function v(e,t){let n=[e.label];return t.plan!==null&&n.push(t.plan),n.push(t.word),n.push(t.summary),t.credits!==null&&n.push(t.credits),t.binding?.resetText!=null&&n.push(t.binding.resetText),n.join(` · `)}function y(e){return e===`tight`||e===`blocked`}export{y as i,m as n,v as r,_ as t};
2
- //# sourceMappingURL=seat-subscription-C5Tvr0WQ.js.map
@@ -1,2 +0,0 @@
1
- import{B as e}from"./global-CNNGMril.js";import{p as t}from"./queries-CyBE8nsW.js";import{E as n,S as r,T as i}from"./VerseConsoleApp-BCY5uSok.js";import{n as a,t as o}from"./budget-queries-DsAjH8ac.js";import{r as s}from"./cloud-queries-QAhpExlz.js";import{r as c}from"./overnight-queries-mlO0xzsr.js";import{a as l,d as u,i as d,n as f,o as p,r as m}from"./surface-data-CchClvHo.js";var h={command:[f,d,l,p,m,a,s],fleet:[d,f,c,a,o],growth:[m,p,t(`30d`),f,d],mind:[l,u,r,n,f,d],chat:[r,i,n]},g=6e4;async function _(t,n={}){let r=n.ensure??e;for(let e of h[t]??[])try{if(n.beforeEach&&!await n.beforeEach())return;await r(e.key,()=>e.fetch(),g)}catch{}}export{g as PREFETCH_FRESH_MS,h as SURFACE_PREFETCH,_ as prefetchSurfaceData};
2
- //# sourceMappingURL=surface-prefetch-BWr0LBQn.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"surface-prefetch-BWr0LBQn.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/surface-prefetch.ts"],"sourcesContent":["/**\n * routes/verse/shell/surface-prefetch.ts — the reads each rail surface opens\n * with, so the shell can warm them while the operator is still reading chat\n * (shell/warmup.ts, once the operator is idle after first paint). A first\n * visit to Command, Fleet, Growth or Mind then paints from the cache instead\n * of a skeleton; the surface's own useQuery still refreshes whatever is older\n * than it accepts.\n *\n * LAZY ONLY. shell/warmup.ts loads this module with import(): these query\n * defs pull in the surfaces' data modules, none of which may cost chat\n * first-paint bytes (VerseApp.first-paint.test.ts pins it). The QueryDefs\n * themselves are the surfaces' own — same keys, same fetchers — so a warmed\n * entry IS the entry the surface reads.\n *\n * Keep each list in step with its surface's useQuery calls:\n * surface-prefetch.test.ts renders Command, Growth and Mind and fails when\n * they read something this table does not warm.\n */\nimport { ensureQuery } from '../../../data/cache.js';\nimport { modelsQuery, type QueryDef } from '../../../data/queries.js';\nimport { overnightQuery } from '../autonomy/overnight-queries.js';\nimport { budgetPreviewQuery, budgetQuery } from '../budget/budget-queries.js';\nimport { cloudQuery } from '../cloud/cloud-queries.js';\nimport {\n authorityQuery,\n fleetHistoryQuery,\n fleetLiveQuery,\n leaderQuery,\n learningQuery,\n reasoningDigestQuery,\n} from '../command/surface-data.js';\nimport { verseBootstrapQuery, verseSessionsQuery, verseWorkspacesQuery } from '../verse-queries.js';\nimport type { VerseSectionId } from '../verse-ui-store.js';\n\ntype AnyQuery = QueryDef<unknown>;\n\n/** What each rail surface reads the moment it mounts. */\nexport const SURFACE_PREFETCH: Readonly<Partial<Record<VerseSectionId, readonly AnyQuery[]>>> = {\n // No seat history: the burn-downs that drew it moved to Usage (audit 14);\n // Command's seat strip reads the budget and the rail's warm seat caches.\n // cloudQuery (3.11): the Cloud card's overview — without it a first visit\n // paints \"Reading the cloud lane…\" under the seat strip.\n command: [authorityQuery, fleetLiveQuery, leaderQuery, learningQuery, fleetHistoryQuery, budgetQuery, cloudQuery],\n // authorityQuery + fleetLiveQuery on Fleet, Growth and Mind: the shared\n // \"Autonomy is off\" state (autonomy/AutonomyOffState) reads both.\n fleet: [fleetLiveQuery, authorityQuery, overnightQuery, budgetQuery, budgetPreviewQuery],\n growth: [fleetHistoryQuery, learningQuery, modelsQuery('30d'), authorityQuery, fleetLiveQuery],\n mind: [leaderQuery, reasoningDigestQuery, verseBootstrapQuery, verseWorkspacesQuery, authorityQuery, fleetLiveQuery],\n chat: [verseBootstrapQuery, verseSessionsQuery, verseWorkspacesQuery],\n};\n\n/**\n * A cached answer younger than this is left alone. The surfaces accept 10–60 s\n * old data on mount, so anything fresher than a minute is already as good as\n * a warm-up can make it.\n */\nexport const PREFETCH_FRESH_MS = 60_000;\n\ntype Ensure = (key: string, fetcher: () => Promise<unknown>, maxAgeMs: number) => Promise<void>;\n\nexport interface PrefetchOptions {\n /** The cache's mount path (a seam for tests). */\n ensure?: Ensure;\n /**\n * Awaited before EACH read (the warm-up's idle gate). Resolving false stops\n * the warm-up there — the gate was cancelled.\n */\n beforeEach?: () => Promise<boolean> | boolean;\n}\n\n/**\n * Warm one surface's reads through the shared cache (joins an in-flight read,\n * skips a fresh one, and goes through the cache's concurrency gate).\n *\n * ONE AT A TIME: each read is awaited before the next is even considered, so\n * the warm-up never holds more than one of the gate's slots, and the operator\n * (who gets the other three, and whose reads the next `beforeEach` waits out)\n * is never queued behind a burst of it.\n *\n * Never rejects: a read that fails leaves the surface to load it as it always did.\n */\nexport async function prefetchSurfaceData(id: VerseSectionId, options: PrefetchOptions = {}): Promise<void> {\n const ensure = options.ensure ?? ensureQuery;\n for (const def of SURFACE_PREFETCH[id] ?? []) {\n try {\n if (options.beforeEach && !(await options.beforeEach())) return;\n await ensure(def.key, () => def.fetch(), PREFETCH_FRESH_MS);\n } catch {\n // A warm-up read that fails (or cannot even start) is not worth surfacing.\n }\n }\n}\n"],"mappings":"iYAqCA,IAAa,EAAmF,CAK9F,QAAS,CAAC,EAAgB,EAAgB,EAAa,EAAe,EAAmB,EAAa,CAAU,EAGhH,MAAO,CAAC,EAAgB,EAAgB,EAAgB,EAAa,CAAkB,EACvF,OAAQ,CAAC,EAAmB,EAAe,EAAY,KAAK,EAAG,EAAgB,CAAc,EAC7F,KAAM,CAAC,EAAa,EAAsB,EAAqB,EAAsB,EAAgB,CAAc,EACnH,KAAM,CAAC,EAAqB,EAAoB,CAAoB,CACtE,EAOa,EAAoB,IAyBjC,eAAsB,EAAoB,EAAoB,EAA2B,CAAC,EAAkB,CAC1G,IAAM,EAAS,EAAQ,QAAU,EACjC,IAAK,IAAM,KAAO,EAAiB,IAAO,CAAC,EACzC,GAAI,CACF,GAAI,EAAQ,YAAc,CAAE,MAAM,EAAQ,WAAW,EAAI,OACzD,MAAM,EAAO,EAAI,QAAW,EAAI,MAAM,EAAG,CAAiB,CAC5D,MAAQ,CAER,CAEJ"}
@@ -1,2 +0,0 @@
1
- var e=`https://claude.ai/settings/usage`,t=2e4,n=/^ct_\d{8}T\d{4}_[a-z0-9]{6}$/,r=[`merged`,`closed`,`failed`,`expired`],i=Object.freeze({v:1,creditsTotalUsd:250,creditsSpentAdjustmentUsd:0,estimatedCostPerSessionUsd:3,maxConcurrent:4,maxSessionsPerDay:20,selfImprove:Object.freeze({enabled:!0,repo:`ashlrai/ashlr-hub`,maxPerDay:4,reserveUsd:40})}),a=`/api/verse/cloud`,o=`/api/verse/cloud/launch`,s=`/api/verse/cloud/budget`,c=`/api/verse/cloud/refresh`,l=`/api/verse/cloud/improve`,u=`/api/verse/cloud/tasks`;export{i as a,o as c,u as d,r as i,a as l,t as n,s as o,n as r,l as s,e as t,c as u};
2
- //# sourceMappingURL=types-D5XOdyw8.js.map