@ashlr/hub 3.10.0 → 3.10.1

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 (448) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/dist/authority-surface.json +43 -23
  3. package/dist/build-identity.json +2 -2
  4. package/dist/core/daemon/capacity-publisher.d.ts +19 -0
  5. package/dist/core/daemon/capacity-publisher.js +49 -2
  6. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  7. package/dist/core/daemon/overnight-status.d.ts +13 -0
  8. package/dist/core/daemon/overnight-status.js +93 -8
  9. package/dist/core/daemon/overnight-status.js.map +1 -1
  10. package/dist/core/fleet/dispatch-router.js +26 -9
  11. package/dist/core/fleet/dispatch-router.js.map +1 -1
  12. package/dist/core/fleet/fleet-runtime-journal.js +12 -5
  13. package/dist/core/fleet/fleet-runtime-journal.js.map +1 -1
  14. package/dist/core/fleet/fleet-types.d.ts +13 -0
  15. package/dist/core/routing/budget-store.js +11 -5
  16. package/dist/core/routing/budget-store.js.map +1 -1
  17. package/dist/core/routing/capacity-history-api.d.ts +30 -0
  18. package/dist/core/routing/capacity-history-api.js +147 -0
  19. package/dist/core/routing/capacity-history-api.js.map +1 -0
  20. package/dist/core/routing/capacity-history-types.d.ts +63 -0
  21. package/dist/core/routing/capacity-history-types.js +18 -0
  22. package/dist/core/routing/capacity-history-types.js.map +1 -0
  23. package/dist/core/routing/capacity-history.d.ts +130 -0
  24. package/dist/core/routing/capacity-history.js +654 -0
  25. package/dist/core/routing/capacity-history.js.map +1 -0
  26. package/dist/core/routing/headroom.d.ts +5 -1
  27. package/dist/core/routing/headroom.js +82 -41
  28. package/dist/core/routing/headroom.js.map +1 -1
  29. package/dist/core/routing/router.d.ts +8 -1
  30. package/dist/core/routing/router.js +49 -16
  31. package/dist/core/routing/router.js.map +1 -1
  32. package/dist/core/routing/seat-reasons.d.ts +35 -0
  33. package/dist/core/routing/seat-reasons.js +48 -0
  34. package/dist/core/routing/seat-reasons.js.map +1 -0
  35. package/dist/core/routing/types.d.ts +37 -0
  36. package/dist/core/routing/types.js.map +1 -1
  37. package/dist/core/verse/fleet-history-types.d.ts +12 -4
  38. package/dist/core/verse/fleet-history-types.js +4 -2
  39. package/dist/core/verse/fleet-history-types.js.map +1 -1
  40. package/dist/core/verse/fleet-live-api.d.ts +14 -1
  41. package/dist/core/verse/fleet-live-api.js +31 -11
  42. package/dist/core/verse/fleet-live-api.js.map +1 -1
  43. package/dist/core/verse/preferences.d.ts +3 -1
  44. package/dist/core/verse/preferences.js +5 -2
  45. package/dist/core/verse/preferences.js.map +1 -1
  46. package/dist/core/verse/types.d.ts +5 -1
  47. package/dist/core/verse/types.js.map +1 -1
  48. package/dist/core/verse/verse-api.js +2 -1
  49. package/dist/core/verse/verse-api.js.map +1 -1
  50. package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js → ActionMenu-BBB7VYjz.js} +2 -2
  51. package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js.map → ActionMenu-BBB7VYjz.js.map} +1 -1
  52. package/dist/core/web/public/next/assets/Advanced-Bywv_iYR.css +1 -0
  53. package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js +2 -0
  54. package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js.map +1 -0
  55. package/dist/core/web/public/next/assets/{App-DyBg1v_q.js → App-CbDCLAxn.js} +5 -5
  56. package/dist/core/web/public/next/assets/{App-DyBg1v_q.js.map → App-CbDCLAxn.js.map} +1 -1
  57. package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js +2 -0
  58. package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js.map +1 -0
  59. package/dist/core/web/public/next/assets/AreaTrend-BgnK0wAy.js +2 -0
  60. package/dist/core/web/public/next/assets/AreaTrend-BgnK0wAy.js.map +1 -0
  61. package/dist/core/web/public/next/assets/AutonomySection-BF5UCsMv.js +2 -0
  62. package/dist/core/web/public/next/assets/{AutonomySection-CoMngwNB.js.map → AutonomySection-BF5UCsMv.js.map} +1 -1
  63. package/dist/core/web/public/next/assets/BranchBar-BZNQ50YE.css +1 -0
  64. package/dist/core/web/public/next/assets/BranchBar-nfSb59Kv.js +2 -0
  65. package/dist/core/web/public/next/assets/BranchBar-nfSb59Kv.js.map +1 -0
  66. package/dist/core/web/public/next/assets/BudgetControl-BESM12dO.js +2 -0
  67. package/dist/core/web/public/next/assets/BudgetControl-BESM12dO.js.map +1 -0
  68. package/dist/core/web/public/next/assets/BurnDown-D1AfskPT.js +2 -0
  69. package/dist/core/web/public/next/assets/BurnDown-D1AfskPT.js.map +1 -0
  70. package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js → Button-Cr_qkQEc.js} +2 -2
  71. package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js.map → Button-Cr_qkQEc.js.map} +1 -1
  72. package/dist/core/web/public/next/assets/CapacityStrip-Cc28CyWk.css +1 -0
  73. package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js +2 -0
  74. package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js.map +1 -0
  75. package/dist/core/web/public/next/assets/ChatSection-DoqjyVoj.js +3 -0
  76. package/dist/core/web/public/next/assets/{ChatSection-B9cdRKUh.js.map → ChatSection-DoqjyVoj.js.map} +1 -1
  77. package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js → CommandPalette-lLV-OR63.js} +2 -2
  78. package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js.map → CommandPalette-lLV-OR63.js.map} +1 -1
  79. package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js +2 -0
  80. package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js.map +1 -0
  81. package/dist/core/web/public/next/assets/Composer-ByzxOJK6.css +1 -0
  82. package/dist/core/web/public/next/assets/Composer.module-C8U73KdQ.js +2 -0
  83. package/dist/core/web/public/next/assets/{Composer.module-DJMdrqNt.js.map → Composer.module-C8U73KdQ.js.map} +1 -1
  84. package/dist/core/web/public/next/assets/DiffPane-BAvvbBsf.css +1 -0
  85. package/dist/core/web/public/next/assets/DiffPane-BVxhK-cy.js +2 -0
  86. package/dist/core/web/public/next/assets/DiffPane-BVxhK-cy.js.map +1 -0
  87. package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js → DiffViewer-yCdw9J-Y.js} +2 -2
  88. package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js.map → DiffViewer-yCdw9J-Y.js.map} +1 -1
  89. package/dist/core/web/public/next/assets/DockHost-B4RaYOET.css +1 -0
  90. package/dist/core/web/public/next/assets/DockHost-BZReKwos.js +2 -0
  91. package/dist/core/web/public/next/assets/DockHost-BZReKwos.js.map +1 -0
  92. package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js → EmptyState-D1GDxVZy.js} +2 -2
  93. package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js.map → EmptyState-D1GDxVZy.js.map} +1 -1
  94. package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js → Epistemic-DRp4dBfB.js} +2 -2
  95. package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js.map → Epistemic-DRp4dBfB.js.map} +1 -1
  96. package/dist/core/web/public/next/assets/FleetSection-CFiWeOEs.css +1 -0
  97. package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js +3 -0
  98. package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js.map +1 -0
  99. package/dist/core/web/public/next/assets/Funnel-zvDj3He4.js +2 -0
  100. package/dist/core/web/public/next/assets/Funnel-zvDj3He4.js.map +1 -0
  101. package/dist/core/web/public/next/assets/GearTray-CkviqjYr.js +2 -0
  102. package/dist/core/web/public/next/assets/GearTray-CkviqjYr.js.map +1 -0
  103. package/dist/core/web/public/next/assets/GrowthSection-Bg5sW0jI.js +2 -0
  104. package/dist/core/web/public/next/assets/GrowthSection-Bg5sW0jI.js.map +1 -0
  105. package/dist/core/web/public/next/assets/HandoffDialog-DcPj1ri9.js +2 -0
  106. package/dist/core/web/public/next/assets/HandoffDialog-DcPj1ri9.js.map +1 -0
  107. package/dist/core/web/public/next/assets/{Input-CTu0CycC.js → Input-Ci7TD96x.js} +2 -2
  108. package/dist/core/web/public/next/assets/{Input-CTu0CycC.js.map → Input-Ci7TD96x.js.map} +1 -1
  109. package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js → LeaderCard-BSFTlMRF.js} +2 -2
  110. package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js.map → LeaderCard-BSFTlMRF.js.map} +1 -1
  111. package/dist/core/web/public/next/assets/{MatrixHeatmap-9dKgJ_pT.css → MatrixHeatmap-Bmnvo1l1.css} +1 -1
  112. package/dist/core/web/public/next/assets/MatrixHeatmap-DojKZe9L.js +2 -0
  113. package/dist/core/web/public/next/assets/MatrixHeatmap-DojKZe9L.js.map +1 -0
  114. package/dist/core/web/public/next/assets/McpSection-CvcYu1X_.js +2 -0
  115. package/dist/core/web/public/next/assets/{McpSection-1UncWBpW.js.map → McpSection-CvcYu1X_.js.map} +1 -1
  116. package/dist/core/web/public/next/assets/MessageMarkdown-BrLCrb73.js +3 -0
  117. package/dist/core/web/public/next/assets/{MessageMarkdown-C4pl9LI5.js.map → MessageMarkdown-BrLCrb73.js.map} +1 -1
  118. package/dist/core/web/public/next/assets/MessageMarkdown-Cgh5f1-Q.css +1 -0
  119. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js → MessageMarkdownRenderer-CjmdBw2p.js} +2 -2
  120. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js.map → MessageMarkdownRenderer-CjmdBw2p.js.map} +1 -1
  121. package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js → Meter-DTHbmhQg.js} +2 -2
  122. package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js.map → Meter-DTHbmhQg.js.map} +1 -1
  123. package/dist/core/web/public/next/assets/MindSection-DcO9fmYe.js +2 -0
  124. package/dist/core/web/public/next/assets/MindSection-DcO9fmYe.js.map +1 -0
  125. package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js +2 -0
  126. package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js.map +1 -0
  127. package/dist/core/web/public/next/assets/NeedsYouDrawer-BpvidnM2.css +1 -0
  128. package/dist/core/web/public/next/assets/NeedsYouDrawer-hiTINupk.js +2 -0
  129. package/dist/core/web/public/next/assets/NeedsYouDrawer-hiTINupk.js.map +1 -0
  130. package/dist/core/web/public/next/assets/NeedsYouList-B4Z37Phx.js +2 -0
  131. package/dist/core/web/public/next/assets/NeedsYouList-B4Z37Phx.js.map +1 -0
  132. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +1 -0
  133. package/dist/core/web/public/next/assets/NewChatDialog-utSckh7C.js +3 -0
  134. package/dist/core/web/public/next/assets/{NewChatDialog-B_BsS9pr.js.map → NewChatDialog-utSckh7C.js.map} +1 -1
  135. package/dist/core/web/public/next/assets/OnboardingFlow-7N3YSUHN.js +2 -0
  136. package/dist/core/web/public/next/assets/{OnboardingFlow-CtCPpgoX.js.map → OnboardingFlow-7N3YSUHN.js.map} +1 -1
  137. package/dist/core/web/public/next/assets/PreviewPane-CqzkaAjG.js +2 -0
  138. package/dist/core/web/public/next/assets/PreviewPane-CqzkaAjG.js.map +1 -0
  139. package/dist/core/web/public/next/assets/PreviewPane-DoMsJSG3.css +1 -0
  140. package/dist/core/web/public/next/assets/RailStatus-sZhApA8k.js +2 -0
  141. package/dist/core/web/public/next/assets/RailStatus-sZhApA8k.js.map +1 -0
  142. package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js → RefreshIndicator-C1uQIegT.js} +2 -2
  143. package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js.map → RefreshIndicator-C1uQIegT.js.map} +1 -1
  144. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js → ResourcePoolConsoleApp-DXjjV6Sh.js} +4 -4
  145. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js.map → ResourcePoolConsoleApp-DXjjV6Sh.js.map} +1 -1
  146. package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js → RouteErrorBoundary-D1LZxQjN.js} +2 -2
  147. package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js.map → RouteErrorBoundary-D1LZxQjN.js.map} +1 -1
  148. package/dist/core/web/public/next/assets/SeatSelector-CT92PqM_.js +3 -0
  149. package/dist/core/web/public/next/assets/{SeatSelector-DaUO-zoK.js.map → SeatSelector-CT92PqM_.js.map} +1 -1
  150. package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js → Segmented-BMvq-FfD.js} +2 -2
  151. package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js.map → Segmented-BMvq-FfD.js.map} +1 -1
  152. package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js → Select-DkdeoSQn.js} +2 -2
  153. package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js.map → Select-DkdeoSQn.js.map} +1 -1
  154. package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js → SessionInsightChip-CwlakUYU.js} +2 -2
  155. package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js.map → SessionInsightChip-CwlakUYU.js.map} +1 -1
  156. package/dist/core/web/public/next/assets/SessionSearch-DFByh2NZ.js +2 -0
  157. package/dist/core/web/public/next/assets/{SessionSearch-B5aQ0BCM.js.map → SessionSearch-DFByh2NZ.js.map} +1 -1
  158. package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js +2 -0
  159. package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js.map +1 -0
  160. package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js → Sheet-C7APkGPt.js} +2 -2
  161. package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js.map → Sheet-C7APkGPt.js.map} +1 -1
  162. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js → ShortcutsOverlay-ZPyXUS_I.js} +2 -2
  163. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js.map → ShortcutsOverlay-ZPyXUS_I.js.map} +1 -1
  164. package/dist/core/web/public/next/assets/Sidebar-BRc1vGDF.css +1 -0
  165. package/dist/core/web/public/next/assets/Sidebar-Chsgazmk.js +3 -0
  166. package/dist/core/web/public/next/assets/Sidebar-Chsgazmk.js.map +1 -0
  167. package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js → Slider-B0kjW7cd.js} +2 -2
  168. package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js.map → Slider-B0kjW7cd.js.map} +1 -1
  169. package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js → StatusBadge-wv4e6f8b.js} +2 -2
  170. package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js.map → StatusBadge-wv4e6f8b.js.map} +1 -1
  171. package/dist/core/web/public/next/assets/StepBand-Db8WPw8J.js +2 -0
  172. package/dist/core/web/public/next/assets/StepBand-Db8WPw8J.js.map +1 -0
  173. package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js → Surface-BkDrQ4t3.js} +2 -2
  174. package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js.map → Surface-BkDrQ4t3.js.map} +1 -1
  175. package/dist/core/web/public/next/assets/Swimlane-Dcve56cP.js +2 -0
  176. package/dist/core/web/public/next/assets/Swimlane-Dcve56cP.js.map +1 -0
  177. package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js → Switch-DamlpSMY.js} +2 -2
  178. package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js.map → Switch-DamlpSMY.js.map} +1 -1
  179. package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js → Tag-Cs4tudBN.js} +2 -2
  180. package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js.map → Tag-Cs4tudBN.js.map} +1 -1
  181. package/dist/core/web/public/next/assets/TerminalPane-BDkKFych.js +7 -0
  182. package/dist/core/web/public/next/assets/TerminalPane-BDkKFych.js.map +1 -0
  183. package/dist/core/web/public/next/assets/TerminalPane-BwfMbnJz.css +1 -0
  184. package/dist/core/web/public/next/assets/UniverseConsoleApp-BE72VyBL.js +2 -0
  185. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DKqAf-eD.js.map → UniverseConsoleApp-BE72VyBL.js.map} +1 -1
  186. package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js → UniverseView-BbmYY2P4.js} +2 -2
  187. package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js.map → UniverseView-BbmYY2P4.js.map} +1 -1
  188. package/dist/core/web/public/next/assets/UsageSection-DsB-Jqyl.css +1 -0
  189. package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js +2 -0
  190. package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js.map +1 -0
  191. package/dist/core/web/public/next/assets/VerseConsoleApp-CXJWDiEM.css +1 -0
  192. package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js +3 -0
  193. package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js.map +1 -0
  194. package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +1 -0
  195. package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js +10 -0
  196. package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js.map +1 -0
  197. package/dist/core/web/public/next/assets/actions-BnjZy8a-.js +2 -0
  198. package/dist/core/web/public/next/assets/actions-BnjZy8a-.js.map +1 -0
  199. package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +1 -0
  200. package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js → budget-queries-Cp6vO7FH.js} +2 -2
  201. package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js.map → budget-queries-Cp6vO7FH.js.map} +1 -1
  202. package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js +2 -0
  203. package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js.map +1 -0
  204. package/dist/core/web/public/next/assets/capacity-strip-model-9-Yb211u.js +2 -0
  205. package/dist/core/web/public/next/assets/capacity-strip-model-9-Yb211u.js.map +1 -0
  206. package/dist/core/web/public/next/assets/charts-BmbKhjqw.js +2 -0
  207. package/dist/core/web/public/next/assets/charts-BmbKhjqw.js.map +1 -0
  208. package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js +2 -0
  209. package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js.map +1 -0
  210. package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js → command-bus-DHJJLWh8.js} +2 -2
  211. package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js.map → command-bus-DHJJLWh8.js.map} +1 -1
  212. package/dist/core/web/public/next/assets/context-model-BGznyHNQ.js +2 -0
  213. package/dist/core/web/public/next/assets/context-model-BGznyHNQ.js.map +1 -0
  214. package/dist/core/web/public/next/assets/context-model-DeJ28uSZ.js +2 -0
  215. package/dist/core/web/public/next/assets/context-model-DeJ28uSZ.js.map +1 -0
  216. package/dist/core/web/public/next/assets/context-queries-_mEgy4eg.js +2 -0
  217. package/dist/core/web/public/next/assets/context-queries-_mEgy4eg.js.map +1 -0
  218. package/dist/core/web/public/next/assets/context.module-BijAfoJw.js +2 -0
  219. package/dist/core/web/public/next/assets/context.module-BijAfoJw.js.map +1 -0
  220. package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js → control-queries-C4TG8blN.js} +2 -2
  221. package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js.map → control-queries-C4TG8blN.js.map} +1 -1
  222. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +2 -0
  223. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +1 -0
  224. package/dist/core/web/public/next/assets/dock-icons-BB7Fi6hT.js +2 -0
  225. package/dist/core/web/public/next/assets/dock-icons-BB7Fi6hT.js.map +1 -0
  226. package/dist/core/web/public/next/assets/dock-panes-mnIwSpRp.js +2 -0
  227. package/dist/core/web/public/next/assets/{dock-panes-BNTLvX7G.js.map → dock-panes-mnIwSpRp.js.map} +1 -1
  228. package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js → dock-store-CdHQRP8s.js} +2 -2
  229. package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js.map → dock-store-CdHQRP8s.js.map} +1 -1
  230. package/dist/core/web/public/next/assets/fleet-model-B4FKC7fH.js +2 -0
  231. package/dist/core/web/public/next/assets/fleet-model-B4FKC7fH.js.map +1 -0
  232. package/dist/core/web/public/next/assets/format-DKrNjdwD.js +2 -0
  233. package/dist/core/web/public/next/assets/format-DKrNjdwD.js.map +1 -0
  234. package/dist/core/web/public/next/assets/format-lW58rL2y.js +2 -0
  235. package/dist/core/web/public/next/assets/format-lW58rL2y.js.map +1 -0
  236. package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js → git-model-DaGw1SzS.js} +2 -2
  237. package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js.map → git-model-DaGw1SzS.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/global-DG1fmn4y.js +2 -0
  239. package/dist/core/web/public/next/assets/global-DG1fmn4y.js.map +1 -0
  240. package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js → guarded-action--lguLXfz.js} +2 -2
  241. package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js.map → guarded-action--lguLXfz.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/{icons-DWb24OA6.js → icons-YPgbel-I.js} +2 -2
  243. package/dist/core/web/public/next/assets/{icons-DWb24OA6.js.map → icons-YPgbel-I.js.map} +1 -1
  244. package/dist/core/web/public/next/assets/{index-afDA8cwW.js → index-Dk8R-3a7.js} +3 -3
  245. package/dist/core/web/public/next/assets/{index-afDA8cwW.js.map → index-Dk8R-3a7.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/live-model-44wEU6I8.js +2 -0
  247. package/dist/core/web/public/next/assets/live-model-44wEU6I8.js.map +1 -0
  248. package/dist/core/web/public/next/assets/mind-B9PzLcl0.css +1 -0
  249. package/dist/core/web/public/next/assets/mind.module-BOABBdi_.js +2 -0
  250. package/dist/core/web/public/next/assets/mind.module-BOABBdi_.js.map +1 -0
  251. package/dist/core/web/public/next/assets/mutations-DjXM3IDg.js +2 -0
  252. package/dist/core/web/public/next/assets/{mutations-C6E10SPX.js.map → mutations-DjXM3IDg.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js → overnight-queries-Be_eossf.js} +2 -2
  254. package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js.map → overnight-queries-Be_eossf.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/pane-chrome-8JmEhHVD.css +1 -0
  256. package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js +2 -0
  257. package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js.map +1 -0
  258. package/dist/core/web/public/next/assets/primitives-Dl3SEQvh.js +1 -0
  259. package/dist/core/web/public/next/assets/{queries-BuYIEHst.js → queries-CYEVCq5r.js} +2 -2
  260. package/dist/core/web/public/next/assets/{queries-BuYIEHst.js.map → queries-CYEVCq5r.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js → reasoning-pref-a_ZP6GzU.js} +2 -2
  262. package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js.map → reasoning-pref-a_ZP6GzU.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/seat-subscription-CRigL-GE.js +2 -0
  264. package/dist/core/web/public/next/assets/seat-subscription-CRigL-GE.js.map +1 -0
  265. package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js → section-visibility-u7q-Q9AA.js} +2 -2
  266. package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js.map → section-visibility-u7q-Q9AA.js.map} +1 -1
  267. package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js → sidebar-model-i4WRuQ6j.js} +2 -2
  268. package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js.map → sidebar-model-i4WRuQ6j.js.map} +1 -1
  269. package/dist/core/web/public/next/assets/slots-CV9ZuLQU.js +3 -0
  270. package/dist/core/web/public/next/assets/{slots-W8gkmdfE.js.map → slots-CV9ZuLQU.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/surface-data-DLvmUX9z.js +2 -0
  272. package/dist/core/web/public/next/assets/surface-data-DLvmUX9z.js.map +1 -0
  273. package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js +2 -0
  274. package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js.map +1 -0
  275. package/dist/core/web/public/next/assets/tasks-model-DWs5u9RO.js +2 -0
  276. package/dist/core/web/public/next/assets/{tasks-model-CnYQzgxk.js.map → tasks-model-DWs5u9RO.js.map} +1 -1
  277. package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js → terminal-icons-Ct9cZsEK.js} +2 -2
  278. package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js.map → terminal-icons-Ct9cZsEK.js.map} +1 -1
  279. package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js → tool-semantics-GX8ScuSH.js} +2 -2
  280. package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js.map → tool-semantics-GX8ScuSH.js.map} +1 -1
  281. package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js → turn-files-BPHQzYuH.js} +2 -2
  282. package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js.map → turn-files-BPHQzYuH.js.map} +1 -1
  283. package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js → usage-queries-CI_y9oWZ.js} +2 -2
  284. package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js.map → usage-queries-CI_y9oWZ.js.map} +1 -1
  285. package/dist/core/web/public/next/assets/use-guarded-action-DVCtLzSo.js +2 -0
  286. package/dist/core/web/public/next/assets/use-guarded-action-DVCtLzSo.js.map +1 -0
  287. package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js → use-ticker-C3LQ2IYs.js} +2 -2
  288. package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js.map → use-ticker-C3LQ2IYs.js.map} +1 -1
  289. package/dist/core/web/public/next/assets/use-token-gate-B5gOFkeH.js +2 -0
  290. package/dist/core/web/public/next/assets/use-token-gate-B5gOFkeH.js.map +1 -0
  291. package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js → useActivity-C3R1Sudh.js} +2 -2
  292. package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js.map → useActivity-C3R1Sudh.js.map} +1 -1
  293. package/dist/core/web/public/next/assets/useChartWidth-0APW0BR3.js +2 -0
  294. package/dist/core/web/public/next/assets/useChartWidth-0APW0BR3.js.map +1 -0
  295. package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +1 -0
  296. package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js → useSeatsRefresh-BN8bso-n.js} +2 -2
  297. package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js.map → useSeatsRefresh-BN8bso-n.js.map} +1 -1
  298. package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js +2 -0
  299. package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js.map +1 -0
  300. package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js → verse-queries-2PxoBISm.js} +2 -2
  301. package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js.map → verse-queries-2PxoBISm.js.map} +1 -1
  302. package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js +3 -0
  303. package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js.map +1 -0
  304. package/dist/core/web/public/next/assets/verse-ui-store-Dy4HuDBV.js +3 -0
  305. package/dist/core/web/public/next/assets/{verse-ui-store-KTTKfv-T.js.map → verse-ui-store-Dy4HuDBV.js.map} +1 -1
  306. package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js → viewport-DDoJ_xVq.js} +2 -2
  307. package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js.map → viewport-DDoJ_xVq.js.map} +1 -1
  308. package/dist/core/web/public/next/assets/warmup-BsL2LdR-.js +3 -0
  309. package/dist/core/web/public/next/assets/warmup-BsL2LdR-.js.map +1 -0
  310. package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js → workspace-model-Dd3LmIym.js} +2 -2
  311. package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js.map → workspace-model-Dd3LmIym.js.map} +1 -1
  312. package/dist/core/web/public/next/index.html +1 -1
  313. package/dist/release-dependency-inventory.json +1 -1
  314. package/package.json +1 -1
  315. package/dist/core/web/public/next/assets/Advanced-CHjxJt2z.css +0 -1
  316. package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js +0 -2
  317. package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js.map +0 -1
  318. package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js +0 -2
  319. package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js.map +0 -1
  320. package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js +0 -2
  321. package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js.map +0 -1
  322. package/dist/core/web/public/next/assets/AutonomySection-CoMngwNB.js +0 -2
  323. package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js +0 -2
  324. package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js.map +0 -1
  325. package/dist/core/web/public/next/assets/BranchBar-C9BpPVLr.css +0 -1
  326. package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js +0 -2
  327. package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js.map +0 -1
  328. package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js +0 -2
  329. package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js.map +0 -1
  330. package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js +0 -2
  331. package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js.map +0 -1
  332. package/dist/core/web/public/next/assets/CapacityStrip-wgFP9MUA.css +0 -1
  333. package/dist/core/web/public/next/assets/ChatSection-B9cdRKUh.js +0 -3
  334. package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js +0 -2
  335. package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js.map +0 -1
  336. package/dist/core/web/public/next/assets/Composer-CkcwbQhG.css +0 -1
  337. package/dist/core/web/public/next/assets/Composer.module-DJMdrqNt.js +0 -2
  338. package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js +0 -2
  339. package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js.map +0 -1
  340. package/dist/core/web/public/next/assets/DiffPane-Csboxnn0.css +0 -1
  341. package/dist/core/web/public/next/assets/DockHost-BGnTgdIb.css +0 -1
  342. package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js +0 -2
  343. package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js.map +0 -1
  344. package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js +0 -3
  345. package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js.map +0 -1
  346. package/dist/core/web/public/next/assets/FleetSection-w9AjqfTR.css +0 -1
  347. package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js +0 -2
  348. package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js.map +0 -1
  349. package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js +0 -2
  350. package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js.map +0 -1
  351. package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js +0 -2
  352. package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js.map +0 -1
  353. package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js +0 -2
  354. package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js.map +0 -1
  355. package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js +0 -2
  356. package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js.map +0 -1
  357. package/dist/core/web/public/next/assets/McpSection-1UncWBpW.js +0 -2
  358. package/dist/core/web/public/next/assets/MessageMarkdown-C4pl9LI5.js +0 -3
  359. package/dist/core/web/public/next/assets/MessageMarkdown-Czcl3L_Q.css +0 -1
  360. package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js +0 -2
  361. package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js.map +0 -1
  362. package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js +0 -2
  363. package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js.map +0 -1
  364. package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js +0 -2
  365. package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js.map +0 -1
  366. package/dist/core/web/public/next/assets/NeedsYouDrawer-SkhvvdLb.css +0 -1
  367. package/dist/core/web/public/next/assets/NewChatDialog-B_BsS9pr.js +0 -3
  368. package/dist/core/web/public/next/assets/OnboardingFlow-CtCPpgoX.js +0 -2
  369. package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js +0 -2
  370. package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js.map +0 -1
  371. package/dist/core/web/public/next/assets/PreviewPane-WQJFjSXe.css +0 -1
  372. package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js +0 -2
  373. package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js.map +0 -1
  374. package/dist/core/web/public/next/assets/SeatSelector-DaUO-zoK.js +0 -3
  375. package/dist/core/web/public/next/assets/SessionSearch-B5aQ0BCM.js +0 -2
  376. package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js +0 -2
  377. package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js.map +0 -1
  378. package/dist/core/web/public/next/assets/Sidebar-DfD8MNZt.css +0 -1
  379. package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js +0 -3
  380. package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js.map +0 -1
  381. package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js +0 -2
  382. package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js.map +0 -1
  383. package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js +0 -2
  384. package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js.map +0 -1
  385. package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js +0 -7
  386. package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js.map +0 -1
  387. package/dist/core/web/public/next/assets/TerminalPane-CmE2QL-Q.css +0 -1
  388. package/dist/core/web/public/next/assets/UniverseConsoleApp-DKqAf-eD.js +0 -2
  389. package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js +0 -2
  390. package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js.map +0 -1
  391. package/dist/core/web/public/next/assets/UsageSection-DwgNOYvi.css +0 -1
  392. package/dist/core/web/public/next/assets/VerseConsoleApp-C0V221WL.css +0 -1
  393. package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js +0 -3
  394. package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js.map +0 -1
  395. package/dist/core/web/public/next/assets/Workspace-DQXMVDf7.css +0 -1
  396. package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js +0 -10
  397. package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js.map +0 -1
  398. package/dist/core/web/public/next/assets/actions-Bszsdpms.js +0 -2
  399. package/dist/core/web/public/next/assets/actions-Bszsdpms.js.map +0 -1
  400. package/dist/core/web/public/next/assets/actions-Dug8YIf0.css +0 -1
  401. package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js +0 -2
  402. package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js.map +0 -1
  403. package/dist/core/web/public/next/assets/charts-D4NaLaXA.js +0 -2
  404. package/dist/core/web/public/next/assets/charts-D4NaLaXA.js.map +0 -1
  405. package/dist/core/web/public/next/assets/colors-B-vHsX1S.js +0 -2
  406. package/dist/core/web/public/next/assets/colors-B-vHsX1S.js.map +0 -1
  407. package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js +0 -2
  408. package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js.map +0 -1
  409. package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js +0 -2
  410. package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js.map +0 -1
  411. package/dist/core/web/public/next/assets/context.module-B_k02HNU.js +0 -2
  412. package/dist/core/web/public/next/assets/context.module-B_k02HNU.js.map +0 -1
  413. package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js +0 -2
  414. package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js.map +0 -1
  415. package/dist/core/web/public/next/assets/dock-panes-BNTLvX7G.js +0 -2
  416. package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js +0 -2
  417. package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js.map +0 -1
  418. package/dist/core/web/public/next/assets/format-BNYWGJat.js +0 -2
  419. package/dist/core/web/public/next/assets/format-BNYWGJat.js.map +0 -1
  420. package/dist/core/web/public/next/assets/global-DVgMguLr.js +0 -2
  421. package/dist/core/web/public/next/assets/global-DVgMguLr.js.map +0 -1
  422. package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js +0 -2
  423. package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js.map +0 -1
  424. package/dist/core/web/public/next/assets/mind-B-lYfSUJ.css +0 -1
  425. package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js +0 -2
  426. package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js.map +0 -1
  427. package/dist/core/web/public/next/assets/mutations-C6E10SPX.js +0 -2
  428. package/dist/core/web/public/next/assets/primitives-DQvYikjm.js +0 -1
  429. package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js +0 -2
  430. package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js.map +0 -1
  431. package/dist/core/web/public/next/assets/slots-W8gkmdfE.js +0 -3
  432. package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js +0 -2
  433. package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js.map +0 -1
  434. package/dist/core/web/public/next/assets/tasks-model-CnYQzgxk.js +0 -2
  435. package/dist/core/web/public/next/assets/types-Dypu22dp.js +0 -3
  436. package/dist/core/web/public/next/assets/types-Dypu22dp.js.map +0 -1
  437. package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js +0 -2
  438. package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js.map +0 -1
  439. package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js +0 -2
  440. package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js.map +0 -1
  441. package/dist/core/web/public/next/assets/useChartWidth-B8E5mJgM.css +0 -1
  442. package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js +0 -2
  443. package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js.map +0 -1
  444. package/dist/core/web/public/next/assets/verse-model-E98kXngO.js +0 -2
  445. package/dist/core/web/public/next/assets/verse-model-E98kXngO.js.map +0 -1
  446. package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js +0 -2
  447. package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js.map +0 -1
  448. package/dist/core/web/public/next/assets/verse-ui-store-KTTKfv-T.js +0 -3
