@ashlr/hub 3.10.1 → 3.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/README.md +343 -82
  3. package/dist/authority-surface.json +80 -15
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/cloud.d.ts +39 -0
  6. package/dist/cli/cloud.js +448 -0
  7. package/dist/cli/cloud.js.map +1 -0
  8. package/dist/cli/completions.js +4 -0
  9. package/dist/cli/completions.js.map +1 -1
  10. package/dist/cli/help.js +2 -0
  11. package/dist/cli/help.js.map +1 -1
  12. package/dist/cli/index.d.ts +1 -0
  13. package/dist/cli/index.js +10 -0
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/core/cloud/backlog.d.ts +17 -0
  16. package/dist/core/cloud/backlog.js +177 -0
  17. package/dist/core/cloud/backlog.js.map +1 -0
  18. package/dist/core/cloud/budget.d.ts +19 -0
  19. package/dist/core/cloud/budget.js +99 -0
  20. package/dist/core/cloud/budget.js.map +1 -0
  21. package/dist/core/cloud/checkout.d.ts +41 -0
  22. package/dist/core/cloud/checkout.js +168 -0
  23. package/dist/core/cloud/checkout.js.map +1 -0
  24. package/dist/core/cloud/cloud-api.d.ts +86 -0
  25. package/dist/core/cloud/cloud-api.js +599 -0
  26. package/dist/core/cloud/cloud-api.js.map +1 -0
  27. package/dist/core/cloud/delivery-contract.d.ts +25 -0
  28. package/dist/core/cloud/delivery-contract.js +138 -0
  29. package/dist/core/cloud/delivery-contract.js.map +1 -0
  30. package/dist/core/cloud/improvement-backlog.d.ts +11 -0
  31. package/dist/core/cloud/improvement-backlog.js +26 -0
  32. package/dist/core/cloud/improvement-backlog.js.map +1 -0
  33. package/dist/core/cloud/launcher.d.ts +68 -0
  34. package/dist/core/cloud/launcher.js +312 -0
  35. package/dist/core/cloud/launcher.js.map +1 -0
  36. package/dist/core/cloud/service.d.ts +51 -0
  37. package/dist/core/cloud/service.js +215 -0
  38. package/dist/core/cloud/service.js.map +1 -0
  39. package/dist/core/cloud/store.d.ts +41 -0
  40. package/dist/core/cloud/store.js +278 -0
  41. package/dist/core/cloud/store.js.map +1 -0
  42. package/dist/core/cloud/tracker.d.ts +30 -0
  43. package/dist/core/cloud/tracker.js +152 -0
  44. package/dist/core/cloud/tracker.js.map +1 -0
  45. package/dist/core/cloud/types.d.ts +233 -0
  46. package/dist/core/cloud/types.js +73 -0
  47. package/dist/core/cloud/types.js.map +1 -0
  48. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  49. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +5 -4
  50. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +4 -3
  51. package/dist/core/universe/campaign.js +9 -1
  52. package/dist/core/universe/campaign.js.map +1 -1
  53. package/dist/core/universe/runner.d.ts +3 -0
  54. package/dist/core/universe/runner.js +7 -3
  55. package/dist/core/universe/runner.js.map +1 -1
  56. package/dist/core/verse/activity-api.d.ts +3 -1
  57. package/dist/core/verse/activity-api.js +16 -1
  58. package/dist/core/verse/activity-api.js.map +1 -1
  59. package/dist/core/verse/activity.d.ts +7 -0
  60. package/dist/core/verse/activity.js +23 -0
  61. package/dist/core/verse/activity.js.map +1 -1
  62. package/dist/core/verse/compaction-point.d.ts +55 -0
  63. package/dist/core/verse/compaction-point.js +75 -0
  64. package/dist/core/verse/compaction-point.js.map +1 -0
  65. package/dist/core/verse/context-math.d.ts +1 -38
  66. package/dist/core/verse/context-math.js +5 -59
  67. package/dist/core/verse/context-math.js.map +1 -1
  68. package/dist/core/verse/verse-api.d.ts +1 -1
  69. package/dist/core/verse/verse-api.js +2 -0
  70. package/dist/core/verse/verse-api.js.map +1 -1
  71. package/dist/core/vision/leader-cloud.d.ts +63 -0
  72. package/dist/core/vision/leader-cloud.js +134 -0
  73. package/dist/core/vision/leader-cloud.js.map +1 -0
  74. package/dist/core/vision/leader.d.ts +6 -0
  75. package/dist/core/vision/leader.js +12 -1
  76. package/dist/core/vision/leader.js.map +1 -1
  77. package/dist/core/web/public/next/assets/{ActionMenu-BBB7VYjz.js → ActionMenu-_DhtX2gO.js} +2 -2
  78. package/dist/core/web/public/next/assets/{ActionMenu-BBB7VYjz.js.map → ActionMenu-_DhtX2gO.js.map} +1 -1
  79. package/dist/core/web/public/next/assets/Advanced-CAAfaBke.js +2 -0
  80. package/dist/core/web/public/next/assets/Advanced-CAAfaBke.js.map +1 -0
  81. package/dist/core/web/public/next/assets/App-BAywyjE8.js +7 -0
  82. package/dist/core/web/public/next/assets/{App-CbDCLAxn.js.map → App-BAywyjE8.js.map} +1 -1
  83. package/dist/core/web/public/next/assets/AppsSection-CUypKeog.js +2 -0
  84. package/dist/core/web/public/next/assets/AppsSection-CUypKeog.js.map +1 -0
  85. package/dist/core/web/public/next/assets/{AreaTrend-BgnK0wAy.js → AreaTrend-CblDqC8Q.js} +2 -2
  86. package/dist/core/web/public/next/assets/{AreaTrend-BgnK0wAy.js.map → AreaTrend-CblDqC8Q.js.map} +1 -1
  87. package/dist/core/web/public/next/assets/AutonomySection-D3d8lYO3.js +2 -0
  88. package/dist/core/web/public/next/assets/{AutonomySection-BF5UCsMv.js.map → AutonomySection-D3d8lYO3.js.map} +1 -1
  89. package/dist/core/web/public/next/assets/BranchBar-DU0jAV1E.js +2 -0
  90. package/dist/core/web/public/next/assets/{BranchBar-nfSb59Kv.js.map → BranchBar-DU0jAV1E.js.map} +1 -1
  91. package/dist/core/web/public/next/assets/{BudgetControl-BESM12dO.js → BudgetControl-Mm1ZL4u6.js} +2 -2
  92. package/dist/core/web/public/next/assets/{BudgetControl-BESM12dO.js.map → BudgetControl-Mm1ZL4u6.js.map} +1 -1
  93. package/dist/core/web/public/next/assets/{BurnDown-D1AfskPT.js → BurnDown-C1fgcFqo.js} +2 -2
  94. package/dist/core/web/public/next/assets/{BurnDown-D1AfskPT.js.map → BurnDown-C1fgcFqo.js.map} +1 -1
  95. package/dist/core/web/public/next/assets/{Button-Cr_qkQEc.js → Button-DqgLUZvd.js} +2 -2
  96. package/dist/core/web/public/next/assets/{Button-Cr_qkQEc.js.map → Button-DqgLUZvd.js.map} +1 -1
  97. package/dist/core/web/public/next/assets/CapacityStrip-nWFHvqFB.js +2 -0
  98. package/dist/core/web/public/next/assets/CapacityStrip-nWFHvqFB.js.map +1 -0
  99. package/dist/core/web/public/next/assets/ChatSection-DUZNpiVr.js +3 -0
  100. package/dist/core/web/public/next/assets/ChatSection-DUZNpiVr.js.map +1 -0
  101. package/dist/core/web/public/next/assets/CloudBudgetForm-2OW38o_C.js +2 -0
  102. package/dist/core/web/public/next/assets/CloudBudgetForm-2OW38o_C.js.map +1 -0
  103. package/dist/core/web/public/next/assets/CommandPalette-C5w2o1-r.js +2 -0
  104. package/dist/core/web/public/next/assets/{CommandPalette-lLV-OR63.js.map → CommandPalette-C5w2o1-r.js.map} +1 -1
  105. package/dist/core/web/public/next/assets/CommandSection-Bx2knNqY.js +2 -0
  106. package/dist/core/web/public/next/assets/CommandSection-Bx2knNqY.js.map +1 -0
  107. package/dist/core/web/public/next/assets/ConfirmDialog-B7ZwCQOX.js +2 -0
  108. package/dist/core/web/public/next/assets/ConfirmDialog-B7ZwCQOX.js.map +1 -0
  109. package/dist/core/web/public/next/assets/ConfirmDialog-Dx15x0Ho.css +1 -0
  110. package/dist/core/web/public/next/assets/Dialog-BpgcEW6b.js +2 -0
  111. package/dist/core/web/public/next/assets/Dialog-BpgcEW6b.js.map +1 -0
  112. package/dist/core/web/public/next/assets/Dialog-tQ8kFulD.css +1 -0
  113. package/dist/core/web/public/next/assets/{DiffPane-BVxhK-cy.js → DiffPane-DpqRUtCx.js} +2 -2
  114. package/dist/core/web/public/next/assets/{DiffPane-BVxhK-cy.js.map → DiffPane-DpqRUtCx.js.map} +1 -1
  115. package/dist/core/web/public/next/assets/{DiffViewer-yCdw9J-Y.js → DiffViewer-CoV5-nUf.js} +2 -2
  116. package/dist/core/web/public/next/assets/{DiffViewer-yCdw9J-Y.js.map → DiffViewer-CoV5-nUf.js.map} +1 -1
  117. package/dist/core/web/public/next/assets/DockHost-C0Pq7Jak.js +2 -0
  118. package/dist/core/web/public/next/assets/{DockHost-BZReKwos.js.map → DockHost-C0Pq7Jak.js.map} +1 -1
  119. package/dist/core/web/public/next/assets/{EmptyState-D1GDxVZy.js → EmptyState-DYW29ncw.js} +2 -2
  120. package/dist/core/web/public/next/assets/{EmptyState-D1GDxVZy.js.map → EmptyState-DYW29ncw.js.map} +1 -1
  121. package/dist/core/web/public/next/assets/{Epistemic-DRp4dBfB.js → Epistemic-DVx6oHzp.js} +2 -2
  122. package/dist/core/web/public/next/assets/{Epistemic-DRp4dBfB.js.map → Epistemic-DVx6oHzp.js.map} +1 -1
  123. package/dist/core/web/public/next/assets/FleetSection-DSETviPK.js +3 -0
  124. package/dist/core/web/public/next/assets/FleetSection-DSETviPK.js.map +1 -0
  125. package/dist/core/web/public/next/assets/{Funnel-zvDj3He4.js → Funnel-DxiGqJrt.js} +2 -2
  126. package/dist/core/web/public/next/assets/{Funnel-zvDj3He4.js.map → Funnel-DxiGqJrt.js.map} +1 -1
  127. package/dist/core/web/public/next/assets/GearTray-C3I89sIt.js +2 -0
  128. package/dist/core/web/public/next/assets/{GearTray-CkviqjYr.js.map → GearTray-C3I89sIt.js.map} +1 -1
  129. package/dist/core/web/public/next/assets/{GrowthSection-Bg5sW0jI.js → GrowthSection-C3m2bPEz.js} +2 -2
  130. package/dist/core/web/public/next/assets/{GrowthSection-Bg5sW0jI.js.map → GrowthSection-C3m2bPEz.js.map} +1 -1
  131. package/dist/core/web/public/next/assets/HandoffDialog-Bjb96a0N.js +2 -0
  132. package/dist/core/web/public/next/assets/{HandoffDialog-DcPj1ri9.js.map → HandoffDialog-Bjb96a0N.js.map} +1 -1
  133. package/dist/core/web/public/next/assets/{Input-Ci7TD96x.js → Input-ekTehVaH.js} +2 -2
  134. package/dist/core/web/public/next/assets/{Input-Ci7TD96x.js.map → Input-ekTehVaH.js.map} +1 -1
  135. package/dist/core/web/public/next/assets/LeaderCard-85VBbbaZ.js +2 -0
  136. package/dist/core/web/public/next/assets/{LeaderCard-BSFTlMRF.js.map → LeaderCard-85VBbbaZ.js.map} +1 -1
  137. package/dist/core/web/public/next/assets/{MatrixHeatmap-DojKZe9L.js → MatrixHeatmap-Bo8j0QPC.js} +2 -2
  138. package/dist/core/web/public/next/assets/{MatrixHeatmap-DojKZe9L.js.map → MatrixHeatmap-Bo8j0QPC.js.map} +1 -1
  139. package/dist/core/web/public/next/assets/McpSection-DvHFaVyp.js +2 -0
  140. package/dist/core/web/public/next/assets/{McpSection-CvcYu1X_.js.map → McpSection-DvHFaVyp.js.map} +1 -1
  141. package/dist/core/web/public/next/assets/{MessageMarkdown-BrLCrb73.js → MessageMarkdown-fsY_ltVa.js} +3 -3
  142. package/dist/core/web/public/next/assets/{MessageMarkdown-BrLCrb73.js.map → MessageMarkdown-fsY_ltVa.js.map} +1 -1
  143. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CjmdBw2p.js → MessageMarkdownRenderer-DDdtu82l.js} +2 -2
  144. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CjmdBw2p.js.map → MessageMarkdownRenderer-DDdtu82l.js.map} +1 -1
  145. package/dist/core/web/public/next/assets/{Meter-DTHbmhQg.js → Meter-CeGDXdDM.js} +2 -2
  146. package/dist/core/web/public/next/assets/{Meter-DTHbmhQg.js.map → Meter-CeGDXdDM.js.map} +1 -1
  147. package/dist/core/web/public/next/assets/MindSection-CDVhHvXl.js +2 -0
  148. package/dist/core/web/public/next/assets/{MindSection-DcO9fmYe.js.map → MindSection-CDVhHvXl.js.map} +1 -1
  149. package/dist/core/web/public/next/assets/MutationTokenDialog-CrfJ0PdD.css +1 -0
  150. package/dist/core/web/public/next/assets/MutationTokenDialog-DTQzEOHR.js +2 -0
  151. package/dist/core/web/public/next/assets/MutationTokenDialog-DTQzEOHR.js.map +1 -0
  152. package/dist/core/web/public/next/assets/NeedsYouDrawer-6AuN0BF3.js +2 -0
  153. package/dist/core/web/public/next/assets/{NeedsYouDrawer-hiTINupk.js.map → NeedsYouDrawer-6AuN0BF3.js.map} +1 -1
  154. package/dist/core/web/public/next/assets/{NeedsYouList-B4Z37Phx.js → NeedsYouList-ChnRmbSk.js} +2 -2
  155. package/dist/core/web/public/next/assets/{NeedsYouList-B4Z37Phx.js.map → NeedsYouList-ChnRmbSk.js.map} +1 -1
  156. package/dist/core/web/public/next/assets/NewChatDialog-B06E7sqg.js +3 -0
  157. package/dist/core/web/public/next/assets/{NewChatDialog-utSckh7C.js.map → NewChatDialog-B06E7sqg.js.map} +1 -1
  158. package/dist/core/web/public/next/assets/OnboardingFlow-C2M3zov9.js +2 -0
  159. package/dist/core/web/public/next/assets/{OnboardingFlow-7N3YSUHN.js.map → OnboardingFlow-C2M3zov9.js.map} +1 -1
  160. package/dist/core/web/public/next/assets/PreviewPane-Bd6HsX1k.js +2 -0
  161. package/dist/core/web/public/next/assets/{PreviewPane-CqzkaAjG.js.map → PreviewPane-Bd6HsX1k.js.map} +1 -1
  162. package/dist/core/web/public/next/assets/ProviderLogo-Bz7KR5j3.js +2 -0
  163. package/dist/core/web/public/next/assets/ProviderLogo-Bz7KR5j3.js.map +1 -0
  164. package/dist/core/web/public/next/assets/RailStatus-CctCuuLy.js +2 -0
  165. package/dist/core/web/public/next/assets/{RailStatus-sZhApA8k.js.map → RailStatus-CctCuuLy.js.map} +1 -1
  166. package/dist/core/web/public/next/assets/{RefreshIndicator-C1uQIegT.js → RefreshIndicator-CKY5BGdD.js} +2 -2
  167. package/dist/core/web/public/next/assets/{RefreshIndicator-C1uQIegT.js.map → RefreshIndicator-CKY5BGdD.js.map} +1 -1
  168. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CM_8pJs6.css → ResourcePoolConsoleApp-BX9JLkT4.css} +1 -1
  169. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-DXjjV6Sh.js → ResourcePoolConsoleApp-CspIsW_G.js} +5 -5
  170. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-DXjjV6Sh.js.map → ResourcePoolConsoleApp-CspIsW_G.js.map} +1 -1
  171. package/dist/core/web/public/next/assets/ResourcesChrome-B7fHZ6zX.js +3 -0
  172. package/dist/core/web/public/next/assets/ResourcesChrome-B7fHZ6zX.js.map +1 -0
  173. package/dist/core/web/public/next/assets/ResourcesChrome-uZEqC2EM.css +1 -0
  174. package/dist/core/web/public/next/assets/ResourcesDrawer-B7-N9n7-.js +2 -0
  175. package/dist/core/web/public/next/assets/ResourcesDrawer-B7-N9n7-.js.map +1 -0
  176. package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +1 -0
  177. package/dist/core/web/public/next/assets/RouteErrorBoundary-C_B11J0s.js +2 -0
  178. package/dist/core/web/public/next/assets/RouteErrorBoundary-C_B11J0s.js.map +1 -0
  179. package/dist/core/web/public/next/assets/RouteErrorBoundary-DdxhTdZ6.css +1 -0
  180. package/dist/core/web/public/next/assets/RunInCloudAction-_juw4EXd.js +2 -0
  181. package/dist/core/web/public/next/assets/RunInCloudAction-_juw4EXd.js.map +1 -0
  182. package/dist/core/web/public/next/assets/SeatSelector-D_YXvkPy.js +3 -0
  183. package/dist/core/web/public/next/assets/{SeatSelector-CT92PqM_.js.map → SeatSelector-D_YXvkPy.js.map} +1 -1
  184. package/dist/core/web/public/next/assets/{Segmented-BMvq-FfD.js → Segmented-DnKP6rr7.js} +2 -2
  185. package/dist/core/web/public/next/assets/{Segmented-BMvq-FfD.js.map → Segmented-DnKP6rr7.js.map} +1 -1
  186. package/dist/core/web/public/next/assets/{Select-DkdeoSQn.js → Select-DlbUupTX.js} +2 -2
  187. package/dist/core/web/public/next/assets/{Select-DkdeoSQn.js.map → Select-DlbUupTX.js.map} +1 -1
  188. package/dist/core/web/public/next/assets/SessionGate-DnuTZACL.js +2 -0
  189. package/dist/core/web/public/next/assets/SessionGate-DnuTZACL.js.map +1 -0
  190. package/dist/core/web/public/next/assets/SessionGate-DvMpXNpJ.css +1 -0
  191. package/dist/core/web/public/next/assets/SessionInsightChip-C33-k-Q5.js +2 -0
  192. package/dist/core/web/public/next/assets/{SessionInsightChip-CwlakUYU.js.map → SessionInsightChip-C33-k-Q5.js.map} +1 -1
  193. package/dist/core/web/public/next/assets/{SessionSearch-DFByh2NZ.js → SessionSearch-DhhR9Csg.js} +2 -2
  194. package/dist/core/web/public/next/assets/{SessionSearch-DFByh2NZ.js.map → SessionSearch-DhhR9Csg.js.map} +1 -1
  195. package/dist/core/web/public/next/assets/SettingsSection-C0xQvCz3.js +2 -0
  196. package/dist/core/web/public/next/assets/SettingsSection-C0xQvCz3.js.map +1 -0
  197. package/dist/core/web/public/next/assets/Sheet-BvNYOYv5.js +2 -0
  198. package/dist/core/web/public/next/assets/{Sheet-C7APkGPt.js.map → Sheet-BvNYOYv5.js.map} +1 -1
  199. package/dist/core/web/public/next/assets/ShortcutsOverlay-1nUBVO-Z.js +2 -0
  200. package/dist/core/web/public/next/assets/{ShortcutsOverlay-ZPyXUS_I.js.map → ShortcutsOverlay-1nUBVO-Z.js.map} +1 -1
  201. package/dist/core/web/public/next/assets/Sidebar-YrVvvBNM.js +3 -0
  202. package/dist/core/web/public/next/assets/{Sidebar-Chsgazmk.js.map → Sidebar-YrVvvBNM.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/{Slider-B0kjW7cd.js → Slider-B2c-dbQb.js} +2 -2
  204. package/dist/core/web/public/next/assets/{Slider-B0kjW7cd.js.map → Slider-B2c-dbQb.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/{StatusBadge-wv4e6f8b.js → StatusBadge-Q9YYkijx.js} +2 -2
  206. package/dist/core/web/public/next/assets/{StatusBadge-wv4e6f8b.js.map → StatusBadge-Q9YYkijx.js.map} +1 -1
  207. package/dist/core/web/public/next/assets/{StepBand-Db8WPw8J.js → StepBand-Ci-C0GUG.js} +2 -2
  208. package/dist/core/web/public/next/assets/{StepBand-Db8WPw8J.js.map → StepBand-Ci-C0GUG.js.map} +1 -1
  209. package/dist/core/web/public/next/assets/{Surface-BkDrQ4t3.js → Surface-DBovMq4P.js} +2 -2
  210. package/dist/core/web/public/next/assets/{Surface-BkDrQ4t3.js.map → Surface-DBovMq4P.js.map} +1 -1
  211. package/dist/core/web/public/next/assets/{Swimlane-Dcve56cP.js → Swimlane-Cdc4TqDe.js} +2 -2
  212. package/dist/core/web/public/next/assets/{Swimlane-Dcve56cP.js.map → Swimlane-Cdc4TqDe.js.map} +1 -1
  213. package/dist/core/web/public/next/assets/{Switch-DamlpSMY.js → Switch-CUrvzO2k.js} +2 -2
  214. package/dist/core/web/public/next/assets/{Switch-DamlpSMY.js.map → Switch-CUrvzO2k.js.map} +1 -1
  215. package/dist/core/web/public/next/assets/{Tag-Cs4tudBN.js → Tag-Bv8u6APt.js} +2 -2
  216. package/dist/core/web/public/next/assets/{Tag-Cs4tudBN.js.map → Tag-Bv8u6APt.js.map} +1 -1
  217. package/dist/core/web/public/next/assets/TerminalPane-BE4Xlqi5.js +7 -0
  218. package/dist/core/web/public/next/assets/{TerminalPane-BDkKFych.js.map → TerminalPane-BE4Xlqi5.js.map} +1 -1
  219. package/dist/core/web/public/next/assets/UniverseConsoleApp-BGwejf0m.js +2 -0
  220. package/dist/core/web/public/next/assets/{UniverseConsoleApp-BE72VyBL.js.map → UniverseConsoleApp-BGwejf0m.js.map} +1 -1
  221. package/dist/core/web/public/next/assets/{UniverseConsoleApp-Dh7A-hLD.css → UniverseConsoleApp-DfuT-wFw.css} +1 -1
  222. package/dist/core/web/public/next/assets/{UniverseView-BbmYY2P4.js → UniverseView-CgKa-WXC.js} +4 -4
  223. package/dist/core/web/public/next/assets/{UniverseView-BbmYY2P4.js.map → UniverseView-CgKa-WXC.js.map} +1 -1
  224. package/dist/core/web/public/next/assets/UsageSection-CazsHm1f.js +2 -0
  225. package/dist/core/web/public/next/assets/UsageSection-CazsHm1f.js.map +1 -0
  226. package/dist/core/web/public/next/assets/VerseConsoleApp-CTF3Shs0.js +3 -0
  227. package/dist/core/web/public/next/assets/VerseConsoleApp-CTF3Shs0.js.map +1 -0
  228. package/dist/core/web/public/next/assets/VerseConsoleApp-Cxqr-3qc.css +1 -0
  229. package/dist/core/web/public/next/assets/Workspace-CgdyXiEV.js +10 -0
  230. package/dist/core/web/public/next/assets/Workspace-CgdyXiEV.js.map +1 -0
  231. package/dist/core/web/public/next/assets/Workspace-Dwri2jFJ.css +1 -0
  232. package/dist/core/web/public/next/assets/actions-MtxBGS5B.js +2 -0
  233. package/dist/core/web/public/next/assets/{actions-BnjZy8a-.js.map → actions-MtxBGS5B.js.map} +1 -1
  234. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +2 -0
  235. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +1 -0
  236. package/dist/core/web/public/next/assets/budget-queries-CP7hgR-p.js +2 -0
  237. package/dist/core/web/public/next/assets/{budget-queries-Cp6vO7FH.js.map → budget-queries-CP7hgR-p.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/{capacity-strip-model-9-Yb211u.js → capacity-strip-model-fHfu5cph.js} +2 -2
  239. package/dist/core/web/public/next/assets/{capacity-strip-model-9-Yb211u.js.map → capacity-strip-model-fHfu5cph.js.map} +1 -1
  240. package/dist/core/web/public/next/assets/{charts-BmbKhjqw.js → charts-Bis9WSiS.js} +2 -2
  241. package/dist/core/web/public/next/assets/{charts-BmbKhjqw.js.map → charts-Bis9WSiS.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +1 -0
  243. package/dist/core/web/public/next/assets/cloud-queries-BsOepFz6.js +2 -0
  244. package/dist/core/web/public/next/assets/cloud-queries-BsOepFz6.js.map +1 -0
  245. package/dist/core/web/public/next/assets/cloud.module-DoFnr8ZH.js +2 -0
  246. package/dist/core/web/public/next/assets/cloud.module-DoFnr8ZH.js.map +1 -0
  247. package/dist/core/web/public/next/assets/{command-bus-DHJJLWh8.js → command-bus-CMvbYP5K.js} +2 -2
  248. package/dist/core/web/public/next/assets/{command-bus-DHJJLWh8.js.map → command-bus-CMvbYP5K.js.map} +1 -1
  249. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js +2 -0
  250. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js.map +1 -0
  251. package/dist/core/web/public/next/assets/compaction-point-VL9oegWS.js +2 -0
  252. package/dist/core/web/public/next/assets/compaction-point-VL9oegWS.js.map +1 -0
  253. package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js → composer-keys-su0g1h9o.js} +2 -2
  254. package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js.map → composer-keys-su0g1h9o.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/context-model-Ci3Ch9t5.js +2 -0
  256. package/dist/core/web/public/next/assets/{context-model-DeJ28uSZ.js.map → context-model-Ci3Ch9t5.js.map} +1 -1
  257. package/dist/core/web/public/next/assets/context-model-CjiJTnf1.js +2 -0
  258. package/dist/core/web/public/next/assets/{context-model-BGznyHNQ.js.map → context-model-CjiJTnf1.js.map} +1 -1
  259. package/dist/core/web/public/next/assets/context-queries-BDXT6LQ3.js +2 -0
  260. package/dist/core/web/public/next/assets/{context-queries-_mEgy4eg.js.map → context-queries-BDXT6LQ3.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/control-queries-Dv-h1Clu.js +2 -0
  262. package/dist/core/web/public/next/assets/{control-queries-C4TG8blN.js.map → control-queries-Dv-h1Clu.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/{dock-icons-BB7Fi6hT.js → dock-icons-t--Eugrd.js} +2 -2
  264. package/dist/core/web/public/next/assets/{dock-icons-BB7Fi6hT.js.map → dock-icons-t--Eugrd.js.map} +1 -1
  265. package/dist/core/web/public/next/assets/{dock-store-CdHQRP8s.js → dock-store-qIu7kSQE.js} +2 -2
  266. package/dist/core/web/public/next/assets/{dock-store-CdHQRP8s.js.map → dock-store-qIu7kSQE.js.map} +1 -1
  267. package/dist/core/web/public/next/assets/{fleet-model-B4FKC7fH.js → fleet-model-IRbwfhkR.js} +2 -2
  268. package/dist/core/web/public/next/assets/{fleet-model-B4FKC7fH.js.map → fleet-model-IRbwfhkR.js.map} +1 -1
  269. package/dist/core/web/public/next/assets/fleet-queries-7FVNByX1.js +2 -0
  270. package/dist/core/web/public/next/assets/fleet-queries-7FVNByX1.js.map +1 -0
  271. package/dist/core/web/public/next/assets/focus-trap-QqQxQdvH.js +2 -0
  272. package/dist/core/web/public/next/assets/focus-trap-QqQxQdvH.js.map +1 -0
  273. package/dist/core/web/public/next/assets/{format-lW58rL2y.js → format-CaMmVQCn.js} +2 -2
  274. package/dist/core/web/public/next/assets/{format-lW58rL2y.js.map → format-CaMmVQCn.js.map} +1 -1
  275. package/dist/core/web/public/next/assets/git-model-B4S_GUNA.js +5 -0
  276. package/dist/core/web/public/next/assets/{git-model-DaGw1SzS.js.map → git-model-B4S_GUNA.js.map} +1 -1
  277. package/dist/core/web/public/next/assets/global-BkNl4e6E.js +2 -0
  278. package/dist/core/web/public/next/assets/global-BkNl4e6E.js.map +1 -0
  279. package/dist/core/web/public/next/assets/global-BlI2BYa1.css +1 -0
  280. package/dist/core/web/public/next/assets/guarded-action-DHiL8tY5.js +3 -0
  281. package/dist/core/web/public/next/assets/guarded-action-DHiL8tY5.js.map +1 -0
  282. package/dist/core/web/public/next/assets/guarded-runners-DmGEkM2P.js +2 -0
  283. package/dist/core/web/public/next/assets/guarded-runners-DmGEkM2P.js.map +1 -0
  284. package/dist/core/web/public/next/assets/icon-base-NtFmP2yB.js +2 -0
  285. package/dist/core/web/public/next/assets/icon-base-NtFmP2yB.js.map +1 -0
  286. package/dist/core/web/public/next/assets/icons-C5EFt_Ts.js +2 -0
  287. package/dist/core/web/public/next/assets/icons-C5EFt_Ts.js.map +1 -0
  288. package/dist/core/web/public/next/assets/{index-Dk8R-3a7.js → index-DbDw9UAs.js} +3 -3
  289. package/dist/core/web/public/next/assets/{index-Dk8R-3a7.js.map → index-DbDw9UAs.js.map} +1 -1
  290. package/dist/core/web/public/next/assets/{live-model-44wEU6I8.js → live-model-DEwrl7_A.js} +2 -2
  291. package/dist/core/web/public/next/assets/{live-model-44wEU6I8.js.map → live-model-DEwrl7_A.js.map} +1 -1
  292. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +2 -0
  293. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +1 -0
  294. package/dist/core/web/public/next/assets/{mind.module-BOABBdi_.js → mind.module-CLhqMQak.js} +2 -2
  295. package/dist/core/web/public/next/assets/{mind.module-BOABBdi_.js.map → mind.module-CLhqMQak.js.map} +1 -1
  296. package/dist/core/web/public/next/assets/mutations-Kvzsg-iK.js +2 -0
  297. package/dist/core/web/public/next/assets/{mutations-DjXM3IDg.js.map → mutations-Kvzsg-iK.js.map} +1 -1
  298. package/dist/core/web/public/next/assets/nav-C0IunEYF.js +2 -0
  299. package/dist/core/web/public/next/assets/nav-C0IunEYF.js.map +1 -0
  300. package/dist/core/web/public/next/assets/overnight-queries-C_AfcL7q.js +2 -0
  301. package/dist/core/web/public/next/assets/{overnight-queries-Be_eossf.js.map → overnight-queries-C_AfcL7q.js.map} +1 -1
  302. package/dist/core/web/public/next/assets/preloaded-CctOitLu.js +2 -0
  303. package/dist/core/web/public/next/assets/preloaded-CctOitLu.js.map +1 -0
  304. package/dist/core/web/public/next/assets/primitives-CbAGCNKt.js +1 -0
  305. package/dist/core/web/public/next/assets/{queries-CYEVCq5r.js → queries-THD05gHP.js} +2 -2
  306. package/dist/core/web/public/next/assets/{queries-CYEVCq5r.js.map → queries-THD05gHP.js.map} +1 -1
  307. package/dist/core/web/public/next/assets/reasoning-pref-BVPu0SME.js +2 -0
  308. package/dist/core/web/public/next/assets/{reasoning-pref-a_ZP6GzU.js.map → reasoning-pref-BVPu0SME.js.map} +1 -1
  309. package/dist/core/web/public/next/assets/reveal-anchor-wCT5b4m3.js +2 -0
  310. package/dist/core/web/public/next/assets/reveal-anchor-wCT5b4m3.js.map +1 -0
  311. package/dist/core/web/public/next/assets/seat-subscription-CR_VylsK.js +2 -0
  312. package/dist/core/web/public/next/assets/{seat-subscription-CRigL-GE.js.map → seat-subscription-CR_VylsK.js.map} +1 -1
  313. package/dist/core/web/public/next/assets/{section-visibility-u7q-Q9AA.js → section-visibility-B0xXUQJ0.js} +2 -2
  314. package/dist/core/web/public/next/assets/{section-visibility-u7q-Q9AA.js.map → section-visibility-B0xXUQJ0.js.map} +1 -1
  315. package/dist/core/web/public/next/assets/{sidebar-model-i4WRuQ6j.js → sidebar-model-C5wVXGpb.js} +2 -2
  316. package/dist/core/web/public/next/assets/{sidebar-model-i4WRuQ6j.js.map → sidebar-model-C5wVXGpb.js.map} +1 -1
  317. package/dist/core/web/public/next/assets/slots-DDd8cEoh.js +3 -0
  318. package/dist/core/web/public/next/assets/{slots-CV9ZuLQU.js.map → slots-DDd8cEoh.js.map} +1 -1
  319. package/dist/core/web/public/next/assets/surface-data-BFxAlefI.js +2 -0
  320. package/dist/core/web/public/next/assets/{surface-data-DLvmUX9z.js.map → surface-data-BFxAlefI.js.map} +1 -1
  321. package/dist/core/web/public/next/assets/surface-prefetch-CHusyO9q.js +2 -0
  322. package/dist/core/web/public/next/assets/surface-prefetch-CHusyO9q.js.map +1 -0
  323. package/dist/core/web/public/next/assets/{tasks-model-DWs5u9RO.js → tasks-model-DvkWveXs.js} +2 -2
  324. package/dist/core/web/public/next/assets/{tasks-model-DWs5u9RO.js.map → tasks-model-DvkWveXs.js.map} +1 -1
  325. package/dist/core/web/public/next/assets/{terminal-icons-Ct9cZsEK.js → terminal-icons-Dp6pJgV2.js} +2 -2
  326. package/dist/core/web/public/next/assets/{terminal-icons-Ct9cZsEK.js.map → terminal-icons-Dp6pJgV2.js.map} +1 -1
  327. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +2 -0
  328. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -0
  329. package/dist/core/web/public/next/assets/{usage-queries-CI_y9oWZ.js → usage-queries-CUTmnegA.js} +2 -2
  330. package/dist/core/web/public/next/assets/{usage-queries-CI_y9oWZ.js.map → usage-queries-CUTmnegA.js.map} +1 -1
  331. package/dist/core/web/public/next/assets/use-guarded-action-UCX2u1t1.js +2 -0
  332. package/dist/core/web/public/next/assets/{use-guarded-action-DVCtLzSo.js.map → use-guarded-action-UCX2u1t1.js.map} +1 -1
  333. package/dist/core/web/public/next/assets/{use-ticker-C3LQ2IYs.js → use-ticker-OXAjob3y.js} +2 -2
  334. package/dist/core/web/public/next/assets/{use-ticker-C3LQ2IYs.js.map → use-ticker-OXAjob3y.js.map} +1 -1
  335. package/dist/core/web/public/next/assets/use-token-gate-CDDRAoKH.js +2 -0
  336. package/dist/core/web/public/next/assets/{use-token-gate-B5gOFkeH.js.map → use-token-gate-CDDRAoKH.js.map} +1 -1
  337. package/dist/core/web/public/next/assets/useChartWidth-BW6SwYIK.css +1 -0
  338. package/dist/core/web/public/next/assets/useChartWidth-D9M7kUw7.js +2 -0
  339. package/dist/core/web/public/next/assets/{useChartWidth-0APW0BR3.js.map → useChartWidth-D9M7kUw7.js.map} +1 -1
  340. package/dist/core/web/public/next/assets/{useSeatsRefresh-BN8bso-n.js → useSeatsRefresh-B2dCVcj9.js} +2 -2
  341. package/dist/core/web/public/next/assets/{useSeatsRefresh-BN8bso-n.js.map → useSeatsRefresh-B2dCVcj9.js.map} +1 -1
  342. package/dist/core/web/public/next/assets/useVerseTranscript-BL3CljSI.js +2 -0
  343. package/dist/core/web/public/next/assets/useVerseTranscript-BL3CljSI.js.map +1 -0
  344. package/dist/core/web/public/next/assets/verse-icons-DASWdYuE.js +2 -0
  345. package/dist/core/web/public/next/assets/verse-icons-DASWdYuE.js.map +1 -0
  346. package/dist/core/web/public/next/assets/verse-model-BQ0Y2CSr.js +2 -0
  347. package/dist/core/web/public/next/assets/verse-model-BQ0Y2CSr.js.map +1 -0
  348. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js +3 -0
  349. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js.map +1 -0
  350. package/dist/core/web/public/next/assets/verse-ui-store-D7YXi63q.js +3 -0
  351. package/dist/core/web/public/next/assets/{verse-ui-store-Dy4HuDBV.js.map → verse-ui-store-D7YXi63q.js.map} +1 -1
  352. package/dist/core/web/public/next/assets/{viewport-DDoJ_xVq.js → viewport-BYGH5EgA.js} +2 -2
  353. package/dist/core/web/public/next/assets/{viewport-DDoJ_xVq.js.map → viewport-BYGH5EgA.js.map} +1 -1
  354. package/dist/core/web/public/next/assets/{warmup-BsL2LdR-.js → warmup-AsqwWCUi.js} +3 -3
  355. package/dist/core/web/public/next/assets/{warmup-BsL2LdR-.js.map → warmup-AsqwWCUi.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/{workspace-model-Dd3LmIym.js → workspace-model-CXorJr0G.js} +2 -2
  357. package/dist/core/web/public/next/assets/{workspace-model-Dd3LmIym.js.map → workspace-model-CXorJr0G.js.map} +1 -1
  358. package/dist/core/web/public/next/index.html +1 -1
  359. package/dist/release-dependency-inventory.json +1 -1
  360. package/package.json +5 -2
  361. package/dist/cli/activation.d.ts +0 -41
  362. package/dist/cli/activation.js +0 -485
  363. package/dist/cli/activation.js.map +0 -1
  364. package/dist/core/fleet/generated-repair-resolution.d.ts +0 -36
  365. package/dist/core/fleet/generated-repair-resolution.js +0 -245
  366. package/dist/core/fleet/generated-repair-resolution.js.map +0 -1
  367. package/dist/core/local-runtime/llama/port.d.ts +0 -17
  368. package/dist/core/local-runtime/llama/port.js +0 -47
  369. package/dist/core/local-runtime/llama/port.js.map +0 -1
  370. package/dist/core/local-runtime/llama/proxy-host.d.ts +0 -54
  371. package/dist/core/local-runtime/llama/proxy-host.js +0 -159
  372. package/dist/core/local-runtime/llama/proxy-host.js.map +0 -1
  373. package/dist/core/local-runtime/llama/proxy-process.d.ts +0 -148
  374. package/dist/core/local-runtime/llama/proxy-process.js +0 -250
  375. package/dist/core/local-runtime/llama/proxy-process.js.map +0 -1
  376. package/dist/core/local-runtime/llama/proxy-record.d.ts +0 -40
  377. package/dist/core/local-runtime/llama/proxy-record.js +0 -133
  378. package/dist/core/local-runtime/llama/proxy-record.js.map +0 -1
  379. package/dist/core/local-runtime/llama/proxy-supervisor.d.ts +0 -118
  380. package/dist/core/local-runtime/llama/proxy-supervisor.js +0 -511
  381. package/dist/core/local-runtime/llama/proxy-supervisor.js.map +0 -1
  382. package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js +0 -2
  383. package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js.map +0 -1
  384. package/dist/core/web/public/next/assets/App-CbDCLAxn.js +0 -7
  385. package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js +0 -2
  386. package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js.map +0 -1
  387. package/dist/core/web/public/next/assets/AutonomySection-BF5UCsMv.js +0 -2
  388. package/dist/core/web/public/next/assets/BranchBar-nfSb59Kv.js +0 -2
  389. package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js +0 -2
  390. package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js.map +0 -1
  391. package/dist/core/web/public/next/assets/ChatSection-DoqjyVoj.js +0 -3
  392. package/dist/core/web/public/next/assets/ChatSection-DoqjyVoj.js.map +0 -1
  393. package/dist/core/web/public/next/assets/CommandPalette-lLV-OR63.js +0 -2
  394. package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js +0 -2
  395. package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js.map +0 -1
  396. package/dist/core/web/public/next/assets/DockHost-BZReKwos.js +0 -2
  397. package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js +0 -3
  398. package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js.map +0 -1
  399. package/dist/core/web/public/next/assets/GearTray-CkviqjYr.js +0 -2
  400. package/dist/core/web/public/next/assets/HandoffDialog-DcPj1ri9.js +0 -2
  401. package/dist/core/web/public/next/assets/LeaderCard-BSFTlMRF.js +0 -2
  402. package/dist/core/web/public/next/assets/McpSection-CvcYu1X_.js +0 -2
  403. package/dist/core/web/public/next/assets/MindSection-DcO9fmYe.js +0 -2
  404. package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js +0 -2
  405. package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js.map +0 -1
  406. package/dist/core/web/public/next/assets/MutationTokenDialog-Cum_DqQZ.css +0 -1
  407. package/dist/core/web/public/next/assets/NeedsYouDrawer-hiTINupk.js +0 -2
  408. package/dist/core/web/public/next/assets/NewChatDialog-utSckh7C.js +0 -3
  409. package/dist/core/web/public/next/assets/OnboardingFlow-7N3YSUHN.js +0 -2
  410. package/dist/core/web/public/next/assets/PreviewPane-CqzkaAjG.js +0 -2
  411. package/dist/core/web/public/next/assets/RailStatus-sZhApA8k.js +0 -2
  412. package/dist/core/web/public/next/assets/RouteErrorBoundary-6RMd_aZg.css +0 -1
  413. package/dist/core/web/public/next/assets/RouteErrorBoundary-D1LZxQjN.js +0 -2
  414. package/dist/core/web/public/next/assets/RouteErrorBoundary-D1LZxQjN.js.map +0 -1
  415. package/dist/core/web/public/next/assets/SeatSelector-CT92PqM_.js +0 -3
  416. package/dist/core/web/public/next/assets/SessionInsightChip-CwlakUYU.js +0 -2
  417. package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js +0 -2
  418. package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js.map +0 -1
  419. package/dist/core/web/public/next/assets/Sheet-C7APkGPt.js +0 -2
  420. package/dist/core/web/public/next/assets/ShortcutsOverlay-ZPyXUS_I.js +0 -2
  421. package/dist/core/web/public/next/assets/Sidebar-Chsgazmk.js +0 -3
  422. package/dist/core/web/public/next/assets/TerminalPane-BDkKFych.js +0 -7
  423. package/dist/core/web/public/next/assets/UniverseConsoleApp-BE72VyBL.js +0 -2
  424. package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js +0 -2
  425. package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js.map +0 -1
  426. package/dist/core/web/public/next/assets/VerseConsoleApp-CXJWDiEM.css +0 -1
  427. package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js +0 -3
  428. package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js.map +0 -1
  429. package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +0 -1
  430. package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js +0 -10
  431. package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js.map +0 -1
  432. package/dist/core/web/public/next/assets/actions-BnjZy8a-.js +0 -2
  433. package/dist/core/web/public/next/assets/budget-queries-Cp6vO7FH.js +0 -2
  434. package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js +0 -2
  435. package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js.map +0 -1
  436. package/dist/core/web/public/next/assets/context-model-BGznyHNQ.js +0 -2
  437. package/dist/core/web/public/next/assets/context-model-DeJ28uSZ.js +0 -2
  438. package/dist/core/web/public/next/assets/context-queries-_mEgy4eg.js +0 -2
  439. package/dist/core/web/public/next/assets/control-queries-C4TG8blN.js +0 -2
  440. package/dist/core/web/public/next/assets/dock-panes-mnIwSpRp.js +0 -2
  441. package/dist/core/web/public/next/assets/dock-panes-mnIwSpRp.js.map +0 -1
  442. package/dist/core/web/public/next/assets/git-model-DaGw1SzS.js +0 -5
  443. package/dist/core/web/public/next/assets/global-DG1fmn4y.js +0 -2
  444. package/dist/core/web/public/next/assets/global-DG1fmn4y.js.map +0 -1
  445. package/dist/core/web/public/next/assets/global-_tOCFt9y.css +0 -1
  446. package/dist/core/web/public/next/assets/guarded-action--lguLXfz.js +0 -2
  447. package/dist/core/web/public/next/assets/guarded-action--lguLXfz.js.map +0 -1
  448. package/dist/core/web/public/next/assets/icons-YPgbel-I.js +0 -2
  449. package/dist/core/web/public/next/assets/icons-YPgbel-I.js.map +0 -1
  450. package/dist/core/web/public/next/assets/mutations-DjXM3IDg.js +0 -2
  451. package/dist/core/web/public/next/assets/overnight-queries-Be_eossf.js +0 -2
  452. package/dist/core/web/public/next/assets/primitives-Dl3SEQvh.js +0 -1
  453. package/dist/core/web/public/next/assets/reasoning-pref-a_ZP6GzU.js +0 -2
  454. package/dist/core/web/public/next/assets/seat-subscription-CRigL-GE.js +0 -2
  455. package/dist/core/web/public/next/assets/slots-CV9ZuLQU.js +0 -3
  456. package/dist/core/web/public/next/assets/surface-data-DLvmUX9z.js +0 -2
  457. package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js +0 -2
  458. package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js.map +0 -1
  459. package/dist/core/web/public/next/assets/use-guarded-action-DVCtLzSo.js +0 -2
  460. package/dist/core/web/public/next/assets/use-token-gate-B5gOFkeH.js +0 -2
  461. package/dist/core/web/public/next/assets/useActivity-C3R1Sudh.js +0 -2
  462. package/dist/core/web/public/next/assets/useActivity-C3R1Sudh.js.map +0 -1
  463. package/dist/core/web/public/next/assets/useChartWidth-0APW0BR3.js +0 -2
  464. package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +0 -1
  465. package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js +0 -2
  466. package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js.map +0 -1
  467. package/dist/core/web/public/next/assets/verse-queries-2PxoBISm.js +0 -2
  468. package/dist/core/web/public/next/assets/verse-queries-2PxoBISm.js.map +0 -1
  469. package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js +0 -3
  470. package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js.map +0 -1
  471. package/dist/core/web/public/next/assets/verse-ui-store-Dy4HuDBV.js +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar-model-i4WRuQ6j.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/sidebar-model.ts"],"sourcesContent":["/**\n * routes/verse/chat/sidebar-model.ts — the chat list, as data (SPEC-310C §2\n * \"Sidebar\", unit C2).\n *\n * [ All ] [ Running 2 ] [ Needs you 1 ] [ Pinned 3 ]\n * PINNED ▸ rows\n * <project> … ▸ rows, most recently touched project first\n * ARCHIVED (12) ▸ collapsed\n *\n * Each row states ONE status, the most urgent that applies:\n *\n * running a pulse and the elapsed time — plus a muted second line from\n * activity.live (\"npm test\", or the tail of the live reasoning);\n * failed the last turn errored;\n * unread a turn finished since the operator last looked;\n * time otherwise, how long ago it was touched.\n *\n * The inputs are three sources of different reliability, and the model is\n * explicit about what each is allowed to claim:\n * - the session list (always present): status, turnCount, updatedAt;\n * - activity (C1's route; null until it lands): who is running and what\n * they are doing, and the Needs-you items;\n * - session meta (C1's route; null until it lands): pinned, archived, and\n * how far the operator has read. With no meta, NOTHING is unread — an\n * unknown read state is not an unread one (honesty rule: null = unknown).\n *\n * Pure: no React, no fetch.\n */\nimport type { VerseProject, VerseSession } from '../../../data/api-types.js';\nimport type {\n NeedsYouItem,\n VerseActivityLive,\n VerseActivityResponse,\n VerseSessionMeta,\n VerseSessionMetaResponse,\n} from '../../../../core/verse/workbench-types.js';\nimport { groupSessions } from '../verse-model.js';\n\nexport const SIDEBAR_FILTERS = ['all', 'running', 'needs-you', 'pinned'] as const;\nexport type SidebarFilter = (typeof SIDEBAR_FILTERS)[number];\n\nexport const SIDEBAR_FILTER_LABEL: Readonly<Record<SidebarFilter, string>> = {\n all: 'All',\n running: 'Running',\n 'needs-you': 'Needs you',\n pinned: 'Pinned',\n};\n\nexport type RowStatus =\n | { kind: 'running'; startedAt: string | null }\n | { kind: 'failed' }\n | { kind: 'unread'; newTurns: number }\n | { kind: 'time'; at: string };\n\nexport interface SidebarRow {\n session: VerseSession;\n status: RowStatus;\n /** The running chat's muted second line; null when it is not running or nothing is known. */\n live: { text: string; startedAt: string | null } | null;\n pinned: boolean;\n archived: boolean;\n needsYou: boolean;\n}\n\nexport type SidebarGroupKind = 'pinned' | 'project' | 'archived';\n\nexport interface SidebarGroup {\n id: string;\n kind: SidebarGroupKind;\n label: string;\n /** The project's path (tooltip) for a project group. */\n projectPath: string | null;\n enrolled: boolean;\n rows: SidebarRow[];\n}\n\nexport interface SidebarModel {\n groups: SidebarGroup[];\n counts: Record<SidebarFilter, number>;\n /** Meta is known (C1's route answered) — pin/archive controls can work. */\n metaAvailable: boolean;\n}\n\nexport interface SidebarInput {\n sessions: readonly VerseSession[];\n projects: readonly VerseProject[];\n query: string;\n filter: SidebarFilter;\n activity: VerseActivityResponse | null;\n meta: VerseSessionMetaResponse | null;\n /** turnCount this tab has seen per chat (opened here) — clears a dot before the server confirms. */\n localSeen: ReadonlyMap<string, number>;\n /** The open chat is never unread. */\n selectedId: string | null;\n}\n\n/** Ids of chats a Needs-you item points at (as its subject or its target). */\nexport function needsYouSessionIds(items: readonly NeedsYouItem[]): Set<string> {\n const out = new Set<string>();\n for (const item of items) {\n if (item.subject.sessionId) out.add(item.subject.sessionId);\n if (item.target.kind === 'session') out.add(item.target.sessionId);\n }\n return out;\n}\n\nconst THINKING_TAIL_CHARS = 72;\n\n/** \"npm test\" / \"…the tail of what it is thinking\" / \"Writing\" — never a guess. */\nexport function liveLine(live: VerseActivityLive | null): string | null {\n if (!live) return null;\n if (live.phase === 'tool' && live.tool) return live.tool;\n if (live.thinkingTail && live.thinkingTail.trim()) {\n const tail = live.thinkingTail.replace(/\\s+/g, ' ').trim();\n return tail.length > THINKING_TAIL_CHARS ? `…${tail.slice(tail.length - THINKING_TAIL_CHARS + 1).trimStart()}` : tail;\n }\n switch (live.phase) {\n case 'thinking': return 'Thinking';\n case 'writing': return 'Writing';\n case 'waiting': return 'Waiting for the model';\n case 'tool': return 'Running a tool';\n default: return null;\n }\n}\n\nfunction metaFor(meta: VerseSessionMetaResponse | null, id: string): VerseSessionMeta | null {\n return meta?.sessions[id] ?? null;\n}\n\nexport function buildSidebar(input: SidebarInput): SidebarModel {\n const { sessions, projects, query, filter, activity, meta, localSeen, selectedId } = input;\n const running = new Map((activity?.running ?? []).map((r) => [r.sessionId, r]));\n const needs = needsYouSessionIds(activity?.needsYou ?? []);\n const metaAvailable = meta !== null;\n\n const rows = new Map<string, SidebarRow>();\n for (const session of sessions) {\n const m = metaFor(meta, session.id);\n const activityRow = running.get(session.id);\n const isRunning = session.status === 'running' || activityRow !== undefined;\n const serverSeen = m?.seenTurnCount ?? null;\n const seen = Math.max(serverSeen ?? -1, localSeen.get(session.id) ?? -1);\n // Unread needs a KNOWN read state: meta answered (this chat's entry or,\n // absent one, its default of \"never opened\" = 0) or this tab opened it.\n const knownSeen = metaAvailable ? Math.max(seen, 0) : seen;\n const unread = session.id !== selectedId && knownSeen >= 0 && session.turnCount > knownSeen ? session.turnCount - knownSeen : 0;\n // Without activity, a failed chat is the one \"needs you\" signal the list itself carries.\n const needsYou = activity ? needs.has(session.id) : session.status === 'error';\n const status: RowStatus = isRunning\n ? { kind: 'running', startedAt: activityRow?.startedAt ?? null }\n : session.status === 'error'\n ? { kind: 'failed' }\n : unread > 0\n ? { kind: 'unread', newTurns: unread }\n : { kind: 'time', at: session.updatedAt };\n const text = isRunning ? liveLine(activityRow?.live ?? null) : null;\n rows.set(session.id, {\n session,\n status,\n live: text === null ? null : { text, startedAt: activityRow?.startedAt ?? null },\n pinned: m?.pinned === true,\n archived: m?.archived === true,\n needsYou,\n });\n }\n\n const all = [...rows.values()];\n const counts: Record<SidebarFilter, number> = {\n all: all.filter((r) => !r.archived).length,\n running: all.filter((r) => r.status.kind === 'running').length,\n 'needs-you': all.filter((r) => r.needsYou).length,\n pinned: all.filter((r) => r.pinned && !r.archived).length,\n };\n\n const pass = (row: SidebarRow): boolean => {\n switch (filter) {\n case 'running': return row.status.kind === 'running';\n case 'needs-you': return row.needsYou;\n case 'pinned': return row.pinned;\n default: return true;\n }\n };\n\n // Title/project search reuses the 3.9 grouping (same matching, same order).\n const matched = groupSessions(all.filter(pass).map((r) => r.session), projects, query);\n const groups: SidebarGroup[] = [];\n const pinnedRows: SidebarRow[] = [];\n const archivedRows: SidebarRow[] = [];\n const projectGroups: SidebarGroup[] = [];\n for (const group of matched) {\n const projectRows: SidebarRow[] = [];\n for (const session of group.sessions) {\n const row = rows.get(session.id)!;\n if (row.archived) archivedRows.push(row);\n else if (row.pinned) pinnedRows.push(row);\n else projectRows.push(row);\n }\n if (projectRows.length > 0) {\n projectGroups.push({\n id: `project:${group.projectPath}`,\n kind: 'project',\n label: group.name,\n projectPath: group.projectPath,\n enrolled: group.enrolled,\n rows: projectRows,\n });\n }\n }\n const newest = (a: SidebarRow, b: SidebarRow) => b.session.updatedAt.localeCompare(a.session.updatedAt);\n if (pinnedRows.length > 0) groups.push({ id: 'pinned', kind: 'pinned', label: 'Pinned', projectPath: null, enrolled: false, rows: pinnedRows.sort(newest) });\n groups.push(...projectGroups);\n if (archivedRows.length > 0) groups.push({ id: 'archived', kind: 'archived', label: 'Archived', projectPath: null, enrolled: false, rows: archivedRows.sort(newest) });\n return { groups, counts, metaAvailable };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sidebar-model-C5wVXGpb.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/sidebar-model.ts"],"sourcesContent":["/**\n * routes/verse/chat/sidebar-model.ts — the chat list, as data (SPEC-310C §2\n * \"Sidebar\", unit C2).\n *\n * [ All ] [ Running 2 ] [ Needs you 1 ] [ Pinned 3 ]\n * PINNED ▸ rows\n * <project> … ▸ rows, most recently touched project first\n * ARCHIVED (12) ▸ collapsed\n *\n * Each row states ONE status, the most urgent that applies:\n *\n * running a pulse and the elapsed time — plus a muted second line from\n * activity.live (\"npm test\", or the tail of the live reasoning);\n * failed the last turn errored;\n * unread a turn finished since the operator last looked;\n * time otherwise, how long ago it was touched.\n *\n * The inputs are three sources of different reliability, and the model is\n * explicit about what each is allowed to claim:\n * - the session list (always present): status, turnCount, updatedAt;\n * - activity (C1's route; null until it lands): who is running and what\n * they are doing, and the Needs-you items;\n * - session meta (C1's route; null until it lands): pinned, archived, and\n * how far the operator has read. With no meta, NOTHING is unread — an\n * unknown read state is not an unread one (honesty rule: null = unknown).\n *\n * Pure: no React, no fetch.\n */\nimport type { VerseProject, VerseSession } from '../../../data/api-types.js';\nimport type {\n NeedsYouItem,\n VerseActivityLive,\n VerseActivityResponse,\n VerseSessionMeta,\n VerseSessionMetaResponse,\n} from '../../../../core/verse/workbench-types.js';\nimport { groupSessions } from '../verse-model.js';\n\nexport const SIDEBAR_FILTERS = ['all', 'running', 'needs-you', 'pinned'] as const;\nexport type SidebarFilter = (typeof SIDEBAR_FILTERS)[number];\n\nexport const SIDEBAR_FILTER_LABEL: Readonly<Record<SidebarFilter, string>> = {\n all: 'All',\n running: 'Running',\n 'needs-you': 'Needs you',\n pinned: 'Pinned',\n};\n\nexport type RowStatus =\n | { kind: 'running'; startedAt: string | null }\n | { kind: 'failed' }\n | { kind: 'unread'; newTurns: number }\n | { kind: 'time'; at: string };\n\nexport interface SidebarRow {\n session: VerseSession;\n status: RowStatus;\n /** The running chat's muted second line; null when it is not running or nothing is known. */\n live: { text: string; startedAt: string | null } | null;\n pinned: boolean;\n archived: boolean;\n needsYou: boolean;\n}\n\nexport type SidebarGroupKind = 'pinned' | 'project' | 'archived';\n\nexport interface SidebarGroup {\n id: string;\n kind: SidebarGroupKind;\n label: string;\n /** The project's path (tooltip) for a project group. */\n projectPath: string | null;\n enrolled: boolean;\n rows: SidebarRow[];\n}\n\nexport interface SidebarModel {\n groups: SidebarGroup[];\n counts: Record<SidebarFilter, number>;\n /** Meta is known (C1's route answered) — pin/archive controls can work. */\n metaAvailable: boolean;\n}\n\nexport interface SidebarInput {\n sessions: readonly VerseSession[];\n projects: readonly VerseProject[];\n query: string;\n filter: SidebarFilter;\n activity: VerseActivityResponse | null;\n meta: VerseSessionMetaResponse | null;\n /** turnCount this tab has seen per chat (opened here) — clears a dot before the server confirms. */\n localSeen: ReadonlyMap<string, number>;\n /** The open chat is never unread. */\n selectedId: string | null;\n}\n\n/** Ids of chats a Needs-you item points at (as its subject or its target). */\nexport function needsYouSessionIds(items: readonly NeedsYouItem[]): Set<string> {\n const out = new Set<string>();\n for (const item of items) {\n if (item.subject.sessionId) out.add(item.subject.sessionId);\n if (item.target.kind === 'session') out.add(item.target.sessionId);\n }\n return out;\n}\n\nconst THINKING_TAIL_CHARS = 72;\n\n/** \"npm test\" / \"…the tail of what it is thinking\" / \"Writing\" — never a guess. */\nexport function liveLine(live: VerseActivityLive | null): string | null {\n if (!live) return null;\n if (live.phase === 'tool' && live.tool) return live.tool;\n if (live.thinkingTail && live.thinkingTail.trim()) {\n const tail = live.thinkingTail.replace(/\\s+/g, ' ').trim();\n return tail.length > THINKING_TAIL_CHARS ? `…${tail.slice(tail.length - THINKING_TAIL_CHARS + 1).trimStart()}` : tail;\n }\n switch (live.phase) {\n case 'thinking': return 'Thinking';\n case 'writing': return 'Writing';\n case 'waiting': return 'Waiting for the model';\n case 'tool': return 'Running a tool';\n default: return null;\n }\n}\n\nfunction metaFor(meta: VerseSessionMetaResponse | null, id: string): VerseSessionMeta | null {\n return meta?.sessions[id] ?? null;\n}\n\nexport function buildSidebar(input: SidebarInput): SidebarModel {\n const { sessions, projects, query, filter, activity, meta, localSeen, selectedId } = input;\n const running = new Map((activity?.running ?? []).map((r) => [r.sessionId, r]));\n const needs = needsYouSessionIds(activity?.needsYou ?? []);\n const metaAvailable = meta !== null;\n\n const rows = new Map<string, SidebarRow>();\n for (const session of sessions) {\n const m = metaFor(meta, session.id);\n const activityRow = running.get(session.id);\n const isRunning = session.status === 'running' || activityRow !== undefined;\n const serverSeen = m?.seenTurnCount ?? null;\n const seen = Math.max(serverSeen ?? -1, localSeen.get(session.id) ?? -1);\n // Unread needs a KNOWN read state: meta answered (this chat's entry or,\n // absent one, its default of \"never opened\" = 0) or this tab opened it.\n const knownSeen = metaAvailable ? Math.max(seen, 0) : seen;\n const unread = session.id !== selectedId && knownSeen >= 0 && session.turnCount > knownSeen ? session.turnCount - knownSeen : 0;\n // Without activity, a failed chat is the one \"needs you\" signal the list itself carries.\n const needsYou = activity ? needs.has(session.id) : session.status === 'error';\n const status: RowStatus = isRunning\n ? { kind: 'running', startedAt: activityRow?.startedAt ?? null }\n : session.status === 'error'\n ? { kind: 'failed' }\n : unread > 0\n ? { kind: 'unread', newTurns: unread }\n : { kind: 'time', at: session.updatedAt };\n const text = isRunning ? liveLine(activityRow?.live ?? null) : null;\n rows.set(session.id, {\n session,\n status,\n live: text === null ? null : { text, startedAt: activityRow?.startedAt ?? null },\n pinned: m?.pinned === true,\n archived: m?.archived === true,\n needsYou,\n });\n }\n\n const all = [...rows.values()];\n const counts: Record<SidebarFilter, number> = {\n all: all.filter((r) => !r.archived).length,\n running: all.filter((r) => r.status.kind === 'running').length,\n 'needs-you': all.filter((r) => r.needsYou).length,\n pinned: all.filter((r) => r.pinned && !r.archived).length,\n };\n\n const pass = (row: SidebarRow): boolean => {\n switch (filter) {\n case 'running': return row.status.kind === 'running';\n case 'needs-you': return row.needsYou;\n case 'pinned': return row.pinned;\n default: return true;\n }\n };\n\n // Title/project search reuses the 3.9 grouping (same matching, same order).\n const matched = groupSessions(all.filter(pass).map((r) => r.session), projects, query);\n const groups: SidebarGroup[] = [];\n const pinnedRows: SidebarRow[] = [];\n const archivedRows: SidebarRow[] = [];\n const projectGroups: SidebarGroup[] = [];\n for (const group of matched) {\n const projectRows: SidebarRow[] = [];\n for (const session of group.sessions) {\n const row = rows.get(session.id)!;\n if (row.archived) archivedRows.push(row);\n else if (row.pinned) pinnedRows.push(row);\n else projectRows.push(row);\n }\n if (projectRows.length > 0) {\n projectGroups.push({\n id: `project:${group.projectPath}`,\n kind: 'project',\n label: group.name,\n projectPath: group.projectPath,\n enrolled: group.enrolled,\n rows: projectRows,\n });\n }\n }\n const newest = (a: SidebarRow, b: SidebarRow) => b.session.updatedAt.localeCompare(a.session.updatedAt);\n if (pinnedRows.length > 0) groups.push({ id: 'pinned', kind: 'pinned', label: 'Pinned', projectPath: null, enrolled: false, rows: pinnedRows.sort(newest) });\n groups.push(...projectGroups);\n if (archivedRows.length > 0) groups.push({ id: 'archived', kind: 'archived', label: 'Archived', projectPath: null, enrolled: false, rows: archivedRows.sort(newest) });\n return { groups, counts, metaAvailable };\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PreviewPane-Bd6HsX1k.js","assets/index-DbDw9UAs.js","assets/global-BkNl4e6E.js","assets/global-BlI2BYa1.css","assets/workbench-types-DzN-5trg.js","assets/viewport-BYGH5EgA.js","assets/section-visibility-B0xXUQJ0.js","assets/MessageMarkdown-fsY_ltVa.js","assets/MessageMarkdown-Cgh5f1-Q.css","assets/Segmented-DnKP6rr7.js","assets/Segmented-BnjHbKzH.css","assets/Button-DqgLUZvd.js","assets/Button-DrnKsvnQ.css","assets/icons-C5EFt_Ts.js","assets/icon-base-NtFmP2yB.js","assets/EmptyState-DYW29ncw.js","assets/EmptyState-B3YUPGaa.css","assets/terminal-icons-Dp6pJgV2.js","assets/pane-chrome.module-D7o-fVd0.js","assets/pane-chrome-8JmEhHVD.css","assets/PreviewPane-DoMsJSG3.css","assets/TerminalPane-BE4Xlqi5.js","assets/command-catalog-Bb_PxC5w.js","assets/verse-model-BQ0Y2CSr.js","assets/VerseConsoleApp-CTF3Shs0.js","assets/RouteErrorBoundary-C_B11J0s.js","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/guarded-action-DHiL8tY5.js","assets/preloaded-CctOitLu.js","assets/verse-ui-store-D7YXi63q.js","assets/dock-store-qIu7kSQE.js","assets/composer-keys-su0g1h9o.js","assets/command-bus-CMvbYP5K.js","assets/VerseConsoleApp-Cxqr-3qc.css","assets/compaction-point-VL9oegWS.js","assets/ActionMenu-_DhtX2gO.js","assets/ActionMenu-DPjsLU1g.css","assets/TerminalPane-BwfMbnJz.css","assets/BranchBar-DU0jAV1E.js","assets/Dialog-BpgcEW6b.js","assets/focus-trap-QqQxQdvH.js","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-DTQzEOHR.js","assets/MutationTokenDialog-CrfJ0PdD.css","assets/git-model-B4S_GUNA.js","assets/use-token-gate-CDDRAoKH.js","assets/format-CaMmVQCn.js","assets/format-DKrNjdwD.js","assets/BranchBar-BZNQ50YE.css","assets/DiffPane-DpqRUtCx.js","assets/highlight-CMCZK9jW.js","assets/line-diff-B5Eonif2.js","assets/DiffPane-BAvvbBsf.css","assets/SessionInsightChip-C33-k-Q5.js","assets/nav-C0IunEYF.js","assets/surface-data-BFxAlefI.js","assets/control-queries-Dv-h1Clu.js","assets/mutations-Kvzsg-iK.js","assets/mind.module-CLhqMQak.js","assets/colors-BZ3a9wFf.js","assets/workspace-model-CXorJr0G.js","assets/calendar-day-BxBYHfX1.js","assets/mind-B9PzLcl0.css"])))=>i.map(i=>d[i]);
2
+ import{a as e,n as t,s as n,t as r}from"./index-DbDw9UAs.js";import{t as i}from"./Button-DqgLUZvd.js";import{t as a}from"./EmptyState-DYW29ncw.js";var o=n(e(),1),s=t(),c={"branch-bar":{path:`git/BranchBar.tsx`,exportName:`BranchBar`,owner:`C5`,kind:`inline`,label:`Branch bar`},"diff-pane":{path:`git/DiffPane.tsx`,exportName:`DiffPane`,owner:`C5`,kind:`pane`,label:`Review`},"terminal-pane":{path:`dock/terminal/TerminalPane.tsx`,exportName:`TerminalPane`,owner:`C4`,kind:`pane`,label:`Terminal`},"preview-pane":{path:`dock/preview/PreviewPane.tsx`,exportName:`PreviewPane`,owner:`C4`,kind:`pane`,label:`Preview`},"session-insight-chip":{path:`mind/SessionInsightChip.tsx`,exportName:`SessionInsightChip`,owner:`C7`,kind:`inline`,label:`Insight`}};Object.keys(c);var l=Object.assign({"../dock/preview/PreviewPane.tsx":()=>r(()=>import(`./PreviewPane-Bd6HsX1k.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])),"../dock/terminal/TerminalPane.tsx":()=>r(()=>import(`./TerminalPane-BE4Xlqi5.js`),__vite__mapDeps([21,1,2,3,22,4,5,6,23,24,25,26,27,28,29,30,31,32,14,33,34,11,12,35,36,13,15,16,17,18,19,37])),"../git/BranchBar.tsx":()=>r(()=>import(`./BranchBar-DU0jAV1E.js`),__vite__mapDeps([38,1,39,40,41,42,2,3,43,5,32,6,44,24,25,26,22,4,27,28,29,30,31,14,33,11,12,13,45,46,47,23,34,48])),"../git/DiffPane.tsx":()=>r(()=>import(`./DiffPane-DpqRUtCx.js`),__vite__mapDeps([49,1,2,3,50,9,10,44,24,25,26,22,4,27,28,5,29,30,31,32,6,14,33,11,12,51,13,15,16,18,19,52])),"../mind/SessionInsightChip.tsx":()=>r(()=>import(`./SessionInsightChip-C33-k-Q5.js`),__vite__mapDeps([53,1,2,3,46,47,24,25,26,22,4,27,28,5,29,30,31,32,6,14,33,23,34,54,55,56,57,58,59,60,61,62]))});function u(e,t){return t[`../${c[e].path}`]}function d(e,t=l){return u(e,t)!==void 0}function f(e,t=l){let n=u(e,t);if(!n)return null;let{exportName:r}=c[e];return(0,o.lazy)(async()=>{let t=(await n())[r];if(typeof t!=`function`&&(typeof t!=`object`||!t))throw Error(`${c[e].path} exports no ${r}`);return{default:t}})}var p=new Map;function m(e){return p.has(e)||p.set(e,f(e)),p.get(e)}var h=class extends o.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(e,t){console.error(`[verse] ${this.props.label} failed`,e,t.componentStack)}render(){return this.state.failed?this.props.kind===`inline`?null:(0,s.jsx)(g,{label:this.props.label,onRetry:this.props.onRetry}):this.props.children}};function g({label:e,onRetry:t}){return(0,s.jsx)(a,{compact:!0,tone:`error`,title:`${e} could not load`,body:`The rest of the chat still works.`,action:(0,s.jsx)(i,{variant:`subtle`,size:`sm`,onClick:t,children:`Try again`})})}function _({id:e,props:t,resolve:n=m,forget:r=e=>p.delete(e)}){let[i,a]=(0,o.useState)(0),l=n(e);if(!l)return null;let{kind:u,label:d}=c[e];return(0,s.jsx)(h,{kind:u,label:d,onRetry:()=>{r(e),a(e=>e+1)},children:(0,s.jsx)(o.Suspense,{fallback:null,children:(0,s.jsx)(l,{...t})})},i)}function v(e){return(0,s.jsx)(_,{id:`branch-bar`,props:e})}function y(e){return(0,s.jsx)(_,{id:`diff-pane`,props:e})}function b(e){return(0,s.jsx)(_,{id:`terminal-pane`,props:e})}function x(e){return(0,s.jsx)(_,{id:`preview-pane`,props:e})}function S(e){return(0,s.jsx)(_,{id:`session-insight-chip`,props:e})}export{b as a,S as i,y as n,d as o,x as r,v as t};
3
+ //# sourceMappingURL=slots-DDd8cEoh.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/slots.tsx"],"sourcesContent":["/**\n * routes/verse/shell/slots.tsx — where Chat mounts other units' UI (unit C0;\n * SPEC-310C §7 \"Slots\").\n *\n * C2 owns the chat, the dock and the header; C4, C5 and C7 own things that\n * render INSIDE them. Rather than C2 importing their files — which would not\n * compile until every one of them landed, and would drag each into C2's\n * chunk — C2 renders these slots. Each resolves ONE fixed file lazily and:\n * - renders nothing until that file lands (and `isSlotAvailable` says so,\n * so C2 can hide the toggle for a pane that does not exist yet);\n * - loads in its own chunk (xterm and the diff viewer stay off the chat's\n * critical path — SPEC-310C budgets: chat critical JS ≤ 350 KB);\n * - is fenced by an error boundary: a crashed inline slot vanishes, a\n * crashed pane says so with a retry — neither takes the chat down.\n *\n * The props below ARE the contract: each owning unit's component takes\n * exactly its slot's props, as a NAMED export (`export function BranchBar`).\n *\n * Resolution uses `import.meta.glob` with literal paths — the same \"absent\n * file is an absent key\" mechanism VerseApp uses for sections.\n */\nimport { Component, Suspense, lazy, useState, type ComponentType, type ErrorInfo, type ReactNode } from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport type { VerseReviewScope, VerseTerminalLaunchVia } from '../../../../core/verse/workbench-types.js';\n\n// ===========================================================================\n// Contracts\n// ===========================================================================\n\n/** Open the Review pane on a root, at a scope (and optionally one file). */\nexport interface DiffPaneRequest {\n root: string;\n scope: VerseReviewScope;\n file?: string;\n}\n\n/** A file the chat's latest turn touched — the Review pane's \"This turn\" scope (C2 derives it from events). */\nexport interface TurnFileChange {\n root: string;\n /** Relative to `root`. */\n path: string;\n}\n\n/** Open the Terminal pane: a tab at `root`, optionally pasting (never running) a command. */\nexport interface TerminalOpenRequest {\n /** Changes on every request, so the same request twice is two opens. */\n nonce: number;\n root?: string;\n /** Force a new tab instead of focusing the root's existing one (⌃⇧`). */\n newTab?: boolean;\n /** \"Run in terminal\": pasted at the prompt, NEVER executed — the operator presses Enter. */\n paste?: string;\n /** Apps [Launch ▸]: the catalog app to launch in the new tab. */\n appId?: string;\n /**\n * With `appId`: HOW to launch it — the app's own CLI (`native`) or through\n * Ollama (`ollama`, with `model` naming the local tag). These mirror\n * VerseTerminalCreateRequest; the page only names the choice, the server\n * resolves the argv from the catalog and the installed binaries\n * (`resolveAppLaunch`) and refuses via/model without an appId.\n */\n via?: VerseTerminalLaunchVia;\n /** With `via: 'ollama'`: the local model tag to launch the app on. */\n model?: string;\n /** Preview's dev-server Start: the server to run in the new tab. */\n devServerId?: string;\n}\n\n/** Open the Preview pane on a loopback URL, a chat artifact, or a dev server. */\nexport interface PreviewOpenRequest {\n nonce: number;\n url?: string;\n artifactPath?: string;\n devServerId?: string;\n}\n\n/** C5 `git/BranchBar.tsx` → `export function BranchBar(props: BranchBarProps)` — above the composer. */\nexport interface BranchBarProps {\n sessionId: string;\n /** The chat's roots in priority order; the bar shows one row per root with changes, then \"Show N more\". */\n roots: readonly string[];\n /** The ± counts open the branch diff: C2 opens the dock's Review pane with this. */\n onOpenDiff: (request: DiffPaneRequest) => void;\n}\n\n/** C5 `git/DiffPane.tsx` → `export function DiffPane(props: DiffPaneProps)` — the dock's Review pane. */\nexport interface DiffPaneProps {\n sessionId: string;\n roots: readonly string[];\n /** Latest open request; null = the pane chooses (Uncommitted, first root with changes). */\n request: (DiffPaneRequest & { nonce: number }) | null;\n turnFiles: readonly TurnFileChange[];\n /** \"Add to message\": drafts `path:line: note` into the composer (⌘Enter sends). */\n onAddToMessage: (text: string) => void;\n /** False while the pane is a background tab — stop timers, skip work. */\n visible: boolean;\n}\n\n/** C4 `dock/terminal/TerminalPane.tsx` → `export function TerminalPane(props: TerminalPaneProps)`. */\nexport interface TerminalPaneProps {\n sessionId: string;\n roots: readonly string[];\n request: TerminalOpenRequest | null;\n /** \"Send selection to chat\": the text, already fenced as a code block. */\n onSendToChat: (text: string) => void;\n visible: boolean;\n}\n\n/** C4 `dock/preview/PreviewPane.tsx` → `export function PreviewPane(props: PreviewPaneProps)`. */\nexport interface PreviewPaneProps {\n sessionId: string;\n roots: readonly string[];\n request: PreviewOpenRequest | null;\n /** Dev-server Start runs the server in a terminal tab — through the dock, never directly. */\n onOpenTerminal: (request: Omit<TerminalOpenRequest, 'nonce'>) => void;\n visible: boolean;\n}\n\n/** C7 `mind/SessionInsightChip.tsx` → `export function SessionInsightChip(props)` — the chat header chip. */\nexport interface SessionInsightChipProps {\n sessionId: string;\n}\n\nexport interface SlotPropsMap {\n 'branch-bar': BranchBarProps;\n 'diff-pane': DiffPaneProps;\n 'terminal-pane': TerminalPaneProps;\n 'preview-pane': PreviewPaneProps;\n 'session-insight-chip': SessionInsightChipProps;\n}\n\nexport type SlotId = keyof SlotPropsMap;\n\n/**\n * Each slot's fixed file (relative to routes/verse), its named export, its\n * owner, and how a crash is shown: an INLINE slot vanishes; a PANE fills the\n * dock, so it says it failed and offers a retry.\n */\nexport const SLOTS = {\n 'branch-bar': { path: 'git/BranchBar.tsx', exportName: 'BranchBar', owner: 'C5', kind: 'inline', label: 'Branch bar' },\n 'diff-pane': { path: 'git/DiffPane.tsx', exportName: 'DiffPane', owner: 'C5', kind: 'pane', label: 'Review' },\n 'terminal-pane': { path: 'dock/terminal/TerminalPane.tsx', exportName: 'TerminalPane', owner: 'C4', kind: 'pane', label: 'Terminal' },\n 'preview-pane': { path: 'dock/preview/PreviewPane.tsx', exportName: 'PreviewPane', owner: 'C4', kind: 'pane', label: 'Preview' },\n 'session-insight-chip': { path: 'mind/SessionInsightChip.tsx', exportName: 'SessionInsightChip', owner: 'C7', kind: 'inline', label: 'Insight' },\n} as const satisfies Record<SlotId, { path: string; exportName: string; owner: string; kind: 'inline' | 'pane'; label: string }>;\n\nexport const SLOT_IDS = Object.keys(SLOTS) as SlotId[];\n\n// ===========================================================================\n// Resolution\n// ===========================================================================\n\ntype Importer = () => Promise<unknown>;\n\n/**\n * Every slot file that exists at build time, keyed `../<path>`. Literal\n * patterns (no wildcards): a slot may only ever load its owner's one file.\n * EXPORTED for the slot test, which checks it against SLOTS.\n */\nexport const SLOT_MODULES: Record<string, Importer> = import.meta.glob([\n '../git/BranchBar.tsx',\n '../git/DiffPane.tsx',\n '../dock/terminal/TerminalPane.tsx',\n '../dock/preview/PreviewPane.tsx',\n '../mind/SessionInsightChip.tsx',\n]);\n\nfunction importerFor(id: SlotId, modules: Record<string, Importer>): Importer | undefined {\n return modules[`../${SLOTS[id].path}`];\n}\n\n/** True once the slot's file has landed in this build. */\nexport function isSlotAvailable(id: SlotId, modules: Record<string, Importer> = SLOT_MODULES): boolean {\n return importerFor(id, modules) !== undefined;\n}\n\ntype AnyComponent = ComponentType<Record<string, unknown>>;\n\n/**\n * Build the lazy component for one slot. Absent → renders nothing. Present\n * but exporting no component of the contract name → throws on load, so the\n * boundary shows it (a slot that silently renders nothing because of a typo\n * would look exactly like \"not landed yet\").\n */\nexport function createSlotComponent(id: SlotId, modules: Record<string, Importer> = SLOT_MODULES): AnyComponent | null {\n const importer = importerFor(id, modules);\n if (!importer) return null;\n const { exportName } = SLOTS[id];\n return lazy(async () => {\n const mod = (await importer()) as Record<string, unknown>;\n const exported = mod[exportName];\n if (typeof exported !== 'function' && (typeof exported !== 'object' || exported === null)) {\n throw new Error(`${SLOTS[id].path} exports no ${exportName}`);\n }\n return { default: exported as AnyComponent };\n });\n}\n\n// One lazy component per slot for the life of the page: re-creating it per\n// render would remount the pane (and drop a terminal's scrollback) each time.\nconst RESOLVED = new Map<SlotId, AnyComponent | null>();\nfunction slotComponent(id: SlotId): AnyComponent | null {\n if (!RESOLVED.has(id)) RESOLVED.set(id, createSlotComponent(id));\n return RESOLVED.get(id)!;\n}\n\n// ===========================================================================\n// Rendering\n// ===========================================================================\n\ninterface BoundaryProps {\n kind: 'inline' | 'pane';\n label: string;\n /** Drop the cached module and mount a fresh boundary (a failed lazy import stays failed otherwise). */\n onRetry: () => void;\n children: ReactNode;\n}\n\nclass SlotBoundary extends Component<BoundaryProps, { failed: boolean }> {\n override state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n // The console, not the page: operator copy never carries a stack or a path.\n console.error(`[verse] ${this.props.label} failed`, error, info.componentStack);\n }\n\n override render(): ReactNode {\n if (!this.state.failed) return this.props.children;\n if (this.props.kind === 'inline') return null;\n return <PaneFailed label={this.props.label} onRetry={this.props.onRetry} />;\n }\n}\n\nfunction PaneFailed({ label, onRetry }: { label: string; onRetry: () => void }) {\n return (\n <EmptyState\n compact\n tone=\"error\"\n title={`${label} could not load`}\n body=\"The rest of the chat still works.\"\n action={\n <Button variant=\"subtle\" size=\"sm\" onClick={onRetry}>\n Try again\n </Button>\n }\n />\n );\n}\n\nfunction SlotHost<K extends SlotId>({\n id,\n props,\n resolve = slotComponent,\n forget = (slot: SlotId) => RESOLVED.delete(slot),\n}: {\n id: K;\n props: SlotPropsMap[K];\n resolve?: (id: SlotId) => AnyComponent | null;\n forget?: (id: SlotId) => void;\n}) {\n const [attempt, setAttempt] = useState(0);\n const Resolved = resolve(id);\n if (!Resolved) return null;\n const { kind, label } = SLOTS[id];\n const retry = () => {\n forget(id);\n setAttempt((n) => n + 1);\n };\n return (\n // A new key per attempt: a fresh boundary AND a fresh lazy component.\n <SlotBoundary key={attempt} kind={kind} label={label} onRetry={retry}>\n <Suspense fallback={null}>\n <Resolved {...(props as unknown as Record<string, unknown>)} />\n </Suspense>\n </SlotBoundary>\n );\n}\n\n/** Test seam: render a slot against an injected module map (fake landed / absent / broken files). */\nexport function SlotForTest<K extends SlotId>({ id, props, modules }: { id: K; props: SlotPropsMap[K]; modules: Record<string, Importer> }) {\n const [cache] = useState(() => new Map<SlotId, AnyComponent | null>());\n const resolve = (slot: SlotId) => {\n if (!cache.has(slot)) cache.set(slot, createSlotComponent(slot, modules));\n return cache.get(slot)!;\n };\n return <SlotHost id={id} props={props} resolve={resolve} forget={(slot) => cache.delete(slot)} />;\n}\n\nexport function BranchBarSlot(props: BranchBarProps) {\n return <SlotHost id=\"branch-bar\" props={props} />;\n}\n\nexport function DiffPaneSlot(props: DiffPaneProps) {\n return <SlotHost id=\"diff-pane\" props={props} />;\n}\n\nexport function TerminalPaneSlot(props: TerminalPaneProps) {\n return <SlotHost id=\"terminal-pane\" props={props} />;\n}\n\nexport function PreviewPaneSlot(props: PreviewPaneProps) {\n return <SlotHost id=\"preview-pane\" props={props} />;\n}\n\nexport function SessionInsightChipSlot(props: SessionInsightChipProps) {\n return <SlotHost id=\"session-insight-chip\" props={props} />;\n}\n"],"file":"slots-CV9ZuLQU.js"}
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/slots.tsx"],"sourcesContent":["/**\n * routes/verse/shell/slots.tsx — where Chat mounts other units' UI (unit C0;\n * SPEC-310C §7 \"Slots\").\n *\n * C2 owns the chat, the dock and the header; C4, C5 and C7 own things that\n * render INSIDE them. Rather than C2 importing their files — which would not\n * compile until every one of them landed, and would drag each into C2's\n * chunk — C2 renders these slots. Each resolves ONE fixed file lazily and:\n * - renders nothing until that file lands (and `isSlotAvailable` says so,\n * so C2 can hide the toggle for a pane that does not exist yet);\n * - loads in its own chunk (xterm and the diff viewer stay off the chat's\n * critical path — SPEC-310C budgets: chat critical JS ≤ 350 KB);\n * - is fenced by an error boundary: a crashed inline slot vanishes, a\n * crashed pane says so with a retry — neither takes the chat down.\n *\n * The props below ARE the contract: each owning unit's component takes\n * exactly its slot's props, as a NAMED export (`export function BranchBar`).\n *\n * Resolution uses `import.meta.glob` with literal paths — the same \"absent\n * file is an absent key\" mechanism VerseApp uses for sections.\n */\nimport { Component, Suspense, lazy, useState, type ComponentType, type ErrorInfo, type ReactNode } from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport type { VerseReviewScope, VerseTerminalLaunchVia } from '../../../../core/verse/workbench-types.js';\n\n// ===========================================================================\n// Contracts\n// ===========================================================================\n\n/** Open the Review pane on a root, at a scope (and optionally one file). */\nexport interface DiffPaneRequest {\n root: string;\n scope: VerseReviewScope;\n file?: string;\n}\n\n/** A file the chat's latest turn touched — the Review pane's \"This turn\" scope (C2 derives it from events). */\nexport interface TurnFileChange {\n root: string;\n /** Relative to `root`. */\n path: string;\n}\n\n/** Open the Terminal pane: a tab at `root`, optionally pasting (never running) a command. */\nexport interface TerminalOpenRequest {\n /** Changes on every request, so the same request twice is two opens. */\n nonce: number;\n root?: string;\n /** Force a new tab instead of focusing the root's existing one (⌃⇧`). */\n newTab?: boolean;\n /** \"Run in terminal\": pasted at the prompt, NEVER executed — the operator presses Enter. */\n paste?: string;\n /** Apps [Launch ▸]: the catalog app to launch in the new tab. */\n appId?: string;\n /**\n * With `appId`: HOW to launch it — the app's own CLI (`native`) or through\n * Ollama (`ollama`, with `model` naming the local tag). These mirror\n * VerseTerminalCreateRequest; the page only names the choice, the server\n * resolves the argv from the catalog and the installed binaries\n * (`resolveAppLaunch`) and refuses via/model without an appId.\n */\n via?: VerseTerminalLaunchVia;\n /** With `via: 'ollama'`: the local model tag to launch the app on. */\n model?: string;\n /** Preview's dev-server Start: the server to run in the new tab. */\n devServerId?: string;\n}\n\n/** Open the Preview pane on a loopback URL, a chat artifact, or a dev server. */\nexport interface PreviewOpenRequest {\n nonce: number;\n url?: string;\n artifactPath?: string;\n devServerId?: string;\n}\n\n/** C5 `git/BranchBar.tsx` → `export function BranchBar(props: BranchBarProps)` — above the composer. */\nexport interface BranchBarProps {\n sessionId: string;\n /** The chat's roots in priority order; the bar shows one row per root with changes, then \"Show N more\". */\n roots: readonly string[];\n /** The ± counts open the branch diff: C2 opens the dock's Review pane with this. */\n onOpenDiff: (request: DiffPaneRequest) => void;\n}\n\n/** C5 `git/DiffPane.tsx` → `export function DiffPane(props: DiffPaneProps)` — the dock's Review pane. */\nexport interface DiffPaneProps {\n sessionId: string;\n roots: readonly string[];\n /** Latest open request; null = the pane chooses (Uncommitted, first root with changes). */\n request: (DiffPaneRequest & { nonce: number }) | null;\n turnFiles: readonly TurnFileChange[];\n /** \"Add to message\": drafts `path:line: note` into the composer (⌘Enter sends). */\n onAddToMessage: (text: string) => void;\n /** False while the pane is a background tab — stop timers, skip work. */\n visible: boolean;\n}\n\n/** C4 `dock/terminal/TerminalPane.tsx` → `export function TerminalPane(props: TerminalPaneProps)`. */\nexport interface TerminalPaneProps {\n sessionId: string;\n roots: readonly string[];\n request: TerminalOpenRequest | null;\n /** \"Send selection to chat\": the text, already fenced as a code block. */\n onSendToChat: (text: string) => void;\n visible: boolean;\n}\n\n/** C4 `dock/preview/PreviewPane.tsx` → `export function PreviewPane(props: PreviewPaneProps)`. */\nexport interface PreviewPaneProps {\n sessionId: string;\n roots: readonly string[];\n request: PreviewOpenRequest | null;\n /** Dev-server Start runs the server in a terminal tab — through the dock, never directly. */\n onOpenTerminal: (request: Omit<TerminalOpenRequest, 'nonce'>) => void;\n visible: boolean;\n}\n\n/** C7 `mind/SessionInsightChip.tsx` → `export function SessionInsightChip(props)` — the chat header chip. */\nexport interface SessionInsightChipProps {\n sessionId: string;\n}\n\nexport interface SlotPropsMap {\n 'branch-bar': BranchBarProps;\n 'diff-pane': DiffPaneProps;\n 'terminal-pane': TerminalPaneProps;\n 'preview-pane': PreviewPaneProps;\n 'session-insight-chip': SessionInsightChipProps;\n}\n\nexport type SlotId = keyof SlotPropsMap;\n\n/**\n * Each slot's fixed file (relative to routes/verse), its named export, its\n * owner, and how a crash is shown: an INLINE slot vanishes; a PANE fills the\n * dock, so it says it failed and offers a retry.\n */\nexport const SLOTS = {\n 'branch-bar': { path: 'git/BranchBar.tsx', exportName: 'BranchBar', owner: 'C5', kind: 'inline', label: 'Branch bar' },\n 'diff-pane': { path: 'git/DiffPane.tsx', exportName: 'DiffPane', owner: 'C5', kind: 'pane', label: 'Review' },\n 'terminal-pane': { path: 'dock/terminal/TerminalPane.tsx', exportName: 'TerminalPane', owner: 'C4', kind: 'pane', label: 'Terminal' },\n 'preview-pane': { path: 'dock/preview/PreviewPane.tsx', exportName: 'PreviewPane', owner: 'C4', kind: 'pane', label: 'Preview' },\n 'session-insight-chip': { path: 'mind/SessionInsightChip.tsx', exportName: 'SessionInsightChip', owner: 'C7', kind: 'inline', label: 'Insight' },\n} as const satisfies Record<SlotId, { path: string; exportName: string; owner: string; kind: 'inline' | 'pane'; label: string }>;\n\nexport const SLOT_IDS = Object.keys(SLOTS) as SlotId[];\n\n// ===========================================================================\n// Resolution\n// ===========================================================================\n\ntype Importer = () => Promise<unknown>;\n\n/**\n * Every slot file that exists at build time, keyed `../<path>`. Literal\n * patterns (no wildcards): a slot may only ever load its owner's one file.\n * EXPORTED for the slot test, which checks it against SLOTS.\n */\nexport const SLOT_MODULES: Record<string, Importer> = import.meta.glob([\n '../git/BranchBar.tsx',\n '../git/DiffPane.tsx',\n '../dock/terminal/TerminalPane.tsx',\n '../dock/preview/PreviewPane.tsx',\n '../mind/SessionInsightChip.tsx',\n]);\n\nfunction importerFor(id: SlotId, modules: Record<string, Importer>): Importer | undefined {\n return modules[`../${SLOTS[id].path}`];\n}\n\n/** True once the slot's file has landed in this build. */\nexport function isSlotAvailable(id: SlotId, modules: Record<string, Importer> = SLOT_MODULES): boolean {\n return importerFor(id, modules) !== undefined;\n}\n\ntype AnyComponent = ComponentType<Record<string, unknown>>;\n\n/**\n * Build the lazy component for one slot. Absent → renders nothing. Present\n * but exporting no component of the contract name → throws on load, so the\n * boundary shows it (a slot that silently renders nothing because of a typo\n * would look exactly like \"not landed yet\").\n */\nexport function createSlotComponent(id: SlotId, modules: Record<string, Importer> = SLOT_MODULES): AnyComponent | null {\n const importer = importerFor(id, modules);\n if (!importer) return null;\n const { exportName } = SLOTS[id];\n return lazy(async () => {\n const mod = (await importer()) as Record<string, unknown>;\n const exported = mod[exportName];\n if (typeof exported !== 'function' && (typeof exported !== 'object' || exported === null)) {\n throw new Error(`${SLOTS[id].path} exports no ${exportName}`);\n }\n return { default: exported as AnyComponent };\n });\n}\n\n// One lazy component per slot for the life of the page: re-creating it per\n// render would remount the pane (and drop a terminal's scrollback) each time.\nconst RESOLVED = new Map<SlotId, AnyComponent | null>();\nfunction slotComponent(id: SlotId): AnyComponent | null {\n if (!RESOLVED.has(id)) RESOLVED.set(id, createSlotComponent(id));\n return RESOLVED.get(id)!;\n}\n\n// ===========================================================================\n// Rendering\n// ===========================================================================\n\ninterface BoundaryProps {\n kind: 'inline' | 'pane';\n label: string;\n /** Drop the cached module and mount a fresh boundary (a failed lazy import stays failed otherwise). */\n onRetry: () => void;\n children: ReactNode;\n}\n\nclass SlotBoundary extends Component<BoundaryProps, { failed: boolean }> {\n override state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n // The console, not the page: operator copy never carries a stack or a path.\n console.error(`[verse] ${this.props.label} failed`, error, info.componentStack);\n }\n\n override render(): ReactNode {\n if (!this.state.failed) return this.props.children;\n if (this.props.kind === 'inline') return null;\n return <PaneFailed label={this.props.label} onRetry={this.props.onRetry} />;\n }\n}\n\nfunction PaneFailed({ label, onRetry }: { label: string; onRetry: () => void }) {\n return (\n <EmptyState\n compact\n tone=\"error\"\n title={`${label} could not load`}\n body=\"The rest of the chat still works.\"\n action={\n <Button variant=\"subtle\" size=\"sm\" onClick={onRetry}>\n Try again\n </Button>\n }\n />\n );\n}\n\nfunction SlotHost<K extends SlotId>({\n id,\n props,\n resolve = slotComponent,\n forget = (slot: SlotId) => RESOLVED.delete(slot),\n}: {\n id: K;\n props: SlotPropsMap[K];\n resolve?: (id: SlotId) => AnyComponent | null;\n forget?: (id: SlotId) => void;\n}) {\n const [attempt, setAttempt] = useState(0);\n const Resolved = resolve(id);\n if (!Resolved) return null;\n const { kind, label } = SLOTS[id];\n const retry = () => {\n forget(id);\n setAttempt((n) => n + 1);\n };\n return (\n // A new key per attempt: a fresh boundary AND a fresh lazy component.\n <SlotBoundary key={attempt} kind={kind} label={label} onRetry={retry}>\n <Suspense fallback={null}>\n <Resolved {...(props as unknown as Record<string, unknown>)} />\n </Suspense>\n </SlotBoundary>\n );\n}\n\n/** Test seam: render a slot against an injected module map (fake landed / absent / broken files). */\nexport function SlotForTest<K extends SlotId>({ id, props, modules }: { id: K; props: SlotPropsMap[K]; modules: Record<string, Importer> }) {\n const [cache] = useState(() => new Map<SlotId, AnyComponent | null>());\n const resolve = (slot: SlotId) => {\n if (!cache.has(slot)) cache.set(slot, createSlotComponent(slot, modules));\n return cache.get(slot)!;\n };\n return <SlotHost id={id} props={props} resolve={resolve} forget={(slot) => cache.delete(slot)} />;\n}\n\nexport function BranchBarSlot(props: BranchBarProps) {\n return <SlotHost id=\"branch-bar\" props={props} />;\n}\n\nexport function DiffPaneSlot(props: DiffPaneProps) {\n return <SlotHost id=\"diff-pane\" props={props} />;\n}\n\nexport function TerminalPaneSlot(props: TerminalPaneProps) {\n return <SlotHost id=\"terminal-pane\" props={props} />;\n}\n\nexport function PreviewPaneSlot(props: PreviewPaneProps) {\n return <SlotHost id=\"preview-pane\" props={props} />;\n}\n\nexport function SessionInsightChipSlot(props: SessionInsightChipProps) {\n return <SlotHost id=\"session-insight-chip\" props={props} />;\n}\n"],"file":"slots-DDd8cEoh.js"}
@@ -0,0 +1,2 @@
1
+ import{D as e,F as t,U as n,c as r,l as i,o as a}from"./global-BkNl4e6E.js";import{F as o}from"./VerseConsoleApp-CTF3Shs0.js";import{n as s}from"./control-queries-Dv-h1Clu.js";var c=`/api/verse/authority`,l=`/api/verse/authority/draft`,u=`/api/verse/fleet/live`,d=`/api/verse/leader`,f=`/api/verse/learning`,p=`/api/verse/fleet/history?days=90`,m=`/api/reasoning/digest?days=30`,h=`/api/verse/budget/history?days=8`,g=Object.freeze({authority:`verse-authority`,authorityDraft:`verse-authority-draft`,fleetLive:`verse-fleet-live`,leader:`verse-leader`,learning:`verse-learning`,fleetHistory:`verse-fleet-history-90d`,reasoningDigest:`verse-reasoning-digest-30d`,seatHistory:`verse-seat-history-8d`});function _(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var v={authority(e){return _(e)&&e.v===1&&typeof e.switch==`string`&&_(e.grant)?e:null},draft(e){return _(e)&&_(e.payload)&&typeof e.digest==`string`?e:null},fleetLive(e){return _(e)&&e.v===1&&Array.isArray(e.runs)&&Array.isArray(e.repos)&&Array.isArray(e.lanes)&&_(e.summary)?e:null},leader(e){return _(e)&&e.v===1&&Array.isArray(e.timeline)&&Array.isArray(e.actions)&&_(e.hitRate)?e:null},learning(e){return _(e)&&e.v===1&&Array.isArray(e.versions)&&Array.isArray(e.experiments)?e:null},activity(e){return _(e)&&Array.isArray(e.needsYou)&&Array.isArray(e.running)&&_(e.sources)?e:null},fleetHistory(e){return _(e)&&Array.isArray(e.days)&&_(e.sources)&&_(e.funnel)?e:null},reasoningDigest(e){return _(e)&&Array.isArray(e.insights)&&Array.isArray(e.trends)&&_(e.totals)?e:null},seatHistory(e){return _(e)&&e.v===1&&Array.isArray(e.series)?e:null}};function y(e,t){return t instanceof a?t.status===404?`${e} is not in this build yet, so this card has no source.`:t.status===503?`${e} failed to load on the server.`:`${e} answered HTTP ${t.status}.`:`${e} could not be reached.`}function b(e,t,n,i){return{key:e,fetch:async e=>{try{let a=i(await r(t,e));return a===null?{value:null,available:!0,reason:`${n} answered in a shape this version does not recognise, so nothing is shown rather than guessed.`}:{value:a,available:!0,reason:null}}catch(e){if(e instanceof a&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{value:null,available:!1,reason:y(n,e)}}}}}var x=b(g.authority,c,`The authority service`,v.authority),S=b(g.authorityDraft,l,`The grant draft`,v.draft),C=b(g.fleetLive,u,`The live fleet view`,v.fleetLive),w=b(g.leader,d,`The Leader`,v.leader),T=b(g.learning,f,`Self-improvement`,v.learning),E=b(g.fleetHistory,p,`Fleet history`,v.fleetHistory),D=b(g.reasoningDigest,m,`The reasoning digest`,v.reasoningDigest),O=b(g.seatHistory,h,`Seat history`,v.seatHistory);async function k(n,r){let a=e();if(!a)throw new s;let o=await i(n,r,a);return t(),o}async function A(e){let t=await k(c,e);return n(g.authority),n(g.fleetLive),o(),(e.action===`grant`||e.action===`re-approve`)&&n(g.authorityDraft),v.authority(t)}async function j(e){let t=await k(u,e);return n(g.fleetLive),o(),t}async function M(e){let t=await k(d,e);return n(g.leader),o(),t}async function N(e,t){if(!/^\/api\/[^\s\\]*$/.test(e)||e.startsWith(`//`)||e.includes(`..`))throw Error(`That action points outside this app, so it was not sent.`);let r=await k(e,t);return o(),n(g.fleetLive),n(g.leader),n(g.authority),r}export{w as a,j as c,D as d,O as f,C as i,M as l,x as n,T as o,E as r,A as s,S as t,N as u};
2
+ //# sourceMappingURL=surface-data-BFxAlefI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"surface-data-DLvmUX9z.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface-data.ts"],"sourcesContent":["/**\n * routes/verse/command/surface-data.ts — every read and write behind the\n * four 3.10 surfaces (Command, Fleet, Growth, Mind), in one place (unit C7).\n *\n * GET /api/verse/authority AuthorityStatusV1 (B-U1)\n * GET /api/verse/authority/draft AuthorityGrantDraft (B-U1)\n * POST /api/verse/authority AuthorityActionRequest\n * GET /api/verse/fleet/live FleetLiveSnapshotV1 (B-U5)\n * POST /api/verse/fleet/live FleetLiveActionRequest\n * GET /api/verse/leader LeaderStateV1 (B-U8)\n * POST /api/verse/leader LeaderActionRequest\n * GET /api/verse/learning LearningStateV1 (B-U9)\n * GET /api/verse/activity VerseActivityResponse (C1 — read through\n * the shell's ONE useActivity poll, never a\n * second loop from here)\n * GET /api/verse/fleet/history FleetHistoryResponse (A8)\n * GET /api/reasoning/digest ReasoningDigest (A7)\n * GET /api/verse/budget BudgetView (A9 — budget-queries.ts)\n * GET /api/verse/budget/history CapacityHistoryResponse (3.10.1 — recorded\n * seat window history for the burn-downs)\n * GET /api/models per-model ROI (data/queries.ts)\n *\n * WHY every read is OPTIONAL: Track B's modules land in parallel with these\n * surfaces (SPEC-310BC-COORD), and C0's mount answers 404 for a family that\n * has not landed. A 404 is \"this card has no source yet\", never \"Command is\n * broken\" — so a read resolves to `{ value: null, available: false, reason }`\n * and the card renders a designed not-available state from `reason`. A body\n * this client cannot narrow is treated the same way (available, but nothing\n * shown rather than guessed). 401 and aborts still propagate: an expired\n * read session is the whole app's state, not one card's.\n *\n * Writes pull the held mutation token (VerseControlLockedError without one —\n * the surfaces route every write through useGuardedAction, which opens the\n * token dialog first) and invalidate exactly the keys they change.\n */\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { refreshActivity } from '../shell/useActivity.js';\nimport type { OptionalFleetRead } from '../autonomy/fleet-contract.js';\nimport type {\n AuthorityActionRequest,\n AuthorityGrantDraft,\n AuthorityStatusV1,\n} from '../../../../core/authority/types.js';\nimport type { FleetLiveActionRequest, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { LeaderActionRequest, LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport type { LearningStateV1 } from '../../../../core/learn/harness-types.js';\nimport type { VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { FleetHistoryResponse } from '../../../../core/verse/fleet-history-types.js';\nimport type { ReasoningDigest } from '../../../../core/reasoning/types.js';\nimport type { CapacityHistoryResponse } from '../../../../core/routing/capacity-history-types.js';\n\n/** A read that is allowed to be absent (the autonomy folder's shape, reused). */\nexport type OptionalRead<T> = OptionalFleetRead<T>;\n\nexport const AUTHORITY_PATH = '/api/verse/authority';\nexport const AUTHORITY_DRAFT_PATH = '/api/verse/authority/draft';\nexport const FLEET_LIVE_PATH = '/api/verse/fleet/live';\nexport const LEADER_PATH = '/api/verse/leader';\nexport const LEARNING_PATH = '/api/verse/learning';\nexport const FLEET_HISTORY_PATH = '/api/verse/fleet/history?days=90';\nexport const REASONING_DIGEST_PATH = '/api/reasoning/digest?days=30';\n/** Eight days: the whole weekly window plus the day before it opened. */\nexport const SEAT_HISTORY_PATH = '/api/verse/budget/history?days=8';\n\nexport const SURFACE_KEYS = Object.freeze({\n authority: 'verse-authority',\n authorityDraft: 'verse-authority-draft',\n fleetLive: 'verse-fleet-live',\n leader: 'verse-leader',\n learning: 'verse-learning',\n fleetHistory: 'verse-fleet-history-90d',\n reasoningDigest: 'verse-reasoning-digest-30d',\n seatHistory: 'verse-seat-history-8d',\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Structural guards: just enough to know the body is the contract's shape\n * (version tag + the arrays the cards iterate), so a mismatched server can\n * never crash a render with `undefined.map`. Field-level honesty (null =\n * unknown) is the cards' job.\n */\nexport const narrow = {\n authority(raw: unknown): AuthorityStatusV1 | null {\n return isRecord(raw) && raw['v'] === 1 && typeof raw['switch'] === 'string' && isRecord(raw['grant']) ? (raw as unknown as AuthorityStatusV1) : null;\n },\n draft(raw: unknown): AuthorityGrantDraft | null {\n return isRecord(raw) && isRecord(raw['payload']) && typeof raw['digest'] === 'string' ? (raw as unknown as AuthorityGrantDraft) : null;\n },\n fleetLive(raw: unknown): FleetLiveSnapshotV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['runs']) && Array.isArray(raw['repos']) && Array.isArray(raw['lanes']) && isRecord(raw['summary'])\n ? (raw as unknown as FleetLiveSnapshotV1)\n : null;\n },\n leader(raw: unknown): LeaderStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['timeline']) && Array.isArray(raw['actions']) && isRecord(raw['hitRate'])\n ? (raw as unknown as LeaderStateV1)\n : null;\n },\n learning(raw: unknown): LearningStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['versions']) && Array.isArray(raw['experiments']) ? (raw as unknown as LearningStateV1) : null;\n },\n activity(raw: unknown): VerseActivityResponse | null {\n return isRecord(raw) && Array.isArray(raw['needsYou']) && Array.isArray(raw['running']) && isRecord(raw['sources']) ? (raw as unknown as VerseActivityResponse) : null;\n },\n fleetHistory(raw: unknown): FleetHistoryResponse | null {\n return isRecord(raw) && Array.isArray(raw['days']) && isRecord(raw['sources']) && isRecord(raw['funnel']) ? (raw as unknown as FleetHistoryResponse) : null;\n },\n reasoningDigest(raw: unknown): ReasoningDigest | null {\n return isRecord(raw) && Array.isArray(raw['insights']) && Array.isArray(raw['trends']) && isRecord(raw['totals']) ? (raw as unknown as ReasoningDigest) : null;\n },\n /** Series and points are re-checked one by one where they are merged (command-model mergeSeatHistory). */\n seatHistory(raw: unknown): CapacityHistoryResponse | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['series']) ? (raw as unknown as CapacityHistoryResponse) : null;\n },\n};\n\n/** Operator words for a source that did not answer (never a path, never a trace). */\nfunction absence(what: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return `${what} is not in this build yet, so this card has no source.`;\n if (err.status === 503) return `${what} failed to load on the server.`;\n return `${what} answered HTTP ${err.status}.`;\n }\n return `${what} could not be reached.`;\n}\n\n/** A QueryDef whose value is an OptionalRead: 404 / unreachable / unrecognised all resolve, never throw. */\nexport function optionalQuery<T>(key: string, path: string, what: string, guard: (raw: unknown) => T | null): QueryDef<OptionalRead<T>> {\n return {\n key,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(path, signal);\n const value = guard(raw);\n if (value === null) {\n return { value: null, available: true, reason: `${what} answered in a shape this version does not recognise, so nothing is shown rather than guessed.` };\n }\n return { value, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { value: null, available: false, reason: absence(what, err) };\n }\n },\n };\n}\n\nexport const authorityQuery = optionalQuery(SURFACE_KEYS.authority, AUTHORITY_PATH, 'The authority service', narrow.authority);\nexport const authorityDraftQuery = optionalQuery(SURFACE_KEYS.authorityDraft, AUTHORITY_DRAFT_PATH, 'The grant draft', narrow.draft);\nexport const fleetLiveQuery = optionalQuery(SURFACE_KEYS.fleetLive, FLEET_LIVE_PATH, 'The live fleet view', narrow.fleetLive);\nexport const leaderQuery = optionalQuery(SURFACE_KEYS.leader, LEADER_PATH, 'The Leader', narrow.leader);\nexport const learningQuery = optionalQuery(SURFACE_KEYS.learning, LEARNING_PATH, 'Self-improvement', narrow.learning);\nexport const fleetHistoryQuery = optionalQuery(SURFACE_KEYS.fleetHistory, FLEET_HISTORY_PATH, 'Fleet history', narrow.fleetHistory);\nexport const reasoningDigestQuery = optionalQuery(SURFACE_KEYS.reasoningDigest, REASONING_DIGEST_PATH, 'The reasoning digest', narrow.reasoningDigest);\n/** Optional like every surface read: a server without the route leaves the burn-downs on this page's own readings. */\nexport const seatHistoryQuery = optionalQuery(SURFACE_KEYS.seatHistory, SEAT_HISTORY_PATH, 'Seat history', narrow.seatHistory);\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/**\n * One authority action. The server answers the new AuthorityStatusV1 for\n * every form; raising past the grant is its 409 `grant-required` (the page\n * opens the Touch ID sheet BEFORE ever sending that, but the server is the\n * authority — a stale page gets the refusal, not a raise).\n */\nexport async function postAuthority(action: AuthorityActionRequest): Promise<AuthorityStatusV1 | null> {\n const result = await post<unknown>(AUTHORITY_PATH, action);\n invalidate(SURFACE_KEYS.authority);\n invalidate(SURFACE_KEYS.fleetLive);\n void refreshActivity();\n if (action.action === 'grant' || action.action === 're-approve') invalidate(SURFACE_KEYS.authorityDraft);\n return narrow.authority(result);\n}\n\nexport async function postFleetLive(action: FleetLiveActionRequest): Promise<unknown> {\n const result = await post<unknown>(FLEET_LIVE_PATH, action);\n invalidate(SURFACE_KEYS.fleetLive);\n void refreshActivity();\n return result;\n}\n\nexport async function postLeader(action: LeaderActionRequest): Promise<unknown> {\n const result = await post<unknown>(LEADER_PATH, action);\n invalidate(SURFACE_KEYS.leader);\n void refreshActivity();\n return result;\n}\n\n/**\n * A Needs-you item's own action. `path` was validated by the producer\n * (isNeedsYouItem → isSafeApiRoute) and is re-checked here: the mutation\n * token must never be aimed anywhere but this origin's /api/.\n */\nexport async function postNeedsYouAction(path: string, body: Record<string, unknown>): Promise<unknown> {\n if (!/^\\/api\\/[^\\s\\\\]*$/.test(path) || path.startsWith('//') || path.includes('..')) {\n throw new Error('That action points outside this app, so it was not sent.');\n }\n const result = await post<unknown>(path, body);\n void refreshActivity();\n invalidate(SURFACE_KEYS.fleetLive);\n invalidate(SURFACE_KEYS.leader);\n invalidate(SURFACE_KEYS.authority);\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"surface-data-BFxAlefI.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface-data.ts"],"sourcesContent":["/**\n * routes/verse/command/surface-data.ts — every read and write behind the\n * four 3.10 surfaces (Command, Fleet, Growth, Mind), in one place (unit C7).\n *\n * GET /api/verse/authority AuthorityStatusV1 (B-U1)\n * GET /api/verse/authority/draft AuthorityGrantDraft (B-U1)\n * POST /api/verse/authority AuthorityActionRequest\n * GET /api/verse/fleet/live FleetLiveSnapshotV1 (B-U5)\n * POST /api/verse/fleet/live FleetLiveActionRequest\n * GET /api/verse/leader LeaderStateV1 (B-U8)\n * POST /api/verse/leader LeaderActionRequest\n * GET /api/verse/learning LearningStateV1 (B-U9)\n * GET /api/verse/activity VerseActivityResponse (C1 — read through\n * the shell's ONE useActivity poll, never a\n * second loop from here)\n * GET /api/verse/fleet/history FleetHistoryResponse (A8)\n * GET /api/reasoning/digest ReasoningDigest (A7)\n * GET /api/verse/budget BudgetView (A9 — budget-queries.ts)\n * GET /api/verse/budget/history CapacityHistoryResponse (3.10.1 — recorded\n * seat window history for the burn-downs)\n * GET /api/models per-model ROI (data/queries.ts)\n *\n * WHY every read is OPTIONAL: Track B's modules land in parallel with these\n * surfaces (SPEC-310BC-COORD), and C0's mount answers 404 for a family that\n * has not landed. A 404 is \"this card has no source yet\", never \"Command is\n * broken\" — so a read resolves to `{ value: null, available: false, reason }`\n * and the card renders a designed not-available state from `reason`. A body\n * this client cannot narrow is treated the same way (available, but nothing\n * shown rather than guessed). 401 and aborts still propagate: an expired\n * read session is the whole app's state, not one card's.\n *\n * Writes pull the held mutation token (VerseControlLockedError without one —\n * the surfaces route every write through useGuardedAction, which opens the\n * token dialog first) and invalidate exactly the keys they change.\n */\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { refreshActivity } from '../shell/useActivity.js';\nimport type { OptionalFleetRead } from '../autonomy/fleet-contract.js';\nimport type {\n AuthorityActionRequest,\n AuthorityGrantDraft,\n AuthorityStatusV1,\n} from '../../../../core/authority/types.js';\nimport type { FleetLiveActionRequest, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { LeaderActionRequest, LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport type { LearningStateV1 } from '../../../../core/learn/harness-types.js';\nimport type { VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { FleetHistoryResponse } from '../../../../core/verse/fleet-history-types.js';\nimport type { ReasoningDigest } from '../../../../core/reasoning/types.js';\nimport type { CapacityHistoryResponse } from '../../../../core/routing/capacity-history-types.js';\n\n/** A read that is allowed to be absent (the autonomy folder's shape, reused). */\nexport type OptionalRead<T> = OptionalFleetRead<T>;\n\nexport const AUTHORITY_PATH = '/api/verse/authority';\nexport const AUTHORITY_DRAFT_PATH = '/api/verse/authority/draft';\nexport const FLEET_LIVE_PATH = '/api/verse/fleet/live';\nexport const LEADER_PATH = '/api/verse/leader';\nexport const LEARNING_PATH = '/api/verse/learning';\nexport const FLEET_HISTORY_PATH = '/api/verse/fleet/history?days=90';\nexport const REASONING_DIGEST_PATH = '/api/reasoning/digest?days=30';\n/** Eight days: the whole weekly window plus the day before it opened. */\nexport const SEAT_HISTORY_PATH = '/api/verse/budget/history?days=8';\n\nexport const SURFACE_KEYS = Object.freeze({\n authority: 'verse-authority',\n authorityDraft: 'verse-authority-draft',\n fleetLive: 'verse-fleet-live',\n leader: 'verse-leader',\n learning: 'verse-learning',\n fleetHistory: 'verse-fleet-history-90d',\n reasoningDigest: 'verse-reasoning-digest-30d',\n seatHistory: 'verse-seat-history-8d',\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Structural guards: just enough to know the body is the contract's shape\n * (version tag + the arrays the cards iterate), so a mismatched server can\n * never crash a render with `undefined.map`. Field-level honesty (null =\n * unknown) is the cards' job.\n */\nexport const narrow = {\n authority(raw: unknown): AuthorityStatusV1 | null {\n return isRecord(raw) && raw['v'] === 1 && typeof raw['switch'] === 'string' && isRecord(raw['grant']) ? (raw as unknown as AuthorityStatusV1) : null;\n },\n draft(raw: unknown): AuthorityGrantDraft | null {\n return isRecord(raw) && isRecord(raw['payload']) && typeof raw['digest'] === 'string' ? (raw as unknown as AuthorityGrantDraft) : null;\n },\n fleetLive(raw: unknown): FleetLiveSnapshotV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['runs']) && Array.isArray(raw['repos']) && Array.isArray(raw['lanes']) && isRecord(raw['summary'])\n ? (raw as unknown as FleetLiveSnapshotV1)\n : null;\n },\n leader(raw: unknown): LeaderStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['timeline']) && Array.isArray(raw['actions']) && isRecord(raw['hitRate'])\n ? (raw as unknown as LeaderStateV1)\n : null;\n },\n learning(raw: unknown): LearningStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['versions']) && Array.isArray(raw['experiments']) ? (raw as unknown as LearningStateV1) : null;\n },\n activity(raw: unknown): VerseActivityResponse | null {\n return isRecord(raw) && Array.isArray(raw['needsYou']) && Array.isArray(raw['running']) && isRecord(raw['sources']) ? (raw as unknown as VerseActivityResponse) : null;\n },\n fleetHistory(raw: unknown): FleetHistoryResponse | null {\n return isRecord(raw) && Array.isArray(raw['days']) && isRecord(raw['sources']) && isRecord(raw['funnel']) ? (raw as unknown as FleetHistoryResponse) : null;\n },\n reasoningDigest(raw: unknown): ReasoningDigest | null {\n return isRecord(raw) && Array.isArray(raw['insights']) && Array.isArray(raw['trends']) && isRecord(raw['totals']) ? (raw as unknown as ReasoningDigest) : null;\n },\n /** Series and points are re-checked one by one where they are merged (command-model mergeSeatHistory). */\n seatHistory(raw: unknown): CapacityHistoryResponse | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['series']) ? (raw as unknown as CapacityHistoryResponse) : null;\n },\n};\n\n/** Operator words for a source that did not answer (never a path, never a trace). */\nfunction absence(what: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return `${what} is not in this build yet, so this card has no source.`;\n if (err.status === 503) return `${what} failed to load on the server.`;\n return `${what} answered HTTP ${err.status}.`;\n }\n return `${what} could not be reached.`;\n}\n\n/** A QueryDef whose value is an OptionalRead: 404 / unreachable / unrecognised all resolve, never throw. */\nexport function optionalQuery<T>(key: string, path: string, what: string, guard: (raw: unknown) => T | null): QueryDef<OptionalRead<T>> {\n return {\n key,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(path, signal);\n const value = guard(raw);\n if (value === null) {\n return { value: null, available: true, reason: `${what} answered in a shape this version does not recognise, so nothing is shown rather than guessed.` };\n }\n return { value, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { value: null, available: false, reason: absence(what, err) };\n }\n },\n };\n}\n\nexport const authorityQuery = optionalQuery(SURFACE_KEYS.authority, AUTHORITY_PATH, 'The authority service', narrow.authority);\nexport const authorityDraftQuery = optionalQuery(SURFACE_KEYS.authorityDraft, AUTHORITY_DRAFT_PATH, 'The grant draft', narrow.draft);\nexport const fleetLiveQuery = optionalQuery(SURFACE_KEYS.fleetLive, FLEET_LIVE_PATH, 'The live fleet view', narrow.fleetLive);\nexport const leaderQuery = optionalQuery(SURFACE_KEYS.leader, LEADER_PATH, 'The Leader', narrow.leader);\nexport const learningQuery = optionalQuery(SURFACE_KEYS.learning, LEARNING_PATH, 'Self-improvement', narrow.learning);\nexport const fleetHistoryQuery = optionalQuery(SURFACE_KEYS.fleetHistory, FLEET_HISTORY_PATH, 'Fleet history', narrow.fleetHistory);\nexport const reasoningDigestQuery = optionalQuery(SURFACE_KEYS.reasoningDigest, REASONING_DIGEST_PATH, 'The reasoning digest', narrow.reasoningDigest);\n/** Optional like every surface read: a server without the route leaves the burn-downs on this page's own readings. */\nexport const seatHistoryQuery = optionalQuery(SURFACE_KEYS.seatHistory, SEAT_HISTORY_PATH, 'Seat history', narrow.seatHistory);\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/**\n * One authority action. The server answers the new AuthorityStatusV1 for\n * every form; raising past the grant is its 409 `grant-required` (the page\n * opens the Touch ID sheet BEFORE ever sending that, but the server is the\n * authority — a stale page gets the refusal, not a raise).\n */\nexport async function postAuthority(action: AuthorityActionRequest): Promise<AuthorityStatusV1 | null> {\n const result = await post<unknown>(AUTHORITY_PATH, action);\n invalidate(SURFACE_KEYS.authority);\n invalidate(SURFACE_KEYS.fleetLive);\n void refreshActivity();\n if (action.action === 'grant' || action.action === 're-approve') invalidate(SURFACE_KEYS.authorityDraft);\n return narrow.authority(result);\n}\n\nexport async function postFleetLive(action: FleetLiveActionRequest): Promise<unknown> {\n const result = await post<unknown>(FLEET_LIVE_PATH, action);\n invalidate(SURFACE_KEYS.fleetLive);\n void refreshActivity();\n return result;\n}\n\nexport async function postLeader(action: LeaderActionRequest): Promise<unknown> {\n const result = await post<unknown>(LEADER_PATH, action);\n invalidate(SURFACE_KEYS.leader);\n void refreshActivity();\n return result;\n}\n\n/**\n * A Needs-you item's own action. `path` was validated by the producer\n * (isNeedsYouItem → isSafeApiRoute) and is re-checked here: the mutation\n * token must never be aimed anywhere but this origin's /api/.\n */\nexport async function postNeedsYouAction(path: string, body: Record<string, unknown>): Promise<unknown> {\n if (!/^\\/api\\/[^\\s\\\\]*$/.test(path) || path.startsWith('//') || path.includes('..')) {\n throw new Error('That action points outside this app, so it was not sent.');\n }\n const result = await post<unknown>(path, body);\n void refreshActivity();\n invalidate(SURFACE_KEYS.fleetLive);\n invalidate(SURFACE_KEYS.leader);\n invalidate(SURFACE_KEYS.authority);\n return result;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{V as e}from"./global-BkNl4e6E.js";import{p as t}from"./queries-THD05gHP.js";import{T as n,w as r,x as i}from"./VerseConsoleApp-CTF3Shs0.js";import{n as a,t as o}from"./budget-queries-CP7hgR-p.js";import{n as s}from"./cloud-queries-BsOepFz6.js";import{r as c}from"./overnight-queries-C_AfcL7q.js";import{a as l,d as u,f as d,i as f,n as p,o as m,r as h}from"./surface-data-BFxAlefI.js";var g={command:[p,f,l,m,h,a,d,s],fleet:[f,c,a,o],growth:[h,m,t(`30d`)],mind:[l,u,i,n],chat:[i,r,n]},_=6e4;async function v(t,n={}){let r=n.ensure??e;for(let e of g[t]??[])try{if(n.beforeEach&&!await n.beforeEach())return;await r(e.key,()=>e.fetch(),_)}catch{}}export{_ as PREFETCH_FRESH_MS,g as SURFACE_PREFETCH,v as prefetchSurfaceData};
2
+ //# sourceMappingURL=surface-prefetch-CHusyO9q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-prefetch-CHusyO9q.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 seatHistoryQuery,\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 // seatHistoryQuery: without it the first Command visit draws each seat's\n // burn-down from this page's own readings (\"since Verse opened\"), then\n // redraws once the recorded week lands — the reset-on-reload look 3.10.1\n // set out to remove.\n // cloudQuery (3.11): the Cloud card's overview — without it a first visit\n // paints \"Reading the cloud lane…\" under the burn-downs.\n command: [authorityQuery, fleetLiveQuery, leaderQuery, learningQuery, fleetHistoryQuery, budgetQuery, seatHistoryQuery, cloudQuery],\n fleet: [fleetLiveQuery, overnightQuery, budgetQuery, budgetPreviewQuery],\n growth: [fleetHistoryQuery, learningQuery, modelsQuery('30d')],\n mind: [leaderQuery, reasoningDigestQuery, verseBootstrapQuery, verseWorkspacesQuery],\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":"wYAsCA,IAAa,EAAmF,CAO9F,QAAS,CAAC,EAAgB,EAAgB,EAAa,EAAe,EAAmB,EAAa,EAAkB,CAAU,EAClI,MAAO,CAAC,EAAgB,EAAgB,EAAa,CAAkB,EACvE,OAAQ,CAAC,EAAmB,EAAe,EAAY,KAAK,CAAC,EAC7D,KAAM,CAAC,EAAa,EAAsB,EAAqB,CAAoB,EACnF,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 +1,2 @@
1
- import{C as e}from"./verse-model-yHPwjf-7.js";import{n as t}from"./tool-semantics-GX8ScuSH.js";import{i as n}from"./sidebar-model-i4WRuQ6j.js";function r(n){let r=0;for(let e=n.length-1;e>=0;--e)if(n[e].kind===`user`){r=e;break}let i=[],a=[];for(let o=r;o<n.length;o+=1){let r=n[o];if(r.kind!==`tool`)continue;let s={toolUseId:r.toolUseId,kind:t(r.name)===`task`?`subagent`:`tool`,name:r.name,detail:e(r.input)||r.name,startedAt:r.at,status:r.result===null?`running`:r.result.isError?`failed`:`done`,durationMs:r.durationMs};(s.status===`running`?i:a).push(s)}return[...i,...a.reverse()]}function i(e,t,r){let i=new Map;for(let e of t?.running??[])e.sessionId!==r&&i.set(e.sessionId,{sessionId:e.sessionId,title:e.title,engine:e.engine,startedAt:e.startedAt,live:n(e.live)});for(let t of e)t.id===r||t.status!==`running`||i.has(t.id)||i.set(t.id,{sessionId:t.id,title:t.title,engine:t.engine,startedAt:null,live:null});return[...i.values()]}function a(e,t){let n=e.filter(e=>e.status===`running`);return{turn:n.length,subagents:n.filter(e=>e.kind===`subagent`).length,chats:t.length,total:n.length+t.length}}function o(e){let t=`${e.total} running task${e.total===1?``:`s`}`,n=[];return e.turn>0&&n.push(`${e.turn} in this chat`),e.chats>0&&n.push(`${e.chats} other chat${e.chats===1?``:`s`}`),n.length>0?`${t}: ${n.join(`, `)}`:t}export{a as countTasks,r as currentTurnTasks,o as describeTaskCounts,i as otherRunningChats};
2
- //# sourceMappingURL=tasks-model-DWs5u9RO.js.map
1
+ import{C as e}from"./verse-model-BQ0Y2CSr.js";import{n as t}from"./tool-semantics-GX8ScuSH.js";import{i as n}from"./sidebar-model-C5wVXGpb.js";function r(n){let r=0;for(let e=n.length-1;e>=0;--e)if(n[e].kind===`user`){r=e;break}let i=[],a=[];for(let o=r;o<n.length;o+=1){let r=n[o];if(r.kind!==`tool`)continue;let s={toolUseId:r.toolUseId,kind:t(r.name)===`task`?`subagent`:`tool`,name:r.name,detail:e(r.input)||r.name,startedAt:r.at,status:r.result===null?`running`:r.result.isError?`failed`:`done`,durationMs:r.durationMs};(s.status===`running`?i:a).push(s)}return[...i,...a.reverse()]}function i(e,t,r){let i=new Map;for(let e of t?.running??[])e.sessionId!==r&&i.set(e.sessionId,{sessionId:e.sessionId,title:e.title,engine:e.engine,startedAt:e.startedAt,live:n(e.live)});for(let t of e)t.id===r||t.status!==`running`||i.has(t.id)||i.set(t.id,{sessionId:t.id,title:t.title,engine:t.engine,startedAt:null,live:null});return[...i.values()]}function a(e,t){let n=e.filter(e=>e.status===`running`);return{turn:n.length,subagents:n.filter(e=>e.kind===`subagent`).length,chats:t.length,total:n.length+t.length}}function o(e){let t=`${e.total} running task${e.total===1?``:`s`}`,n=[];return e.turn>0&&n.push(`${e.turn} in this chat`),e.chats>0&&n.push(`${e.chats} other chat${e.chats===1?``:`s`}`),n.length>0?`${t}: ${n.join(`, `)}`:t}export{a as countTasks,r as currentTurnTasks,o as describeTaskCounts,i as otherRunningChats};
2
+ //# sourceMappingURL=tasks-model-DvkWveXs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tasks-model-DWs5u9RO.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/tasks-model.ts"],"sourcesContent":["/**\n * routes/verse/chat/tasks-model.ts — what is running right now, for the\n * \"◌ 3 running tasks\" chip and the dock's Tasks pane (SPEC-310C §2–§3, C2).\n *\n * Two kinds of task, because the operator is waiting on both:\n * - THIS TURN: the open chat's tool calls and subagents since its last ask\n * (a running `Task` is a subagent; everything else is a tool);\n * - OTHER CHATS: every other chat with a turn in flight, from activity\n * (C1) when it answers, else from the session list's `status`.\n *\n * Pure over transcript items and the session / activity lists.\n */\nimport type { VerseEngine, VerseSession } from '../../../data/api-types.js';\nimport type { VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { TranscriptItem } from '../verse-store.js';\nimport { summarizeToolInput } from '../verse-model.js';\nimport { liveLine } from './sidebar-model.js';\nimport { actionForName } from './tool-semantics.js';\n\nexport type TurnTaskStatus = 'running' | 'done' | 'failed';\n\nexport interface TurnTask {\n toolUseId: string;\n kind: 'subagent' | 'tool';\n /** Tool name as the CLI spelled it. */\n name: string;\n /** What it is doing: the command, the path, the subagent's description. */\n detail: string;\n /** ISO time the call started. */\n startedAt: string;\n status: TurnTaskStatus;\n durationMs: number | null;\n}\n\nexport interface ChatTask {\n sessionId: string;\n title: string;\n engine: VerseEngine;\n /** ISO start of the running turn when activity knows it; null = unknown. */\n startedAt: string | null;\n /** The muted \"what it is doing\" line; null when unknown. */\n live: string | null;\n}\n\n/** The last turn's tool calls, running first (in start order), then finished (newest first). */\nexport function currentTurnTasks(items: readonly TranscriptItem[]): TurnTask[] {\n let start = 0;\n for (let i = items.length - 1; i >= 0; i -= 1) {\n if (items[i]!.kind === 'user') {\n start = i;\n break;\n }\n }\n const running: TurnTask[] = [];\n const finished: TurnTask[] = [];\n for (let i = start; i < items.length; i += 1) {\n const item = items[i]!;\n if (item.kind !== 'tool') continue;\n const task: TurnTask = {\n toolUseId: item.toolUseId,\n kind: actionForName(item.name) === 'task' ? 'subagent' : 'tool',\n name: item.name,\n detail: summarizeToolInput(item.input) || item.name,\n startedAt: item.at,\n status: item.result === null ? 'running' : item.result.isError ? 'failed' : 'done',\n durationMs: item.durationMs,\n };\n (task.status === 'running' ? running : finished).push(task);\n }\n return [...running, ...finished.reverse()];\n}\n\nexport function otherRunningChats(\n sessions: readonly VerseSession[],\n activity: VerseActivityResponse | null,\n currentId: string | null,\n): ChatTask[] {\n const out = new Map<string, ChatTask>();\n for (const row of activity?.running ?? []) {\n if (row.sessionId === currentId) continue;\n out.set(row.sessionId, {\n sessionId: row.sessionId,\n title: row.title,\n engine: row.engine,\n startedAt: row.startedAt,\n live: liveLine(row.live),\n });\n }\n // The session list can know about a run activity has not reported (a\n // server without C1's route, or the few seconds between polls).\n for (const session of sessions) {\n if (session.id === currentId || session.status !== 'running' || out.has(session.id)) continue;\n out.set(session.id, { sessionId: session.id, title: session.title, engine: session.engine, startedAt: null, live: null });\n }\n return [...out.values()];\n}\n\nexport interface TaskCounts {\n /** Running calls in this turn. */\n turn: number;\n /** Of which subagents. */\n subagents: number;\n /** Other chats running. */\n chats: number;\n total: number;\n}\n\nexport function countTasks(turn: readonly TurnTask[], chats: readonly ChatTask[]): TaskCounts {\n const running = turn.filter((t) => t.status === 'running');\n return {\n turn: running.length,\n subagents: running.filter((t) => t.kind === 'subagent').length,\n chats: chats.length,\n total: running.length + chats.length,\n };\n}\n\n/** \"3 running tasks\" — and what they are, for the chip's accessible name. */\nexport function describeTaskCounts(counts: TaskCounts): string {\n const head = `${counts.total} running task${counts.total === 1 ? '' : 's'}`;\n const parts: string[] = [];\n if (counts.turn > 0) parts.push(`${counts.turn} in this chat`);\n if (counts.chats > 0) parts.push(`${counts.chats} other chat${counts.chats === 1 ? '' : 's'}`);\n return parts.length > 0 ? `${head}: ${parts.join(', ')}` : head;\n}\n"],"mappings":"+IA6CA,SAAgB,EAAiB,EAA8C,CAC7E,IAAI,EAAQ,EACZ,IAAK,IAAI,EAAI,EAAM,OAAS,EAAG,GAAK,EAAG,IACrC,GAAI,EAAM,EAAE,CAAE,OAAS,OAAQ,CAC7B,EAAQ,EACR,KACF,CAEF,IAAM,EAAsB,CAAC,EACvB,EAAuB,CAAC,EAC9B,IAAK,IAAI,EAAI,EAAO,EAAI,EAAM,OAAQ,GAAK,EAAG,CAC5C,IAAM,EAAO,EAAM,GACnB,GAAI,EAAK,OAAS,OAAQ,SAC1B,IAAM,EAAiB,CACrB,UAAW,EAAK,UAChB,KAAM,EAAc,EAAK,IAAI,IAAM,OAAS,WAAa,OACzD,KAAM,EAAK,KACX,OAAQ,EAAmB,EAAK,KAAK,GAAK,EAAK,KAC/C,UAAW,EAAK,GAChB,OAAQ,EAAK,SAAW,KAAO,UAAY,EAAK,OAAO,QAAU,SAAW,OAC5E,WAAY,EAAK,UACnB,GACC,EAAK,SAAW,UAAY,EAAU,EAAA,CAAU,KAAK,CAAI,CAC5D,CACA,MAAO,CAAC,GAAG,EAAS,GAAG,EAAS,QAAQ,CAAC,CAC3C,CAEA,SAAgB,EACd,EACA,EACA,EACY,CACZ,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAO,GAAU,SAAW,CAAC,EAClC,EAAI,YAAc,GACtB,EAAI,IAAI,EAAI,UAAW,CACrB,UAAW,EAAI,UACf,MAAO,EAAI,MACX,OAAQ,EAAI,OACZ,UAAW,EAAI,UACf,KAAM,EAAS,EAAI,IAAI,CACzB,CAAC,EAIH,IAAK,IAAM,KAAW,EAChB,EAAQ,KAAO,GAAa,EAAQ,SAAW,WAAa,EAAI,IAAI,EAAQ,EAAE,GAClF,EAAI,IAAI,EAAQ,GAAI,CAAE,UAAW,EAAQ,GAAI,MAAO,EAAQ,MAAO,OAAQ,EAAQ,OAAQ,UAAW,KAAM,KAAM,IAAK,CAAC,EAE1H,MAAO,CAAC,GAAG,EAAI,OAAO,CAAC,CACzB,CAYA,SAAgB,EAAW,EAA2B,EAAwC,CAC5F,IAAM,EAAU,EAAK,OAAQ,GAAM,EAAE,SAAW,SAAS,EACzD,MAAO,CACL,KAAM,EAAQ,OACd,UAAW,EAAQ,OAAQ,GAAM,EAAE,OAAS,UAAU,CAAC,CAAC,OACxD,MAAO,EAAM,OACb,MAAO,EAAQ,OAAS,EAAM,MAChC,CACF,CAGA,SAAgB,EAAmB,EAA4B,CAC7D,IAAM,EAAO,GAAG,EAAO,MAAM,eAAe,EAAO,QAAU,EAAI,GAAK,MAChE,EAAkB,CAAC,EAGzB,OAFI,EAAO,KAAO,GAAG,EAAM,KAAK,GAAG,EAAO,KAAK,cAAc,EACzD,EAAO,MAAQ,GAAG,EAAM,KAAK,GAAG,EAAO,MAAM,aAAa,EAAO,QAAU,EAAI,GAAK,KAAK,EACtF,EAAM,OAAS,EAAI,GAAG,EAAK,IAAI,EAAM,KAAK,IAAI,IAAM,CAC7D"}
1
+ {"version":3,"file":"tasks-model-DvkWveXs.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/tasks-model.ts"],"sourcesContent":["/**\n * routes/verse/chat/tasks-model.ts — what is running right now, for the\n * \"◌ 3 running tasks\" chip and the dock's Tasks pane (SPEC-310C §2–§3, C2).\n *\n * Two kinds of task, because the operator is waiting on both:\n * - THIS TURN: the open chat's tool calls and subagents since its last ask\n * (a running `Task` is a subagent; everything else is a tool);\n * - OTHER CHATS: every other chat with a turn in flight, from activity\n * (C1) when it answers, else from the session list's `status`.\n *\n * Pure over transcript items and the session / activity lists.\n */\nimport type { VerseEngine, VerseSession } from '../../../data/api-types.js';\nimport type { VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { TranscriptItem } from '../verse-store.js';\nimport { summarizeToolInput } from '../verse-model.js';\nimport { liveLine } from './sidebar-model.js';\nimport { actionForName } from './tool-semantics.js';\n\nexport type TurnTaskStatus = 'running' | 'done' | 'failed';\n\nexport interface TurnTask {\n toolUseId: string;\n kind: 'subagent' | 'tool';\n /** Tool name as the CLI spelled it. */\n name: string;\n /** What it is doing: the command, the path, the subagent's description. */\n detail: string;\n /** ISO time the call started. */\n startedAt: string;\n status: TurnTaskStatus;\n durationMs: number | null;\n}\n\nexport interface ChatTask {\n sessionId: string;\n title: string;\n engine: VerseEngine;\n /** ISO start of the running turn when activity knows it; null = unknown. */\n startedAt: string | null;\n /** The muted \"what it is doing\" line; null when unknown. */\n live: string | null;\n}\n\n/** The last turn's tool calls, running first (in start order), then finished (newest first). */\nexport function currentTurnTasks(items: readonly TranscriptItem[]): TurnTask[] {\n let start = 0;\n for (let i = items.length - 1; i >= 0; i -= 1) {\n if (items[i]!.kind === 'user') {\n start = i;\n break;\n }\n }\n const running: TurnTask[] = [];\n const finished: TurnTask[] = [];\n for (let i = start; i < items.length; i += 1) {\n const item = items[i]!;\n if (item.kind !== 'tool') continue;\n const task: TurnTask = {\n toolUseId: item.toolUseId,\n kind: actionForName(item.name) === 'task' ? 'subagent' : 'tool',\n name: item.name,\n detail: summarizeToolInput(item.input) || item.name,\n startedAt: item.at,\n status: item.result === null ? 'running' : item.result.isError ? 'failed' : 'done',\n durationMs: item.durationMs,\n };\n (task.status === 'running' ? running : finished).push(task);\n }\n return [...running, ...finished.reverse()];\n}\n\nexport function otherRunningChats(\n sessions: readonly VerseSession[],\n activity: VerseActivityResponse | null,\n currentId: string | null,\n): ChatTask[] {\n const out = new Map<string, ChatTask>();\n for (const row of activity?.running ?? []) {\n if (row.sessionId === currentId) continue;\n out.set(row.sessionId, {\n sessionId: row.sessionId,\n title: row.title,\n engine: row.engine,\n startedAt: row.startedAt,\n live: liveLine(row.live),\n });\n }\n // The session list can know about a run activity has not reported (a\n // server without C1's route, or the few seconds between polls).\n for (const session of sessions) {\n if (session.id === currentId || session.status !== 'running' || out.has(session.id)) continue;\n out.set(session.id, { sessionId: session.id, title: session.title, engine: session.engine, startedAt: null, live: null });\n }\n return [...out.values()];\n}\n\nexport interface TaskCounts {\n /** Running calls in this turn. */\n turn: number;\n /** Of which subagents. */\n subagents: number;\n /** Other chats running. */\n chats: number;\n total: number;\n}\n\nexport function countTasks(turn: readonly TurnTask[], chats: readonly ChatTask[]): TaskCounts {\n const running = turn.filter((t) => t.status === 'running');\n return {\n turn: running.length,\n subagents: running.filter((t) => t.kind === 'subagent').length,\n chats: chats.length,\n total: running.length + chats.length,\n };\n}\n\n/** \"3 running tasks\" — and what they are, for the chip's accessible name. */\nexport function describeTaskCounts(counts: TaskCounts): string {\n const head = `${counts.total} running task${counts.total === 1 ? '' : 's'}`;\n const parts: string[] = [];\n if (counts.turn > 0) parts.push(`${counts.turn} in this chat`);\n if (counts.chats > 0) parts.push(`${counts.chats} other chat${counts.chats === 1 ? '' : 's'}`);\n return parts.length > 0 ? `${head}: ${parts.join(', ')}` : head;\n}\n"],"mappings":"+IA6CA,SAAgB,EAAiB,EAA8C,CAC7E,IAAI,EAAQ,EACZ,IAAK,IAAI,EAAI,EAAM,OAAS,EAAG,GAAK,EAAG,IACrC,GAAI,EAAM,EAAE,CAAE,OAAS,OAAQ,CAC7B,EAAQ,EACR,KACF,CAEF,IAAM,EAAsB,CAAC,EACvB,EAAuB,CAAC,EAC9B,IAAK,IAAI,EAAI,EAAO,EAAI,EAAM,OAAQ,GAAK,EAAG,CAC5C,IAAM,EAAO,EAAM,GACnB,GAAI,EAAK,OAAS,OAAQ,SAC1B,IAAM,EAAiB,CACrB,UAAW,EAAK,UAChB,KAAM,EAAc,EAAK,IAAI,IAAM,OAAS,WAAa,OACzD,KAAM,EAAK,KACX,OAAQ,EAAmB,EAAK,KAAK,GAAK,EAAK,KAC/C,UAAW,EAAK,GAChB,OAAQ,EAAK,SAAW,KAAO,UAAY,EAAK,OAAO,QAAU,SAAW,OAC5E,WAAY,EAAK,UACnB,GACC,EAAK,SAAW,UAAY,EAAU,EAAA,CAAU,KAAK,CAAI,CAC5D,CACA,MAAO,CAAC,GAAG,EAAS,GAAG,EAAS,QAAQ,CAAC,CAC3C,CAEA,SAAgB,EACd,EACA,EACA,EACY,CACZ,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAO,GAAU,SAAW,CAAC,EAClC,EAAI,YAAc,GACtB,EAAI,IAAI,EAAI,UAAW,CACrB,UAAW,EAAI,UACf,MAAO,EAAI,MACX,OAAQ,EAAI,OACZ,UAAW,EAAI,UACf,KAAM,EAAS,EAAI,IAAI,CACzB,CAAC,EAIH,IAAK,IAAM,KAAW,EAChB,EAAQ,KAAO,GAAa,EAAQ,SAAW,WAAa,EAAI,IAAI,EAAQ,EAAE,GAClF,EAAI,IAAI,EAAQ,GAAI,CAAE,UAAW,EAAQ,GAAI,MAAO,EAAQ,MAAO,OAAQ,EAAQ,OAAQ,UAAW,KAAM,KAAM,IAAK,CAAC,EAE1H,MAAO,CAAC,GAAG,EAAI,OAAO,CAAC,CACzB,CAYA,SAAgB,EAAW,EAA2B,EAAwC,CAC5F,IAAM,EAAU,EAAK,OAAQ,GAAM,EAAE,SAAW,SAAS,EACzD,MAAO,CACL,KAAM,EAAQ,OACd,UAAW,EAAQ,OAAQ,GAAM,EAAE,OAAS,UAAU,CAAC,CAAC,OACxD,MAAO,EAAM,OACb,MAAO,EAAQ,OAAS,EAAM,MAChC,CACF,CAGA,SAAgB,EAAmB,EAA4B,CAC7D,IAAM,EAAO,GAAG,EAAO,MAAM,eAAe,EAAO,QAAU,EAAI,GAAK,MAChE,EAAkB,CAAC,EAGzB,OAFI,EAAO,KAAO,GAAG,EAAM,KAAK,GAAG,EAAO,KAAK,cAAc,EACzD,EAAO,MAAQ,GAAG,EAAM,KAAK,GAAG,EAAO,MAAM,aAAa,EAAO,QAAU,EAAI,GAAK,KAAK,EACtF,EAAM,OAAS,EAAI,GAAG,EAAK,IAAI,EAAM,KAAK,IAAI,IAAM,CAC7D"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./index-Dk8R-3a7.js";var t=e();function n({size:e=16,children:n,...r}){return(0,t.jsx)(`svg`,{width:e,height:e,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,...r,children:n})}function r(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`m4.5 6.25 2 1.75-2 1.75M8.25 10h3`})]})}function i(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01`})]})}function a(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`m4.5 6.5 3.5 3.5 3.5-3.5`})})}function o(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M2.5 6v4h2.5l3.5 3V3L5 6H2.5Z`}),(0,t.jsx)(`path`,{d:`M11 5.5a3.5 3.5 0 0 1 0 5M12.75 3.75a6 6 0 0 1 0 8.5`})]})}function s(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M13 8H3.5M7.5 4 3.5 8l4 4`})})}function c(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M3 8h9.5M8.5 4l4 4-4 4`})})}function l(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M13 8a5 5 0 1 1-1.46-3.54`}),(0,t.jsx)(`path`,{d:`M13 2.75v2.5h-2.5`})]})}function u(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`8.5`,rx:`1.25`}),(0,t.jsx)(`path`,{d:`M6 13.75h4M8 11.25v2.5`})]})}function d(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`4.75`,y:`1.75`,width:`6.5`,height:`12.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M7.25 12h1.5`})]})}function f(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M5 3.5v9l7-4.5-7-4.5Z`})})}function p(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M9 1.75H4.25a1 1 0 0 0-1 1v10.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5.5L9 1.75Z`}),(0,t.jsx)(`path`,{d:`M9 1.75V5.5h3.75`})]})}function m(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`2.25`,y:`2.25`,width:`11.5`,height:`4.5`,rx:`1`}),(0,t.jsx)(`rect`,{x:`2.25`,y:`9.25`,width:`11.5`,height:`4.5`,rx:`1`}),(0,t.jsx)(`path`,{d:`M4.75 4.5h.01M4.75 11.5h.01`})]})}export{p as a,i as c,m as d,r as f,u as i,l,c as n,d as o,a as r,f as s,s as t,o as u};
2
- //# sourceMappingURL=terminal-icons-Ct9cZsEK.js.map
1
+ import{n as e}from"./index-DbDw9UAs.js";var t=e();function n({size:e=16,children:n,...r}){return(0,t.jsx)(`svg`,{width:e,height:e,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,...r,children:n})}function r(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`m4.5 6.25 2 1.75-2 1.75M8.25 10h3`})]})}function i(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01`})]})}function a(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`m4.5 6.5 3.5 3.5 3.5-3.5`})})}function o(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M2.5 6v4h2.5l3.5 3V3L5 6H2.5Z`}),(0,t.jsx)(`path`,{d:`M11 5.5a3.5 3.5 0 0 1 0 5M12.75 3.75a6 6 0 0 1 0 8.5`})]})}function s(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M13 8H3.5M7.5 4 3.5 8l4 4`})})}function c(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M3 8h9.5M8.5 4l4 4-4 4`})})}function l(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M13 8a5 5 0 1 1-1.46-3.54`}),(0,t.jsx)(`path`,{d:`M13 2.75v2.5h-2.5`})]})}function u(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`8.5`,rx:`1.25`}),(0,t.jsx)(`path`,{d:`M6 13.75h4M8 11.25v2.5`})]})}function d(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`4.75`,y:`1.75`,width:`6.5`,height:`12.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M7.25 12h1.5`})]})}function f(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M5 3.5v9l7-4.5-7-4.5Z`})})}function p(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M9 1.75H4.25a1 1 0 0 0-1 1v10.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5.5L9 1.75Z`}),(0,t.jsx)(`path`,{d:`M9 1.75V5.5h3.75`})]})}function m(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`2.25`,y:`2.25`,width:`11.5`,height:`4.5`,rx:`1`}),(0,t.jsx)(`rect`,{x:`2.25`,y:`9.25`,width:`11.5`,height:`4.5`,rx:`1`}),(0,t.jsx)(`path`,{d:`M4.75 4.5h.01M4.75 11.5h.01`})]})}export{p as a,i as c,m as d,r as f,u as i,l,c as n,d as o,a as r,f as s,s as t,o as u};
2
+ //# sourceMappingURL=terminal-icons-Dp6pJgV2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-icons-Ct9cZsEK.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-icons.tsx"],"sourcesContent":["/**\n * dock/terminal/terminal-icons.tsx — the Terminal / Preview panes' own 16px\n * glyphs (unit C4). Same grammar as components/primitives/icons.tsx (16-unit\n * box, 1.5 stroke, round caps, currentColor, decorative) so they sit beside\n * the shared set; kept here because the shared set is not this unit's file.\n */\nimport type { ReactNode, SVGProps } from 'react';\n\nexport interface GlyphProps extends Omit<SVGProps<SVGSVGElement>, 'children' | 'viewBox'> {\n size?: number;\n}\n\nfunction Glyph({ size = 16, children, ...rest }: GlyphProps & { children: ReactNode }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}\n strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\" {...rest}>\n {children}\n </svg>\n );\n}\n\nexport function TerminalGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"m4.5 6.25 2 1.75-2 1.75M8.25 10h3\" /></Glyph>;\n}\n\nexport function PreviewGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01\" /></Glyph>;\n}\n\nexport function ChevronDownGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m4.5 6.5 3.5 3.5 3.5-3.5\" /></Glyph>;\n}\n\n/** Screen-reader mode: a speaker with sound lines. */\nexport function ScreenReaderGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.5 6v4h2.5l3.5 3V3L5 6H2.5Z\" /><path d=\"M11 5.5a3.5 3.5 0 0 1 0 5M12.75 3.75a6 6 0 0 1 0 8.5\" /></Glyph>;\n}\n\nexport function ArrowLeftGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M13 8H3.5M7.5 4 3.5 8l4 4\" /></Glyph>;\n}\n\nexport function ArrowRightGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M3 8h9.5M8.5 4l4 4-4 4\" /></Glyph>;\n}\n\nexport function ReloadGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M13 8a5 5 0 1 1-1.46-3.54\" /><path d=\"M13 2.75v2.5h-2.5\" /></Glyph>;\n}\n\nexport function DesktopGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"8.5\" rx=\"1.25\" /><path d=\"M6 13.75h4M8 11.25v2.5\" /></Glyph>;\n}\n\nexport function PhoneGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"4.75\" y=\"1.75\" width=\"6.5\" height=\"12.5\" rx=\"1.5\" /><path d=\"M7.25 12h1.5\" /></Glyph>;\n}\n\nexport function PlayGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M5 3.5v9l7-4.5-7-4.5Z\" /></Glyph>;\n}\n\nexport function FileGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M9 1.75H4.25a1 1 0 0 0-1 1v10.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5.5L9 1.75Z\" /><path d=\"M9 1.75V5.5h3.75\" /></Glyph>;\n}\n\nexport function ServerGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"2.25\" y=\"2.25\" width=\"11.5\" height=\"4.5\" rx=\"1\" /><rect x=\"2.25\" y=\"9.25\" width=\"11.5\" height=\"4.5\" rx=\"1\" /><path d=\"M4.75 4.5h.01M4.75 11.5h.01\" /></Glyph>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"terminal-icons-Dp6pJgV2.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-icons.tsx"],"sourcesContent":["/**\n * dock/terminal/terminal-icons.tsx — the Terminal / Preview panes' own 16px\n * glyphs (unit C4). Same grammar as components/primitives/icons.tsx (16-unit\n * box, 1.5 stroke, round caps, currentColor, decorative) so they sit beside\n * the shared set; kept here because the shared set is not this unit's file.\n */\nimport type { ReactNode, SVGProps } from 'react';\n\nexport interface GlyphProps extends Omit<SVGProps<SVGSVGElement>, 'children' | 'viewBox'> {\n size?: number;\n}\n\nfunction Glyph({ size = 16, children, ...rest }: GlyphProps & { children: ReactNode }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}\n strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\" {...rest}>\n {children}\n </svg>\n );\n}\n\nexport function TerminalGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"m4.5 6.25 2 1.75-2 1.75M8.25 10h3\" /></Glyph>;\n}\n\nexport function PreviewGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01\" /></Glyph>;\n}\n\nexport function ChevronDownGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m4.5 6.5 3.5 3.5 3.5-3.5\" /></Glyph>;\n}\n\n/** Screen-reader mode: a speaker with sound lines. */\nexport function ScreenReaderGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.5 6v4h2.5l3.5 3V3L5 6H2.5Z\" /><path d=\"M11 5.5a3.5 3.5 0 0 1 0 5M12.75 3.75a6 6 0 0 1 0 8.5\" /></Glyph>;\n}\n\nexport function ArrowLeftGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M13 8H3.5M7.5 4 3.5 8l4 4\" /></Glyph>;\n}\n\nexport function ArrowRightGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M3 8h9.5M8.5 4l4 4-4 4\" /></Glyph>;\n}\n\nexport function ReloadGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M13 8a5 5 0 1 1-1.46-3.54\" /><path d=\"M13 2.75v2.5h-2.5\" /></Glyph>;\n}\n\nexport function DesktopGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"8.5\" rx=\"1.25\" /><path d=\"M6 13.75h4M8 11.25v2.5\" /></Glyph>;\n}\n\nexport function PhoneGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"4.75\" y=\"1.75\" width=\"6.5\" height=\"12.5\" rx=\"1.5\" /><path d=\"M7.25 12h1.5\" /></Glyph>;\n}\n\nexport function PlayGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M5 3.5v9l7-4.5-7-4.5Z\" /></Glyph>;\n}\n\nexport function FileGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M9 1.75H4.25a1 1 0 0 0-1 1v10.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5.5L9 1.75Z\" /><path d=\"M9 1.75V5.5h3.75\" /></Glyph>;\n}\n\nexport function ServerGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"2.25\" y=\"2.25\" width=\"11.5\" height=\"4.5\" rx=\"1\" /><rect x=\"2.25\" y=\"9.25\" width=\"11.5\" height=\"4.5\" rx=\"1\" /><path d=\"M4.75 4.5h.01M4.75 11.5h.01\" /></Glyph>;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-D5XOdyw8.js","names":[],"sources":["../../../../../../src/core/cloud/types.ts"],"sourcesContent":["/**\n * Cloud lane (3.11) — FROZEN CONTRACTS.\n *\n * Ashlr Verse launches Claude Code cloud sessions (claude.ai/code) that run on\n * the operator's Claude account — including its cloud / usage credits once\n * the subscription window is spent — and tracks what they deliver.\n *\n * How a launch works (verified 2026-09-24 against Claude Code 2.1.280):\n * - A NEW cloud session can only be created by the interactive CLI:\n * `claude --cloud \"<task>\"` (with `-p` it is refused). Run under a\n * pseudo-terminal it prints, then exits 0:\n * Created cloud session: <title>\n * View: https://claude.ai/code/session_<id>?from=cli&m=0\n * Resume with: claude --teleport session_<id>\n * - It must run as the `claude-a` seat's native-profile launcher, which is\n * signed in with a claude.ai account; API-key auth is refused (\"cloud\n * sessions require authentication with a Claude.ai account\").\n * - The session clones the cwd's `origin` GitHub repo at the cwd's CURRENT\n * branch, which must be pushed. The Claude GitHub app already has access\n * to ashlrai/*.\n * - Attaching to / reading an existing session from the CLI is NOT enabled\n * for this account, so Verse never reads a session back. Every task is\n * told to DELIVER to GitHub instead (see delivery-contract.ts): push\n * branch `ashlr-cloud/<taskId>` and open a DRAFT PR whose body carries a\n * fenced `ashlr-cloud-report` JSON block. Verse tracks tasks with `gh`.\n * - The credit balance is not readable (neither `/usage` nor the CLI show\n * it), so spend is an ESTIMATE the operator can calibrate; the UI always\n * says so and links to https://claude.ai/settings/usage.\n *\n * Nothing here merges. A cloud PR is judged and merged by the existing merge\n * gates (custody) or by Mason — never by the cloud lane.\n */\n\nexport const CLOUD_TASK_SCHEMA_VERSION = 1 as const;\nexport const CLOUD_BUDGET_SCHEMA_VERSION = 1 as const;\n\n/** Branch every cloud task delivers to: `ashlr-cloud/<taskId>`. */\nexport const CLOUD_BRANCH_PREFIX = 'ashlr-cloud/' as const;\n/** Fenced block language tag carrying the task report in the PR body. */\nexport const CLOUD_REPORT_FENCE = 'ashlr-cloud-report' as const;\n/** Draft PR title prefix, so tasks are recognisable in GitHub lists. */\nexport const CLOUD_PR_TITLE_PREFIX = '[ashlr-cloud]' as const;\n/** Where the real credit balance lives (not readable programmatically). */\nexport const CLOUD_BALANCE_URL = 'https://claude.ai/settings/usage' as const;\n/** The seat whose claude.ai login launches cloud sessions. */\nexport const CLOUD_SEAT_ID = 'claude-a' as const;\n/** A task with no PR after this long is marked `expired` (still linkable). */\nexport const CLOUD_TASK_EXPIRY_MS = 6 * 60 * 60 * 1000;\n/** Max prompt length accepted from any entry point (chars). */\nexport const CLOUD_PROMPT_MAX_CHARS = 20_000;\n/** Launch timeout for the PTY-wrapped CLI (creation took < 10 s in testing). */\nexport const CLOUD_LAUNCH_TIMEOUT_MS = 90_000;\n\n/** Task ids look like `ct_20260924T2331_k3f9q2` (sortable, branch-safe). */\nexport const CLOUD_TASK_ID_PATTERN = /^ct_\\d{8}T\\d{4}_[a-z0-9]{6}$/;\n\nexport type CloudTaskOrigin = 'chat' | 'operator' | 'leader' | 'self-improve' | 'cli';\n\n/**\n * queued accepted, waiting for its repo's launch slot (launches are\n * serialised per checkout folder — two concurrent `--cloud` runs\n * in one folder conflict).\n * launching PTY launch in flight.\n * running session created; no PR yet.\n * pr-open draft/ready PR exists on `ashlr-cloud/<id>`.\n * merged PR merged (by gates or Mason).\n * closed PR closed without merge (or dismissed by the operator).\n * failed launch failed (see stateReason / failure code).\n * expired no PR after CLOUD_TASK_EXPIRY_MS — the session link still works.\n */\nexport type CloudTaskState = 'queued' | 'launching' | 'running' | 'pr-open' | 'merged' | 'closed' | 'failed' | 'expired';\n\nexport const CLOUD_TERMINAL_STATES: readonly CloudTaskState[] = ['merged', 'closed', 'failed', 'expired'];\n\nexport type CloudLaunchFailureCode =\n | 'seat-unavailable' // claude-a launcher missing / not a native profile\n | 'auth' // not signed in with a claude.ai account\n | 'not-enabled' // cloud sessions not enabled for the account\n | 'rate-limited' // provider refused (no credits left / limit)\n | 'no-remote' // checkout has no GitHub origin / branch not pushed\n | 'checkout-failed' // could not prepare the isolated checkout\n | 'budget' // refused by the cloud budget before launching\n | 'timeout' // CLI produced no session within CLOUD_LAUNCH_TIMEOUT_MS\n | 'unparsed' // CLI exited but printed no recognisable session\n | 'unknown';\n\nexport interface CloudTaskReport {\n status: 'done' | 'partial' | 'blocked' | 'no-change';\n summary: string;\n testsRun: string[];\n risks: string[];\n filesChanged?: number;\n}\n\nexport interface CloudTaskPr {\n number: number;\n url: string;\n state: 'open' | 'closed' | 'merged';\n draft: boolean;\n title: string;\n}\n\nexport interface CloudTaskV1 {\n v: typeof CLOUD_TASK_SCHEMA_VERSION;\n id: string;\n /** GitHub `owner/name`. */\n repo: string;\n /** Branch the session starts from (must exist on origin). */\n baseBranch: string;\n /** Always `${CLOUD_BRANCH_PREFIX}${id}`. */\n branch: string;\n /** Short human title (≤ 80 chars). */\n title: string;\n /** The operator's / Leader's task text — WITHOUT the delivery contract. */\n prompt: string;\n origin: CloudTaskOrigin;\n requestedBy: 'mason' | 'leader' | 'self-improve';\n seat: string;\n sessionId: string | null;\n sessionUrl: string | null;\n state: CloudTaskState;\n /** Plain-language reason for the current state (never raw ISO / paths). */\n stateReason: string | null;\n failure: CloudLaunchFailureCode | null;\n createdAt: string;\n launchedAt: string | null;\n updatedAt: string;\n pr: CloudTaskPr | null;\n report: CloudTaskReport | null;\n /** Budget accounting — an ESTIMATE fixed at launch. */\n estimatedCostUsd: number;\n /** Backlog item this task came from (self-improvement), if any. */\n backlogItemId: string | null;\n /** Needs-you item created for approval (Leader-suggested tasks), if any. */\n needsYouId: string | null;\n}\n\nexport interface CloudBudgetV1 {\n v: typeof CLOUD_BUDGET_SCHEMA_VERSION;\n /** Credits the operator says the account has (default 250). */\n creditsTotalUsd: number;\n /**\n * Operator calibration: credits already spent BEFORE the tasks Verse\n * tracks (or a correction after checking claude.ai). Added to the estimate.\n */\n creditsSpentAdjustmentUsd: number;\n /** Flat per-session estimate used for accounting (default 3). */\n estimatedCostPerSessionUsd: number;\n /** Max sessions in `launching|running` at once (all origins). */\n maxConcurrent: number;\n /** Max sessions per local day from ANY origin. */\n maxSessionsPerDay: number;\n selfImprove: {\n /** Verse may launch its own self-improvement tasks without a click. */\n enabled: boolean;\n /** Repo self-improvement targets (default ashlrai/ashlr-hub). */\n repo: string;\n /** Max self-improvement launches per local day. */\n maxPerDay: number;\n /** Stop self-improvement when estimated remaining credits fall below this. */\n reserveUsd: number;\n };\n updatedAt: string;\n}\n\nexport const DEFAULT_CLOUD_BUDGET: Omit<CloudBudgetV1, 'updatedAt'> = Object.freeze({\n v: CLOUD_BUDGET_SCHEMA_VERSION,\n creditsTotalUsd: 250,\n creditsSpentAdjustmentUsd: 0,\n estimatedCostPerSessionUsd: 3,\n maxConcurrent: 4,\n maxSessionsPerDay: 20,\n selfImprove: Object.freeze({ enabled: true, repo: 'ashlrai/ashlr-hub', maxPerDay: 4, reserveUsd: 40 }),\n}) as Omit<CloudBudgetV1, 'updatedAt'>;\n\nexport interface CloudGate {\n ok: boolean;\n /** Plain sentence when !ok (\"4 of 4 self-improvement launches used today.\"). */\n reason: string | null;\n}\n\nexport interface CloudBudgetView {\n creditsTotalUsd: number;\n estimatedSpentUsd: number;\n estimatedRemainingUsd: number;\n sessionsToday: number;\n selfImproveToday: number;\n running: number;\n canLaunch: CloudGate;\n canSelfImprove: CloudGate;\n /** Always shown next to spend: why this is an estimate. */\n estimateNote: string;\n balanceUrl: typeof CLOUD_BALANCE_URL;\n budget: CloudBudgetV1;\n}\n\nexport interface CloudSeatStatus {\n id: string;\n ready: boolean;\n /** Plain sentence when not ready. */\n reason: string | null;\n}\n\n/** One self-improvement item: built in (improvement-backlog.ts) or added by the operator/Leader (<cloudHome>/backlog.json). */\nexport interface CloudBacklogItem {\n id: string;\n title: string;\n /** Full task prompt handed to the cloud session. */\n prompt: string;\n area: string;\n priority: 1 | 2 | 3;\n /** Repo the item targets (default: budget.selfImprove.repo). */\n repo?: string;\n}\n\nexport interface CloudBacklogView {\n items: Array<CloudBacklogItem & { claimedBy: string | null; lastState: CloudTaskState | null }>;\n nextUp: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// HTTP contract — mounted as the 'cloud' module (verse-api.ts)\n// ---------------------------------------------------------------------------\n\nexport const VERSE_CLOUD_PATH = '/api/verse/cloud' as const;\nexport const VERSE_CLOUD_LAUNCH_PATH = '/api/verse/cloud/launch' as const;\nexport const VERSE_CLOUD_BUDGET_PATH = '/api/verse/cloud/budget' as const;\nexport const VERSE_CLOUD_REFRESH_PATH = '/api/verse/cloud/refresh' as const;\nexport const VERSE_CLOUD_IMPROVE_PATH = '/api/verse/cloud/improve' as const;\n/** POST `${VERSE_CLOUD_TASKS_PATH}/<id>/dismiss` */\nexport const VERSE_CLOUD_TASKS_PATH = '/api/verse/cloud/tasks' as const;\n\n/** GET /api/verse/cloud */\nexport interface CloudOverviewResponse {\n generatedAt: string;\n seat: CloudSeatStatus;\n budget: CloudBudgetView;\n /** Newest first, at most 100. */\n tasks: CloudTaskV1[];\n backlog: CloudBacklogView;\n}\n\n/** POST /api/verse/cloud/launch (write token + read session) */\nexport interface CloudLaunchRequest {\n repo: string;\n baseBranch?: string;\n title?: string;\n prompt: string;\n origin: Extract<CloudTaskOrigin, 'chat' | 'operator' | 'cli'>;\n}\n\nexport interface CloudLaunchResponse {\n ok: boolean;\n task: CloudTaskV1 | null;\n /** Plain sentence on refusal/failure. */\n error: string | null;\n failure: CloudLaunchFailureCode | null;\n}\n\n/** POST /api/verse/cloud/budget — any subset; validated and clamped. */\nexport type CloudBudgetUpdate = Partial<Pick<CloudBudgetV1,\n 'creditsTotalUsd' | 'creditsSpentAdjustmentUsd' | 'estimatedCostPerSessionUsd' | 'maxConcurrent' | 'maxSessionsPerDay'>> & {\n selfImprove?: Partial<CloudBudgetV1['selfImprove']>;\n};\n\n/** POST /api/verse/cloud/improve — launch up to `count` backlog items now. */\nexport interface CloudImproveRequest {\n count?: number;\n}\n\nexport interface CloudImproveResponse {\n launched: CloudTaskV1[];\n skipped: Array<{ itemId: string; reason: string }>;\n}\n"],"mappings":"AA2CA,IAAa,EAAoB,mCAMpB,EAAyB,IAKzB,EAAwB,+BAkBxB,EAAmD,CAAC,SAAU,SAAU,SAAU,SAAS,EA6F3F,EAAyD,OAAO,OAAO,CAClF,EAAA,EACA,gBAAiB,IACjB,0BAA2B,EAC3B,2BAA4B,EAC5B,cAAe,EACf,kBAAmB,GACnB,YAAa,OAAO,OAAO,CAAE,QAAS,GAAM,KAAM,oBAAqB,UAAW,EAAG,WAAY,EAAG,CAAC,CACvG,CAAC,EAmDY,EAAmB,mBACnB,EAA0B,0BAC1B,EAA0B,0BAC1B,EAA2B,2BAC3B,EAA2B,2BAE3B,EAAyB"}
@@ -1,2 +1,2 @@
1
- import{l as e,s as t}from"./global-DG1fmn4y.js";var n=`2.1.280`;function r(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function i(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:null}function a(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function o(e,t,n=!1){let r=e[t];return typeof r==`boolean`?r:n}function s(e){return Array.isArray(e)?e:[]}var c=/(launcher\.mjs|native-profiles|account-connections|console-startup|\/\.ashlr\b|Bearer\s|--token\b)/i;function l(e){if(typeof e!=`string`)return null;let t=e.trim();return t.length===0||t.length>200||c.test(t)||/[\r\n]/.test(t)?null:t}function u(e){return e===null?null:Math.max(0,Math.min(100,e))}function d(e){let t=r(e);if(!t)return null;let n=i(t,`id`)??i(t,`label`);if(n===null)return null;let s=r(t.nativeReport),c=o(t,`limitReached`)||o(t,`rateLimitReached`),l=t.measured;return{id:n,label:i(t,`label`),usedPercent:u(a(t,`usedPercent`)??a(t,`used_percent`)),resetsAt:i(t,`resetsAt`)??i(t,`resets_at`),resetDescription:(s?i(s,`resetDescription`):null)??i(t,`resetDescription`),limitReached:c,measured:typeof l==`boolean`?l:!c}}function f(e){let t=r(e);if(!t)return null;let n=i(t,`balance`),s=n===null?a(t,`balance`):Number.parseFloat(n);return{hasCredits:o(t,`hasCredits`)||o(t,`has_credits`),unlimited:o(t,`unlimited`),balance:n,balanceValue:typeof s==`number`&&Number.isFinite(s)?s:null}}var p=[`claude`,`codex`,`grok`];function m(e){let t=r(e);if(!t)return null;let n=i(t,`id`),a=i(t,`provider`);if(n===null||a===null||!p.includes(a))return null;let o=s(t.windows).map(d).filter(e=>e!==null),c=i(t,`state`),u=i(t,`authentication`),m=r(t.unsupported);return{id:n,label:i(t,`label`)??n,provider:a,state:c===`checking`||c===`observed`||c===`signed-out`||c===`unavailable`?c:`unavailable`,authentication:u===`signed-in`||u===`signed-out`?u:`unknown`,health:i(t,`health`),planType:i(t,`planType`)??i(t,`plan_type`),observedAt:i(t,`observedAt`),windows:o,binding:d(t.binding),credits:f(t.credits),reason:i(t,`reason`),unsupported:h(t,m),reconnectCommand:l(t.reconnectCommand),notes:s(t.notes).filter(e=>typeof e==`string`)}}function h(e,t){if(t)return{code:i(t,`code`)??`usage-version-unsupported`,pinnedVersion:i(t,`pinnedVersion`)??i(t,`version`)};let r=i(e,`reason`);return r===`usage-version-unsupported`?{code:r,pinnedVersion:n}:null}function g(e){let t=i(e,`collectorNote`);if(t)return t;let n=r(e.collector);return!n||i(n,`owner`)!==`another-collector`?null:i(n,`note`)??`Another collector process owns the quota-refresh lease, so these readings are read-only and may be staler than this server’s poll interval.`}function _(e){let t=r(e);if(!t)return null;let n=Array.isArray(t.accounts)?t.accounts:Array.isArray(e)?e:null;return n===null?null:{sampledAt:i(t,`sampledAt`),refreshing:o(t,`refreshing`),accounts:n.map(m).filter(e=>e!==null),collectorNote:g(t)}}function v(e){let t=r(e);if(!t)return null;let n=i(t,`day`);return n===null||!/^\d{4}-\d{2}-\d{2}$/.test(n)?null:{day:n,tokensIn:a(t,`tokensIn`)??0,tokensOut:a(t,`tokensOut`)??0,estCostUsd:a(t,`estCostUsd`)??0,sessions:a(t,`sessions`)??0,cacheRead:a(t,`cacheRead`),cacheWrite:a(t,`cacheWrite`),cacheHitRate:a(t,`cacheHitRate`)}}function y(e,t){let n=r(e),a=n?Array.isArray(n.byDay)?n.byDay:Array.isArray(n.days)?n.days:null:Array.isArray(e)?e:null;if(a===null)return null;let c=n?i(n,`window`):null;return{window:c===`7d`||c===`30d`?c:t,days:a.map(v).filter(e=>e!==null).sort((e,t)=>e.day.localeCompare(t.day)),generatedAt:n?i(n,`generatedAt`):null,estimated:!n||o(n,`estimated`,!0),caveats:n?s(n.caveats).filter(e=>typeof e==`string`):[]}}function b(e,t){let n=r(e);if(!n)return null;let s=i(n,`label`)??i(n,`id`)??i(n,`name`)??i(n,`model`);if(s===null)return null;let c=n.capabilities,l=i(n,`state`),d=n.supportsTools,f=a(n,`nativeContextLength`)??a(n,`nativeContext`),p=a(n,`contextLength`)??a(n,`configuredContext`),m=i(n,`placement`);return{name:s,runtime:t,loaded:l===null?o(n,`loaded`)||o(n,`resident`):l===`loaded`,sizeBytes:a(n,`sizeBytes`)??a(n,`size`),sizeVramBytes:a(n,`sizeVramBytes`)??a(n,`size_vram`),placement:m===`gpu`||m===`cpu`||m===`split`?m:`unknown`,gpuPercent:u(a(n,`gpuPercent`)),memoryPercent:u(a(n,`memoryPercent`)),family:i(n,`family`),arch:i(n,`arch`),expiresAt:i(n,`expiresAt`)??i(n,`expires_at`),parameterSize:i(n,`parameterSize`)??i(n,`parameter_size`),quantization:i(n,`quantization`)??i(n,`quantization_level`),nativeContext:f,configuredContext:p!==null&&f!==null&&p===f?null:p,capabilities:Array.isArray(c)?c.filter(e=>typeof e==`string`):null,supportsTools:typeof d==`boolean`?d:null}}function x(e,t){let n=r(e);if(!n)return null;let s=Array.isArray(n.models)?n.models:null;if(s===null)return null;let c=s.map(e=>b(e,t)).filter(e=>e!==null),l=o(n,`stale`);return{models:c,status:{runtime:t,reachable:o(n,`reachable`),reason:i(n,`reason`),stale:l,staleForMs:l?a(n,`staleForMs`):null,modelCount:c.length}}}function S(e){let t=r(e);if(!t)return null;let n=x(t.ollama,`ollama`),c=x(t.lmStudio??t.lmstudio,`lmstudio`);if(n!==null||c!==null){let e=[n,c].filter(e=>e!==null),o=e.some(e=>e.status.reachable),l=r(t.machine);return{reachable:o,models:e.flatMap(e=>e.models),memoryBudgetBytes:(l?a(l,`totalMemoryBytes`):null)??a(t,`memoryBudgetBytes`)??a(t,`memoryBudget`),freeMemoryBytes:l?a(l,`freeMemoryBytes`):null,reason:o?null:e.map(e=>e.status.reason).find(e=>e!==null)??null,runtimes:e.map(e=>e.status),notes:s(t.notes).filter(e=>typeof e==`string`),sampledAt:i(t,`sampledAt`)}}let l=Array.isArray(t.models)?t.models:null;return l===null?null:{reachable:o(t,`reachable`,!0),models:l.map(e=>b(e,null)).filter(e=>e!==null),memoryBudgetBytes:a(t,`memoryBudgetBytes`)??a(t,`memoryBudget`),freeMemoryBytes:a(t,`freeMemoryBytes`),reason:i(t,`reason`),runtimes:[],notes:s(t.notes).filter(e=>typeof e==`string`),sampledAt:i(t,`sampledAt`)}}var C=`verse-usage-frontier`,w=`verse-usage-control`,T={key:C,fetch:t=>e(`/api/usage`,t)};function E(e){return e instanceof t?e.status===404?`This server does not expose /api/verse/control, so configured caps and today’s spend are unavailable here.`:`Configured caps unavailable (HTTP ${e.status}).`:`Configured caps unavailable: the request failed.`}var D={key:w,fetch:async n=>{try{return{raw:await e(`/api/verse/control`,n),available:!0,reason:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{raw:null,available:!1,reason:E(e)}}}},O=`verse-usage-accounts`,k=`verse-usage-local-models`,A=`verse-usage-series`;function j(e,n){return n instanceof t?n.status===404?`This server does not expose ${e} yet, so this panel has no source.`:`${e} answered HTTP ${n.status}.`:`${e} could not be reached.`}function M(n){return async r=>{try{return{raw:await e(n,r),available:!0,reason:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{raw:null,available:!1,reason:j(n,e)}}}}var N={key:O,fetch:M(`/api/verse/accounts`)},P=[350,1200],F=M(`/api/verse/local-models`);function I(e){if(!e.available)return!1;let t=S(e.raw);return t!==null&&!t.reachable}function L(e,t){return new Promise((n,r)=>{if(t?.aborted){r(new DOMException(`Aborted`,`AbortError`));return}let i=()=>{clearTimeout(a),r(new DOMException(`Aborted`,`AbortError`))},a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e);t?.addEventListener(`abort`,i,{once:!0})})}var R={key:k,fetch:async e=>{let t=await F(e);for(let n of P){if(!I(t))return t;await L(n,e),t=await F(e)}return t}},z={"7d":{key:`${A}:7d`,fetch:M(`/api/verse/usage-series?window=7d`)},"30d":{key:`${A}:30d`,fetch:M(`/api/verse/usage-series?window=30d`)}};function B(e){return z[e]}export{R as a,y as c,D as i,B as n,_ as o,N as r,S as s,T as t};
2
- //# sourceMappingURL=usage-queries-CI_y9oWZ.js.map
1
+ import{c as e,o as t}from"./global-BkNl4e6E.js";var n=`2.1.280`;function r(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function i(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:null}function a(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function o(e,t,n=!1){let r=e[t];return typeof r==`boolean`?r:n}function s(e){return Array.isArray(e)?e:[]}var c=/(launcher\.mjs|native-profiles|account-connections|console-startup|\/\.ashlr\b|Bearer\s|--token\b)/i;function l(e){if(typeof e!=`string`)return null;let t=e.trim();return t.length===0||t.length>200||c.test(t)||/[\r\n]/.test(t)?null:t}function u(e){return e===null?null:Math.max(0,Math.min(100,e))}function d(e){let t=r(e);if(!t)return null;let n=i(t,`id`)??i(t,`label`);if(n===null)return null;let s=r(t.nativeReport),c=o(t,`limitReached`)||o(t,`rateLimitReached`),l=t.measured;return{id:n,label:i(t,`label`),usedPercent:u(a(t,`usedPercent`)??a(t,`used_percent`)),resetsAt:i(t,`resetsAt`)??i(t,`resets_at`),resetDescription:(s?i(s,`resetDescription`):null)??i(t,`resetDescription`),limitReached:c,measured:typeof l==`boolean`?l:!c}}function f(e){let t=r(e);if(!t)return null;let n=i(t,`balance`),s=n===null?a(t,`balance`):Number.parseFloat(n);return{hasCredits:o(t,`hasCredits`)||o(t,`has_credits`),unlimited:o(t,`unlimited`),balance:n,balanceValue:typeof s==`number`&&Number.isFinite(s)?s:null}}var p=[`claude`,`codex`,`grok`];function m(e){let t=r(e);if(!t)return null;let n=i(t,`id`),a=i(t,`provider`);if(n===null||a===null||!p.includes(a))return null;let o=s(t.windows).map(d).filter(e=>e!==null),c=i(t,`state`),u=i(t,`authentication`),m=r(t.unsupported);return{id:n,label:i(t,`label`)??n,provider:a,state:c===`checking`||c===`observed`||c===`signed-out`||c===`unavailable`?c:`unavailable`,authentication:u===`signed-in`||u===`signed-out`?u:`unknown`,health:i(t,`health`),planType:i(t,`planType`)??i(t,`plan_type`),observedAt:i(t,`observedAt`),windows:o,binding:d(t.binding),credits:f(t.credits),reason:i(t,`reason`),unsupported:h(t,m),reconnectCommand:l(t.reconnectCommand),notes:s(t.notes).filter(e=>typeof e==`string`)}}function h(e,t){if(t)return{code:i(t,`code`)??`usage-version-unsupported`,pinnedVersion:i(t,`pinnedVersion`)??i(t,`version`)};let r=i(e,`reason`);return r===`usage-version-unsupported`?{code:r,pinnedVersion:n}:null}function g(e){let t=i(e,`collectorNote`);if(t)return t;let n=r(e.collector);return!n||i(n,`owner`)!==`another-collector`?null:i(n,`note`)??`Another collector process owns the quota-refresh lease, so these readings are read-only and may be staler than this server’s poll interval.`}function _(e){let t=r(e);if(!t)return null;let n=Array.isArray(t.accounts)?t.accounts:Array.isArray(e)?e:null;return n===null?null:{sampledAt:i(t,`sampledAt`),refreshing:o(t,`refreshing`),accounts:n.map(m).filter(e=>e!==null),collectorNote:g(t)}}function v(e){let t=r(e);if(!t)return null;let n=i(t,`day`);return n===null||!/^\d{4}-\d{2}-\d{2}$/.test(n)?null:{day:n,tokensIn:a(t,`tokensIn`)??0,tokensOut:a(t,`tokensOut`)??0,estCostUsd:a(t,`estCostUsd`)??0,sessions:a(t,`sessions`)??0,cacheRead:a(t,`cacheRead`),cacheWrite:a(t,`cacheWrite`),cacheHitRate:a(t,`cacheHitRate`)}}function y(e,t){let n=r(e),a=n?Array.isArray(n.byDay)?n.byDay:Array.isArray(n.days)?n.days:null:Array.isArray(e)?e:null;if(a===null)return null;let c=n?i(n,`window`):null;return{window:c===`7d`||c===`30d`?c:t,days:a.map(v).filter(e=>e!==null).sort((e,t)=>e.day.localeCompare(t.day)),generatedAt:n?i(n,`generatedAt`):null,estimated:!n||o(n,`estimated`,!0),caveats:n?s(n.caveats).filter(e=>typeof e==`string`):[]}}function b(e,t){let n=r(e);if(!n)return null;let s=i(n,`label`)??i(n,`id`)??i(n,`name`)??i(n,`model`);if(s===null)return null;let c=n.capabilities,l=i(n,`state`),d=n.supportsTools,f=a(n,`nativeContextLength`)??a(n,`nativeContext`),p=a(n,`contextLength`)??a(n,`configuredContext`),m=i(n,`placement`);return{name:s,runtime:t,loaded:l===null?o(n,`loaded`)||o(n,`resident`):l===`loaded`,sizeBytes:a(n,`sizeBytes`)??a(n,`size`),sizeVramBytes:a(n,`sizeVramBytes`)??a(n,`size_vram`),placement:m===`gpu`||m===`cpu`||m===`split`?m:`unknown`,gpuPercent:u(a(n,`gpuPercent`)),memoryPercent:u(a(n,`memoryPercent`)),family:i(n,`family`),arch:i(n,`arch`),expiresAt:i(n,`expiresAt`)??i(n,`expires_at`),parameterSize:i(n,`parameterSize`)??i(n,`parameter_size`),quantization:i(n,`quantization`)??i(n,`quantization_level`),nativeContext:f,configuredContext:p!==null&&f!==null&&p===f?null:p,capabilities:Array.isArray(c)?c.filter(e=>typeof e==`string`):null,supportsTools:typeof d==`boolean`?d:null}}function x(e,t){let n=r(e);if(!n)return null;let s=Array.isArray(n.models)?n.models:null;if(s===null)return null;let c=s.map(e=>b(e,t)).filter(e=>e!==null),l=o(n,`stale`);return{models:c,status:{runtime:t,reachable:o(n,`reachable`),reason:i(n,`reason`),stale:l,staleForMs:l?a(n,`staleForMs`):null,modelCount:c.length}}}function S(e){let t=r(e);if(!t)return null;let n=x(t.ollama,`ollama`),c=x(t.lmStudio??t.lmstudio,`lmstudio`);if(n!==null||c!==null){let e=[n,c].filter(e=>e!==null),o=e.some(e=>e.status.reachable),l=r(t.machine);return{reachable:o,models:e.flatMap(e=>e.models),memoryBudgetBytes:(l?a(l,`totalMemoryBytes`):null)??a(t,`memoryBudgetBytes`)??a(t,`memoryBudget`),freeMemoryBytes:l?a(l,`freeMemoryBytes`):null,reason:o?null:e.map(e=>e.status.reason).find(e=>e!==null)??null,runtimes:e.map(e=>e.status),notes:s(t.notes).filter(e=>typeof e==`string`),sampledAt:i(t,`sampledAt`)}}let l=Array.isArray(t.models)?t.models:null;return l===null?null:{reachable:o(t,`reachable`,!0),models:l.map(e=>b(e,null)).filter(e=>e!==null),memoryBudgetBytes:a(t,`memoryBudgetBytes`)??a(t,`memoryBudget`),freeMemoryBytes:a(t,`freeMemoryBytes`),reason:i(t,`reason`),runtimes:[],notes:s(t.notes).filter(e=>typeof e==`string`),sampledAt:i(t,`sampledAt`)}}var C=`verse-usage-frontier`,w=`verse-usage-control`,T={key:C,fetch:t=>e(`/api/usage`,t)};function E(e){return e instanceof t?e.status===404?`This server does not expose /api/verse/control, so configured caps and today’s spend are unavailable here.`:`Configured caps unavailable (HTTP ${e.status}).`:`Configured caps unavailable: the request failed.`}var D={key:w,fetch:async n=>{try{return{raw:await e(`/api/verse/control`,n),available:!0,reason:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{raw:null,available:!1,reason:E(e)}}}},O=`verse-usage-accounts`,k=`verse-usage-local-models`,A=`verse-usage-series`;function j(e,n){return n instanceof t?n.status===404?`This server does not expose ${e} yet, so this panel has no source.`:`${e} answered HTTP ${n.status}.`:`${e} could not be reached.`}function M(n){return async r=>{try{return{raw:await e(n,r),available:!0,reason:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{raw:null,available:!1,reason:j(n,e)}}}}var N={key:O,fetch:M(`/api/verse/accounts`)},P=[350,1200],F=M(`/api/verse/local-models`);function I(e){if(!e.available)return!1;let t=S(e.raw);return t!==null&&!t.reachable}function L(e,t){return new Promise((n,r)=>{if(t?.aborted){r(new DOMException(`Aborted`,`AbortError`));return}let i=()=>{clearTimeout(a),r(new DOMException(`Aborted`,`AbortError`))},a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e);t?.addEventListener(`abort`,i,{once:!0})})}var R={key:k,fetch:async e=>{let t=await F(e);for(let n of P){if(!I(t))return t;await L(n,e),t=await F(e)}return t}},z={"7d":{key:`${A}:7d`,fetch:M(`/api/verse/usage-series?window=7d`)},"30d":{key:`${A}:30d`,fetch:M(`/api/verse/usage-series?window=30d`)}};function B(e){return z[e]}export{R as a,y as c,D as i,B as n,_ as o,N as r,S as s,T as t};
2
+ //# sourceMappingURL=usage-queries-CUTmnegA.js.map