@ashlr/hub 3.16.0 → 3.16.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 (997) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +2 -2
  3. package/dist/authority-surface.json +5 -5
  4. package/dist/build-identity.json +2 -2
  5. package/dist/core/daemon/loop.js +1 -0
  6. package/dist/core/daemon/loop.js.map +1 -1
  7. package/dist/core/daemon/tick-hooks.d.ts +2 -0
  8. package/dist/core/daemon/tick-hooks.js.map +1 -1
  9. package/dist/core/fleet/tick-hooks-live.d.ts +2 -1
  10. package/dist/core/fleet/tick-hooks-live.js +49 -7
  11. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  12. package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js +2 -0
  13. package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js.map +1 -0
  14. package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js +2 -0
  15. package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js.map +1 -0
  16. package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js +2 -0
  17. package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js.map +1 -0
  18. package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js +2 -0
  19. package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js.map +1 -0
  20. package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js +2 -0
  21. package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js.map +1 -0
  22. package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js +2 -0
  23. package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js.map +1 -0
  24. package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js +3 -0
  25. package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js.map +1 -0
  26. package/dist/core/web/public/next/assets/App-Uy6lDpKw.js +8 -0
  27. package/dist/core/web/public/next/assets/App-Uy6lDpKw.js.map +1 -0
  28. package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js +2 -0
  29. package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js.map +1 -0
  30. package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js +2 -0
  31. package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js.map +1 -0
  32. package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js +2 -0
  33. package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js.map +1 -0
  34. package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js +3 -0
  35. package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js.map +1 -0
  36. package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js +2 -0
  37. package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js.map +1 -0
  38. package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js +2 -0
  39. package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js.map +1 -0
  40. package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js +2 -0
  41. package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js.map +1 -0
  42. package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js +7 -0
  43. package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js.map +1 -0
  44. package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js +2 -0
  45. package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js.map +1 -0
  46. package/dist/core/web/public/next/assets/Button-CMR_Op-0.js +2 -0
  47. package/dist/core/web/public/next/assets/Button-CMR_Op-0.js.map +1 -0
  48. package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js +2 -0
  49. package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js.map +1 -0
  50. package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js +16 -0
  51. package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js.map +1 -0
  52. package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js +2 -0
  53. package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js.map +1 -0
  54. package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js +2 -0
  55. package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js.map +1 -0
  56. package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js +3 -0
  57. package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js.map +1 -0
  58. package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js +5 -0
  59. package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js.map +1 -0
  60. package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js +2 -0
  61. package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js.map +1 -0
  62. package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js +3 -0
  63. package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js.map +1 -0
  64. package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js +3 -0
  65. package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js.map +1 -0
  66. package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js +9 -0
  67. package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js.map +1 -0
  68. package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js +3 -0
  69. package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js.map +1 -0
  70. package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js +4 -0
  71. package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js.map +1 -0
  72. package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js +2 -0
  73. package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js.map +1 -0
  74. package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js +2 -0
  75. package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js.map +1 -0
  76. package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js +2 -0
  77. package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js.map +1 -0
  78. package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js +2 -0
  79. package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js.map +1 -0
  80. package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js +2 -0
  81. package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js.map +1 -0
  82. package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js +2 -0
  83. package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js.map +1 -0
  84. package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js +2 -0
  85. package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js.map +1 -0
  86. package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js +2 -0
  87. package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js.map +1 -0
  88. package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js +2 -0
  89. package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js.map +1 -0
  90. package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js +2 -0
  91. package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js.map +1 -0
  92. package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js +2 -0
  93. package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js.map +1 -0
  94. package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js +2 -0
  95. package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js.map +1 -0
  96. package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js +2 -0
  97. package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js.map +1 -0
  98. package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js +5 -0
  99. package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js.map +1 -0
  100. package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js +2 -0
  101. package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js.map +1 -0
  102. package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js +2 -0
  103. package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js.map +1 -0
  104. package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js +2 -0
  105. package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js.map +1 -0
  106. package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js +3 -0
  107. package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js.map +1 -0
  108. package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js +2 -0
  109. package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js.map +1 -0
  110. package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js +3 -0
  111. package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js.map +1 -0
  112. package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js +2 -0
  113. package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js.map +1 -0
  114. package/dist/core/web/public/next/assets/Input-CsSZI8QC.js +2 -0
  115. package/dist/core/web/public/next/assets/Input-CsSZI8QC.js.map +1 -0
  116. package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js +9 -0
  117. package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js.map +1 -0
  118. package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js +2 -0
  119. package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js.map +1 -0
  120. package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js +3 -0
  121. package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js.map +1 -0
  122. package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js +2 -0
  123. package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js.map +1 -0
  124. package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js +2 -0
  125. package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js.map +1 -0
  126. package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js +2 -0
  127. package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js.map +1 -0
  128. package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js +2 -0
  129. package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js.map +1 -0
  130. package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js +2 -0
  131. package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js.map +1 -0
  132. package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js +2 -0
  133. package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js.map +1 -0
  134. package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js +3 -0
  135. package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js.map +1 -0
  136. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js +72 -0
  137. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js.map +1 -0
  138. package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js +2 -0
  139. package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js.map +1 -0
  140. package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js +2 -0
  141. package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js.map +1 -0
  142. package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js +3 -0
  143. package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js.map +1 -0
  144. package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js +2 -0
  145. package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js.map +1 -0
  146. package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js +2 -0
  147. package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js.map +1 -0
  148. package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js +3 -0
  149. package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js.map +1 -0
  150. package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js +2 -0
  151. package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js.map +1 -0
  152. package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js +7 -0
  153. package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js.map +1 -0
  154. package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js +2 -0
  155. package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js.map +1 -0
  156. package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js +3 -0
  157. package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js.map +1 -0
  158. package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js +2 -0
  159. package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js.map +1 -0
  160. package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js +2 -0
  161. package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js.map +1 -0
  162. package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js +2 -0
  163. package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js.map +1 -0
  164. package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js +4 -0
  165. package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js.map +1 -0
  166. package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js +3 -0
  167. package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js.map +1 -0
  168. package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js +3 -0
  169. package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js.map +1 -0
  170. package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js +9 -0
  171. package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js.map +1 -0
  172. package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js +2 -0
  173. package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js.map +1 -0
  174. package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js +2 -0
  175. package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js.map +1 -0
  176. package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js +2 -0
  177. package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js.map +1 -0
  178. package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js +2 -0
  179. package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js.map +1 -0
  180. package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js +2 -0
  181. package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js.map +1 -0
  182. package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js +2 -0
  183. package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js.map +1 -0
  184. package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js +2 -0
  185. package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js.map +1 -0
  186. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js +7 -0
  187. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js.map +1 -0
  188. package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js +3 -0
  189. package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js.map +1 -0
  190. package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js +3 -0
  191. package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js.map +1 -0
  192. package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js +2 -0
  193. package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js.map +1 -0
  194. package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js +2 -0
  195. package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js.map +1 -0
  196. package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js +2 -0
  197. package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js.map +1 -0
  198. package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js +3 -0
  199. package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js.map +1 -0
  200. package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js +3 -0
  201. package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js.map +1 -0
  202. package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js +2 -0
  203. package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js.map +1 -0
  204. package/dist/core/web/public/next/assets/Select-DjQDkPJU.js +2 -0
  205. package/dist/core/web/public/next/assets/Select-DjQDkPJU.js.map +1 -0
  206. package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js +2 -0
  207. package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js.map +1 -0
  208. package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js +2 -0
  209. package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js.map +1 -0
  210. package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js +2 -0
  211. package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js.map +1 -0
  212. package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js +2 -0
  213. package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js.map +1 -0
  214. package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js +2 -0
  215. package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js.map +1 -0
  216. package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js +3 -0
  217. package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js.map +1 -0
  218. package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js +2 -0
  219. package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js.map +1 -0
  220. package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js +2 -0
  221. package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js.map +1 -0
  222. package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js +3 -0
  223. package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js.map +1 -0
  224. package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js +2 -0
  225. package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js.map +1 -0
  226. package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js +2 -0
  227. package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js.map +1 -0
  228. package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js +2 -0
  229. package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js.map +1 -0
  230. package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js +2 -0
  231. package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js.map +1 -0
  232. package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js +2 -0
  233. package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js.map +1 -0
  234. package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js +2 -0
  235. package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js.map +1 -0
  236. package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js +2 -0
  237. package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js.map +1 -0
  238. package/dist/core/web/public/next/assets/Surface-BEToBKC3.js +2 -0
  239. package/dist/core/web/public/next/assets/Surface-BEToBKC3.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js +2 -0
  241. package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js.map +1 -0
  242. package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js +2 -0
  243. package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js.map +1 -0
  244. package/dist/core/web/public/next/assets/Tag-Chqolzxz.js +2 -0
  245. package/dist/core/web/public/next/assets/Tag-Chqolzxz.js.map +1 -0
  246. package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js +3 -0
  247. package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js.map +1 -0
  248. package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js +26 -0
  249. package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js.map +1 -0
  250. package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js +2 -0
  251. package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js.map +1 -0
  252. package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js +2 -0
  253. package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js.map +1 -0
  254. package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js +9 -0
  255. package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js.map +1 -0
  256. package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js +3 -0
  257. package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js.map +1 -0
  258. package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js +2 -0
  259. package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js.map +1 -0
  260. package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js +3 -0
  261. package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js.map +1 -0
  262. package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js +3 -0
  263. package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js.map +1 -0
  264. package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js +2 -0
  265. package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js.map +1 -0
  266. package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js +2 -0
  267. package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js.map +1 -0
  268. package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js +2 -0
  269. package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js.map +1 -0
  270. package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js +2 -0
  271. package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js.map +1 -0
  272. package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js +6 -0
  273. package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js.map +1 -0
  274. package/dist/core/web/public/next/assets/actions-BPyW8QC-.js +2 -0
  275. package/dist/core/web/public/next/assets/actions-BPyW8QC-.js.map +1 -0
  276. package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js +2 -0
  277. package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js.map +1 -0
  278. package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js +7 -0
  279. package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js.map +1 -0
  280. package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js +2 -0
  281. package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js.map +1 -0
  282. package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js +2 -0
  283. package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js.map +1 -0
  284. package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js +2 -0
  285. package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js.map +1 -0
  286. package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js +2 -0
  287. package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js.map +1 -0
  288. package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js +2 -0
  289. package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js.map +1 -0
  290. package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js +2 -0
  291. package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js.map +1 -0
  292. package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js +2 -0
  293. package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js.map +1 -0
  294. package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js +2 -0
  295. package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js.map +1 -0
  296. package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js +2 -0
  297. package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js.map +1 -0
  298. package/dist/core/web/public/next/assets/charts-Di0_Q980.js +2 -0
  299. package/dist/core/web/public/next/assets/charts-Di0_Q980.js.map +1 -0
  300. package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js +2 -0
  301. package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js.map +1 -0
  302. package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js +2 -0
  303. package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js.map +1 -0
  304. package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js +2 -0
  305. package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js.map +1 -0
  306. package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js +2 -0
  307. package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js.map +1 -0
  308. package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js +2 -0
  309. package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js.map +1 -0
  310. package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js +2 -0
  311. package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js.map +1 -0
  312. package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js +2 -0
  313. package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js.map +1 -0
  314. package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js +2 -0
  315. package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js.map +1 -0
  316. package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js +2 -0
  317. package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js.map +1 -0
  318. package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js +3 -0
  319. package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js.map +1 -0
  320. package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js +2 -0
  321. package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js.map +1 -0
  322. package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js +2 -0
  323. package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js.map +1 -0
  324. package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js +2 -0
  325. package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js.map +1 -0
  326. package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js +2 -0
  327. package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js.map +1 -0
  328. package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js +2 -0
  329. package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js.map +1 -0
  330. package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js +2 -0
  331. package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js.map +1 -0
  332. package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js +2 -0
  333. package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js.map +1 -0
  334. package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js +2 -0
  335. package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js.map +1 -0
  336. package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js +2 -0
  337. package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js.map +1 -0
  338. package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js +2 -0
  339. package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js.map +1 -0
  340. package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js +2 -0
  341. package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js.map +1 -0
  342. package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js +3 -0
  343. package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js.map +1 -0
  344. package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js +2 -0
  345. package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js.map +1 -0
  346. package/dist/core/web/public/next/assets/format-V6IiIMAL.js +2 -0
  347. package/dist/core/web/public/next/assets/format-V6IiIMAL.js.map +1 -0
  348. package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js +5 -0
  349. package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js.map +1 -0
  350. package/dist/core/web/public/next/assets/global-CYfRwH6t.js +3 -0
  351. package/dist/core/web/public/next/assets/global-CYfRwH6t.js.map +1 -0
  352. package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js +3 -0
  353. package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js.map +1 -0
  354. package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js +2 -0
  355. package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js.map +1 -0
  356. package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js +2 -0
  357. package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js.map +1 -0
  358. package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js +2 -0
  359. package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js.map +1 -0
  360. package/dist/core/web/public/next/assets/icons-BBm_Cy62.js +2 -0
  361. package/dist/core/web/public/next/assets/icons-BBm_Cy62.js.map +1 -0
  362. package/dist/core/web/public/next/assets/index-_izD07R9.js +11 -0
  363. package/dist/core/web/public/next/assets/index-_izD07R9.js.map +1 -0
  364. package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js +2 -0
  365. package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js.map +1 -0
  366. package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js +2 -0
  367. package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js.map +1 -0
  368. package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js +2 -0
  369. package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js.map +1 -0
  370. package/dist/core/web/public/next/assets/live-model-D97AfBFz.js +2 -0
  371. package/dist/core/web/public/next/assets/live-model-D97AfBFz.js.map +1 -0
  372. package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js +2 -0
  373. package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js.map +1 -0
  374. package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js +2 -0
  375. package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js.map +1 -0
  376. package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js +2 -0
  377. package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js.map +1 -0
  378. package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js +7 -0
  379. package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js.map +1 -0
  380. package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js +2 -0
  381. package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js.map +1 -0
  382. package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js +2 -0
  383. package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js.map +1 -0
  384. package/dist/core/web/public/next/assets/nav-DC0ynjdb.js +2 -0
  385. package/dist/core/web/public/next/assets/nav-DC0ynjdb.js.map +1 -0
  386. package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js +2 -0
  387. package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js.map +1 -0
  388. package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js +2 -0
  389. package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js.map +1 -0
  390. package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js +2 -0
  391. package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js.map +1 -0
  392. package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js +2 -0
  393. package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js.map +1 -0
  394. package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js +2 -0
  395. package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js.map +1 -0
  396. package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js +2 -0
  397. package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js.map +1 -0
  398. package/dist/core/web/public/next/assets/panes-DOXM13lF.js +3 -0
  399. package/dist/core/web/public/next/assets/panes-DOXM13lF.js.map +1 -0
  400. package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js +2 -0
  401. package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js.map +1 -0
  402. package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js +2 -0
  403. package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js.map +1 -0
  404. package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js +2 -0
  405. package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js.map +1 -0
  406. package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js +2 -0
  407. package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js.map +1 -0
  408. package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js +2 -0
  409. package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js.map +1 -0
  410. package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js +2 -0
  411. package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js.map +1 -0
  412. package/dist/core/web/public/next/assets/primitives-Bynv7bPl.js +1 -0
  413. package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js +2 -0
  414. package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js.map +1 -0
  415. package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js +2 -0
  416. package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js.map +1 -0
  417. package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js +2 -0
  418. package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js.map +1 -0
  419. package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js +3 -0
  420. package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js.map +1 -0
  421. package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js +2 -0
  422. package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js.map +1 -0
  423. package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js +2 -0
  424. package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js.map +1 -0
  425. package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js +2 -0
  426. package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js.map +1 -0
  427. package/dist/core/web/public/next/assets/rolldown-runtime-hePW80VL.js +1 -0
  428. package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js +2 -0
  429. package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js.map +1 -0
  430. package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js +2 -0
  431. package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js.map +1 -0
  432. package/dist/core/web/public/next/assets/sheet-BxZSmdad.js +2 -0
  433. package/dist/core/web/public/next/assets/sheet-BxZSmdad.js.map +1 -0
  434. package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js +2 -0
  435. package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js.map +1 -0
  436. package/dist/core/web/public/next/assets/slots-BJc3RJkV.js +3 -0
  437. package/dist/core/web/public/next/assets/slots-BJc3RJkV.js.map +1 -0
  438. package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js +4 -0
  439. package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js.map +1 -0
  440. package/dist/core/web/public/next/assets/sse-It4xa040.js +2 -0
  441. package/dist/core/web/public/next/assets/sse-It4xa040.js.map +1 -0
  442. package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js +2 -0
  443. package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js.map +1 -0
  444. package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js +2 -0
  445. package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js.map +1 -0
  446. package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js +2 -0
  447. package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js.map +1 -0
  448. package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js +2 -0
  449. package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js.map +1 -0
  450. package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js +2 -0
  451. package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js.map +1 -0
  452. package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js +6 -0
  453. package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js.map +1 -0
  454. package/dist/core/web/public/next/assets/thread-data-C8z55msn.js +2 -0
  455. package/dist/core/web/public/next/assets/thread-data-C8z55msn.js.map +1 -0
  456. package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js +2 -0
  457. package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js.map +1 -0
  458. package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js +2 -0
  459. package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js.map +1 -0
  460. package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js +2 -0
  461. package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js.map +1 -0
  462. package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js +2 -0
  463. package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js.map +1 -0
  464. package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js +2 -0
  465. package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js.map +1 -0
  466. package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js +2 -0
  467. package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js.map +1 -0
  468. package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js +2 -0
  469. package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js.map +1 -0
  470. package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js +2 -0
  471. package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js.map +1 -0
  472. package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js +2 -0
  473. package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js.map +1 -0
  474. package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js +2 -0
  475. package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js.map +1 -0
  476. package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js +2 -0
  477. package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js.map +1 -0
  478. package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js +2 -0
  479. package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js.map +1 -0
  480. package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js +2 -0
  481. package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js.map +1 -0
  482. package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js +2 -0
  483. package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js.map +1 -0
  484. package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js +2 -0
  485. package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js.map +1 -0
  486. package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js +3 -0
  487. package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js.map +1 -0
  488. package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js +2 -0
  489. package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js.map +1 -0
  490. package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js +2 -0
  491. package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js.map +1 -0
  492. package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js +2 -0
  493. package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js.map +1 -0
  494. package/dist/core/web/public/next/index.html +2 -1
  495. package/dist/core/web/remote-gateway-policy.js +5 -0
  496. package/dist/core/web/remote-gateway-policy.js.map +1 -1
  497. package/dist/core/web/static.d.ts +4 -3
  498. package/dist/core/web/static.js +8 -5
  499. package/dist/core/web/static.js.map +1 -1
  500. package/dist/release-dependency-inventory.json +1 -1
  501. package/node_modules/fast-uri/index.js +20 -5
  502. package/node_modules/fast-uri/lib/utils.js +8 -1
  503. package/node_modules/fast-uri/package.json +1 -1
  504. package/node_modules/fast-uri/test/component-safe-serialization.test.js +58 -0
  505. package/node_modules/fast-uri/test/ipv6-validation.test.js +34 -0
  506. package/node_modules/ip-address/README.md +134 -134
  507. package/node_modules/ip-address/dist/address-error.d.ts +11 -0
  508. package/node_modules/ip-address/dist/address-error.js.map +1 -1
  509. package/node_modules/ip-address/dist/ipv4.d.ts +22 -6
  510. package/node_modules/ip-address/dist/ipv4.js +22 -6
  511. package/node_modules/ip-address/dist/ipv4.js.map +1 -1
  512. package/node_modules/ip-address/dist/ipv6.d.ts +26 -8
  513. package/node_modules/ip-address/dist/ipv6.js +46 -29
  514. package/node_modules/ip-address/dist/ipv6.js.map +1 -1
  515. package/node_modules/ip-address/dist/v6/constants.js +1 -0
  516. package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  517. package/node_modules/ip-address/package.json +1 -1
  518. package/package.json +5 -4
  519. package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js +0 -2
  520. package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js.map +0 -1
  521. package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js +0 -2
  522. package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js.map +0 -1
  523. package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js +0 -2
  524. package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js.map +0 -1
  525. package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js +0 -2
  526. package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js.map +0 -1
  527. package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js +0 -2
  528. package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js.map +0 -1
  529. package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js +0 -2
  530. package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js.map +0 -1
  531. package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js +0 -3
  532. package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js.map +0 -1
  533. package/dist/core/web/public/next/assets/App-DebYuj1v.js +0 -8
  534. package/dist/core/web/public/next/assets/App-DebYuj1v.js.map +0 -1
  535. package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js +0 -2
  536. package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js.map +0 -1
  537. package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js +0 -2
  538. package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js.map +0 -1
  539. package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js +0 -2
  540. package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js.map +0 -1
  541. package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js +0 -3
  542. package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js.map +0 -1
  543. package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js +0 -2
  544. package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js.map +0 -1
  545. package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js +0 -2
  546. package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js.map +0 -1
  547. package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js +0 -2
  548. package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js.map +0 -1
  549. package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js +0 -7
  550. package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js.map +0 -1
  551. package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js +0 -2
  552. package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js.map +0 -1
  553. package/dist/core/web/public/next/assets/Button-DP2ImS5n.js +0 -2
  554. package/dist/core/web/public/next/assets/Button-DP2ImS5n.js.map +0 -1
  555. package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js +0 -2
  556. package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js.map +0 -1
  557. package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js +0 -16
  558. package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js.map +0 -1
  559. package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js +0 -2
  560. package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js.map +0 -1
  561. package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js +0 -2
  562. package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js.map +0 -1
  563. package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js +0 -3
  564. package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js.map +0 -1
  565. package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js +0 -5
  566. package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js.map +0 -1
  567. package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js +0 -2
  568. package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js.map +0 -1
  569. package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js +0 -3
  570. package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js.map +0 -1
  571. package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js +0 -3
  572. package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js.map +0 -1
  573. package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js +0 -9
  574. package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js.map +0 -1
  575. package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js +0 -3
  576. package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js.map +0 -1
  577. package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js +0 -4
  578. package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js.map +0 -1
  579. package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js +0 -2
  580. package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js.map +0 -1
  581. package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js +0 -2
  582. package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js.map +0 -1
  583. package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js +0 -2
  584. package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js.map +0 -1
  585. package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js +0 -2
  586. package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js.map +0 -1
  587. package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js +0 -2
  588. package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js.map +0 -1
  589. package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js +0 -2
  590. package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js.map +0 -1
  591. package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js +0 -2
  592. package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js.map +0 -1
  593. package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js +0 -2
  594. package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js.map +0 -1
  595. package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js +0 -2
  596. package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js.map +0 -1
  597. package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js +0 -2
  598. package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js.map +0 -1
  599. package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js +0 -2
  600. package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js.map +0 -1
  601. package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js +0 -2
  602. package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js.map +0 -1
  603. package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js +0 -2
  604. package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js.map +0 -1
  605. package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js +0 -5
  606. package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js.map +0 -1
  607. package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js +0 -2
  608. package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js.map +0 -1
  609. package/dist/core/web/public/next/assets/GearTray-Cc14h572.js +0 -2
  610. package/dist/core/web/public/next/assets/GearTray-Cc14h572.js.map +0 -1
  611. package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js +0 -2
  612. package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js.map +0 -1
  613. package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js +0 -3
  614. package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js.map +0 -1
  615. package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js +0 -2
  616. package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js.map +0 -1
  617. package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js +0 -3
  618. package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js.map +0 -1
  619. package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js +0 -2
  620. package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js.map +0 -1
  621. package/dist/core/web/public/next/assets/Input-BEF-ScuG.js +0 -2
  622. package/dist/core/web/public/next/assets/Input-BEF-ScuG.js.map +0 -1
  623. package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js +0 -9
  624. package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js.map +0 -1
  625. package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js +0 -2
  626. package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js.map +0 -1
  627. package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js +0 -3
  628. package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js.map +0 -1
  629. package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js +0 -2
  630. package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js.map +0 -1
  631. package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js +0 -2
  632. package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js.map +0 -1
  633. package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js +0 -2
  634. package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js.map +0 -1
  635. package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js +0 -2
  636. package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js.map +0 -1
  637. package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js +0 -2
  638. package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js.map +0 -1
  639. package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js +0 -2
  640. package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js.map +0 -1
  641. package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js +0 -3
  642. package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js.map +0 -1
  643. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js +0 -72
  644. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js.map +0 -1
  645. package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js +0 -2
  646. package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js.map +0 -1
  647. package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js +0 -2
  648. package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js.map +0 -1
  649. package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js +0 -3
  650. package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js.map +0 -1
  651. package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js +0 -2
  652. package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js.map +0 -1
  653. package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js +0 -2
  654. package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js.map +0 -1
  655. package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js +0 -3
  656. package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js +0 -2
  658. package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js.map +0 -1
  659. package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js +0 -7
  660. package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js.map +0 -1
  661. package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js +0 -2
  662. package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js.map +0 -1
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js +0 -3
  664. package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js.map +0 -1
  665. package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js +0 -2
  666. package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js.map +0 -1
  667. package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js +0 -2
  668. package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js.map +0 -1
  669. package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js +0 -2
  670. package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js.map +0 -1
  671. package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js +0 -4
  672. package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js.map +0 -1
  673. package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js +0 -3
  674. package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js.map +0 -1
  675. package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js +0 -3
  676. package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js.map +0 -1
  677. package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js +0 -9
  678. package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js.map +0 -1
  679. package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js +0 -2
  680. package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js.map +0 -1
  681. package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js +0 -2
  682. package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js.map +0 -1
  683. package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js +0 -2
  684. package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js.map +0 -1
  685. package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js +0 -2
  686. package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js.map +0 -1
  687. package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js +0 -2
  688. package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js.map +0 -1
  689. package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js +0 -2
  690. package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js.map +0 -1
  691. package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js +0 -2
  692. package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js.map +0 -1
  693. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js +0 -7
  694. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js.map +0 -1
  695. package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js +0 -3
  696. package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js.map +0 -1
  697. package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js +0 -3
  698. package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js.map +0 -1
  699. package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js +0 -2
  700. package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js.map +0 -1
  701. package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js +0 -2
  702. package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js.map +0 -1
  703. package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js +0 -2
  704. package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js.map +0 -1
  705. package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js +0 -3
  706. package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js.map +0 -1
  707. package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js +0 -3
  708. package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js.map +0 -1
  709. package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js +0 -2
  710. package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js.map +0 -1
  711. package/dist/core/web/public/next/assets/Select-zXMdgblm.js +0 -2
  712. package/dist/core/web/public/next/assets/Select-zXMdgblm.js.map +0 -1
  713. package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js +0 -2
  714. package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js.map +0 -1
  715. package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js +0 -2
  716. package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js.map +0 -1
  717. package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js +0 -2
  718. package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js.map +0 -1
  719. package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js +0 -2
  720. package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js.map +0 -1
  721. package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js +0 -2
  722. package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js.map +0 -1
  723. package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js +0 -3
  724. package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js.map +0 -1
  725. package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js +0 -2
  726. package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js.map +0 -1
  727. package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js +0 -2
  728. package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js.map +0 -1
  729. package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js +0 -3
  730. package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js.map +0 -1
  731. package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js +0 -2
  732. package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js.map +0 -1
  733. package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js +0 -2
  734. package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js.map +0 -1
  735. package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js +0 -2
  736. package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js.map +0 -1
  737. package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js +0 -2
  738. package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js.map +0 -1
  739. package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js +0 -2
  740. package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js.map +0 -1
  741. package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js +0 -2
  742. package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js.map +0 -1
  743. package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js +0 -2
  744. package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js.map +0 -1
  745. package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js +0 -2
  746. package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js.map +0 -1
  747. package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js +0 -2
  748. package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js.map +0 -1
  749. package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js +0 -2
  750. package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js.map +0 -1
  751. package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js +0 -2
  752. package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js.map +0 -1
  753. package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js +0 -26
  754. package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js.map +0 -1
  755. package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js +0 -3
  756. package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js.map +0 -1
  757. package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js +0 -2
  758. package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js.map +0 -1
  759. package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js +0 -2
  760. package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js.map +0 -1
  761. package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js +0 -9
  762. package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js.map +0 -1
  763. package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js +0 -3
  764. package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js.map +0 -1
  765. package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js +0 -2
  766. package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js.map +0 -1
  767. package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js +0 -3
  768. package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js.map +0 -1
  769. package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js +0 -3
  770. package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js.map +0 -1
  771. package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js +0 -2
  772. package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js.map +0 -1
  773. package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js +0 -2
  774. package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js.map +0 -1
  775. package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js +0 -2
  776. package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js.map +0 -1
  777. package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js +0 -2
  778. package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js.map +0 -1
  779. package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js +0 -6
  780. package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js.map +0 -1
  781. package/dist/core/web/public/next/assets/actions-CyO4R-IO.js +0 -2
  782. package/dist/core/web/public/next/assets/actions-CyO4R-IO.js.map +0 -1
  783. package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js +0 -2
  784. package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js.map +0 -1
  785. package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js +0 -7
  786. package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js.map +0 -1
  787. package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js +0 -2
  788. package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js.map +0 -1
  789. package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js +0 -2
  790. package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js.map +0 -1
  791. package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js +0 -2
  792. package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js.map +0 -1
  793. package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js +0 -2
  794. package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js.map +0 -1
  795. package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js +0 -2
  796. package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js.map +0 -1
  797. package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js +0 -2
  798. package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js.map +0 -1
  799. package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js +0 -2
  800. package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js.map +0 -1
  801. package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js +0 -2
  802. package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js.map +0 -1
  803. package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js +0 -2
  804. package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js.map +0 -1
  805. package/dist/core/web/public/next/assets/charts-D3I0q4hG.js +0 -2
  806. package/dist/core/web/public/next/assets/charts-D3I0q4hG.js.map +0 -1
  807. package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js +0 -2
  808. package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js.map +0 -1
  809. package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js +0 -2
  810. package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js.map +0 -1
  811. package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js +0 -2
  812. package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js.map +0 -1
  813. package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js +0 -2
  814. package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js.map +0 -1
  815. package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js +0 -2
  816. package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js.map +0 -1
  817. package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js +0 -2
  818. package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js.map +0 -1
  819. package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js +0 -2
  820. package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js.map +0 -1
  821. package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js +0 -2
  822. package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js.map +0 -1
  823. package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js +0 -2
  824. package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js.map +0 -1
  825. package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js +0 -3
  826. package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js.map +0 -1
  827. package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js +0 -2
  828. package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js.map +0 -1
  829. package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js +0 -2
  830. package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js.map +0 -1
  831. package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js +0 -2
  832. package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js.map +0 -1
  833. package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js +0 -2
  834. package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js.map +0 -1
  835. package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js +0 -2
  836. package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js.map +0 -1
  837. package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js +0 -2
  838. package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js.map +0 -1
  839. package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js +0 -2
  840. package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js.map +0 -1
  841. package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js +0 -2
  842. package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js.map +0 -1
  843. package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js +0 -2
  844. package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js.map +0 -1
  845. package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js +0 -2
  846. package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js.map +0 -1
  847. package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js +0 -2
  848. package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js.map +0 -1
  849. package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js +0 -3
  850. package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js.map +0 -1
  851. package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js +0 -2
  852. package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js.map +0 -1
  853. package/dist/core/web/public/next/assets/format-CcEKjUou.js +0 -2
  854. package/dist/core/web/public/next/assets/format-CcEKjUou.js.map +0 -1
  855. package/dist/core/web/public/next/assets/git-model-DL3MwN93.js +0 -5
  856. package/dist/core/web/public/next/assets/git-model-DL3MwN93.js.map +0 -1
  857. package/dist/core/web/public/next/assets/global-BWc2NPzv.js +0 -3
  858. package/dist/core/web/public/next/assets/global-BWc2NPzv.js.map +0 -1
  859. package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js +0 -3
  860. package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js.map +0 -1
  861. package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js +0 -2
  862. package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js.map +0 -1
  863. package/dist/core/web/public/next/assets/headroom-CP99UxyV.js +0 -2
  864. package/dist/core/web/public/next/assets/headroom-CP99UxyV.js.map +0 -1
  865. package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js +0 -2
  866. package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js.map +0 -1
  867. package/dist/core/web/public/next/assets/icons-U34oiN9M.js +0 -2
  868. package/dist/core/web/public/next/assets/icons-U34oiN9M.js.map +0 -1
  869. package/dist/core/web/public/next/assets/index-BbDqdepe.js +0 -11
  870. package/dist/core/web/public/next/assets/index-BbDqdepe.js.map +0 -1
  871. package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js +0 -2
  872. package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js.map +0 -1
  873. package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js +0 -2
  874. package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js.map +0 -1
  875. package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js +0 -2
  876. package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js.map +0 -1
  877. package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js +0 -2
  878. package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js.map +0 -1
  879. package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js +0 -2
  880. package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js.map +0 -1
  881. package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js +0 -2
  882. package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js.map +0 -1
  883. package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js +0 -2
  884. package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js.map +0 -1
  885. package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js +0 -7
  886. package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js.map +0 -1
  887. package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js +0 -2
  888. package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js.map +0 -1
  889. package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js +0 -2
  890. package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js.map +0 -1
  891. package/dist/core/web/public/next/assets/nav-CM-mJcSq.js +0 -2
  892. package/dist/core/web/public/next/assets/nav-CM-mJcSq.js.map +0 -1
  893. package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js +0 -2
  894. package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js.map +0 -1
  895. package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js +0 -2
  896. package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js.map +0 -1
  897. package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js +0 -2
  898. package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js.map +0 -1
  899. package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js +0 -2
  900. package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js.map +0 -1
  901. package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js +0 -2
  902. package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js.map +0 -1
  903. package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js +0 -2
  904. package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js.map +0 -1
  905. package/dist/core/web/public/next/assets/panes-BjUzIDw6.js +0 -3
  906. package/dist/core/web/public/next/assets/panes-BjUzIDw6.js.map +0 -1
  907. package/dist/core/web/public/next/assets/path-display-HyxETV-f.js +0 -2
  908. package/dist/core/web/public/next/assets/path-display-HyxETV-f.js.map +0 -1
  909. package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js +0 -2
  910. package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js.map +0 -1
  911. package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js +0 -2
  912. package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js.map +0 -1
  913. package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js +0 -2
  914. package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js.map +0 -1
  915. package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js +0 -2
  916. package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js.map +0 -1
  917. package/dist/core/web/public/next/assets/primitives-BEXDE-HP.js +0 -1
  918. package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js +0 -2
  919. package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js.map +0 -1
  920. package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js +0 -2
  921. package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js.map +0 -1
  922. package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js +0 -2
  923. package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js.map +0 -1
  924. package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js +0 -3
  925. package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js.map +0 -1
  926. package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js +0 -2
  927. package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js.map +0 -1
  928. package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js +0 -2
  929. package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js.map +0 -1
  930. package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js +0 -2
  931. package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js.map +0 -1
  932. package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js +0 -2
  933. package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js.map +0 -1
  934. package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js +0 -2
  935. package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js.map +0 -1
  936. package/dist/core/web/public/next/assets/sheet-D0ciShoy.js +0 -2
  937. package/dist/core/web/public/next/assets/sheet-D0ciShoy.js.map +0 -1
  938. package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js +0 -2
  939. package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js.map +0 -1
  940. package/dist/core/web/public/next/assets/slots-m3L6Ints.js +0 -3
  941. package/dist/core/web/public/next/assets/slots-m3L6Ints.js.map +0 -1
  942. package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js +0 -4
  943. package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js.map +0 -1
  944. package/dist/core/web/public/next/assets/sse-CK65-Cun.js +0 -2
  945. package/dist/core/web/public/next/assets/sse-CK65-Cun.js.map +0 -1
  946. package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js +0 -2
  947. package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js.map +0 -1
  948. package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js +0 -2
  949. package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js.map +0 -1
  950. package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js +0 -2
  951. package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js.map +0 -1
  952. package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js +0 -2
  953. package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js.map +0 -1
  954. package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js +0 -2
  955. package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js.map +0 -1
  956. package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js +0 -6
  957. package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js.map +0 -1
  958. package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js +0 -2
  959. package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js.map +0 -1
  960. package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js +0 -2
  961. package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js.map +0 -1
  962. package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js +0 -2
  963. package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js.map +0 -1
  964. package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js +0 -2
  965. package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js.map +0 -1
  966. package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js +0 -2
  967. package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js.map +0 -1
  968. package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js +0 -2
  969. package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js.map +0 -1
  970. package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js +0 -2
  971. package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js.map +0 -1
  972. package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js +0 -2
  973. package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js.map +0 -1
  974. package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js +0 -2
  975. package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js.map +0 -1
  976. package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js +0 -2
  977. package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js.map +0 -1
  978. package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js +0 -2
  979. package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js.map +0 -1
  980. package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js +0 -2
  981. package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js.map +0 -1
  982. package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js +0 -2
  983. package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js.map +0 -1
  984. package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js +0 -2
  985. package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js.map +0 -1
  986. package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js +0 -2
  987. package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js.map +0 -1
  988. package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js +0 -2
  989. package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js.map +0 -1
  990. package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js +0 -3
  991. package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js.map +0 -1
  992. package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js +0 -2
  993. package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js.map +0 -1
  994. package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js +0 -2
  995. package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js.map +0 -1
  996. package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js +0 -2
  997. package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"resources-queries-CKyXyaDY.js","names":[],"sources":["../../../../../../src/core/routing/readiness-types.ts","../../../../../../src/web-ui/routes/verse/resources/resources-model.ts","../../../../../../src/web-ui/routes/verse/resources/resources-queries.ts"],"sourcesContent":["/**\n * Per-resource readiness — the wire contract for `GET /api/verse/budget/readiness`\n * (3.14, \"every account ready for chat and the fleet\").\n *\n * One row per resource Mason can spend — each paid account, the local\n * runtimes as ONE resource, and the Claude cloud lane — answering the two\n * questions the Resources drawer (⌘.) exists for:\n *\n * Chat can a NEW chat run on it right now (the session engine's own\n * admission gate, core/verse/seat-readiness.ts)?\n * Fleet would the AUTONOMOUS fleet use it right now — under the installed\n * standing grant, its current rollout stage, the budget mode, the\n * Leader's directives and the capacity snapshot the daemon routes on\n * (~/.ashlr/routing/capacity.json)?\n *\n * Every \"not ready\" carries one plain sentence and, when one exists, the ONE\n * fix: a Verse action (reconnect / check again) or a literal command to run.\n * A command is never a secret and never names a private path beyond `~`.\n *\n * BROWSER-SAFE: type-only imports and constants. The web bundle imports it.\n */\n\nexport const VERSE_RESOURCE_READINESS_PATH = '/api/verse/budget/readiness';\n\nexport type ReadinessFixKind = 'reconnect' | 'check-again' | 'command';\n\nexport interface ReadinessFix {\n kind: ReadinessFixKind;\n /** Button / chip label: \"Reconnect\", \"Check again\", \"Set up the Claude seat\". */\n label: string;\n /** `command` only: the exact line to run in a terminal. */\n command?: string;\n /** `reconnect` / `check-again` only: the seat the action targets. */\n seatId?: string;\n}\n\n/** `ok` ready · `warn` usable with a caveat · `off` intentionally not used · `blocked` needs a fix. */\nexport type ReadinessTone = 'ok' | 'warn' | 'off' | 'blocked';\n\nexport interface ReadinessVerdict {\n ready: boolean;\n tone: ReadinessTone;\n /** Two or three words: \"Ready\", \"Signed out\", \"Not in this stage\". */\n word: string;\n /** One plain sentence (may be empty when `word` says it all). */\n detail: string;\n fix: ReadinessFix | null;\n}\n\nexport interface FleetReadinessVerdict extends ReadinessVerdict {\n /** The grant's roles for this seat (\"producer\", \"judge\", \"leader\"); empty when not granted. */\n roles: string[];\n /** Percent of the binding window kept for Mason; null when not applicable (local, cloud, not granted). */\n reservePercent: number | null;\n}\n\nexport interface ResourceReading {\n /** `live` = a current reading · `last` = only an expired one (see `at`) · `none` = never read here. */\n state: 'live' | 'last' | 'none';\n /** ISO instant of the reading (current or last); null when none. */\n at: string | null;\n /** Plain sentence on WHY there is no live reading; null when live. */\n note: string | null;\n}\n\nexport interface ResourceReadinessRow {\n /** Account id (codex-personal, claude, …), `local`, or `cloud`. */\n id: string;\n label: string;\n /** 3.15: `devin` for the Devin card (built from core/devin's own verdicts). */\n engine: 'claude' | 'codex' | 'grok' | 'local' | 'devin';\n kind: 'subscription' | 'local' | 'cloud';\n reading: ResourceReading;\n chat: ReadinessVerdict;\n fleet: FleetReadinessVerdict;\n}\n\nexport interface ResourceReadinessResponse {\n v: 1;\n checkedAt: string;\n /** Standing autonomy as the fleet sees it. */\n autonomy: {\n active: boolean;\n /** Current rollout stage id (\"shadow\"), when a grant is active. */\n stage: string | null;\n /** \"Stage 1 of 8 · shadow\" or why autonomy is off. */\n detail: string;\n };\n /** When the fleet's capacity snapshot was published; null when there is none. */\n capacitySnapshotAt: string | null;\n resources: ResourceReadinessRow[];\n}\n","/**\n * routes/verse/resources/resources-model.ts — what the Resources drawer says,\n * projected from reads other units already own (unit 3.11 C6). Pure: no\n * React, no I/O.\n *\n * Nothing about a seat is worded here. Every account line comes from C6's\n * capacity projection (usage/capacity-strip-model.ts: `accountStatus`,\n * `orderAccountRows`), so the drawer, Apps & Accounts and the rail ring can\n * never describe one seat two ways. What IS new here:\n *\n * - the edge handle's one-dot summary across the paid accounts;\n * - the cloud lane's overview (GET /api/verse/cloud), narrowed field by\n * field — the route is landing in parallel, so a missing or drifted body\n * reads as \"not available yet\", never as a crash or a zero;\n * - short sentences for the serving runtime and each local model's context.\n */\nimport { CLOUD_BALANCE_URL, type CloudOverviewResponse } from '../../../../core/cloud/types.js';\nimport { costBasisOf, seatTier, tierRank, type CostBasis, type ResourceTier } from '../../../../core/routing/tiers.js';\nimport type { ServingRuntimeSnapshot, VerseSeat } from '../../../data/api-types.js';\nimport { accountStatus, accountStatusRank, type AccountStatusKind, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { modelNameInText, type LocalModelRow } from '../usage/local-model.js';\nimport { formatContextWindow } from '../verse-model.js';\n\n// ---------------------------------------------------------------------------\n// The handle's dot\n// ---------------------------------------------------------------------------\n\n/**\n * ok every account read is usable, none tight\n * tight something is running low (or usable only on credits)\n * alert something is spent, signed out or unavailable\n * unknown nothing has been read yet — no dot at all (never \"all good\")\n */\nexport type ResourcesTone = 'ok' | 'tight' | 'alert' | 'unknown';\n\nexport interface ResourcesSummary {\n tone: ResourcesTone;\n /** Appended to the handle's accessible name and tooltip: \"2 usable · 1 spent\". */\n spoken: string;\n}\n\nconst ALERT_KINDS: ReadonlySet<AccountStatusKind> = new Set(['spent', 'signed-out', 'unavailable']);\n\nconst COUNT_WORDS: ReadonlyArray<[AccountStatusKind, string]> = [\n ['usable', 'usable'],\n ['low', 'running low'],\n ['spent', 'spent'],\n ['signed-out', 'signed out'],\n ['unavailable', 'unavailable'],\n];\n\n/** The paid accounts, reduced to one tone and one sentence. Local seats have no quota to run out of. */\nexport function summarizeResources(rows: readonly CapacityRow[], opts: { healthRead: boolean; now?: number }): ResourcesSummary {\n const kinds = rows\n .filter((r) => r.kind === 'subscription')\n .map((r) => accountStatus(r, { healthRead: opts.healthRead, ...(opts.now !== undefined ? { now: opts.now } : {}) }).kind);\n const counts = new Map<AccountStatusKind, number>();\n for (const k of kinds) counts.set(k, (counts.get(k) ?? 0) + 1);\n const spoken = COUNT_WORDS.filter(([k]) => counts.has(k))\n .map(([k, word]) => `${counts.get(k)} ${word}`)\n .join(' · ');\n let tone: ResourcesTone = 'unknown';\n if (kinds.some((k) => ALERT_KINDS.has(k))) tone = 'alert';\n else if (kinds.includes('low')) tone = 'tight';\n else if (kinds.includes('usable')) tone = 'ok';\n return { tone, spoken: spoken || (kinds.length === 0 ? 'no accounts connected' : 'not read yet') };\n}\n\nexport const TONE_WORD: Readonly<Record<ResourcesTone, string>> = {\n ok: 'all usable',\n tight: 'running low',\n alert: 'needs attention',\n unknown: 'not read yet',\n};\n\n// ---------------------------------------------------------------------------\n// Cloud credits\n// ---------------------------------------------------------------------------\n\nexport interface CloudCreditsView {\n totalUsd: number;\n spentUsd: number;\n remainingUsd: number;\n /** 0–100, remaining of total. */\n remainingPercent: number;\n running: number;\n sessionsToday: number;\n maxSessionsPerDay: number | null;\n seatReady: boolean;\n seatReason: string | null;\n canLaunch: boolean;\n canLaunchReason: string | null;\n estimateNote: string;\n /** Always https://claude.ai/… — anything else falls back to the frozen constant. */\n balanceUrl: string;\n}\n\nfunction rec(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as Record<string, unknown>) : null;\n}\n\nfunction num(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nfunction text(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;\n}\n\nconst DEFAULT_ESTIMATE_NOTE = 'An estimate from the sessions Verse launched — the real balance is on claude.ai.';\n\n/** Narrow a GET /api/verse/cloud body; null when it is not one. */\nexport function projectCloudCredits(raw: unknown): CloudCreditsView | null {\n const root = rec(raw) as Partial<Record<keyof CloudOverviewResponse, unknown>> | null;\n const budget = rec(root?.budget);\n if (!root || !budget) return null;\n const total = num(budget['creditsTotalUsd']);\n const spent = num(budget['estimatedSpentUsd']);\n const remainingRaw = num(budget['estimatedRemainingUsd']);\n if (total === null || (spent === null && remainingRaw === null)) return null;\n const remaining = Math.max(0, remainingRaw ?? total - (spent ?? 0));\n const seat = rec(root.seat);\n const gate = rec(budget['canLaunch']);\n const url = text(budget['balanceUrl']);\n const policy = rec(budget['budget']);\n return {\n totalUsd: total,\n spentUsd: spent ?? Math.max(0, total - remaining),\n remainingUsd: remaining,\n remainingPercent: total > 0 ? Math.max(0, Math.min(100, (remaining / total) * 100)) : 0,\n running: Math.max(0, num(budget['running']) ?? 0),\n sessionsToday: Math.max(0, num(budget['sessionsToday']) ?? 0),\n maxSessionsPerDay: num(policy?.['maxSessionsPerDay']),\n seatReady: seat?.['ready'] !== false,\n seatReason: text(seat?.['reason']),\n canLaunch: gate?.['ok'] !== false,\n canLaunchReason: text(gate?.['reason']),\n estimateNote: text(budget['estimateNote']) ?? DEFAULT_ESTIMATE_NOTE,\n balanceUrl: url !== null && url.startsWith('https://claude.ai/') ? url : CLOUD_BALANCE_URL,\n };\n}\n\n/** \"$212\" / \"$3.50\" — whole dollars once the cents stop mattering. */\nexport function formatUsd(value: number): string {\n const v = Math.max(0, value);\n return v >= 100 || Number.isInteger(v) ? `$${Math.round(v)}` : `$${v.toFixed(2)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Local\n// ---------------------------------------------------------------------------\n\nconst RUNTIME_NAME: Readonly<Record<ServingRuntimeSnapshot['kind'], string>> = {\n 'llama-server': 'llama-server',\n ollama: 'Ollama',\n vllm: 'vLLM',\n unknown: 'Serving runtime',\n};\n\nconst STATE_WORD: Readonly<Record<ServingRuntimeSnapshot['state'], string>> = {\n running: 'Running',\n starting: 'Starting…',\n stopping: 'Stopping…',\n stopped: 'Stopped',\n unknown: 'State not reported',\n};\n\nexport interface RuntimeView {\n name: string;\n state: ServingRuntimeSnapshot['state'];\n word: string;\n tone: 'success' | 'warning' | 'neutral';\n /** \"Qwen3-32B · 16k context per agent · 1 of 4 slots busy\" — only the parts that were reported. */\n detail: string | null;\n canStart: boolean;\n canStop: boolean;\n /** Set when Verse cannot start or stop it (launchd, the operator's own terminal). */\n managedElsewhere: boolean;\n}\n\nexport function runtimeView(runtime: ServingRuntimeSnapshot | null): RuntimeView | null {\n if (!runtime) return null;\n const parts: string[] = [];\n if (runtime.model) parts.push(modelNameInText(runtime.model));\n // Per-slot context, the number one agent actually gets (fleet-types.ts).\n if (runtime.contextTokens !== null) parts.push(`${formatContextWindow(runtime.contextTokens)} context per agent`);\n if (runtime.slotsTotal !== null && runtime.slotsTotal > 0) {\n parts.push(runtime.slotsBusy !== null ? `${runtime.slotsBusy} of ${runtime.slotsTotal} slots busy` : `${runtime.slotsTotal} slots`);\n }\n const state = runtime.state;\n return {\n name: RUNTIME_NAME[runtime.kind] ?? RUNTIME_NAME.unknown,\n state,\n word: STATE_WORD[state] ?? STATE_WORD.unknown,\n tone: state === 'running' ? 'success' : state === 'starting' || state === 'stopping' ? 'warning' : 'neutral',\n detail: parts.length > 0 ? parts.join(' · ') : null,\n canStart: runtime.supervised && state === 'stopped',\n canStop: runtime.supervised && state === 'running',\n managedElsewhere: !runtime.supervised,\n };\n}\n\n/**\n * The context a local model runs with. The configured window is the one a\n * turn actually gets; when it is below the model's native window both are\n * said, so \"256k model\" is never read as \"256k here\".\n */\nexport function modelContextText(row: Pick<LocalModelRow, 'nativeContext' | 'configuredContext' | 'contextTruncated'>): string | null {\n const configured = row.configuredContext;\n const native = row.nativeContext;\n if (configured !== null && row.contextTruncated && native !== null) return `${formatContextWindow(configured)} of ${formatContextWindow(native)} context`;\n if (configured !== null) return `${formatContextWindow(configured)} context`;\n if (native !== null) return `${formatContextWindow(native)} context`;\n return null;\n}\n\n/** How many models the drawer lists before pointing at Usage for the rest. */\nexport const LOCAL_MODELS_SHOWN = 6;\n\n// ---------------------------------------------------------------------------\n// Local runtimes (3.14): Ollama, LM Studio and llama-server as ONE resource\n// ---------------------------------------------------------------------------\n\nexport interface LocalRuntimeLine {\n id: 'ollama' | 'lmstudio' | 'llama-server';\n name: string;\n /** Status-line tone: answering with something loaded = success. */\n tone: 'success' | 'warning' | 'danger' | 'neutral';\n /** \"Answering\", \"Not answering\", \"Loading…\". */\n word: string;\n /** \"4 installed · 1 loaded\" / \"listening on :8080 but not answering — restart it\". */\n detail: string;\n}\n\nfunction portOf(baseUrl: unknown): string {\n if (typeof baseUrl !== 'string') return '';\n try {\n const url = new URL(baseUrl);\n return url.port ? `:${url.port}` : url.host;\n } catch {\n return '';\n }\n}\n\nfunction modelCounts(report: Record<string, unknown>): { installed: number; loaded: number } {\n const models = Array.isArray(report['models']) ? report['models'] : [];\n let loaded = 0;\n // `state: 'loaded'` is the current wire; `loaded: true` the pre-3.10 one.\n for (const m of models) {\n const row = rec(m);\n if (row?.['state'] === 'loaded' || row?.['loaded'] === true) loaded += 1;\n }\n return { installed: models.length, loaded };\n}\n\nfunction catalogLine(id: 'ollama' | 'lmstudio', name: string, raw: unknown): LocalRuntimeLine | null {\n const report = rec(raw);\n if (!report) return null;\n const port = portOf(report['baseUrl']);\n if (report['reachable'] !== true) {\n return { id, name, tone: 'neutral', word: 'Not running', detail: port ? `nothing answering on ${port}` : 'nothing answering' };\n }\n const { installed, loaded } = modelCounts(report);\n const stale = report['stale'] === true ? ' · last known' : '';\n return {\n id,\n name,\n tone: loaded > 0 ? 'success' : 'neutral',\n word: 'Answering',\n detail: `${installed} installed · ${loaded > 0 ? `${loaded} loaded` : 'none loaded'}${stale}`,\n };\n}\n\nfunction llamaLine(raw: unknown): LocalRuntimeLine | null {\n const report = rec(raw);\n if (!report) return null;\n const port = portOf(report['baseUrl']);\n const status = report['status'];\n const reason = report['reason'];\n const name = 'llama-server';\n if (status === 'ok') {\n const count = typeof report['modelCount'] === 'number' ? report['modelCount'] : null;\n const slots = typeof report['slots'] === 'number' ? report['slots'] : null;\n const parts = [count !== null ? `${count} model${count === 1 ? '' : 's'} served` : 'serving', slots !== null ? `${slots} slots` : null]\n .filter((p): p is string => p !== null);\n return { id: 'llama-server', name, tone: 'success', word: 'Answering', detail: parts.join(' · ') };\n }\n if (status === 'loading') return { id: 'llama-server', name, tone: 'warning', word: 'Loading…', detail: `mapping weights on ${port}` };\n if (status === 'error') return { id: 'llama-server', name, tone: 'danger', word: 'Error', detail: `answering on ${port} with an error` };\n // `down`: refused = not running; timed out = a process holds the port but\n // never answers — wedged, which needs a restart, not a start.\n if (reason === 'llama-server-timeout') {\n return { id: 'llama-server', name, tone: 'danger', word: 'Not answering', detail: `listening on ${port} but not answering — restart it` };\n }\n return { id: 'llama-server', name, tone: 'neutral', word: 'Not running', detail: port ? `nothing answering on ${port}` : 'nothing answering' };\n}\n\n/**\n * One line per local runtime from GET /api/verse/local-models. A runtime the\n * server did not report (an older build has no `llamaServer`) is simply\n * absent — never shown as down.\n */\nexport function localRuntimeLines(raw: unknown): LocalRuntimeLine[] {\n const root = rec(raw);\n if (!root) return [];\n return [\n catalogLine('ollama', 'Ollama', root['ollama']),\n catalogLine('lmstudio', 'LM Studio', root['lmStudio']),\n llamaLine(root['llamaServer']),\n ].filter((line): line is LocalRuntimeLine => line !== null);\n}\n\n// ---------------------------------------------------------------------------\n// One card anatomy, one tier model (3.15, \"equal partners\")\n// ---------------------------------------------------------------------------\n\n/**\n * The facts line every card carries, whatever the provider: its TIER\n * (routing/tiers.ts), what one more turn costs, the models it offers and —\n * when there is one — the reserve kept for Mason. Status, usage and the\n * Chat / Fleet readiness lines are the card's other rows.\n */\nexport interface ResourceFactsView {\n tier: ResourceTier;\n basis: CostBasis;\n /** Runnable model labels, default first; empty when the card lists its own models. */\n models: string[];\n /** \"10 ACUs kept for you\", when the reserve is not already on a meter; null otherwise. */\n reserve: string | null;\n}\n\n/** Shown before \"+N more\". */\nexport const FACTS_MODELS_SHOWN = 3;\n\n/** \"Opus 5.5, Sonnet 5, Haiku +2 more\" — never empty-looking, never a bare \"…\". */\nexport function modelsLine(labels: readonly string[], max = FACTS_MODELS_SHOWN): string | null {\n const unique = [...new Set(labels.filter((l) => l.trim().length > 0))];\n if (unique.length === 0) return null;\n const shown = unique.slice(0, max).join(', ');\n return unique.length > max ? `${shown} +${unique.length - max} more` : shown;\n}\n\nfunction runnable(seat: Pick<VerseSeat, 'models'>) {\n const models = seat.models.filter((m) => !m.unavailableReason);\n return models.length > 0 ? models : seat.models.slice(0, 1);\n}\n\n/** The facts for one seat (its default model decides the tier). */\nexport function seatFacts(seat: Pick<VerseSeat, 'engine' | 'models' | 'costBasis'>): ResourceFactsView {\n const models = runnable(seat);\n const first = models[0]?.id ?? null;\n return {\n tier: seatTier(seat.engine, first),\n basis: seat.costBasis ?? costBasisOf(seat.engine, { modelId: first }),\n models: models.map((m) => m.label),\n reserve: null,\n };\n}\n\n/**\n * The facts for a PROVIDER card that covers several seats (Devin cloud + CLI,\n * the local runtime): the best tier any of them offers, and every cost basis\n * worded once (\"credits · subscription\").\n */\nexport function mergedFacts(seats: ReadonlyArray<Pick<VerseSeat, 'engine' | 'models' | 'costBasis'>>): ResourceFactsView | null {\n if (seats.length === 0) return null;\n const all = seats.map(seatFacts);\n const tier = all.reduce<ResourceTier>((best, f) => (tierRank(f.tier) < tierRank(best) ? f.tier : best), all[0]!.tier);\n return { tier, basis: all[0]!.basis, models: all.flatMap((f) => f.models), reserve: null };\n}\n\n/** Every cost basis a provider card spans, in first-seen order. */\nexport function costBases(seats: ReadonlyArray<Pick<VerseSeat, 'engine' | 'models' | 'costBasis'>>): CostBasis[] {\n return [...new Set(seats.map((s) => seatFacts(s).basis))];\n}\n\n/** One card in a tier section, ranked by status the same way for every provider. */\nexport interface TierEntry<K extends string = string> {\n key: K;\n tier: ResourceTier;\n /** `accountStatusRank` of the card's status; lower = more usable. */\n statusRank: number;\n /** 0 subscription / free, 1 credits / per-token — the router's marginal-cost rule. */\n marginal: number;\n index: number;\n}\n\n/**\n * Cards per tier, best tier first; inside a tier usable before not, a\n * subscription before a metered balance, then the caller's order. Empty tiers\n * are dropped. No provider is named anywhere in this ordering.\n */\nexport function groupByTier<E extends TierEntry>(entries: readonly E[]): Array<{ tier: ResourceTier; entries: E[] }> {\n const tiers: ResourceTier[] = ['elite', 'fast', 'free'];\n return tiers\n .map((tier) => ({\n tier,\n entries: entries\n .filter((e) => e.tier === tier)\n .sort((a, b) => a.statusRank - b.statusRank || a.marginal - b.marginal || a.index - b.index),\n }))\n .filter((g) => g.entries.length > 0);\n}\n\n/** A status rank for a card that has no capacity row (cloud credits, Devin): from its Chat verdict. */\nexport function readinessStatusRank(chatReady: boolean | null): number {\n if (chatReady === null) return accountStatusRank('not-checked');\n return accountStatusRank(chatReady ? 'usable' : 'unavailable');\n}\n","/**\n * routes/verse/resources/resources-queries.ts — the one read the Resources\n * drawer adds (unit 3.11 C6). Seats, health, budget, local models and the\n * serving runtime are read through their owners' QueryDefs (usage/, health/,\n * budget/, autonomy/fleet-queries); only the cloud lane's overview is new.\n *\n * GET /api/verse/cloud lands in parallel with this drawer. Until it does the\n * server answers 404, and that is a designed state (\"Cloud lane not available\n * yet\"), not an error: the fetcher resolves `{ available: false }` instead of\n * throwing. A 401 still propagates — an expired session is the whole app's\n * problem, not this panel's.\n */\nimport { VERSE_CLOUD_PATH } from '../../../../core/cloud/types.js';\nimport { VERSE_RESOURCE_READINESS_PATH, type ResourceReadinessResponse } from '../../../../core/routing/readiness-types.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { projectCloudCredits, type CloudCreditsView } from './resources-model.js';\n\nexport const RESOURCES_CLOUD_KEY = 'verse-resources-cloud';\n\nexport interface CloudCreditsRead {\n /** False when the route is absent (404) or unreachable. */\n available: boolean;\n /** Null when absent, or when the body was not a cloud overview. */\n credits: CloudCreditsView | null;\n}\n\nexport const cloudCreditsQuery: QueryDef<CloudCreditsRead> = {\n key: RESOURCES_CLOUD_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(VERSE_CLOUD_PATH, signal);\n return { available: true, credits: projectCloudCredits(raw) };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { available: false, credits: null };\n }\n },\n};\n\nexport const RESOURCES_READINESS_KEY = 'verse-resources-readiness';\n\nexport interface ReadinessRead {\n /** False when this server has no readiness route (404) or it could not answer. */\n available: boolean;\n /** Null when absent, or when the body was not a readiness response. */\n value: ResourceReadinessResponse | null;\n}\n\nfunction isReadiness(raw: unknown): raw is ResourceReadinessResponse {\n if (raw === null || typeof raw !== 'object') return false;\n const r = raw as Record<string, unknown>;\n return r['v'] === 1 && Array.isArray(r['resources']) && typeof r['autonomy'] === 'object' && r['autonomy'] !== null;\n}\n\n/**\n * GET /api/verse/budget/readiness (3.14): per resource, \"ready for chat?\" and\n * \"ready for the fleet?\" with the one fix. An older server answers 404 — the\n * drawer then simply shows no readiness lines, never a false \"not ready\".\n */\nexport const resourceReadinessQuery: QueryDef<ReadinessRead> = {\n key: RESOURCES_READINESS_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(VERSE_RESOURCE_READINESS_PATH, signal);\n return { available: true, value: isReadiness(raw) ? raw : null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { available: false, value: null };\n }\n },\n};\n\n/** While the drawer is open: seats and health ride their own 30 s polls; these are the drawer's own. */\nexport const RESOURCES_POLL_MS = { cloud: 60_000, local: 30_000, runtime: 15_000, readiness: 30_000 } as const;\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{t as e}from"./nav-CM-mJcSq.js";var t=3e3;function n(e){return typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape(e):e.replace(/["\\]/g,`\\$&`)}function r(t,r,i=document){let a=i.querySelector(`[data-surface="${n(t)}"]`);return a?a.querySelector(`#${n(e(r))}`)??a.querySelector(`[data-verse-anchor="${n(r)}"]`):null}function i(e){typeof e.scrollIntoView==`function`&&e.scrollIntoView({block:`center`,behavior:`smooth`}),(e.tabIndex>=0||e.matches(`a[href],button,input,select,textarea,[tabindex]`))&&e.focus({preventScroll:!0})}function a({section:e,anchor:n},a=t){if(typeof document>`u`)return Promise.resolve(!1);let o=r(e,n);return o&&!o.closest(`[hidden]`)?(i(o),Promise.resolve(!0)):new Promise(t=>{let o=!1,s=e=>{o||(o=!0,l.disconnect(),window.clearTimeout(u),e&&i(e),t(e!==null))},c=()=>{let t=r(e,n);t&&!t.closest(`[hidden]`)&&s(t)},l=new MutationObserver(c);l.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`hidden`,`id`,`data-verse-anchor`]});let u=window.setTimeout(()=>s(null),a);c()})}export{t as ANCHOR_WAIT_MS,r as findAnchorElement,a as revealAnchor};