@@ -1 +0,0 @@
1
- {"version":3,"file":"verse-store-BgKx_YGs.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/verse-store.ts"],"sourcesContent":["/**\n * routes/verse/verse-store.ts — per-session transcript state for the Verse\n * console. Framework-free (useSyncExternalStore glue lives in\n * useVerseSession.ts, the live stream in session-stream.ts), same split as\n * data/cache.ts + data/hooks.ts.\n *\n * One entry per session id holds the ordered, seq-deduplicated event log,\n * the latest session record we know of, the stream connection state, and —\n * V3.10 — the LIVE state of a running turn (reasoning streaming in, what the\n * turn is doing, retry/watchdog notices), which is fed by transient events\n * that are never persisted and never enter the event log.\n * Snapshots are replaced wholesale on every change (Object.is semantics —\n * see DESIGN.md §3 for the bug that rule prevents).\n *\n * V3.10 DATA PATH. The previous store merged every event with a Map + spread\n * + sort and told every subscriber about it: replaying 5k events took 2.45 s\n * and 10k took 17 s, and every streamed token re-rendered the whole Chat\n * section. Now:\n *\n * - `applyVerseEvents` applies a BATCH: an event past the newest seq is a\n * plain append (one array copy per batch, not per event), an older one\n * is binary-searched (duplicate → dropped, gap → inserted in place);\n * - subscribers are per session (`subscribeVerseSession`) and read one of\n * three snapshots that change independently:\n * · the HEAD (`getVerseSessionHead`) — session record, stream state\n * and the event log as of the last STRUCTURAL event. A text-delta\n * alone does not republish it, so the sidebar, header and resources\n * panel do not re-render per token;\n * · the TRANSCRIPT (`getVerseTranscript`) — derived lazily, per turn\n * segment, with unchanged turns returned as the same objects so the\n * renderer can skip them;\n * · the LIVE state (`getVerseLive`) — transient signals only.\n * - the stream (session-stream.ts) calls `applyVerseEvents` once per\n * animation frame, so a burst of frames costs one render.\n *\n * `buildTranscript()` derives what the transcript renders from the raw\n * events: streamed `text-delta`s accumulate into a provisional assistant\n * bubble until the matching `assistant-message` arrives and replaces it;\n * `tool-use` and `tool-result` pair up by toolUseId into one card.\n */\nimport type { VerseEvent, VerseSession, VerseUsage } from '../../data/api-types.js';\nimport {\n isTransientVerseEvent,\n type VerseProgressPhase,\n type VerseRecoveryHow,\n type VerseStatusKind,\n type VerseThinkingKind,\n type VerseTransientEvent,\n type VerseWindowSource,\n} from '../../../core/verse/types.js';\nimport { reconcileAutoCompactAt } from '../../../core/verse/context-math.js';\n\nexport type VerseStreamState = 'idle' | 'connecting' | 'open' | 'reconnecting' | 'closed';\n\n// ---------------------------------------------------------------------------\n// Live (transient) state\n// ---------------------------------------------------------------------------\n\n/** The reasoning block currently streaming in (`thinking-delta` / `thinking-progress`). */\nexport interface VerseLiveThinking {\n turnId: string;\n /** Streamed text so far; empty when the CLI reports only a token estimate. */\n text: string;\n /** Client clock (ms) when this block's first signal arrived. */\n startedAt: number;\n /** Latest `thinking-progress` estimate; null when the CLI sent none (unknown, never 0). */\n estimatedTokens: number | null;\n}\n\nexport interface VerseLiveProgress {\n phase: VerseProgressPhase;\n tool: string | null;\n /** Server-measured turn wall time when the frame was sent. */\n elapsedMs: number;\n outTokens: number | null;\n tokPerSec: number | null;\n /** Client clock (ms) the frame arrived, so elapsed can keep counting between frames. */\n receivedAt: number;\n}\n\nexport interface VerseLiveNotice {\n kind: VerseStatusKind;\n message: string;\n at: string;\n receivedAt: number;\n}\n\nexport interface VerseLiveState {\n /** The running turn these signals belong to; null when none is running. */\n turnId: string | null;\n /** Client clock (ms) the running turn started, from its `turn-started` stamp when parseable. */\n startedAt: number | null;\n progress: VerseLiveProgress | null;\n thinking: VerseLiveThinking | null;\n /** The latest plumbing notice (API retry, preflight, no-output watchdog); cleared when output resumes. */\n notice: VerseLiveNotice | null;\n /** Last turn that settled, so a late transient frame for it cannot resurrect the live line. */\n settledTurnId: string | null;\n}\n\n/** What this tab measured about a reasoning block while it streamed — keyed by the persisted `thinking` event's seq. */\nexport interface VerseThinkingStat {\n durationMs: number | null;\n estimatedTokens: number | null;\n}\n\nconst EMPTY_LIVE: VerseLiveState = {\n turnId: null,\n startedAt: null,\n progress: null,\n thinking: null,\n notice: null,\n settledTurnId: null,\n};\n\n// ---------------------------------------------------------------------------\n// Entries, heads and subscriptions\n// ---------------------------------------------------------------------------\n\nexport interface VerseSessionState {\n sessionId: string;\n session: VerseSession | null;\n events: VerseEvent[];\n /** Highest PERSISTED seq held — the resume cursor. Transient frames never move it. */\n lastSeq: number;\n loaded: boolean;\n loadError: string | null;\n stream: VerseStreamState;\n /** V3.10 transient signals of the running turn. */\n live: VerseLiveState;\n}\n\n/**\n * Everything about a session EXCEPT its live signals, republished only on\n * structural change. `events` is the log as of the last non-`text-delta`\n * event: streamed tokens reach the transcript through its own subscription,\n * so a consumer of the head (session record, meters, activity stats) never\n * re-renders per token. Code that needs every delta reads\n * `getVerseSessionState` or `getVerseTranscript` instead.\n */\nexport type VerseSessionHead = Omit<VerseSessionState, 'live'>;\n\nconst EMPTY: Omit<VerseSessionState, 'sessionId'> = {\n session: null,\n events: [],\n lastSeq: 0,\n loaded: false,\n loadError: null,\n stream: 'idle',\n live: EMPTY_LIVE,\n};\n\nconst sessions = new Map<string, VerseSessionState>();\nconst heads = new Map<string, VerseSessionHead>();\nconst thinkingStats = new Map<string, Map<number, VerseThinkingStat>>();\nconst transcriptMemo = new Map<string, { events: readonly VerseEvent[]; transcript: Transcript; cache: TranscriptCache }>();\nconst listeners = new Set<() => void>();\nconst sessionListeners = new Map<string, Set<() => void>>();\n\nexport type VerseStoreLifecycle = { kind: 'reset' } | { kind: 'forget'; sessionId: string };\nconst lifecycleListeners = new Set<(event: VerseStoreLifecycle) => void>();\n\nfunction notify(sessionId: string | null): void {\n if (sessionId !== null) {\n const scoped = sessionListeners.get(sessionId);\n if (scoped) for (const l of [...scoped]) l();\n } else {\n for (const set of [...sessionListeners.values()]) for (const l of [...set]) l();\n }\n for (const l of [...listeners]) l();\n}\n\n/** Every change to every session. Prefer `subscribeVerseSession` in components. */\nexport function subscribeVerseStore(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Changes to ONE session only — what a component showing that session subscribes to. */\nexport function subscribeVerseSession(sessionId: string, listener: () => void): () => void {\n let set = sessionListeners.get(sessionId);\n if (!set) {\n set = new Set();\n sessionListeners.set(sessionId, set);\n }\n set.add(listener);\n return () => {\n const current = sessionListeners.get(sessionId);\n if (!current) return;\n current.delete(listener);\n if (current.size === 0) sessionListeners.delete(sessionId);\n };\n}\n\n/**\n * Reset / forget notifications, so the live-stream registry can close the\n * connection of a chat that was deleted or of a store that was cleared on\n * logout (and so tests never inherit a previous test's stream).\n */\nexport function subscribeVerseStoreLifecycle(listener: (event: VerseStoreLifecycle) => void): () => void {\n lifecycleListeners.add(listener);\n return () => lifecycleListeners.delete(listener);\n}\n\nfunction headOf(state: VerseSessionState): VerseSessionHead {\n return {\n sessionId: state.sessionId,\n session: state.session,\n events: state.events,\n lastSeq: state.lastSeq,\n loaded: state.loaded,\n loadError: state.loadError,\n stream: state.stream,\n };\n}\n\nfunction entryFor(sessionId: string): VerseSessionState {\n let e = sessions.get(sessionId);\n if (!e) {\n e = { sessionId, ...EMPTY };\n sessions.set(sessionId, e);\n heads.set(sessionId, headOf(e));\n }\n return e;\n}\n\n/**\n * Store `next` and republish the head when anything it carries changed.\n * `structural` = the event log gained something other than a text-delta.\n */\nfunction commit(sessionId: string, next: VerseSessionState, structural: boolean): void {\n sessions.set(sessionId, next);\n const head = heads.get(sessionId);\n if (\n !head || structural || head.session !== next.session || head.loaded !== next.loaded ||\n head.loadError !== next.loadError || head.stream !== next.stream\n ) {\n heads.set(sessionId, headOf(next));\n }\n}\n\nfunction patch(sessionId: string, delta: Partial<VerseSessionState>, structural = false): void {\n const current = entryFor(sessionId);\n commit(sessionId, { ...current, ...delta }, structural);\n notify(sessionId);\n}\n\nconst NONE: VerseSessionState = { sessionId: '', ...EMPTY };\nconst NONE_HEAD: VerseSessionHead = headOf(NONE);\n\n/** Stable reference until the entry changes, so useSyncExternalStore is happy. */\nexport function getVerseSessionState(sessionId: string | null): VerseSessionState {\n if (!sessionId) return NONE;\n return entryFor(sessionId);\n}\n\n/** The head snapshot (see VerseSessionHead) — stable across text-deltas. */\nexport function getVerseSessionHead(sessionId: string | null): VerseSessionHead {\n if (!sessionId) return NONE_HEAD;\n entryFor(sessionId);\n return heads.get(sessionId)!;\n}\n\n/** Live signals of the running turn; the same object until one of them changes. */\nexport function getVerseLive(sessionId: string | null): VerseLiveState {\n if (!sessionId) return EMPTY_LIVE;\n return entryFor(sessionId).live;\n}\n\nconst EMPTY_TRANSCRIPT: Transcript = { items: [], live: false, usage: null, segments: [] };\n\n/**\n * The derived transcript, rebuilt only when the event log changed and then\n * only for the turn segments that changed (see buildTranscript's cache).\n */\nexport function getVerseTranscript(sessionId: string | null): Transcript {\n if (!sessionId) return EMPTY_TRANSCRIPT;\n const entry = entryFor(sessionId);\n const memo = transcriptMemo.get(sessionId);\n if (memo && memo.events === entry.events) return memo.transcript;\n const cache = memo?.cache ?? createTranscriptCache();\n const transcript = buildTranscript(entry.events, { cache, thinkingStats: thinkingStats.get(sessionId) });\n transcriptMemo.set(sessionId, { events: entry.events, transcript, cache });\n return transcript;\n}\n\n/** Merge a fetched detail (session + full event log) into the entry. Events\n * already known (same seq) are kept once; the union stays sorted by seq. The\n * detail fetch can race a live stream, so a `turn-done` that streamed in\n * meanwhile wins over the older `running` snapshot. A refetch that brings\n * nothing new changes nothing — no re-render. */\nexport function seedVerseSession(sessionId: string, session: VerseSession, events: readonly VerseEvent[]): void {\n const current = entryFor(sessionId);\n const merged = mergeEvents(current.events, events);\n const settled = settledStatus(session, merged);\n const nextSession = current.session && sameSession(current.session, settled) ? current.session : settled;\n const eventsChanged = merged !== current.events;\n const live = eventsChanged || nextSession !== current.session ? liveFromLog(current.live, merged, nextSession) : current.live;\n if (!eventsChanged && nextSession === current.session && current.loaded && current.loadError === null && live === current.live) return;\n commit(sessionId, {\n ...current,\n session: nextSession,\n events: merged,\n lastSeq: merged.length ? Math.max(current.lastSeq, merged[merged.length - 1]!.seq) : current.lastSeq,\n loaded: true,\n loadError: null,\n live,\n }, eventsChanged);\n notify(sessionId);\n}\n\nexport function setVerseLoadError(sessionId: string, message: string): void {\n patch(sessionId, { loadError: message, loaded: true });\n}\n\nexport function setVerseStreamState(sessionId: string, stream: VerseStreamState): void {\n if (entryFor(sessionId).stream === stream) return;\n patch(sessionId, { stream });\n}\n\n/**\n * Replace the session record (after a turn POST / rename / list refresh).\n * `turnId` is the turn the snapshot claims is running (POST …/turns returns\n * it): when the log already holds that turn's `turn-done`/`cancelled` — a\n * spawn failure settles in the same tick as the 202 — the snapshot is stale\n * and must not drag the composer back to running.\n */\nexport function setVerseSession(sessionId: string, session: VerseSession, turnId?: string): void {\n const current = entryFor(sessionId);\n patch(sessionId, { session: settledStatus(session, current.events, turnId) });\n}\n\n/**\n * Reconcile a `running` snapshot against the event log. Without a `turnId`\n * the running turn is the last `user-message`/`turn-started` in the log; a\n * later `turn-done`/`cancelled` means the server already settled it. With a\n * `turnId`, only that turn's terminal event counts (its `user-message` may\n * not have streamed in yet, so a previous turn's `turn-done` proves nothing).\n * Status follows the same rules applyVerseEvent uses: cancelled → idle,\n * `turn-done ok:false` → error only when an `error` event was logged for it.\n */\nexport function settledStatus(session: VerseSession, events: readonly VerseEvent[], turnId?: string): VerseSession {\n if (session.status !== 'running') return session;\n let anchorSeq = -1;\n let anchorTurn: string | null = turnId ?? null;\n if (!turnId) {\n for (const e of events) {\n if (e.type === 'user-message' || e.type === 'turn-started') {\n anchorSeq = e.seq;\n anchorTurn = e.turnId;\n }\n }\n if (anchorTurn === null) return session;\n }\n let terminal: Extract<VerseEvent, { type: 'turn-done' | 'cancelled' }> | null = null;\n let lastError: string | null = null;\n for (const e of events) {\n if (e.seq <= anchorSeq) continue;\n if (e.type === 'error' && e.turnId === anchorTurn) lastError = e.message;\n if ((e.type === 'turn-done' || e.type === 'cancelled') && e.turnId === anchorTurn) terminal = e;\n }\n if (!terminal) return session;\n const failed = terminal.type === 'turn-done' && !terminal.ok && lastError !== null;\n return {\n ...session,\n status: failed ? 'error' : 'idle',\n lastError: failed ? lastError : null,\n updatedAt: terminal.at > session.updatedAt ? terminal.at : session.updatedAt,\n };\n}\n\n/** Optimistic status flip (e.g. right after POST …/turns returns 202). */\nexport function setVerseSessionStatus(sessionId: string, status: VerseSession['status']): void {\n const current = entryFor(sessionId);\n if (!current.session || current.session.status === status) return;\n patch(sessionId, { session: { ...current.session, status } });\n}\n\nexport interface VerseApplyResult {\n /** Persisted events newly added to the log (duplicates excluded). */\n applied: number;\n /** A newly added event settled a turn (`turn-done` / `cancelled` / `error`) — the lists may be stale. */\n settled: boolean;\n /** A transient frame changed the live state. */\n liveChanged: boolean;\n}\n\n/**\n * Apply a BATCH of live events in arrival order, then notify once.\n *\n * Persisted events: duplicates (a stream that replays from the start, or a\n * resume that overlaps the detail fetch) are dropped by seq; an event past\n * the newest seq is appended; an older unseen one is inserted in place.\n * Session-level side effects: `usage` and `context` update the live context\n * meter, `compaction` counts a native compaction, `turn-started` flips\n * status to running, `turn-done`/`cancelled`/`error` settle it, and a codex\n * `turn-done.nativeSessionId` is captured.\n *\n * Transient events (VERSE_TRANSIENT_EVENT_TYPES) never enter the log and\n * never move `lastSeq`: they carry the last PERSISTED seq, so deduping them\n * by seq would drop every one of them. They only update `live`.\n */\nexport function applyVerseEvents(sessionId: string, incoming: readonly VerseEvent[]): VerseApplyResult {\n const current = entryFor(sessionId);\n let events: VerseEvent[] = current.events;\n let copied = false;\n let lastSeq = current.lastSeq;\n let session = current.session;\n let live = current.live;\n let applied = 0;\n let settled = false;\n let structural = false;\n let liveChanged = false;\n const now = Date.now();\n\n for (const event of incoming) {\n if (isTransientVerseEvent(event)) {\n const next = applyTransient(live, event, now);\n if (next !== live) {\n live = next;\n liveChanged = true;\n }\n continue;\n }\n if (!Number.isFinite(event.seq)) continue;\n const tail = events.length > 0 ? events[events.length - 1]!.seq : -Infinity;\n if (event.seq > tail) {\n if (!copied) {\n events = events.slice();\n copied = true;\n }\n events.push(event);\n } else {\n const at = seqIndex(events, event.seq);\n if (at.found) continue;\n if (!copied) {\n events = events.slice();\n copied = true;\n }\n events.splice(at.index, 0, event);\n }\n applied += 1;\n lastSeq = Math.max(lastSeq, event.seq);\n if (event.type !== 'text-delta') structural = true;\n if (event.type === 'turn-done' || event.type === 'cancelled' || event.type === 'error') settled = true;\n if (session) session = sessionAfter(session, event);\n const nextLive = livePersisted(live, event, now, sessionId);\n if (nextLive !== live) live = nextLive;\n }\n\n if (applied === 0 && !liveChanged) return { applied: 0, settled: false, liveChanged: false };\n commit(sessionId, { ...current, events, lastSeq, session, live }, structural);\n notify(sessionId);\n return { applied, settled, liveChanged };\n}\n\n/**\n * Apply one live event (the single-event form of applyVerseEvents). Returns\n * true when the log gained the event, or — for a transient frame — when the\n * live state changed.\n */\nexport function applyVerseEvent(sessionId: string, event: VerseEvent): boolean {\n const result = applyVerseEvents(sessionId, [event]);\n return result.applied > 0 || result.liveChanged;\n}\n\n/** A persisted event's effect on the session record (the old applyVerseEvent switch). */\nfunction sessionAfter(session: VerseSession, event: VerseEvent): VerseSession {\n switch (event.type) {\n case 'turn-started':\n return { ...session, status: 'running', lastError: null, updatedAt: event.at };\n case 'usage':\n return { ...session, usage: applyUsageFrame(session, event.usage), updatedAt: event.at };\n case 'context':\n return { ...session, usage: applyContextReading(session, event), updatedAt: event.at };\n case 'compaction':\n // Counted exactly as the server counts it (session-engine), so a reload\n // shows the same number the live stream did. Occupancy is NOT touched\n // here: the next `usage`/`context` reading is the measurement.\n return { ...session, compactionCount: (session.compactionCount ?? 0) + 1, updatedAt: event.at };\n case 'turn-done':\n return {\n ...session,\n status: event.ok ? 'idle' : session.lastError ? 'error' : 'idle',\n turnCount: session.turnCount + 1,\n nativeSessionId: event.nativeSessionId ?? session.nativeSessionId,\n updatedAt: event.at,\n };\n case 'error':\n return { ...session, status: 'error', lastError: event.message, updatedAt: event.at };\n case 'cancelled':\n return { ...session, status: 'idle', updatedAt: event.at };\n default:\n return session;\n }\n}\n\nfunction stampMs(at: string, fallback: number): number {\n const parsed = Date.parse(at);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\n/** Enter (or stay in) the live context of `turnId`. */\nfunction liveForTurn(live: VerseLiveState, turnId: string, startedAt: number): VerseLiveState {\n if (live.turnId === turnId) return live;\n return { ...EMPTY_LIVE, turnId, startedAt, settledTurnId: live.settledTurnId };\n}\n\nfunction applyTransient(live: VerseLiveState, event: VerseTransientEvent, now: number): VerseLiveState {\n // A frame for a turn that already settled (late delivery after turn-done)\n // must not bring the live line back.\n if (event.turnId !== null && event.turnId === live.settledTurnId) return live;\n const base = event.turnId !== null ? liveForTurn(live, event.turnId, now) : live;\n switch (event.type) {\n case 'thinking-delta': {\n if (event.text.length === 0) return base;\n const block = base.thinking && base.thinking.turnId === event.turnId\n ? { ...base.thinking, text: base.thinking.text + event.text }\n : { turnId: event.turnId, text: event.text, startedAt: now, estimatedTokens: null };\n return { ...base, thinking: block, notice: null };\n }\n case 'thinking-progress': {\n const block = base.thinking && base.thinking.turnId === event.turnId\n ? { ...base.thinking, estimatedTokens: event.estimatedTokens }\n : { turnId: event.turnId, text: '', startedAt: now, estimatedTokens: event.estimatedTokens };\n return { ...base, thinking: block };\n }\n case 'progress':\n return {\n ...base,\n progress: {\n phase: event.phase,\n tool: typeof event.tool === 'string' && event.tool.length > 0 ? event.tool : null,\n elapsedMs: event.elapsedMs,\n outTokens: event.outTokens ?? null,\n tokPerSec: event.tokPerSec ?? null,\n receivedAt: now,\n },\n };\n case 'status':\n return { ...base, notice: { kind: event.kind, message: event.message, at: event.at, receivedAt: now } };\n default:\n return base;\n }\n}\n\n/** A persisted event's effect on the live state. */\nfunction livePersisted(live: VerseLiveState, event: VerseEvent, now: number, sessionId: string): VerseLiveState {\n switch (event.type) {\n case 'turn-started':\n if (event.turnId === live.settledTurnId) return live;\n return live.turnId === event.turnId\n ? { ...live, startedAt: stampMs(event.at, live.startedAt ?? now) }\n : { ...EMPTY_LIVE, turnId: event.turnId, startedAt: stampMs(event.at, now), settledTurnId: live.settledTurnId };\n case 'thinking': {\n // The persisted block supersedes the streamed one. What this tab\n // measured while it streamed (duration, the CLI's token estimate) is\n // kept beside the log, by seq, so the finished block can still say\n // \"Thought 12s · ~1.8k tok\" — the event itself is immutable.\n const streamed = live.thinking && live.thinking.turnId === event.turnId ? live.thinking : null;\n if (streamed) {\n let stats = thinkingStats.get(sessionId);\n if (!stats) {\n stats = new Map();\n thinkingStats.set(sessionId, stats);\n }\n stats.set(event.seq, {\n durationMs: typeof event.durationMs === 'number' ? event.durationMs : Math.max(0, now - streamed.startedAt),\n estimatedTokens: streamed.estimatedTokens,\n });\n }\n return streamed || live.notice ? { ...live, thinking: streamed ? null : live.thinking, notice: null } : live;\n }\n case 'text-delta':\n case 'assistant-message':\n case 'tool-use':\n case 'tool-result':\n // Output resumed: a retry went through, the watchdog's silence ended.\n return live.notice && (event.turnId === live.turnId || live.turnId === null) ? { ...live, notice: null } : live;\n case 'turn-done':\n case 'cancelled':\n return { ...EMPTY_LIVE, settledTurnId: event.turnId };\n default:\n return live;\n }\n}\n\n/**\n * Live state implied by a freshly merged log: a chat opened (or reloaded)\n * mid-turn still shows its live line, timed from the turn's own stamp; a\n * log whose last turn is settled shows none.\n */\nfunction liveFromLog(live: VerseLiveState, events: readonly VerseEvent[], session: VerseSession | null): VerseLiveState {\n let openTurn: Extract<VerseEvent, { type: 'turn-started' }> | null = null;\n let settledTurnId: string | null = live.settledTurnId;\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const e = events[i]!;\n if (e.type === 'turn-done' || e.type === 'cancelled') {\n settledTurnId = e.turnId;\n break;\n }\n if (e.type === 'turn-started') {\n openTurn = e;\n break;\n }\n }\n if (!openTurn) {\n if (live.turnId !== null && live.turnId === settledTurnId) return { ...EMPTY_LIVE, settledTurnId };\n // No turn-started in the log yet (the POST just went out): keep whatever\n // the stream already told us; nothing in the log contradicts it.\n return live.settledTurnId === settledTurnId ? live : { ...live, settledTurnId };\n }\n if (session && session.status !== 'running') return live.turnId === null ? live : { ...EMPTY_LIVE, settledTurnId: live.settledTurnId };\n if (live.turnId === openTurn.turnId) return live;\n return { ...EMPTY_LIVE, turnId: openTurn.turnId, startedAt: stampMs(openTurn.at, Date.now()), settledTurnId: live.settledTurnId };\n}\n\n/**\n * Fold one `usage` frame into the session record. The frame carries THIS\n * turn's counts; the record keeps the session totals (server: session-engine\n * applyUsage). Occupancy and the window are live values, not sums.\n *\n * V3.9 fields are adopted only when the frame carries them (spread-when-\n * present), so a pre-3.9 server's frames leave the record's shape unchanged.\n * The one exception is a local seat: Verse SETS that window\n * (`CLAUDE_CODE_MAX_CONTEXT_TOKENS`), so a window a frame reports without\n * provenance is not allowed to replace it — the server ignores runtime\n * windows on local for the same reason.\n */\nexport function applyUsageFrame(session: VerseSession, frame: VerseUsage): VerseUsage {\n const prev = session.usage;\n const next: VerseUsage = {\n ...prev,\n inputTokens: prev.inputTokens + frame.inputTokens,\n outputTokens: prev.outputTokens + frame.outputTokens,\n cacheReadTokens: prev.cacheReadTokens + frame.cacheReadTokens,\n cacheCreationTokens: prev.cacheCreationTokens + frame.cacheCreationTokens,\n contextTokens: frame.contextTokens,\n };\n const frameWindow = typeof frame.contextWindow === 'number' && frame.contextWindow > 0 ? frame.contextWindow : null;\n const trusted = frame.contextWindowSource !== undefined || session.engine !== 'local';\n if (frameWindow !== null && trusted) next.contextWindow = frameWindow;\n if (frame.contextWindowSource !== undefined) next.contextWindowSource = frame.contextWindowSource;\n if (frame.autoCompactAt !== undefined) next.autoCompactAt = frame.autoCompactAt;\n // The server marks an EXACT reading by OMITTING the key (it only writes\n // `false`), so a resolved frame without it must clear an earlier \"≤\" — a\n // frame from a pre-3.9 server (no V3.9 fields at all) leaves it alone.\n if (frame.contextTokensExact === false) next.contextTokensExact = false;\n else if (frame.contextWindowSource !== undefined) delete next.contextTokensExact;\n return next;\n}\n\n/** The provenance values a frame may carry; anything else is ignored, never stored. */\nconst WINDOW_SOURCES: ReadonlySet<string> = new Set<VerseWindowSource>(['runtime', 'provider-catalog', 'cli-catalog', 'documented', 'fallback']);\n\nfunction frameWindowSource(value: unknown): VerseWindowSource | null {\n return typeof value === 'string' && WINDOW_SOURCES.has(value) ? (value as VerseWindowSource) : null;\n}\n\n/**\n * Apply a `context` reading: it REPLACES occupancy (never summed). When it\n * names a window, the window's provenance is the one the EVENT states\n * (`contextWindowSource`, V3.9): the engine also emits a `context` event\n * after a MODE SWITCH, carrying the new mode's CATALOG budget, and stamping\n * that 'runtime' made the tooltip say \"reported by the CLI on the last turn\"\n * for a number no CLI reported — and pinned it ahead of later catalog\n * corrections (sessionContextBudget precedence 1). Only an event from a\n * server that predates the field (no source at all) is taken as a runtime\n * reading, which is what every such event was.\n *\n * The engine fills `autoCompactAt` for the window in force; a frame without\n * it (an older server) is reconciled from the previous budget rather than\n * left pointing at a compaction point that belonged to a different window.\n */\nexport function applyContextReading(\n session: VerseSession,\n event: Extract<VerseEvent, { type: 'context' }>,\n): VerseUsage {\n const prev = session.usage;\n const next: VerseUsage = {\n ...prev,\n contextTokens: Math.max(0, Math.floor(event.contextTokens)),\n contextTokensExact: event.exact,\n };\n const window = typeof event.contextWindow === 'number' && event.contextWindow > 0 ? event.contextWindow : null;\n const stated = frameWindowSource(event.contextWindowSource);\n // Local windows are SET by Verse (CLAUDE_CODE_MAX_CONTEXT_TOKENS), not\n // measured: a window without provenance is not allowed to move one (see\n // applyUsageFrame). A V3.9 event that states its source is the engine's\n // own record of the window it just launched with, so it is adopted.\n if (window === null || (session.engine === 'local' && stated === null)) {\n if (event.autoCompactAt !== undefined && event.autoCompactAt !== null) next.autoCompactAt = event.autoCompactAt;\n return next;\n }\n next.contextWindow = window;\n next.contextWindowSource = stated ?? 'runtime';\n if (event.autoCompactAt !== undefined) {\n next.autoCompactAt = event.autoCompactAt;\n } else if (window !== prev.contextWindow) {\n next.autoCompactAt = reconcileAutoCompactAt({\n engine: session.engine,\n runtimeWindow: window,\n budget: prev.contextWindow ? { contextWindow: prev.contextWindow, autoCompactAt: prev.autoCompactAt ?? null } : null,\n });\n }\n return next;\n}\n\n/**\n * When this chat last talked to its provider — the newest `usage`,\n * `turn-done`, `cancelled` or TURN-attributed `context` event — or null when\n * the log holds none (no turn yet, or the log is not loaded).\n *\n * WHY NOT `session.updatedAt`: the idle-cache advice (\"the prompt cache has\n * likely expired\") asks how long the PROVIDER has gone without a request,\n * and `updatedAt` moves on things that never reach a provider: a rename, a\n * context-mode switch (whose `context` event has `turnId: null`), a reload's\n * record save. Measured from `updatedAt`, one rename silenced the warning\n * for another hour while the cache stayed cold.\n */\nexport function lastTurnActivityAt(events: readonly VerseEvent[]): string | null {\n let latest: string | null = null;\n for (const e of events) {\n const turnActivity = e.type === 'usage' || e.type === 'turn-done' || e.type === 'cancelled' ||\n (e.type === 'context' && e.turnId !== null);\n if (turnActivity && typeof e.at === 'string' && (latest === null || e.at > latest)) latest = e.at;\n }\n return latest;\n}\n\nexport function forgetVerseSession(sessionId: string): void {\n const existed = sessions.delete(sessionId);\n heads.delete(sessionId);\n transcriptMemo.delete(sessionId);\n thinkingStats.delete(sessionId);\n for (const l of [...lifecycleListeners]) l({ kind: 'forget', sessionId });\n if (existed) notify(sessionId);\n}\n\n/** Test/logout hygiene. */\nexport function resetVerseStore(): void {\n sessions.clear();\n heads.clear();\n transcriptMemo.clear();\n thinkingStats.clear();\n for (const l of [...lifecycleListeners]) l({ kind: 'reset' });\n notify(null);\n}\n\n/** Position of `seq` in a seq-sorted log (binary search). */\nfunction seqIndex(events: readonly VerseEvent[], seq: number): { found: boolean; index: number } {\n let lo = 0;\n let hi = events.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const s = events[mid]!.seq;\n if (s === seq) return { found: true, index: mid };\n if (s < seq) lo = mid + 1;\n else hi = mid;\n }\n return { found: false, index: lo };\n}\n\n/** Sorted by seq, one event per seq (first occurrence wins), non-finite seqs dropped. */\nfunction normalizeEvents(events: readonly VerseEvent[]): VerseEvent[] {\n let ascending = true;\n for (let i = 0; i < events.length; i += 1) {\n const seq = events[i]!.seq;\n if (!Number.isFinite(seq) || (i > 0 && seq <= events[i - 1]!.seq)) {\n ascending = false;\n break;\n }\n }\n if (ascending) return events.slice();\n const bySeq = new Map<number, VerseEvent>();\n for (const e of events) if (Number.isFinite(e.seq) && !bySeq.has(e.seq)) bySeq.set(e.seq, e);\n return [...bySeq.values()].sort((a, b) => a.seq - b.seq);\n}\n\n/**\n * Union of two logs by seq, existing events winning. Returns `existing`\n * itself when `incoming` adds nothing, so a refetch that brought no news is\n * not a change. Linear in the two lengths (both are seq-sorted).\n */\nfunction mergeEvents(existing: VerseEvent[], incomingRaw: readonly VerseEvent[]): VerseEvent[] {\n if (incomingRaw.length === 0) return existing;\n const incoming = normalizeEvents(incomingRaw);\n if (incoming.length === 0) return existing;\n if (existing.length === 0) return incoming;\n if (incoming[0]!.seq > existing[existing.length - 1]!.seq) return existing.concat(incoming);\n const out: VerseEvent[] = [];\n let added = 0;\n let i = 0;\n let j = 0;\n while (i < existing.length || j < incoming.length) {\n const a = existing[i];\n const b = incoming[j];\n if (b === undefined || (a !== undefined && a.seq < b.seq)) {\n out.push(a!);\n i += 1;\n } else if (a === undefined || b.seq < a.seq) {\n out.push(b);\n added += 1;\n j += 1;\n } else {\n out.push(a);\n i += 1;\n j += 1;\n }\n }\n return added === 0 ? existing : out;\n}\n\nfunction shallowEqualValue(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (!a || !b || typeof a !== 'object' || typeof b !== 'object' || Array.isArray(a) !== Array.isArray(b)) return false;\n const ka = Object.keys(a as object);\n const kb = Object.keys(b as object);\n if (ka.length !== kb.length) return false;\n for (const k of ka) {\n if (!Object.is((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k])) return false;\n }\n return true;\n}\n\n/** Same record, one level deep — a refetched but unchanged session must not re-render its chat. */\nfunction sameSession(a: VerseSession, b: VerseSession): boolean {\n if (a === b) return true;\n const ka = Object.keys(a) as Array<keyof VerseSession>;\n if (ka.length !== Object.keys(b).length) return false;\n return ka.every((k) => shallowEqualValue(a[k], b[k]));\n}\n\n// ---------------------------------------------------------------------------\n// Transcript derivation\n// ---------------------------------------------------------------------------\n\nexport type TranscriptItem =\n | { kind: 'user'; key: string; turnId: string; at: string; text: string }\n | { kind: 'assistant'; key: string; turnId: string; at: string; text: string; streaming: boolean }\n | {\n kind: 'thinking';\n key: string;\n turnId: string;\n at: string;\n text: string;\n /** V3.10: the CLI sent a signature-only / redacted block — the model thought, the text is withheld. */\n redacted: boolean;\n /** Streaming wall time: the event's own figure, else what this tab measured; null = unknown. */\n durationMs: number | null;\n /** The CLI's reasoning-token estimate this tab saw while it streamed; null = unknown. */\n estimatedTokens: number | null;\n thinkingKind: VerseThinkingKind | null;\n }\n | {\n kind: 'tool';\n key: string;\n turnId: string;\n at: string;\n toolUseId: string;\n name: string;\n input: unknown;\n result: { output: string; isError: boolean } | null;\n /** tool-use → tool-result wall time; null while pending or unstamped. */\n durationMs: number | null;\n }\n | { kind: 'error'; key: string; turnId: string | null; at: string; message: string; code: string | null }\n | {\n /** V3.9: the CLI compacted its own context. Counts are null when the CLI does not report them (codex). */\n kind: 'compaction';\n key: string;\n turnId: string | null;\n at: string;\n trigger: 'auto' | 'manual';\n preTokens: number | null;\n postTokens: number | null;\n durationMs: number | null;\n }\n | { kind: 'cancelled'; key: string; turnId: string; at: string }\n | { kind: 'turn-done'; key: string; turnId: string; at: string; ok: boolean; durationMs: number }\n /** V3.10: the engine restored a lost native conversation. */\n | { kind: 'recovered'; key: string; turnId: string | null; at: string; how: VerseRecoveryHow; message: string }\n /** V3.10: the log hit its cap and dropped everything before `droppedBefore` (at a turn boundary). */\n | { kind: 'truncated'; key: string; turnId: null; at: string; droppedBefore: number };\n\n/**\n * One turn's worth of items — the log cut at each `user-message`. Unchanged\n * segments come back as the SAME object from a cached build, which is what\n * lets the renderer skip every finished turn while one is streaming.\n */\nexport interface TranscriptSegment {\n key: string;\n items: TranscriptItem[];\n}\n\nexport interface Transcript {\n items: TranscriptItem[];\n /** True while a turn is open (started and not yet done/cancelled). */\n live: boolean;\n /** Most recent usage frame seen in the log, if any. */\n usage: VerseUsage | null;\n /** `items`, cut into turn segments. Absent on a hand-built transcript (treated as one segment). */\n segments?: TranscriptSegment[];\n}\n\n/** Wall time between two ISO stamps; null when either is unparseable. */\nfunction spanMs(from: string, to: string): number | null {\n const a = Date.parse(from);\n const b = Date.parse(to);\n return Number.isFinite(a) && Number.isFinite(b) ? Math.max(0, b - a) : null;\n}\n\ninterface PendingText {\n turnId: string;\n at: string;\n text: string;\n key: string;\n}\n\ninterface SegmentBuild {\n /** Items without the trailing streamed text, which depends on whether the WHOLE log is live. */\n items: TranscriptItem[];\n pending: PendingText | null;\n /** The last live-flag change in this segment: true (started), false (ended) or null (none). */\n liveEffect: boolean | null;\n usage: VerseUsage | null;\n /** tool-results in this segment whose tool-use is not in it. */\n orphanResults: string[];\n toolUseIds: string[];\n}\n\ninterface CachedSegment {\n firstSeq: number;\n lastSeq: number;\n count: number;\n build: SegmentBuild;\n /** The finished segment per trailing-streaming flag it was finalized with. */\n finalized: { streaming: boolean; segment: TranscriptSegment } | null;\n}\n\nexport interface TranscriptCache {\n segments: Map<string, CachedSegment>;\n}\n\nexport function createTranscriptCache(): TranscriptCache {\n return { segments: new Map() };\n}\n\nexport interface BuildTranscriptOptions {\n /** Reuse segments from a previous build of the same session's log. */\n cache?: TranscriptCache;\n /** Measured figures for reasoning blocks this tab watched stream, by the persisted event's seq. */\n thinkingStats?: ReadonlyMap<number, VerseThinkingStat>;\n}\n\n/**\n * The original single-pass derivation over `events[from, to)`. A whole log\n * run through it in one range is exactly the pre-3.10 buildTranscript; cut\n * at `user-message` boundaries (where it flushes anyway) the pieces\n * concatenate to the same items.\n */\nfunction buildSegment(\n events: readonly VerseEvent[],\n from: number,\n to: number,\n stats: ReadonlyMap<number, VerseThinkingStat> | undefined,\n): SegmentBuild {\n const items: TranscriptItem[] = [];\n const toolIndex = new Map<string, number>();\n const orphanResults: string[] = [];\n const toolUseIds: string[] = [];\n let pending: PendingText | null = null;\n let liveEffect: boolean | null = null;\n let usage: VerseUsage | null = null;\n\n const flushPending = () => {\n if (!pending) return;\n items.push({ kind: 'assistant', key: pending.key, turnId: pending.turnId, at: pending.at, text: pending.text, streaming: false });\n pending = null;\n };\n\n for (let i = from; i < to; i += 1) {\n const e = events[i]!;\n switch (e.type) {\n case 'user-message':\n flushPending();\n items.push({ kind: 'user', key: `u-${e.seq}`, turnId: e.turnId, at: e.at, text: e.text });\n break;\n case 'turn-started':\n liveEffect = true;\n break;\n case 'text-delta':\n if (pending && pending.turnId !== e.turnId) flushPending();\n if (!pending) pending = { turnId: e.turnId, at: e.at, text: '', key: `d-${e.seq}` };\n pending.text += e.text;\n break;\n case 'assistant-message':\n // The complete message supersedes whatever deltas streamed before it.\n pending = null;\n items.push({ kind: 'assistant', key: `a-${e.seq}`, turnId: e.turnId, at: e.at, text: e.text, streaming: false });\n break;\n case 'thinking': {\n flushPending();\n const measured = stats?.get(e.seq);\n items.push({\n kind: 'thinking',\n key: `t-${e.seq}`,\n turnId: e.turnId,\n at: e.at,\n text: e.text,\n redacted: e.redacted === true,\n durationMs: typeof e.durationMs === 'number' && Number.isFinite(e.durationMs) && e.durationMs >= 0\n ? e.durationMs\n : measured?.durationMs ?? null,\n estimatedTokens: measured?.estimatedTokens ?? null,\n thinkingKind: e.kind ?? null,\n });\n break;\n }\n case 'tool-use':\n flushPending();\n toolIndex.set(e.toolUseId, items.length);\n toolUseIds.push(e.toolUseId);\n items.push({\n kind: 'tool',\n key: `tu-${e.seq}`,\n turnId: e.turnId,\n at: e.at,\n toolUseId: e.toolUseId,\n name: e.name,\n input: e.input,\n result: null,\n durationMs: null,\n });\n break;\n case 'tool-result': {\n const idx = toolIndex.get(e.toolUseId);\n const existing = idx === undefined ? undefined : items[idx];\n if (existing && existing.kind === 'tool') {\n items[idx!] = { ...existing, result: { output: e.output, isError: e.isError }, durationMs: spanMs(existing.at, e.at) };\n } else {\n orphanResults.push(e.toolUseId);\n items.push({\n kind: 'tool',\n key: `tr-${e.seq}`,\n turnId: e.turnId,\n at: e.at,\n toolUseId: e.toolUseId,\n name: 'tool',\n input: null,\n result: { output: e.output, isError: e.isError },\n durationMs: null,\n });\n }\n break;\n }\n case 'usage':\n usage = e.usage;\n break;\n case 'compaction':\n // Deliberately NO flushPending: CLIs compact between model calls, and\n // flushing a streamed bubble here would leave it in the list when the\n // complete `assistant-message` arrives — the same reply twice.\n items.push({\n kind: 'compaction',\n key: `k-${e.seq}`,\n turnId: e.turnId,\n at: e.at,\n trigger: e.trigger,\n preTokens: e.preTokens,\n postTokens: e.postTokens,\n durationMs: e.durationMs,\n });\n break;\n case 'error':\n flushPending();\n items.push({ kind: 'error', key: `e-${e.seq}`, turnId: e.turnId, at: e.at, message: e.message, code: typeof e.code === 'string' && e.code ? e.code : null });\n break;\n case 'cancelled':\n flushPending();\n liveEffect = false;\n items.push({ kind: 'cancelled', key: `c-${e.seq}`, turnId: e.turnId, at: e.at });\n break;\n case 'turn-done':\n flushPending();\n liveEffect = false;\n items.push({ kind: 'turn-done', key: `td-${e.seq}`, turnId: e.turnId, at: e.at, ok: e.ok, durationMs: e.durationMs });\n break;\n case 'recovered':\n // Like compaction, no flush: recovery happens before the new native\n // session produces anything, never in the middle of a reply.\n items.push({ kind: 'recovered', key: `r-${e.seq}`, turnId: e.turnId, at: e.at, how: e.how, message: e.message });\n break;\n case 'history-truncated':\n items.push({ kind: 'truncated', key: `h-${e.seq}`, turnId: null, at: e.at, droppedBefore: e.droppedBefore });\n break;\n default:\n break;\n }\n }\n return { items, pending, liveEffect, usage, orphanResults, toolUseIds };\n}\n\nfunction finalizeSegment(key: string, build: SegmentBuild, streaming: boolean): TranscriptSegment {\n const p = build.pending;\n if (!p) return { key, items: build.items };\n return {\n key,\n items: [...build.items, { kind: 'assistant', key: p.key, turnId: p.turnId, at: p.at, text: p.text, streaming }],\n };\n}\n\n// `VerseEvent[]` (not readonly) is the published signature: callers type\n// their fixture arrays as `Parameters<typeof buildTranscript>[0]` and push.\nexport function buildTranscript(events: VerseEvent[], options: BuildTranscriptOptions = {}): Transcript {\n const { cache, thinkingStats: stats } = options;\n if (events.length === 0) return { items: [], live: false, usage: null, segments: [] };\n\n // Cut at every user-message: a new ask always opens a new turn, and the\n // derivation flushes its streamed text there, so nothing spans the cut.\n const starts: number[] = [0];\n for (let i = 1; i < events.length; i += 1) if (events[i]!.type === 'user-message') starts.push(i);\n\n const builds: Array<{ key: string; build: SegmentBuild; cached: CachedSegment | null }> = [];\n const seenKeys = new Set<string>();\n for (let s = 0; s < starts.length; s += 1) {\n const from = starts[s]!;\n const to = s + 1 < starts.length ? starts[s + 1]! : events.length;\n const firstSeq = events[from]!.seq;\n const lastSeq = events[to - 1]!.seq;\n const count = to - from;\n const key = `s-${firstSeq}`;\n seenKeys.add(key);\n const hit = cache?.segments.get(key);\n if (hit && hit.firstSeq === firstSeq && hit.lastSeq === lastSeq && hit.count === count) {\n builds.push({ key, build: hit.build, cached: hit });\n continue;\n }\n const build = buildSegment(events, from, to, stats);\n const entry: CachedSegment = { firstSeq, lastSeq, count, build, finalized: null };\n cache?.segments.set(key, entry);\n builds.push({ key, build, cached: entry });\n }\n if (cache) for (const key of [...cache.segments.keys()]) if (!seenKeys.has(key)) cache.segments.delete(key);\n\n // A tool-result whose tool-use sits in an EARLIER segment would have\n // updated that earlier card in the single-pass derivation. It never\n // happens in a real log (a result follows its call inside one turn); if it\n // does, derive the whole log in one pass rather than render it differently.\n if (builds.length > 1) {\n const earlier = new Set<string>();\n for (const b of builds) {\n if (b.build.orphanResults.some((id) => earlier.has(id))) return singlePass(events, stats);\n for (const id of b.build.toolUseIds) earlier.add(id);\n }\n }\n\n let live = false;\n let usage: VerseUsage | null = null;\n for (const b of builds) {\n if (b.build.liveEffect !== null) live = b.build.liveEffect;\n if (b.build.usage !== null) usage = b.build.usage;\n }\n\n const segments: TranscriptSegment[] = [];\n const items: TranscriptItem[] = [];\n for (let s = 0; s < builds.length; s += 1) {\n const b = builds[s]!;\n // Deltas still arriving for an open turn render as a streaming bubble;\n // every earlier segment's trailing text was flushed by the next ask.\n const streaming = s === builds.length - 1 ? live : false;\n let segment: TranscriptSegment;\n if (b.cached?.finalized && b.cached.finalized.streaming === streaming) {\n segment = b.cached.finalized.segment;\n } else {\n segment = finalizeSegment(b.key, b.build, streaming);\n if (b.cached) b.cached.finalized = { streaming, segment };\n }\n segments.push(segment);\n for (const item of segment.items) items.push(item);\n }\n return { items, live, usage, segments };\n}\n\nfunction singlePass(events: readonly VerseEvent[], stats: ReadonlyMap<number, VerseThinkingStat> | undefined): Transcript {\n const build = buildSegment(events, 0, events.length, stats);\n const live = build.liveEffect ?? false;\n const segment = finalizeSegment(`s-${events[0]!.seq}`, build, live);\n return { items: segment.items, live, usage: build.usage, segments: [segment] };\n}\n\n// ---------------------------------------------------------------------------\n// Render-time grouping\n// ---------------------------------------------------------------------------\n\nexport type ToolGroupMember = Extract<TranscriptItem, { kind: 'tool' | 'thinking' }>;\n\nexport interface ToolGroupItem {\n kind: 'toolGroup';\n key: string;\n turnId: string;\n at: string;\n items: ToolGroupMember[];\n /** Tool calls only (thinking blocks are not counted). */\n toolCount: number;\n /** \"Read ×6, Edit ×4\" — names in first-seen order. */\n summary: string;\n errorCount: number;\n /** A member is still waiting for its result. */\n pending: boolean;\n /** Wall time between the first and last member, when both have parseable timestamps. */\n spanMs: number | null;\n}\n\nexport type TranscriptRenderItem = TranscriptItem | ToolGroupItem;\n\n/**\n * Fold runs of consecutive tool calls from the same turn that hold two or\n * more calls into one `toolGroup`, so an agentic turn reads as \"N tool calls\"\n * with a single disclosure instead of a wall of cards. A single call (with\n * whatever reasoning surrounds it) stays as it is.\n * Pure over buildTranscript()'s output (the index-based tool-result pairing\n * there is untouched).\n *\n * Reasoning INTERLEAVED between tool calls folds with them (it explains the\n * next call). Reasoning that ENDS a run — the model's last thought before it\n * answers or before the next ask — is lifted out and rendered on its own, so\n * the part worth reading is never two disclosures deep. A run of reasoning\n * alone never folds.\n */\nexport function groupTranscriptItems(items: readonly TranscriptItem[]): TranscriptRenderItem[] {\n const out: TranscriptRenderItem[] = [];\n let run: ToolGroupMember[] = [];\n\n const flush = () => {\n if (run.length === 0) return;\n let end = run.length;\n while (end > 0 && run[end - 1]!.kind === 'thinking') end -= 1;\n const folded = run.slice(0, end);\n const trailing = run.slice(end);\n // Only a run with two or more CALLS is worth a disclosure: \"1 tool\" hiding\n // a single call plus the reasoning before it is a click for nothing.\n if (folded.filter((m) => m.kind === 'tool').length >= 2) out.push(makeToolGroup(folded));\n else for (const member of folded) out.push(member);\n for (const thought of trailing) out.push(thought);\n run = [];\n };\n\n for (const item of items) {\n if ((item.kind === 'tool' || item.kind === 'thinking') && (run.length === 0 || run[0]!.turnId === item.turnId)) {\n run.push(item);\n continue;\n }\n flush();\n if (item.kind === 'tool' || item.kind === 'thinking') run.push(item);\n else out.push(item);\n }\n flush();\n return out;\n}\n\nfunction makeToolGroup(members: ToolGroupMember[]): ToolGroupItem {\n const counts = new Map<string, number>();\n let errorCount = 0;\n let pending = false;\n for (const m of members) {\n if (m.kind !== 'tool') continue;\n counts.set(m.name, (counts.get(m.name) ?? 0) + 1);\n if (m.result === null) pending = true;\n else if (m.result.isError) errorCount += 1;\n }\n const toolCount = [...counts.values()].reduce((a, b) => a + b, 0);\n const summary = [...counts.entries()].map(([name, n]) => (n > 1 ? `${name} ×${n}` : name)).join(', ');\n const span = spanMs(members[0]!.at, members[members.length - 1]!.at);\n return {\n kind: 'toolGroup',\n key: `g-${members[0]!.key}`,\n turnId: members[0]!.turnId,\n at: members[0]!.at,\n items: members,\n toolCount,\n summary,\n errorCount,\n pending,\n spanMs: span,\n };\n}\n\n/**\n * \"123k\" / \"1.2M\" — compact token counts for the meter and usage rows.\n *\n * The unit is chosen AFTER rounding: choosing it first printed 999,500–\n * 999,999 as \"1000k\" (and 999.5–999.9 as \"1000\"), a band a 1M Claude chat in\n * Expansive can actually reach.\n */\nexport function formatTokens(n: number | null | undefined): string {\n if (n === null || n === undefined || !Number.isFinite(n)) return '—';\n if (Math.round(n) < 1000) return String(Math.round(n));\n if (Math.round(n / 1000) < 1000) return `${Math.round(n / 1000)}k`;\n return `${(n / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`;\n}\n"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AppsSection-CXxbfPJQ.js","assets/index-afDA8cwW.js","assets/global-DVgMguLr.js","assets/global-_tOCFt9y.css","assets/MutationTokenDialog-Dn0tzCrh.js","assets/MutationTokenDialog-Cum_DqQZ.css","assets/workbench-types-DzN-5trg.js","assets/dock-store-_E5h6TEq.js","assets/viewport-ZB86jdES.js","assets/verse-queries-BjQoOTwv.js","assets/section-visibility-CSrsTcwK.js","assets/icons-DWb24OA6.js","assets/VerseConsoleApp-bjARLPwN.js","assets/RouteErrorBoundary-AyUPCIb3.js","assets/RouteErrorBoundary-6RMd_aZg.css","assets/command-catalog-s3W6Z96D.js","assets/guarded-action-vOPc8v75.js","assets/composer-keys-CYz4U4Bg.js","assets/command-bus-CpYuam1F.js","assets/useActivity-Cg_9-7nt.js","assets/VerseConsoleApp-C0V221WL.css","assets/capacity-strip-model-BR539Ci8.js","assets/verse-model-E98kXngO.js","assets/seat-subscription-CrWOV4Qc.js","assets/CapacityStrip-D6Yyg4a1.js","assets/Tag-DEEbDz7T.js","assets/Tag-D0rAEciH.css","assets/budget-queries-Dacv1VYP.js","assets/useSeatsRefresh-4Ov9eT1F.js","assets/CapacityStrip-wgFP9MUA.css","assets/Button-0-nNbv1h.js","assets/Button-DrnKsvnQ.css","assets/use-token-gate-DYA2-ALC.js","assets/slots-W8gkmdfE.js","assets/EmptyState-DdJ4CxtO.js","assets/EmptyState-B3YUPGaa.css","assets/Switch-BzRXtNPt.js","assets/Switch-CU044EaE.css","assets/BudgetControl-P5lMxHvQ.js","assets/Segmented-B_8c_83S.js","assets/Segmented-BnjHbKzH.css","assets/Slider-BS9MU5ZV.js","assets/Slider-AgAdMFpo.css","assets/BudgetControl-CmG1JOWK.css","assets/Select-Bl5g5Dt_.js","assets/Select-DSu5ghId.css","assets/Input-CTu0CycC.js","assets/Input-BQ3PR065.css","assets/Sheet-CVjk-cLI.js","assets/Sheet-ChxlNivX.css","assets/AppsSection-D88QlDpG.css","assets/AutonomySection-CoMngwNB.js","assets/Advanced-DM0DYibH.js","assets/Epistemic-BLjM5y_y.js","assets/Epistemic-OaGnEJkn.css","assets/StatusBadge-DAf-ArKE.js","assets/StatusBadge-BVi0IBb9.css","assets/RefreshIndicator-CnhEovMZ.js","assets/RefreshIndicator-CVv22U_j.css","assets/workspace-model-4hq_Mv3N.js","assets/Meter-C18ciKz4.js","assets/Meter-CYt9KpM0.css","assets/control-queries-BGjarMm9.js","assets/mutations-C6E10SPX.js","assets/format-BNYWGJat.js","assets/use-ticker-hryPXnyp.js","assets/fleet-model-ClBbQ0Uj.js","assets/overnight-queries-CCGfiS-g.js","assets/use-guarded-action-CO_aAsed.js","assets/Advanced-CHjxJt2z.css","assets/ChatSection-B9cdRKUh.js","assets/verse-store-BgKx_YGs.js","assets/types-Dypu22dp.js","assets/ChatSection-C9obUsLL.css","assets/CommandSection-BC0uXim_.js","assets/Swimlane-BR40WVcj.js","assets/useChartWidth-MEXvDxDL.js","assets/colors-B-vHsX1S.js","assets/useChartWidth-B8E5mJgM.css","assets/Swimlane-o6_Zsrnr.css","assets/BurnDown-4P1LDoCL.js","assets/BurnDown-BuLMsJMx.css","assets/AreaTrend-gUVXkfhf.js","assets/surface-data-ZtCegYMQ.js","assets/actions-Bszsdpms.js","assets/actions-Dug8YIf0.css","assets/Surface-CiYOdNKQ.js","assets/Surface-DMca0gAe.css","assets/LeaderCard-BuSDeATv.js","assets/live-model-Dm6ITHvX.js","assets/FleetSection-DuJcQCGg.js","assets/Funnel-qX3Hlbce.js","assets/FleetSection-w9AjqfTR.css","assets/GrowthSection-CYxJ9MH5.js","assets/queries-BuYIEHst.js","assets/StepBand-B1W7rU70.js","assets/StepBand-Dz_9Kryb.css","assets/McpSection-1UncWBpW.js","assets/MindSection-C3fCw_fD.js","assets/MatrixHeatmap-B_JWCjZx.js","assets/MatrixHeatmap-9dKgJ_pT.css","assets/mind.module-BzhAlg3e.js","assets/mind-B-lYfSUJ.css","assets/SettingsSection-CuESA30a.js","assets/reasoning-pref-BVzGczV7.js","assets/primitives-DQvYikjm.js","assets/ShortcutsOverlay-BiBjnBcc.js","assets/ShortcutsOverlay-QSjxmW0a.css","assets/SettingsSection-B8yD34ZM.css","assets/UsageSection-B6fR3cru.js","assets/charts-D4NaLaXA.js","assets/charts-uSX6xVYN.css","assets/context-model-Bto3LZn2.js","assets/usage-queries-CQOpeE1H.js","assets/UsageSection-DwgNOYvi.css"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./index-afDA8cwW.js";import{r as t,x as n}from"./workbench-types-DzN-5trg.js";import{f as r,i,v as a,y as o}from"./dock-store-_E5h6TEq.js";Object.freeze({entries:Object.freeze([]),index:-1});function s(e,t){return!!e&&e.section===t.section&&(e.section!==`chat`||e.sessionId===t.sessionId)}function c(e,t){let n={section:t.section,sessionId:t.section===`chat`?t.sessionId:null},r=e.entries[e.index];if(s(r,n))return e;if(r&&r.section===`chat`&&r.sessionId===null&&n.section===`chat`){let t=[...e.entries.slice(0,e.index),n];return{entries:t,index:t.length-1}}let i=[...e.entries.slice(0,e.index+1),n].slice(-50);return{entries:i,index:i.length-1}}function l(e,t){let n=e.index+t,r=e.entries[n];return r?{history:{entries:e.entries,index:n},entry:r}:null}var u=1500;function d(e,t,n,r,i=u){let a=!t||r-t.at>i,o=a?e:t.order;if(o.length<2)return null;let s=((a?0:t.position)+n+o.length)%o.length;return{sessionId:o[s],cycle:{order:o,position:s,at:r}}}function f(e,t,n=10){return[t,...e.filter(e=>e!==t)].slice(0,n)}var p=Object.fromEntries(Object.entries(Object.assign({"../sections/AppsSection.tsx":()=>e(()=>import(`./AppsSection-CXxbfPJQ.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50])),"../sections/AutonomySection.tsx":()=>e(()=>import(`./AutonomySection-CoMngwNB.js`),__vite__mapDeps([51,1,52,2,3,4,5,53,54,55,56,13,14,57,58,9,6,12,15,16,8,17,18,10,19,11,20,39,40,59,22,60,61,44,45,62,63,64,65,66,67,68,69])),"../sections/ChatSection.tsx":()=>e(()=>import(`./ChatSection-B9cdRKUh.js`).then(e=>e.t),__vite__mapDeps([70,1,2,3,4,5,13,14,15,7,8,9,6,18,10,12,16,17,19,11,20,71,72,30,31,73])),"../sections/CommandSection.tsx":()=>e(()=>import(`./CommandSection-BC0uXim_.js`),__vite__mapDeps([74,1,2,3,57,58,75,76,77,78,79,80,81,82,15,8,9,6,10,19,11,12,13,4,5,14,16,17,18,20,39,40,25,26,27,30,31,38,21,22,23,32,41,42,36,37,43,64,65,83,62,63,48,49,84,68,85,86,87,88,89])),"../sections/FleetSection.tsx":()=>e(()=>import(`./FleetSection-DuJcQCGg.js`),__vite__mapDeps([90,1,2,3,57,58,75,76,77,78,79,91,8,10,11,12,13,4,5,14,15,6,16,9,17,18,19,20,25,26,27,30,31,64,65,67,62,63,83,84,68,85,86,87,89,92])),"../sections/GrowthSection.tsx":()=>e(()=>import(`./GrowthSection-CYxJ9MH5.js`),__vite__mapDeps([93,1,2,3,94,57,58,76,77,78,82,91,95,96,10,65,83,19,6,62,63,86,8,87])),"../sections/McpSection.tsx":()=>e(()=>import(`./McpSection-1UncWBpW.js`),__vite__mapDeps([97,1,0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50])),"../sections/MindSection.tsx":()=>e(()=>import(`./MindSection-C3fCw_fD.js`),__vite__mapDeps([98,1,2,3,57,58,82,76,77,78,99,100,8,10,12,13,4,5,14,15,6,16,9,17,18,19,11,20,64,83,62,63,101,102,84,30,31,68,85,86,87,88,65])),"../sections/SettingsSection.tsx":()=>e(()=>import(`./SettingsSection-CuESA30a.js`),__vite__mapDeps([103,1,2,3,4,5,55,56,13,14,15,11,12,6,16,8,9,17,18,10,19,20,39,40,72,25,26,30,31,104,32,60,61,41,42,36,37,44,45,46,47,105,53,54,57,58,34,35,48,49,106,107,108])),"../sections/UsageSection.tsx":()=>e(()=>import(`./UsageSection-B6fR3cru.js`),__vite__mapDeps([109,1,2,3,53,54,55,56,94,76,77,78,110,75,79,80,81,82,91,95,96,99,100,111,9,6,71,72,22,112,24,10,21,23,25,26,27,28,29,64,66,113,114]))})).map(([e,t])=>[e.replace(/^\.\.\//,`./`),t]));function m(e,t=p){return t[`./sections/${e}.tsx`]}var h=[{id:`command`,label:`Command`,module:`CommandSection`,placement:`rail`,blurb:`What the fleet did, what needs you, and the autonomy switch — the morning read.`},{id:`fleet`,label:`Fleet`,module:`FleetSection`,fallbackModules:[`AutonomySection`],placement:`rail`,blurb:`Every lane live: what is building, what the gates refused, and why each seat was chosen.`},{id:`growth`,label:`Growth`,module:`GrowthSection`,placement:`rail`,blurb:`Is the fleet getting better? Merges, cost per merge and the experiments behind them.`},{id:`mind`,label:`Mind`,module:`MindSection`,placement:`rail`,blurb:`The Leader's memos, what came of each move, and what the reasoning shows.`},{id:`chat`,label:`Chat`,module:`ChatSection`,placement:`rail`,blurb:`Talk to a seat. Chats are grouped by project and resume where they stopped.`},{id:`settings`,label:`Settings`,module:`SettingsSection`,placement:`tray`,blurb:`Theme, chat, desktop and keyboard — and this tour again.`},{id:`apps`,label:`Apps & Accounts`,module:`AppsSection`,placement:`tray`,blurb:`Seats, terminal agents, local models and MCP servers in one list.`},{id:`usage`,label:`Usage`,module:`UsageSection`,placement:`tray`,blurb:`Which account you can actually use right now, and what it costs.`}],g=h.filter(e=>e.placement===`rail`);h.filter(e=>e.placement===`tray`);var _=new Set(h.map(e=>e.id));function v(e){return h.find(t=>t.id===e)}function y(e,t=e=>m(e)!==void 0){let n=v(e);for(let e of[n.module,...n.fallbackModules??[]])if(t(e))return e;return null}var b=[`all`,...t],x={min:240,max:360,def:264},S={min:260,max:480,def:320},C={section:`chat`,railExpanded:!1,sidebarWidth:x.def,sidebarCollapsed:!1,resourcesOpen:!0,resourcesWidth:S.def,recentActions:[],recentChats:[],mounted:[`chat`],overlay:null,needsYouSplit:`all`,needsYouFocus:null,history:{entries:[{section:`chat`,sessionId:null}],index:0},activeSessionId:null,command:null,announceChatMoved:!1};function w(e,t){let n=Number(e);return!Number.isFinite(n)||n<=0?t.def:Math.max(t.min,Math.min(t.max,Math.round(n)))}function ee(e){let t=new Date(e),n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}`}function te(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function T(e,t,n){if(!Array.isArray(e))return[];let r=[];for(let i of e)if(typeof i==`string`&&n.test(i)&&!r.includes(i)&&r.push(i),r.length>=t)break;return r}function E(e){try{let t=localStorage.getItem(e);if(!t)return null;let n=JSON.parse(t);return te(n)?n:null}catch{return null}}var D=null,O=!1;function k(e={}){let t=e.now??Date.now(),r=e.landed??(e=>m(e)!==void 0),i=E(a),s=i?null:E(o),c=i??s??{},l=C.section,u=null,d=n(c.section);d&&_.has(d.section)&&(l=d.section,d.openNeedsYou&&!i&&(u=`needs-you`)),D=i&&typeof i.lastLaunchDay==`string`?i.lastLaunchDay:null,O=i?i.chatMovedAnnounced===!0:!1;let f=ee(t);return D!==f&&y(`command`,r)!==null&&(l=`command`),D=f,{...C,section:l,railExpanded:c.railExpanded===!0,sidebarWidth:w(c.sidebarWidth,x),sidebarCollapsed:c.sidebarCollapsed===!0,resourcesOpen:c.resourcesOpen!==!1,resourcesWidth:w(c.resourcesWidth,S),recentActions:T(c.recentActions,5,/^[a-z][a-z0-9.-]{0,63}$/),recentChats:T(c.recentChats,10,/^[\w.-]{1,200}$/),mounted:[l],overlay:u,history:{entries:[{section:l,sessionId:null}],index:0},announceChatMoved:s!==null&&!O}}var A=C,j=0,M=null,N=new Set;function P(e){let t={version:3,section:e.section,railExpanded:e.railExpanded,sidebarWidth:e.sidebarWidth,sidebarCollapsed:e.sidebarCollapsed,resourcesOpen:e.resourcesOpen,resourcesWidth:e.resourcesWidth,recentActions:[...e.recentActions],recentChats:[...e.recentChats],lastLaunchDay:D,chatMovedAnnounced:O,dock:i()};try{localStorage.setItem(a,JSON.stringify(t))}catch{}}var ne=[`section`,`railExpanded`,`sidebarWidth`,`sidebarCollapsed`,`resourcesOpen`,`resourcesWidth`,`recentActions`,`recentChats`];function F(e){let t={...A,...e};if(Object.keys(e).every(e=>Object.is(A[e],t[e])))return;let n=ne.some(e=>!Object.is(A[e],t[e]));A=t,n&&P(t);for(let e of[...N])e()}function I(){A=k(),P(A)}I();var L=``;r(()=>{let e=``;try{e=JSON.stringify(i())}catch{e=``}e!==L&&(L=e,P(A))});function R(e){return N.add(e),()=>N.delete(e)}function re(){return A}function ie(e,t){let n=t===`chat`||e.includes(`chat`),r=e.filter(e=>e!==`chat`&&e!==t),i=(t===`chat`?r:[t,...r]).slice(0,3),a=t===`chat`?[`chat`,...i]:i;return n&&!a.includes(`chat`)&&a.push(`chat`),a}function z(e,t){if(!_.has(e))return;let n=t.history?c(A.history,{section:e,sessionId:e===`chat`?A.activeSessionId:null}):A.history;F({section:e,mounted:ie(A.mounted,e),history:n})}var B=`ashlr:verse-anchor`;function V(e,t=null){if(z(e,{history:!0}),!t||typeof window>`u`)return;let n={section:e,anchor:t};window.dispatchEvent(new CustomEvent(B,{detail:n}))}function H(e){let t=l(A.history,e);if(!t)return!1;F({history:t.history}),z(t.entry.section,{history:!1});let n=t.entry.sessionId;return t.entry.section===`chat`&&n&&n!==A.activeSessionId&&(K(`open-session`,{sessionId:n},!1),F({activeSessionId:n,recentChats:f(A.recentChats,n)})),!0}function U(e){e!==A.activeSessionId&&F({activeSessionId:e,recentChats:e?f(A.recentChats,e):A.recentChats,history:e&&A.section===`chat`?c(A.history,{section:`chat`,sessionId:e}):A.history})}function W(e,t=Date.now()){let n=d(A.activeSessionId?f(A.recentChats,A.activeSessionId):[...A.recentChats],M,e,t);return n?(M=n.cycle,J(n.sessionId),n.sessionId):null}var G=`ashlr.verse.selected.v1`;function K(e,t,n){j+=1;let r={name:e,nonce:j,...t};n&&A.section!==`chat`&&z(`chat`,{history:!0}),F({command:r})}function q(e,t={}){K(e,t,!0)}function J(e){if(/^[\w.-]{1,200}$/.test(e)){if(!A.mounted.includes(`chat`))try{localStorage.setItem(G,e)}catch{}K(`open-session`,{sessionId:e},!0),U(e)}}function ae(){F({command:null})}function oe(e){F({overlay:e})}function se(){F({overlay:null,needsYouFocus:null})}function ce(e){F({overlay:A.overlay===e?null:e,needsYouFocus:null})}function le(e={}){F({overlay:`needs-you`,needsYouSplit:e.split??A.needsYouSplit,needsYouFocus:e.focusId??null})}function ue(e){b.includes(e)&&F({needsYouSplit:e})}function de(){F({railExpanded:!A.railExpanded})}function fe(e){F({sidebarCollapsed:e})}function Y(e){/^[a-z][a-z0-9.-]{0,63}$/.test(e)&&F({recentActions:[e,...A.recentActions.filter(t=>t!==e)].slice(0,5)})}function pe(){O=!0,A.announceChatMoved&&F({announceChatMoved:!1}),P(A)}var X=`ashlr.verse.seats.v1`,me=50,Z=null;function Q(){if(Z)return Z;let e={};try{let t=localStorage.getItem(X),n=t?JSON.parse(t):null;if(n&&typeof n==`object`&&!Array.isArray(n))for(let[t,r]of Object.entries(n)){if(!r||typeof r!=`object`||Array.isArray(r))continue;let{seatId:n,model:i}=r;typeof n==`string`&&n.length!==0&&typeof i==`string`&&i.length!==0&&(e[t]={seatId:n,model:i})}}catch{}return Z=e,e}function he(e){let t=Q();if(e){let n=t[e];if(n)return n}let n=Object.keys(t),r=n[n.length-1];return r?t[r]??null:null}function ge(e,t){if(!e||!t.seatId||!t.model)return;let n=Q();delete n[e],n[e]={seatId:t.seatId,model:t.model};let r=Object.keys(n);for(let e of r.slice(0,Math.max(0,r.length-me)))delete n[e];try{localStorage.setItem(X,JSON.stringify(n))}catch{}}var $=new Map,_e=50;function ve(e,t){if(!e||!t)return;let n=$.get(e)??new Set;n.add(t),$.delete(e),$.set(e,n);for(let e of[...$.keys()].slice(0,Math.max(0,$.size-_e)))$.delete(e)}function ye(e,t){return $.get(e)?.has(t)??!1}export{m as A,V as C,ce as D,R as E,de as O,ue as S,H as T,Y as _,pe as a,v as b,W as c,ye as d,y as f,J as g,oe as h,h as i,p as k,ve as l,le as m,g as n,ae as o,he as p,B as r,se as s,b as t,re as u,ge as v,fe as w,U as x,q as y};
3
- //# sourceMappingURL=verse-ui-store-KTTKfv-T.js.map