@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
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-_izD07R9.js";import{l as n}from"./global-CYfRwH6t.js";import{F as r,H as i,N as a,P as o,R as s,V as c,a as l,z as u}from"./verse-model-DAOz9LrY.js";import{f as d,i as f}from"./verse-store-DAqqNIyD.js";import{n as p}from"./budget-queries-t-Bdoly3.js";import{n as m}from"./policy-CEIamUKN.js";import{l as h,u as g}from"./multimodel-flows-D309YXSk.js";import{a as _}from"./multimodel-queries-BuslyWtq.js";import{a as v,n as y,o as b,r as x}from"./headroom-C4dyfw7P.js";var S=e(t(),1),C=.8,w=Object.freeze({lambdaCost:1,lambdaPressure:1,lambdaLatency:.25}),T={elite:`elite`,fast:`fast`,free:`free`},E=r,D=[...r].reverse();function O(e){return e.tier??u(e.engine)}function k(e){return e.free||(e.costBasis??s(e.engine))===`free`?`free`:O(e)}function A(e){return D.indexOf(k(e))}function j(e,t){let n={by:`tier`,order:E},r={by:`cost`,order:D};if(!t.autonomous)return n;let i=t.task===`leader`&&t.difficulty!==`high`?`high`:t.difficulty;return t.task===`bulk`||i===`low`?r:e===`reserve`?i===`high`?{by:`tier`,order:[`fast`,`elite`,`free`]}:r:i===`medium`?e===`all-in`?{by:`tier`,order:[`fast`,`elite`,`free`]}:{by:`cost`,order:[`fast`,`free`,`elite`]}:n}function M(e,t,n){let r=[],i=null;e.signedOut&&r.push({kind:`signed-out`,text:`Signed out — reconnect this account.`}),e.reachable===!1&&!e.signedOut&&r.push({kind:`unreachable`,text:`Not reachable right now.`});let a=y(e,{seatId:e.seatId,enabled:!0,reservePercent:0},{nowMs:t,readingMaxAgeMs:n});return a.exhausted&&(r.push(...a.spentDetails),i=a.reopensAt),{capacity:e,index:0,headroom:a.headroom,eligible:r.length===0,details:r,nextEligibleAt:i}}function N(e,t,n,r){let i=m(t,e.seatId,e.engine),a=y(e,i,{nowMs:n,readingMaxAgeMs:r});return{capacity:e,index:0,headroom:a.headroom,eligible:a.headroom.eligibleForAutonomy,details:a.headroom.eligibleForAutonomy?[]:a.details,nextEligibleAt:a.headroom.eligibleForAutonomy?null:a.reopensAt}}function P(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}k`:String(e)}function F(e,t){if(t===void 0||!Number.isFinite(t)||t<=0)return e;let n=e.capacity.contextWindow;return n===null||t<=n*.8?e:{...e,eligible:!1,details:[...e.details,{kind:`context`,text:`Needs about ${P(t)} tokens of context; this seat's window is ${P(n)} (at most ${Math.round(C*100)}% is used for a task).`}],nextEligibleAt:null}}function I(e,t){return e<t?-1:+(e>t)}var ee=.5,L=.019,te=50,ne=1e-9;function re(e){let t=t=>{let n=e?.[t];return typeof n==`number`&&Number.isFinite(n)&&n>=0?Math.min(n,10):w[t]};return{lambdaCost:t(`lambdaCost`),lambdaPressure:t(`lambdaPressure`),lambdaLatency:t(`lambdaLatency`)}}function ie(e){return e.lambdaCost===w.lambdaCost&&e.lambdaPressure===w.lambdaPressure&&e.lambdaLatency===w.lambdaLatency}function ae(e,t){let n=new Map,r=e.flatMap(e=>{let n=t?.[e.capacity.seatId];return typeof n==`number`&&Number.isFinite(n)&&n>=0?[n]:[]});if(r.length===0)return n;let i=Math.min(...r),a=Math.max(...r)-i;for(let r of e){let e=t?.[r.capacity.seatId],o=typeof e==`number`&&Number.isFinite(e)&&e>=0;n.set(r.capacity.seatId,o?a===0?0:(e-i)/a:.5)}return n}function oe(e,t,n,r){let i=(100-(e.headroom?.autonomyHeadroomPercent??(e.capacity.windowless?te:-1)))/101;return t+(n.lambdaCost-1)*A(e.capacity)+n.lambdaPressure*ee*i+n.lambdaCost*se*ce(e.capacity)+n.lambdaLatency*L*r}var se=.1;function ce(e){let t=e.costBasis??s(e.engine);return o[t]}function le(e,t,n,r){let i=e=>{let n=t.by===`cost`?k(e):O(e),r=t.order.indexOf(n);return r===-1?t.order.length:r},a=ae(e,r),o=new Map(e.map(e=>[e,oe(e,i(e.capacity),n,a.get(e.capacity.seatId)??0)]));return[...e].sort((e,t)=>{let n=o.get(e)-o.get(t);return Math.abs(n)>ne?n:e.index===t.index?I(e.capacity.seatId,t.capacity.seatId):e.index-t.index})}function R(e){return String(Math.round(e*100)/100)}function ue(e){return e.length>0?e.charAt(0).toLowerCase()+e.slice(1):e}function z(e){return`${e.difficulty}-difficulty ${e.task} work`}function B(e){let t=e.details?.[0]?.text??e.reasons[0]??`not eligible`;return`${e.seatId}: ${ue(t).replace(/\.$/,``)}`}function V(e,t=3){let n=e.slice(0,t).map(B).join(`; `);return e.length>t?`${n}; and ${e.length-t} more`:n}function H(e){return{capacity:e,index:0,headroom:null,eligible:!1,details:[{kind:`lane`,text:`The fleet runs Devin as its own session lane under the Devin budget, not through the seat router.`}],nextEligibleAt:null}}function U(e,t,n,r){let i=r.readingMaxAgeMs??9e5,a=t.map((t,a)=>({...e.autonomous&&t.engine===`devin`?H(t):F(e.autonomous?N(t,n,r.nowMs,i):M(t,r.nowMs,i),e.contextTokens),index:a})),o=j(n.mode,e),s=re(r.weights),c=le(a.filter(e=>e.eligible),o,s,r.latencyMs),l=a.filter(e=>!e.eligible).map(e=>({seatId:e.capacity.seatId,reasons:b(e.details),nextEligibleAt:e.nextEligibleAt,details:e.details})).sort((e,t)=>I(e.seatId,t.seatId)),u=c[0]??null,d=c.map(e=>e.capacity.seatId),f=e.autonomous?`autonomous `:``,p,m;if(u){let t=T[o.by===`cost`?k(u.capacity):O(u.capacity)],r=u.headroom?.autonomyHeadroomPercent,i=u.headroom?.bindingWindow===`session`?`5-hour`:`weekly`,a=e.autonomous&&!u.capacity.free&&typeof r==`number`,c=a?` with ${r}% of its ${i} window left for autonomy`:u.capacity.free?` at no cost`:``,d=l.length===0?``:`; held back ${l.length===1?`1 seat`:`${l.length} seats`} (${v(l.map(e=>e.seatId))})`,h=ie(s)?``:`; routing weights cost ×${R(s.lambdaCost)}, headroom ×${R(s.lambdaPressure)}, latency ×${R(s.lambdaLatency)}`;p=`Routed ${f}${z(e)} to ${u.capacity.label} (${u.capacity.seatId})${c}: ${n.mode} mode prefers the ${t} tier first for this work${h}${d}.`;let g=a?` — ${r}% of its ${i} window left`:u.capacity.free?` — free, no usage window`:``;m=g?`${u.capacity.label}${g}; ${n.mode} mode prefers the ${t} tier for this work.`:`${u.capacity.label} — ${n.mode} mode prefers the ${t} tier for this work.`}else if(t.length===0)p=`No seats are known, so ${f}${z(e)} has nowhere to run.`,m=`No seats are known, so this work has nowhere to run.`;else{let t=l.flatMap(e=>e.nextEligibleAt?[e.nextEligibleAt]:[]).sort((e,t)=>Date.parse(e)-Date.parse(t))[0]??null;p=`No seat can take ${f}${z(e)} in ${n.mode} mode (${V(l)})${t?`; the earliest known reopening is ${t}`:``}.`,m=`No seat can take this ${z(e)} in ${n.mode} mode right now.`}return{seatId:u?.capacity.seatId??null,candidates:d,exclusions:l,why:p,summary:m,mode:n.mode}}var de=[`claude`,`codex`,`devin`,`grok`,`local`],fe=3.5,pe=1.25,me=.75,he=3,ge=.5,_e=new Set([`code`,`debug`,`refactor`,`bulk`]),ve=new Set([`code`,`debug`,`refactor`,`bulk`,`review`]);function ye(e,t){let n=e.difficulty===`high`||(e.needsFrontier??0)>=.7,r;return r=t===`cheap-first`?n?1:4:n?1:e.difficulty===`low`?3:1.5,{...w,lambdaCost:r}}function be(e,t,n){if(!e||!ve.has(n))return 0;let r=Object.values(e).filter(e=>e.dispatches>=10&&e.shipRate!==null),i=e[t];if(!i||i.dispatches<10||i.shipRate===null||r.length<2)return 0;let a=r.reduce((e,t)=>e+(t.shipRate??0),0)/r.length;return-Math.max(-.75,Math.min(me,(i.shipRate-a)*2))}function xe(e,t){if(!t)return;let n={};for(let r of e){let e=t[r.engine]?.avgLatencyMs;typeof e==`number`&&Number.isFinite(e)&&e>0&&(n[r.seatId]=e)}return Object.keys(n).length>0?n:void 0}function Se(e){return e===`session`?`5-hour`:`weekly`}function Ce(e){return e===`free`?`free on your plan`:e===`credits`?`spends credits (ACUs)`:`${a[e??`subscription`]} · no usage window reported`}function W(e,t){if(e.local)return e.private?`free · private on this Mac`:`free · local runtime`;if(e.capacity.windowless)return Ce(e.capacity.costBasis);let n=y(e.capacity,{seatId:e.seatId,enabled:!0,reservePercent:0},{nowMs:t}),r=n.headroom.autonomyHeadroomPercent;return n.exhausted?`usage spent`:typeof r==`number`?`${Math.max(0,r)}% of its ${Se(n.headroom.bindingWindow)} window left`:`no usage reading`}function G(e,t){return{seatId:e.seatId,label:e.label,engine:e.engine,model:e.model,local:e.local,note:W(e,t),tier:O(e.capacity)}}function K(e,t=!0,n=!0){return e.base+(t?e.learned.tilt:0)+e.roi+(n?e.sticky:0)+e.tools+e.local}function we(e,t){return!t||!e.cheaper?e:{...e,model:e.cheaper.model,capacity:e.cheaper.capacity}}function q(e,t=!0,n=!0){return e.map((e,t)=>({r:e,i:t})).sort((e,r)=>K(e.r,t,n)-K(r.r,t,n)||e.i-r.i).map(e=>e.r)}function J(e,t=160){return e.length<=t?e:`${e.slice(0,t-1).trimEnd()}…`}function Te(e){let{classification:t,mode:n,nowMs:r}=e,i={on:e.localOnly?.on===!0,reason:e.localOnly?.reason??null},a=t.difficulty===`high`||(t.needsFrontier??0)>=.7,o=!a&&(n===`cheap-first`||t.difficulty===`low`||t.task===`bulk`),s=e.seats.filter(e=>de.includes(e.engine)&&e.model!==null).map(e=>we(e,o)),c=i.on?s.filter(e=>e.local&&e.private):s,l=new Map(c.map(e=>[e.seatId,e])),u=[];i.on&&u.push(`This repo is local-only${i.reason?` — ${i.reason.replace(/\.$/,``)}`:``}.`),u.push(`Read as ${t.label}${t.decidedBy===`jev`?` (labelled by Jev, ${Math.round((t.confidence??0)*100)}% sure)`:``}${t.signals.length>0?`: ${t.signals.slice(0,3).join(`, `)}`:``}.`);let d=ye(t,n),f=Math.max(0,e.contextTokens??0)+t.estTokens,p=xe(c,e.roi),m=U({task:t.task,difficulty:(t.needsFrontier??0)>=.7&&t.difficulty!==`high`?`high`:t.difficulty,contextTokens:f,autonomous:!1},c.map(e=>e.capacity),e.policy,{nowMs:r,weights:d,...p?{latencyMs:p}:{}}),g=m.exclusions.map(e=>({seatId:e.seatId,label:l.get(e.seatId)?.label??e.seatId,reason:(e.details?.[0]?.text??e.reasons[0]??`Not available right now.`).replace(/\s+$/,``)})),_=(e.turnCount??0)>0&&typeof e.currentSeatId==`string`,v=n===`cheap-first`||a?pe:fe,y=m.candidates.flatMap((n,r)=>{let i=l.get(n);return i?[{seat:i,base:r,learned:h(e.learned,t.kind,i),roi:be(e.roi,i.engine,t.kind),sticky:_&&n===e.currentSeatId?-v:0,tools:i.local&&i.supportsTools===!1&&_e.has(t.kind)?he:0,local:0}]:[]});if(a&&!i.on){let e=e=>O(e.seat.capacity)===`elite`,t=y.reduce((t,n)=>!n.seat.local&&e(n)?Math.max(t,n.base):t,-1);for(let n of y)n.seat.local&&e(n)&&t>n.base&&(n.local=t-n.base+ge)}let b=e=>({choice:null,stay:!1,why:e,factors:u,alternatives:[],held:g,classification:t,mode:n,localOnly:i,routerWhy:m.why});if(y.length===0)return i.on&&c.length===0?b(`This repo is local-only and no local model is running — start Ollama or LM Studio, or pick a seat yourself.`):b(J(m.summary??m.why));let x=q(y),S=e.pinnedSeatId?x.find(t=>t.seat.seatId===e.pinnedSeatId)??null:null,C=S??x[0],T=C.seat,E=typeof e.currentSeatId==`string`&&T.seatId===e.currentSeatId,D=q(y,!1)[0].seat.seatId,k=q(y,!0,!1)[0].seat.seatId,A=q(y.map(e=>({...e,tools:0})))[0].seat.seatId,j=y.find(e=>e.seat.seatId===A),M=q(y.map(e=>({...e,local:0})))[0].seat.seatId,N=y.find(e=>e.seat.seatId===M),P;P=S?`you pinned this seat`:i.on?`${t.label} on a local-only repo — stays on this Mac`:E&&_&&k!==T.seatId?`${t.label}, mid-conversation — moving would re-send the whole context`:C.learned.phrase&&D!==T.seatId?`${t.label}; ${C.learned.phrase}`:j.seat.seatId!==T.seatId&&j.tools>0?`${t.label} edits files, and ${j.seat.label} cannot use tools`:N.seat.seatId!==T.seatId&&N.local>0?`${t.label} needs the strongest model now — a hosted seat answers faster than ${N.seat.label}`:T.local?n===`cheap-first`?`${t.label} — local drafts first, escalates only if the draft is weak`:`${t.label} — free and private on this Mac`:a?`${t.label} needs the strongest model`:t.label;let F=T.local?``:`; ${W(T,r)}`,I=J(`${E?`Staying on ${T.label}`:T.label} — ${P}${F}.`);return u.push(`Router (${m.mode} mode, interactive — fleet reserves do not apply to you): ${m.summary??m.why}`),d.lambdaCost!==w.lambdaCost&&u.push(`Cost weight ×${d.lambdaCost} for ${t.difficulty}-difficulty work${n===`cheap-first`?` in cheap-first mode`:``}.`),C.learned.phrase&&u.push(`Learned: ${C.learned.phrase}.`),C.roi!==0&&u.push(`Fleet record: ${T.engine} ships ${C.roi<0?`above`:`below`} the average for code work.`),g.length>0&&u.push(`Held back: ${g.map(e=>`${e.label} (${e.reason.replace(/\.$/,``).toLowerCase()})`).join(`; `)}.`),{choice:G(T,r),stay:E,why:I,factors:u,alternatives:x.filter(e=>e!==C).slice(0,4).map(e=>G(e.seat,r)),held:g,classification:t,mode:n,localOnly:i,routerWhy:m.why}}var Y=[`off`,`auto`,`cheap-first`],X=`ashlr.verse.multimodel.v1`,Ee=`auto`;function Z(){try{let e=JSON.parse(localStorage.getItem(X)??`{}`);if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e))Y.includes(r)&&(t[n]=r);return t}catch{return{}}}function De(e){let t=Z();return(e?t[e]:void 0)??t[`*`]??Ee}function Oe(e,t){try{let n=Z();e&&(n[e]=t),n[`*`]=t;let r=Object.entries(n),i=Object.fromEntries(r.slice(Math.max(0,r.length-201)));localStorage.setItem(X,JSON.stringify(i))}catch{}}function Q(e){return(0,S.useSyncExternalStore)(t=>e?d(e,t):()=>void 0,()=>f(e).session,()=>f(e).session)}function ke(e,t){return t?.find(t=>t.seatId===e.id)?.private===!0}function Ae(e,t){let n=i(c(e.engine,t));return e.models.find(t=>!t.unavailableReason&&i(c(e.engine,t.id))>n)?.id??null}function $(e,t){return e.flatMap(e=>{if(e.health.state===`unavailable`)return[];let n=l(e);if(!n)return[];let r=e.engine===`local`,i=t?.find(t=>t.seatId===e.id),a=Ae(e,n.id);return[{seatId:e.id,engine:e.engine,label:e.label,model:n.id,local:r,private:r&&ke(e,t),supportsTools:i?.supportsTools??null,capacity:x(e,void 0,n.id),...a?{cheaper:{model:a,capacity:x(e,void 0,a)}}:{}}]})}function je(e,t){let[n,r]=(0,S.useState)(e);return(0,S.useEffect)(()=>{let n=setTimeout(()=>r(e),t);return()=>clearTimeout(n)},[e,t]),n}var Me={mode:`balanced`,seats:{},updatedAt:new Date(0).toISOString()};function Ne(e){let t=Q(e.sessionId),r=n(_(e.sessionId?{sessionId:e.sessionId}:{projectPath:null})).data??null,i=n(p).data??null,a=i?{mode:i.mode,seats:i.seats,updatedAt:i.updatedAt}:null,o=je(e.text.trim(),250),s=t?.usage?.contextTokens??0,c=(0,S.useMemo)(()=>$(e.seats,r?.local),[e.seats,r?.local]),l=(0,S.useMemo)(()=>o&&e.pref!==`off`?g(o,{contextTokens:s}):null,[o,e.pref,s]),u=(n,i=e.pinnedSeatId)=>e.pref===`off`||r===null?null:Te({classification:n,seats:c,policy:a??Me,mode:e.pref,nowMs:Date.now(),currentSeatId:t?.seatId??null,turnCount:t?.turnCount??0,contextTokens:s,localOnly:r?.localOnly??null,learned:r?.learned??null,roi:r?.roi??null,pinnedSeatId:i});return{session:t,context:r,policy:a,classification:l,advice:l?u(l):null,advisorSeats:c,adviseWith:u}}export{Ne as a,$ as i,De as n,Oe as r,Y as t};
2
+ //# sourceMappingURL=useAutoSeat-CIEXM-Q5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAutoSeat-CIEXM-Q5.js","names":[],"sources":["../../../../../../src/core/routing/router.ts","../../../../../../src/core/verse/multimodel/advisor.ts","../../../../../../src/web-ui/routes/verse/multimodel/useAutoSeat.ts"],"sourcesContent":["/**\n * Seat router — `routeSeat(req, capacity, policy): SeatDecision` (V3.10 unit A9).\n *\n * PURE and DETERMINISTIC: same inputs, same decision. No clock reads (pass\n * `nowMs`), no I/O, no model calls. That is what lets the fleet run it in\n * SHADOW mode (Track B) — every would-be dispatch is decided and logged next\n * to what actually ran, and the two can be compared before the router is\n * given any authority.\n *\n * STAGES\n * 1. Eligibility. Autonomous work goes through `assessSeat` (budget policy,\n * reserves, live windows, \"unknown usage is not headroom\"). Mason's own\n * interactive work ignores reserves — they exist FOR him — and is refused\n * only by what would make a turn fail: signed out, spent, unreachable.\n * 2. Fit. A request whose context estimate exceeds 80% of a seat's window\n * is not sent there; the router never truncates silently.\n * 3. Rank. An explicit TIER order per (mode, task, difficulty) — see\n * `tierPreference` and routing/tiers.ts (elite · fast · free) — then,\n * inside a tier, more headroom first, then marginal cost (a subscription\n * turn before a credits turn), then latency, then seat id. There is NO\n * provider order: Claude, Codex and Devin are the same tier and nothing\n * but their live numbers separates them (3.15, \"equal partners\"). The λ\n * routing weights (`RouterWeights`, from the harness / Leader\n * `router.tune`) tilt that order — see `seatScore`.\n *\n * Local models are never excluded for quality; the free tier is ranked after\n * the paid tiers where quality matters (high difficulty, leader work), so\n * work still flows when the paid seats are held back for Mason.\n *\n * DEVIN. Mason's own chats may be routed to a Devin seat like any other\n * elite seat. Autonomous (fleet) work never is: the fleet launches Devin\n * only through devin/fleet-launcher.ts under its grant and ACU reserve, and\n * the capacity snapshot refuses a Devin row — see `devinFleetVerdict`.\n */\nimport { assessSeat, HEADROOM_READING_MAX_AGE_MS, type SeatCapacity } from './headroom.js';\nimport { effectiveSeatPolicy } from './policy.js';\nimport { listSeatIds, reasonSentences } from './seat-reasons.js';\nimport { COST_BASIS_RANK, costBasisOf, engineTier, RESOURCE_TIERS, type ResourceTier } from './tiers.js';\nimport type {\n BudgetMode,\n BudgetPolicy,\n RoutingDifficulty,\n RoutingRequest,\n SeatDecision,\n SeatExclusion,\n SeatHeadroom,\n SeatReason,\n} from './types.js';\n\n/** A request may use at most this share of a seat's context window. */\nexport const ROUTER_CONTEXT_FIT_FRACTION = 0.8;\n\nexport interface RouteOptions {\n nowMs: number;\n readingMaxAgeMs?: number;\n /** The λ objective weights; absent = `DEFAULT_ROUTER_WEIGHTS` (today's explicit order). */\n weights?: Partial<RouterWeights>;\n /**\n * Observed turn latency per seat id, in ms (e.g. a recent median). Only\n * `lambdaLatency` reads it; a seat absent here is scored neutral. Absent =\n * no latency evidence, so latency cannot move anything.\n */\n latencyMs?: Readonly<Record<string, number>>;\n}\n\n/**\n * The router's λ objective weights — the same three numbers as\n * learn/harness-types.ts `HarnessRoutingWeights` (restated structurally so\n * this browser-safe module does not import the harness). Each λ is ≥ 0.\n *\n * lambdaCost — how hard to lean on COST against the mode's\n * quality/cost tier order. 1 = the mode's own balance;\n * above 1 leans toward cheaper tiers, below 1 toward\n * pricier (higher-quality) ones. Inside a tier it also\n * scales the marginal-cost term (subscription before\n * credits).\n * lambdaPressure — how much a seat's remaining HEADROOM counts. 1 = the\n * deciding key inside one tier; higher lets a much\n * emptier seat of a less-preferred tier win; 0 ignores\n * headroom.\n * lambdaLatency — how much observed LATENCY (`RouteOptions.latencyMs`)\n * counts. At the default 0.25 it only separates seats\n * whose headroom is equal.\n */\nexport interface RouterWeights {\n lambdaCost: number;\n lambdaPressure: number;\n lambdaLatency: number;\n}\n\n/**\n * Defaults = the compiled baseline (`BASELINE_HARNESS_CONFIG.routing`; a test\n * pins the two together). At these values `rank` orders seats by tier, then\n * headroom, then marginal cost, then latency.\n */\nexport const DEFAULT_ROUTER_WEIGHTS: Readonly<RouterWeights> = Object.freeze({\n lambdaCost: 1,\n lambdaPressure: 1,\n lambdaLatency: 0.25,\n});\n\n/** How a tier is named inside a `why` sentence. */\nconst TIER_WORDS: Readonly<Record<ResourceTier, string>> = { elite: 'elite', fast: 'fast', free: 'free' };\n\n/** Best tier first — interactive work and hard autonomous work. */\nconst QUALITY_FIRST: readonly ResourceTier[] = RESOURCE_TIERS;\n/** Cheapest rung first — the cost ladder (free → fast → elite). */\nconst CHEAP_FIRST: readonly ResourceTier[] = [...RESOURCE_TIERS].reverse();\n\n/** A seat's tier: what its capacity says (per model), else its engine's. */\nexport function capacityTier(capacity: Pick<SeatCapacity, 'engine' | 'tier'>): ResourceTier {\n return capacity.tier ?? engineTier(capacity.engine);\n}\n\n/**\n * A seat's rung on the COST ladder: `free` when a turn costs nothing (every\n * local model — the elite Qwen included — and Devin's plan-included SWE),\n * otherwise its tier. Tier and cost only differ for those free-but-strong\n * seats, which is exactly why they are two axes.\n */\nexport function costRung(capacity: Pick<SeatCapacity, 'engine' | 'tier' | 'costBasis' | 'free'>): ResourceTier {\n if (capacity.free || (capacity.costBasis ?? costBasisOf(capacity.engine)) === 'free') return 'free';\n return capacityTier(capacity);\n}\n\n/** Relative cost step (0 = free). CHEAP_FIRST is exactly the cost ladder, so it doubles as the table. */\nfunction costStep(capacity: SeatCapacity): number {\n return CHEAP_FIRST.indexOf(costRung(capacity));\n}\n\n/**\n * The mode's order for one request: over TIERS (quality) or over the COST\n * ladder, never over providers — which seat of a rung wins is decided by\n * headroom, marginal cost and latency (`seatScore`).\n */\nexport interface RankOrder {\n /** `tier` ranks a seat by what it can do; `cost` by what a turn costs. */\n by: 'tier' | 'cost';\n order: readonly ResourceTier[];\n}\n\n/**\n * Low-difficulty and bulk work always goes to the cheapest capable seat\n * first (the cost ladder — so the free elite Qwen and Devin's free SWE lead);\n * quality-first ordering is reserved for work that needs it. Interactive\n * requests are ordered for \"what else can I use right now\": the elite\n * partners, then fast, then free.\n */\nexport function tierPreference(mode: BudgetMode, req: RoutingRequest): RankOrder {\n const quality: RankOrder = { by: 'tier', order: QUALITY_FIRST };\n const cheap: RankOrder = { by: 'cost', order: CHEAP_FIRST };\n if (!req.autonomous) return quality;\n const difficulty: RoutingDifficulty = req.task === 'leader' && req.difficulty !== 'high' ? 'high' : req.difficulty;\n if (req.task === 'bulk' || difficulty === 'low') return cheap;\n if (mode === 'reserve') {\n // Free first for everything but genuinely hard work, and even that only\n // reaches the small paid slice the reserve-mode ceilings leave.\n return difficulty === 'high' ? { by: 'tier', order: ['fast', 'elite', 'free'] } : cheap;\n }\n if (difficulty === 'medium') {\n return mode === 'all-in'\n ? { by: 'tier', order: ['fast', 'elite', 'free'] }\n : { by: 'cost', order: ['fast', 'free', 'elite'] };\n }\n return quality;\n}\n\ninterface Verdict {\n capacity: SeatCapacity;\n /** Position in the caller's list — discovery order, which ranks the operator's preferred local tags first. */\n index: number;\n headroom: SeatHeadroom | null;\n eligible: boolean;\n /** The blockers as data; `SeatExclusion.reasons` is derived from them. */\n details: SeatReason[];\n nextEligibleAt: string | null;\n}\n\nfunction interactiveVerdict(capacity: SeatCapacity, nowMs: number, readingMaxAgeMs: number): Verdict {\n const details: SeatReason[] = [];\n let nextEligibleAt: string | null = null;\n if (capacity.signedOut) details.push({ kind: 'signed-out', text: 'Signed out — reconnect this account.' });\n if (capacity.reachable === false && !capacity.signedOut) details.push({ kind: 'unreachable', text: 'Not reachable right now.' });\n // Reuse the autonomy assessment only for the facts it establishes about\n // the ACCOUNT (spent windows and their resets) — never its reserves.\n const facts = assessSeat(capacity, { seatId: capacity.seatId, enabled: true, reservePercent: 0 }, {\n nowMs,\n readingMaxAgeMs,\n });\n if (facts.exhausted) {\n details.push(...facts.spentDetails);\n nextEligibleAt = facts.reopensAt;\n }\n return { capacity, index: 0, headroom: facts.headroom, eligible: details.length === 0, details, nextEligibleAt };\n}\n\nfunction autonomousVerdict(capacity: SeatCapacity, policy: BudgetPolicy, nowMs: number, readingMaxAgeMs: number): Verdict {\n const seatPolicy = effectiveSeatPolicy(policy, capacity.seatId, capacity.engine);\n const assessed = assessSeat(capacity, seatPolicy, { nowMs, readingMaxAgeMs });\n return {\n capacity,\n index: 0,\n headroom: assessed.headroom,\n eligible: assessed.headroom.eligibleForAutonomy,\n // Blocked seats report the blockers; the \"N% left\" line is for eligible ones.\n details: assessed.headroom.eligibleForAutonomy ? [] : assessed.details,\n nextEligibleAt: assessed.headroom.eligibleForAutonomy ? null : assessed.reopensAt,\n };\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${Math.round(n / 1_000)}k`;\n return String(n);\n}\n\nfunction applyFit(verdict: Verdict, contextTokens: number | undefined): Verdict {\n if (contextTokens === undefined || !Number.isFinite(contextTokens) || contextTokens <= 0) return verdict;\n const window = verdict.capacity.contextWindow;\n if (window === null) return verdict;\n if (contextTokens <= window * ROUTER_CONTEXT_FIT_FRACTION) return verdict;\n return {\n ...verdict,\n eligible: false,\n details: [...verdict.details, {\n kind: 'context',\n text: `Needs about ${formatTokens(contextTokens)} tokens of context; this seat's window is `\n + `${formatTokens(window)} (at most ${Math.round(ROUTER_CONTEXT_FIT_FRACTION * 100)}% is used for a task).`,\n }],\n // A window does not grow back on a schedule.\n nextEligibleAt: null,\n };\n}\n\nfunction compareIds(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/**\n * Scale of the headroom term at λ = 1: its whole range (100% left vs unknown)\n * is worth half a tier step, so at the default weight it can only order\n * seats of the SAME tier — where it is the deciding key.\n */\nconst PRESSURE_SCALE = 0.5;\n\n/**\n * Scale of the latency term at λ = 1. Headroom percents are whole numbers\n * (headroom.ts rounds them), so one point of headroom is worth\n * PRESSURE_SCALE / 101 ≈ 0.00495 at λ = 1. At the default λ = 0.25 the whole\n * latency range (0.25 × 0.019 = 0.00475) stays below that, which keeps\n * latency a pure tie-breaker; at λ = 10 it is worth ~38 points of headroom\n * and still never a whole tier step (0.5 + 0.1 + 0.19 < 1).\n */\nconst LATENCY_SCALE = 0.019;\n\n/** The headroom a windowless seat is ranked with: the middle of the range. */\nconst WINDOWLESS_HEADROOM = 50;\n\n/** Scores closer than this are a tie (they fall through to caller order, then id). */\nconst SCORE_EPSILON = 1e-9;\n\n/**\n * The largest λ the router honours — the harness registry's own bound\n * (HARNESS_CONFIG_BOUNDS.lambdaMax; a test pins the two together, restated so\n * this browser-safe module does not import the harness). A larger value is\n * clamped here, so every score stays finite: an unbounded λ could overflow to\n * Infinity, and Infinity − Infinity = NaN would make the comparator\n * inconsistent (the sort order would then depend on the engine's algorithm).\n */\nexport const ROUTER_LAMBDA_MAX = 10;\n\nfunction resolveWeights(weights: Partial<RouterWeights> | undefined): RouterWeights {\n // A malformed λ (NaN, ±Infinity, negative, not a number) falls back to its\n // default rather than poisoning the ranking; an over-large one is clamped\n // to ROUTER_LAMBDA_MAX (it keeps its direction, bounded).\n const pick = (key: keyof RouterWeights): number => {\n const v = weights?.[key];\n return typeof v === 'number' && Number.isFinite(v) && v >= 0 ? Math.min(v, ROUTER_LAMBDA_MAX) : DEFAULT_ROUTER_WEIGHTS[key];\n };\n return { lambdaCost: pick('lambdaCost'), lambdaPressure: pick('lambdaPressure'), lambdaLatency: pick('lambdaLatency') };\n}\n\nfunction isDefaultWeights(w: RouterWeights): boolean {\n return w.lambdaCost === DEFAULT_ROUTER_WEIGHTS.lambdaCost\n && w.lambdaPressure === DEFAULT_ROUTER_WEIGHTS.lambdaPressure\n && w.lambdaLatency === DEFAULT_ROUTER_WEIGHTS.lambdaLatency;\n}\n\n/**\n * Latency per seat normalised to [0, 1] across the seats with evidence\n * (fastest 0, slowest 1). A seat without evidence gets 0.5: unknown latency\n * is neither rewarded nor punished. No evidence anywhere = all 0.\n */\nfunction latencyTerms(verdicts: readonly Verdict[], latencyMs: RouteOptions['latencyMs']): Map<string, number> {\n const out = new Map<string, number>();\n const known = verdicts.flatMap((v) => {\n const ms = latencyMs?.[v.capacity.seatId];\n return typeof ms === 'number' && Number.isFinite(ms) && ms >= 0 ? [ms] : [];\n });\n if (known.length === 0) return out;\n const min = Math.min(...known);\n const span = Math.max(...known) - min;\n for (const v of verdicts) {\n const ms = latencyMs?.[v.capacity.seatId];\n const has = typeof ms === 'number' && Number.isFinite(ms) && ms >= 0;\n out.set(v.capacity.seatId, !has ? 0.5 : span === 0 ? 0 : (ms - min) / span);\n }\n return out;\n}\n\n/**\n * The λ objective for one seat — LOWER is better:\n *\n * position quality: the mode's TIER order (fixed anchor)\n * + (λcost − 1) · costStep cost: one tier step per cost step per unit of λ\n * + λpressure · PRESSURE_SCALE · p headroom: p = (100 − left%) / 101, unknown = 1\n * + λcost · MARGINAL_COST_SCALE · m marginal: m = 1 for credits / per-token, else 0\n * + λlatency · LATENCY_SCALE · l latency: l from `latencyTerms`\n *\n * Why `λcost − 1`: the tier order ALREADY prices cost in for the mode\n * (CHEAP_FIRST is literally the cost ladder), so λcost = 1 must add nothing\n * across tiers. At λcost = 2 a quality-first order flattens (every tier ties\n * and headroom decides); at 0 a cheap-first order does. No term names a\n * provider.\n */\nfunction seatScore(v: Verdict, position: number, w: RouterWeights, latency: number): number {\n // A windowless seat (Devin: ACUs / plan usage, no window) has no reading\n // BY DESIGN — neutral, not the worst. Only interactive work reaches here\n // with one (autonomous Devin is refused before ranking).\n const left = v.headroom?.autonomyHeadroomPercent ?? (v.capacity.windowless ? WINDOWLESS_HEADROOM : -1);\n const pressure = (100 - left) / 101;\n return position\n + (w.lambdaCost - 1) * costStep(v.capacity)\n + w.lambdaPressure * PRESSURE_SCALE * pressure\n + w.lambdaCost * MARGINAL_COST_SCALE * marginalCost(v.capacity)\n + w.lambdaLatency * LATENCY_SCALE * latency;\n}\n\n/**\n * Marginal cost of one more turn inside a tier: 0 for a subscription (its\n * window refills) or a free seat, 1 for a seat that spends a balance\n * (credits, ACUs, per-token). Worth a tenth of the headroom range at λ = 1 —\n * about 20 points of headroom — so a metered seat wins only when it has\n * clearly more room than a subscription seat of the same tier.\n */\nconst MARGINAL_COST_SCALE = 0.1;\n\nfunction marginalCost(capacity: SeatCapacity): number {\n const basis = capacity.costBasis ?? costBasisOf(capacity.engine);\n return COST_BASIS_RANK[basis];\n}\n\n/**\n * Rank eligible verdicts by `seatScore`, then the caller's order (seat\n * discovery lists the operator's preferred local tags first —\n * `preferredLocalTags` in seats.ts — so two free local seats with equal\n * headroom resolve to the one he chose), then id. At the default weights this\n * is a lexicographic order — tier, then headroom / marginal cost / latency —\n * because those terms together stay under one tier step.\n */\nfunction rank(verdicts: Verdict[], rankOrder: RankOrder, w: RouterWeights, latencyMs: RouteOptions['latencyMs']): Verdict[] {\n const position = (capacity: SeatCapacity): number => {\n const rung = rankOrder.by === 'cost' ? costRung(capacity) : capacityTier(capacity);\n const index = rankOrder.order.indexOf(rung);\n return index === -1 ? rankOrder.order.length : index;\n };\n const latency = latencyTerms(verdicts, latencyMs);\n const score = new Map(verdicts.map((v) => [\n v, seatScore(v, position(v.capacity), w, latency.get(v.capacity.seatId) ?? 0),\n ]));\n return [...verdicts].sort((a, b) => {\n const diff = score.get(a)! - score.get(b)!;\n if (Math.abs(diff) > SCORE_EPSILON) return diff;\n if (a.index !== b.index) return a.index - b.index;\n return compareIds(a.capacity.seatId, b.capacity.seatId);\n });\n}\n\nfunction formatWeight(n: number): string {\n return String(Math.round(n * 100) / 100);\n}\n\nfunction lowerFirst(text: string): string {\n return text.length > 0 ? text.charAt(0).toLowerCase() + text.slice(1) : text;\n}\n\nfunction describeWork(req: RoutingRequest): string {\n return `${req.difficulty}-difficulty ${req.task} work`;\n}\n\n/**\n * \"codex-cmp: autonomy is switched off for this seat\" — the FIRST reason, as\n * text without its reset clause, so a list of these never nests parentheses.\n */\nexport function describeExclusion(exclusion: SeatExclusion): string {\n const first = exclusion.details?.[0]?.text ?? exclusion.reasons[0] ?? 'not eligible';\n return `${exclusion.seatId}: ${lowerFirst(first).replace(/\\.$/, '')}`;\n}\n\n/** Up to `max` exclusions described, then \"and N more\" — never a bare \"…\". */\nexport function describeExclusions(exclusions: readonly SeatExclusion[], max = 3): string {\n const shown = exclusions.slice(0, max).map(describeExclusion).join('; ');\n return exclusions.length > max ? `${shown}; and ${exclusions.length - max} more` : shown;\n}\n\n/**\n * 3.15: a Devin seat is never a candidate for AUTONOMOUS work. The fleet\n * launches Devin only through devin/fleet-launcher.ts under its grant and its\n * own ACU reserve; the capacity snapshot refuses a `devin` seat\n * (budget-store.ts sanitizeSeatCapacity), and this is the second lock, so a\n * hand-built capacity list cannot route fleet work to it either. Mason's own\n * (interactive) work routes to Devin like any other elite seat.\n */\nfunction devinFleetVerdict(capacity: SeatCapacity): Verdict {\n const details: SeatReason[] = [{\n kind: 'lane',\n text: 'The fleet runs Devin as its own session lane under the Devin budget, not through the seat router.',\n }];\n return { capacity, index: 0, headroom: null, eligible: false, details, nextEligibleAt: null };\n}\n\n/**\n * Decide which seat `req` should use. Pure. Every seat in `capacity` ends up\n * in exactly one of `candidates` or `exclusions`.\n */\nexport function routeSeat(\n req: RoutingRequest,\n capacity: readonly SeatCapacity[],\n policy: BudgetPolicy,\n opts: RouteOptions,\n): SeatDecision {\n const readingMaxAgeMs = opts.readingMaxAgeMs ?? HEADROOM_READING_MAX_AGE_MS;\n const verdicts = capacity.map((seat, index) => ({\n ...(req.autonomous && seat.engine === 'devin'\n ? devinFleetVerdict(seat)\n : applyFit(\n req.autonomous\n ? autonomousVerdict(seat, policy, opts.nowMs, readingMaxAgeMs)\n : interactiveVerdict(seat, opts.nowMs, readingMaxAgeMs),\n req.contextTokens,\n )),\n index,\n }));\n\n const order = tierPreference(policy.mode, req);\n const weights = resolveWeights(opts.weights);\n const eligible = rank(verdicts.filter((v) => v.eligible), order, weights, opts.latencyMs);\n const exclusions: SeatExclusion[] = verdicts\n .filter((v) => !v.eligible)\n .map((v) => ({\n seatId: v.capacity.seatId,\n reasons: reasonSentences(v.details),\n nextEligibleAt: v.nextEligibleAt,\n details: v.details,\n }))\n .sort((a, b) => compareIds(a.seatId, b.seatId));\n\n const chosen = eligible[0] ?? null;\n const candidates = eligible.map((v) => v.capacity.seatId);\n const who = req.autonomous ? 'autonomous ' : '';\n\n // `why` is the full sentence the logs and the CLI print; `summary` is the\n // short headline a UI shows above its own per-seat list. Neither repeats\n // the per-seat reasons — `exclusions` carries those as data.\n let why: string;\n let summary: string;\n if (chosen) {\n const tier = TIER_WORDS[order.by === 'cost' ? costRung(chosen.capacity) : capacityTier(chosen.capacity)];\n const room = chosen.headroom?.autonomyHeadroomPercent;\n const windowWord = chosen.headroom?.bindingWindow === 'session' ? '5-hour' : 'weekly';\n const hasRoom = req.autonomous && !chosen.capacity.free && typeof room === 'number';\n const roomText = hasRoom\n ? ` with ${room}% of its ${windowWord} window left for autonomy`\n : chosen.capacity.free ? ' at no cost' : '';\n const held = exclusions.length === 0 ? ''\n : `; held back ${exclusions.length === 1 ? '1 seat' : `${exclusions.length} seats`} (${listSeatIds(exclusions.map((e) => e.seatId))})`;\n // Tuned weights can put a seat ahead of the mode's own order, so the\n // sentence names them; at the defaults it stays byte-identical.\n const tuned = isDefaultWeights(weights) ? ''\n : `; routing weights cost ×${formatWeight(weights.lambdaCost)}, headroom ×${formatWeight(weights.lambdaPressure)}, `\n + `latency ×${formatWeight(weights.lambdaLatency)}`;\n why = `Routed ${who}${describeWork(req)} to ${chosen.capacity.label} (${chosen.capacity.seatId})${roomText}: `\n + `${policy.mode} mode prefers the ${tier} tier first for this work${tuned}${held}.`;\n const lead = hasRoom\n ? ` — ${room}% of its ${windowWord} window left`\n : chosen.capacity.free ? ' — free, no usage window' : '';\n summary = lead\n ? `${chosen.capacity.label}${lead}; ${policy.mode} mode prefers the ${tier} tier for this work.`\n : `${chosen.capacity.label} — ${policy.mode} mode prefers the ${tier} tier for this work.`;\n } else if (capacity.length === 0) {\n why = `No seats are known, so ${who}${describeWork(req)} has nowhere to run.`;\n summary = 'No seats are known, so this work has nowhere to run.';\n } else {\n const reopen = exclusions.flatMap((e) => (e.nextEligibleAt ? [e.nextEligibleAt] : []))\n .sort((a, b) => Date.parse(a) - Date.parse(b))[0] ?? null;\n why = `No seat can take ${who}${describeWork(req)} in ${policy.mode} mode (${describeExclusions(exclusions)})`\n + `${reopen ? `; the earliest known reopening is ${reopen}` : ''}.`;\n summary = `No seat can take this ${describeWork(req)} in ${policy.mode} mode right now.`;\n }\n\n return {\n seatId: chosen?.capacity.seatId ?? null,\n candidates,\n exclusions,\n why,\n summary,\n mode: policy.mode,\n };\n}\n\n/**\n * Ranked seats Mason could use INSTEAD of `blockedSeatId` for his own work\n * right now (reserves do not apply to him). For the readiness gate's\n * `SeatReadiness.alternatives`.\n */\nexport function rankAlternatives(\n blockedSeatId: string,\n capacity: readonly SeatCapacity[],\n policy: BudgetPolicy,\n opts: RouteOptions,\n): string[] {\n const blocked = capacity.find((c) => c.seatId === blockedSeatId);\n const decision = routeSeat(\n { task: 'code', difficulty: 'medium', autonomous: false },\n capacity.filter((c) => c.seatId !== blockedSeatId),\n policy,\n opts,\n );\n if (!blocked) return decision.candidates;\n // Same engine first (a second account of the same provider is the least\n // surprising substitute), then the router's own order.\n const sameEngine = new Set(capacity.filter((c) => c.engine === blocked.engine).map((c) => c.seatId));\n return [\n ...decision.candidates.filter((id) => sameEngine.has(id)),\n ...decision.candidates.filter((id) => !sameEngine.has(id)),\n ];\n}\n","/**\n * The Auto seat — which seat should THIS message go to, and why, in one line.\n *\n * NOT A NEW ROUTER. It asks the seat router (routing/router.ts `routeSeat`)\n * the question the router already answers for Mason's own work\n * (`autonomous: false`: fleet reserves do not bind him, only a signed-out,\n * spent or unreachable seat is refused, and a request that would not fit a\n * seat's window is never sent there). What it adds is the INPUT the router\n * needs and the explanation a person reads:\n *\n * 1. Task + difficulty from classify.ts (or the decision layer, once per send).\n * 2. The router's own λ weights, set per message: a quick question leans on\n * cost (λcost 3 → local and Grok first), hard work keeps the quality order\n * (λcost 1). Cheap-first mode leans harder (λcost 4) and only hard work\n * keeps quality. Latency comes from fleet ROI (M322 avgLatencyMs).\n * 3. Bounded re-ranking of the router's eligible list by:\n * - stickiness: mid-conversation, the current seat gets a head start —\n * moving re-sends the context and loses the provider’s prompt cache (a weak head start for hard work and in cheap-first);\n * - what Mason taught it (learning.ts; at most ±1.5 positions);\n * - fleet ship rate per engine for code work (M335; at most ±0.75);\n * - a local model that cannot use tools is last for edit work.\n * None of these can make an ineligible seat eligible.\n * 4. Privacy: a local-only repo is routed over LOCAL seats only — the\n * filter runs before the router sees anything.\n * 5. Model fit inside a seat (3.15): a seat that also offers a cheaper-tier\n * model (Devin's free SWE on the Devin CLI) competes with THAT model for\n * cheap work, and with its default for everything else.\n *\n * EQUAL PARTNERS (3.15). Claude, Codex and Devin are one tier (routing/\n * tiers.ts); nothing here or in the router prefers one provider. Devin seats\n * are routable like any other. The one locality rule: for HARD work Mason is\n * waiting on, a local model (even the elite Qwen) lines up behind the hosted\n * elite seats — it is slower — but still ahead of everything else.\n *\n * PURE and deterministic (callers pass `nowMs`). BROWSER-SAFE: the composer\n * runs it per pause in typing over the seat list it already polls.\n */\nimport { assessSeat, type SeatCapacity } from '../../routing/headroom.js';\nimport type { BudgetEngine } from '../../routing/policy.js';\nimport { COST_BASIS_LABELS, type CostBasis } from '../../routing/tiers.js';\nimport { capacityTier, DEFAULT_ROUTER_WEIGHTS, routeSeat, type RouterWeights } from '../../routing/router.js';\nimport type { BudgetPolicy, SeatDecision } from '../../routing/types.js';\nimport { learnedTilt } from './learning.js';\nimport type {\n AutoMode,\n EngineRoi,\n LearnedTable,\n PromptClassification,\n PromptKind,\n SeatAdvice,\n SeatAdviceOption,\n} from './types.js';\n\n/**\n * Engines the Auto seat may pick — every chat engine (3.15: Devin is a chat\n * seat and an equal partner, so it is routable like Claude and Codex).\n */\nexport const ROUTABLE_ENGINES: readonly BudgetEngine[] = ['claude', 'codex', 'devin', 'grok', 'local'];\n\n/**\n * Mid-conversation head start for the current seat, in ranking positions.\n * Moving re-sends the context as a note and drops the provider's prompt\n * cache, so ordinary work stays put (STICKINESS covers the whole engine\n * ladder at the low-difficulty cost weight). It is small where moving is\n * the point: hard work on a weaker seat, and cheap-first, whose purpose is to\n * come back down to the free seat once the hard turn is done.\n */\nexport const STICKINESS = 3.5;\nexport const STICKINESS_WEAK = 1.25;\n/** Bound on the fleet-ROI tilt, in ranking positions. */\nexport const ROI_MAX_TILT = 0.75;\n/** Fleet evidence below this many dispatches per engine is ignored. */\nexport const ROI_MIN_DISPATCHES = 10;\n/** Where a tool-less local model lands for edit work: behind everything. */\nconst NO_TOOLS_PENALTY = 3;\n/**\n * Hard work Mason is waiting on: an elite local model (slower on this Mac)\n * lines up just behind the LAST hosted elite seat — this far past it, in\n * ranking positions. Latency, not quality: it still beats every fast / free\n * seat, and a hosted elite seat that is held back leaves it first.\n */\nexport const LOCAL_HARD_OFFSET = 0.5;\n\nconst EDIT_KINDS: ReadonlySet<PromptKind> = new Set(['code', 'debug', 'refactor', 'bulk']);\nconst ROI_KINDS: ReadonlySet<PromptKind> = new Set(['code', 'debug', 'refactor', 'bulk', 'review']);\n\nexport interface AdvisorSeat {\n seatId: string;\n engine: string;\n label: string;\n /** The model a new chat on this seat would use (first runnable); null = none runnable. */\n model: string | null;\n /** Runs on this Mac (a local runtime seat). */\n local: boolean;\n /** Local AND its endpoint is loopback — nothing leaves the machine. */\n private: boolean;\n /** Can drive an agentic session; null = the runtime did not say (not \"no\"). */\n supportsTools: boolean | null;\n capacity: SeatCapacity;\n /**\n * 3.15: a runnable model of this seat in a CHEAPER tier than its default\n * (Devin CLI's free SWE), with the capacity it would route as. Used for\n * cheap work only; absent = the seat has one tier.\n */\n cheaper?: { model: string; capacity: SeatCapacity } | null;\n}\n\nexport interface AdviseInput {\n classification: PromptClassification;\n seats: readonly AdvisorSeat[];\n policy: BudgetPolicy;\n mode: AutoMode;\n nowMs: number;\n /** The chat's seat, when there is a chat. */\n currentSeatId?: string | null;\n /** Turns the chat already has; stickiness applies only mid-conversation. */\n turnCount?: number;\n /** What the chat already holds — the router refuses seats it would not fit. */\n contextTokens?: number | null;\n localOnly?: { on: boolean; reason: string | null } | null;\n learned?: LearnedTable | null;\n roi?: Readonly<Record<string, EngineRoi>> | null;\n /** The operator's override: honoured whenever that seat is eligible. */\n pinnedSeatId?: string | null;\n}\n\n/**\n * The λ weights for one message. Only `lambdaCost` moves; pressure and\n * latency keep the router's defaults so headroom stays a tie-breaker inside\n * an engine and latency a tie-breaker inside that.\n */\nexport function weightsFor(classification: PromptClassification, mode: AutoMode): RouterWeights {\n const hard = classification.difficulty === 'high' || (classification.needsFrontier ?? 0) >= 0.7;\n let lambdaCost: number;\n if (mode === 'cheap-first') lambdaCost = hard ? 1 : 4;\n else lambdaCost = hard ? 1 : classification.difficulty === 'low' ? 3 : 1.5;\n return { ...DEFAULT_ROUTER_WEIGHTS, lambdaCost };\n}\n\nfunction roiTilt(roi: AdviseInput['roi'], engine: string, kind: PromptKind): number {\n if (!roi || !ROI_KINDS.has(kind)) return 0;\n const rows = Object.values(roi).filter((r) => r.dispatches >= ROI_MIN_DISPATCHES && r.shipRate !== null);\n const mine = roi[engine];\n if (!mine || mine.dispatches < ROI_MIN_DISPATCHES || mine.shipRate === null || rows.length < 2) return 0;\n const mean = rows.reduce((sum, r) => sum + (r.shipRate ?? 0), 0) / rows.length;\n return -Math.max(-ROI_MAX_TILT, Math.min(ROI_MAX_TILT, (mine.shipRate - mean) * 2));\n}\n\nfunction latencyFromRoi(seats: readonly AdvisorSeat[], roi: AdviseInput['roi']): Record<string, number> | undefined {\n if (!roi) return undefined;\n const out: Record<string, number> = {};\n for (const seat of seats) {\n const ms = roi[seat.engine]?.avgLatencyMs;\n if (typeof ms === 'number' && Number.isFinite(ms) && ms > 0) out[seat.seatId] = ms;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction windowWord(binding: 'session' | 'weekly' | null): string {\n return binding === 'session' ? '5-hour' : 'weekly';\n}\n\n/** How a windowless seat is described: it has no window to be \"N% left\" of. */\nfunction windowlessNote(basis: CostBasis | undefined): string {\n if (basis === 'free') return 'free on your plan';\n if (basis === 'credits') return 'spends credits (ACUs)';\n return `${COST_BASIS_LABELS[basis ?? 'subscription']} · no usage window reported`;\n}\n\n/** \"free · private on this Mac\" / \"62% of its 5-hour window left\" / \"no usage reading\". */\nexport function seatNote(seat: AdvisorSeat, nowMs: number): string {\n if (seat.local) return seat.private ? 'free · private on this Mac' : 'free · local runtime';\n if (seat.capacity.windowless) return windowlessNote(seat.capacity.costBasis);\n const assessed = assessSeat(seat.capacity, { seatId: seat.seatId, enabled: true, reservePercent: 0 }, { nowMs });\n const left = assessed.headroom.autonomyHeadroomPercent;\n if (assessed.exhausted) return 'usage spent';\n if (typeof left !== 'number') return 'no usage reading';\n return `${Math.max(0, left)}% of its ${windowWord(assessed.headroom.bindingWindow)} window left`;\n}\n\nfunction option(seat: AdvisorSeat, nowMs: number): SeatAdviceOption {\n return {\n seatId: seat.seatId, label: seat.label, engine: seat.engine, model: seat.model, local: seat.local, note: seatNote(seat, nowMs),\n tier: capacityTier(seat.capacity),\n };\n}\n\ninterface Ranked {\n seat: AdvisorSeat;\n base: number;\n learned: ReturnType<typeof learnedTilt>;\n roi: number;\n sticky: number;\n tools: number;\n local: number;\n}\n\nfunction total(r: Ranked, withLearned = true, withSticky = true): number {\n return r.base + (withLearned ? r.learned.tilt : 0) + r.roi + (withSticky ? r.sticky : 0) + r.tools + r.local;\n}\n\n/**\n * The seat as it competes for THIS message: its cheaper-tier model for cheap\n * work (when it has one), else itself.\n */\nfunction forMessage(seat: AdvisorSeat, cheap: boolean): AdvisorSeat {\n if (!cheap || !seat.cheaper) return seat;\n return { ...seat, model: seat.cheaper.model, capacity: seat.cheaper.capacity };\n}\n\n\nfunction order(rows: Ranked[], withLearned = true, withSticky = true): Ranked[] {\n // Stable: equal totals keep the router's order.\n return rows.map((r, i) => ({ r, i })).sort((a, b) => (total(a.r, withLearned, withSticky) - total(b.r, withLearned, withSticky)) || a.i - b.i).map((x) => x.r);\n}\n\nfunction clip(text: string, max = 160): string {\n return text.length <= max ? text : `${text.slice(0, max - 1).trimEnd()}…`;\n}\n\n/** Which seat this message should go to. Never throws; `choice: null` says why nothing can. */\nexport function adviseSeat(input: AdviseInput): SeatAdvice {\n const { classification: cls, mode, nowMs } = input;\n const localOnly = { on: input.localOnly?.on === true, reason: input.localOnly?.reason ?? null };\n const hard = cls.difficulty === 'high' || (cls.needsFrontier ?? 0) >= 0.7;\n // Cheap work may use a seat's cheaper-tier model (Devin SWE); hard work never does.\n const cheap = !hard && (mode === 'cheap-first' || cls.difficulty === 'low' || cls.task === 'bulk');\n const known = input.seats\n .filter((s) => (ROUTABLE_ENGINES as readonly string[]).includes(s.engine) && s.model !== null)\n .map((s) => forMessage(s, cheap));\n const pool = localOnly.on ? known.filter((s) => s.local && s.private) : known;\n const byId = new Map(pool.map((s) => [s.seatId, s]));\n const factors: string[] = [];\n if (localOnly.on) factors.push(`This repo is local-only${localOnly.reason ? ` — ${localOnly.reason.replace(/\\.$/, '')}` : ''}.`);\n factors.push(`Read as ${cls.label}${cls.decidedBy === 'jev' ? ` (labelled by Jev, ${Math.round((cls.confidence ?? 0) * 100)}% sure)` : ''}${cls.signals.length > 0 ? `: ${cls.signals.slice(0, 3).join(', ')}` : ''}.`);\n\n const weights = weightsFor(cls, mode);\n const context = Math.max(0, input.contextTokens ?? 0) + cls.estTokens;\n const latencyMs = latencyFromRoi(pool, input.roi);\n const decision: SeatDecision = routeSeat(\n { task: cls.task, difficulty: (cls.needsFrontier ?? 0) >= 0.7 && cls.difficulty !== 'high' ? 'high' : cls.difficulty, contextTokens: context, autonomous: false },\n pool.map((s) => s.capacity),\n input.policy,\n { nowMs, weights, ...(latencyMs ? { latencyMs } : {}) },\n );\n\n const held = decision.exclusions.map((e) => ({\n seatId: e.seatId,\n label: byId.get(e.seatId)?.label ?? e.seatId,\n reason: (e.details?.[0]?.text ?? e.reasons[0] ?? 'Not available right now.').replace(/\\s+$/, ''),\n }));\n\n const midChat = (input.turnCount ?? 0) > 0 && typeof input.currentSeatId === 'string';\n const stickiness = mode === 'cheap-first' || hard ? STICKINESS_WEAK : STICKINESS;\n const rows: Ranked[] = decision.candidates.flatMap((id, index) => {\n const seat = byId.get(id);\n if (!seat) return [];\n return [{\n seat,\n base: index,\n learned: learnedTilt(input.learned, cls.kind, seat),\n roi: roiTilt(input.roi, seat.engine, cls.kind),\n sticky: midChat && id === input.currentSeatId ? -stickiness : 0,\n tools: seat.local && seat.supportsTools === false && EDIT_KINDS.has(cls.kind) ? NO_TOOLS_PENALTY : 0,\n local: 0,\n }];\n });\n if (hard && !localOnly.on) {\n // Only an ELITE local seat competes with hosted elite ones; a free-tier\n // local seat is already behind them.\n const isElite = (r: Ranked) => capacityTier(r.seat.capacity) === 'elite';\n const lastHosted = rows.reduce((max, r) => (!r.seat.local && isElite(r) ? Math.max(max, r.base) : max), -1);\n for (const r of rows) {\n if (r.seat.local && isElite(r) && lastHosted > r.base) r.local = lastHosted - r.base + LOCAL_HARD_OFFSET;\n }\n }\n\n const empty = (why: string): SeatAdvice => ({\n choice: null, stay: false, why, factors, alternatives: [], held, classification: cls, mode, localOnly, routerWhy: decision.why,\n });\n if (rows.length === 0) {\n if (localOnly.on && pool.length === 0) {\n return empty('This repo is local-only and no local model is running — start Ollama or LM Studio, or pick a seat yourself.');\n }\n return empty(clip(decision.summary ?? decision.why));\n }\n\n const ranked = order(rows);\n const pinned = input.pinnedSeatId ? ranked.find((r) => r.seat.seatId === input.pinnedSeatId) ?? null : null;\n const winner = pinned ?? ranked[0]!;\n const seat = winner.seat;\n const stay = typeof input.currentSeatId === 'string' && seat.seatId === input.currentSeatId;\n\n // The ONE reason that decided it — the most specific that actually moved the result.\n const withoutLearned = order(rows, false)[0]!.seat.seatId;\n const withoutSticky = order(rows, true, false)[0]!.seat.seatId;\n const toollessId = order(rows.map((r) => ({ ...r, tools: 0 })))[0]!.seat.seatId;\n const toolless = rows.find((r) => r.seat.seatId === toollessId)!;\n const hostedFirstId = order(rows.map((r) => ({ ...r, local: 0 })))[0]!.seat.seatId;\n const hostedFirst = rows.find((r) => r.seat.seatId === hostedFirstId)!;\n let reason: string;\n if (pinned) {\n reason = 'you pinned this seat';\n } else if (localOnly.on) {\n reason = `${cls.label} on a local-only repo — stays on this Mac`;\n } else if (stay && midChat && withoutSticky !== seat.seatId) {\n reason = `${cls.label}, mid-conversation — moving would re-send the whole context`;\n } else if (winner.learned.phrase && withoutLearned !== seat.seatId) {\n reason = `${cls.label}; ${winner.learned.phrase}`;\n } else if (toolless.seat.seatId !== seat.seatId && toolless.tools > 0) {\n reason = `${cls.label} edits files, and ${toolless.seat.label} cannot use tools`;\n } else if (hostedFirst.seat.seatId !== seat.seatId && hostedFirst.local > 0) {\n reason = `${cls.label} needs the strongest model now — a hosted seat answers faster than ${hostedFirst.seat.label}`;\n } else if (seat.local) {\n reason = mode === 'cheap-first' ? `${cls.label} — local drafts first, escalates only if the draft is weak` : `${cls.label} — free and private on this Mac`;\n } else if (hard) {\n reason = `${cls.label} needs the strongest model`;\n } else {\n reason = cls.label;\n }\n const note = seat.local ? '' : `; ${seatNote(seat, nowMs)}`;\n const why = clip(`${stay ? `Staying on ${seat.label}` : seat.label} — ${reason}${note}.`);\n\n factors.push(`Router (${decision.mode} mode, interactive — fleet reserves do not apply to you): ${decision.summary ?? decision.why}`);\n if (weights.lambdaCost !== DEFAULT_ROUTER_WEIGHTS.lambdaCost) {\n factors.push(`Cost weight ×${weights.lambdaCost} for ${cls.difficulty}-difficulty work${mode === 'cheap-first' ? ' in cheap-first mode' : ''}.`);\n }\n if (winner.learned.phrase) factors.push(`Learned: ${winner.learned.phrase}.`);\n if (winner.roi !== 0) factors.push(`Fleet record: ${seat.engine} ships ${winner.roi < 0 ? 'above' : 'below'} the average for code work.`);\n if (held.length > 0) factors.push(`Held back: ${held.map((h) => `${h.label} (${h.reason.replace(/\\.$/, '').toLowerCase()})`).join('; ')}.`);\n\n return {\n choice: option(seat, nowMs),\n stay,\n why,\n factors,\n alternatives: ranked.filter((r) => r !== winner).slice(0, 4).map((r) => option(r.seat, nowMs)),\n held,\n classification: cls,\n mode,\n localOnly,\n routerWhy: decision.why,\n };\n}\n","/**\n * routes/verse/multimodel/useAutoSeat.ts — the Auto seat for one chat's\n * composer: classify the draft (rules, after a pause in typing), ask the pure\n * advisor over the seat list the app already polls, and say which seat and\n * why. Nothing here sends anything or leaves the page with the draft.\n *\n * Also the per-chat Auto preference (Off / Auto / Cheap-first), kept in\n * localStorage beside the drafts: a view preference, never a server setting.\n */\nimport { useEffect, useMemo, useState, useSyncExternalStore } from 'react';\nimport type { VerseSeat, VerseSession } from '../../../data/api-types.js';\nimport { capacityFromSeat } from '../../../../core/routing/headroom.js';\nimport { seatTier, tierRank } from '../../../../core/routing/tiers.js';\nimport type { BudgetPolicy } from '../../../../core/routing/types.js';\nimport { adviseSeat, type AdvisorSeat } from '../../../../core/verse/multimodel/advisor.js';\nimport { classifyPrompt } from '../../../../core/verse/multimodel/classify.js';\nimport type { AutoMode, LocalModelBadge, MultimodelContext, PromptClassification, SeatAdvice } from '../../../../core/verse/multimodel/types.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { budgetQuery } from '../budget/budget-queries.js';\nimport { getVerseSessionHead, subscribeVerseSession } from '../verse-store.js';\nimport { firstRunnableModel } from '../verse-model.js';\nimport { multimodelContextQuery } from './multimodel-queries.js';\n\nexport type AutoPref = 'off' | AutoMode;\nexport const AUTO_PREFS: readonly AutoPref[] = ['off', 'auto', 'cheap-first'];\nconst PREF_KEY = 'ashlr.verse.multimodel.v1';\nconst DEFAULT_PREF: AutoPref = 'auto';\n/** Classify after this long without a keystroke. */\nexport const CLASSIFY_DEBOUNCE_MS = 250;\n\nfunction readPrefs(): Record<string, AutoPref> {\n try {\n const parsed = JSON.parse(localStorage.getItem(PREF_KEY) ?? '{}') as unknown;\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n const out: Record<string, AutoPref> = {};\n for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) if ((AUTO_PREFS as readonly unknown[]).includes(v)) out[k] = v as AutoPref;\n return out;\n } catch {\n return {};\n }\n}\n\n/** A chat's own choice, else the last one made anywhere (`*`), else Auto. */\nexport function loadAutoPref(sessionId: string | null): AutoPref {\n const prefs = readPrefs();\n return (sessionId ? prefs[sessionId] : undefined) ?? prefs['*'] ?? DEFAULT_PREF;\n}\n\nexport function saveAutoPref(sessionId: string | null, pref: AutoPref): void {\n try {\n const prefs = readPrefs();\n if (sessionId) prefs[sessionId] = pref;\n prefs['*'] = pref;\n // Bounded: the newest 200 chats keep their own choice.\n const entries = Object.entries(prefs);\n const kept = Object.fromEntries(entries.slice(Math.max(0, entries.length - 201)));\n localStorage.setItem(PREF_KEY, JSON.stringify(kept));\n } catch { /* private mode: the choice lasts for this page */ }\n}\n\n/** The chat record from the store, without opening a stream (the host already did). */\nexport function useSessionRecord(sessionId: string | null): VerseSession | null {\n return useSyncExternalStore(\n (listener) => (sessionId ? subscribeVerseSession(sessionId, listener) : () => undefined),\n () => getVerseSessionHead(sessionId).session,\n () => getVerseSessionHead(sessionId).session,\n );\n}\n\nfunction isLoopback(seat: VerseSeat, badges: readonly LocalModelBadge[] | undefined): boolean {\n // The server is the authority on the endpoint; without its badge a local\n // seat is still local, and \"private\" is claimed only when it said so.\n return badges?.find((b) => b.seatId === seat.id)?.private === true;\n}\n\n/**\n * The seat's first runnable model in a CHEAPER tier than `defaultId`'s — the\n * Devin CLI's free SWE next to its elite default (routing/tiers.ts). Null\n * when the seat has one tier.\n */\nfunction cheaperModel(seat: VerseSeat, defaultId: string): string | null {\n const base = tierRank(seatTier(seat.engine, defaultId));\n const found = seat.models.find((m) => !m.unavailableReason && tierRank(seatTier(seat.engine, m.id)) > base);\n return found?.id ?? null;\n}\n\n/** Project the polled seats into what the advisor ranks. Every chat engine, Devin included. */\nexport function toAdvisorSeats(seats: readonly VerseSeat[], badges?: readonly LocalModelBadge[]): AdvisorSeat[] {\n return seats.flatMap((seat) => {\n if (seat.health.state === 'unavailable') return [];\n const model = firstRunnableModel(seat);\n if (!model) return [];\n const local = seat.engine === 'local';\n const badge = badges?.find((b) => b.seatId === seat.id);\n const cheaper = cheaperModel(seat, model.id);\n return [{\n seatId: seat.id,\n engine: seat.engine,\n label: seat.label,\n model: model.id,\n local,\n private: local && isLoopback(seat, badges),\n supportsTools: badge?.supportsTools ?? null,\n capacity: capacityFromSeat(seat, undefined, model.id),\n ...(cheaper ? { cheaper: { model: cheaper, capacity: capacityFromSeat(seat, undefined, cheaper) } } : {}),\n }];\n });\n}\n\nfunction useDebounced<T>(value: T, ms: number): T {\n const [out, setOut] = useState(value);\n useEffect(() => {\n const id = setTimeout(() => setOut(value), ms);\n return () => clearTimeout(id);\n }, [value, ms]);\n return out;\n}\n\nexport interface AutoSeatState {\n session: VerseSession | null;\n context: MultimodelContext | null;\n policy: BudgetPolicy | null;\n classification: PromptClassification | null;\n advice: SeatAdvice | null;\n advisorSeats: AdvisorSeat[];\n /** Re-advise with a label from the decision layer (once per send). */\n adviseWith(classification: PromptClassification, pinnedSeatId?: string | null): SeatAdvice | null;\n}\n\nconst FALLBACK_POLICY: BudgetPolicy = { mode: 'balanced', seats: {}, updatedAt: new Date(0).toISOString() };\n\nexport function useAutoSeat(input: {\n sessionId: string | null;\n seats: readonly VerseSeat[];\n text: string;\n pref: AutoPref;\n pinnedSeatId: string | null;\n}): AutoSeatState {\n const session = useSessionRecord(input.sessionId);\n // By chat id: the server checks EVERY root the chat reaches, not just the primary.\n const context = useQuery(multimodelContextQuery(input.sessionId ? { sessionId: input.sessionId } : { projectPath: null })).data ?? null;\n const budget = useQuery(budgetQuery).data ?? null;\n const policy: BudgetPolicy | null = budget ? { mode: budget.mode, seats: budget.seats, updatedAt: budget.updatedAt } : null;\n const draft = useDebounced(input.text.trim(), CLASSIFY_DEBOUNCE_MS);\n const contextTokens = session?.usage?.contextTokens ?? 0;\n const advisorSeats = useMemo(() => toAdvisorSeats(input.seats, context?.local), [input.seats, context?.local]);\n\n const classification = useMemo(\n () => (draft && input.pref !== 'off' ? classifyPrompt(draft, { contextTokens }) : null),\n [draft, input.pref, contextTokens],\n );\n\n const adviseWith = (cls: PromptClassification, pinnedSeatId: string | null = input.pinnedSeatId): SeatAdvice | null => {\n // No advice until the privacy check (context) has answered: a local-only\n // repo must never be routed off this Mac on a guess.\n if (input.pref === 'off' || context === null) return null;\n return adviseSeat({\n classification: cls,\n seats: advisorSeats,\n policy: policy ?? FALLBACK_POLICY,\n mode: input.pref,\n nowMs: Date.now(),\n currentSeatId: session?.seatId ?? null,\n turnCount: session?.turnCount ?? 0,\n contextTokens,\n localOnly: context?.localOnly ?? null,\n learned: context?.learned ?? null,\n roi: context?.roi ?? null,\n pinnedSeatId,\n });\n };\n\n // Recomputed per render on purpose: capacity readings age, and the advisor\n // is cheap (a sort over a handful of seats).\n const advice = classification ? adviseWith(classification) : null;\n return { session, context, policy, classification, advice, advisorSeats, adviseWith };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-_izD07R9.js";var n=e(t(),1),r=`ashlr.verse.onboarding.v1`,i={completedAt:null,dismissedAt:null,expanded:!1,step:0};function a(){try{let e=localStorage.getItem(r);if(!e)return i;let t=JSON.parse(e);return!t||typeof t!=`object`?i:{completedAt:typeof t.completedAt==`string`?t.completedAt:null,dismissedAt:typeof t.dismissedAt==`string`?t.dismissedAt:null,expanded:t.expanded===!0,step:typeof t.step==`number`&&Number.isFinite(t.step)?Math.max(0,Math.trunc(t.step)):0}}catch{return{...i,dismissedAt:new Date(0).toISOString()}}}function o(){let e={completedAt:l.completedAt,dismissedAt:l.dismissedAt,expanded:l.expanded,step:l.step};try{localStorage.setItem(r,JSON.stringify(e))}catch{}}function s(e){return e.completedAt===null&&e.dismissedAt===null}var c=a(),l={completedAt:c.completedAt,dismissedAt:c.dismissedAt,open:s(c),expanded:c.expanded,step:c.step},u=new Set;function d(e,t=!1){let n={...l,...e};if(!Object.keys(e).every(e=>Object.is(l[e],n[e]))){l=n,t&&o();for(let e of u)e()}}function f(e){return u.add(e),()=>u.delete(e)}function p(){return l}function m(e){d({step:Math.max(0,Math.trunc(e))},!0)}function h(){d({expanded:!0},!0)}function g(){d({expanded:!1},!0)}function _(){d({dismissedAt:new Date().toISOString(),open:!1},!0)}function v(){d({completedAt:new Date().toISOString(),open:!1},!0)}function y(){d({open:!0,expanded:!0,step:0})}function b(){return(0,n.useSyncExternalStore)(f,p,p)}export{h as a,_ as i,g as n,y as o,v as r,m as s,b as t};
2
+ //# sourceMappingURL=useOnboarding-BAmRBxkI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOnboarding-BAmRBxkI.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/onboarding/onboarding-store.ts","../../../../../../src/web-ui/routes/verse/onboarding/useOnboarding.ts"],"sourcesContent":["/**\n * routes/verse/onboarding/onboarding-store.ts — whether the first-run tour\n * is showing, and whether it has already been answered.\n *\n * Framework-free, same shape as verse-ui-store.ts: a module-level snapshot,\n * a listener set, and one `useSyncExternalStore` hook in ./useOnboarding.ts.\n *\n * Persisted under `ashlr.verse.onboarding.v1`. Two facts are stored and they\n * are deliberately different:\n *\n * - `completedAt` — the operator walked to the end.\n * - `dismissedAt` — the operator skipped, or closed it part-way.\n *\n * Either one silences the tour for good; storing which happened means a\n * later build can tell \"has seen it\" from \"chose not to\", and it makes the\n * Settings replay affordance honest about what it is replaying.\n *\n * Two UI prefs ride along in the same record:\n *\n * - `expanded` — the tour starts as a one-line chip (\"Getting started\n * 1/6 →\") and only becomes the full card when the operator opens it. A\n * 420×640 card over every surface on first launch covered half a 900px\n * window; the chip asks for nothing. Whichever the operator last chose\n * is kept across launches.\n * - `step` — where they were, so the chip's \"2/6\" survives a relaunch.\n *\n * SHOWING IT IS FAIL-SAFE IN THE QUIET DIRECTION. A storage read that throws\n * (private window, storage disabled) or returns something malformed resolves\n * to NOT showing the tour. A first-run flow that reappears on every launch\n * because storage is unavailable would be worse than one that never appears:\n * the app is fully usable without it, and it is reachable from Settings.\n */\n\nexport interface OnboardingRecord {\n /** ISO timestamp of the run that reached the last step. */\n completedAt: string | null;\n /** ISO timestamp of a skip or an early close. */\n dismissedAt: string | null;\n}\n\n/** What is stored: the answer plus the two UI prefs. */\ninterface StoredOnboarding extends OnboardingRecord {\n expanded: boolean;\n step: number;\n}\n\nexport interface OnboardingState extends OnboardingRecord {\n /** Is the flow on screen right now (as the chip or the card)? */\n open: boolean;\n /** The full card (true) or the one-line chip (false). */\n expanded: boolean;\n /** 0-based index into the step list (./onboarding-model.ts ONBOARDING_STEPS). */\n step: number;\n}\n\nexport const VERSE_ONBOARDING_STORAGE_KEY = 'ashlr.verse.onboarding.v1';\n\nconst EMPTY: StoredOnboarding = { completedAt: null, dismissedAt: null, expanded: false, step: 0 };\n\nfunction readStored(): StoredOnboarding {\n try {\n const raw = localStorage.getItem(VERSE_ONBOARDING_STORAGE_KEY);\n if (!raw) return EMPTY;\n const parsed = JSON.parse(raw) as Partial<StoredOnboarding> | null;\n if (!parsed || typeof parsed !== 'object') return EMPTY;\n return {\n completedAt: typeof parsed.completedAt === 'string' ? parsed.completedAt : null,\n dismissedAt: typeof parsed.dismissedAt === 'string' ? parsed.dismissedAt : null,\n expanded: parsed.expanded === true,\n step: typeof parsed.step === 'number' && Number.isFinite(parsed.step) ? Math.max(0, Math.trunc(parsed.step)) : 0,\n };\n } catch {\n // Unreadable storage means \"answered\" — see the fail-safe note above.\n return { ...EMPTY, dismissedAt: new Date(0).toISOString() };\n }\n}\n\nfunction persist(): void {\n const stored: StoredOnboarding = {\n completedAt: state.completedAt,\n dismissedAt: state.dismissedAt,\n expanded: state.expanded,\n step: state.step,\n };\n try {\n localStorage.setItem(VERSE_ONBOARDING_STORAGE_KEY, JSON.stringify(stored));\n } catch {\n /* best-effort: a private window without storage still runs the app */\n }\n}\n\n/** True when neither answer has been recorded yet. */\nexport function isFirstRun(record: OnboardingRecord): boolean {\n return record.completedAt === null && record.dismissedAt === null;\n}\n\nconst initialStored = readStored();\n\nlet state: OnboardingState = {\n completedAt: initialStored.completedAt,\n dismissedAt: initialStored.dismissedAt,\n open: isFirstRun(initialStored),\n expanded: initialStored.expanded,\n step: initialStored.step,\n};\n\nconst listeners = new Set<() => void>();\n\n/** Apply `delta`; notify (and, with `save`, persist) only when something changed. */\nfunction patch(delta: Partial<OnboardingState>, save = false): void {\n const next = { ...state, ...delta };\n if ((Object.keys(delta) as (keyof OnboardingState)[]).every((k) => Object.is(state[k], next[k]))) return;\n state = next;\n if (save) persist();\n for (const l of listeners) l();\n}\n\nexport function subscribeOnboarding(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function getOnboardingState(): OnboardingState {\n return state;\n}\n\nexport function setOnboardingStep(step: number): void {\n patch({ step: Math.max(0, Math.trunc(step)) }, true);\n}\n\n/** The chip was clicked: show the full card. */\nexport function expandOnboarding(): void {\n patch({ expanded: true }, true);\n}\n\n/** Back to the one-line chip — the tour is NOT answered, just out of the way. */\nexport function collapseOnboarding(): void {\n patch({ expanded: false }, true);\n}\n\n/** Skip, or the chip's × — the same answer. */\nexport function dismissOnboarding(): void {\n patch({ dismissedAt: new Date().toISOString(), open: false }, true);\n}\n\n/** Walked to the end. */\nexport function completeOnboarding(): void {\n patch({ completedAt: new Date().toISOString(), open: false }, true);\n}\n\n/** Settings → \"Replay onboarding\". Reopens at the first step, as the full\n * card (the operator asked for it); the stored answer is kept, so closing\n * the replay does not re-arm the first run. */\nexport function replayOnboarding(): void {\n patch({ open: true, expanded: true, step: 0 });\n}\n\n/** Test hygiene — forgets the stored answer and re-arms the first run (as the chip). */\nexport function resetOnboarding(): void {\n try {\n localStorage.removeItem(VERSE_ONBOARDING_STORAGE_KEY);\n } catch {\n /* ignore */\n }\n state = { completedAt: null, dismissedAt: null, open: true, expanded: false, step: 0 };\n for (const l of listeners) l();\n}\n","/**\n * routes/verse/onboarding/useOnboarding.ts — the single React binding over\n * onboarding-store.ts, kept in its own file for the same reason\n * useVerseUi.ts is: the store stays framework-free and unit-testable\n * without a DOM.\n */\nimport { useSyncExternalStore } from 'react';\nimport { getOnboardingState, subscribeOnboarding, type OnboardingState } from './onboarding-store.js';\n\nexport function useOnboarding(): OnboardingState {\n return useSyncExternalStore(subscribeOnboarding, getOnboardingState, getOnboardingState);\n}\n"],"mappings":"0GAuDa,EAA+B,4BAEtC,EAA0B,CAAE,YAAa,KAAM,YAAa,KAAM,SAAU,GAAO,KAAM,CAAE,EAEjG,SAAS,GAA+B,CACtC,GAAI,CACF,IAAM,EAAM,aAAa,QAAQ,CAA4B,EAC7D,GAAI,CAAC,EAAK,OAAO,EACjB,IAAM,EAAS,KAAK,MAAM,CAAG,EAE7B,MADI,CAAC,GAAU,OAAO,GAAW,SAAiB,EAC3C,CACL,YAAa,OAAO,EAAO,aAAgB,SAAW,EAAO,YAAc,KAC3E,YAAa,OAAO,EAAO,aAAgB,SAAW,EAAO,YAAc,KAC3E,SAAU,EAAO,WAAa,GAC9B,KAAM,OAAO,EAAO,MAAS,UAAY,OAAO,SAAS,EAAO,IAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAO,IAAI,CAAC,EAAI,CACjH,CACF,MAAQ,CAEN,MAAO,CAAE,GAAG,EAAO,YAAa,IAAI,KAAK,CAAC,CAAA,CAAE,YAAY,CAAE,CAC5D,CACF,CAEA,SAAS,GAAgB,CACvB,IAAM,EAA2B,CAC/B,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,SAAU,EAAM,SAChB,KAAM,EAAM,IACd,EACA,GAAI,CACF,aAAa,QAAQ,EAA8B,KAAK,UAAU,CAAM,CAAC,CAC3E,MAAQ,CAER,CACF,CAGA,SAAgB,EAAW,EAAmC,CAC5D,OAAO,EAAO,cAAgB,MAAQ,EAAO,cAAgB,IAC/D,CAEA,IAAM,EAAgB,EAAW,EAE7B,EAAyB,CAC3B,YAAa,EAAc,YAC3B,YAAa,EAAc,YAC3B,KAAM,EAAW,CAAa,EAC9B,SAAU,EAAc,SACxB,KAAM,EAAc,IACtB,EAEM,EAAY,IAAI,IAGtB,SAAS,EAAM,EAAiC,EAAO,GAAa,CAClE,IAAM,EAAO,CAAE,GAAG,EAAO,GAAG,CAAM,EAC7B,WAAO,KAAK,CAAK,CAAC,CAA+B,MAAO,GAAM,OAAO,GAAG,EAAM,GAAI,EAAK,EAAE,CAAC,EAE/F,CADA,EAAQ,EACJ,GAAM,EAAQ,EAClB,IAAK,IAAM,KAAK,EAAW,EAAE,CADX,CAEpB,CAEA,SAAgB,EAAoB,EAAkC,CAEpE,OADA,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC,CAEA,SAAgB,GAAsC,CACpD,OAAO,CACT,CAEA,SAAgB,EAAkB,EAAoB,CACpD,EAAM,CAAE,KAAM,KAAK,IAAI,EAAG,KAAK,MAAM,CAAI,CAAC,CAAE,EAAG,EAAI,CACrD,CAGA,SAAgB,GAAyB,CACvC,EAAM,CAAE,SAAU,EAAK,EAAG,EAAI,CAChC,CAGA,SAAgB,GAA2B,CACzC,EAAM,CAAE,SAAU,EAAM,EAAG,EAAI,CACjC,CAGA,SAAgB,GAA0B,CACxC,EAAM,CAAE,YAAa,IAAI,KAAK,CAAA,CAAE,YAAY,EAAG,KAAM,EAAM,EAAG,EAAI,CACpE,CAGA,SAAgB,GAA2B,CACzC,EAAM,CAAE,YAAa,IAAI,KAAK,CAAA,CAAE,YAAY,EAAG,KAAM,EAAM,EAAG,EAAI,CACpE,CAKA,SAAgB,GAAyB,CACvC,EAAM,CAAE,KAAM,GAAM,SAAU,GAAM,KAAM,CAAE,CAAC,CAC/C,CClJA,SAAgB,GAAiC,CAC/C,OAAA,EAAO,EAAA,qBAAA,CAAqB,EAAqB,EAAoB,CAAkB,CACzF"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-_izD07R9.js";import{l as n,u as r}from"./global-CYfRwH6t.js";import{a as i}from"./health-queries-BHoSyIcL.js";var a=e(t(),1),o=3e4;function s(e=!0){let t=n(i),s=r(i);return(0,a.useEffect)(()=>{if(!e)return;let t=()=>{(typeof document>`u`||document.visibilityState!==`hidden`)&&s()},n=window.setInterval(t,o);return document.addEventListener(`visibilitychange`,t),()=>{window.clearInterval(n),document.removeEventListener(`visibilitychange`,t)}},[e,s]),t}export{s as t};
2
+ //# sourceMappingURL=useSeatHealth-DPkSSddF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSeatHealth-DPkSSddF.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/health/useSeatHealth.ts"],"sourcesContent":["/**\n * routes/verse/health/useSeatHealth.ts — the seat health reports, kept live\n * while the app is on screen.\n *\n * The SERVER sweeps every ten minutes whether or not anyone looks\n * (core/verse/account-health.ts) — that is what catches a sign-out while the\n * app is hidden, and it is what the desktop shell's notifications read. This\n * hook only has to keep a VISIBLE page current, so it polls a cheap cached\n * read every 30 s (no probe runs per request), skips ticks while hidden, and\n * re-reads the moment the page is looked at again.\n */\nimport { useEffect } from 'react';\nimport type { VerseHealthResponse } from '../../../../core/verse/health-types.js';\nimport type { QueryEntry } from '../../../data/cache.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { verseHealthQuery } from './health-queries.js';\n\n/** The fastest poll the performance budget allows is 2 s; 30 s is plenty for a status line. */\nexport const HEALTH_POLL_MS = 30_000;\n\nexport function useSeatHealth(active = true): QueryEntry<VerseHealthResponse> {\n const entry = useQuery(verseHealthQuery);\n const refetch = useRefetch(verseHealthQuery);\n useEffect(() => {\n if (!active) return;\n const tick = (): void => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return;\n refetch();\n };\n const timer = window.setInterval(tick, HEALTH_POLL_MS);\n document.addEventListener('visibilitychange', tick);\n return () => {\n window.clearInterval(timer);\n document.removeEventListener('visibilitychange', tick);\n };\n }, [active, refetch]);\n return entry;\n}\n"],"mappings":"2MAkBa,EAAiB,IAE9B,SAAgB,EAAc,EAAS,GAAuC,CAC5E,IAAM,EAAQ,EAAS,CAAgB,EACjC,EAAU,EAAW,CAAgB,EAc3C,OAbA,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,EAAQ,OACb,IAAM,MAAmB,EACnB,OAAO,SAAa,KAAe,SAAS,kBAAoB,WACpE,EAAQ,CACV,EACM,EAAQ,OAAO,YAAY,EAAM,CAAc,EAErD,OADA,SAAS,iBAAiB,mBAAoB,CAAI,MACrC,CACX,OAAO,cAAc,CAAK,EAC1B,SAAS,oBAAoB,mBAAoB,CAAI,CACvD,CACF,EAAG,CAAC,EAAQ,CAAO,CAAC,EACb,CACT"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-_izD07R9.js";import{B as n,W as r,i}from"./global-CYfRwH6t.js";import"./VerseShared-CFE5B-IY.js";import{n as a,t as o}from"./verse-bootstrap-query-ANtL2OPN.js";import{n as s}from"./health-queries-BHoSyIcL.js";var c=e(t(),1),l=3e4,u=`/api/verse/seats`;function d(e,t){return{...e,seats:t.seats,localRuntime:t.localRuntime}}function f(){let e=n(o).data,t=()=>a.fetch();return e===void 0?r(o,t):r(o,s(async()=>{let t=await i(u);return d(n(`verse-bootstrap`).data??e,t)},t))}function p(e=!0){let t=(0,c.useCallback)(()=>{f()},[]);(0,c.useEffect)(()=>{if(!e)return;let n=()=>{(typeof document>`u`||document.visibilityState!==`hidden`)&&t()},r=window.setInterval(n,l);return document.addEventListener(`visibilitychange`,n),()=>{window.clearInterval(r),document.removeEventListener(`visibilitychange`,n)}},[e,t])}export{p as t};
2
+ //# sourceMappingURL=useSeatsRefresh-CpsRhfmt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSeatsRefresh-CpsRhfmt.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/useSeatsRefresh.ts"],"sourcesContent":["/**\n * routes/verse/useSeatsRefresh.ts — keep the seat roster live.\n *\n * THE BUG THIS CLOSES. `GET /api/verse/bootstrap` carries the seats, and it\n * has NO entry in sse.ts's `EVENT_TO_CACHE_KEYS`: nothing on the server can\n * push a new reading into it. It is re-read only on mount and after a write\n * (`invalidateVerseLists`). The account collector, meanwhile, needs roughly a\n * cycle and a half — about 75 seconds measured — before its first readings\n * exist. Open the app cold, as Mason does, and the one read that ever happens\n * lands BEFORE any reading exists. Every seat then shows \"unknown\" for the\n * rest of the session, on the surface he looks at all day, and no amount of\n * correct rendering downstream can fix that.\n *\n * So the chat surfaces poll. The cost is a cached JSON read, not a probe: the\n * collector spawns its processes on its own 30s cycle regardless of whether\n * anyone asks, and this only picks up what it already published. Owner S's\n * V2.1 bootstrap handler recomputes seat telemetry on every read\n * (`liveSeats` in core/verse/verse-api.ts), so a poll of this key genuinely\n * returns the collector's CURRENT state rather than a warm cache.\n *\n * V3.10 — POLL `GET /api/verse/seats`, NOT BOOTSTRAP. Bootstrap also\n * re-reads projects, preferences and the workspace registry; measured, it\n * blocked the server's event loop ~384 ms per poll (research r2/perf-server).\n * `/seats` is the same live seat list and nothing else. The seats still have\n * to land in the `verse-bootstrap` cache key, because that is what ChatSection\n * hands to the sidebar, workspace, seat selector and new-chat dialog — so the\n * poll MERGES `/seats` into the cached bootstrap (`mergeSeatsIntoBootstrap`)\n * instead of re-reading all of it.\n *\n * The cache remembers the last fetcher it ran for a key and re-runs it on\n * every later `invalidate` (after a write). A plain \"/seats and merge\" fetcher\n * would therefore turn every later full refresh into a seats-only one; the\n * poll registers a ONE-SHOT fetcher (health/health-queries.ts\n * `oneShotFetcher`) that merges once and falls back to the real bootstrap read.\n * With no bootstrap cached yet there is nothing to merge into, so the poll\n * reads bootstrap itself.\n *\n * Two deliberate choices:\n *\n * - Refetch semantics, not refresh. A refetch collapses a burst of ticks (and\n * a tick landing on a read that just started) into ONE request, which is\n * what a poll wants. A forced refresh never joins, which is what a person\n * pressing a button wants; the panel's own Refresh control uses that.\n * - Nothing is requested while the document is hidden, and a read is issued\n * the moment it becomes visible again. A backgrounded app polls zero times\n * and is nonetheless correct the instant it is looked at.\n */\nimport { useCallback, useEffect } from 'react';\nimport type { VerseBootstrap } from '../../data/api-types.js';\nimport type { VerseSeatsResponse } from '../../../core/verse/types.js';\nimport { getQuerySnapshot, refetchQuery } from '../../data/cache.js';\nimport { apiGet } from '../../data/client.js';\nimport { oneShotFetcher } from './health/health-queries.js';\nimport { VERSE_BOOTSTRAP_KEY, verseBootstrapQuery } from './verse-queries.js';\n\n/** Matches the collector's own publish cadence; there is nothing to gain from faster. */\nexport const SEATS_POLL_MS = 30_000;\n\nexport const VERSE_SEATS_URL = '/api/verse/seats';\n\n/** The cached bootstrap with its seat list (and local runtime) replaced by a live `/seats` read. */\nexport function mergeSeatsIntoBootstrap(bootstrap: VerseBootstrap, live: VerseSeatsResponse): VerseBootstrap {\n return { ...bootstrap, seats: live.seats, localRuntime: live.localRuntime };\n}\n\n/** One poll tick: `/seats` merged into the cached bootstrap, or a full bootstrap when none is cached. */\nexport function pollSeats(): Promise<void> {\n const cached = getQuerySnapshot<VerseBootstrap>(VERSE_BOOTSTRAP_KEY).data;\n const full = (): Promise<VerseBootstrap> => verseBootstrapQuery.fetch();\n if (cached === undefined) return refetchQuery(VERSE_BOOTSTRAP_KEY, full);\n const merged = async (): Promise<VerseBootstrap> => {\n const live = await apiGet<VerseSeatsResponse>(VERSE_SEATS_URL);\n // Merge into whatever is cached NOW, not at tick time: a write may have\n // refreshed the rest of the bootstrap while this read was in flight.\n const current = getQuerySnapshot<VerseBootstrap>(VERSE_BOOTSTRAP_KEY).data ?? cached;\n return mergeSeatsIntoBootstrap(current, live);\n };\n return refetchQuery(VERSE_BOOTSTRAP_KEY, oneShotFetcher(merged, full));\n}\n\nexport function useSeatsRefresh(active = true): void {\n const refetch = useCallback(() => { void pollSeats(); }, []);\n useEffect(() => {\n if (!active) return;\n const tick = (): void => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return;\n refetch();\n };\n const timer = window.setInterval(tick, SEATS_POLL_MS);\n document.addEventListener('visibilitychange', tick);\n return () => {\n window.clearInterval(timer);\n document.removeEventListener('visibilitychange', tick);\n };\n }, [active, refetch]);\n}\n"],"mappings":"8SAwDa,EAAgB,IAEhB,EAAkB,mBAG/B,SAAgB,EAAwB,EAA2B,EAA0C,CAC3G,MAAO,CAAE,GAAG,EAAW,MAAO,EAAK,MAAO,aAAc,EAAK,YAAa,CAC5E,CAGA,SAAgB,GAA2B,CACzC,IAAM,EAAS,EAAiC,CAAmB,CAAC,CAAC,KAC/D,MAAsC,EAAoB,MAAM,EAStE,OARI,IAAW,IAAA,GAAkB,EAAa,EAAqB,CAAI,EAQhE,EAAa,EAAqB,EAAe,SAPJ,CAClD,IAAM,EAAO,MAAM,EAA2B,CAAe,EAI7D,OAAO,EADS,EAAA,iBAAoD,CAAC,CAAC,MAAQ,EACtC,CAAI,CAC9C,EACgE,CAAI,CAAC,CACvE,CAEA,SAAgB,EAAgB,EAAS,GAAY,CACnD,IAAM,GAAA,EAAU,EAAA,YAAA,KAAkB,CAAE,EAAe,CAAG,EAAG,CAAC,CAAC,GAC3D,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,EAAQ,OACb,IAAM,MAAmB,EACnB,OAAO,SAAa,KAAe,SAAS,kBAAoB,WACpE,EAAQ,CACV,EACM,EAAQ,OAAO,YAAY,EAAM,CAAa,EAEpD,OADA,SAAS,iBAAiB,mBAAoB,CAAI,MACrC,CACX,OAAO,cAAc,CAAK,EAC1B,SAAS,oBAAoB,mBAAoB,CAAI,CACvD,CACF,EAAG,CAAC,EAAQ,CAAO,CAAC,CACtB"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-_izD07R9.js";import{N as n,S as r,w as i}from"./global-CYfRwH6t.js";import{C as a,d as o,l as s}from"./VerseShared-CFE5B-IY.js";import{a as c,c as l,d as u,f as d,i as f,m as p,r as m,s as h,t as g}from"./verse-store-DAqqNIyD.js";import{a as _,r as v}from"./use-chat-activity-O8I0Ho0m.js";var y=e(t(),1),b=9e4,x=250;function S(e,t){if(n()){let n=Number.isSafeInteger(t)&&t>0?`?after=${t}`:``;return`${a(e,`/events`)}${n}`}let r=Number.isSafeInteger(t)&&t>0?`after=${t}&`:``;return`${a(e,`/events`)}?${r}client=${encodeURIComponent(i())}`}function C(e){return Math.min(1e3*2**e,15e3)}function w(){return globalThis.IS_REACT_ACT_ENVIRONMENT===!0}var T=e=>{let t=!1,n=()=>{t||(t=!0,r!==null&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(r),clearTimeout(i),e())},r=(typeof document>`u`||document.visibilityState!==`hidden`)&&typeof requestAnimationFrame==`function`?requestAnimationFrame(n):null,i=setTimeout(n,r===null?0:x);return()=>{t=!0,r!==null&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(r),clearTimeout(i)}};function E(e){return w()?(e(),null):T(e)}var D=class{sessionId;queue=[];cancel=null;scheduled=!1;constructor(e){this.sessionId=e}push(e){if(this.queue.push(e),this.scheduled)return;this.scheduled=!0;let t=E(()=>this.flush());this.scheduled&&(this.cancel=t)}flush(){if(this.scheduled=!1,this.cancel?.(),this.cancel=null,this.queue.length===0)return;let e=this.queue;this.queue=[],g(this.sessionId,e).settled&&o()}drop(){this.scheduled=!1,this.cancel?.(),this.cancel=null,this.queue=[]}},O=!1,k=0;function A(e){let t=null,n=null,i=0,a=!1,o=!1,s=new D(e),l=()=>{if(a||typeof EventSource>`u`||r().phase!==`authenticated`)return;u(e,i===0?`connecting`:`reconnecting`);let d=O||o?0:c(e).lastSeq,f=new EventSource(S(e,d),{withCredentials:!0}),p=!1;t=f,f.onopen=()=>{p=!0,i=0,o&&=(O=!0,!1),u(e,`open`)};for(let e of v)f.addEventListener(e,e=>{if(t!==f)return;let n=_(e.data);n&&s.push(n)});f.onerror=c=>{if(!(typeof MessageEvent<`u`&&c instanceof MessageEvent)&&(s.flush(),!a)){if(typeof f.readyState==`number`&&f.readyState===k){u(e,`reconnecting`);return}if(f.close(),t===f&&(t=null),u(e,`reconnecting`),r().phase===`authenticated`){if(!p&&d>0&&!o){o=!0,l();return}o=!1,n=setTimeout(()=>{n=null,i+=1,l()},C(i))}}}},d=()=>{n&&clearTimeout(n),n=null,t?.close(),t=null};return l(),{close(){a||(a=!0,d(),s.flush(),s.drop(),u(e,`closed`))},restart(){a||(d(),s.flush(),i=0,l())}}}var j=new Map;function M(e){let t=j.get(e);t&&(j.delete(e),t.idleTimer&&clearTimeout(t.idleTimer),t.stream.close())}function N(){let e=[...j.entries()].filter(([,e])=>e.refs===0).sort((e,t)=>e[1].releasedAt-t[1].releasedAt);for(;e.length>1;)M(e.shift()[0])}function P(e){let t=j.get(e);t?(t.refs+=1,t.idleTimer&&clearTimeout(t.idleTimer),t.idleTimer=null):(t={stream:A(e),refs:1,idleTimer:null,releasedAt:0},j.set(e,t));let n=t,r=!1;return()=>{r||(r=!0,j.get(e)===n&&(--n.refs,!(n.refs>0)&&(n.releasedAt=Date.now(),n.idleTimer=setTimeout(()=>{j.get(e)===n&&n.refs===0&&M(e)},b),N())))}}function F(){for(let e of[...j.keys()])M(e)}p(e=>{e.kind===`reset`?F():M(e.sessionId)});function I(e,t={}){let n=new AbortController,r=null,i=!1,a=()=>{i||r||(r=P(e))},o=c(e);return t.reload!==!0&&o.loaded&&o.loadError===null?a():(t.reload&&j.get(e)?.stream.restart(),s(e,n.signal).then(t=>{n.signal.aborted||(h(e,t.session,t.events),a())}).catch(t=>{n.signal.aborted||l(e,t instanceof Error?t.message:`Could not load this chat.`)})),()=>{i=!0,n.abort(),r?.(),r=null}}var L=()=>()=>{};function R(e){return(0,y.useCallback)(t=>e?d(e,t):L(),[e])}function z(e,t=0){let n=R(e),r=(0,y.useSyncExternalStore)(n,()=>f(e),()=>f(e)),i=(0,y.useRef)({sessionId:null,reload:t});return(0,y.useEffect)(()=>{let n=i.current;if(i.current={sessionId:e,reload:t},e)return I(e,{reload:n.sessionId===e&&n.reload!==t})},[e,t]),r}function B(e){let t=R(e);return(0,y.useSyncExternalStore)(t,()=>m(e),()=>m(e))}export{B as n,z as r,R as t};
2
+ //# sourceMappingURL=useVerseSession-DeW1iFpw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVerseSession-DeW1iFpw.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/session-stream.ts","../../../../../../src/web-ui/routes/verse/useVerseSession.ts"],"sourcesContent":["/**\n * routes/verse/session-stream.ts — the client data path for ONE open chat\n * (V3.10): load it once, resume its live stream from where the store left\n * off, batch what streams in to one store update per animation frame, and\n * keep the connection across section switches.\n *\n * WHY THIS EXISTS (measured before 3.10, scratchpad perf/):\n * - opening a chat raced a full detail fetch against an EventSource that\n * replayed the whole log from seq 0, and every replayed frame was applied\n * and rendered on its own — 2.45 s for a 5k-event chat, 17 s for 10k;\n * - every reconnect (at least one per 15-minute read session) replayed the\n * whole log again, because a hand-made EventSource sends no Last-Event-ID;\n * - every replayed `turn-done` refetched the session list and bootstrap;\n * - leaving the Chat section closed the stream, so coming back replayed.\n *\n * THE PATH NOW\n * 1. `openVerseSession(id)` fetches the detail ONCE when the store has not\n * loaded the chat, seeds the store, and only then attaches the stream —\n * so the two never race.\n * 2. The stream URL carries `?after=<lastSeq>` (the highest PERSISTED seq\n * the store holds). The server replays only what is newer; a server that\n * predates `after` replays everything and the store's seq dedupe drops\n * it. A server whose auth boundary REFUSES the extra parameter is\n * detected once and served without it (afterRefused). A dropped\n * connection is left to the browser's own reconnect, which resumes by\n * Last-Event-ID.\n * 3. Frames are queued and applied with ONE `applyVerseEvents` call per\n * animation frame (a timer backs rAF up, since a hidden tab gets none).\n * Transient frames (reasoning deltas, progress) ride the same queue in\n * arrival order.\n * 4. The session list is invalidated only when a batch really settled a\n * turn — never for a replayed duplicate.\n * 5. Streams are ref-counted. When the last user lets go (section switch,\n * another chat selected) the connection lingers for IDLE_CLOSE_MS so\n * switching back is instant and costs no replay; at most MAX_IDLE\n * lingering connections are kept, because they share the server's SSE\n * connection cap with /api/events.\n *\n * Auth: every URL carries the per-tab client proof as `?client=` (EventSource\n * cannot send it as a header — see server.ts readSessionClientProof), and a\n * stream never reconnects once the read session is gone.\n */\nimport type { VerseEvent } from '../../data/api-types.js';\nimport { getAuthSnapshot, getReadClientProof } from '../../data/auth-store.js';\nimport { isRemoteMobileMode } from '../../data/remote-mode.js';\nimport { parseVerseEventFrame, VERSE_EVENT_TYPES } from './verse-events.js';\nimport { fetchVerseSessionDetail, invalidateVerseLists, verseSessionPath } from './verse-queries.js';\nimport {\n applyVerseEvents,\n getVerseSessionState,\n seedVerseSession,\n setVerseLoadError,\n setVerseStreamState,\n subscribeVerseStoreLifecycle,\n} from './verse-store.js';\n\n/** How long a released stream stays connected before it is closed. */\nexport const IDLE_CLOSE_MS = 90_000;\n/** Released-but-lingering streams kept at once (they count against the server's SSE cap). */\nexport const MAX_IDLE_STREAMS = 1;\n/** Fallback flush when requestAnimationFrame does not fire (hidden tab, occluded window). */\nconst FRAME_FALLBACK_MS = 250;\n\n/**\n * Per-session stream URL: `?after=<cursor>&client=<proof>`. `after` is\n * omitted for cursor 0 — seqs start at 1, so \"after 0\" and \"from the start\"\n * are the same request, and the bare form is what a server without `after`\n * support has always seen.\n */\nexport function verseSessionStreamUrl(sessionId: string, after: number): string {\n if (isRemoteMobileMode()) {\n const cursor = Number.isSafeInteger(after) && after > 0 ? `?after=${after}` : '';\n return `${verseSessionPath(sessionId, '/events')}${cursor}`;\n }\n const cursor = Number.isSafeInteger(after) && after > 0 ? `after=${after}&` : '';\n return `${verseSessionPath(sessionId, '/events')}?${cursor}client=${encodeURIComponent(getReadClientProof())}`;\n}\n\nfunction backoffMs(attempt: number): number {\n return Math.min(1000 * 2 ** attempt, 15_000);\n}\n\n// ---------------------------------------------------------------------------\n// Frame scheduling\n// ---------------------------------------------------------------------------\n\ntype FrameScheduler = (flush: () => void) => () => void;\n\n/**\n * True inside a React `act()` test environment. There, `act()` is the test\n * declaring \"everything this block causes must be visible after it\", and a\n * frame-deferred flush would land after the assertions — so frames are\n * applied as they arrive, exactly as React applies its own scheduled work\n * inside act. Production never sets the flag.\n */\nfunction inActEnvironment(): boolean {\n return (globalThis as { IS_REACT_ACT_ENVIRONMENT?: unknown }).IS_REACT_ACT_ENVIRONMENT === true;\n}\n\nconst animationFrameScheduler: FrameScheduler = (flush) => {\n let done = false;\n const run = () => {\n if (done) return;\n done = true;\n if (raf !== null && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(raf);\n clearTimeout(timer);\n flush();\n };\n const hidden = typeof document !== 'undefined' && document.visibilityState === 'hidden';\n const raf = !hidden && typeof requestAnimationFrame === 'function' ? requestAnimationFrame(run) : null;\n const timer = setTimeout(run, raf === null ? 0 : FRAME_FALLBACK_MS);\n return () => {\n done = true;\n if (raf !== null && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(raf);\n clearTimeout(timer);\n };\n};\n\nlet customScheduler: FrameScheduler | null = null;\n\n/**\n * Tests: replace the frame scheduler (null restores the default). A scheduler\n * that never calls `flush` lets a test assert what is queued; calling it\n * later simulates the frame.\n */\nexport function setVerseFrameScheduler(scheduler: FrameScheduler | null): void {\n customScheduler = scheduler;\n}\n\nfunction scheduleFrame(flush: () => void): (() => void) | null {\n if (customScheduler) return customScheduler(flush);\n if (inActEnvironment()) {\n flush();\n return null;\n }\n return animationFrameScheduler(flush);\n}\n\n/**\n * Collects frames for one session and applies them once per frame. Returns\n * whether the flushed batch settled a turn, for the list invalidation.\n */\nclass FrameQueue {\n private queue: VerseEvent[] = [];\n private cancel: (() => void) | null = null;\n private scheduled = false;\n\n constructor(private readonly sessionId: string) {}\n\n push(event: VerseEvent): void {\n this.queue.push(event);\n if (this.scheduled) return;\n this.scheduled = true;\n const cancel = scheduleFrame(() => this.flush());\n // A synchronous scheduler (act environment) has already flushed.\n if (this.scheduled) this.cancel = cancel;\n }\n\n /** Apply everything queued now. Safe to call with nothing queued. */\n flush(): void {\n this.scheduled = false;\n this.cancel?.();\n this.cancel = null;\n if (this.queue.length === 0) return;\n const batch = this.queue;\n this.queue = [];\n const result = applyVerseEvents(this.sessionId, batch);\n if (result.settled) invalidateVerseLists();\n }\n\n drop(): void {\n this.scheduled = false;\n this.cancel?.();\n this.cancel = null;\n this.queue = [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// One resumable stream\n// ---------------------------------------------------------------------------\n\ninterface LiveStream {\n close(): void;\n /** Tear down and reconnect from the current cursor (Retry). */\n restart(): void;\n}\n\n/**\n * Set once this page has PROVEN that the server refuses `?after=`: a\n * connection with the cursor closed before it opened, and the same stream\n * without it then opened. A read-session boundary that accepts only the\n * `?client=` proof on SSE paths answers 401 to any extra parameter, and a\n * chat that cannot connect at all is far worse than one that replays (the\n * store drops what it already holds). Page-lifetime only: a server that gains\n * support is used again after a reload.\n */\nlet afterRefused = false;\n\n/** Tests: forget a proven refusal. */\nexport function resetVerseStreamCapabilities(): void {\n afterRefused = false;\n}\n\n/** `EventSource.CONNECTING` — the browser is reconnecting by itself. */\nconst ES_CONNECTING = 0;\n\nfunction openResumableStream(sessionId: string): LiveStream {\n let source: EventSource | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempt = 0;\n let disposed = false;\n /** This connection is the no-`after` retry that tests whether the cursor was refused. */\n let probing = false;\n const queue = new FrameQueue(sessionId);\n\n const connect = () => {\n if (disposed || typeof EventSource === 'undefined') return;\n if (getAuthSnapshot().phase !== 'authenticated') return;\n setVerseStreamState(sessionId, attempt === 0 ? 'connecting' : 'reconnecting');\n // The cursor is read at CONNECT time, after everything already received\n // was applied, so a reconnect asks only for what it has not seen.\n const cursor = afterRefused || probing ? 0 : getVerseSessionState(sessionId).lastSeq;\n const es = new EventSource(verseSessionStreamUrl(sessionId, cursor), { withCredentials: true });\n let opened = false;\n source = es;\n es.onopen = () => {\n opened = true;\n attempt = 0;\n if (probing) {\n afterRefused = true;\n probing = false;\n }\n setVerseStreamState(sessionId, 'open');\n };\n for (const type of VERSE_EVENT_TYPES) {\n es.addEventListener(type, (evt) => {\n if (source !== es) return;\n const event = parseVerseEventFrame((evt as MessageEvent<string>).data);\n if (event) queue.push(event);\n });\n }\n es.onerror = (evt) => {\n // A server-sent event NAMED `error` (a VerseEvent.type) also dispatches\n // through onerror because onerror is the handler for event type \"error\".\n // It arrives as a MessageEvent with data; a real transport failure does\n // not. Without this guard every vendor error replayed on reconnect would\n // tear the stream down again, forever.\n if (typeof MessageEvent !== 'undefined' && evt instanceof MessageEvent) return;\n // Everything received before the drop moves the cursor first.\n queue.flush();\n if (disposed) return;\n // A dropped connection (network blip, server restart, the server\n // closing a congested stream) is retried by the BROWSER, which sends\n // Last-Event-ID — the last persisted seq, since transient frames carry\n // no id — so it resumes without a replay. Only a refused one (an HTTP\n // error) ends up CLOSED and is ours to retry.\n if (typeof es.readyState === 'number' && es.readyState === ES_CONNECTING) {\n setVerseStreamState(sessionId, 'reconnecting');\n return;\n }\n es.close();\n if (source === es) source = null;\n setVerseStreamState(sessionId, 'reconnecting');\n if (getAuthSnapshot().phase !== 'authenticated') return;\n if (!opened && cursor > 0 && !probing) {\n // Refused before it opened, with a cursor: find out at once whether\n // the cursor is what was refused (see afterRefused).\n probing = true;\n connect();\n return;\n }\n probing = false;\n timer = setTimeout(() => {\n timer = null;\n attempt += 1;\n connect();\n }, backoffMs(attempt));\n };\n };\n\n const teardown = () => {\n if (timer) clearTimeout(timer);\n timer = null;\n source?.close();\n source = null;\n };\n\n connect();\n\n return {\n close() {\n if (disposed) return;\n disposed = true;\n teardown();\n // Frames already received still belong in the store (a lingering stream\n // closing mid-turn must not lose its last tokens).\n queue.flush();\n queue.drop();\n setVerseStreamState(sessionId, 'closed');\n },\n restart() {\n if (disposed) return;\n teardown();\n queue.flush();\n attempt = 0;\n connect();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Ref-counted registry\n// ---------------------------------------------------------------------------\n\ninterface RegistryEntry {\n stream: LiveStream;\n refs: number;\n idleTimer: ReturnType<typeof setTimeout> | null;\n /** When the last reference was released (for evicting the oldest lingering stream). */\n releasedAt: number;\n}\n\nconst registry = new Map<string, RegistryEntry>();\n\nfunction closeEntry(sessionId: string): void {\n const entry = registry.get(sessionId);\n if (!entry) return;\n registry.delete(sessionId);\n if (entry.idleTimer) clearTimeout(entry.idleTimer);\n entry.stream.close();\n}\n\nfunction evictIdle(): void {\n const idle = [...registry.entries()].filter(([, e]) => e.refs === 0).sort((a, b) => a[1].releasedAt - b[1].releasedAt);\n while (idle.length > MAX_IDLE_STREAMS) closeEntry(idle.shift()![0]);\n}\n\n/**\n * Hold the live stream for `sessionId` open. Returns the release. The first\n * acquire connects (resuming after the store's cursor); later ones share it.\n */\nexport function acquireVerseSessionStream(sessionId: string): () => void {\n let entry = registry.get(sessionId);\n if (entry) {\n entry.refs += 1;\n if (entry.idleTimer) clearTimeout(entry.idleTimer);\n entry.idleTimer = null;\n } else {\n entry = { stream: openResumableStream(sessionId), refs: 1, idleTimer: null, releasedAt: 0 };\n registry.set(sessionId, entry);\n }\n const held = entry;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (registry.get(sessionId) !== held) return;\n held.refs -= 1;\n if (held.refs > 0) return;\n held.releasedAt = Date.now();\n held.idleTimer = setTimeout(() => {\n if (registry.get(sessionId) === held && held.refs === 0) closeEntry(sessionId);\n }, IDLE_CLOSE_MS);\n evictIdle();\n };\n}\n\n/** Close every live stream (logout; tests). */\nexport function closeAllVerseSessionStreams(): void {\n for (const id of [...registry.keys()]) closeEntry(id);\n}\n\n/** Diagnostics/tests: the sessions with a stream held open, and their reference counts. */\nexport function verseStreamRegistrySnapshot(): Array<{ sessionId: string; refs: number }> {\n return [...registry.entries()].map(([sessionId, e]) => ({ sessionId, refs: e.refs }));\n}\n\n// A deleted chat has no stream to keep; a cleared store (logout, test reset)\n// has no chats at all.\nsubscribeVerseStoreLifecycle((event) => {\n if (event.kind === 'reset') closeAllVerseSessionStreams();\n else closeEntry(event.sessionId);\n});\n\n// ---------------------------------------------------------------------------\n// Opening a chat\n// ---------------------------------------------------------------------------\n\nexport interface OpenVerseSessionOptions {\n /** Re-fetch the detail and reconnect even when the store already holds the chat (the transcript's Retry). */\n reload?: boolean;\n}\n\n/**\n * Show one chat: load it (once) and keep its live stream attached until the\n * returned disposer runs.\n *\n * - Not loaded yet → fetch the detail, seed the store, THEN attach the\n * stream from the seeded cursor. No race, no full replay.\n * - Already loaded (switching back) → attach at once from the cursor; a\n * stream still lingering from the last visit has nothing to catch up.\n * - `reload` → refetch the detail and restart the connection.\n */\nexport function openVerseSession(sessionId: string, options: OpenVerseSessionOptions = {}): () => void {\n const controller = new AbortController();\n let release: (() => void) | null = null;\n let disposed = false;\n\n const attach = () => {\n if (disposed || release) return;\n release = acquireVerseSessionStream(sessionId);\n };\n\n const state = getVerseSessionState(sessionId);\n const needsLoad = options.reload === true || !state.loaded || state.loadError !== null;\n\n if (!needsLoad) {\n attach();\n } else {\n if (options.reload) registry.get(sessionId)?.stream.restart();\n void fetchVerseSessionDetail(sessionId, controller.signal)\n .then((detail) => {\n if (controller.signal.aborted) return;\n seedVerseSession(sessionId, detail.session, detail.events);\n attach();\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n setVerseLoadError(sessionId, err instanceof Error ? err.message : 'Could not load this chat.');\n });\n }\n\n return () => {\n disposed = true;\n controller.abort();\n release?.();\n release = null;\n };\n}\n","/**\n * routes/verse/useVerseSession.ts — the only React glue over verse-store /\n * session-stream (same split as data/hooks.ts over cache.ts + sse.ts).\n *\n * Three hooks, three snapshots, three render frequencies (V3.10):\n *\n * useVerseSession(id) the HEAD: session record, load/stream state and\n * the event log as of the last structural event.\n * Owns opening the chat. Does NOT change per\n * streamed token, so the Chat section, sidebar,\n * header and resources panel stop re-rendering at\n * token rate.\n * useVerseTranscript(id) the derived transcript — changes at most once per\n * animation frame while text streams. Lives in\n * useVerseTranscript.ts: the derivation it reads is\n * kept off the chat first-paint path.\n * useVerseLive(id) transient signals of the running turn\n * (reasoning, progress, retry/watchdog notices).\n *\n * Each subscribes to its own session only, so a stream feeding a lingering\n * chat in the background re-renders nothing that shows another one.\n */\nimport { useCallback, useEffect, useRef, useSyncExternalStore } from 'react';\nimport { openVerseSession } from './session-stream.js';\nimport {\n getVerseLive,\n getVerseSessionHead,\n subscribeVerseSession,\n type Transcript,\n type VerseLiveState,\n type VerseSessionHead,\n} from './verse-store.js';\n\nexport interface VerseSessionView extends VerseSessionHead {\n /**\n * A transcript supplied WITH the view — only a hand-built view (a test, a\n * preview) carries one. The live app leaves it unset and the workspace\n * subscribes to the transcript itself (useVerseTranscript), which is what\n * keeps a streamed token from re-rendering everything that holds the view.\n */\n transcript?: Transcript;\n}\n\nconst noop = () => () => {};\n\nexport function useSessionSubscription(sessionId: string | null) {\n return useCallback(\n (listener: () => void) => (sessionId ? subscribeVerseSession(sessionId, listener) : noop()),\n [sessionId],\n );\n}\n\n/**\n * @param reload bump to re-fetch the detail + reconnect for the same id\n * (the transcript's Retry button).\n */\nexport function useVerseSession(sessionId: string | null, reload = 0): VerseSessionView {\n const subscribe = useSessionSubscription(sessionId);\n const head = useSyncExternalStore(\n subscribe,\n () => getVerseSessionHead(sessionId),\n () => getVerseSessionHead(sessionId),\n );\n\n // Only a BUMP of `reload` for the chat already open means Retry; the\n // counter itself is never reset by the host, so \"reload > 0\" would turn\n // every later selection into a full refetch.\n const lastOpened = useRef<{ sessionId: string | null; reload: number }>({ sessionId: null, reload });\n useEffect(() => {\n const previous = lastOpened.current;\n lastOpened.current = { sessionId, reload };\n if (!sessionId) return undefined;\n return openVerseSession(sessionId, { reload: previous.sessionId === sessionId && previous.reload !== reload });\n }, [sessionId, reload]);\n\n return head;\n}\n\n/** Live (never persisted) signals of the chat's running turn. */\nexport function useVerseLive(sessionId: string | null): VerseLiveState {\n const subscribe = useSessionSubscription(sessionId);\n return useSyncExternalStore(\n subscribe,\n () => getVerseLive(sessionId),\n () => getVerseLive(sessionId),\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-_izD07R9.js";import{t as n}from"./verse-transcript-Dc-bk9l2.js";import{t as r}from"./useVerseSession-DeW1iFpw.js";var i=e(t(),1);function a(e){let t=r(e);return(0,i.useSyncExternalStore)(t,()=>n(e),()=>n(e))}export{a as t};
2
+ //# sourceMappingURL=useVerseTranscript-CvUqjRmZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVerseTranscript-CvUqjRmZ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/useVerseTranscript.ts"],"sourcesContent":["/**\n * routes/verse/useVerseTranscript.ts — the React glue over the derived\n * transcript (verse-transcript.ts).\n *\n * Not in useVerseSession.ts because that module is on the chat first-paint\n * path (the Chat section opens the chat through it) while the transcript is\n * rendered only by lazy chunks (the workspace, the dock). Importing the\n * derivation from there would put it back in the first-paint critical JS.\n */\nimport { useSyncExternalStore } from 'react';\nimport { useSessionSubscription } from './useVerseSession.js';\nimport { getVerseTranscript, type Transcript } from './verse-transcript.js';\n\n/** The transcript of one chat, rebuilt only for the turn that changed. */\nexport function useVerseTranscript(sessionId: string | null): Transcript {\n const subscribe = useSessionSubscription(sessionId);\n return useSyncExternalStore(\n subscribe,\n () => getVerseTranscript(sessionId),\n () => getVerseTranscript(sessionId),\n );\n}\n"],"mappings":"+MAcA,SAAgB,EAAmB,EAAsC,CACvE,IAAM,EAAY,EAAuB,CAAS,EAClD,OAAA,EAAO,EAAA,qBAAA,CACL,MACM,EAAmB,CAAS,MAC5B,EAAmB,CAAS,CACpC,CACF"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./index-_izD07R9.js";import{i as t}from"./global-CYfRwH6t.js";var n=e();function r({size:e=16,title:t,children:r,...i}){return(0,n.jsxs)(`svg`,{width:e,height:e,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,focusable:`false`,...t?{role:`img`}:{"aria-hidden":!0},...i,children:[t?(0,n.jsx)(`title`,{children:t}):null,r]})}var i=e=>(0,n.jsx)(r,{...e,children:(0,n.jsx)(`path`,{d:`M2.5 11.5V4.25A1.75 1.75 0 0 1 4.25 2.5h7.5a1.75 1.75 0 0 1 1.75 1.75v4.5a1.75 1.75 0 0 1-1.75 1.75H5.5L2.5 13.5v-2Z`})}),a=e=>(0,n.jsxs)(r,{...e,children:[(0,n.jsx)(`path`,{d:`M2 9.5 3.6 3.4A1.5 1.5 0 0 1 5.05 2.3h5.9a1.5 1.5 0 0 1 1.45 1.1L14 9.5`}),(0,n.jsx)(`path`,{d:`M2 9.5h3l.8 1.6h4.4l.8-1.6h3v2.6A1.9 1.9 0 0 1 12.1 14H3.9A1.9 1.9 0 0 1 2 12.1V9.5Z`})]}),o=`verse-bootstrap`,s={key:o,fetch:e=>t(`/api/verse/bootstrap`,e)};export{a,i,s as n,r,o as t};
2
+ //# sourceMappingURL=verse-bootstrap-query-ANtL2OPN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verse-bootstrap-query-ANtL2OPN.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/icon-base.tsx","../../../../../../src/web-ui/routes/verse/verse-bootstrap-query.ts"],"sourcesContent":["/**\n * components/primitives/icon-base.tsx — the icon geometry (16px box, 1.5px\n * stroke, round caps/joins, currentColor) and the few glyphs the Verse rail\n * draws at first paint. Everything here is re-exported by icons.tsx, which\n * remains the console's icon set and the import site for everyone else.\n *\n * WHY SPLIT: icons.tsx holds every glyph any surface uses, and the rail is on\n * the chat first-paint path; importing it there put the whole set (~4 KB) in\n * the chat first-paint critical JS (SPEC-310A §1). Add a glyph here only when\n * a first-paint module draws it.\n *\n * Every icon is decorative by default (`aria-hidden`); pass `title` only when\n * the icon is the sole carrier of meaning (it then becomes `role=\"img\"`).\n */\nimport type { ReactNode, SVGProps } from 'react';\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'children' | 'viewBox'> {\n /** Edge length in px. Defaults to 16 — the design language's icon size. */\n size?: number;\n /** Accessible name. Omit for decorative icons (the default). */\n title?: string;\n}\n\nexport function Icon({ size = 16, title, children, ...rest }: IconProps & { children: ReactNode }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n focusable=\"false\"\n {...(title ? { role: 'img' } : { 'aria-hidden': true })}\n {...rest}\n >\n {title ? <title>{title}</title> : null}\n {children}\n </svg>\n );\n}\n\n/** Chat — the transcript section. */\nexport const IconChat = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M2.5 11.5V4.25A1.75 1.75 0 0 1 4.25 2.5h7.5a1.75 1.75 0 0 1 1.75 1.75v4.5a1.75 1.75 0 0 1-1.75 1.75H5.5L2.5 13.5v-2Z\" />\n </Icon>\n);\n\n/** Inbox — approvals. */\nexport const IconInbox = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M2 9.5 3.6 3.4A1.5 1.5 0 0 1 5.05 2.3h5.9a1.5 1.5 0 0 1 1.45 1.1L14 9.5\" />\n <path d=\"M2 9.5h3l.8 1.6h4.4l.8-1.6h3v2.6A1.9 1.9 0 0 1 12.1 14H3.9A1.9 1.9 0 0 1 2 12.1V9.5Z\" />\n </Icon>\n);\n","/**\n * routes/verse/verse-bootstrap-query.ts — the one read every Verse surface\n * starts from (seats, projects, sessions, dispatchEnabled), on its own.\n *\n * verse-queries.ts re-exports it unchanged. It lives apart so the phone app\n * (routes/verse/mobile/) can probe its session and read `dispatchEnabled` at\n * first paint without downloading every other /api/verse/* helper — its\n * first-paint budget (scripts/check-first-paint-budget.mjs) is 250 KB, and\n * React alone is ~220 KB of that.\n */\nimport type { VerseBootstrap } from '../../data/api-types.js';\nimport { apiGet } from '../../data/client.js';\nimport type { QueryDef } from '../../data/queries.js';\n\nexport const VERSE_BOOTSTRAP_KEY = 'verse-bootstrap';\n\nexport const verseBootstrapQuery: QueryDef<VerseBootstrap> = {\n key: VERSE_BOOTSTRAP_KEY,\n fetch: (signal) => apiGet<VerseBootstrap>('/api/verse/bootstrap', signal),\n};\n"],"mappings":"2FAuBA,SAAgB,EAAK,CAAE,OAAO,GAAI,QAAO,WAAU,GAAG,GAA6C,CACjG,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,MAAO,EACP,OAAQ,EACR,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAa,IACb,cAAc,QACd,eAAe,QACf,UAAU,QACV,GAAK,EAAQ,CAAE,KAAM,KAAM,EAAI,CAAE,cAAe,EAAK,EACrD,GAAI,EAXN,SAAA,CAaG,GAAQ,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAQ,CAAa,CAAA,EAAI,KACjC,CACE,GAET,CAGA,IAAa,EAAY,IACvB,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EACR,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,sHAAwH,CAAA,CAC5H,CAAA,EAIK,EAAa,IACxB,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAI,EAAV,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,yEAA2E,CAAA,GACnF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,sFAAwF,CAAA,CAC5F,IC1CK,EAAsB,kBAEtB,EAAgD,CAC3D,IAAK,EACL,MAAQ,GAAW,EAAuB,uBAAwB,CAAM,CAC1E"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./index-_izD07R9.js";import{n as t,r as n}from"./VerseConsoleApp-DO84Xscn.js";import{S as r,a as i,b as a,i as o,u as s,v as c}from"./icons-BBm_Cy62.js";var l=e(),u=s,d=r;function f(e){return(0,l.jsxs)(t,{...e,children:[(0,l.jsx)(`rect`,{x:`2.5`,y:`2.5`,width:`4.5`,height:`4.5`,rx:`1`}),(0,l.jsx)(`rect`,{x:`9`,y:`2.5`,width:`4.5`,height:`4.5`,rx:`1`}),(0,l.jsx)(`rect`,{x:`2.5`,y:`9`,width:`4.5`,height:`4.5`,rx:`1`}),(0,l.jsx)(`rect`,{x:`9`,y:`9`,width:`4.5`,height:`4.5`,rx:`1`})]})}function p(e){return(0,l.jsxs)(t,{...e,children:[(0,l.jsx)(`path`,{d:`M8 4.5C6.6 3.4 4.6 3 2.5 3.2v9c2.1-.2 4.1.2 5.5 1.3`}),(0,l.jsx)(`path`,{d:`M8 4.5c1.4-1.1 3.4-1.5 5.5-1.3v9c-2.1-.2-4.1.2-5.5 1.3`}),(0,l.jsx)(`path`,{d:`M8 4.5v9`})]})}function m(e){return(0,l.jsxs)(t,{...e,children:[(0,l.jsx)(`rect`,{x:`3`,y:`2.5`,width:`10`,height:`11`,rx:`1.5`}),(0,l.jsx)(`path`,{d:`M5.5 6l1 1 1.75-2`}),(0,l.jsx)(`path`,{d:`M5.5 10l1 1 1.75-2`}),(0,l.jsx)(`path`,{d:`M10 6h1`}),(0,l.jsx)(`path`,{d:`M10 10h1`})]})}function h(e){return(0,l.jsx)(t,{...e,children:(0,l.jsx)(`path`,{d:`M9 1.8 3.5 9h4l-1 5.2L12.5 7h-4z`})})}var g={command:n.command,fleet:n.fleet,growth:n.growth,mind:n.mind,chat:n.chat,agents:n.agents,settings:d,apps:f,usage:u,wiki:p,playbooks:m,automations:h},_=a,v=c,y=o,b=i;function x(e){return(0,l.jsxs)(t,{...e,children:[(0,l.jsx)(`rect`,{x:`2.5`,y:`3`,width:`11`,height:`10`,rx:`1.5`}),(0,l.jsx)(`path`,{d:`M10 3v10`})]})}function S(e){return(0,l.jsxs)(t,{...e,children:[(0,l.jsx)(`rect`,{x:`2.5`,y:`3`,width:`11`,height:`10`,rx:`1.5`}),(0,l.jsx)(`path`,{d:`M6 3v10`})]})}function C(e){return(0,l.jsxs)(t,{width:`1em`,height:`1em`,style:{display:`inline-block`,verticalAlign:`-0.125em`},...e,children:[(0,l.jsx)(`path`,{d:`M13 3.5v5a2 2 0 0 1-2 2H3.5`}),(0,l.jsx)(`path`,{d:`M6 8 3.5 10.5 6 13`})]})}export{x as a,C as c,d,S as f,b as i,g as l,p as m,y as n,m as o,u as p,h as r,v as s,f as t,_ as u};
2
+ //# sourceMappingURL=verse-icons-C92Qt7rh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verse-icons-C92Qt7rh.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/verse-icons.tsx"],"sourcesContent":["/**\n * routes/verse/verse-icons.tsx — the icons the shell rail and the chat chrome\n * use, under the names the Verse surfaces already import.\n *\n * Owner A's `components/primitives/icons.tsx` is now the drawing authority:\n * one geometry (16px box, 1.5px stroke, round caps/joins, currentColor), one\n * stroke weight, one accessibility convention. Everything below that has an\n * equivalent there is an ALIAS of it, so the rail and the inbox cannot drift\n * to two different chat glyphs.\n *\n * 3.10 adds the workbench surfaces (Command, Fleet, Growth, Mind), the gear\n * tray and Apps. They are drawn here, not in the shared set, because they\n * name Verse surfaces — a console page borrowing \"Fleet\" would be a lie.\n *\n * Five icons stay drawn here because the shared set has no equivalent and\n * they are Verse-specific chrome, not general console vocabulary:\n * `PanelIcon` / `SidebarIcon` (the two pane toggles, which must read as\n * mirror images of each other), `RailToggleIcon` (the rail's own expand /\n * collapse control, which has to read as the same family as those two),\n * `VerseMark` (the brand mark in the rail head, which is 32px and never takes\n * a color state; drawn in rail-icons.tsx with the other rail glyphs) and `McpIcon` (a plug — the shared set has no connector\n * glyph, and every candidate in it already means another rail section).\n */\nimport {\n IconChevronDown,\n IconChevronRight,\n IconCpu,\n IconGauge,\n IconInbox,\n IconMoon,\n IconPlus,\n IconSearch,\n IconSliders,\n IconTrash,\n type IconProps,\n} from '../../components/primitives/icons.js';\nimport { Icon, RAIL_ICON } from './rail-icons.js';\nimport type { ComponentType } from 'react';\nimport type { VerseSectionId } from './verse-ui-store.js';\n\nexport type { IconProps };\n// The rail's icons (the section glyphs, the gear, the mark) live in\n// rail-icons.tsx so the shell's first paint does not pull this module and the\n// shared icon set in with them; re-exported so the names stay importable here.\nexport {\n ChatIcon,\n CommandIcon,\n FleetIcon,\n GearIcon,\n GrowthIcon,\n MindIcon,\n NeedsYouIcon,\n RAIL_ICON,\n VerseMark,\n} from './rail-icons.js';\n\n// The gear tray's pages: drawn when the tray (or onboarding's tour) opens,\n// never by the rail itself, so not in rail-icons.tsx.\nexport const UsageIcon = IconGauge;\nexport const SettingsIcon = IconSliders;\n\n/** Apps & Accounts — a grid of tiles. */\nexport function AppsIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <rect x=\"2.5\" y=\"2.5\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n <rect x=\"9\" y=\"2.5\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n <rect x=\"2.5\" y=\"9\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n <rect x=\"9\" y=\"9\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n </Icon>\n );\n}\n\n/** Repo wiki — an open book. */\nexport function WikiIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 4.5C6.6 3.4 4.6 3 2.5 3.2v9c2.1-.2 4.1.2 5.5 1.3\" />\n <path d=\"M8 4.5c1.4-1.1 3.4-1.5 5.5-1.3v9c-2.1-.2-4.1.2-5.5 1.3\" />\n <path d=\"M8 4.5v9\" />\n </Icon>\n );\n}\n\n/** Playbooks — a checklist on a page. */\nexport function PlaybooksIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <rect x=\"3\" y=\"2.5\" width=\"10\" height=\"11\" rx=\"1.5\" />\n <path d=\"M5.5 6l1 1 1.75-2\" />\n <path d=\"M5.5 10l1 1 1.75-2\" />\n <path d=\"M10 6h1\" />\n <path d=\"M10 10h1\" />\n </Icon>\n );\n}\n\n/** Automations — a lightning bolt: work that arrives on its own. */\nexport function AutomationsIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M9 1.8 3.5 9h4l-1 5.2L12.5 7h-4z\" />\n </Icon>\n );\n}\n\n/** Every section's glyph: the rail's, plus the tray's. */\nexport const SECTION_ICON: Readonly<Record<VerseSectionId, ComponentType<IconProps>>> = {\n command: RAIL_ICON.command!,\n fleet: RAIL_ICON.fleet!,\n growth: RAIL_ICON.growth!,\n mind: RAIL_ICON.mind!,\n chat: RAIL_ICON.chat!,\n agents: RAIL_ICON.agents!,\n settings: SettingsIcon,\n apps: AppsIcon,\n usage: UsageIcon,\n wiki: WikiIcon,\n playbooks: PlaybooksIcon,\n automations: AutomationsIcon,\n};\n\n/**\n * Aliases onto the shared set. The names are the ones the Verse rail, sidebar\n * and composer already import — keeping them means this reconciliation\n * touched no call site.\n */\nexport const AutonomyIcon = IconCpu;\nexport const ApprovalsIcon = IconInbox;\nexport const SearchIcon = IconSearch;\nexport const PlusIcon = IconPlus;\nexport const TrashIcon = IconTrash;\nexport const ArrowDownIcon = IconChevronDown;\nexport const ChevronIcon = IconChevronRight;\n/** The rail's theme quick-toggle. One glyph for the control, not per-theme. */\nexport const ThemeIcon = IconMoon;\n\nexport function PanelIcon(props: IconProps) {\n return <Icon {...props}><rect x=\"2.5\" y=\"3\" width=\"11\" height=\"10\" rx=\"1.5\" /><path d=\"M10 3v10\" /></Icon>;\n}\n\nexport function SidebarIcon(props: IconProps) {\n return <Icon {...props}><rect x=\"2.5\" y=\"3\" width=\"11\" height=\"10\" rx=\"1.5\" /><path d=\"M6 3v10\" /></Icon>;\n}\n\n/**\n * The Return key (↩) as a key-legend glyph, 1em and inline so it sits in a\n * <kbd> like the letters around it. WHY drawn: of the fonts the console\n * serves, only the 230 KB full Plex face has U+21A9, so typing it into the\n * palette's or the drawer's key legend fetched that face each time one opened\n * (3.10 first-paint review; global.css scopes the full faces).\n */\nexport function ReturnKeyIcon(props: IconProps) {\n return (\n <Icon width=\"1em\" height=\"1em\" style={{ display: 'inline-block', verticalAlign: '-0.125em' }} {...props}>\n <path d=\"M13 3.5v5a2 2 0 0 1-2 2H3.5\" /><path d=\"M6 8 3.5 10.5 6 13\" />\n </Icon>\n );\n}\n\n/**\n * The rail's own expand/collapse control: the same framed panel as the two\n * pane toggles above, plus a chevron saying which way it is about to move.\n * ONE glyph that rotates rather than two drawings, so the control reads as a\n * single thing in two states — and so the state is carried by direction, the\n * one property a user can read without having memorised the other icon.\n */\nexport function RailToggleIcon({ expanded = false, ...props }: IconProps & { expanded?: boolean }) {\n return (\n <Icon {...props}>\n <rect x=\"2.5\" y=\"3\" width=\"11\" height=\"10\" rx=\"1.5\" />\n <path d=\"M6 3v10\" />\n {expanded ? <path d=\"M11.2 6.4 9.6 8l1.6 1.6\" /> : <path d=\"M9.4 6.4 11 8l-1.6 1.6\" />}\n </Icon>\n );\n}\n\n/**\n * MCP — a plug in a socket. Drawn here rather than aliased: the shared set's\n * nearest candidates (`IconCpu`, `IconSliders`, `IconKey`) are already the\n * Autonomy, Settings and credential glyphs, and two rail items that read as\n * the same picture is worse than one more 16px drawing.\n */\nexport function McpIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M6 1.8v3.2M10 1.8v3.2\" />\n <path d=\"M3.8 5h8.4v2.6a4.2 4.2 0 0 1-4.2 4.2 4.2 4.2 0 0 1-4.2-4.2V5Z\" />\n <path d=\"M8 11.8v2.4\" />\n </Icon>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./percent-text-CSk89zQF.js";import{i as n,n as r,r as i,t as a}from"./compaction-point-VL9oegWS.js";var o=4e5,s=36e5,c={claude:25e3,codex:15e3,grok:2e4,local:15e3,devin:0},l=25e3;function ee(e){return e?c[e]??25e3:l}c.local+8e3+r+a;var te={"claude-opus-5.5":`claude-opus-5-5`};function u(e){return te[e]??e}function d(e,t){if(!e)return null;if(t===`expansive`)return e.expansive??null;let n=i(e.contextWindow);return n===null?null:{contextWindow:n,autoCompactAt:i(e.autoCompactAt??null)}}function f(e){let t=d(e,`standard`),n=d(e,`expansive`);return n?!t||(n.autoCompactAt??n.contextWindow)>(t.autoCompactAt??t.contextWindow):!1}function ne(e,t){if(t===`expansive`)return null;let n=i(e?.contextWindow??null);return n!==null&&n>4e5&&f(e)?o:null}var re=.8,ie=.95;function p(e){let t=Math.max(0,Math.floor(e.contextTokens||0)),n=i(e.contextWindow),r=i(e.autoCompactAt??null),a=n===null?null:t/n,o=r===null?null:t/r,s=o??a,c=e.contextTokensExact!==!1,l=`unknown`;return!c&&s!==null&&s>=1?l=`unknown`:n!==null&&t>n?l=`over`:s!==null&&(l=s>=.95?`danger`:s>=.8?`warn`:`ok`),{tokens:t,window:n,autoCompactAt:r,ofWindow:a,ofCompaction:o,untilCompaction:r===null?null:Math.max(0,r-t),tone:l,exact:c}}function ae(e){let t=e.inputTokens+e.cacheReadTokens+e.cacheCreationTokens;return t>0?e.cacheReadTokens/t:null}function oe(e){return Math.ceil(Math.max(0,e)/4)}function m(e,t,n=l){let r=d(t,`standard`);if(!r)return null;let i=Math.max(0,e)+Math.max(0,n),a=r.autoCompactAt??r.contextWindow;if(i<=a*.6)return`fits`;if(i<=a)return`tight`;let o=d(t,`expansive`);return o&&i<=(o.autoCompactAt??o.contextWindow)?`expansive`:`split`}function h(e){return e>=1e6?`${(e/1e6).toFixed(e%1e6==0?0:1)}M`:e>=1e3?`${Math.round(e/1e3)}k`:String(e)}function se(e){let t=p(e.usage),n=[],r=`none`,i=e=>{(e===`urge`||e===`suggest`&&r===`none`)&&(r=e)};t.exact&&(t.tone===`over`?(i(`urge`),n.push(`Context (${h(t.tokens)}) is past the ${h(t.window??0)} window.`)):t.ofCompaction!==null&&t.ofCompaction>=.8&&(i(`suggest`),n.push(`About ${h(t.untilCompaction??0)} tokens left before the CLI auto-compacts.`)));let a=e.compactionCount??0;if(a>=2&&(i(`suggest`),n.push(`Compacted ${a} times — early turns now survive only as summaries.`)),e.lastActivityAt){let r=e.now-Date.parse(e.lastActivityAt);t.exact&&Number.isFinite(r)&&r>=36e5&&t.tokens>=1e5&&(i(`suggest`),n.push(`Idle over an hour: the prompt cache has likely expired, so the next turn re-reads ~${h(t.tokens)} tokens at full cost.`))}return{level:r,reasons:n}}function ce(e){if((e.session.contextMode??`standard`)!==`standard`||!f(e.option))return{suggest:!1,reason:null};let t=e.session.compactionCount??0;return t>=2?{suggest:!0,reason:`This session has compacted ${t} times; expansive mode keeps more of it in view.`}:typeof e.workingSetTokens==`number`&&m(e.workingSetTokens,e.option)===`expansive`?{suggest:!0,reason:`The reachable code (~${h(e.workingSetTokens)} tokens) only fits the expansive budget.`}:{suggest:!1,reason:null}}function le(e){return e===`claude`||e===`codex`}var g=[`elite`,`fast`,`free`],ue=Object.freeze({elite:`Elite`,fast:`Fast`,free:`Free · local`}),de=Object.freeze({elite:`Claude Code, Codex, Devin and local Qwen 3.8 27B — equal partners. Routing picks among them by fit, headroom, cost and latency.`,fast:`Quick, cheap turns: Grok and Devin’s free SWE models.`,free:`Other local models on this Mac — no usage, nothing leaves the machine; slower and not as strong.`}),fe=Object.freeze({subscription:`subscription`,credits:`credits`,"per-token":`per token`,free:`free`}),pe=Object.freeze({free:0,subscription:0,credits:1,"per-token":1}),me=/^swe(?:$|[-_.\d])/i,he=/(?:^|[/:])qwen3\.8[^/]*?[:_-]27b(?:$|[^0-9])/i;function ge(e){return typeof e==`string`&&he.test(`:${e.trim()}`)}function _e(e,t){return typeof t==`string`?e===`devin`&&me.test(t.trim())?`fast`:e===`local`&&ge(t)?`elite`:null:null}function _(e){return e===`local`?`free`:e===`grok`?`fast`:`elite`}function v(e,t,n){if(typeof t==`string`&&t.length>0){let r=n?.tierOf(e,t)??null;if(r)return r;let i=_e(e,t);if(i)return i}return _(e)}function ve(e){return e===`devin`}function y(e){return g.indexOf(e)}function ye(e,t={}){return e===`local`?`free`:t.apiKey?`per-token`:t.cloud?`credits`:e===`devin`&&v(e,t.modelId)===`fast`?`free`:`subscription`}function b(e,t){return e.map((e,n)=>({item:e,index:n,rank:y(t(e))})).sort((e,t)=>e.rank-t.rank||e.index-t.index).map(e=>e.item)}function be(e){let t=null;for(let n of e)(n.type===`usage`||n.type===`turn-done`||n.type===`cancelled`||n.type===`context`&&n.turnId!==null)&&typeof n.at==`string`&&(t===null||n.at>t)&&(t=n.at);return t}function x(e){return e==null||!Number.isFinite(e)?`—`:Math.round(e)<1e3?String(Math.round(e)):Math.round(e/1e3)<1e3?`${Math.round(e/1e3)}k`:`${(e/1e6).toFixed(1).replace(/\.0$/,``)}M`}var xe=e({CODEX_EXPANSIVE_METERING_NOTE:()=>I,ENGINE_LABEL:()=>w,ENGINE_ORDER:()=>S,SEAT_CAPACITY_WORD:()=>z,WINDOW_SOURCE_TEXT:()=>P,firstRunnableModel:()=>L,formatClock:()=>q,formatContextWindow:()=>$,formatDuration:()=>G,formatElapsed:()=>W,formatRelative:()=>K,groupSeats:()=>H,groupSessions:()=>U,isAbsolutePath:()=>Z,isVerseEngine:()=>T,modelLabel:()=>k,modelOptionFor:()=>j,modelPriceNote:()=>A,orderSeatsByTier:()=>C,prettyJson:()=>X,projectName:()=>E,seatById:()=>D,seatCapacity:()=>V,seatLabel:()=>O,seatPillLabel:()=>Q,seatUnavailableReason:()=>R,seatWindowLabel:()=>B,sessionContextBudget:()=>N,summarizeToolInput:()=>J,truncate:()=>Y,windowSourceText:()=>F}),S=b([`claude`,`codex`,`devin`,`grok`,`local`],e=>_(e));function C(e){return b(e,e=>Se(e))}function Se(e){let t=e.models.find(e=>!e.unavailableReason)??e.models[0];return v(e.engine,t?.id??null)}var w={claude:`Claude`,codex:`Codex`,grok:`Grok`,local:`Local`,devin:`Devin`};function T(e){return S.includes(e)}function E(e,t=[]){let n=t.find(t=>t.path===e);return n?n.name:e.split(/[\\/]/).filter(Boolean).at(-1)??e}function D(e,t){return e.find(e=>e.id===t)}function O(e,t){return D(e,t.seatId)?.label??w[t.engine]}function k(e,t){return D(e,t.seatId)?.models.find(e=>e.id===t.model)?.label??t.model}function A(e,t){let n=j(e,t)?.priceNote;return typeof n==`string`&&n?n:null}function j(e,t){let n=D(e,t.seatId);if(!n)return null;let r=n.models.find(e=>e.id===t.model);if(r)return r;let i=u(t.model);return n.models.find(e=>u(e.id)===i)??null}function M(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:null}function N(e,t){let r=t.usage,i=t.contextMode??`standard`,a=j(e,t),o={contextTokens:typeof r.contextTokens==`number`&&Number.isFinite(r.contextTokens)?Math.max(0,r.contextTokens):0,exact:r.contextTokensExact!==!1,mode:i,option:a},s=d(a,i),c=M(r.contextWindow);if(c!==null&&(t.engine===`local`||r.contextWindowSource===`runtime`)){let e=M(r.autoCompactAt??null)??n({engine:t.engine,runtimeWindow:c,budget:t.engine===`local`?null:s,autocompactWindow:t.engine===`claude`?ne(a,i):null,maxOutputTokens:a?.maxOutputTokens??null}),l=t.engine===`local`?r.contextWindowSource??null:`runtime`;return{...o,contextWindow:c,autoCompactAt:e,source:l}}if(s)return{...o,contextWindow:s.contextWindow,autoCompactAt:s.autoCompactAt,source:a?.windowSource??`fallback`};if(c!==null)return{...o,contextWindow:c,autoCompactAt:M(r.autoCompactAt??null),source:r.contextWindowSource??null};let l=M(D(e,t.seatId)?.contextWindow??null);return{...o,contextWindow:l,autoCompactAt:null,source:l===null?null:`fallback`}}var P={runtime:`reported by the CLI on the last turn`,"provider-catalog":`from this seat's own model catalog`,"cli-catalog":`from the pinned CLI's built-in model table`,documented:`from the provider's published model table`,fallback:`a default estimate — the CLI has not reported the real window yet`};function F(e,t){return t===`local`?`${e===`runtime`?`measured from the local model server`:e===`fallback`?`a default estimate — the model server did not report one`:P[e]}; Verse passes this window to Claude Code for this chat`:P[e]}var I=`OpenAI reportedly also counts requests above 272k tokens at about 2× against plan limits, so a turn near the expansive limit may cost roughly twice that.`;function L(e){return e.models.find(e=>!e.unavailableReason)??null}function R(e){return e.health.state===`unavailable`?e.health.summary??`seat unavailable`:null}var z={ready:`usable`,tight:`tight`,blocked:`blocked`,unread:`no reading`},Ce=85;function B(e){let t={five_hour:`5-hour window`,seven_day:`weekly window`,codex:`weekly window`};if(t[e])return t[e];let n=/^seven_day_(.+)$/.exec(e);return n?`weekly ${n[1].replace(/_/g,` `)} window`:`${e.replace(/_/g,` `)} window`}function V(e){let n=R(e);if(n!==null)return{cls:`blocked`,usedPercent:null,text:n};let r=e.health.windows.filter(e=>typeof e.usedPercent==`number`&&Number.isFinite(e.usedPercent));if(r.length===0)return{cls:`unread`,usedPercent:null,text:`no capacity reading`};let i=r.reduce((e,t)=>t.usedPercent>e.usedPercent?t:e),a=Math.max(0,Math.min(100,i.usedPercent)),o=B(i.id);return a>=100?{cls:`blocked`,usedPercent:null,text:`${o} limit reached`}:{cls:a>=Ce?`tight`:`ready`,usedPercent:a,text:`${t(a)} of ${o} used`}}function H(e){return S.map(t=>({engine:t,seats:e.filter(e=>e.engine===t)})).filter(e=>e.seats.length>0)}function U(e,t,n=``){let r=n.trim().toLowerCase(),i=r?e.filter(e=>e.title.toLowerCase().includes(r)||e.projectPath.toLowerCase().includes(r)||e.model.toLowerCase().includes(r)||e.seatId.toLowerCase().includes(r)):[...e],a=new Map;for(let e of i){let t=a.get(e.projectPath)??[];t.push(e),a.set(e.projectPath,t)}let o=[];for(let[e,n]of a)n.sort((e,t)=>t.updatedAt.localeCompare(e.updatedAt)),o.push({projectPath:e,name:E(e,t),enrolled:t.find(t=>t.path===e)?.enrolled??!1,sessions:n});return o.sort((e,t)=>t.sessions[0].updatedAt.localeCompare(e.sessions[0].updatedAt)),o}function W(e){if(!Number.isFinite(e)||e<0)return`0s`;let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m ${t%60}s`:`${Math.floor(n/60)}h ${n%60}m`}function G(e){return!Number.isFinite(e)||e<0?`—`:e<1e3?`${Math.round(e)}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:W(e)}function K(e,t=Date.now()){let n=Date.parse(e);if(!Number.isFinite(n))return``;let r=Math.round((t-n)/1e3);if(r<0||r<60)return`now`;let i=Math.floor(r/60);if(i<60)return`${i}m`;let a=Math.floor(i/60);if(a<24)return`${a}h`;let o=Math.floor(a/24);return o<7?`${o}d`:new Date(n).toLocaleDateString([],{month:`short`,day:`numeric`})}function q(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}function J(e){if(e==null)return``;if(typeof e==`string`)return Y(e,96);if(typeof e!=`object`)return Y(String(e),96);let t=e;for(let e of[`command`,`cmd`,`file_path`,`path`,`pattern`,`query`,`url`,`description`,`prompt`,`text`]){let n=t[e];if(typeof n==`string`&&n.trim())return Y(n.trim().replace(/\s+/g,` `),96)}let n=Object.keys(t);if(n.length===0)return``;let r=t[n[0]],i=typeof r==`string`?r:JSON.stringify(r);return Y(`${n[0]}: ${i??``}`.replace(/\s+/g,` `),96)}function Y(e,t){return e.length>t?`${e.slice(0,t-1)}…`:e}function X(e){if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)??``}catch{return String(e)}}function Z(e){return/^(?:\/|~(?:\/|$)|[a-zA-Z]:[\\/]|\\\\)/.test(e)&&![...e].some(e=>e.charCodeAt(0)<32||e.charCodeAt(0)>=127&&e.charCodeAt(0)<=159)}function Q(e,t){let n=O(e,t),r=k(e,t);return!r||n.toLowerCase().includes(r.toLowerCase())?n:`${n} · ${r}`}function $(e){return e==null||!Number.isInteger(e)||e<1024||e%1024!=0?x(e):e<1048576?`${e/1024}k`:`${(e/1048576).toFixed(1).replace(/\.0$/,``)}M`}export{se as $,F as A,ve as B,O as C,N as D,B as E,g as F,re as G,y as H,de as I,u as J,d as K,ue as L,be as M,fe as N,J as O,pe as P,m as Q,ye as R,V as S,R as T,s as U,v as V,ie as W,oe as X,le as Y,ce as Z,A as _,L as a,E as b,G as c,H as d,f as et,U as f,j as g,k as h,P as i,x as j,xe as k,W as l,T as m,w as n,ee as nt,q as o,Z as p,ae as q,z as r,$ as s,I as t,p as tt,K as u,C as v,Q as w,D as x,X as y,_ as z};
2
+ //# sourceMappingURL=verse-model-DAOz9LrY.js.map