2
- //# sourceMappingURL=reveal-anchor-Djk1vGLl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reveal-anchor-Djk1vGLl.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/reveal-anchor.ts"],"sourcesContent":["/**\n * routes/verse/shell/reveal-anchor.ts — \"go to that card\" for any surface\n * (unit C1; C7 cross-unit request 3).\n *\n * Needs-you items, Leader memos and Command cards point INTO a surface\n * (\"memo:m-7\" on Mind, \"seat:claude-a\" on Apps). Whoever raises it calls\n * `setVerseSection(section, anchor)` (or dispatches VERSE_ANCHOR_EVENT); the\n * shell listens once (VerseApp, through shell/anchor-requests.ts) and reveals\n * the element here.\n *\n * WHY WAIT, AND FOR HOW LONG. The target surface may be a lazy chunk that has\n * not loaded, a keep-alive surface un-hiding, or a list still fetching its\n * rows. Two animation frames (C7's own fallback in command/nav.ts) cover the\n * keep-alive case only; a cold chunk takes longer. So this watches the\n * surface's subtree until the element appears, and gives up quietly after\n * ANCHOR_WAIT_MS — a missing anchor is never an error, the operator is\n * already on the right surface.\n *\n * WHICH ELEMENT. C7 stamps `id=\"c7-anchor-<key>\"` (command/nav.ts anchorId);\n * any other owner may stamp `data-verse-anchor=\"<key>\"` instead of adopting\n * C7's id scheme. The search is scoped to `[data-surface=<section>]` so an\n * identically-keyed card on a HIDDEN keep-alive surface never wins.\n */\nimport { anchorId } from '../command/nav.js';\nimport type { VerseAnchorRequest } from '../verse-ui-store.js';\n\nexport const ANCHOR_WAIT_MS = 3_000;\n\nfunction cssEscape(value: string): string {\n return typeof CSS !== 'undefined' && typeof CSS.escape === 'function' ? CSS.escape(value) : value.replace(/[\"\\\\]/g, '\\\\$&');\n}\n\n/** The anchor's element on `section`'s surface, or null when it is not in the DOM (yet). */\nexport function findAnchorElement(section: string, anchor: string, root: ParentNode = document): HTMLElement | null {\n const host = root.querySelector<HTMLElement>(`[data-surface=\"${cssEscape(section)}\"]`);\n if (!host) return null;\n return (\n host.querySelector<HTMLElement>(`#${cssEscape(anchorId(anchor))}`) ??\n host.querySelector<HTMLElement>(`[data-verse-anchor=\"${cssEscape(anchor)}\"]`)\n );\n}\n\nfunction reveal(el: HTMLElement): void {\n if (typeof el.scrollIntoView === 'function') el.scrollIntoView({ block: 'center', behavior: 'smooth' });\n // Keyboard users land ON the card, not just near it. Only an element that\n // can already take focus is focused — the shell never rewrites another\n // unit's tab order to make a div focusable.\n if (el.tabIndex >= 0 || el.matches('a[href],button,input,select,textarea,[tabindex]')) {\n el.focus({ preventScroll: true });\n }\n}\n\n/**\n * Reveal `anchor` on `section`. Resolves true when it was found and scrolled\n * to, false when it did not appear within `waitMs`. Never throws.\n */\nexport function revealAnchor({ section, anchor }: VerseAnchorRequest, waitMs: number = ANCHOR_WAIT_MS): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n const now = findAnchorElement(section, anchor);\n if (now && !now.closest('[hidden]')) {\n reveal(now);\n return Promise.resolve(true);\n }\n return new Promise((resolve) => {\n let done = false;\n const finish = (el: HTMLElement | null) => {\n if (done) return;\n done = true;\n observer.disconnect();\n window.clearTimeout(timer);\n if (el) reveal(el);\n resolve(el !== null);\n };\n const check = () => {\n const el = findAnchorElement(section, anchor);\n // Wait for the surface to be un-hidden too: scrolling a hidden element is a no-op.\n if (el && !el.closest('[hidden]')) finish(el);\n };\n const observer = new MutationObserver(check);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['hidden', 'id', 'data-verse-anchor'] });\n const timer = window.setTimeout(() => finish(null), waitMs);\n check();\n });\n}\n"],"mappings":"sCA0BA,IAAa,EAAiB,IAE9B,SAAS,EAAU,EAAuB,CACxC,OAAO,OAAO,IAAQ,KAAe,OAAO,IAAI,QAAW,WAAa,IAAI,OAAO,CAAK,EAAI,EAAM,QAAQ,SAAU,MAAM,CAC5H,CAGA,SAAgB,EAAkB,EAAiB,EAAgB,EAAmB,SAA8B,CAClH,IAAM,EAAO,EAAK,cAA2B,kBAAkB,EAAU,CAAO,EAAE,GAAG,EAErF,OADK,EAEH,EAAK,cAA2B,IAAI,EAAU,EAAS,CAAM,CAAC,GAAG,GACjE,EAAK,cAA2B,uBAAuB,EAAU,CAAM,EAAE,GAAG,EAH5D,IAKpB,CAEA,SAAS,EAAO,EAAuB,CACjC,OAAO,EAAG,gBAAmB,YAAY,EAAG,eAAe,CAAE,MAAO,SAAU,SAAU,QAAS,CAAC,GAIlG,EAAG,UAAY,GAAK,EAAG,QAAQ,iDAAiD,IAClF,EAAG,MAAM,CAAE,cAAe,EAAK,CAAC,CAEpC,CAMA,SAAgB,EAAa,CAAE,UAAS,UAA8B,EAAiB,EAAkC,CACvH,GAAI,OAAO,SAAa,IAAa,OAAO,QAAQ,QAAQ,EAAK,EACjE,IAAM,EAAM,EAAkB,EAAS,CAAM,EAK7C,OAJI,GAAO,CAAC,EAAI,QAAQ,UAAU,GAChC,EAAO,CAAG,EACH,QAAQ,QAAQ,EAAI,GAEtB,IAAI,QAAS,GAAY,CAC9B,IAAI,EAAO,GACL,EAAU,GAA2B,CACrC,IACJ,EAAO,GACP,EAAS,WAAW,EACpB,OAAO,aAAa,CAAK,EACrB,GAAI,EAAO,CAAE,EACjB,EAAQ,IAAO,IAAI,EACrB,EACM,MAAc,CAClB,IAAM,EAAK,EAAkB,EAAS,CAAM,EAExC,GAAM,CAAC,EAAG,QAAQ,UAAU,GAAG,EAAO,CAAE,CAC9C,EACM,EAAW,IAAI,iBAAiB,CAAK,EAC3C,EAAS,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,QAAS,GAAM,WAAY,GAAM,gBAAiB,CAAC,SAAU,KAAM,mBAAmB,CAAE,CAAC,EAC5I,IAAM,EAAQ,OAAO,eAAiB,EAAO,IAAI,EAAG,CAAM,EAC1D,EAAM,CACR,CAAC,CACH"}
@@ -1,2 +0,0 @@
1
- import{B as e}from"./verse-model-CkF3q2IH.js";function t(e,t){if(!e)return null;for(let n of e)if(n.seatId===t)return n;return null}function n(e,t=Date.now()){if(typeof e!=`string`||e.length===0)return null;let n=Date.parse(e);if(!Number.isFinite(n))return null;let r=new Date(n),i=r.toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`});return new Date(t).toDateString()===r.toDateString()?`today ${i}`:n>t&&n-t<5184e5?`${r.toLocaleDateString([],{weekday:`short`})} ${i}`:`${r.toLocaleDateString([],{month:`short`,day:`numeric`})}, ${i}`}function r(e){return typeof e==`string`&&Number.isFinite(Date.parse(e))}function i(e){return e.limitReached||e.usedPercent!==null&&e.usedPercent>=100}function a(e){if(!e)return{resetAt:null,resetDescription:null};let t=e.windows.filter(i);if(t.length===0){let t=e.binding;return{resetAt:t!==null&&r(t.resetsAt)?t.resetsAt:null,resetDescription:t?.resetDescription??null}}let n=t.filter(e=>!r(e.resetsAt));if(n.length>0)return{resetAt:null,resetDescription:n.find(e=>e.resetDescription!==null)?.resetDescription??null};let a=t.reduce((e,t)=>Date.parse(t.resetsAt)>Date.parse(e.resetsAt)?t:e);return{resetAt:a.resetsAt,resetDescription:a.resetDescription}}function o(e,t,r=Date.now()){let i=null,o=null;if(t!==null)(t.connection===`signed-out`||t.connection===`exhausted`)&&(i=t.connection,o=t.resetAt);else if(e.engine!==`local`){let t=e.capacity?.usability;(t===`signed-out`||t===`exhausted`)&&(i=t,o=t===`exhausted`?a(e.capacity).resetAt:null)}if(i===null)return null;if(i===`signed-out`)return{connection:i,resetAt:null,reason:`${e.label} is signed out — reconnect it to use this seat.`};let s=n(o,r),c=s===null?a(e.capacity).resetDescription:null,l=s===null?c===null?``:` — ${c}`:` — resets ${s}`;return{connection:i,resetAt:o,reason:`${e.label} is out of usage${l}.`}}function s(e){return e.models.some(e=>!e.unavailableReason)}function c(t){return t.engine===`local`?2:e(t.engine)?t.health.state===`ready`?0:1:t.capacity?.usability===`ready`?0:1}function l(t){if(e(t.engine)&&!t.capacity)return 50;let n=t.capacity?.binding?.usedPercent;return typeof n==`number`&&Number.isFinite(n)?n:101}function u(e,t,n){return!(!s(e)||e.health.state===`unavailable`||o(e,t,n)!==null||e.engine===`local`&&t!==null&&t.connection===`unknown`&&t.reasons.length>0)}function d(e,n,r,i=Date.now()){let a=n.find(t=>t.id===e)??null,o=n.map((e,t)=>({seat:e,index:t})).filter(({seat:n})=>n.id!==e&&u(n,t(r,n.id),i));return o.sort((e,t)=>{let n=c(e.seat)-c(t.seat);if(n!==0)return n;if(a!==null){let n=e.seat.engine===a.engine?0:1,r=t.seat.engine===a.engine?0:1;if(n!==r)return n-r}let r=l(e.seat)-l(t.seat);return r===0?e.index-t.index:r}),o.slice(0,5).map(({seat:e})=>e.id)}export{d as n,o as r,n as t};
2
- //# sourceMappingURL=seat-readiness-CvEmMBol.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"seat-readiness-CvEmMBol.js","names":[],"sources":["../../../../../../src/core/verse/seat-readiness.ts"],"sourcesContent":["/**\n * core/verse/seat-readiness.ts — \"can this seat run a turn right now, and if\n * not, where else can the operator go?\" (V3.10, unit A2).\n *\n * PURE and BROWSER-SAFE on purpose: the engine's admission gate\n * (`getSeatReadiness` in core/verse/seats.ts) and the Composer's block\n * (web-ui/routes/verse/health/ComposerSeatBlock.tsx) must give the SAME\n * answer, with the SAME ranked alternatives, or the UI would offer a seat the\n * server then refuses. One implementation, imported by both. Type-only\n * imports and `Intl` only — no node: modules.\n *\n * ── WHAT BLOCKS A SEAT ─────────────────────────────────────────────────────\n * Only POSITIVE evidence that a turn would fail at the provider:\n * - `signed-out` — the CLI said so (status command or the live collector).\n * - `exhausted` — every window that carried a reading is spent and no\n * Codex credit balance remains (`seatUsability` in seats.ts;\n * a spent per-model window beside a healthy account-wide\n * one is `tight`, not exhausted).\n * `unknown`, `expiring` and `binary-skew` are WARNINGS, never refusals: an\n * admission gate that refused on \"we could not read it\" would lock Mason out\n * of his own seats every time a probe hiccuped (docs/VERSE-TELEMETRY-V2.md —\n * no signal is not a verdict).\n *\n * ── HOW ALTERNATIVES ARE RANKED ────────────────────────────────────────────\n * (research r2/accounts.md, recommendation 4): other subscription seats with\n * measured headroom first, then subscription seats whose headroom is tight or\n * unread, then local models (free, always last because they are the weakest).\n * Inside a tier the SAME ENGINE leads (a Codex user blocked on one account most\n * likely wants the other Codex account), then the lower binding-window\n * percentage, then discovery order. A seat with no runnable model, a local\n * seat whose runtime is not answering, or a seat that is itself blocked is\n * never offered.\n */\nimport type { SeatConnection, SeatHealthReport, SeatReadiness } from './health-types.js';\nimport type { VerseSeat } from './types.js';\nimport { isWindowlessEngine } from '../routing/tiers.js';\n\n/** The only connections that refuse a turn. Everything else is a warning. */\nexport const SEAT_BLOCKING_CONNECTIONS: ReadonlySet<SeatConnection> = new Set<SeatConnection>(['signed-out', 'exhausted']);\n\n/** At most this many alternatives are offered — a list, not a directory. */\nexport const SEAT_MAX_ALTERNATIVES = 5;\n\nexport interface SeatBlock {\n connection: 'signed-out' | 'exhausted';\n /** One plain sentence naming the seat and the fact (\"Personal Codex is out of usage — resets Fri 2:25 PM.\"). */\n reason: string;\n /** Machine-readable reset instant, when the provider gave one. */\n resetAt: string | null;\n}\n\nfunction reportFor(reports: readonly SeatHealthReport[] | null | undefined, seatId: string): SeatHealthReport | null {\n if (!reports) return null;\n for (const report of reports) if (report.seatId === seatId) return report;\n return null;\n}\n\n/**\n * A reset instant as a short local phrase (\"Fri 2:25 PM\", \"Sep 30, 2:25 PM\"),\n * or null when `iso` is not a valid instant. Only a MACHINE-READABLE instant\n * is ever formatted — Claude's prose reset never reaches this function.\n */\nexport function describeResetAt(iso: string | null | undefined, now: number = Date.now()): string | null {\n if (typeof iso !== 'string' || iso.length === 0) return null;\n const at = Date.parse(iso);\n if (!Number.isFinite(at)) return null;\n const date = new Date(at);\n const time = date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n if (new Date(now).toDateString() === date.toDateString()) return `today ${time}`;\n // Within the coming week the weekday is the clearest name for a day.\n if (at > now && at - now < 6 * 24 * 60 * 60 * 1000) {\n return `${date.toLocaleDateString([], { weekday: 'short' })} ${time}`;\n }\n return `${date.toLocaleDateString([], { month: 'short', day: 'numeric' })}, ${time}`;\n}\n\n/** When a spent seat reopens, as a machine-readable instant and/or the provider's own words. */\nexport interface SeatReopening {\n /** ISO instant the LAST spent window resets; null when any spent window gave only prose (or nothing). */\n resetAt: string | null;\n /** Provider reset wording to show when `resetAt` is null (Claude publishes prose only). */\n resetDescription: string | null;\n}\n\nfunction parseableInstant(iso: string | null | undefined): iso is string {\n return typeof iso === 'string' && Number.isFinite(Date.parse(iso));\n}\n\ntype CapacityWindow = NonNullable<VerseSeat['capacity']>['windows'][number];\n\nfunction isSpentWindow(w: CapacityWindow): boolean {\n return w.limitReached || (w.usedPercent !== null && w.usedPercent >= 100);\n}\n\n/**\n * When a spent seat is usable again: the LATEST reset among its spent\n * windows. A seat reopens only once EVERY spent window has reset — a Codex\n * seat whose 5-hour window resets in 2h but whose weekly window is spent\n * until Wednesday is still spent in 2h. `capacity.binding` cannot answer\n * this: `bindingWindow` (accounts.ts) keeps the FIRST window among equal\n * percentages, so two windows at 100% named whichever the provider listed\n * first — usually the earlier reset. This is the server twin of the web's\n * `seatReopensAt` (routes/verse/seat-subscription.ts), Fleet's\n * `eligibleAgain` and the router's headroom `lastReset`, so every surface\n * names the same instant.\n *\n * - a spent window with only provider prose → `resetAt` null (prose is\n * never parsed, and \"when all of them have reset\" is then unknown); that\n * window's prose is returned instead;\n * - nothing spent → the binding window's own reset, as before.\n */\nexport function seatReopening(capacity: VerseSeat['capacity'] | null | undefined): SeatReopening {\n if (!capacity) return { resetAt: null, resetDescription: null };\n const spent = capacity.windows.filter(isSpentWindow);\n if (spent.length === 0) {\n const binding = capacity.binding;\n return {\n resetAt: binding !== null && parseableInstant(binding.resetsAt) ? binding.resetsAt : null,\n resetDescription: binding?.resetDescription ?? null,\n };\n }\n const unknown = spent.filter((w) => !parseableInstant(w.resetsAt));\n if (unknown.length > 0) {\n return { resetAt: null, resetDescription: unknown.find((w) => w.resetDescription !== null)?.resetDescription ?? null };\n }\n const latest = spent.reduce((a, b) => (Date.parse(b.resetsAt!) > Date.parse(a.resetsAt!) ? b : a));\n return { resetAt: latest.resetsAt, resetDescription: latest.resetDescription };\n}\n\n/**\n * Why `seat` cannot take a turn, or null when nothing positively blocks it.\n *\n * The health report (sweep + live telemetry) wins when present; without one\n * the seat's own `capacity.usability` — which is on every native seat the\n * server serves — is the fallback, so the seat picker can mark a blocked seat\n * before the health endpoint has ever been read.\n */\nexport function seatBlock(\n seat: VerseSeat,\n report: SeatHealthReport | null,\n now: number = Date.now(),\n): SeatBlock | null {\n let connection: SeatBlock['connection'] | null = null;\n let resetAt: string | null = null;\n if (report !== null) {\n if (report.connection === 'signed-out' || report.connection === 'exhausted') {\n connection = report.connection;\n resetAt = report.resetAt;\n }\n } else if (seat.engine !== 'local') {\n const usability = seat.capacity?.usability;\n if (usability === 'signed-out' || usability === 'exhausted') {\n connection = usability;\n // The latest spent-window reset, the same instant the health report names.\n resetAt = usability === 'exhausted' ? seatReopening(seat.capacity).resetAt : null;\n }\n }\n if (connection === null) return null;\n if (connection === 'signed-out') {\n return { connection, resetAt: null, reason: `${seat.label} is signed out — reconnect it to use this seat.` };\n }\n const when = describeResetAt(resetAt, now);\n const prose = when === null ? seatReopening(seat.capacity).resetDescription : null;\n const tail = when !== null ? ` — resets ${when}` : prose !== null ? ` — ${prose}` : '';\n return { connection, resetAt, reason: `${seat.label} is out of usage${tail}.` };\n}\n\nfunction hasRunnableModel(seat: VerseSeat): boolean {\n return seat.models.some((model) => !model.unavailableReason);\n}\n\n/**\n * 0 = subscription seat with measured headroom (or a ready windowless seat —\n * Devin has no window to measure, 3.15), 1 = tight/unread subscription seat,\n * 2 = local.\n */\nfunction tier(seat: VerseSeat): number {\n if (seat.engine === 'local') return 2;\n if (isWindowlessEngine(seat.engine)) return seat.health.state === 'ready' ? 0 : 1;\n return seat.capacity?.usability === 'ready' ? 0 : 1;\n}\n\nfunction bindingPercent(seat: VerseSeat): number {\n // A windowless seat ranks mid-range, like the router's neutral headroom.\n if (isWindowlessEngine(seat.engine) && !seat.capacity) return 50;\n const used = seat.capacity?.binding?.usedPercent;\n // Unread sorts after every reading: no signal is not \"0% used\".\n return typeof used === 'number' && Number.isFinite(used) ? used : 101;\n}\n\n/** Can `seat` be offered as somewhere else to go? */\nfunction offerable(seat: VerseSeat, report: SeatHealthReport | null, now: number): boolean {\n if (!hasRunnableModel(seat)) return false;\n if (seat.health.state === 'unavailable') return false;\n if (seatBlock(seat, report, now) !== null) return false;\n // A local seat is only worth offering while its runtime answers. `unknown`\n // with reasons is the sweep saying Ollama did not respond.\n if (seat.engine === 'local' && report !== null && report.connection === 'unknown' && report.reasons.length > 0) {\n return false;\n }\n return true;\n}\n\n/** Ranked ids of seats that could take the turn instead of `seatId` (see the file header). */\nexport function rankSeatAlternatives(\n seatId: string,\n seats: readonly VerseSeat[],\n reports: readonly SeatHealthReport[] | null | undefined,\n now: number = Date.now(),\n): string[] {\n const blocked = seats.find((seat) => seat.id === seatId) ?? null;\n const candidates = seats\n .map((seat, index) => ({ seat, index }))\n .filter(({ seat }) => seat.id !== seatId && offerable(seat, reportFor(reports, seat.id), now));\n candidates.sort((a, b) => {\n const byTier = tier(a.seat) - tier(b.seat);\n if (byTier !== 0) return byTier;\n if (blocked !== null) {\n const sameA = a.seat.engine === blocked.engine ? 0 : 1;\n const sameB = b.seat.engine === blocked.engine ? 0 : 1;\n if (sameA !== sameB) return sameA - sameB;\n }\n const byUse = bindingPercent(a.seat) - bindingPercent(b.seat);\n if (byUse !== 0) return byUse;\n return a.index - b.index;\n });\n return candidates.slice(0, SEAT_MAX_ALTERNATIVES).map(({ seat }) => seat.id);\n}\n\n/**\n * The admission answer for one seat. A seat that is not in `seats` at all is\n * reported READY with no reason: the readiness layer has no evidence about\n * it, and \"seat not found\" is the engine's own error to raise.\n */\nexport function seatReadiness(\n seatId: string,\n seats: readonly VerseSeat[],\n reports: readonly SeatHealthReport[] | null | undefined,\n now: number = Date.now(),\n): SeatReadiness {\n const seat = seats.find((candidate) => candidate.id === seatId) ?? null;\n if (seat === null) return { seatId, ready: true, reason: null, alternatives: [] };\n const block = seatBlock(seat, reportFor(reports, seatId), now);\n if (block === null) return { seatId, ready: true, reason: null, alternatives: [] };\n return { seatId, ready: false, reason: block.reason, alternatives: rankSeatAlternatives(seatId, seats, reports, now) };\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{E as e,S as t,T as n,r}from"./verse-model-CkF3q2IH.js";import{t as i}from"./seat-readiness-CvEmMBol.js";import{_ as a}from"./format-CcEKjUou.js";var o={ready:`ready`,tight:`tight`,exhausted:`blocked`,"signed-out":`blocked`,unknown:`unread`};function s(e,t=Date.now()){let n=i(e,t);return n===null?null:`resets ${n}`}function c(t,n){let r=`${t}_`,i=n;for(;i.startsWith(r)&&i.length>r.length;)i=i.slice(r.length);return e(i)}function l(e,t,n){let r=t.resetDescription??(t.resetsAt===null?null:s(t.resetsAt,n));return{id:t.id,label:c(e,t.id),usedPercent:t.limitReached||!t.measured?null:t.usedPercent,limitReached:t.limitReached,resetText:r,resetsAt:t.resetsAt}}function u(t,n){let r=typeof t.usedPercent==`number`&&Number.isFinite(t.usedPercent)?Math.max(0,Math.min(100,t.usedPercent)):null,i=r!==null&&r>=100;return{id:t.id,label:e(t.id),usedPercent:i?null:r,limitReached:i,resetText:t.resetsAt===null?null:s(t.resetsAt,n),resetsAt:t.resetsAt}}function d(e){if(e===null)return{phrase:null,title:null};if(e.unlimited)return{phrase:`credits unlimited`,title:null};if(!e.hasCredits)return{phrase:null,title:null};if(e.balance===null)return{phrase:`credits available`,title:null};let t=Number.parseFloat(e.balance);return Number.isFinite(t)?{phrase:`${t.toFixed(2)} credits left`,title:e.balance}:{phrase:`credits available`,title:e.balance}}function f(e){let t=n(e),i=e.health.state===`ready`,a=t===null?i?`ready`:`unread`:`blocked`;return{kind:`local`,plan:null,cls:a,word:r[a],summary:t??(i?`runs on this machine`:`readiness not reported`),binding:null,others:[],credits:null,creditsTitle:null,notes:e.health.summary===null?[]:[e.health.summary],evidenceSource:null,observedAt:e.health.observedAt,extended:!1}}function p(e,i){let a=t(e),o=e.health.windows.map(e=>u(e,i)),s=o.find(e=>e.limitReached)??null,c=o.filter(e=>e.usedPercent!==null),l=c.length===0?null:c.reduce((e,t)=>(t.usedPercent??0)>(e.usedPercent??0)?t:e),d=s??l,f=n(e),p=f===null?a.cls:`blocked`;return{kind:`subscription`,plan:null,cls:p,word:r[p],summary:f??a.text,binding:d,others:d===null?o:o.filter(e=>e.id!==d.id),credits:null,creditsTitle:null,notes:[],evidenceSource:null,observedAt:e.health.observedAt,extended:!1}}function m(e,t=Date.now()){if(e.engine===`local`)return f(e);let i=e.capacity;if(i===void 0)return p(e,t);let s=i.windows.map(n=>l(e.engine,n,t)),c=i.binding,u=c===null?null:s.find(e=>e.id===c.id)??l(e.engine,c,t),m=u===null?s:s.filter(e=>e.id!==u.id),h=e.health.state===`degraded`&&i.usability===`unknown`,g=h?{phrase:null,title:null}:d(i.credits),_=n(e),v=_===null?o[i.usability]:`blocked`,y;return y=i.usability===`signed-out`?`signed out — reconnect this account`:_===null?u===null?`no capacity reading`:u.limitReached?i.usability===`tight`&&g.phrase!==null?`${u.label} limit reached · credits still spendable`:`${u.label} limit reached`:u.usedPercent===null?`no capacity reading`:`${a(u.usedPercent)} of ${u.label} used`:_,h&&(y=u===null?`No current capacity reading; current access unconfirmed`:`Last verified reading: ${y}; current access unconfirmed`),{kind:`subscription`,plan:i.planType,cls:v,word:r[v],summary:y,binding:u,others:m,credits:g.phrase,creditsTitle:g.title,notes:[...i.notes],evidenceSource:i.evidenceSource,observedAt:i.observedAt??e.health.observedAt,extended:!0}}function h(e){return typeof e==`string`&&Number.isFinite(Date.parse(e))}function g(e){return e.limitReached||e.usedPercent!==null&&e.usedPercent>=100}function _(e,t){let n=h(t)?t:null,r=(e.binding===null?e.others:[e.binding,...e.others]).filter(g);if(r.length>0){if(r.some(e=>!h(e.resetsAt)))return null;let e=r.map(e=>e.resetsAt);return n!==null&&e.push(n),e.reduce((e,t)=>Date.parse(t)>Date.parse(e)?t:e)}return n===null?e.binding!==null&&h(e.binding.resetsAt)?e.binding.resetsAt:null:n}function v(e,t){let n=[e.label];return t.plan!==null&&n.push(t.plan),n.push(t.word),n.push(t.summary),t.credits!==null&&n.push(t.credits),t.binding?.resetText!=null&&n.push(t.binding.resetText),n.join(` · `)}function y(e){return e===`tight`||e===`blocked`}export{y as i,m as n,v as r,_ as t};
2
- //# sourceMappingURL=seat-subscription-BClqZwau.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"seat-subscription-BClqZwau.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/seat-subscription.ts"],"sourcesContent":["/**\n * routes/verse/seat-subscription.ts — \"what subscription is behind this seat,\n * and how much of it is left\", projected ONCE for every chat surface that\n * shows a seat: the resources panel, the seat selector, the new-chat dialog,\n * the sidebar and the chat header.\n *\n * WHY THIS MODULE EXISTS\n *\n * The resources panel showed a bare \"unknown\" pill for every account — the\n * most-looked-at surface in the app. Measured against a live server,\n * `GET /api/verse/accounts` had all four accounts observed, Claude with three\n * windows and Grok with one, while `bootstrap.seats[].health` was `unknown`\n * forever for Claude and Grok: seat health came from a shared-evidence file\n * scoped `codex-native-metadata`, which structurally cannot carry those two\n * providers. The live data existed and was discarded at the last hop.\n *\n * Owner S's V2.1 contract fixes the supply side — `VerseSeat.capacity`\n * (core/verse/types.ts) now carries the plan, the binding window, the full\n * window list, credits, a usability verdict, the evidence source and the\n * provider's own notes. This module is the single place the chat surfaces\n * read it, so they cannot describe one seat four different ways.\n *\n * TWO SOURCES, ONE VIEW. `capacity` is `undefined` for local seats (an Ollama\n * tag has no subscription) and for a native seat the server could not build a\n * record for. The V1 `health.windows` shape is still read as the fallback, and\n * on that path the verdict is delegated WHOLESALE to\n * `verse-model.seatCapacity` — the seat selector and the composer's seat menu\n * already render those exact words, and two implementations of one rule is\n * how the picker and the panel would drift apart again.\n *\n * HONESTY RULES (docs/VERSE-TELEMETRY-V2.md, closing section) — every one is a\n * place where the obvious projection would lie:\n *\n * 1. THE BINDING WINDOW LEADS. An account is blocked by its WORST window, not\n * its first and not its average. Claude's weekly per-model window sat at\n * 100% while all-models read 58%; leading with 58% is a lie of emphasis.\n * 2. NO SIGNAL IS NOT ZERO. An unread window gets no meter at all. An empty\n * bar reads \"plenty left\" and a full one reads \"exhausted\"; both are false\n * when nothing was measured.\n * 3. THE SENTINEL 100 IS A FLAG. Codex writes `rateLimitReachedType` upstream\n * as the value 100. `measured: false` marks it; it renders as \"limit\n * reached\", never as \"100% used\", and carries no percentage.\n * 4. CREDITS ARE NOT THE WINDOW. A Codex account at 100% of its weekly window\n * with a spendable balance is still usable. The server already encodes\n * that in `usability: 'tight'`; this module reports both facts and never\n * collapses them into one.\n * 5. ONLY A MACHINE-READABLE INSTANT MAY BE FORMATTED. Claude's `resetsAt` is\n * structurally always null and its reset is provider prose; prose is\n * rendered VERBATIM, never parsed and never turned into a countdown.\n *\n * Pure: no React, no I/O.\n */\nimport { describeResetAt } from '../../../core/verse/seat-readiness.js';\nimport type { VerseEngine, VerseSeat } from '../../data/api-types.js';\nimport { percentText } from './autonomy/format.js';\nimport {\n SEAT_CAPACITY_WORD,\n seatCapacity,\n seatUnavailableReason,\n seatWindowLabel,\n type SeatCapacityClass,\n} from './verse-model.js';\n\nexport type { SeatCapacityClass };\n\n/**\n * Owner S's shapes, reached through `VerseSeat` rather than imported by name.\n *\n * This is the drift guard, and it costs nothing: rename or reshape\n * `VerseSeatCapacity` in core/verse/types.ts and every read below stops\n * compiling HERE, at the seam, instead of silently degrading the panel back to\n * the \"unknown\" it was built to fix.\n */\ntype SeatCapacityRecord = NonNullable<VerseSeat['capacity']>;\ntype SeatCapacityWindow = SeatCapacityRecord['windows'][number];\n\n/** One quota window, in the shape every chat surface renders. */\nexport interface SeatWindowView {\n id: string;\n /** Human label, derived from the provider's id. */\n label: string;\n /**\n * 0–100, or null. Null means \"no reading\" OR \"the figure is a sentinel\".\n * NEVER a substituted zero, and a view must not draw a meter for it.\n */\n usedPercent: number | null;\n /** The provider flagged the limit instead of measuring it. */\n limitReached: boolean;\n /**\n * Reset text, ready to render: provider prose VERBATIM when that is what the\n * provider published, a formatted local time when — and only when — it gave\n * a machine-readable instant, null when it gave neither.\n */\n resetText: string | null;\n /**\n * The machine-readable reset instant (ISO), when there was one. The only\n * field a countdown could ever legitimately be derived from; nothing in the\n * chat surfaces derives one today.\n */\n resetsAt: string | null;\n}\n\nexport interface SeatSubscriptionView {\n /**\n * Local seats have no subscription, no quota and no bill — only a readiness\n * — and must not be dressed in meters that imply otherwise.\n */\n kind: 'subscription' | 'local';\n /** Plan tier as the provider names it: \"max\", \"pro\", \"SuperGrok\". */\n plan: string | null;\n cls: SeatCapacityClass;\n /** The class as a word. State is never communicated by colour alone. */\n word: string;\n /**\n * One short phrase for an option label, a pill title or a menu row —\n * \"92% of weekly fable window used\", \"primary window limit reached\".\n */\n summary: string;\n /** The window that actually constrains work. Null when nothing was read. */\n binding: SeatWindowView | null;\n /** Every other window, in provider order. */\n others: SeatWindowView[];\n /** Codex credits as a rendered phrase. Independent of the window. */\n credits: string | null;\n /** The provider's raw balance string, kept verbatim for a title attribute. */\n creditsTitle: string | null;\n /**\n * The provider's own plain-language facts. Owner S's contract says these\n * must be SHOWN rather than left to imply a fault, so they travel here and\n * the panel prints them.\n */\n notes: string[];\n /**\n * Where the windows came from, so nothing implies freshness it lacks.\n * Null on the V1 fallback path, which has no provenance to report.\n */\n evidenceSource: SeatCapacityRecord['evidenceSource'] | null;\n /** When the reading was taken, ISO. Null when nothing was observed. */\n observedAt: string | null;\n /** True when the seat carried owner S's `capacity` record. */\n extended: boolean;\n}\n\n/**\n * S's five-state verdict, mapped onto the four words this app already uses.\n *\n * `signed-out` is BLOCKED-by-action, not unread: we know exactly why there is\n * no capacity and what to do about it. `unknown` is the only genuinely unread\n * state — nobody told us anything, and calling that blocked would assert an\n * outage we never observed.\n *\n * Typed as a total map over S's union, so adding a verdict upstream fails the\n * build here rather than falling through to a silent default.\n */\nconst USABILITY_CLASS: Record<SeatCapacityRecord['usability'], SeatCapacityClass> = {\n ready: 'ready',\n tight: 'tight',\n exhausted: 'blocked',\n 'signed-out': 'blocked',\n unknown: 'unread',\n};\n\n/**\n * A machine-readable instant, formatted — in the app's ONE reset wording,\n * `describeResetAt`'s: \"resets today 11:46 PM\", \"resets Fri 11:46 PM\",\n * \"resets Sep 26, 11:46 PM\". (A second wording here — \"resets Sep 25 at\n * 11:46 PM\" — once reached the chat header and the seat meters while Accounts\n * said \"resets Fri 11:46 PM\" for the same instant.) Prose resets never reach\n * this — they are passed through untouched, because the provider's sentence\n * already carries the timezone it means and reformatting it would be a guess.\n */\nexport function formatResetInstant(iso: string, now: number = Date.now()): string | null {\n const when = describeResetAt(iso, now);\n return when === null ? null : `resets ${when}`;\n}\n\n/**\n * Window ids arrive provider-prefixed and sometimes doubly so\n * (`codex_codex_primary`, `grok_unified_weekly`). Strip the engine's own name\n * off the front before handing the rest to the shared labeller, so the panel\n * reads \"primary window\" rather than \"codex codex primary window\".\n *\n * Only the `capacity` path uses this. The V1 fallback goes through\n * `seatWindowLabel` unaltered, because the seat selector's wording is pinned\n * to it by test.\n */\nexport function seatCapacityWindowLabel(engine: VerseEngine, id: string): string {\n const prefix = `${engine}_`;\n let rest = id;\n while (rest.startsWith(prefix) && rest.length > prefix.length) rest = rest.slice(prefix.length);\n return seatWindowLabel(rest);\n}\n\nfunction toWindowView(engine: VerseEngine, w: SeatCapacityWindow, now: number): SeatWindowView {\n const reset = w.resetDescription ?? (w.resetsAt === null ? null : formatResetInstant(w.resetsAt, now));\n return {\n id: w.id,\n label: seatCapacityWindowLabel(engine, w.id),\n // A flagged limit, and any unmeasured figure, is a sentinel — not a reading.\n usedPercent: w.limitReached || !w.measured ? null : w.usedPercent,\n limitReached: w.limitReached,\n resetText: reset,\n resetsAt: w.resetsAt,\n };\n}\n\n/** The V1 `health.windows` shape, for a seat with no `capacity` record. */\nfunction legacyWindowView(w: VerseSeat['health']['windows'][number], now: number): SeatWindowView {\n const used = typeof w.usedPercent === 'number' && Number.isFinite(w.usedPercent)\n ? Math.max(0, Math.min(100, w.usedPercent))\n : null;\n // Upstream writes a denial as 100, so on this shape a bare 100 cannot be\n // told apart from a measured 100 — and the safe reading of both is \"spent\".\n const flagged = used !== null && used >= 100;\n return {\n id: w.id,\n label: seatWindowLabel(w.id),\n usedPercent: flagged ? null : used,\n limitReached: flagged,\n resetText: w.resetsAt === null ? null : formatResetInstant(w.resetsAt, now),\n resetsAt: w.resetsAt,\n };\n}\n\nfunction creditsPhrase(credits: SeatCapacityRecord['credits']): { phrase: string | null; title: string | null } {\n if (credits === null) return { phrase: null, title: null };\n if (credits.unlimited) return { phrase: 'credits unlimited', title: null };\n if (!credits.hasCredits) return { phrase: null, title: null };\n if (credits.balance === null) return { phrase: 'credits available', title: null };\n const parsed = Number.parseFloat(credits.balance);\n if (!Number.isFinite(parsed)) return { phrase: 'credits available', title: credits.balance };\n // The provider publishes a long decimal (\"2048.4196250000\"). Two places is a\n // rendering choice, not a new number — the raw string rides in the title.\n return { phrase: `${parsed.toFixed(2)} credits left`, title: credits.balance };\n}\n\nfunction localView(seat: VerseSeat): SeatSubscriptionView {\n const unavailable = seatUnavailableReason(seat);\n const ready = seat.health.state === 'ready';\n const cls: SeatCapacityClass = unavailable !== null ? 'blocked' : ready ? 'ready' : 'unread';\n return {\n kind: 'local',\n plan: null,\n cls,\n word: SEAT_CAPACITY_WORD[cls],\n summary: unavailable ?? (ready ? 'runs on this machine' : 'readiness not reported'),\n binding: null,\n others: [],\n credits: null,\n creditsTitle: null,\n notes: seat.health.summary === null ? [] : [seat.health.summary],\n evidenceSource: null,\n observedAt: seat.health.observedAt,\n extended: false,\n };\n}\n\n/** The V1 path: no `capacity` record, so the V1 rule decides, unchanged. */\nfunction fallbackView(seat: VerseSeat, now: number): SeatSubscriptionView {\n const legacy = seatCapacity(seat);\n const windows = seat.health.windows.map((w) => legacyWindowView(w, now));\n const flagged = windows.find((w) => w.limitReached) ?? null;\n const measured = windows.filter((w) => w.usedPercent !== null);\n const worst = measured.length === 0\n ? null\n : measured.reduce((a, b) => ((b.usedPercent ?? 0) > (a.usedPercent ?? 0) ? b : a));\n const binding = flagged ?? worst;\n const unavailable = seatUnavailableReason(seat);\n const cls = unavailable !== null ? 'blocked' : legacy.cls;\n return {\n kind: 'subscription',\n plan: null,\n cls,\n word: SEAT_CAPACITY_WORD[cls],\n summary: unavailable ?? legacy.text,\n binding,\n others: binding === null ? windows : windows.filter((w) => w.id !== binding.id),\n credits: null,\n creditsTitle: null,\n notes: [],\n evidenceSource: null,\n observedAt: seat.health.observedAt,\n extended: false,\n };\n}\n\n/**\n * The whole projection. Local seats short-circuit: they have no subscription,\n * so everything below the readiness line is deliberately empty rather than\n * zeroed. `now` is the clock the reset wording is relative to (\"today\" vs a\n * weekday); it defaults to the real one.\n */\nexport function seatSubscription(seat: VerseSeat, now: number = Date.now()): SeatSubscriptionView {\n if (seat.engine === 'local') return localView(seat);\n const capacity = seat.capacity;\n if (capacity === undefined) return fallbackView(seat, now);\n\n const windows = capacity.windows.map((w) => toWindowView(seat.engine, w, now));\n // Resolve the server's CHOICE of binding window back to this seat's own\n // view of it, so the two can never disagree about a reset or a label.\n const served = capacity.binding;\n const binding = served === null\n ? null\n : (windows.find((w) => w.id === served.id) ?? toWindowView(seat.engine, served, now));\n const others = binding === null ? windows : windows.filter((w) => w.id !== binding.id);\n const lastReading = seat.health.state === 'degraded' && capacity.usability === 'unknown';\n // A failed latest check leaves the old meter visible for context only.\n // Session credits are likewise historical and must not imply spendability.\n const credits = lastReading ? { phrase: null, title: null } : creditsPhrase(capacity.credits);\n\n const unavailable = seatUnavailableReason(seat);\n const cls: SeatCapacityClass = unavailable !== null ? 'blocked' : USABILITY_CLASS[capacity.usability];\n\n let summary: string;\n // Signed out is checked FIRST, before the generic unavailable reason: owner\n // S maps `signed-out` onto `health.state: 'unavailable'` (it is the one\n // account state worth a red dot, because it has a remedy), and the generic\n // reason there is a bare \"seat unavailable\" that says nothing about the fix.\n // A signed-out account has no measurement at all — it is an action, never a\n // 0% meter and never a bare \"unknown\".\n if (capacity.usability === 'signed-out') {\n summary = 'signed out — reconnect this account';\n } else if (unavailable !== null) {\n summary = unavailable;\n } else if (binding === null) {\n summary = 'no capacity reading';\n } else if (binding.limitReached) {\n // The server already weighed credits against the spent window; `tight`\n // there means \"spent, but there is still something to spend\".\n summary = capacity.usability === 'tight' && credits.phrase !== null\n ? `${binding.label} limit reached · credits still spendable`\n : `${binding.label} limit reached`;\n } else if (binding.usedPercent === null) {\n summary = 'no capacity reading';\n } else {\n // The one percent rule: \"99%\", never a rounded \"100%\" beside a \"99%\" bar.\n summary = `${percentText(binding.usedPercent)} of ${binding.label} used`;\n }\n if (lastReading) summary = binding === null\n ? 'No current capacity reading; current access unconfirmed'\n : `Last verified reading: ${summary}; current access unconfirmed`;\n\n return {\n kind: 'subscription',\n plan: capacity.planType,\n cls,\n word: SEAT_CAPACITY_WORD[cls],\n summary,\n binding,\n others,\n credits: credits.phrase,\n creditsTitle: credits.title,\n notes: [...capacity.notes],\n evidenceSource: capacity.evidenceSource,\n observedAt: capacity.observedAt ?? seat.health.observedAt,\n extended: true,\n };\n}\n\n/**\n * How much of a freshness claim the evidence supports. A reading served from\n * another process's shared file, or from an operator-seeded baseline, is not\n * a live probe and must not be presented as one.\n */\nexport function evidenceNote(source: SeatSubscriptionView['evidenceSource']): string | null {\n switch (source) {\n case 'collector':\n return null;\n case 'shared-evidence':\n return 'read from another collector’s shared evidence, not probed here';\n case 'baseline':\n return 'operator-seeded baseline, not a live reading';\n case 'none':\n return 'no evidence source — nothing here was measured';\n default:\n return null;\n }\n}\n\nfunction parseableInstant(iso: string | null | undefined): iso is string {\n return typeof iso === 'string' && Number.isFinite(Date.parse(iso));\n}\n\nfunction isSpentWindow(w: Pick<SeatWindowView, 'limitReached' | 'usedPercent'>): boolean {\n return w.limitReached || (w.usedPercent !== null && w.usedPercent >= 100);\n}\n\n/**\n * When a spent seat is usable again. A seat reopens only once EVERY spent\n * window has reset — a Codex seat whose 5-hour window resets in 2h but whose\n * weekly window is also spent until Wednesday is still spent in 2h — so this\n * is the LATEST reset among the spent windows, matching Fleet's \"eligible\n * again\" (fleet/why-seat-model `eligibleAgain`) and the router's headroom\n * `lastReset`. Every surface that says \"resets …\" / \"usable again in …\" for\n * a spent seat (Accounts, the health banner) asks here.\n *\n * - a spent window with only provider prose (Claude) → null: when \"all of\n * them\" have reset is unknown, and prose is never parsed;\n * - `reported` (the health sweep's instant, which is its binding window's)\n * is folded in — it may know of a window this seat record does not — but\n * it can never make the answer EARLIER than a spent window's reset;\n * - nothing spent → `reported`, else the binding window's own instant.\n */\nexport function seatReopensAt(view: Pick<SeatSubscriptionView, 'binding' | 'others'>, reported?: string | null): string | null {\n const known = parseableInstant(reported) ? reported : null;\n const windows = view.binding === null ? view.others : [view.binding, ...view.others];\n const spent = windows.filter(isSpentWindow);\n if (spent.length > 0) {\n if (spent.some((w) => !parseableInstant(w.resetsAt))) return null;\n const instants = spent.map((w) => w.resetsAt as string);\n if (known !== null) instants.push(known);\n return instants.reduce((a, b) => (Date.parse(b) > Date.parse(a) ? b : a));\n }\n if (known !== null) return known;\n return view.binding !== null && parseableInstant(view.binding.resetsAt) ? view.binding.resetsAt : null;\n}\n\n/**\n * One sentence for a `title` attribute or a screen-reader name: the seat, its\n * plan, its verdict and the evidence behind it.\n */\nexport function seatSubscriptionSentence(seat: VerseSeat, view: SeatSubscriptionView): string {\n const parts = [seat.label];\n if (view.plan !== null) parts.push(view.plan);\n parts.push(view.word);\n parts.push(view.summary);\n if (view.credits !== null) parts.push(view.credits);\n if (view.binding?.resetText != null) parts.push(view.binding.resetText);\n return parts.join(' · ');\n}\n\n/** Tight and blocked are worth surfacing outside the panel; the rest is noise. */\nexport function worthFlagging(cls: SeatCapacityClass): boolean {\n return cls === 'tight' || cls === 'blocked';\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{n as e,o as t,s as n,u as r}from"./index-BbDqdepe.js";import{t as i}from"./focus-trap-C8MiYlLZ.js";import{t as a}from"./parts.module-CBkHcD6w.js";var o=r(n(),1),s=r(t(),1),c=e();function l({open:e,onClose:t,title:n,children:r,footer:l,busy:u=!1,role:d=`dialog`}){let f=(0,o.useRef)(null),p=(0,o.useId)(),m=(0,o.useCallback)(()=>{u||t()},[u,t]);return i({open:e,containerRef:f,onClose:m}),e?(0,s.createPortal)((0,c.jsx)(`div`,{className:a.sheetBackdrop,onMouseDown:e=>e.target===e.currentTarget&&m(),children:(0,c.jsxs)(`div`,{ref:f,className:a.sheet,role:d,"aria-modal":`true`,"aria-labelledby":p,tabIndex:-1,children:[(0,c.jsx)(`span`,{className:a.grabber,"aria-hidden":`true`}),(0,c.jsx)(`h2`,{id:p,className:a.sheetTitle,children:n}),(0,c.jsx)(`div`,{className:a.sheetBody,children:r}),l?(0,c.jsx)(`div`,{className:a.sheetFooter,children:l}):null]})}),document.body):null}export{l as t};
2
- //# sourceMappingURL=sheet-D0ciShoy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sheet-D0ciShoy.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/sheet.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/sheet.tsx — the bottom sheet: grabber, title, a\n * scrolling body and a pinned footer, with the console's focus trap (Escape\n * and the backdrop close it unless it is busy). Off the first paint.\n */\nimport { useCallback, useId, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport styles from './parts.module.css';\n\n// ---------------------------------------------------------------------------\n// Bottom sheet\n// ---------------------------------------------------------------------------\n\nexport interface BottomSheetProps {\n open: boolean;\n onClose: () => void;\n title: ReactNode;\n children: ReactNode;\n footer?: ReactNode;\n /** While busy the backdrop and Escape do not close it. */\n busy?: boolean;\n role?: 'dialog' | 'alertdialog';\n}\n\nexport function BottomSheet({ open, onClose, title, children, footer, busy = false, role = 'dialog' }: BottomSheetProps) {\n const panel = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const close = useCallback(() => {\n if (!busy) onClose();\n }, [busy, onClose]);\n useFocusTrap({ open, containerRef: panel, onClose: close });\n if (!open) return null;\n return createPortal(\n <div className={styles.sheetBackdrop} onMouseDown={(e) => e.target === e.currentTarget && close()}>\n <div ref={panel} className={styles.sheet} role={role} aria-modal=\"true\" aria-labelledby={titleId} tabIndex={-1}>\n <span className={styles.grabber} aria-hidden=\"true\" />\n <h2 id={titleId} className={styles.sheetTitle}>{title}</h2>\n <div className={styles.sheetBody}>{children}</div>\n {footer ? <div className={styles.sheetFooter}>{footer}</div> : null}\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":"yLAyBA,SAAgB,EAAY,CAAE,OAAM,UAAS,QAAO,WAAU,SAAQ,OAAO,GAAO,OAAO,UAA8B,CACvH,IAAM,GAAA,EAAQ,EAAA,OAAA,CAAuB,IAAI,EACnC,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAQ,EAAA,YAAA,KAAkB,CACzB,GAAM,EAAQ,CACrB,EAAG,CAAC,EAAM,CAAO,CAAC,EAGlB,OAFA,EAAa,CAAE,OAAM,aAAc,EAAO,QAAS,CAAM,CAAC,EACrD,GACL,EAAO,EAAA,aAAA,EACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAe,YAAc,GAAM,EAAE,SAAW,EAAE,eAAiB,EAAM,EAC9F,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,IAAK,EAAO,UAAW,EAAO,MAAa,OAAM,aAAW,OAAO,kBAAiB,EAAS,SAAU,GAA5G,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,cAAY,MAAQ,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,WAAa,SAAA,CAAU,CAAA,GAC1D,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UAAY,UAAc,CAAA,EAChD,GAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAc,SAAA,CAAY,CAAA,EAAI,IAC5D,GACF,CAAA,EACL,SAAS,IACX,EAXkB,IAYpB"}
@@ -1,2 +0,0 @@
1
- import{f as e}from"./verse-model-CkF3q2IH.js";var t=[`all`,`running`,`needs-you`,`pinned`],n={all:`All`,running:`Running`,"needs-you":`Needs you`,pinned:`Pinned`};function r(e){let t=new Set;for(let n of e)n.subject.sessionId&&t.add(n.subject.sessionId),n.target.kind===`session`&&t.add(n.target.sessionId);return t}var i=72;function a(e){if(!e)return null;if(e.phase===`tool`&&e.tool)return e.tool;if(e.thinkingTail&&e.thinkingTail.trim()){let t=e.thinkingTail.replace(/\s+/g,` `).trim();return t.length>i?`…${t.slice(t.length-i+1).trimStart()}`:t}switch(e.phase){case`thinking`:return`Thinking`;case`writing`:return`Writing`;case`waiting`:return`Waiting for the model`;case`tool`:return`Running a tool`;default:return null}}function o(e,t){return e?.sessions[t]??null}function s(t){let{sessions:n,projects:i,query:s,filter:c,activity:l,meta:u,localSeen:d,selectedId:f}=t,p=new Map((l?.running??[]).map(e=>[e.sessionId,e])),m=r(l?.needsYou??[]),h=u!==null,g=new Map;for(let e of n){let t=o(u,e.id),n=p.get(e.id),r=e.status===`running`||n!==void 0,i=t?.seenTurnCount??null,s=Math.max(i??-1,d.get(e.id)??-1),c=h?Math.max(s,0):s,_=e.id!==f&&c>=0&&e.turnCount>c?e.turnCount-c:0,v=l?m.has(e.id):e.status===`error`,y=r?{kind:`running`,startedAt:n?.startedAt??null}:e.status===`error`?{kind:`failed`}:_>0?{kind:`unread`,newTurns:_}:{kind:`time`,at:e.updatedAt},b=r?a(n?.live??null):null;g.set(e.id,{session:e,status:y,live:b===null?null:{text:b,startedAt:n?.startedAt??null},pinned:t?.pinned===!0,archived:t?.archived===!0,needsYou:v})}let _=[...g.values()],v={all:_.filter(e=>!e.archived).length,running:_.filter(e=>e.status.kind===`running`).length,"needs-you":_.filter(e=>e.needsYou).length,pinned:_.filter(e=>e.pinned&&!e.archived).length},y=e(_.filter(e=>{switch(c){case`running`:return e.status.kind===`running`;case`needs-you`:return e.needsYou;case`pinned`:return e.pinned;default:return!0}}).map(e=>e.session),i,s),b=[],x=[],S=[],C=[];for(let e of y){let t=[];for(let n of e.sessions){let e=g.get(n.id);e.archived?S.push(e):e.pinned?x.push(e):t.push(e)}t.length>0&&C.push({id:`project:${e.projectPath}`,kind:`project`,label:e.name,projectPath:e.projectPath,enrolled:e.enrolled,rows:t})}let w=(e,t)=>t.session.updatedAt.localeCompare(e.session.updatedAt);return x.length>0&&b.push({id:`pinned`,kind:`pinned`,label:`Pinned`,projectPath:null,enrolled:!1,rows:x.sort(w)}),b.push(...C),S.length>0&&b.push({id:`archived`,kind:`archived`,label:`Archived`,projectPath:null,enrolled:!1,rows:S.sort(w)}),{groups:b,counts:v,metaAvailable:h}}export{a as i,n,s as r,t};
2
- //# sourceMappingURL=sidebar-model-BZ9Wh1lR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sidebar-model-BZ9Wh1lR.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/sidebar-model.ts"],"sourcesContent":["/**\n * routes/verse/chat/sidebar-model.ts — the chat list, as data (SPEC-310C §2\n * \"Sidebar\", unit C2).\n *\n * [ All ] [ Running 2 ] [ Needs you 1 ] [ Pinned 3 ]\n * PINNED ▸ rows\n * <project> … ▸ rows, most recently touched project first\n * ARCHIVED (12) ▸ collapsed\n *\n * Each row states ONE status, the most urgent that applies:\n *\n * running a pulse and the elapsed time — plus a muted second line from\n * activity.live (\"npm test\", or the tail of the live reasoning);\n * failed the last turn errored;\n * unread a turn finished since the operator last looked;\n * time otherwise, how long ago it was touched.\n *\n * The inputs are three sources of different reliability, and the model is\n * explicit about what each is allowed to claim:\n * - the session list (always present): status, turnCount, updatedAt;\n * - activity (C1's route; null until it lands): who is running and what\n * they are doing, and the Needs-you items;\n * - session meta (C1's route; null until it lands): pinned, archived, and\n * how far the operator has read. With no meta, NOTHING is unread — an\n * unknown read state is not an unread one (honesty rule: null = unknown).\n *\n * Pure: no React, no fetch.\n */\nimport type { VerseProject, VerseSession } from '../../../data/api-types.js';\nimport type {\n NeedsYouItem,\n VerseActivityLive,\n VerseActivityResponse,\n VerseSessionMeta,\n VerseSessionMetaResponse,\n} from '../../../../core/verse/workbench-types.js';\nimport { groupSessions } from '../verse-model.js';\n\nexport const SIDEBAR_FILTERS = ['all', 'running', 'needs-you', 'pinned'] as const;\nexport type SidebarFilter = (typeof SIDEBAR_FILTERS)[number];\n\nexport const SIDEBAR_FILTER_LABEL: Readonly<Record<SidebarFilter, string>> = {\n all: 'All',\n running: 'Running',\n 'needs-you': 'Needs you',\n pinned: 'Pinned',\n};\n\nexport type RowStatus =\n | { kind: 'running'; startedAt: string | null }\n | { kind: 'failed' }\n | { kind: 'unread'; newTurns: number }\n | { kind: 'time'; at: string };\n\nexport interface SidebarRow {\n session: VerseSession;\n status: RowStatus;\n /** The running chat's muted second line; null when it is not running or nothing is known. */\n live: { text: string; startedAt: string | null } | null;\n pinned: boolean;\n archived: boolean;\n needsYou: boolean;\n}\n\nexport type SidebarGroupKind = 'pinned' | 'project' | 'archived';\n\nexport interface SidebarGroup {\n id: string;\n kind: SidebarGroupKind;\n label: string;\n /** The project's path (tooltip) for a project group. */\n projectPath: string | null;\n enrolled: boolean;\n rows: SidebarRow[];\n}\n\nexport interface SidebarModel {\n groups: SidebarGroup[];\n counts: Record<SidebarFilter, number>;\n /** Meta is known (C1's route answered) — pin/archive controls can work. */\n metaAvailable: boolean;\n}\n\nexport interface SidebarInput {\n sessions: readonly VerseSession[];\n projects: readonly VerseProject[];\n query: string;\n filter: SidebarFilter;\n activity: VerseActivityResponse | null;\n meta: VerseSessionMetaResponse | null;\n /** turnCount this tab has seen per chat (opened here) — clears a dot before the server confirms. */\n localSeen: ReadonlyMap<string, number>;\n /** The open chat is never unread. */\n selectedId: string | null;\n}\n\n/** Ids of chats a Needs-you item points at (as its subject or its target). */\nexport function needsYouSessionIds(items: readonly NeedsYouItem[]): Set<string> {\n const out = new Set<string>();\n for (const item of items) {\n if (item.subject.sessionId) out.add(item.subject.sessionId);\n if (item.target.kind === 'session') out.add(item.target.sessionId);\n }\n return out;\n}\n\nconst THINKING_TAIL_CHARS = 72;\n\n/** \"npm test\" / \"…the tail of what it is thinking\" / \"Writing\" — never a guess. */\nexport function liveLine(live: VerseActivityLive | null): string | null {\n if (!live) return null;\n if (live.phase === 'tool' && live.tool) return live.tool;\n if (live.thinkingTail && live.thinkingTail.trim()) {\n const tail = live.thinkingTail.replace(/\\s+/g, ' ').trim();\n return tail.length > THINKING_TAIL_CHARS ? `…${tail.slice(tail.length - THINKING_TAIL_CHARS + 1).trimStart()}` : tail;\n }\n switch (live.phase) {\n case 'thinking': return 'Thinking';\n case 'writing': return 'Writing';\n case 'waiting': return 'Waiting for the model';\n case 'tool': return 'Running a tool';\n default: return null;\n }\n}\n\nfunction metaFor(meta: VerseSessionMetaResponse | null, id: string): VerseSessionMeta | null {\n return meta?.sessions[id] ?? null;\n}\n\nexport function buildSidebar(input: SidebarInput): SidebarModel {\n const { sessions, projects, query, filter, activity, meta, localSeen, selectedId } = input;\n const running = new Map((activity?.running ?? []).map((r) => [r.sessionId, r]));\n const needs = needsYouSessionIds(activity?.needsYou ?? []);\n const metaAvailable = meta !== null;\n\n const rows = new Map<string, SidebarRow>();\n for (const session of sessions) {\n const m = metaFor(meta, session.id);\n const activityRow = running.get(session.id);\n const isRunning = session.status === 'running' || activityRow !== undefined;\n const serverSeen = m?.seenTurnCount ?? null;\n const seen = Math.max(serverSeen ?? -1, localSeen.get(session.id) ?? -1);\n // Unread needs a KNOWN read state: meta answered (this chat's entry or,\n // absent one, its default of \"never opened\" = 0) or this tab opened it.\n const knownSeen = metaAvailable ? Math.max(seen, 0) : seen;\n const unread = session.id !== selectedId && knownSeen >= 0 && session.turnCount > knownSeen ? session.turnCount - knownSeen : 0;\n // Without activity, a failed chat is the one \"needs you\" signal the list itself carries.\n const needsYou = activity ? needs.has(session.id) : session.status === 'error';\n const status: RowStatus = isRunning\n ? { kind: 'running', startedAt: activityRow?.startedAt ?? null }\n : session.status === 'error'\n ? { kind: 'failed' }\n : unread > 0\n ? { kind: 'unread', newTurns: unread }\n : { kind: 'time', at: session.updatedAt };\n const text = isRunning ? liveLine(activityRow?.live ?? null) : null;\n rows.set(session.id, {\n session,\n status,\n live: text === null ? null : { text, startedAt: activityRow?.startedAt ?? null },\n pinned: m?.pinned === true,\n archived: m?.archived === true,\n needsYou,\n });\n }\n\n const all = [...rows.values()];\n const counts: Record<SidebarFilter, number> = {\n all: all.filter((r) => !r.archived).length,\n running: all.filter((r) => r.status.kind === 'running').length,\n 'needs-you': all.filter((r) => r.needsYou).length,\n pinned: all.filter((r) => r.pinned && !r.archived).length,\n };\n\n const pass = (row: SidebarRow): boolean => {\n switch (filter) {\n case 'running': return row.status.kind === 'running';\n case 'needs-you': return row.needsYou;\n case 'pinned': return row.pinned;\n default: return true;\n }\n };\n\n // Title/project search reuses the 3.9 grouping (same matching, same order).\n const matched = groupSessions(all.filter(pass).map((r) => r.session), projects, query);\n const groups: SidebarGroup[] = [];\n const pinnedRows: SidebarRow[] = [];\n const archivedRows: SidebarRow[] = [];\n const projectGroups: SidebarGroup[] = [];\n for (const group of matched) {\n const projectRows: SidebarRow[] = [];\n for (const session of group.sessions) {\n const row = rows.get(session.id)!;\n if (row.archived) archivedRows.push(row);\n else if (row.pinned) pinnedRows.push(row);\n else projectRows.push(row);\n }\n if (projectRows.length > 0) {\n projectGroups.push({\n id: `project:${group.projectPath}`,\n kind: 'project',\n label: group.name,\n projectPath: group.projectPath,\n enrolled: group.enrolled,\n rows: projectRows,\n });\n }\n }\n const newest = (a: SidebarRow, b: SidebarRow) => b.session.updatedAt.localeCompare(a.session.updatedAt);\n if (pinnedRows.length > 0) groups.push({ id: 'pinned', kind: 'pinned', label: 'Pinned', projectPath: null, enrolled: false, rows: pinnedRows.sort(newest) });\n groups.push(...projectGroups);\n if (archivedRows.length > 0) groups.push({ id: 'archived', kind: 'archived', label: 'Archived', projectPath: null, enrolled: false, rows: archivedRows.sort(newest) });\n return { groups, counts, metaAvailable };\n}\n"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PreviewPane-DubyNi8H.js","assets/global-BWc2NPzv.js","assets/SkipToContent-C7UObcP2.js","assets/VerseConsoleApp-kFOEmnGC.js","assets/RouteErrorBoundary-Cc9GsjZz.js","assets/VerseShared-_pMXKs8m.js","assets/verse-bootstrap-query-BR5ypA8b.js","assets/Segmented-CtwuFlbY.js","assets/icons-U34oiN9M.js","assets/MessageMarkdown-Dkw4V24c.js","assets/Transcript.module-CzROOZJo.js","assets/pane-chrome.module-D7o-fVd0.js","assets/terminal-icons-COMoAiDd.js","assets/global-1SED_aTT.css","assets/SkipToContent-c02H5dmz.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-C5481fH5.css","assets/Segmented-BnjHbKzH.css","assets/Button-DrnKsvnQ.css","assets/EmptyState-B3YUPGaa.css","assets/Transcript-DLeoLRca.css","assets/pane-chrome-8JmEhHVD.css","assets/PreviewPane-DoMsJSG3.css","assets/TerminalPane-DIwGSCA9.js","assets/verse-model-CkF3q2IH.js","assets/compaction-point-VL9oegWS.js","assets/format-CcEKjUou.js","assets/format-D7nBg2bn.js","assets/seat-readiness-CvEmMBol.js","assets/ActionMenu-Bia8Re6u.js","assets/command-catalog-BzHSIzIS.js","assets/terminal-client-DO0eRhRi.js","assets/terminal-view-DkVXx7Xk.js","assets/ActionMenu-DPjsLU1g.css","assets/TerminalPane-BwfMbnJz.css","assets/BranchBar-Bo5b8-hr.js","assets/MutationTokenDialog-D522NXsm.js","assets/Dialog-BYIKNPcH.js","assets/focus-trap-C8MiYlLZ.js","assets/git-model-DL3MwN93.js","assets/use-token-gate-_JPjMD5z.js","assets/GitDialogs-BSTlyNJR.js","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/GitDialogs-ChreZUPG.css","assets/BranchBar-B1I6KeIl.css","assets/DiffPane-D_CC9a5x.js","assets/diff-parser-BnW_HiQm.js","assets/highlight-BCNIvJ85.js","assets/line-diff-B5Eonif2.js","assets/DiffPane.module-CTk5rZn3.js","assets/DiffPane-BAvvbBsf.css","assets/SessionInsightChip-CaPvisvI.js","assets/surface-data-DoN8peNV.js","assets/control-queries-Clgsy_eH.js","assets/mutations-DL4u2kRQ.js","assets/nav-CM-mJcSq.js","assets/mind.module-BJpuH2JT.js","assets/colors-DvK0wMHH.js","assets/calendar-day-BxBYHfX1.js","assets/workspace-model-DRGckE8q.js","assets/mind-B9PzLcl0.css"])))=>i.map(i=>d[i]);
2
- import{n as e,s as t,t as n,u as r}from"./index-BbDqdepe.js";import{t as i}from"./Button-DP2ImS5n.js";import{t as a}from"./EmptyState-BEXDoNZd.js";var o=r(t(),1),s=e(),c={"branch-bar":{path:`git/BranchBar.tsx`,exportName:`BranchBar`,owner:`C5`,kind:`inline`,label:`Branch bar`},"diff-pane":{path:`git/DiffPane.tsx`,exportName:`DiffPane`,owner:`C5`,kind:`pane`,label:`Review`},"terminal-pane":{path:`dock/terminal/TerminalPane.tsx`,exportName:`TerminalPane`,owner:`C4`,kind:`pane`,label:`Terminal`},"preview-pane":{path:`dock/preview/PreviewPane.tsx`,exportName:`PreviewPane`,owner:`C4`,kind:`pane`,label:`Preview`},"session-insight-chip":{path:`mind/SessionInsightChip.tsx`,exportName:`SessionInsightChip`,owner:`C7`,kind:`inline`,label:`Insight`}};Object.keys(c);var l=Object.assign({"../dock/preview/PreviewPane.tsx":()=>n(()=>import(`./PreviewPane-DubyNi8H.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])),"../dock/terminal/TerminalPane.tsx":()=>n(()=>import(`./TerminalPane-DIwGSCA9.js`),__vite__mapDeps([23,1,2,3,4,5,6,24,25,26,27,28,29,8,30,11,12,31,32,13,14,15,16,18,33,19,21,34])),"../git/BranchBar.tsx":()=>n(()=>import(`./BranchBar-Bo5b8-hr.js`),__vite__mapDeps([35,36,1,37,38,3,4,2,5,6,26,27,24,25,28,39,8,40,41,13,42,43,15,14,16,18,44,45])),"../git/DiffPane.tsx":()=>n(()=>import(`./DiffPane-D_CC9a5x.js`),__vite__mapDeps([46,2,47,48,7,39,1,5,6,49,8,50,11,14,17,13,18,19,51,21])),"../mind/SessionInsightChip.tsx":()=>n(()=>import(`./SessionInsightChip-CaPvisvI.js`),__vite__mapDeps([52,1,26,27,5,6,24,25,28,53,54,55,56,3,4,2,57,58,59,60,13,15,14,16,61]))});function u(e,t){return t[`../${c[e].path}`]}function d(e,t=l){return u(e,t)!==void 0}function f(e,t=l){let n=u(e,t);if(!n)return null;let{exportName:r}=c[e];return(0,o.lazy)(async()=>{let t=(await n())[r];if(typeof t!=`function`&&(typeof t!=`object`||!t))throw Error(`${c[e].path} exports no ${r}`);return{default:t}})}var p=new Map;function m(e){return p.has(e)||p.set(e,f(e)),p.get(e)}var h=class extends o.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(e,t){console.error(`[verse] ${this.props.label} failed`,e,t.componentStack)}render(){return this.state.failed?this.props.kind===`inline`?null:(0,s.jsx)(g,{label:this.props.label,onRetry:this.props.onRetry}):this.props.children}};function g({label:e,onRetry:t}){return(0,s.jsx)(a,{compact:!0,tone:`error`,title:`${e} could not load`,body:`The rest of the chat still works.`,action:(0,s.jsx)(i,{variant:`subtle`,size:`sm`,onClick:t,children:`Try again`})})}function _({id:e,props:t,resolve:n=m,forget:r=e=>p.delete(e)}){let[i,a]=(0,o.useState)(0),l=n(e);if(!l)return null;let{kind:u,label:d}=c[e];return(0,s.jsx)(h,{kind:u,label:d,onRetry:()=>{r(e),a(e=>e+1)},children:(0,s.jsx)(o.Suspense,{fallback:null,children:(0,s.jsx)(l,{...t})})},i)}function v(e){return(0,s.jsx)(_,{id:`branch-bar`,props:e})}function y(e){return(0,s.jsx)(_,{id:`diff-pane`,props:e})}function b(e){return(0,s.jsx)(_,{id:`terminal-pane`,props:e})}function x(e){return(0,s.jsx)(_,{id:`preview-pane`,props:e})}function S(e){return(0,s.jsx)(_,{id:`session-insight-chip`,props:e})}export{b as a,S as i,y as n,d as o,x as r,v as t};
3
- //# sourceMappingURL=slots-m3L6Ints.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/slots.tsx"],"sourcesContent":["/**\n * routes/verse/shell/slots.tsx — where Chat mounts other units' UI (unit C0;\n * SPEC-310C §7 \"Slots\").\n *\n * C2 owns the chat, the dock and the header; C4, C5 and C7 own things that\n * render INSIDE them. Rather than C2 importing their files — which would not\n * compile until every one of them landed, and would drag each into C2's\n * chunk — C2 renders these slots. Each resolves ONE fixed file lazily and:\n * - renders nothing until that file lands (and `isSlotAvailable` says so,\n * so C2 can hide the toggle for a pane that does not exist yet);\n * - loads in its own chunk (xterm and the diff viewer stay off the chat's\n * critical path — SPEC-310C budgets: chat critical JS ≤ 350 KB);\n * - is fenced by an error boundary: a crashed inline slot vanishes, a\n * crashed pane says so with a retry — neither takes the chat down.\n *\n * The props below ARE the contract: each owning unit's component takes\n * exactly its slot's props, as a NAMED export (`export function BranchBar`).\n *\n * Resolution uses `import.meta.glob` with literal paths — the same \"absent\n * file is an absent key\" mechanism VerseApp uses for sections.\n */\nimport { Component, Suspense, lazy, useState, type ComponentType, type ErrorInfo, type ReactNode } from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport type { VerseReviewScope, VerseTerminalLaunchVia } from '../../../../core/verse/workbench-types.js';\n\n// ===========================================================================\n// Contracts\n// ===========================================================================\n\n/** Open the Review pane on a root, at a scope (and optionally one file). */\nexport interface DiffPaneRequest {\n root: string;\n scope: VerseReviewScope;\n file?: string;\n}\n\n/** A file the chat's latest turn touched — the Review pane's \"This turn\" scope (C2 derives it from events). */\nexport interface TurnFileChange {\n root: string;\n /** Relative to `root`. */\n path: string;\n}\n\n/** Open the Terminal pane: a tab at `root`, optionally pasting (never running) a command. */\nexport interface TerminalOpenRequest {\n /** Changes on every request, so the same request twice is two opens. */\n nonce: number;\n root?: string;\n /** Force a new tab instead of focusing the root's existing one (⌃⇧`). */\n newTab?: boolean;\n /** \"Run in terminal\": pasted at the prompt, NEVER executed — the operator presses Enter. */\n paste?: string;\n /** Apps [Launch ▸]: the catalog app to launch in the new tab. */\n appId?: string;\n /**\n * With `appId`: HOW to launch it — the app's own CLI (`native`) or through\n * Ollama (`ollama`, with `model` naming the local tag). These mirror\n * VerseTerminalCreateRequest; the page only names the choice, the server\n * resolves the argv from the catalog and the installed binaries\n * (`resolveAppLaunch`) and refuses via/model without an appId.\n */\n via?: VerseTerminalLaunchVia;\n /** With `via: 'ollama'`: the local model tag to launch the app on. */\n model?: string;\n /** Preview's dev-server Start: the server to run in the new tab. */\n devServerId?: string;\n /** 3.15 ⌘K \"Generate command…\": plain words → a command in the focused shell's input editor (never run). */\n assist?: boolean;\n /** 3.15 ⌘K \"Search terminal history…\". */\n history?: boolean;\n /**\n * 3.15: focus this existing tab (a `verse://terminal/<tab>/<block>` link, a\n * notification click, a Needs-you row) and, with `blockId`, show that block.\n */\n tabId?: string;\n blockId?: string;\n /** 3.15: open the launch-configuration dialog (the palette's \"Launch terminal configuration…\"). */\n launch?: boolean;\n}\n\n/** Open the Preview pane on a loopback URL, a chat artifact, or a dev server. */\nexport interface PreviewOpenRequest {\n nonce: number;\n url?: string;\n artifactPath?: string;\n devServerId?: string;\n}\n\n/** C5 `git/BranchBar.tsx` → `export function BranchBar(props: BranchBarProps)` — above the composer. */\nexport interface BranchBarProps {\n sessionId: string;\n /** The chat's roots in priority order; the bar shows one row per root with changes, then \"Show N more\". */\n roots: readonly string[];\n /** The ± counts open the branch diff: C2 opens the dock's Review pane with this. */\n onOpenDiff: (request: DiffPaneRequest) => void;\n}\n\n/** C5 `git/DiffPane.tsx` → `export function DiffPane(props: DiffPaneProps)` — the dock's Review pane. */\nexport interface DiffPaneProps {\n sessionId: string;\n roots: readonly string[];\n /** Latest open request; null = the pane chooses (Uncommitted, first root with changes). */\n request: (DiffPaneRequest & { nonce: number }) | null;\n turnFiles: readonly TurnFileChange[];\n /** \"Add to message\": drafts `path:line: note` into the composer (⌘Enter sends). */\n onAddToMessage: (text: string) => void;\n /** False while the pane is a background tab — stop timers, skip work. */\n visible: boolean;\n}\n\n/** C4 `dock/terminal/TerminalPane.tsx` → `export function TerminalPane(props: TerminalPaneProps)`. */\nexport interface TerminalPaneProps {\n sessionId: string;\n roots: readonly string[];\n request: TerminalOpenRequest | null;\n /** \"Send selection to chat\": the text, already fenced as a code block. */\n onSendToChat: (text: string) => void;\n visible: boolean;\n}\n\n/** C4 `dock/preview/PreviewPane.tsx` → `export function PreviewPane(props: PreviewPaneProps)`. */\nexport interface PreviewPaneProps {\n sessionId: string;\n roots: readonly string[];\n request: PreviewOpenRequest | null;\n /** Dev-server Start runs the server in a terminal tab — through the dock, never directly. */\n onOpenTerminal: (request: Omit<TerminalOpenRequest, 'nonce'>) => void;\n visible: boolean;\n}\n\n/** C7 `mind/SessionInsightChip.tsx` → `export function SessionInsightChip(props)` — the chat header chip. */\nexport interface SessionInsightChipProps {\n sessionId: string;\n}\n\nexport interface SlotPropsMap {\n 'branch-bar': BranchBarProps;\n 'diff-pane': DiffPaneProps;\n 'terminal-pane': TerminalPaneProps;\n 'preview-pane': PreviewPaneProps;\n 'session-insight-chip': SessionInsightChipProps;\n}\n\nexport type SlotId = keyof SlotPropsMap;\n\n/**\n * Each slot's fixed file (relative to routes/verse), its named export, its\n * owner, and how a crash is shown: an INLINE slot vanishes; a PANE fills the\n * dock, so it says it failed and offers a retry.\n */\nexport const SLOTS = {\n 'branch-bar': { path: 'git/BranchBar.tsx', exportName: 'BranchBar', owner: 'C5', kind: 'inline', label: 'Branch bar' },\n 'diff-pane': { path: 'git/DiffPane.tsx', exportName: 'DiffPane', owner: 'C5', kind: 'pane', label: 'Review' },\n 'terminal-pane': { path: 'dock/terminal/TerminalPane.tsx', exportName: 'TerminalPane', owner: 'C4', kind: 'pane', label: 'Terminal' },\n 'preview-pane': { path: 'dock/preview/PreviewPane.tsx', exportName: 'PreviewPane', owner: 'C4', kind: 'pane', label: 'Preview' },\n 'session-insight-chip': { path: 'mind/SessionInsightChip.tsx', exportName: 'SessionInsightChip', owner: 'C7', kind: 'inline', label: 'Insight' },\n} as const satisfies Record<SlotId, { path: string; exportName: string; owner: string; kind: 'inline' | 'pane'; label: string }>;\n\nexport const SLOT_IDS = Object.keys(SLOTS) as SlotId[];\n\n// ===========================================================================\n// Resolution\n// ===========================================================================\n\ntype Importer = () => Promise<unknown>;\n\n/**\n * Every slot file that exists at build time, keyed `../<path>`. Literal\n * patterns (no wildcards): a slot may only ever load its owner's one file.\n * EXPORTED for the slot test, which checks it against SLOTS.\n */\nexport const SLOT_MODULES: Record<string, Importer> = import.meta.glob([\n '../git/BranchBar.tsx',\n '../git/DiffPane.tsx',\n '../dock/terminal/TerminalPane.tsx',\n '../dock/preview/PreviewPane.tsx',\n '../mind/SessionInsightChip.tsx',\n]);\n\nfunction importerFor(id: SlotId, modules: Record<string, Importer>): Importer | undefined {\n return modules[`../${SLOTS[id].path}`];\n}\n\n/** True once the slot's file has landed in this build. */\nexport function isSlotAvailable(id: SlotId, modules: Record<string, Importer> = SLOT_MODULES): boolean {\n return importerFor(id, modules) !== undefined;\n}\n\ntype AnyComponent = ComponentType<Record<string, unknown>>;\n\n/**\n * Build the lazy component for one slot. Absent → renders nothing. Present\n * but exporting no component of the contract name → throws on load, so the\n * boundary shows it (a slot that silently renders nothing because of a typo\n * would look exactly like \"not landed yet\").\n */\nexport function createSlotComponent(id: SlotId, modules: Record<string, Importer> = SLOT_MODULES): AnyComponent | null {\n const importer = importerFor(id, modules);\n if (!importer) return null;\n const { exportName } = SLOTS[id];\n return lazy(async () => {\n const mod = (await importer()) as Record<string, unknown>;\n const exported = mod[exportName];\n if (typeof exported !== 'function' && (typeof exported !== 'object' || exported === null)) {\n throw new Error(`${SLOTS[id].path} exports no ${exportName}`);\n }\n return { default: exported as AnyComponent };\n });\n}\n\n// One lazy component per slot for the life of the page: re-creating it per\n// render would remount the pane (and drop a terminal's scrollback) each time.\nconst RESOLVED = new Map<SlotId, AnyComponent | null>();\nfunction slotComponent(id: SlotId): AnyComponent | null {\n if (!RESOLVED.has(id)) RESOLVED.set(id, createSlotComponent(id));\n return RESOLVED.get(id)!;\n}\n\n// ===========================================================================\n// Rendering\n// ===========================================================================\n\ninterface BoundaryProps {\n kind: 'inline' | 'pane';\n label: string;\n /** Drop the cached module and mount a fresh boundary (a failed lazy import stays failed otherwise). */\n onRetry: () => void;\n children: ReactNode;\n}\n\nclass SlotBoundary extends Component<BoundaryProps, { failed: boolean }> {\n override state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n // The console, not the page: operator copy never carries a stack or a path.\n console.error(`[verse] ${this.props.label} failed`, error, info.componentStack);\n }\n\n override render(): ReactNode {\n if (!this.state.failed) return this.props.children;\n if (this.props.kind === 'inline') return null;\n return <PaneFailed label={this.props.label} onRetry={this.props.onRetry} />;\n }\n}\n\nfunction PaneFailed({ label, onRetry }: { label: string; onRetry: () => void }) {\n return (\n <EmptyState\n compact\n tone=\"error\"\n title={`${label} could not load`}\n body=\"The rest of the chat still works.\"\n action={\n <Button variant=\"subtle\" size=\"sm\" onClick={onRetry}>\n Try again\n </Button>\n }\n />\n );\n}\n\nfunction SlotHost<K extends SlotId>({\n id,\n props,\n resolve = slotComponent,\n forget = (slot: SlotId) => RESOLVED.delete(slot),\n}: {\n id: K;\n props: SlotPropsMap[K];\n resolve?: (id: SlotId) => AnyComponent | null;\n forget?: (id: SlotId) => void;\n}) {\n const [attempt, setAttempt] = useState(0);\n const Resolved = resolve(id);\n if (!Resolved) return null;\n const { kind, label } = SLOTS[id];\n const retry = () => {\n forget(id);\n setAttempt((n) => n + 1);\n };\n return (\n // A new key per attempt: a fresh boundary AND a fresh lazy component.\n <SlotBoundary key={attempt} kind={kind} label={label} onRetry={retry}>\n <Suspense fallback={null}>\n <Resolved {...(props as unknown as Record<string, unknown>)} />\n </Suspense>\n </SlotBoundary>\n );\n}\n\n/** Test seam: render a slot against an injected module map (fake landed / absent / broken files). */\nexport function SlotForTest<K extends SlotId>({ id, props, modules }: { id: K; props: SlotPropsMap[K]; modules: Record<string, Importer> }) {\n const [cache] = useState(() => new Map<SlotId, AnyComponent | null>());\n const resolve = (slot: SlotId) => {\n if (!cache.has(slot)) cache.set(slot, createSlotComponent(slot, modules));\n return cache.get(slot)!;\n };\n return <SlotHost id={id} props={props} resolve={resolve} forget={(slot) => cache.delete(slot)} />;\n}\n\nexport function BranchBarSlot(props: BranchBarProps) {\n return <SlotHost id=\"branch-bar\" props={props} />;\n}\n\nexport function DiffPaneSlot(props: DiffPaneProps) {\n return <SlotHost id=\"diff-pane\" props={props} />;\n}\n\nexport function TerminalPaneSlot(props: TerminalPaneProps) {\n return <SlotHost id=\"terminal-pane\" props={props} />;\n}\n\nexport function PreviewPaneSlot(props: PreviewPaneProps) {\n return <SlotHost id=\"preview-pane\" props={props} />;\n}\n\nexport function SessionInsightChipSlot(props: SessionInsightChipProps) {\n return <SlotHost id=\"session-insight-chip\" props={props} />;\n}\n"],"file":"slots-m3L6Ints.js"}
@@ -1,4 +0,0 @@
1
- import{C as e,M as t,a as n}from"./global-BWc2NPzv.js";import{t as r}from"./diff-parser-BnW_HiQm.js";import{r as i}from"./VerseShared-_pMXKs8m.js";import{c as a,l as o,o as s,u as c}from"./tool-semantics-DtFU7rvB.js";function l(){return{facts:new Map,counts:new Map,toolText:new Map}}function u(e,t){let n=t?.facts.get(e.toolUseId);if(n&&!(n.pending&&e.result!==null))return n;let r=s({name:e.name,input:e.input,result:e.result});return t&&(t.facts.set(e.toolUseId,r),t.counts.delete(e.toolUseId),t.toolText.delete(e.toolUseId)),r}function d(e){return`verse-note-${e.replace(/[^A-Za-z0-9_-]/g,``)}`}function f(e){return`verse-turn-${e.replace(/[^A-Za-z0-9_-]/g,``)}`}var p={read:0,edit:1,create:2,delete:3};function m(e){let t=0,n=0;for(let i of r(e).files)t+=i.additions,n+=i.deletions;return{additions:t,deletions:n}}function h(e,t,n){let r=n?.counts.get(e);if(r)return r;let i=m(t);return n?.counts.set(e,i),i}function g(e){return e.kind===`thinking`?[e]:e.kind===`toolGroup`?e.items.filter(e=>e.kind===`thinking`):[]}function _(e){return e.kind===`tool`?[e]:e.kind===`toolGroup`?e.items.filter(e=>e.kind===`tool`):[]}function v(e,t=null){let n=new Map,r=[],i=[],a=[],o=()=>{a.length!==0&&(i.push(y(a,n,r,t)),a=[])},s;for(let t of e){let e=`turnId`in t?t.turnId:null;(t.kind===`user`||s!==void 0&&e!==null&&e!==s)&&o(),(t.kind===`user`||s===void 0||e!==null)&&(s=e),a.push(t)}return o(),{turns:i,facts:n,errorAnchors:r}}function y(e,t,n,r){let i=e[0],s=new Map,l=0,f=0,m=0,v=null,y=`running`,x=null,S=null,C=[],w=c(),T={shown:0,hidden:0,durationMs:null,tokens:null},E=e=>{m++,v||=e,n.push(e)};for(let n of e){n.kind===`user`&&S===null&&(S=n.text);for(let e of g(n)){let t=e.redacted||e.text.trim().length===0;t?T.hidden++:T.shown++,e.durationMs!==null&&(T.durationMs=(T.durationMs??0)+e.durationMs);let n=e.estimatedTokens??(t?null:Math.ceil(e.text.trim().length/4));n!==null&&(T.tokens=(T.tokens??0)+n)}n.kind===`source`&&n.turnId!==null&&C.push(n.source);for(let e of _(n)){l++;let n=u(e,r);t.set(e.toolUseId,n),n.action===`command`&&f++,n.failed&&E(`verse-tool-${e.toolUseId.replace(/[^A-Za-z0-9_-]/g,``)}`);for(let t of n.sources)C.push(t.toolUseId?t:{...t,toolUseId:e.toolUseId});b(w,n);let i=n.action;if(i!==`read`&&i!==`edit`&&i!==`create`&&i!==`delete`)continue;let a=n.diff?h(e.toolUseId,n.diff.text,r):{additions:0,deletions:0};for(let t of n.paths){let r=s.get(t)??{path:t,reads:0,edits:0,creates:0,deletes:0,action:i,anchorToolUseId:e.toolUseId,additions:0,deletions:0,failed:!1};i===`read`?r.reads++:i===`edit`?r.edits++:i===`create`?r.creates++:r.deletes++,p[i]>p[r.action]&&(r.action=i,r.anchorToolUseId=e.toolUseId),i!==`read`&&(r.additions+=a.additions,r.deletions+=a.deletions),n.failed&&(r.failed=!0),s.set(t,r)}}switch(n.kind){case`error`:E(d(n.key)),y=`error`;break;case`cancelled`:y=`stopped`;break;case`turn-done`:x=n.durationMs>0?n.durationMs:x,n.ok?y=y===`running`?`ok`:y:y===`running`&&(y=`error`,E(d(n.key)))}}let D=0,O=0;for(let e of s.values())e.action===`read`?w.filesRead++:e.action===`edit`?w.filesEdited++:e.action===`create`?w.filesCreated++:w.filesDeleted++,D+=e.additions,O+=e.deletions;(D>0||O>0)&&(w.additions=D,w.deletions=O);let k=a(C);return w.sources=k.length,w.thoughts=T.shown,w.hiddenThoughts=T.hidden,{key:i.key,turnId:`turnId`in i?i.turnId:null,items:e,prompt:S,at:i.at,citations:k,stats:w,work:o(w),reasoning:T,files:[...s.values()].sort((e,t)=>p[t.action]-p[e.action]||t.additions+t.deletions-(e.additions+e.deletions)||e.path.localeCompare(t.path)),toolCount:l,commandCount:f,errorCount:m,firstErrorAnchor:v,status:y,durationMs:x}}function b(e,t){switch(t.action){case`command`:e.commands++,t.failed&&e.commandsFailed++;break;case`search`:e.codeSearches++;break;case`web`:e.webLookups++;break;case`task`:e.subagents++;break;case`other`:e.otherTools++}t.failed&&e.failed++}function x(e){if(e.length===0)return``;let t={edited:0,created:0,deleted:0,read:0};for(let n of e)n.action===`edit`?t.edited++:n.action===`create`?t.created++:n.action===`delete`?t.deleted++:t.read++;let n=[];return t.created&&n.push(`${t.created} created`),t.edited&&n.push(`${t.edited} edited`),t.deleted&&n.push(`${t.deleted} deleted`),t.read&&n.push(`${t.read} read`),n.join(`, `)}var S=new WeakMap,C=4e3;function w(e,t){let n=t?.toolText.get(e.toolUseId);if(n!==void 0)return n;let r=[e.name];if(typeof e.input==`string`)r.push(e.input.slice(0,C));else if(e.input)try{r.push(JSON.stringify(e.input).slice(0,C))}catch{}e.result&&r.push(e.result.output.slice(0,C));let i=r.join(`
2
- `);return t&&e.result&&t.toolText.set(e.toolUseId,i),i}function T(e,t=null){let n=S.get(e);if(n!==void 0)return n;let r=[],i=e=>{switch(e.kind){case`user`:case`assistant`:case`thinking`:r.push(e.text);break;case`error`:r.push(e.message);break;case`tool`:r.push(w(e,t));break;case`toolGroup`:for(let t of e.items)i(t)}};for(let t of e.items)i(t);let a=r.join(`
3
- `);return S.set(e,a),a}var E=48;function D(e,t,n=null){let r=t.trim().toLowerCase();if(r.length===0)return[];let i=[];for(let t of e){let e=T(t,n),a=e.toLowerCase().indexOf(r);if(a===-1)continue;let o=Math.max(0,a-E),s=Math.min(e.length,a+r.length+E),c=`${o>0?`…`:``}${e.slice(o,s).replace(/\s+/g,` `).trim()}${s<e.length?`…`:``}`;i.push({turnKey:t.key,snippet:c})}return i}function O(e,t=72){let n=e.prompt?.replace(/\s+/g,` `).trim();return n?n.length>t?`${n.slice(0,t-1)}…`:n:e.toolCount>0?`${e.toolCount} tool call${e.toolCount===1?``:`s`}`:`Session note`}var k=`/api/verse/sources/open`;function A(){let t=e();if(!t)throw new i;return t}async function j(e,r,i){await n(k,i===void 0?{sessionId:e,path:r}:{sessionId:e,path:r,line:i},A()),t()}export{x as a,f as c,l as i,O as l,v as n,d as o,m as r,D as s,j as t};
4
- //# sourceMappingURL=sources-queries-DeIlxb3A.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sources-queries-DeIlxb3A.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/turn-model.ts","../../../../../../src/web-ui/routes/verse/reasoning/sources-queries.ts"],"sourcesContent":["/**\n * routes/verse/chat/turn-model.ts — a session as a list of TURNS.\n *\n * `verse-transcript.groupTranscriptItems()` already folds runs of tool calls into\n * one summary row; what it does not do is say where one exchange ends and\n * the next begins. Everything this file exists for needs that boundary: the\n * per-turn file-activity summary (the blast radius of one ask), the outline\n * that makes a fifty-turn session navigable, keyboard movement between\n * turns, and \"jump to the first error in this turn\".\n *\n * Pure over `groupTranscriptItems()`'s output — no React, no DOM, no\n * fetching — so the numbers in the summary can be tested directly against an\n * event log.\n */\nimport type { VerseSource } from '../../../../core/verse/types.js';\nimport { collateSources, describeTurnWork, emptyTurnStats, type VerseCitation, type VerseTurnStats } from '../../../../core/verse/trace.js';\nimport { parseUnifiedDiff } from '../../inbox/diff-parser.js';\nimport type { ToolGroupItem, TranscriptItem, TranscriptRenderItem } from '../verse-store.js';\nimport { readToolFacts, type ToolAction, type ToolFacts } from './tool-semantics.js';\n\nexport type TurnStatus = 'running' | 'ok' | 'error' | 'stopped';\n\n/**\n * Work that survives a transcript rebuild.\n *\n * `buildTurns` runs on EVERY streamed token: `useVerseSession` rebuilds\n * `state.events` per event, `buildTranscript` allocates fresh item objects from\n * it, and both of Transcript's memos therefore miss. Without this, every delta\n * re-derived the semantics of every tool call in the session — including a full\n * LCS diff per Edit payload, which allocates an `Int32Array` up to the 1200-line\n * cap. Fifty moderate edits cost hundreds of milliseconds of main-thread work\n * per frame, on the one surface whose frame budget is already spoken for.\n *\n * Caching is sound because `toolUseId` is a stable identity and a tool call's\n * `{name, input, result}` is immutable ONCE ITS RESULT HAS LANDED\n * (`verse-transcript.buildTranscript` replaces the item object exactly once, when the\n * `tool-result` event arrives). A cached entry derived while the call was still\n * pending is therefore the only one that can go stale, and it is the only one\n * recomputed.\n */\nexport interface TurnCache {\n facts: Map<string, ToolFacts>;\n /** `countDiffLines` over the same immutable diff text. */\n counts: Map<string, { additions: number; deletions: number }>;\n /** Flattened searchable text per tool call — the expensive half of the index. */\n toolText: Map<string, string>;\n}\n\nexport function createTurnCache(): TurnCache {\n return { facts: new Map(), counts: new Map(), toolText: new Map() };\n}\n\n/**\n * Facts for one tool call, reusing the cached instance whenever it is still\n * valid. Exported so a test can assert the second build recomputes nothing.\n */\nexport function cachedToolFacts(\n tool: { toolUseId: string; name: string; input: unknown; result: { output: string; isError: boolean } | null },\n cache: TurnCache | null,\n): ToolFacts {\n const hit = cache?.facts.get(tool.toolUseId);\n // A pending entry must be recomputed once the result lands; anything else is\n // derived from data that can no longer change.\n if (hit && !(hit.pending && tool.result !== null)) return hit;\n const fact = readToolFacts({ name: tool.name, input: tool.input, result: tool.result });\n if (cache) {\n cache.facts.set(tool.toolUseId, fact);\n cache.counts.delete(tool.toolUseId);\n cache.toolText.delete(tool.toolUseId);\n }\n return fact;\n}\n\nexport interface TurnFileEntry {\n path: string;\n reads: number;\n edits: number;\n creates: number;\n deletes: number;\n /** The strongest thing that happened to it: delete > create > edit > read. */\n action: Extract<ToolAction, 'read' | 'edit' | 'create' | 'delete'>;\n /** Tool call to scroll to when the row is clicked. */\n anchorToolUseId: string;\n /** Summed from the diffs the calls carried; 0 when none did. */\n additions: number;\n deletions: number;\n /** At least one call touching this file failed. */\n failed: boolean;\n}\n\nexport interface TurnBlock {\n key: string;\n turnId: string | null;\n items: TranscriptRenderItem[];\n /** The ask that opened the turn, for the outline. */\n prompt: string | null;\n /** ISO stamp of the first item. */\n at: string;\n files: TurnFileEntry[];\n toolCount: number;\n commandCount: number;\n /** Failing tool calls plus logged errors. */\n errorCount: number;\n /** Id of the first failing thing in the turn, for jump-to-error. */\n firstErrorAnchor: string | null;\n status: TurnStatus;\n durationMs: number | null;\n /**\n * V3.15: what this turn drew on, numbered in order of first use — files\n * read (with line ranges), pages fetched, searches run, plus any source the\n * engine or seat reported. De-duplicated within the turn.\n */\n citations: VerseCitation[];\n /** V3.15: counts behind the turn's one-line summary. */\n stats: VerseTurnStats;\n /** V3.15: \"Read 8 files · edited 3 files (+42 −7) · ran 4 commands\" — empty when the turn did no tool work. */\n work: string;\n /** V3.15: the turn's reasoning, totalled. Unknown figures are null, never 0. */\n reasoning: TurnReasoning;\n}\n\nexport interface TurnReasoning {\n /** Blocks with text. */\n shown: number;\n /** Blocks the provider withheld (redacted markers). */\n hidden: number;\n /** Summed over blocks that reported a duration; null when none did. */\n durationMs: number | null;\n /** Summed reasoning tokens (the CLI's estimate, else ~chars/4); null when nothing to count. */\n tokens: number | null;\n}\n\nexport interface TurnModel {\n turns: TurnBlock[];\n /** Facts keyed by toolUseId, so the cards do not re-derive them. */\n facts: Map<string, ToolFacts>;\n /** Every error anchor in document order — the transcript-level jump list. */\n errorAnchors: string[];\n}\n\n/** DOM id for a note (error / stopped / turn-done) so it can be scrolled to. */\nexport function noteAnchorId(key: string): string {\n return `verse-note-${key.replace(/[^A-Za-z0-9_-]/g, '')}`;\n}\n\n/** DOM id for one turn section. */\nexport function turnAnchorId(key: string): string {\n return `verse-turn-${key.replace(/[^A-Za-z0-9_-]/g, '')}`;\n}\n\nconst STRENGTH: Record<TurnFileEntry['action'], number> = { read: 0, edit: 1, create: 2, delete: 3 };\n\n/**\n * Additions/deletions for a unified diff, summed across every file in it.\n *\n * This was a flat scan that skipped any line starting with `---` or `+++` as a\n * file header. Inside a hunk those prefixes are CONTENT, not structure: a\n * deleted line reading `-- a/x` is emitted as `--- a/x`, a Markdown `---` rule\n * deleted is `----`, and a diff of a diff — what editing a `.patch` fixture or\n * running `git diff` over one produces — is made almost entirely of them. Every\n * such line was dropped, so the `+N −M` on the collapsed tool card undercounted\n * exactly the changes that are hardest to eyeball.\n *\n * Delegating to the shared parser (`routes/inbox/diff-parser.ts`) fixes that\n * and retires the second diff dialect: `DiffBlock` renders `file.additions` /\n * `file.deletions` out of this same parse, so the badge on the summary line and\n * the stats in the expanded block are now the same numbers by construction\n * rather than by two implementations happening to agree.\n *\n * Cost is real but bounded and paid once: `cachedDiffCounts` memoizes by\n * `toolUseId`, and the text is capped at `MAX_FACT_TEXT_CHARS` upstream.\n */\nexport function countDiffLines(text: string): { additions: number; deletions: number } {\n let additions = 0;\n let deletions = 0;\n for (const file of parseUnifiedDiff(text).files) {\n additions += file.additions;\n deletions += file.deletions;\n }\n return { additions, deletions };\n}\n\n/** `countDiffLines` over text that cannot change once cached. */\nfunction cachedDiffCounts(\n toolUseId: string,\n text: string,\n cache: TurnCache | null,\n): { additions: number; deletions: number } {\n const hit = cache?.counts.get(toolUseId);\n if (hit) return hit;\n const counts = countDiffLines(text);\n cache?.counts.set(toolUseId, counts);\n return counts;\n}\n\nfunction thinkingMembers(item: TranscriptRenderItem): Array<Extract<TranscriptItem, { kind: 'thinking' }>> {\n if (item.kind === 'thinking') return [item];\n if (item.kind === 'toolGroup') {\n return (item as ToolGroupItem).items.filter((m): m is Extract<TranscriptItem, { kind: 'thinking' }> => m.kind === 'thinking');\n }\n return [];\n}\n\nfunction toolMembers(item: TranscriptRenderItem): Array<Extract<TranscriptItem, { kind: 'tool' }>> {\n if (item.kind === 'tool') return [item];\n if (item.kind === 'toolGroup') {\n return (item as ToolGroupItem).items.filter((m): m is Extract<TranscriptItem, { kind: 'tool' }> => m.kind === 'tool');\n }\n return [];\n}\n\n/**\n * A new turn opens on a `user` item, or on any item whose turnId differs\n * from the one being accumulated. Items that arrive before the first user\n * message (a resumed session's tail, a session-level error with a null\n * turnId) collect into a leading block rather than being dropped.\n */\nexport function buildTurns(\n items: readonly TranscriptRenderItem[],\n cache: TurnCache | null = null,\n): TurnModel {\n const facts = new Map<string, ToolFacts>();\n const errorAnchors: string[] = [];\n const turns: TurnBlock[] = [];\n\n let current: TranscriptRenderItem[] = [];\n const flush = () => {\n if (current.length === 0) return;\n turns.push(makeTurn(current, facts, errorAnchors, cache));\n current = [];\n };\n\n let turnId: string | null | undefined;\n for (const item of items) {\n const itemTurn = 'turnId' in item ? item.turnId : null;\n const boundary = item.kind === 'user' || (turnId !== undefined && itemTurn !== null && itemTurn !== turnId);\n if (boundary) flush();\n if (item.kind === 'user' || turnId === undefined || itemTurn !== null) turnId = itemTurn;\n current.push(item);\n }\n flush();\n\n return { turns, facts, errorAnchors };\n}\n\nfunction makeTurn(\n items: TranscriptRenderItem[],\n facts: Map<string, ToolFacts>,\n errorAnchors: string[],\n cache: TurnCache | null,\n): TurnBlock {\n const first = items[0]!;\n const byPath = new Map<string, TurnFileEntry>();\n let toolCount = 0;\n let commandCount = 0;\n let errorCount = 0;\n let firstErrorAnchor: string | null = null;\n let status: TurnStatus = 'running';\n let durationMs: number | null = null;\n let prompt: string | null = null;\n\n const sources: VerseSource[] = [];\n const stats = emptyTurnStats();\n const reasoning: TurnReasoning = { shown: 0, hidden: 0, durationMs: null, tokens: null };\n\n const noteError = (anchor: string) => {\n errorCount++;\n if (!firstErrorAnchor) firstErrorAnchor = anchor;\n errorAnchors.push(anchor);\n };\n\n for (const item of items) {\n if (item.kind === 'user' && prompt === null) prompt = item.text;\n\n for (const thought of thinkingMembers(item)) {\n const hidden = thought.redacted || thought.text.trim().length === 0;\n if (hidden) reasoning.hidden++;\n else reasoning.shown++;\n if (thought.durationMs !== null) reasoning.durationMs = (reasoning.durationMs ?? 0) + thought.durationMs;\n const tokens = thought.estimatedTokens ?? (hidden ? null : Math.ceil(thought.text.trim().length / 4));\n if (tokens !== null) reasoning.tokens = (reasoning.tokens ?? 0) + tokens;\n }\n if (item.kind === 'source' && item.turnId !== null) sources.push(item.source);\n\n for (const tool of toolMembers(item)) {\n toolCount++;\n const fact = cachedToolFacts(tool, cache);\n facts.set(tool.toolUseId, fact);\n if (fact.action === 'command') commandCount++;\n if (fact.failed) noteError(`verse-tool-${tool.toolUseId.replace(/[^A-Za-z0-9_-]/g, '')}`);\n for (const source of fact.sources) sources.push(source.toolUseId ? source : { ...source, toolUseId: tool.toolUseId });\n tallyAction(stats, fact);\n\n const action = fact.action;\n if (action !== 'read' && action !== 'edit' && action !== 'create' && action !== 'delete') continue;\n const counts = fact.diff ? cachedDiffCounts(tool.toolUseId, fact.diff.text, cache) : { additions: 0, deletions: 0 };\n for (const path of fact.paths) {\n const entry = byPath.get(path) ?? {\n path,\n reads: 0, edits: 0, creates: 0, deletes: 0,\n action,\n anchorToolUseId: tool.toolUseId,\n additions: 0, deletions: 0,\n failed: false,\n };\n if (action === 'read') entry.reads++;\n else if (action === 'edit') entry.edits++;\n else if (action === 'create') entry.creates++;\n else entry.deletes++;\n if (STRENGTH[action] > STRENGTH[entry.action]) {\n entry.action = action;\n // The row should land on the call that CHANGED the file, not on the\n // read that happened to come first.\n entry.anchorToolUseId = tool.toolUseId;\n }\n if (action !== 'read') {\n entry.additions += counts.additions;\n entry.deletions += counts.deletions;\n }\n if (fact.failed) entry.failed = true;\n byPath.set(path, entry);\n }\n }\n\n switch (item.kind) {\n case 'error':\n noteError(noteAnchorId(item.key));\n status = 'error';\n break;\n case 'cancelled':\n status = 'stopped';\n break;\n case 'turn-done':\n durationMs = item.durationMs > 0 ? item.durationMs : durationMs;\n // A stop already explained itself; `ok:false` after it is not a\n // second failure (the same rule Transcript's `explained` set uses).\n if (item.ok) status = status === 'running' ? 'ok' : status;\n else if (status === 'running') {\n status = 'error';\n noteError(noteAnchorId(item.key));\n }\n break;\n default:\n break;\n }\n }\n\n let additions = 0;\n let deletions = 0;\n for (const entry of byPath.values()) {\n if (entry.action === 'read') stats.filesRead++;\n else if (entry.action === 'edit') stats.filesEdited++;\n else if (entry.action === 'create') stats.filesCreated++;\n else stats.filesDeleted++;\n additions += entry.additions;\n deletions += entry.deletions;\n }\n if (additions > 0 || deletions > 0) {\n stats.additions = additions;\n stats.deletions = deletions;\n }\n const citations = collateSources(sources);\n stats.sources = citations.length;\n stats.thoughts = reasoning.shown;\n stats.hiddenThoughts = reasoning.hidden;\n\n return {\n key: first.key,\n turnId: 'turnId' in first ? first.turnId : null,\n items,\n prompt,\n at: first.at,\n citations,\n stats,\n work: describeTurnWork(stats),\n reasoning,\n // Strongest action first. The map is in first-touch order, and an agentic\n // turn reads widely before editing narrowly — so in read order the three\n // edits in a 40-file turn sit behind \"Show 35 more files\", hiding exactly\n // the rows whose `+N −M` justified the summary in the first place.\n files: [...byPath.values()].sort(\n (a, b) =>\n STRENGTH[b.action] - STRENGTH[a.action] ||\n b.additions + b.deletions - (a.additions + a.deletions) ||\n a.path.localeCompare(b.path),\n ),\n toolCount,\n commandCount,\n errorCount,\n firstErrorAnchor,\n status,\n durationMs,\n };\n}\n\n/** Count one tool call into the turn's summary (files are counted from the per-path map). */\nfunction tallyAction(stats: VerseTurnStats, fact: ToolFacts): void {\n switch (fact.action) {\n case 'command':\n stats.commands++;\n if (fact.failed) stats.commandsFailed++;\n break;\n case 'search':\n stats.codeSearches++;\n break;\n case 'web':\n stats.webLookups++;\n break;\n case 'task':\n stats.subagents++;\n break;\n case 'other':\n stats.otherTools++;\n break;\n default:\n break;\n }\n if (fact.failed) stats.failed++;\n}\n\n/** `12 files · 4 edited, 8 read` — the one-line form for a collapsed summary. */\nexport function describeFiles(files: readonly TurnFileEntry[]): string {\n if (files.length === 0) return '';\n const counts = { edited: 0, created: 0, deleted: 0, read: 0 };\n for (const file of files) {\n if (file.action === 'edit') counts.edited++;\n else if (file.action === 'create') counts.created++;\n else if (file.action === 'delete') counts.deleted++;\n else counts.read++;\n }\n const parts: string[] = [];\n if (counts.created) parts.push(`${counts.created} created`);\n if (counts.edited) parts.push(`${counts.edited} edited`);\n if (counts.deleted) parts.push(`${counts.deleted} deleted`);\n if (counts.read) parts.push(`${counts.read} read`);\n return parts.join(', ');\n}\n\n// ---------------------------------------------------------------------------\n// In-session search\n// ---------------------------------------------------------------------------\n\n/**\n * Everything in a turn that is worth searching, flattened once and cached on\n * the turn object. A rebuilt transcript produces new objects, so the WeakMap\n * lets the old strings go with them.\n */\nconst SEARCH_TEXT = new WeakMap<TurnBlock, string>();\n\n/** Per tool call — a build log should not make one turn megabytes of index. */\nconst TOOL_TEXT_LIMIT = 4000;\n\n/**\n * One tool call flattened for search. Cached by `toolUseId` under the same\n * immutability rule as the facts: `JSON.stringify` of a 4000-char payload per\n * call per keystroke is what made an active query cost the whole session.\n */\nfunction toolSearchText(\n item: Extract<TranscriptItem, { kind: 'tool' }>,\n cache: TurnCache | null,\n): string {\n const hit = cache?.toolText.get(item.toolUseId);\n if (hit !== undefined) return hit;\n const parts: string[] = [item.name];\n if (typeof item.input === 'string') parts.push(item.input.slice(0, TOOL_TEXT_LIMIT));\n else if (item.input) {\n try {\n parts.push(JSON.stringify(item.input).slice(0, TOOL_TEXT_LIMIT));\n } catch {\n /* a payload that will not stringify simply is not searchable */\n }\n }\n if (item.result) parts.push(item.result.output.slice(0, TOOL_TEXT_LIMIT));\n const text = parts.join('\\n');\n // Only cache a finished call: a pending one's output is still to come.\n if (cache && item.result) cache.toolText.set(item.toolUseId, text);\n return text;\n}\n\nexport function turnSearchText(turn: TurnBlock, cache: TurnCache | null = null): string {\n const cached = SEARCH_TEXT.get(turn);\n if (cached !== undefined) return cached;\n const parts: string[] = [];\n const visit = (item: TranscriptRenderItem | TranscriptItem): void => {\n switch (item.kind) {\n case 'user':\n case 'assistant':\n case 'thinking':\n parts.push(item.text);\n break;\n case 'error':\n parts.push(item.message);\n break;\n case 'tool':\n parts.push(toolSearchText(item, cache));\n break;\n case 'toolGroup':\n for (const member of (item as ToolGroupItem).items) visit(member);\n break;\n default:\n break;\n }\n };\n for (const item of turn.items) visit(item);\n const text = parts.join('\\n');\n SEARCH_TEXT.set(turn, text);\n return text;\n}\n\nexport interface TurnMatch {\n turnKey: string;\n /** Text around the first hit, for the outline row. */\n snippet: string;\n}\n\nconst SNIPPET_PAD = 48;\n\n/** Case-insensitive substring search across every turn, in document order. */\nexport function searchTurns(\n turns: readonly TurnBlock[],\n query: string,\n cache: TurnCache | null = null,\n): TurnMatch[] {\n const needle = query.trim().toLowerCase();\n if (needle.length === 0) return [];\n const out: TurnMatch[] = [];\n for (const turn of turns) {\n const haystack = turnSearchText(turn, cache);\n const at = haystack.toLowerCase().indexOf(needle);\n if (at === -1) continue;\n const from = Math.max(0, at - SNIPPET_PAD);\n const to = Math.min(haystack.length, at + needle.length + SNIPPET_PAD);\n const snippet = `${from > 0 ? '…' : ''}${haystack.slice(from, to).replace(/\\s+/g, ' ').trim()}${to < haystack.length ? '…' : ''}`;\n out.push({ turnKey: turn.key, snippet });\n }\n return out;\n}\n\n/** Turn title for the outline: the ask, trimmed to one line. */\nexport function turnTitle(turn: TurnBlock, max = 72): string {\n const source = turn.prompt?.replace(/\\s+/g, ' ').trim();\n if (source) return source.length > max ? `${source.slice(0, max - 1)}…` : source;\n if (turn.toolCount > 0) return `${turn.toolCount} tool call${turn.toolCount === 1 ? '' : 's'}`;\n return 'Session note';\n}\n","/**\n * routes/verse/reasoning/sources-queries.ts — the write behind a transcript\n * turn's \"Sources\" list (core/verse/sources-api.ts).\n *\n * POST /api/verse/sources/open {sessionId, path, line?} → {ok} (editor at a line)\n *\n * The server confines `path` to the chat's own folders; a refusal surfaces as\n * the apiPost error. Pulls the held mutation token and touches the hold.\n */\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { apiPost } from '../../../data/client.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const SOURCES_OPEN_PATH = '/api/verse/sources/open';\n\nfunction token(): string {\n const t = getMutationToken();\n if (!t) throw new VerseMutationLockedError();\n return t;\n}\n\nexport async function openSourceFile(sessionId: string, path: string, line?: number): Promise<void> {\n await apiPost<{ ok: true }>(SOURCES_OPEN_PATH, line === undefined ? { sessionId, path } : { sessionId, path, line }, token());\n touchMutationHold();\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{i as e}from"./index-BbDqdepe.js";import{H as t,O as n,S as r,V as i,j as a,w as o}from"./global-BWc2NPzv.js";var s=[`runs`,`swarms`,`inbox`,`daemon`,`daemon-observation`,`fleet-activity-ping`,`fleet-activity-observation`,`snapshot`,`session-expired`],c={runs:[`runs`],swarms:[`swarms`],inbox:[`inbox`],daemon:[`daemon`,`control-snapshot`,`verse-control`,`verse-usage-control`,`verse-caps`],"daemon-observation":[`daemon`,`control-snapshot`,`verse-control`,`verse-usage-control`,`verse-caps`],"fleet-activity-ping":[`fleet-activity`,`fleet`],"fleet-activity-observation":[`fleet-activity`,`fleet`],snapshot:[`dashboard-snapshot`,`agent-os-snapshot`],"session-expired":[]},l=new Map,u=null,d=null,f=0;function p(){return Math.min(1e3*2**f,15e3)}function m(){u&&=(u.close(),null),d&&=(clearTimeout(d),null)}function h(){d||=setTimeout(()=>{d=null,f+=1,g()},p())}function g(){if(e()){m();return}if(r().phase!==`authenticated`)return;m();let a=`/api/events?client=${encodeURIComponent(o())}`,d=new EventSource(a,{withCredentials:!0});u=d,d.onopen=()=>{f=0};for(let e of s)d.addEventListener(e,r=>{let a=r,o;try{o=JSON.parse(a.data)}catch{o=void 0}for(let t of c[e])i(t);e===`inbox`&&(t(`inbox-list:`),t(`proposal-detail-`)),e===`session-expired`&&n();let s=l.get(e);if(s)for(let e of s)e(o)});d.onerror=()=>{d.close(),u===d&&(u=null),r().phase===`authenticated`&&h()}}function _(e,t){let n=l.get(e);return n||(n=new Set,l.set(e,n)),n.add(t),()=>n.delete(t)}a(()=>{r().phase===`authenticated`?(f=0,g()):m()}),r().phase===`authenticated`&&g();export{s as SSE_EVENT_NAMES,_ as onSseEvent};
2
- //# sourceMappingURL=sse-CK65-Cun.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sse-CK65-Cun.js","names":[],"sources":["../../../../../../src/web-ui/data/sse.ts"],"sourcesContent":["/**\n * data/sse.ts — the live channel. One EventSource against /api/events for\n * the whole app, fanning out NAMED events (see api.ts handleSseEvents:\n * 'runs' | 'swarms' | 'inbox' | 'daemon' | 'daemon-observation' |\n * 'fleet-activity-ping' | 'fleet-activity-observation' | 'snapshot') to\n * subscribers, and invalidating the matching cache key so any mounted\n * useQuery(key) re-fetches in the background.\n *\n * The server polls disk at a fixed interval (api.ts SSE_POLL_MS, ~1.5s at\n * time of writing) — that is the real latency floor for \"live\". This layer\n * does not, and should not, try to beat that; it just makes sure the UI\n * never polls MORE often than the server already pushes.\n */\nimport { getReadClientProof, getAuthSnapshot, reportSessionExpired, subscribeAuth } from './auth-store.js';\nimport { invalidate, invalidatePrefix } from './cache.js';\nimport { isScopedConsolePath } from '../app/console-mode.js';\n\nexport const SSE_EVENT_NAMES = [\n 'runs',\n 'swarms',\n 'inbox',\n 'daemon',\n 'daemon-observation',\n 'fleet-activity-ping',\n 'fleet-activity-observation',\n 'snapshot',\n 'session-expired',\n] as const;\nexport type SseEventName = (typeof SSE_EVENT_NAMES)[number];\n\n/** Cache keys (see data/queries.ts) invalidated when a given SSE event fires. */\nconst EVENT_TO_CACHE_KEYS: Record<SseEventName, string[]> = {\n runs: ['runs'],\n swarms: ['swarms'],\n inbox: ['inbox'],\n // 'daemon' was previously mapped but nothing subscribed to a 'daemon'-keyed\n // query (control/daemon didn't exist yet) — now daemonObservationQuery\n // (data/queries.ts) does. Also refreshing 'control-snapshot' here so\n // /control/daemon and /control/security (both read off controlSnapshotQuery)\n // stay live on the same daemon-tick cadence instead of only on page load.\n // `/api/verse/control` and `/api/verse/audit` ARE the daemon projection, so\n // they ride the same signal. Without this the Autonomy cockpit — running\n // state, last tick outcome, today's spend against the cap — was frozen at\n // whatever was true when the section mounted, and DEFAULT_QUERY_FRESH_MS\n // then made a rail switch away and back inside 10s a no-op too.\n //\n // Deliberately NOT a coarse `verse-` prefix sweep: `verse-usage-accounts`\n // and `verse-usage-local-models` spawn provider probes, and firing those on\n // every daemon tick would turn a liveness fix into a process storm. Those\n // two poll on their own visibility-gated 30s cadence in UsageSection,\n // matching the collector's cycle.\n daemon: ['daemon', 'control-snapshot', 'verse-control', 'verse-usage-control', 'verse-caps'],\n 'daemon-observation': ['daemon', 'control-snapshot', 'verse-control', 'verse-usage-control', 'verse-caps'],\n // fleet-activity pings are the closest live signal fleet state changed;\n // 'fleet' (fleetStatusQuery, /control/fleet's queue depth + lease health)\n // has no dedicated SSE event of its own, so it rides these instead of only\n // refreshing on mount.\n 'fleet-activity-ping': ['fleet-activity', 'fleet'],\n 'fleet-activity-observation': ['fleet-activity', 'fleet'],\n // Agent OS snapshots are immutable records but their current authenticated\n // projection advances alongside the server's general snapshot signal.\n snapshot: ['dashboard-snapshot', 'agent-os-snapshot'],\n 'session-expired': [],\n};\n\ntype RawListener = (payload: unknown) => void;\nconst rawListeners = new Map<SseEventName, Set<RawListener>>();\n\nlet source: EventSource | null = null;\nlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet reconnectAttempt = 0;\n\nfunction backoffMs(): number {\n // 1s, 2s, 4s, 8s, capped at 15s — the server's own poll floor is ~1.5s so\n // there is no benefit reconnecting faster than that even on attempt 0.\n return Math.min(1000 * 2 ** reconnectAttempt, 15_000);\n}\n\nfunction teardown(): void {\n if (source) {\n source.close();\n source = null;\n }\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n}\n\nfunction scheduleReconnect(): void {\n if (reconnectTimer) return;\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n reconnectAttempt += 1;\n connect();\n }, backoffMs());\n}\n\nfunction connect(): void {\n // Shared hooks import this module, but the dedicated console has no global\n // Hub event channel. Check on every reconnect, not just the initial import.\n if (isScopedConsolePath()) { teardown(); return; }\n if (getAuthSnapshot().phase !== 'authenticated') return;\n teardown();\n\n const url = `/api/events?client=${encodeURIComponent(getReadClientProof())}`;\n const es = new EventSource(url, { withCredentials: true });\n source = es;\n\n es.onopen = () => {\n reconnectAttempt = 0;\n };\n\n for (const name of SSE_EVENT_NAMES) {\n es.addEventListener(name, (evt) => {\n const messageEvent = evt as MessageEvent<string>;\n let payload: unknown = undefined;\n try {\n payload = JSON.parse(messageEvent.data);\n } catch {\n payload = undefined;\n }\n for (const key of EVENT_TO_CACHE_KEYS[name]) invalidate(key);\n if (name === 'inbox') {\n // Parameterized inbox queries (one cache key per filter combo / per\n // proposal id) aren't in EVENT_TO_CACHE_KEYS's static map — sweep\n // both prefixes so the list (any filter) and any open detail view\n // (proposalDetailQuery, data/queries.ts) live-update on the same\n // 'inbox' event as the unfiltered badge.\n invalidatePrefix('inbox-list:');\n invalidatePrefix('proposal-detail-');\n }\n if (name === 'session-expired') reportSessionExpired();\n const listeners = rawListeners.get(name);\n if (listeners) for (const l of listeners) l(payload);\n });\n }\n\n es.onerror = () => {\n // EventSource auto-retries on its own, but its built-in retry delay is\n // opaque and can hammer a server that just lost its read session. Close\n // it and drive reconnection ourselves so we stop entirely once\n // auth-store reports the session as expired (see the subscribeAuth\n // wiring at the bottom of this file).\n es.close();\n if (source === es) source = null;\n if (getAuthSnapshot().phase === 'authenticated') scheduleReconnect();\n };\n}\n\n/** Subscribe to one named SSE event's raw payload (rarely needed directly —\n * most views should prefer useQuery + the cache-key mapping above). */\nexport function onSseEvent(name: SseEventName, listener: RawListener): () => void {\n let set = rawListeners.get(name);\n if (!set) {\n set = new Set();\n rawListeners.set(name, set);\n }\n set.add(listener);\n return () => set!.delete(listener);\n}\n\n// Connect once authenticated; disconnect the instant the session drops so a\n// stale connection never masks a 401 the rest of the app needs to react to.\nsubscribeAuth(() => {\n const phase = getAuthSnapshot().phase;\n if (phase === 'authenticated') {\n reconnectAttempt = 0;\n connect();\n } else {\n teardown();\n }\n});\n\n// Dynamic loading may finish after the session probe. Join the live feed in\n// that case too; otherwise it would wait for the next auth state change.\nif (getAuthSnapshot().phase === 'authenticated') connect();\n"],"mappings":"oHAiBA,IAAa,EAAkB,CAC7B,OACA,SACA,QACA,SACA,qBACA,sBACA,6BACA,WACA,iBACF,EAIM,EAAsD,CAC1D,KAAM,CAAC,MAAM,EACb,OAAQ,CAAC,QAAQ,EACjB,MAAO,CAAC,OAAO,EAiBf,OAAQ,CAAC,SAAU,mBAAoB,gBAAiB,sBAAuB,YAAY,EAC3F,qBAAsB,CAAC,SAAU,mBAAoB,gBAAiB,sBAAuB,YAAY,EAKzG,sBAAuB,CAAC,iBAAkB,OAAO,EACjD,6BAA8B,CAAC,iBAAkB,OAAO,EAGxD,SAAU,CAAC,qBAAsB,mBAAmB,EACpD,kBAAmB,CAAC,CACtB,EAGM,EAAe,IAAI,IAErB,EAA6B,KAC7B,EAAuD,KACvD,EAAmB,EAEvB,SAAS,GAAoB,CAG3B,OAAO,KAAK,IAAI,IAAO,GAAK,EAAkB,IAAM,CACtD,CAEA,SAAS,GAAiB,CACxB,AAEE,KADA,EAAO,MAAM,EACJ,MAEX,AAEE,KADA,aAAa,CAAc,EACV,KAErB,CAEA,SAAS,GAA0B,CAC7B,AACJ,IAAiB,eAAiB,CAChC,EAAiB,KACjB,GAAoB,EACpB,EAAQ,CACV,EAAG,EAAU,CAAC,CAChB,CAEA,SAAS,GAAgB,CAGvB,GAAI,EAAoB,EAAG,CAAE,EAAS,EAAG,MAAQ,CACjD,GAAI,EAAgB,CAAC,CAAC,QAAU,gBAAiB,OACjD,EAAS,EAET,IAAM,EAAM,sBAAsB,mBAAmB,EAAmB,CAAC,IACnE,EAAK,IAAI,YAAY,EAAK,CAAE,gBAAiB,EAAK,CAAC,EACzD,EAAS,EAET,EAAG,WAAe,CAChB,EAAmB,CACrB,EAEA,IAAK,IAAM,KAAQ,EACjB,EAAG,iBAAiB,EAAO,GAAQ,CACjC,IAAM,EAAe,EACjB,EACJ,GAAI,CACF,EAAU,KAAK,MAAM,EAAa,IAAI,CACxC,MAAQ,CACN,EAAU,IAAA,EACZ,CACA,IAAK,IAAM,KAAO,EAAoB,GAAO,EAAW,CAAG,EACvD,IAAS,UAMX,EAAiB,aAAa,EAC9B,EAAiB,kBAAkB,GAEjC,IAAS,mBAAmB,EAAqB,EACrD,IAAM,EAAY,EAAa,IAAI,CAAI,EACvC,GAAI,EAAW,IAAK,IAAM,KAAK,EAAW,EAAE,CAAO,CACrD,CAAC,EAGH,EAAG,YAAgB,CAMjB,EAAG,MAAM,EACL,IAAW,IAAI,EAAS,MACxB,EAAgB,CAAC,CAAC,QAAU,iBAAiB,EAAkB,CACrE,CACF,CAIA,SAAgB,EAAW,EAAoB,EAAmC,CAChF,IAAI,EAAM,EAAa,IAAI,CAAI,EAM/B,OALK,IACH,EAAM,IAAI,IACV,EAAa,IAAI,EAAM,CAAG,GAE5B,EAAI,IAAI,CAAQ,MACH,EAAK,OAAO,CAAQ,CACnC,CAIA,MAAoB,CACJ,EAAgB,CAAC,CAAC,QAClB,iBACZ,EAAmB,EACnB,EAAQ,GAER,EAAS,CAEb,CAAC,EAIG,EAAgB,CAAC,CAAC,QAAU,iBAAiB,EAAQ"}
@@ -1,2 +0,0 @@
1
- import{C as e,M as t,V as n,a as r,i,t as a}from"./global-BWc2NPzv.js";import{k as o}from"./VerseShared-_pMXKs8m.js";import{n as s}from"./control-queries-Clgsy_eH.js";var c=`/api/verse/authority`,l=`/api/verse/authority/draft`,u=`/api/verse/fleet/live`,d=`/api/verse/leader`,f=`/api/verse/learning`,p=`/api/verse/fleet/history?days=90`;function m(e=new Date){return`${p}&tz=${e.getTimezoneOffset()}`}var h=`/api/reasoning/digest?days=30`,g=`/api/verse/budget/history?days=8`,_=Object.freeze({authority:`verse-authority`,authorityDraft:`verse-authority-draft`,authorityEliteDraft:`verse-authority-draft-elite`,fleetLive:`verse-fleet-live`,leader:`verse-leader`,learning:`verse-learning`,fleetHistory:`verse-fleet-history-90d`,reasoningDigest:`verse-reasoning-digest-30d`,seatHistory:`verse-seat-history-8d`});function v(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var y={authority(e){return v(e)&&e.v===1&&typeof e.switch==`string`&&v(e.grant)?e:null},draft(e){return v(e)&&v(e.payload)&&typeof e.digest==`string`?e:null},fleetLive(e){return v(e)&&e.v===1&&Array.isArray(e.runs)&&Array.isArray(e.repos)&&Array.isArray(e.lanes)&&v(e.summary)?e:null},leader(e){return v(e)&&e.v===1&&Array.isArray(e.timeline)&&Array.isArray(e.actions)&&v(e.hitRate)?e:null},learning(e){return v(e)&&e.v===1&&Array.isArray(e.versions)&&Array.isArray(e.experiments)?e:null},activity(e){return v(e)&&Array.isArray(e.needsYou)&&Array.isArray(e.running)&&v(e.sources)?e:null},fleetHistory(e){return v(e)&&Array.isArray(e.days)&&v(e.sources)&&v(e.funnel)?e:null},reasoningDigest(e){return v(e)&&Array.isArray(e.insights)&&Array.isArray(e.trends)&&v(e.totals)?e:null},seatHistory(e){return v(e)&&e.v===1&&Array.isArray(e.series)?e:null}};function b(e,t){return t instanceof a?t.status===404?`${e} is not in this build yet, so this card has no source.`:t.status===503?`${e} failed to load on the server.`:t.detail&&t.status<500?/[.!?]$/.test(t.detail)?t.detail:`${t.detail}.`:`${e} answered HTTP ${t.status}.`:`${e} could not be reached.`}function x(e,t,n,r){return{key:e,fetch:async e=>{try{let n=r(await i(typeof t==`function`?t():t,e));return n===null?{value:null,available:!0,reason:`Unrecognized response — update Ashlr.`}:{value:n,available:!0,reason:null}}catch(e){if(e instanceof a&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{value:null,available:!1,reason:b(n,e),code:e instanceof a?e.code:null}}}}}var S=x(_.authority,c,`The authority service`,y.authority),C=x(_.authorityDraft,l,`The grant draft`,y.draft),w=x(_.authorityEliteDraft,`${l}?eliteDirect=1`,`The elite-direct grant draft`,y.draft),T=x(_.fleetLive,u,`The live fleet view`,y.fleetLive),E=x(_.leader,d,`The Leader`,y.leader),D=x(_.learning,f,`Self-improvement`,y.learning),O=x(_.fleetHistory,()=>m(),`Fleet history`,y.fleetHistory),k=x(_.reasoningDigest,h,`The reasoning digest`,y.reasoningDigest),A=x(_.seatHistory,g,`Seat history`,y.seatHistory);async function j(n,i){let a=e();if(!a)throw new s;let o=await r(n,i,a);return t(),o}async function M(e){let t=await j(c,e);return n(_.authority),n(_.fleetLive),o(),(e.action===`grant`||e.action===`re-approve`)&&(n(_.authorityDraft),n(_.authorityEliteDraft)),y.authority(t)}async function N(e){let t=await j(u,e);return n(_.fleetLive),o(),t}async function P(e){let t=await j(d,e);return n(_.leader),o(),t}async function F(e,t){if(!/^\/api\/[^\s\\]*$/.test(e)||e.startsWith(`//`)||e.includes(`..`))throw Error(`That action points outside this app, so it was not sent.`);let r=await j(e,t);return o(),n(_.fleetLive),n(_.leader),n(_.authority),r}export{S as a,E as c,M as d,N as f,A as g,k as h,w as i,D as l,F as m,_ as n,O as o,P as p,C as r,T as s,l as t,x as u};
2
- //# sourceMappingURL=surface-data-DoN8peNV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"surface-data-DoN8peNV.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface-data.ts"],"sourcesContent":["/**\n * routes/verse/command/surface-data.ts — every read and write behind the\n * four 3.10 surfaces (Command, Fleet, Growth, Mind), in one place (unit C7).\n *\n * GET /api/verse/authority AuthorityStatusV1 (B-U1)\n * GET /api/verse/authority/draft AuthorityGrantDraft (B-U1)\n * POST /api/verse/authority AuthorityActionRequest\n * GET /api/verse/fleet/live FleetLiveSnapshotV1 (B-U5)\n * POST /api/verse/fleet/live FleetLiveActionRequest\n * GET /api/verse/leader LeaderStateV1 (B-U8)\n * POST /api/verse/leader LeaderActionRequest\n * GET /api/verse/learning LearningStateV1 (B-U9)\n * GET /api/verse/activity VerseActivityResponse (C1 — read through\n * the shell's ONE useActivity poll, never a\n * second loop from here)\n * GET /api/verse/fleet/history FleetHistoryResponse (A8)\n * GET /api/reasoning/digest ReasoningDigest (A7)\n * GET /api/verse/budget BudgetView (A9 — budget-queries.ts)\n * GET /api/verse/budget/history CapacityHistoryResponse (3.10.1 — recorded\n * seat window history for the burn-downs)\n * GET /api/models per-model ROI (data/queries.ts)\n *\n * WHY every read is OPTIONAL: Track B's modules land in parallel with these\n * surfaces (SPEC-310BC-COORD), and C0's mount answers 404 for a family that\n * has not landed. A 404 is \"this card has no source yet\", never \"Command is\n * broken\" — so a read resolves to `{ value: null, available: false, reason }`\n * and the card renders a designed not-available state from `reason`. A body\n * this client cannot narrow is treated the same way (available, but nothing\n * shown rather than guessed). 401 and aborts still propagate: an expired\n * read session is the whole app's state, not one card's.\n *\n * Writes pull the held mutation token (VerseControlLockedError without one —\n * the surfaces route every write through useGuardedAction, which opens the\n * token dialog first) and invalidate exactly the keys they change.\n */\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { refreshActivity } from '../shell/useActivity.js';\nimport type { OptionalFleetRead } from '../autonomy/fleet-contract.js';\nimport type {\n AuthorityActionRequest,\n AuthorityGrantDraft,\n AuthorityStatusV1,\n} from '../../../../core/authority/types.js';\nimport type { FleetLiveActionRequest, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { LeaderActionRequest, LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport type { LearningStateV1 } from '../../../../core/learn/harness-types.js';\nimport type { VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { FleetHistoryResponse } from '../../../../core/verse/fleet-history-types.js';\nimport type { ReasoningDigest } from '../../../../core/reasoning/types.js';\nimport type { CapacityHistoryResponse } from '../../../../core/routing/capacity-history-types.js';\n\n/** A read that is allowed to be absent (the autonomy folder's shape, reused). */\nexport type OptionalRead<T> = OptionalFleetRead<T>;\n\nexport const AUTHORITY_PATH = '/api/verse/authority';\nexport const AUTHORITY_DRAFT_PATH = '/api/verse/authority/draft';\nexport const FLEET_LIVE_PATH = '/api/verse/fleet/live';\nexport const LEADER_PATH = '/api/verse/leader';\nexport const LEARNING_PATH = '/api/verse/learning';\nexport const FLEET_HISTORY_PATH = '/api/verse/fleet/history?days=90';\n\n/**\n * FLEET_HISTORY_PATH plus the viewer's zone (`tz`, Date#getTimezoneOffset\n * minutes, which the route accepts). Without it the server bucketed runs by\n * the UTC day (tz defaults to 0), so a Sep 25 evening's runs sat in a\n * \"Sep 26\" column west of UTC. Read at fetch time, so a DST change between\n * polls is picked up.\n */\nexport function fleetHistoryPath(now: Date = new Date()): string {\n return `${FLEET_HISTORY_PATH}&tz=${now.getTimezoneOffset()}`;\n}\nexport const REASONING_DIGEST_PATH = '/api/reasoning/digest?days=30';\n/** Eight days: the whole weekly window plus the day before it opened. */\nexport const SEAT_HISTORY_PATH = '/api/verse/budget/history?days=8';\n\nexport const SURFACE_KEYS = Object.freeze({\n authority: 'verse-authority',\n authorityDraft: 'verse-authority-draft',\n authorityEliteDraft: 'verse-authority-draft-elite',\n fleetLive: 'verse-fleet-live',\n leader: 'verse-leader',\n learning: 'verse-learning',\n fleetHistory: 'verse-fleet-history-90d',\n reasoningDigest: 'verse-reasoning-digest-30d',\n seatHistory: 'verse-seat-history-8d',\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Structural guards: just enough to know the body is the contract's shape\n * (version tag + the arrays the cards iterate), so a mismatched server can\n * never crash a render with `undefined.map`. Field-level honesty (null =\n * unknown) is the cards' job.\n */\nexport const narrow = {\n authority(raw: unknown): AuthorityStatusV1 | null {\n return isRecord(raw) && raw['v'] === 1 && typeof raw['switch'] === 'string' && isRecord(raw['grant']) ? (raw as unknown as AuthorityStatusV1) : null;\n },\n draft(raw: unknown): AuthorityGrantDraft | null {\n return isRecord(raw) && isRecord(raw['payload']) && typeof raw['digest'] === 'string' ? (raw as unknown as AuthorityGrantDraft) : null;\n },\n fleetLive(raw: unknown): FleetLiveSnapshotV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['runs']) && Array.isArray(raw['repos']) && Array.isArray(raw['lanes']) && isRecord(raw['summary'])\n ? (raw as unknown as FleetLiveSnapshotV1)\n : null;\n },\n leader(raw: unknown): LeaderStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['timeline']) && Array.isArray(raw['actions']) && isRecord(raw['hitRate'])\n ? (raw as unknown as LeaderStateV1)\n : null;\n },\n learning(raw: unknown): LearningStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['versions']) && Array.isArray(raw['experiments']) ? (raw as unknown as LearningStateV1) : null;\n },\n activity(raw: unknown): VerseActivityResponse | null {\n return isRecord(raw) && Array.isArray(raw['needsYou']) && Array.isArray(raw['running']) && isRecord(raw['sources']) ? (raw as unknown as VerseActivityResponse) : null;\n },\n fleetHistory(raw: unknown): FleetHistoryResponse | null {\n return isRecord(raw) && Array.isArray(raw['days']) && isRecord(raw['sources']) && isRecord(raw['funnel']) ? (raw as unknown as FleetHistoryResponse) : null;\n },\n reasoningDigest(raw: unknown): ReasoningDigest | null {\n return isRecord(raw) && Array.isArray(raw['insights']) && Array.isArray(raw['trends']) && isRecord(raw['totals']) ? (raw as unknown as ReasoningDigest) : null;\n },\n /** Series and points are re-checked one by one where they are merged (command-model mergeSeatHistory). */\n seatHistory(raw: unknown): CapacityHistoryResponse | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['series']) ? (raw as unknown as CapacityHistoryResponse) : null;\n },\n};\n\n/** Operator words for a source that did not answer (never a path, never a trace). */\nfunction absence(what: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return `${what} is not in this build yet, so this card has no source.`;\n if (err.status === 503) return `${what} failed to load on the server.`;\n // A refusal the route explained (409 with a sentence): say it, not the status.\n if (err.detail && err.status < 500) return /[.!?]$/.test(err.detail) ? err.detail : `${err.detail}.`;\n return `${what} answered HTTP ${err.status}.`;\n }\n return `${what} could not be reached.`;\n}\n\n/** A QueryDef whose value is an OptionalRead: 404 / unreachable / unrecognised all resolve, never throw. */\nexport function optionalQuery<T>(key: string, path: string | (() => string), what: string, guard: (raw: unknown) => T | null): QueryDef<OptionalRead<T>> {\n return {\n key,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(typeof path === 'function' ? path() : path, signal);\n const value = guard(raw);\n if (value === null) {\n // Nothing is shown rather than guessed from an unknown shape.\n return { value: null, available: true, reason: 'Unrecognized response — update Ashlr.' };\n }\n return { value, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { value: null, available: false, reason: absence(what, err), code: err instanceof ApiError ? err.code : null };\n }\n },\n };\n}\n\nexport const authorityQuery = optionalQuery(SURFACE_KEYS.authority, AUTHORITY_PATH, 'The authority service', narrow.authority);\nexport const authorityDraftQuery = optionalQuery(SURFACE_KEYS.authorityDraft, AUTHORITY_DRAFT_PATH, 'The grant draft', narrow.draft);\n/** 3.15: the same draft with the one `elite-direct` rung (elite models land on green tests, no judge). */\nexport const authorityEliteDraftQuery = optionalQuery(SURFACE_KEYS.authorityEliteDraft, `${AUTHORITY_DRAFT_PATH}?eliteDirect=1`, 'The elite-direct grant draft', narrow.draft);\nexport const fleetLiveQuery = optionalQuery(SURFACE_KEYS.fleetLive, FLEET_LIVE_PATH, 'The live fleet view', narrow.fleetLive);\nexport const leaderQuery = optionalQuery(SURFACE_KEYS.leader, LEADER_PATH, 'The Leader', narrow.leader);\nexport const learningQuery = optionalQuery(SURFACE_KEYS.learning, LEARNING_PATH, 'Self-improvement', narrow.learning);\nexport const fleetHistoryQuery = optionalQuery(SURFACE_KEYS.fleetHistory, () => fleetHistoryPath(), 'Fleet history', narrow.fleetHistory);\nexport const reasoningDigestQuery = optionalQuery(SURFACE_KEYS.reasoningDigest, REASONING_DIGEST_PATH, 'The reasoning digest', narrow.reasoningDigest);\n/** Optional like every surface read: a server without the route leaves the burn-downs on this page's own readings. */\nexport const seatHistoryQuery = optionalQuery(SURFACE_KEYS.seatHistory, SEAT_HISTORY_PATH, 'Seat history', narrow.seatHistory);\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/**\n * One authority action. The server answers the new AuthorityStatusV1 for\n * every form; raising past the grant is its 409 `grant-required` (the page\n * opens the Touch ID sheet BEFORE ever sending that, but the server is the\n * authority — a stale page gets the refusal, not a raise).\n */\nexport async function postAuthority(action: AuthorityActionRequest): Promise<AuthorityStatusV1 | null> {\n const result = await post<unknown>(AUTHORITY_PATH, action);\n invalidate(SURFACE_KEYS.authority);\n invalidate(SURFACE_KEYS.fleetLive);\n void refreshActivity();\n if (action.action === 'grant' || action.action === 're-approve') {\n invalidate(SURFACE_KEYS.authorityDraft);\n invalidate(SURFACE_KEYS.authorityEliteDraft);\n }\n return narrow.authority(result);\n}\n\nexport async function postFleetLive(action: FleetLiveActionRequest): Promise<unknown> {\n const result = await post<unknown>(FLEET_LIVE_PATH, action);\n invalidate(SURFACE_KEYS.fleetLive);\n void refreshActivity();\n return result;\n}\n\nexport async function postLeader(action: LeaderActionRequest): Promise<unknown> {\n const result = await post<unknown>(LEADER_PATH, action);\n invalidate(SURFACE_KEYS.leader);\n void refreshActivity();\n return result;\n}\n\n/**\n * A Needs-you item's own action. `path` was validated by the producer\n * (isNeedsYouItem → isSafeApiRoute) and is re-checked here: the mutation\n * token must never be aimed anywhere but this origin's /api/.\n */\nexport async function postNeedsYouAction(path: string, body: Record<string, unknown>): Promise<unknown> {\n if (!/^\\/api\\/[^\\s\\\\]*$/.test(path) || path.startsWith('//') || path.includes('..')) {\n throw new Error('That action points outside this app, so it was not sent.');\n }\n const result = await post<unknown>(path, body);\n void refreshActivity();\n invalidate(SURFACE_KEYS.fleetLive);\n invalidate(SURFACE_KEYS.leader);\n invalidate(SURFACE_KEYS.authority);\n return result;\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{z as e}from"./global-BWc2NPzv.js";import{p as t}from"./queries-T7ZUVqyA.js";import{T as n,w as r}from"./VerseShared-_pMXKs8m.js";import{n as i}from"./verse-bootstrap-query-BR5ypA8b.js";import{n as a,t as o}from"./budget-queries-q7mCG9Ek.js";import{r as s}from"./cloud-queries-DQF1a_R-.js";import{a as c,c as l,h as u,l as d,o as f,s as p}from"./surface-data-DoN8peNV.js";import{r as m}from"./overnight-queries-BP6viiM5.js";import{a as h,o as g}from"./thread-data-Dq7QugaD.js";import{n as _,r as v}from"./fleet-control-queries-BLoc5Gza.js";var y={command:[c,p,l,d,f,a,s,g,_],fleet:[p,c,m,a,o,_,v],growth:[f,d,t(`30d`),c,p],mind:[l,g,h,u,i,n,c,p],chat:[i,r,n]},b=6e4;async function x(t,n={}){let r=n.ensure??e;for(let e of y[t]??[])try{if(n.beforeEach&&!await n.beforeEach())return;await r(e.key,()=>e.fetch(),b)}catch{}}export{b as PREFETCH_FRESH_MS,y as SURFACE_PREFETCH,x as prefetchSurfaceData};
2
- //# sourceMappingURL=surface-prefetch-CVNIptSl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"surface-prefetch-CVNIptSl.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/surface-prefetch.ts"],"sourcesContent":["/**\n * routes/verse/shell/surface-prefetch.ts — the reads each rail surface opens\n * with, so the shell can warm them while the operator is still reading chat\n * (shell/warmup.ts, once the operator is idle after first paint). A first\n * visit to Command, Fleet, Growth or Mind then paints from the cache instead\n * of a skeleton; the surface's own useQuery still refreshes whatever is older\n * than it accepts.\n *\n * LAZY ONLY. shell/warmup.ts loads this module with import(): these query\n * defs pull in the surfaces' data modules, none of which may cost chat\n * first-paint bytes (VerseApp.first-paint.test.ts pins it). The QueryDefs\n * themselves are the surfaces' own — same keys, same fetchers — so a warmed\n * entry IS the entry the surface reads.\n *\n * Keep each list in step with its surface's useQuery calls:\n * surface-prefetch.test.ts renders Command, Growth and Mind and fails when\n * they read something this table does not warm.\n */\nimport { ensureQuery } from '../../../data/cache.js';\nimport { modelsQuery, type QueryDef } from '../../../data/queries.js';\nimport { overnightQuery } from '../autonomy/overnight-queries.js';\nimport { budgetPreviewQuery, budgetQuery } from '../budget/budget-queries.js';\nimport { cloudQuery } from '../cloud/cloud-queries.js';\nimport {\n authorityQuery,\n fleetHistoryQuery,\n fleetLiveQuery,\n leaderQuery,\n learningQuery,\n reasoningDigestQuery,\n} from '../command/surface-data.js';\nimport { leaderDirectivesQuery, leaderThreadQuery } from '../leader/thread-data.js';\nimport { fleetControlQuery, fleetQueueQuery } from '../fleet/fleet-control-queries.js';\nimport { verseBootstrapQuery, verseSessionsQuery, verseWorkspacesQuery } from '../verse-queries.js';\nimport type { VerseSectionId } from '../verse-ui-store.js';\n\ntype AnyQuery = QueryDef<unknown>;\n\n/** What each rail surface reads the moment it mounts. */\nexport const SURFACE_PREFETCH: Readonly<Partial<Record<VerseSectionId, readonly AnyQuery[]>>> = {\n // No seat history: the burn-downs that drew it moved to Usage (audit 14);\n // Command's seat strip reads the budget and the rail's warm seat caches.\n // cloudQuery (3.11): the Cloud card's overview — without it a first visit\n // paints \"Reading the cloud lane…\" under the seat strip.\n // leaderThreadQuery: the Leader card's latest-message line (leader/LeaderLine).\n // fleetControlQuery (3.15): Command's one line about the fleet (fleet/FleetStatusLink).\n command: [authorityQuery, fleetLiveQuery, leaderQuery, learningQuery, fleetHistoryQuery, budgetQuery, cloudQuery, leaderThreadQuery, fleetControlQuery],\n // authorityQuery + fleetLiveQuery on Fleet, Growth and Mind: the shared\n // \"Autonomy is off\" state (autonomy/AutonomyOffState) reads both.\n // fleetControlQuery + fleetQueueQuery (3.15): the control surface and the steer panel.\n fleet: [fleetLiveQuery, authorityQuery, overnightQuery, budgetQuery, budgetPreviewQuery, fleetControlQuery, fleetQueueQuery],\n growth: [fleetHistoryQuery, learningQuery, modelsQuery('30d'), authorityQuery, fleetLiveQuery],\n // The conversation (leader/LeaderConversation) reads the thread and the directives.\n mind: [leaderQuery, leaderThreadQuery, leaderDirectivesQuery, reasoningDigestQuery, verseBootstrapQuery, verseWorkspacesQuery, authorityQuery, fleetLiveQuery],\n chat: [verseBootstrapQuery, verseSessionsQuery, verseWorkspacesQuery],\n};\n\n/**\n * A cached answer younger than this is left alone. The surfaces accept 10–60 s\n * old data on mount, so anything fresher than a minute is already as good as\n * a warm-up can make it.\n */\nexport const PREFETCH_FRESH_MS = 60_000;\n\ntype Ensure = (key: string, fetcher: () => Promise<unknown>, maxAgeMs: number) => Promise<void>;\n\nexport interface PrefetchOptions {\n /** The cache's mount path (a seam for tests). */\n ensure?: Ensure;\n /**\n * Awaited before EACH read (the warm-up's idle gate). Resolving false stops\n * the warm-up there — the gate was cancelled.\n */\n beforeEach?: () => Promise<boolean> | boolean;\n}\n\n/**\n * Warm one surface's reads through the shared cache (joins an in-flight read,\n * skips a fresh one, and goes through the cache's concurrency gate).\n *\n * ONE AT A TIME: each read is awaited before the next is even considered, so\n * the warm-up never holds more than one of the gate's slots, and the operator\n * (who gets the other three, and whose reads the next `beforeEach` waits out)\n * is never queued behind a burst of it.\n *\n * Never rejects: a read that fails leaves the surface to load it as it always did.\n */\nexport async function prefetchSurfaceData(id: VerseSectionId, options: PrefetchOptions = {}): Promise<void> {\n const ensure = options.ensure ?? ensureQuery;\n for (const def of SURFACE_PREFETCH[id] ?? []) {\n try {\n if (options.beforeEach && !(await options.beforeEach())) return;\n await ensure(def.key, () => def.fetch(), PREFETCH_FRESH_MS);\n } catch {\n // A warm-up read that fails (or cannot even start) is not worth surfacing.\n }\n }\n}\n"],"mappings":"kiBAuCA,IAAa,EAAmF,CAO9F,QAAS,CAAC,EAAgB,EAAgB,EAAa,EAAe,EAAmB,EAAa,EAAY,EAAmB,CAAiB,EAItJ,MAAO,CAAC,EAAgB,EAAgB,EAAgB,EAAa,EAAoB,EAAmB,CAAe,EAC3H,OAAQ,CAAC,EAAmB,EAAe,EAAY,KAAK,EAAG,EAAgB,CAAc,EAE7F,KAAM,CAAC,EAAa,EAAmB,EAAuB,EAAsB,EAAqB,EAAsB,EAAgB,CAAc,EAC7J,KAAM,CAAC,EAAqB,EAAoB,CAAoB,CACtE,EAOa,EAAoB,IAyBjC,eAAsB,EAAoB,EAAoB,EAA2B,CAAC,EAAkB,CAC1G,IAAM,EAAS,EAAQ,QAAU,EACjC,IAAK,IAAM,KAAO,EAAiB,IAAO,CAAC,EACzC,GAAI,CACF,GAAI,EAAQ,YAAc,CAAE,MAAM,EAAQ,WAAW,EAAI,OACzD,MAAM,EAAO,EAAI,QAAW,EAAI,MAAM,EAAG,CAAiB,CAC5D,MAAQ,CAER,CAEJ"}
@@ -1,2 +0,0 @@
1
- import{O as e}from"./verse-model-CkF3q2IH.js";import{n as t}from"./tool-semantics-DtFU7rvB.js";import{i as n}from"./sidebar-model-BZ9Wh1lR.js";function r(n){let r=0;for(let e=n.length-1;e>=0;--e)if(n[e].kind===`user`){r=e;break}let i=[],a=[];for(let o=r;o<n.length;o+=1){let r=n[o];if(r.kind!==`tool`)continue;let s={toolUseId:r.toolUseId,kind:t(r.name)===`task`?`subagent`:`tool`,name:r.name,detail:e(r.input)||r.name,startedAt:r.at,status:r.result===null?`running`:r.result.isError?`failed`:`done`,durationMs:r.durationMs};(s.status===`running`?i:a).push(s)}return[...i,...a.reverse()]}function i(e,t,r){let i=new Map;for(let e of t?.running??[])e.sessionId!==r&&i.set(e.sessionId,{sessionId:e.sessionId,title:e.title,engine:e.engine,startedAt:e.startedAt,live:n(e.live)});for(let t of e)t.id===r||t.status!==`running`||i.has(t.id)||i.set(t.id,{sessionId:t.id,title:t.title,engine:t.engine,startedAt:null,live:null});return[...i.values()]}function a(e,t){let n=e.filter(e=>e.status===`running`);return{turn:n.length,subagents:n.filter(e=>e.kind===`subagent`).length,chats:t.length,total:n.length+t.length}}function o(e){let t=`${e.total} running task${e.total===1?``:`s`}`,n=[];return e.turn>0&&n.push(`${e.turn} in this chat`),e.chats>0&&n.push(`${e.chats} other chat${e.chats===1?``:`s`}`),n.length>0?`${t}: ${n.join(`, `)}`:t}export{a as countTasks,r as currentTurnTasks,o as describeTaskCounts,i as otherRunningChats};
2
- //# sourceMappingURL=tasks-model-BueAhEAf.js.map