@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 @@
1
+ {"version":3,"file":"cloud-model-CzKeuxfm.js","names":[],"sources":["../../../../../../__vite-browser-external","../../../../../../src/core/util/scrub.ts","../../../../../../src/web-ui/routes/verse/cloud/cloud-model.ts"],"sourcesContent":["module.exports = {}","/**\n * src/core/util/scrub.ts — THE shared secret-scrub utility (single source of truth).\n *\n * Extracted from judge-trace.ts (stripSecrets) and extended to cover all\n * patterns previously missing from handlers.ts (scrubDiffSecrets). Since 3.10\n * the two historical duplicates delegate here instead of drifting:\n * - src/core/generative/invent.ts re-exports `scrubSecrets` verbatim.\n * - src/core/knowledge/index.ts runs this scrub FIRST, then its own\n * stricter corpus patterns (32-hex, `/`-bearing base64, Stripe) that\n * `ashlr verify-safety` pins by array length. Knowledge chunks are never\n * identity-checked, so the stricter pass is safe there and must not leak\n * into this default (see \"IDENTITY CALLERS\" below).\n *\n * Patterns covered by `scrubSecrets`:\n * 0. PEM/private-key blocks\n * 1. sk- API keys (Anthropic, OpenAI, etc.)\n * 2. GitHub tokens: ghp_, gho_, ghu_, ghs_, ghr_, gha_, github_pat_ (classic\n * and fine-grained `github_pat_<22>_<59>`)\n * 3. Bearer / Token / Authorization header values\n * 4. Generic key=value secrets: api_key, secret, token, password, passwd,\n * auth, credential, client_secret, private_key, refresh_token,\n * access_token, connection_string (including ASHLR_* env vars)\n * 5. Slack tokens: xox[baprs]-…\n * 6. AWS access key IDs: AKIA…\n * 7. JWTs: eyJ….<sig>\n * 8. Bare hex-64 (SHA-256 / API key hex form)\n * 9. GitLab/HuggingFace/npm/Google token prefixes\n * 10. URL authority passwords and long base64 blobs\n * 11. (3.10) Telegram bot tokens `<bot id>:<33–35 chars>` — bare, in\n * `api.telegram.org/bot<token>/…` URLs, and under any key name\n * 12. (3.10) xAI API keys `xai-…`\n * 13. (3.10) Suffix-named assignments the generic rule's `\\b` anchor misses:\n * SCREAMING env vars (`GROQ_API_KEY=…`, `DB_PASSWORD=…`), snake_case\n * (`bot_token: …`) and camelCase (`githubToken: …`) names\n * 14. (3.10) Quoted JSON/YAML keys (`\"password\": \"…\"`, `\\\"botToken\\\":\\\"…\\\"`),\n * which rule 4 never matched because the closing quote sits between the\n * name and the colon\n * 15. (3.10) Slack / Discord incoming-webhook URL paths\n * 16. (3.15) Devin API credentials: `cog_…` (v3 service-user keys and\n * personal access tokens) and legacy `apk_…` / `apk_user_…` keys\n *\n * `scrubPrivateText` layers two PRIVACY redactions on top for free text that\n * is persisted or exported (reasoning store, session export, logs):\n * - home-directory paths → `~` (on by default)\n * - email addresses → `[REDACTED]` (opt-in)\n *\n * IDENTITY CALLERS (why home paths/emails are NOT in `scrubSecrets`): many\n * ledgers validate values with `scrubSecrets(v) === v` (dispatch manifests,\n * worked/dispatch-production ledgers, best-of-n, generated-repair) and several\n * of those values are absolute repo paths or git author identities. Rewriting\n * `/Users/<me>/repo` → `~/repo` in the default scrub would make every such\n * record look \"secret-bearing\" and be rejected, and would corrupt functional\n * paths. Privacy redaction is therefore an explicit, separate call.\n *\n * IDEMPOTENCE is load-bearing: records persisted after scrubbing are later\n * re-validated with `scrubSecrets(v) === v`, and `canonicalizeProposalDiff`\n * iterates to a fixed point. Every rule's output is a fixed point of every\n * rule (pinned by test/scrub-310.test.ts).\n *\n * PURITY: no I/O, no side-effects. `scrubPrivateText` reads the home directory\n * from the environment (no filesystem access) unless `homes` is supplied.\n */\n\nimport { homedir } from 'node:os';\n\nconst REDACTED = '[REDACTED]';\n\nfunction scrubLongBase64Like(match: string): string {\n // Preserve ordinary Git SHA-1 commit ids for forensic audit trails. The\n // explicit hex-64 rule above still redacts longer raw-key shapes.\n if (/^[0-9a-fA-F]{40}$/.test(match)) return match;\n // Avoid erasing obvious low-entropy test/log filler such as xxxxx...; real\n // token-like blobs still have mixed character content and are redacted below.\n const repeatedCandidate = match.replace(/^\\+/, '').replace(/=+$/, '');\n if (/^(.)\\1{39,}$/.test(repeatedCandidate)) return match;\n return REDACTED;\n}\n\n// ---------------------------------------------------------------------------\n// 3.10 additions\n// ---------------------------------------------------------------------------\n\n/**\n * Telegram bot token: numeric bot id (8–10 digits today; 6–12 tolerated) +\n * ':' + a 33–35 char url-safe secret (35 for issued tokens; Telegram's own\n * documentation example is 34). The optional `bot` prefix covers the Bot API\n * URL form (`https://api.telegram.org/bot<id>:<secret>/sendMessage`), where a\n * plain `\\b` anchor fails because `t` and the first digit are both word chars.\n * The narrow secret length plus the non-word lookarounds keep\n * `<epoch-seconds>:<uuid|hex32|sha1>` style ids (36 / 32 / 40 chars) intact —\n * several ledgers identity-check such ids.\n */\nconst TELEGRAM_BOT_TOKEN = /\\d{6,12}:[A-Za-z0-9_-]{33,35}(?![A-Za-z0-9_-])/g;\n\n/**\n * Left-boundary check for a Telegram candidate, done in the replacer instead of\n * a leading lookbehind: a regex that starts with `\\d` lets V8 skip ahead to\n * digits, which measured ~3x cheaper on 1 MB of prose than testing a\n * lookbehind at every offset. Accept when the id starts the string, follows a\n * non-word char, or follows a `bot` that itself follows a non-word char.\n */\nfunction redactTelegram(match: string, offset: number, whole: string): string {\n const boundary = (i: number): boolean => i < 0 || !/[A-Za-z0-9_]/.test(whole[i]!);\n if (boundary(offset - 1)) return REDACTED;\n if (whole.slice(offset - 3, offset) === 'bot' && boundary(offset - 4)) return REDACTED;\n return match;\n}\n\n/**\n * Incoming-webhook URLs are bearer credentials in their path (anyone holding\n * the URL can post). Host + fixed path prefix are kept for forensics.\n */\nconst WEBHOOK_URL =\n /(https?:\\/\\/(?:hooks\\.slack\\.com\\/(?:services|workflows|triggers)|(?:ptb\\.|canary\\.)?discord(?:app)?\\.com\\/api\\/webhooks)\\/)[A-Za-z0-9_/-]{8,}/gi;\n\n/**\n * Devin (Cognition) API credentials. v3 keys and PATs are `cog_…`\n * (https://docs.devin.ai/api-reference/authentication); legacy v1/v2 keys are\n * `apk_user_…` / `apk_…`. The legacy tail is alphanumeric-only so an\n * identifier such as `apk_version_code` is not mistaken for a key.\n */\nconst DEVIN_API_KEY = /(?<![A-Za-z0-9_-])(?:cog_[A-Za-z0-9_-]{20,}|apk_(?:user_)?[A-Za-z0-9]{24,})/g;\n\n/** xAI (Grok) API keys: `xai-` + ≥20 alphanumerics (80 in practice). */\nconst XAI_API_KEY = /(?<![A-Za-z0-9_-])xai-[A-Za-z0-9]{20,}/g;\n\n/**\n * Value shape shared by the suffix-name rules: optional quote, ≥8 chars that\n * are not whitespace/separators/quotes, optional closing quote. Mirrors rule 4.\n */\nconst ASSIGNED_VALUE = String.raw`\\s*[=:]\\s*[\"']?[^\\s,;'\"]{8,}[\"']?`;\n\n/**\n * SCREAMING_SNAKE env-var names ending in a secret noun. Rule 4's `\\b(token|…)`\n * never fires inside `GROQ_API_KEY` / `TELEGRAM_BOT_TOKEN` because `_` is a\n * word char, so the whole `.env` idiom slipped through. Case-SENSITIVE on\n * purpose: `sort_key=…` in prose/code must not match.\n */\nconst ENV_SECRET_ASSIGNMENT = new RegExp(\n String.raw`(?<![A-Za-z0-9_$])([A-Z][A-Z0-9_]*_(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|PWD|CREDENTIALS?|AUTH|DSN))` +\n ASSIGNED_VALUE,\n 'g',\n);\n\n/** snake_case names with a secret suffix (`bot_token`, `db_password`). */\nconst SNAKE_SECRET_ASSIGNMENT = new RegExp(\n String.raw`(?<![A-Za-z0-9_$])([a-z][a-z0-9_]*_(?:api_key|token|secret|password|passwd|pwd|credentials?|private_key|access_key|secret_key|signing_key))` +\n ASSIGNED_VALUE,\n 'g',\n);\n\n/**\n * Cheap literal-led prefilters for the snake/camel rules. Those two regexes\n * start at every lowercase word, which measured ~3–4.5 ms per MB; the\n * prefilters cost <1 ms and skip them on the common text that has no\n * `…Token =` / `…_password:` assignment at all.\n */\nconst SNAKE_PREFILTER = /_(?:api_key|token|secret|password|passwd|pwd|credentials?|private_key|access_key|secret_key|signing_key)\\s*[=:]/;\nconst CAMEL_PREFILTER = /(?:Token|Secret|Password|Passwd|ApiKey|PrivateKey|AccessKey|SecretKey|SigningKey|Credentials?)\\s*[=:]/;\n\n/** camelCase names with a secret suffix (`githubToken`, `clientSecret`). */\nconst CAMEL_SECRET_ASSIGNMENT = new RegExp(\n String.raw`(?<![A-Za-z0-9_$])([a-z][A-Za-z0-9]*(?:Token|Secret|Password|Passwd|ApiKey|PrivateKey|AccessKey|SecretKey|SigningKey|Credentials?))` +\n ASSIGNED_VALUE,\n 'g',\n);\n\n/**\n * Quoted keys (JSON, YAML, JS object literals), including JSON-escaped quotes\n * inside a serialized string (`\\\"password\\\":\\\"…\\\"`). The name must END in a\n * secret noun (`max_tokens`, `tokenizer`, `author` do not). Structure is kept —\n * only the value becomes `[REDACTED]` — so a scrubbed JSON line stays parseable.\n */\nconst QUOTED_SECRET_KEY =\n /(\\\\?[\"'])([A-Za-z0-9_.-]*(?:api[_-]?key|token|secret|password|passwd|pwd|credentials?|private[_-]?key|access[_-]?key|secret[_-]?key|signing[_-]?key|auth|connection[_-]?string))\\1(\\s*:\\s*)(\\\\?[\"'])([^\"'\\s\\\\]{8,})\\4/gi;\n\n/**\n * Values in CODE that merely reference a secret (a member chain, call, template\n * or env interpolation) rather than contain one. Scrubbed diffs are persisted\n * and applied as proposals, so turning `const GITHUB_TOKEN = process.env.GITHUB_TOKEN`\n * into `GITHUB_TOKEN=[REDACTED]` would corrupt a legitimate change. Applies to\n * the 3.10 suffix rules only — rule 4's historical behaviour is unchanged.\n */\nfunction isCodeReference(value: string): boolean {\n const v = value.replace(/^[\"']|[\"']$/g, '');\n return (\n /^[A-Za-z_$][\\w$]*(?:\\??\\.[A-Za-z_$][\\w$]*)+[)\\]]*$/.test(v) || // process.env.X, opts.apiToken\n /^[A-Za-z_$][\\w$.]*\\(/.test(v) || // getToken(), cfg.read(\n /^(?:\\$\\{|\\$[A-Za-z_]|`|<)/.test(v) // ${VAR}, $VAR, `template`, <placeholder>\n );\n}\n\n/**\n * Type annotations and identifier-only right-hand sides (`refreshToken: RefreshTokenRecord`,\n * `botToken: undefined`) carry no digits; real tokens essentially always do.\n * Only the camel/snake rules use this skip (they fire inside ordinary TS code);\n * the SCREAMING env rule still redacts a letters-only `.env` password.\n */\nfunction isIdentifierOnly(value: string): boolean {\n const v = value.replace(/^[\"']|[\"']$/g, '');\n return !/\\d/.test(v) && /^[A-Za-z_$][A-Za-z_$.<>[\\]|&?!()]*$/.test(v);\n}\n\n/** A value an earlier rule (or an earlier pass) already replaced. */\nfunction isAlreadyRedacted(value: string): boolean {\n return value.replace(/^[\"']|[\"']$/g, '') === REDACTED;\n}\n\nfunction redactAssignment(name: string, match: string, value: string, allowIdentifiers: boolean): string {\n // Idempotence: `NAME = \"[REDACTED]\"` must stay byte-identical on a re-scrub.\n if (isAlreadyRedacted(value)) return match;\n if (isCodeReference(value)) return match;\n if (allowIdentifiers && isIdentifierOnly(value)) return match;\n return `${name}=${REDACTED}`;\n}\n\nfunction valueOf(match: string, name: string): string {\n return match.slice(name.length).replace(/^\\s*[=:]\\s*/, '');\n}\n\n/**\n * Scrub recognised secret patterns from `text`.\n * Returns the scrubbed string with secrets replaced by `[REDACTED]`.\n * Never throws. Idempotent: `scrubSecrets(scrubSecrets(x)) === scrubSecrets(x)`.\n */\nexport function scrubSecrets(text: string): string {\n try {\n let out = text\n // 0. PEM/private-key blocks. Run before generic/base64 redaction so\n // BEGIN/END markers do not survive with only the body removed.\n .replace(/-----BEGIN[ A-Z]*PRIVATE KEY-----[\\s\\S]*?-----END[ A-Z]*PRIVATE KEY-----/g, REDACTED)\n .replace(/-----BEGIN[ A-Z]*PRIVATE KEY-----[^\\n]*/g, REDACTED)\n // 11. Telegram bot tokens — before rule 4 so a `botToken: <id>:<secret>`\n // value is removed whole even when its key name is not recognised.\n .replace(TELEGRAM_BOT_TOKEN, redactTelegram)\n // 15. Slack / Discord incoming-webhook URLs (credential in the path).\n .replace(WEBHOOK_URL, '$1[REDACTED]')\n // 12. xAI keys — before rule 10 so the `xai-` prefix does not survive\n // next to a base64-redacted tail.\n .replace(XAI_API_KEY, REDACTED)\n // 16. Devin keys — before rule 10 for the same reason.\n .replace(DEVIN_API_KEY, REDACTED)\n // 1. sk- API keys (Anthropic, OpenAI, etc.)\n .replace(/\\bsk-[A-Za-z0-9_-]{16,}/g, REDACTED)\n // 2. GitHub tokens (including long, dotted stateless installation\n // tokens); consume the entire value so no JWT segment survives.\n .replace(/\\bgh[poursa]_[A-Za-z0-9_-]{16,}(?:\\.[A-Za-z0-9_-]+)*/g, REDACTED)\n .replace(/\\bgithub_pat_[A-Za-z0-9_]{22,}/g, REDACTED)\n // 3. Bearer / Token / Authorization header values\n .replace(/\\b(Bearer|Token|Authorization)\\s+[A-Za-z0-9\\-._~+/]+=*/gi, '$1 [REDACTED]')\n // 4. Generic key=value secret patterns. ASHLR_* env vars are only\n // redacted when they look like assignments, not plain audit metadata\n // such as \"keys=query\".\n .replace(\n /\\b(api[_-]?key|api[_-]?token|secret|secret[_-]?key|token|password|passwd|pwd|auth|credential|client[_-]?secret|private[_-]?key|access[_-]?token|auth[_-]?token|refresh[_-]?token|id[_-]?token|session[_-]?token|connection[_-]?string|conn[_-]?str|_?auth[_-]?token|ASHLR_[A-Z_]+)\\s*[=:]\\s*[\"']?[^\\s,;'\"]{8,}[\"']?/gi,\n '$1=[REDACTED]',\n )\n // 5. Slack tokens\n .replace(/\\bxox[baprs]-[A-Za-z0-9-]{10,}/gi, REDACTED)\n // 6. AWS access key IDs\n .replace(/\\bAKIA[0-9A-Z]{16}\\b/g, REDACTED)\n // 7. JWTs (eyJ header.payload.sig)\n .replace(/\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+/g, REDACTED)\n // 8. Bare hex-64 strings (SHA-256 / hex API keys)\n .replace(/\\b[0-9a-fA-F]{64,}\\b/g, REDACTED)\n // 9. Other common provider token prefixes.\n .replace(/\\bglpat-[A-Za-z0-9_-]{16,}/g, REDACTED)\n .replace(/\\bhf_[A-Za-z0-9]{16,}\\b/g, REDACTED)\n .replace(/\\bnpm_[A-Za-z0-9]{16,}\\b/g, REDACTED)\n .replace(/\\bAIza[0-9A-Za-z_-]{35}\\b/g, REDACTED)\n // 10. URL passwords and long base64-ish blobs.\n .replace(/(:\\/\\/[^:\\s/@]*:)[^@\\s]+(@)/g, '$1[REDACTED]$2')\n .replace(/(?<![/\\w])[A-Za-z0-9+]{40,}={0,2}(?![/\\w])/g, scrubLongBase64Like)\n // 13. Suffix-named assignments rule 4's `\\b` anchor cannot see. LAST, so\n // every token-shape rule above has already turned a JWT/AKIA/hex value\n // into [REDACTED]; that marker is left untouched below. Running these\n // earlier broke idempotence: a dotted JWT reads like a member chain\n // (skipped as a code reference), then pass 2 rewrote `NAME = \"[REDACTED]\"`.\n .replace(ENV_SECRET_ASSIGNMENT, (m: string, name: string) => redactAssignment(name, m, valueOf(m, name), false));\n if (SNAKE_PREFILTER.test(out)) {\n out = out.replace(SNAKE_SECRET_ASSIGNMENT, (m: string, name: string) => redactAssignment(name, m, valueOf(m, name), true));\n }\n if (CAMEL_PREFILTER.test(out)) {\n out = out.replace(CAMEL_SECRET_ASSIGNMENT, (m: string, name: string) => redactAssignment(name, m, valueOf(m, name), true));\n }\n // 14. Quoted keys: keep the JSON/YAML structure, replace the value only.\n return out.replace(\n QUOTED_SECRET_KEY,\n (m: string, q: string, name: string, sep: string, vq: string, value: string) =>\n isAlreadyRedacted(value) || isCodeReference(value) ? m : `${q}${name}${q}${sep}${vq}${REDACTED}${vq}`,\n );\n } catch {\n // Never throws — return original text on unexpected error.\n return text;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Privacy redaction for persisted / exported free text\n// ---------------------------------------------------------------------------\n\nexport interface PrivateScrubOptions {\n /** Rewrite home-directory paths to `~`. Default: true. */\n readonly homePaths?: boolean;\n /** Replace email addresses with `[REDACTED]`. Default: false (opt-in). */\n readonly emails?: boolean;\n /**\n * Home directories to collapse. Default: `os.homedir()`, `$HOME`,\n * `$USERPROFILE`. Supplied explicitly by callers that already resolved them\n * (and by tests).\n */\n readonly homes?: readonly string[];\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction defaultHomes(): string[] {\n const out: string[] = [];\n try {\n out.push(homedir());\n } catch {\n // homedir() can throw when no home is resolvable; env fallbacks below.\n }\n if (typeof process === 'undefined') return out;\n for (const key of ['HOME', 'USERPROFILE'] as const) {\n const v = process.env[key];\n if (v) out.push(v);\n }\n return out;\n}\n\n/**\n * Case-insensitive filesystems (macOS APFS default, Windows) name one home many\n * ways. A function, not a module-level constant: the Verse web UI imports\n * `scrubSecrets` from this module (routes/verse/cloud/cloud-model.ts), and a\n * top-level `process.platform` read throws `ReferenceError: process is not\n * defined` in the browser — which took down every lazy section that pulls the\n * cloud model in (Command, Fleet). Nothing here may touch `process` at load.\n */\nfunction caseInsensitiveFs(): boolean {\n if (typeof process === 'undefined') return false;\n return process.platform === 'darwin' || process.platform === 'win32';\n}\n\n/**\n * Other users' home roots (`/Users/<name>`, `/home/<name>`, `C:\\Users\\<name>`):\n * the username is the PII, so the whole root collapses to `~` too. macOS's\n * `/Users/Shared` is a system directory, not a person.\n */\nconst GENERIC_HOME_ROOT =\n /(?<![\\w.-])(?:\\/(?:Users|home)\\/(?!Shared(?![\\w.-]))[A-Za-z0-9._-]+|[A-Za-z]:\\\\Users\\\\[A-Za-z0-9._-]+)(?![\\w.-])/g;\n\n/**\n * Collapse home-directory paths to `~`. A home only matches as a whole path\n * prefix on segment boundaries: `/Users/me/x` → `~/x`; `/opt/Users/me` is left\n * alone, and `/Users/meagan` is never split into `~agan` (it is another\n * person's home, collapsed whole by the generic rule). Never throws.\n */\nexport function redactHomePaths(text: string, homes: readonly string[] = defaultHomes()): string {\n try {\n let out = text;\n const unique = Array.from(\n new Set(\n homes\n .map((h) => h.replace(/[\\\\/]+$/, ''))\n // A bare root (\"/\", \"C:\") would collapse every absolute path.\n .filter((h) => h.length > 1 && !/^[A-Za-z]:$/.test(h)),\n ),\n ).sort((a, b) => b.length - a.length);\n for (const home of unique) {\n const re = new RegExp(`(?<![\\\\w.-])${escapeRegExp(home)}(?![\\\\w.-])`, caseInsensitiveFs() ? 'gi' : 'g');\n out = out.replace(re, '~');\n }\n return out.replace(GENERIC_HOME_ROOT, '~');\n } catch {\n return text;\n }\n}\n\n/**\n * Email addresses in free text. `git@host:org/repo` SSH remotes are not\n * personal addresses and stay intact; `pkg@1.2.3` version pins never match\n * because the final label must be alphabetic.\n */\nconst EMAIL = /(?<![\\w.%+-])([A-Za-z0-9._%+-]+)@[A-Za-z0-9-]+(?:\\.[A-Za-z0-9-]+)*\\.[A-Za-z]{2,}(?![\\w-])/g;\n\n/** Replace email addresses with `[REDACTED]`. Never throws. */\nexport function redactEmails(text: string): string {\n try {\n return text.replace(EMAIL, (m: string, local: string) => (local === 'git' ? m : REDACTED));\n } catch {\n return text;\n }\n}\n\n/**\n * Secrets + privacy scrub for free text that is persisted or exported\n * (reasoning steps, session exports, crash logs). Runs `scrubSecrets`, then\n * collapses home paths (default on) and, when asked, emails. Home paths are\n * collapsed on both sides of the secret scrub so a secret rule can never split\n * a home prefix into an unrecognisable remainder (same idiom as\n * `sanitizePublicJson`). Never throws. Idempotent.\n */\nexport function scrubPrivateText(text: string, options: PrivateScrubOptions = {}): string {\n const homePaths = options.homePaths !== false;\n const homes = homePaths ? (options.homes ?? defaultHomes()) : [];\n let out = homePaths ? redactHomePaths(text, homes) : text;\n out = scrubSecrets(out);\n if (homePaths) out = redactHomePaths(out, homes);\n if (options.emails === true) out = redactEmails(out);\n return out;\n}\n\n/** Stable bytes for proposal persistence, hashing, and provenance signing. */\nexport function canonicalizeProposalDiff(text: string): string {\n let current = text;\n for (let pass = 0; pass < 8; pass += 1) {\n const next = scrubSecrets(current)\n .replace(/\\bsk_(?:live|test)_[A-Za-z0-9_]{16,}\\b/g, REDACTED)\n .replace(/\\b(?:AKIA|ASIA|AROA)[0-9A-Z]{16}\\b/g, REDACTED)\n .replace(/\\b[0-9a-fA-F]{32,}\\b/g, REDACTED);\n if (next === current) return current;\n current = next;\n }\n throw new Error('proposal diff canonicalization did not converge');\n}\n","/**\n * routes/verse/cloud/cloud-model.ts — the cloud lane's words and decisions as\n * pure functions (3.11 unit C3), so the card, the Usage panel, the Fleet chip\n * and the composer action say the same thing and the copy is tested as a\n * table. No React here.\n *\n * Copy rules (DESIGN §13.8, and the cloud contract's own):\n * - spend is ALWAYS an estimate and says so — Claude does not expose the\n * credit balance, so every dollar figure carries \"estimate\" beside it;\n * - server prose (gate reasons, state reasons, report summaries) is scrubbed\n * for secrets before `tidyProse` makes ISO instants readable in local time;\n * - times are local and relative (\"started 5m ago\"), never ISO;\n * - a state is always a WORD beside any colour.\n */\nimport {\n CLOUD_PROMPT_MAX_CHARS,\n CLOUD_TERMINAL_STATES,\n DEFAULT_CLOUD_BUDGET,\n type CloudBudgetUpdate,\n type CloudBudgetV1,\n type CloudBudgetView,\n type CloudSeatStatus,\n type CloudTaskState,\n type CloudTaskV1,\n} from '../../../../core/cloud/types.js';\nimport { describeResetAt } from '../../../../core/verse/seat-readiness.js';\nimport { scrubSecrets } from '../../../../core/util/scrub.js';\nimport type { Tone } from '../../../components/primitives/StatusBadge.js';\nimport type { MeterTone } from '../../../components/primitives/Meter.js';\nimport { tidyProse } from '../autonomy/format.js';\nimport { relativePhrase } from '../context/context-model.js';\nimport { usedPercentText } from '../percent-text.js';\n\n/** Cloud text can originate in a PR body; keep every card reason safe even outside the HTTP sanitizer. */\nfunction safeCloudProse(text: string, now?: number): string {\n return tidyProse(scrubSecrets(text), now);\n}\n\n/** The repo a new task targets unless the operator names another (the self-improvement default). */\nexport const CLOUD_DEFAULT_REPO = DEFAULT_CLOUD_BUDGET.selfImprove.repo;\n\n/** Same rule the service enforces (core/cloud/service.ts), checked here so the dialog can say so first. */\nexport const CLOUD_REPO_PATTERN = /^[A-Za-z0-9-]+\\/[A-Za-z0-9._-]+$/;\n\n/**\n * A branch name git would accept, conservatively: no spaces or control\n * characters, no `..`, no leading `-` or `/`, no trailing `/` or `.lock`.\n * The server re-checks it against origin; this only catches typing slips.\n */\nconst BRANCH_CHARS = /^[A-Za-z0-9._/+-]{1,200}$/;\nexport function isBranchName(value: string): boolean {\n if (!BRANCH_CHARS.test(value)) return false;\n if (value.startsWith('-') || value.startsWith('/') || value.endsWith('/') || value.endsWith('.') || value.endsWith('.lock')) return false;\n return !value.includes('..') && !value.includes('//');\n}\n\n/** Only these hosts become links: the ids came from a CLI's stdout and gh's JSON. */\nexport function safeHref(url: string | null | undefined, host: 'claude.ai' | 'github.com' | 'app.devin.ai'): string | null {\n if (typeof url !== 'string' || url.length > 2_048) return null;\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'https:' && parsed.hostname === host ? parsed.toString() : null;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Money and the credits meter\n// ---------------------------------------------------------------------------\n\n/** \"$250\", \"$12.50\" — whole dollars stay whole; never \"-$0\". */\nexport function formatDollars(value: number): string {\n if (!Number.isFinite(value)) return '—';\n const v = Math.abs(value) < 0.005 ? 0 : value;\n const text = Number.isInteger(v) ? String(Math.abs(v)) : Math.abs(v).toFixed(2);\n return `${v < 0 ? '−' : ''}$${text}`;\n}\n\nexport interface CreditsMeterView {\n /** Remaining, clamped at 0 for the bar (the text says when it went below). */\n value: number;\n max: number | null;\n /** \"$212 of $250 · estimate\" */\n text: string;\n /** \"15% used\" — the one percent rule. */\n usedText: string;\n tone: MeterTone;\n /** A plain sentence when the estimate is at or under the self-improvement reserve. */\n warning: string | null;\n}\n\nexport function creditsMeter(view: CloudBudgetView): CreditsMeterView {\n const total = view.creditsTotalUsd;\n const remaining = view.estimatedRemainingUsd;\n const reserve = view.budget.selfImprove.reserveUsd;\n const max = total > 0 ? total : null;\n const used = max === null ? null : ((total - Math.max(0, remaining)) / total) * 100;\n const tone: MeterTone = remaining <= 0 ? 'danger' : remaining < reserve ? 'warning' : 'accent';\n const warning = remaining <= 0\n ? 'The estimate says the credits are spent. Check the real balance on claude.ai and adjust the budget.'\n : remaining < reserve\n ? `Under the ${formatDollars(reserve)} reserve, so Verse stops launching self-improvement tasks.`\n : null;\n return {\n value: Math.max(0, remaining),\n max,\n text: `${formatDollars(Math.max(0, remaining))} of ${formatDollars(total)} · estimate`,\n usedText: used === null ? 'no credit total set' : `${usedPercentText(used)} used`,\n tone,\n warning,\n };\n}\n\n/** The next local midnight — when the per-day caps start counting again. */\nexport function nextLocalMidnight(now: number): number {\n const d = new Date(now);\n d.setHours(24, 0, 0, 0);\n return d.getTime();\n}\n\n/** \"3 of 20 sessions today · 1 running\" plus when the daily count resets. */\nexport function sessionsLine(view: CloudBudgetView, now: number = Date.now()): string {\n const reset = describeResetAt(new Date(nextLocalMidnight(now)).toISOString(), now);\n const running = view.running === 1 ? '1 running' : `${view.running} running`;\n return `${view.sessionsToday} of ${view.budget.maxSessionsPerDay} sessions today · ${running}${reset ? ` · resets ${reset}` : ''}`;\n}\n\nexport function selfImproveLine(view: CloudBudgetView): string {\n const si = view.budget.selfImprove;\n if (!si.enabled) return 'Self-improvement is off. Verse launches cloud tasks only when you ask.';\n return `${view.selfImproveToday} of ${si.maxPerDay} self-improvement launches today, on ${si.repo}. Stops under a ${formatDollars(si.reserveUsd)} estimated balance.`;\n}\n\n/** A gate's reason, fit to print (null when the gate is open). */\nexport function gateText(gate: { ok: boolean; reason: string | null }, fallback: string): string | null {\n if (gate.ok) return null;\n return gate.reason ? safeCloudProse(gate.reason) : fallback;\n}\n\nexport const SEAT_NOT_READY = \"The Claude seat isn't set up on this Mac.\";\n\nexport function seatText(seat: CloudSeatStatus): string | null {\n if (seat.ready) return null;\n return seat.reason ? safeCloudProse(seat.reason) : SEAT_NOT_READY;\n}\n\n// ---------------------------------------------------------------------------\n// Standing: what the credit figure MEANS while the lane cannot launch\n// ---------------------------------------------------------------------------\n//\n// The credit figure is always an estimate (a flat per-session cost counted\n// against the total the operator typed in; the real balance is not\n// readable). While the lane can launch, that estimate is headroom and a meter\n// is the honest picture. While the Claude seat is NOT set up nothing can\n// launch, so \"$250 of $250 left\" beside \"the seat isn't set up\" read as live\n// headroom the operator could not use. Then the setup blocker is the STATE,\n// and the credits a secondary, visibly approximate figure:\n//\n// Cloud: not set up · ~$250 credits\n//\n// Shared by Command's Cloud card, Usage's Cloud credits panel and the\n// Resources drawer's cloud card.\n\n/** The state word shown in place of the meter while the seat is missing. */\nexport const CLOUD_NOT_SET_UP_WORD = 'Not set up';\n\n/**\n * \"~$250 credits\" — whole dollars, because an estimate that cannot be spent\n * yet has no business showing cents. Never negative.\n */\nexport function approxCredits(remainingUsd: number): string {\n const v = Number.isFinite(remainingUsd) ? Math.max(0, Math.round(remainingUsd)) : 0;\n return `~$${v} credits`;\n}\n\n/** \"Cloud: not set up · ~$250 credits\" — the one-line summary of a lane that cannot launch. */\nexport function notSetUpLine(remainingUsd: number): string {\n return `Cloud: not set up · ${approxCredits(remainingUsd)}`;\n}\n\n/**\n * Why a launch button is disabled right now, or null when it may be pressed.\n * Seat first (nothing launches without it), then the budget gate.\n */\nexport function launchBlock(seat: CloudSeatStatus, budget: CloudBudgetView): string | null {\n return seatText(seat) ?? gateText(budget.canLaunch, 'The cloud budget does not allow another launch right now.');\n}\n\n// ---------------------------------------------------------------------------\n// Tasks\n// ---------------------------------------------------------------------------\n\nexport const STATE_WORD: Record<CloudTaskState, string> = {\n queued: 'Queued',\n launching: 'Launching',\n running: 'Running',\n 'pr-open': 'PR open',\n merged: 'Merged',\n closed: 'Closed',\n failed: 'Failed',\n expired: 'Expired',\n};\n\nexport const STATE_TONE: Record<CloudTaskState, Tone> = {\n queued: 'info',\n launching: 'info',\n running: 'running',\n 'pr-open': 'warning',\n merged: 'success',\n closed: 'neutral',\n failed: 'danger',\n expired: 'unknown',\n};\n\n/** A draft PR reads \"Draft PR\", not \"PR open\": the session may still be pushing. */\nexport function stateWord(task: Pick<CloudTaskV1, 'state' | 'pr'>): string {\n if (task.state === 'pr-open' && !task.pr) return 'PR unverified';\n if (task.state === 'pr-open' && task.pr?.draft) return 'Draft PR';\n return STATE_WORD[task.state] ?? task.state;\n}\n\nexport function isTerminal(state: CloudTaskState): boolean {\n return CLOUD_TERMINAL_STATES.includes(state);\n}\n\n/** In flight: counted by the Fleet chip and the \"running\" line. */\nexport function isInFlight(state: CloudTaskState): boolean {\n return state === 'queued' || state === 'launching' || state === 'running';\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n/** How many tasks the card lists before \"N more on GitHub\". */\nexport const CARD_TASK_LIMIT = 6;\n\n/**\n * What the card lists: everything still moving or waiting on review, then\n * anything that ended in the last 24 h (a failure you have not seen yet),\n * newest first. Older finished tasks live in `ashlr cloud list --all`.\n */\nexport function cardTasks(tasks: readonly CloudTaskV1[], now: number = Date.now()): { shown: CloudTaskV1[]; hidden: number } {\n const recent = (t: CloudTaskV1) => {\n const at = Date.parse(t.updatedAt);\n return Number.isFinite(at) && now - at < DAY_MS;\n };\n const listed = tasks\n .filter((t) => !isTerminal(t.state) || recent(t))\n .sort((a, b) => (Date.parse(b.createdAt) || 0) - (Date.parse(a.createdAt) || 0));\n return { shown: listed.slice(0, CARD_TASK_LIMIT), hidden: Math.max(0, listed.length - CARD_TASK_LIMIT) };\n}\n\nexport function inFlightCount(tasks: readonly CloudTaskV1[]): number {\n return tasks.filter((t) => isInFlight(t.state)).length;\n}\n\n/** \"ashlrai/ashlr-hub from master · started 5m ago\" */\nexport function taskMeta(task: CloudTaskV1, now: number = Date.now()): string {\n const when = task.state === 'queued' || task.state === 'launching' ? task.createdAt : task.launchedAt ?? task.createdAt;\n const phrase = relativePhrase(when, now);\n const verb = task.state === 'queued' ? 'queued' : task.state === 'failed' ? 'tried' : 'started';\n return `${task.repo} from ${task.baseBranch}${phrase ? ` · ${verb} ${phrase}` : ''}`;\n}\n\n/** The one line under a task's title: the report for a PR, else the state's reason. */\nexport function taskDetail(task: CloudTaskV1, now: number = Date.now()): string | null {\n if (task.report?.summary && (task.state === 'pr-open' || task.state === 'merged')) return `Cloud session reports (unverified): ${safeCloudProse(task.report.summary, now)}`;\n return task.stateReason ? safeCloudProse(task.stateReason, now) : null;\n}\n\n/** Dismiss is offered for anything Verse is still tracking; merged and closed tasks are already done. */\nexport function canDismiss(task: Pick<CloudTaskV1, 'state'>): boolean {\n return task.state !== 'merged' && task.state !== 'closed';\n}\n\n// ---------------------------------------------------------------------------\n// The launch form\n// ---------------------------------------------------------------------------\n\nexport interface LaunchDraft {\n repo: string;\n baseBranch: string;\n prompt: string;\n}\n\nexport type LaunchErrors = Partial<Record<keyof LaunchDraft, string>>;\n\nexport type LaunchValidation =\n | { ok: true; request: { repo: string; baseBranch?: string; prompt: string } }\n | { ok: false; errors: LaunchErrors };\n\nconst COUNT = new Intl.NumberFormat('en-US');\n\nexport function validateLaunch(draft: LaunchDraft): LaunchValidation {\n const errors: LaunchErrors = {};\n const repo = draft.repo.trim();\n const base = draft.baseBranch.trim();\n const prompt = draft.prompt.trim();\n if (!repo) errors.repo = 'Enter the GitHub repository as owner/name.';\n else if (!CLOUD_REPO_PATTERN.test(repo)) errors.repo = 'Use the GitHub owner/name form, like ashlrai/ashlr-hub.';\n if (base && !isBranchName(base)) errors.baseBranch = \"That isn't a branch name git accepts.\";\n if (!prompt) errors.prompt = 'Describe the task for the cloud session.';\n else if (prompt.length > CLOUD_PROMPT_MAX_CHARS) {\n errors.prompt = `The task is ${COUNT.format(prompt.length)} characters; the limit is ${COUNT.format(CLOUD_PROMPT_MAX_CHARS)}.`;\n }\n if (Object.keys(errors).length > 0) return { ok: false, errors };\n return { ok: true, request: { repo, ...(base ? { baseBranch: base } : {}), prompt } };\n}\n\n// ---------------------------------------------------------------------------\n// The budget form (Edit budget popover and the Usage panel share it)\n// ---------------------------------------------------------------------------\n\nexport interface BudgetForm {\n total: string;\n spent: string;\n perSession: string;\n maxPerDay: string;\n maxConcurrent: string;\n selfImprove: boolean;\n selfImproveMax: string;\n /** Self-improvement waits while this many of its PRs await review (3.13). */\n selfImproveMaxOpen: string;\n reserve: string;\n}\n\nexport type BudgetFormField = Exclude<keyof BudgetForm, 'selfImprove'>;\nexport type BudgetErrors = Partial<Record<BudgetFormField, string>>;\n\n/** Field → label and bounds. Bounds are the form's sanity check; the server clamps as well. */\nexport const BUDGET_FIELDS: ReadonlyArray<{\n field: BudgetFormField;\n label: string;\n hint: string;\n money: boolean;\n integer: boolean;\n min: number;\n max: number;\n}> = [\n { field: 'total', label: 'Credits on the account', hint: 'What claude.ai says you have.', money: true, integer: false, min: 0, max: 100_000 },\n { field: 'spent', label: 'Already spent', hint: 'Spent before Verse tracked it, or a correction after checking.', money: true, integer: false, min: -100_000, max: 100_000 },\n { field: 'perSession', label: 'Estimate per session', hint: 'Flat cost Verse counts for each launch.', money: true, integer: false, min: 0.01, max: 1_000 },\n { field: 'maxPerDay', label: 'Sessions per day', hint: 'From every origin, counted per local day.', money: false, integer: true, min: 0, max: 500 },\n { field: 'maxConcurrent', label: 'Running at once', hint: 'Launching or running together.', money: false, integer: true, min: 1, max: 50 },\n { field: 'selfImproveMax', label: 'Self-improvement per day', hint: 'Launches Verse may make on its own.', money: false, integer: true, min: 0, max: 100 },\n { field: 'selfImproveMaxOpen', label: 'Open self-improvement PRs', hint: 'Self-improvement waits while this many await review.', money: false, integer: true, min: 1, max: 50 },\n { field: 'reserve', label: 'Reserve', hint: 'Self-improvement stops under this estimated balance.', money: true, integer: false, min: 0, max: 100_000 },\n];\n\n/** A pre-3.13 server sends no maxOpenPrs: the form shows the default and never sends it unchanged. */\nfunction maxOpenPrsOf(b: CloudBudgetV1): number {\n const n = (b.selfImprove as Partial<CloudBudgetV1['selfImprove']>).maxOpenPrs;\n return typeof n === 'number' && Number.isFinite(n) ? n : DEFAULT_CLOUD_BUDGET.selfImprove.maxOpenPrs;\n}\n\nfunction numText(n: number): string {\n return Number.isInteger(n) ? String(n) : String(Math.round(n * 100) / 100);\n}\n\nexport function budgetFormFrom(b: CloudBudgetV1): BudgetForm {\n return {\n total: numText(b.creditsTotalUsd),\n spent: numText(b.creditsSpentAdjustmentUsd),\n perSession: numText(b.estimatedCostPerSessionUsd),\n maxPerDay: numText(b.maxSessionsPerDay),\n maxConcurrent: numText(b.maxConcurrent),\n selfImprove: b.selfImprove.enabled,\n selfImproveMax: numText(b.selfImprove.maxPerDay),\n selfImproveMaxOpen: numText(maxOpenPrsOf(b)),\n reserve: numText(b.selfImprove.reserveUsd),\n };\n}\n\nexport type BudgetPatch = { ok: true; update: CloudBudgetUpdate; changed: boolean } | { ok: false; errors: BudgetErrors };\n\n/**\n * The form as ONE update carrying only what changed — so two people editing\n * different fields never overwrite each other's numbers with stale ones.\n */\nexport function budgetPatch(form: BudgetForm, current: CloudBudgetV1): BudgetPatch {\n const errors: BudgetErrors = {};\n const values: Partial<Record<BudgetFormField, number>> = {};\n for (const spec of BUDGET_FIELDS) {\n const raw = form[spec.field].trim().replace(/^\\$/, '');\n const n = raw === '' ? Number.NaN : Number(raw);\n if (!Number.isFinite(n)) errors[spec.field] = 'Enter a number.';\n else if (spec.integer && !Number.isInteger(n)) errors[spec.field] = 'Enter a whole number.';\n else if (n < spec.min || n > spec.max) {\n errors[spec.field] = spec.money\n ? `Between ${formatDollars(spec.min)} and ${formatDollars(spec.max)}.`\n : `Between ${COUNT.format(spec.min)} and ${COUNT.format(spec.max)}.`;\n } else values[spec.field] = n;\n }\n if (Object.keys(errors).length > 0) return { ok: false, errors };\n const update: CloudBudgetUpdate = {};\n const same = (a: number, b: number) => Math.abs(a - b) < 0.005;\n if (!same(values.total!, current.creditsTotalUsd)) update.creditsTotalUsd = values.total!;\n if (!same(values.spent!, current.creditsSpentAdjustmentUsd)) update.creditsSpentAdjustmentUsd = values.spent!;\n if (!same(values.perSession!, current.estimatedCostPerSessionUsd)) update.estimatedCostPerSessionUsd = values.perSession!;\n if (!same(values.maxPerDay!, current.maxSessionsPerDay)) update.maxSessionsPerDay = values.maxPerDay!;\n if (!same(values.maxConcurrent!, current.maxConcurrent)) update.maxConcurrent = values.maxConcurrent!;\n const selfImprove: NonNullable<CloudBudgetUpdate['selfImprove']> = {};\n if (form.selfImprove !== current.selfImprove.enabled) selfImprove.enabled = form.selfImprove;\n if (!same(values.selfImproveMax!, current.selfImprove.maxPerDay)) selfImprove.maxPerDay = values.selfImproveMax!;\n if (!same(values.selfImproveMaxOpen!, maxOpenPrsOf(current))) selfImprove.maxOpenPrs = values.selfImproveMaxOpen!;\n if (!same(values.reserve!, current.selfImprove.reserveUsd)) selfImprove.reserveUsd = values.reserve!;\n if (Object.keys(selfImprove).length > 0) update.selfImprove = selfImprove;\n return { ok: true, update, changed: Object.keys(update).length > 0 };\n}\n\n// ---------------------------------------------------------------------------\n// The composer's \"Run in cloud\"\n// ---------------------------------------------------------------------------\n\nexport interface RunInCloudInputs {\n /** The cloud overview, or null when the route did not answer. */\n overview: { seat: CloudSeatStatus; budget: CloudBudgetView } | null;\n /** Why the overview is missing, when it is. */\n overviewReason: string | null;\n /** The chat project's GitHub `owner/name`, or null when it has none. */\n repo: string | null;\n /** True while the chat's roots have not been read yet. */\n rootsLoading: boolean;\n prompt: string;\n}\n\n/** Null when \"Run in cloud\" may be pressed; otherwise the tooltip saying why not. */\nexport function runInCloudBlock(inputs: RunInCloudInputs): string | null {\n if (!inputs.overview) return inputs.overviewReason ?? 'The cloud lane did not answer.';\n const seat = seatText(inputs.overview.seat);\n if (seat) return seat;\n if (!inputs.repo) {\n return inputs.rootsLoading\n ? \"Reading this chat's project…\"\n : \"This chat's project has no GitHub origin, so a cloud session has nothing to clone.\";\n }\n const gate = gateText(inputs.overview.budget.canLaunch, 'The cloud budget does not allow another launch right now.');\n if (gate) return gate;\n if (!inputs.prompt.trim()) return 'Type the task in the message box first.';\n if (inputs.prompt.trim().length > CLOUD_PROMPT_MAX_CHARS) {\n return `The message is over ${COUNT.format(CLOUD_PROMPT_MAX_CHARS)} characters — trim it to run it in the cloud.`;\n }\n return null;\n}\n"],"mappings":"mSAAA,EAAO,QAAU,CAAC,OCiElB,IAAM,EAAW,aAEjB,SAAS,EAAoB,EAAuB,CAGlD,GAAI,oBAAoB,KAAK,CAAK,EAAG,OAAO,EAG5C,IAAM,EAAoB,EAAM,QAAQ,MAAO,EAAE,CAAC,CAAC,QAAQ,MAAO,EAAE,EAEpE,MADI,eAAe,KAAK,CAAiB,EAAU,EAC5C,CACT,CAgBA,IAAM,GAAqB,kDAS3B,SAAS,GAAe,EAAe,EAAgB,EAAuB,CAC5E,IAAM,EAAY,GAAuB,EAAI,GAAK,CAAC,eAAe,KAAK,EAAM,EAAG,EAGhF,OAFI,EAAS,EAAS,CAAC,GACnB,EAAM,MAAM,EAAS,EAAG,CAAM,IAAM,OAAS,EAAS,EAAS,CAAC,EAAU,EACvE,CACT,CAMA,IAAM,EACJ,mJAQI,EAAgB,+EAGhB,EAAc,0CAMd,EAAiB,OAAO,GAAG,oCAQ3B,EAAwB,IAAI,OAChC,OAAO,GAAG,qGACR,EACF,GACF,EAGM,EAA0B,IAAI,OAClC,OAAO,GAAG,8IACR,EACF,GACF,EAQM,EAAkB,kHAClB,EAAkB,wGAGlB,GAA0B,IAAI,OAClC,OAAO,GAAG,sIACR,EACF,GACF,EAQM,GACJ,0NASF,SAAS,EAAgB,EAAwB,CAC/C,IAAM,EAAI,EAAM,QAAQ,eAAgB,EAAE,EAC1C,MACE,qDAAqD,KAAK,CAAC,GAC3D,uBAAuB,KAAK,CAAC,GAC7B,4BAA4B,KAAK,CAAC,CAEtC,CAQA,SAAS,GAAiB,EAAwB,CAChD,IAAM,EAAI,EAAM,QAAQ,eAAgB,EAAE,EAC1C,MAAO,CAAC,KAAK,KAAK,CAAC,GAAK,sCAAsC,KAAK,CAAC,CACtE,CAGA,SAAS,EAAkB,EAAwB,CACjD,OAAO,EAAM,QAAQ,eAAgB,EAAE,IAAM,CAC/C,CAEA,SAAS,EAAiB,EAAc,EAAe,EAAe,EAAmC,CAKvG,OAHI,EAAkB,CAAK,GACvB,EAAgB,CAAK,GACrB,GAAoB,GAAiB,CAAK,EAAU,EACjD,GAAG,EAAK,GAAG,GACpB,CAEA,SAAS,EAAQ,EAAe,EAAsB,CACpD,OAAO,EAAM,MAAM,EAAK,MAAM,CAAC,CAAC,QAAQ,cAAe,EAAE,CAC3D,CAOA,SAAgB,EAAa,EAAsB,CACjD,GAAI,CACF,IAAI,EAAM,EAGP,QAAQ,4EAA6E,CAAQ,CAAC,CAC9F,QAAQ,2CAA4C,CAAQ,CAAC,CAG7D,QAAQ,GAAoB,EAAc,CAAC,CAE3C,QAAQ,EAAa,cAAc,CAAC,CAGpC,QAAQ,EAAa,CAAQ,CAAC,CAE9B,QAAQ,EAAe,CAAQ,CAAC,CAEhC,QAAQ,2BAA4B,CAAQ,CAAC,CAG7C,QAAQ,wDAAyD,CAAQ,CAAC,CAC1E,QAAQ,kCAAmC,CAAQ,CAAC,CAEpD,QAAQ,2DAA4D,eAAe,CAAC,CAIpF,QACC,wTACA,eACF,CAAC,CAEA,QAAQ,mCAAoC,CAAQ,CAAC,CAErD,QAAQ,wBAAyB,CAAQ,CAAC,CAE1C,QAAQ,uDAAwD,CAAQ,CAAC,CAEzE,QAAQ,wBAAyB,CAAQ,CAAC,CAE1C,QAAQ,8BAA+B,CAAQ,CAAC,CAChD,QAAQ,2BAA4B,CAAQ,CAAC,CAC7C,QAAQ,4BAA6B,CAAQ,CAAC,CAC9C,QAAQ,6BAA8B,CAAQ,CAAC,CAE/C,QAAQ,+BAAgC,gBAAgB,CAAC,CACzD,QAAQ,8CAA+C,CAAmB,CAAC,CAM3E,QAAQ,GAAwB,EAAW,IAAiB,EAAiB,EAAM,EAAG,EAAQ,EAAG,CAAI,EAAG,EAAK,CAAC,EAQjH,OAPI,EAAgB,KAAK,CAAG,IAC1B,EAAM,EAAI,QAAQ,GAA0B,EAAW,IAAiB,EAAiB,EAAM,EAAG,EAAQ,EAAG,CAAI,EAAG,EAAI,CAAC,GAEvH,EAAgB,KAAK,CAAG,IAC1B,EAAM,EAAI,QAAQ,IAA0B,EAAW,IAAiB,EAAiB,EAAM,EAAG,EAAQ,EAAG,CAAI,EAAG,EAAI,CAAC,GAGpH,EAAI,QACT,IACC,EAAW,EAAW,EAAc,EAAa,EAAY,IAC5D,EAAkB,CAAK,GAAK,EAAgB,CAAK,EAAI,EAAI,GAAG,IAAI,IAAO,IAAI,IAAM,IAAK,IAAW,GACrG,CACF,MAAQ,CAEN,OAAO,CACT,CACF,CCrQA,SAAS,EAAe,EAAc,EAAsB,CAC1D,OAAO,EAAU,EAAa,CAAI,EAAG,CAAG,CAC1C,CAGA,IAAa,EAAqB,EAAqB,YAAY,KAGtD,EAAqB,mCAO5B,EAAe,4BACrB,SAAgB,EAAa,EAAwB,CAGnD,MAFI,CAAC,EAAa,KAAK,CAAK,GACxB,EAAM,WAAW,GAAG,GAAK,EAAM,WAAW,GAAG,GAAK,EAAM,SAAS,GAAG,GAAK,EAAM,SAAS,GAAG,GAAK,EAAM,SAAS,OAAO,EAAU,GAC7H,CAAC,EAAM,SAAS,IAAI,GAAK,CAAC,EAAM,SAAS,IAAI,CACtD,CAGA,SAAgB,EAAS,EAAgC,EAAkE,CACzH,GAAI,OAAO,GAAQ,UAAY,EAAI,OAAS,KAAO,OAAO,KAC1D,GAAI,CACF,IAAM,EAAS,IAAI,IAAI,CAAG,EAC1B,OAAO,EAAO,WAAa,UAAY,EAAO,WAAa,EAAO,EAAO,SAAS,EAAI,IACxF,MAAQ,CACN,OAAO,IACT,CACF,CAOA,SAAgB,EAAc,EAAuB,CACnD,GAAI,CAAC,OAAO,SAAS,CAAK,EAAG,MAAO,IACpC,IAAM,EAAI,KAAK,IAAI,CAAK,EAAI,KAAQ,EAAI,EAClC,EAAO,OAAO,UAAU,CAAC,EAAI,OAAO,KAAK,IAAI,CAAC,CAAC,EAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAC9E,MAAO,GAAG,EAAI,EAAI,IAAM,GAAG,GAAG,GAChC,CAeA,SAAgB,EAAa,EAAyC,CACpE,IAAM,EAAQ,EAAK,gBACb,EAAY,EAAK,sBACjB,EAAU,EAAK,OAAO,YAAY,WAClC,EAAM,EAAQ,EAAI,EAAQ,KAC1B,EAAO,IAAQ,KAAO,MAAS,EAAQ,KAAK,IAAI,EAAG,CAAS,GAAK,EAAS,IAC1E,EAAkB,GAAa,EAAI,SAAW,EAAY,EAAU,UAAY,SAChF,EAAU,GAAa,EACzB,sGACA,EAAY,EACV,aAAa,EAAc,CAAO,EAAE,4DACpC,KACN,MAAO,CACL,MAAO,KAAK,IAAI,EAAG,CAAS,EAC5B,MACA,KAAM,GAAG,EAAc,KAAK,IAAI,EAAG,CAAS,CAAC,EAAE,MAAM,EAAc,CAAK,EAAE,aAC1E,SAAU,IAAS,KAAO,sBAAwB,GAAG,EAAgB,CAAI,EAAE,OAC3E,OACA,SACF,CACF,CAGA,SAAgB,EAAkB,EAAqB,CACrD,IAAM,EAAI,IAAI,KAAK,CAAG,EAEtB,OADA,EAAE,SAAS,GAAI,EAAG,EAAG,CAAC,EACf,EAAE,QAAQ,CACnB,CAGA,SAAgB,EAAa,EAAuB,EAAc,KAAK,IAAI,EAAW,CACpF,IAAM,EAAQ,EAAgB,IAAI,KAAK,EAAkB,CAAG,CAAC,CAAC,CAAC,YAAY,EAAG,CAAG,EAC3E,EAAU,EAAK,UAAY,EAAI,YAAc,GAAG,EAAK,QAAQ,UACnE,MAAO,GAAG,EAAK,cAAc,MAAM,EAAK,OAAO,kBAAkB,oBAAoB,IAAU,EAAQ,aAAa,IAAU,IAChI,CAEA,SAAgB,EAAgB,EAA+B,CAC7D,IAAM,EAAK,EAAK,OAAO,YAEvB,OADK,EAAG,QACD,GAAG,EAAK,iBAAiB,MAAM,EAAG,UAAU,uCAAuC,EAAG,KAAK,kBAAkB,EAAc,EAAG,UAAU,EAAE,qBADzH,wEAE1B,CAGA,SAAgB,EAAS,EAA8C,EAAiC,CAEtG,OADI,EAAK,GAAW,KACb,EAAK,OAAS,EAAe,EAAK,MAAM,EAAI,CACrD,CAEA,IAAa,EAAiB,4CAE9B,SAAgB,EAAS,EAAsC,CAE7D,OADI,EAAK,MAAc,KAChB,EAAK,OAAS,EAAe,EAAK,MAAM,EAAI,CACrD,CAoBA,IAAa,EAAwB,aAMrC,SAAgB,EAAc,EAA8B,CAE1D,MAAO,KADG,OAAO,SAAS,CAAY,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,CAAY,CAAC,EAAI,EACpE,SAChB,CAGA,SAAgB,EAAa,EAA8B,CACzD,MAAO,uBAAuB,EAAc,CAAY,GAC1D,CAMA,SAAgB,GAAY,EAAuB,EAAwC,CACzF,OAAO,EAAS,CAAI,GAAK,EAAS,EAAO,UAAW,2DAA2D,CACjH,CAMA,IAAa,EAA6C,CACxD,OAAQ,SACR,UAAW,YACX,QAAS,UACT,UAAW,UACX,OAAQ,SACR,OAAQ,SACR,OAAQ,SACR,QAAS,SACX,EAEa,EAA2C,CACtD,OAAQ,OACR,UAAW,OACX,QAAS,UACT,UAAW,UACX,OAAQ,UACR,OAAQ,UACR,OAAQ,SACR,QAAS,SACX,EAGA,SAAgB,EAAU,EAAiD,CAGzE,OAFI,EAAK,QAAU,WAAa,CAAC,EAAK,GAAW,gBAC7C,EAAK,QAAU,WAAa,EAAK,IAAI,MAAc,WAChD,EAAW,EAAK,QAAU,EAAK,KACxC,CAEA,SAAgB,EAAW,EAAgC,CACzD,OAAO,EAAsB,SAAS,CAAK,CAC7C,CAGA,SAAgB,EAAW,EAAgC,CACzD,OAAO,IAAU,UAAY,IAAU,aAAe,IAAU,SAClE,CAEA,IAAM,EAAS,MASf,SAAgB,EAAU,EAA+B,EAAc,KAAK,IAAI,EAA6C,CAC3H,IAAM,EAAU,GAAmB,CACjC,IAAM,EAAK,KAAK,MAAM,EAAE,SAAS,EACjC,OAAO,OAAO,SAAS,CAAE,GAAK,EAAM,EAAK,CAC3C,EACM,EAAS,EACZ,OAAQ,GAAM,CAAC,EAAW,EAAE,KAAK,GAAK,EAAO,CAAC,CAAC,CAAC,CAChD,MAAM,EAAG,KAAO,KAAK,MAAM,EAAE,SAAS,GAAK,IAAM,KAAK,MAAM,EAAE,SAAS,GAAK,EAAE,EACjF,MAAO,CAAE,MAAO,EAAO,MAAM,EAAA,CAAkB,EAAG,OAAQ,KAAK,IAAI,EAAG,EAAO,OAAA,CAAwB,CAAE,CACzG,CAEA,SAAgB,EAAc,EAAuC,CACnE,OAAO,EAAM,OAAQ,GAAM,EAAW,EAAE,KAAK,CAAC,CAAC,CAAC,MAClD,CAGA,SAAgB,EAAS,EAAmB,EAAc,KAAK,IAAI,EAAW,CAC5E,IAAM,EAAO,EAAK,QAAU,UAAY,EAAK,QAAU,YAAc,EAAK,UAAY,EAAK,YAAc,EAAK,UACxG,EAAS,EAAe,EAAM,CAAG,EACjC,EAAO,EAAK,QAAU,SAAW,SAAW,EAAK,QAAU,SAAW,QAAU,UACtF,MAAO,GAAG,EAAK,KAAK,QAAQ,EAAK,aAAa,EAAS,MAAM,EAAK,GAAG,IAAW,IAClF,CAGA,SAAgB,GAAW,EAAmB,EAAc,KAAK,IAAI,EAAkB,CAErF,OADI,EAAK,QAAQ,UAAY,EAAK,QAAU,WAAa,EAAK,QAAU,UAAkB,uCAAuC,EAAe,EAAK,OAAO,QAAS,CAAG,IACjK,EAAK,YAAc,EAAe,EAAK,YAAa,CAAG,EAAI,IACpE,CAGA,SAAgB,GAAW,EAA2C,CACpE,OAAO,EAAK,QAAU,UAAY,EAAK,QAAU,QACnD,CAkBA,IAAM,EAAQ,IAAI,KAAK,aAAa,OAAO,EAE3C,SAAgB,GAAe,EAAsC,CACnE,IAAM,EAAuB,CAAC,EACxB,EAAO,EAAM,KAAK,KAAK,EACvB,EAAO,EAAM,WAAW,KAAK,EAC7B,EAAS,EAAM,OAAO,KAAK,EASjC,OARK,EACK,EAAmB,KAAK,CAAI,IAAG,EAAO,KAAO,2DAD5C,EAAO,KAAO,6CAErB,GAAQ,CAAC,EAAa,CAAI,IAAG,EAAO,WAAa,yCAChD,EACI,EAAO,OAAA,MACd,EAAO,OAAS,eAAe,EAAM,OAAO,EAAO,MAAM,EAAE,4BAA4B,EAAM,OAAO,CAAsB,EAAE,IAFjH,EAAO,OAAS,2CAIzB,OAAO,KAAK,CAAM,CAAC,CAAC,OAAS,EAAU,CAAE,GAAI,GAAO,QAAO,EACxD,CAAE,GAAI,GAAM,QAAS,CAAE,OAAM,GAAI,EAAO,CAAE,WAAY,CAAK,EAAI,CAAC,EAAI,QAAO,CAAE,CACtF,CAuBA,IAAa,EAQR,CACH,CAAE,MAAO,QAAS,MAAO,yBAA0B,KAAM,gCAAiC,MAAO,GAAM,QAAS,GAAO,IAAK,EAAG,IAAK,GAAQ,EAC5I,CAAE,MAAO,QAAS,MAAO,gBAAiB,KAAM,iEAAkE,MAAO,GAAM,QAAS,GAAO,IAAK,KAAU,IAAK,GAAQ,EAC3K,CAAE,MAAO,aAAc,MAAO,uBAAwB,KAAM,0CAA2C,MAAO,GAAM,QAAS,GAAO,IAAK,IAAM,IAAK,GAAM,EAC1J,CAAE,MAAO,YAAa,MAAO,mBAAoB,KAAM,4CAA6C,MAAO,GAAO,QAAS,GAAM,IAAK,EAAG,IAAK,GAAI,EAClJ,CAAE,MAAO,gBAAiB,MAAO,kBAAmB,KAAM,iCAAkC,MAAO,GAAO,QAAS,GAAM,IAAK,EAAG,IAAK,EAAG,EACzI,CAAE,MAAO,iBAAkB,MAAO,2BAA4B,KAAM,sCAAuC,MAAO,GAAO,QAAS,GAAM,IAAK,EAAG,IAAK,GAAI,EACzJ,CAAE,MAAO,qBAAsB,MAAO,4BAA6B,KAAM,uDAAwD,MAAO,GAAO,QAAS,GAAM,IAAK,EAAG,IAAK,EAAG,EAC9K,CAAE,MAAO,UAAW,MAAO,UAAW,KAAM,uDAAwD,MAAO,GAAM,QAAS,GAAO,IAAK,EAAG,IAAK,GAAQ,CACxJ,EAGA,SAAS,EAAa,EAA0B,CAC9C,IAAM,EAAK,EAAE,YAAsD,WACnE,OAAO,OAAO,GAAM,UAAY,OAAO,SAAS,CAAC,EAAI,EAAI,EAAqB,YAAY,UAC5F,CAEA,SAAS,EAAQ,EAAmB,CAClC,OAA6B,OAAtB,OAAO,UAAU,CAAC,EAAW,EAAY,KAAK,MAAM,EAAI,GAAG,EAAI,GAAG,CAC3E,CAEA,SAAgB,GAAe,EAA8B,CAC3D,MAAO,CACL,MAAO,EAAQ,EAAE,eAAe,EAChC,MAAO,EAAQ,EAAE,yBAAyB,EAC1C,WAAY,EAAQ,EAAE,0BAA0B,EAChD,UAAW,EAAQ,EAAE,iBAAiB,EACtC,cAAe,EAAQ,EAAE,aAAa,EACtC,YAAa,EAAE,YAAY,QAC3B,eAAgB,EAAQ,EAAE,YAAY,SAAS,EAC/C,mBAAoB,EAAQ,EAAa,CAAC,CAAC,EAC3C,QAAS,EAAQ,EAAE,YAAY,UAAU,CAC3C,CACF,CAQA,SAAgB,EAAY,EAAkB,EAAqC,CACjF,IAAM,EAAuB,CAAC,EACxB,EAAmD,CAAC,EAC1D,IAAK,IAAM,KAAQ,EAAe,CAChC,IAAM,EAAM,EAAK,EAAK,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,MAAO,EAAE,EAC/C,EAAI,IAAQ,GAAK,IAAa,OAAO,CAAG,EACzC,OAAO,SAAS,CAAC,EACb,EAAK,SAAW,CAAC,OAAO,UAAU,CAAC,EAAG,EAAO,EAAK,OAAS,wBAC3D,EAAI,EAAK,KAAO,EAAI,EAAK,IAChC,EAAO,EAAK,OAAS,EAAK,MACtB,WAAW,EAAc,EAAK,GAAG,EAAE,OAAO,EAAc,EAAK,GAAG,EAAE,GAClE,WAAW,EAAM,OAAO,EAAK,GAAG,EAAE,OAAO,EAAM,OAAO,EAAK,GAAG,EAAE,GAC/D,EAAO,EAAK,OAAS,EANH,EAAO,EAAK,OAAS,iBAOhD,CACA,GAAI,OAAO,KAAK,CAAM,CAAC,CAAC,OAAS,EAAG,MAAO,CAAE,GAAI,GAAO,QAAO,EAC/D,IAAM,EAA4B,CAAC,EAC7B,GAAQ,EAAW,IAAc,KAAK,IAAI,EAAI,CAAC,EAAI,KACpD,EAAK,EAAO,MAAQ,EAAQ,eAAe,IAAG,EAAO,gBAAkB,EAAO,OAC9E,EAAK,EAAO,MAAQ,EAAQ,yBAAyB,IAAG,EAAO,0BAA4B,EAAO,OAClG,EAAK,EAAO,WAAa,EAAQ,0BAA0B,IAAG,EAAO,2BAA6B,EAAO,YACzG,EAAK,EAAO,UAAY,EAAQ,iBAAiB,IAAG,EAAO,kBAAoB,EAAO,WACtF,EAAK,EAAO,cAAgB,EAAQ,aAAa,IAAG,EAAO,cAAgB,EAAO,eACvF,IAAM,EAA6D,CAAC,EAMpE,OALI,EAAK,cAAgB,EAAQ,YAAY,UAAS,EAAY,QAAU,EAAK,aAC5E,EAAK,EAAO,eAAiB,EAAQ,YAAY,SAAS,IAAG,EAAY,UAAY,EAAO,gBAC5F,EAAK,EAAO,mBAAqB,EAAa,CAAO,CAAC,IAAG,EAAY,WAAa,EAAO,oBACzF,EAAK,EAAO,QAAU,EAAQ,YAAY,UAAU,IAAG,EAAY,WAAa,EAAO,SACxF,OAAO,KAAK,CAAW,CAAC,CAAC,OAAS,IAAG,EAAO,YAAc,GACvD,CAAE,GAAI,GAAM,SAAQ,QAAS,OAAO,KAAK,CAAM,CAAC,CAAC,OAAS,CAAE,CACrE,CAmBA,SAAgB,GAAgB,EAAyC,CAevE,OAdK,EAAO,SACC,EAAS,EAAO,SAAS,IAClC,IACC,EAAO,KAKC,EAAS,EAAO,SAAS,OAAO,UAAW,2DACpD,IACC,EAAO,OAAO,KAAK,EACpB,EAAO,OAAO,KAAK,CAAC,CAAC,OAAA,IAChB,uBAAuB,EAAM,OAAO,CAAsB,EAAE,+CAE9D,KAJ2B,2CANzB,EAAO,aACV,+BACA,sFANuB,EAAO,gBAAkB,gCAexD"}
@@ -0,0 +1,2 @@
1
+ import{C as e,M as t,V as n,a as r,i,t as a}from"./global-CYfRwH6t.js";import{O as o}from"./VerseShared-CFE5B-IY.js";import{c as s,d as c,l,o as u,r as d,s as f,u as p}from"./types-IYKrYLku.js";var m=`verse-cloud`,h=3e4,g=class extends Error{constructor(){super(`Unlock actions with the mutation token first.`),this.name=`CloudLockedError`}},_=class extends Error{failure;constructor(e,t){super(e),this.failure=t,this.name=`CloudLaunchRefusedError`}};function v(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function y(e){if(!v(e))return null;let{seat:t,budget:n,tasks:r,backlog:i}=e;if(!v(t)||typeof t.ready!=`boolean`||!v(n)||!v(n.budget)||!v(n.canLaunch)||!v(n.canSelfImprove))return null;for(let e of[`creditsTotalUsd`,`estimatedSpentUsd`,`estimatedRemainingUsd`,`sessionsToday`,`selfImproveToday`,`running`])if(typeof n[e]!=`number`||!Number.isFinite(n[e]))return null;return!Array.isArray(r)||!r.every(e=>v(e)&&typeof e.id==`string`&&typeof e.state==`string`)||!v(i)||!Array.isArray(i.items)?null:e}var b=`The cloud lane is not in this build yet.`;function x(e){return e instanceof a?e.status===404?b:e.status===503?`The cloud lane failed to load on the server.`:`The cloud lane answered HTTP ${e.status}.`:`The cloud lane could not be reached.`}var S={key:m,fetch:async e=>{try{let t=y(await i(l,e));return t===null?{value:null,available:!0,reason:`Unrecognized response — update Ashlr.`}:{value:t,available:!0,reason:null}}catch(e){if(e instanceof a&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{value:null,available:!1,reason:x(e)}}}};async function C(n,i){let a=e();if(!a)throw new g;let o=await r(n,i,a);return t(),o}function w(){n(m),o()}async function T(e){try{let t=await C(s,e);if(!v(t)||t.ok!==!0||!v(t.task))throw new _(v(t)&&typeof t.error==`string`&&t.error?t.error:`The cloud session was not started, and the server sent no reason.`,v(t)&&typeof t.failure==`string`?t.failure:null);return t}finally{w()}}async function E(e){let t=await C(u,e);return n(m),t}async function D(e={count:1}){try{let t=await C(f,e);return{launched:v(t)&&Array.isArray(t.launched)?t.launched:[],skipped:v(t)&&Array.isArray(t.skipped)?t.skipped:[]}}finally{w()}}async function O(){try{return await C(p,{})}finally{w()}}async function k(e){if(!d.test(e))throw Error(`That task id is not one Verse issued, so nothing was sent.`);try{return await C(`${c}/${e}/dismiss`,{})}finally{w()}}export{T as a,E as c,k as i,h as n,O as o,S as r,D as s,b as t};
2
+ //# sourceMappingURL=cloud-queries-DrR_QeUK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-queries-DrR_QeUK.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/cloud/cloud-queries.ts"],"sourcesContent":["/**\n * routes/verse/cloud/cloud-queries.ts — the one read and the writes behind\n * the cloud lane's UI (3.11 unit C3; server: core/cloud/cloud-api.ts, C2).\n *\n * GET /api/verse/cloud CloudOverviewResponse\n * POST /api/verse/cloud/launch CloudLaunchRequest → CloudLaunchResponse\n * POST /api/verse/cloud/budget CloudBudgetUpdate\n * POST /api/verse/cloud/refresh (re-read tasks from GitHub)\n * POST /api/verse/cloud/improve CloudImproveRequest → CloudImproveResponse\n * POST /api/verse/cloud/tasks/<id>/dismiss (mark closed; never touches GitHub)\n *\n * WHY the read is OPTIONAL (the surface-data.ts rule): the routes land in a\n * parallel unit, and a server without them answers 404. That is \"this build\n * has no cloud lane yet\" — one card's designed state — never a broken\n * Command. 401 and aborts still propagate: an expired read session is the\n * whole app's state.\n *\n * LAZY ONLY. Everything that imports this file (Command's card, the Usage\n * panel, the Fleet chip, the composer's \"Run in cloud\") is itself behind an\n * import(); nothing cloud-related may cost chat first-paint bytes.\n *\n * Writes pull the held mutation token (CloudLockedError without one — the\n * callers route every write through a token gate that opens the unlock\n * dialog first), then invalidate the overview so every cloud view moves\n * together, and nudge the shell's activity poll (Needs-you carries cloud\n * items).\n */\nimport {\n CLOUD_TASK_ID_PATTERN,\n VERSE_CLOUD_BUDGET_PATH,\n VERSE_CLOUD_IMPROVE_PATH,\n VERSE_CLOUD_LAUNCH_PATH,\n VERSE_CLOUD_PATH,\n VERSE_CLOUD_REFRESH_PATH,\n VERSE_CLOUD_TASKS_PATH,\n type CloudBudgetUpdate,\n type CloudImproveRequest,\n type CloudImproveResponse,\n type CloudLaunchFailureCode,\n type CloudLaunchRequest,\n type CloudLaunchResponse,\n type CloudOverviewResponse,\n} from '../../../../core/cloud/types.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { refreshActivity } from '../shell/useActivity.js';\nimport type { OptionalRead } from '../command/surface-data.js';\n\nexport const CLOUD_KEY = 'verse-cloud';\n\n/** The card, the chip and the panel all poll at this pace while visible (SPEC 3.11 C3). */\nexport const CLOUD_POLL_MS = 30_000;\n\nexport class CloudLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token first.');\n this.name = 'CloudLockedError';\n }\n}\n\n/**\n * The server answered a launch with `ok: false` — a budget gate, a missing\n * seat, a CLI that printed no session. `message` is the server's own\n * sentence; `failure` the machine code for tests and chips.\n */\nexport class CloudLaunchRefusedError extends Error {\n constructor(message: string, public readonly failure: CloudLaunchFailureCode | null) {\n super(message);\n this.name = 'CloudLaunchRefusedError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Just enough structure that no render can crash on `undefined.map` or read\n * a budget field that is not there. Field-level honesty (null = unknown) is\n * the model's job.\n */\nexport function narrowCloudOverview(raw: unknown): CloudOverviewResponse | null {\n if (!isRecord(raw)) return null;\n const { seat, budget, tasks, backlog } = raw;\n if (!isRecord(seat) || typeof seat['ready'] !== 'boolean') return null;\n if (!isRecord(budget) || !isRecord(budget['budget']) || !isRecord(budget['canLaunch']) || !isRecord(budget['canSelfImprove'])) return null;\n for (const key of ['creditsTotalUsd', 'estimatedSpentUsd', 'estimatedRemainingUsd', 'sessionsToday', 'selfImproveToday', 'running']) {\n if (typeof budget[key] !== 'number' || !Number.isFinite(budget[key])) return null;\n }\n if (!Array.isArray(tasks) || !tasks.every((t) => isRecord(t) && typeof t['id'] === 'string' && typeof t['state'] === 'string')) return null;\n if (!isRecord(backlog) || !Array.isArray(backlog['items'])) return null;\n return raw as unknown as CloudOverviewResponse;\n}\n\n/**\n * The 404 sentence. Exported so Command's CloudCard can recognise a server\n * without the lane and render nothing at all, rather than spending a\n * full-width row to say so; launch buttons elsewhere still use it as their\n * disabled tooltip.\n */\nexport const CLOUD_NOT_IN_BUILD = 'The cloud lane is not in this build yet.';\n\n/** Operator words for a cloud read that did not answer — never a path, never a trace. */\nfunction absence(err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return CLOUD_NOT_IN_BUILD;\n if (err.status === 503) return 'The cloud lane failed to load on the server.';\n return `The cloud lane answered HTTP ${err.status}.`;\n }\n return 'The cloud lane could not be reached.';\n}\n\nexport const cloudQuery: QueryDef<OptionalRead<CloudOverviewResponse>> = {\n key: CLOUD_KEY,\n fetch: async (signal) => {\n try {\n const value = narrowCloudOverview(await apiGet<unknown>(VERSE_CLOUD_PATH, signal));\n if (value === null) {\n // Nothing is shown rather than guessed from an unknown shape.\n return { value: null, available: true, reason: 'Unrecognized response — update Ashlr.' };\n }\n return { value, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { value: null, available: false, reason: absence(err) };\n }\n },\n};\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new CloudLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nfunction settled(): void {\n invalidate(CLOUD_KEY);\n void refreshActivity();\n}\n\n/**\n * Launch one cloud session. Resolves only on `ok: true` with a task; a\n * refusal the server words in a 200 body is thrown as CloudLaunchRefusedError\n * so every caller shows it the same way as a 4xx refusal (whose sentence is\n * `ApiError.detail`). Invalidates either way — a failed launch is still a\n * recorded task.\n */\nexport async function launchCloudTask(request: CloudLaunchRequest): Promise<CloudLaunchResponse & { task: NonNullable<CloudLaunchResponse['task']> }> {\n try {\n const response = await post<CloudLaunchResponse>(VERSE_CLOUD_LAUNCH_PATH, request);\n if (!isRecord(response) || response.ok !== true || !isRecord(response.task)) {\n const error = isRecord(response) && typeof response.error === 'string' && response.error ? response.error : 'The cloud session was not started, and the server sent no reason.';\n const failure = isRecord(response) && typeof response.failure === 'string' ? response.failure : null;\n throw new CloudLaunchRefusedError(error, failure);\n }\n return response as CloudLaunchResponse & { task: NonNullable<CloudLaunchResponse['task']> };\n } finally {\n settled();\n }\n}\n\n/** One budget change (any subset; the server validates and clamps). */\nexport async function updateCloudBudget(update: CloudBudgetUpdate): Promise<unknown> {\n const result = await post<unknown>(VERSE_CLOUD_BUDGET_PATH, update);\n invalidate(CLOUD_KEY);\n return result;\n}\n\n/** Launch up to `count` backlog items now (the \"Improve Verse\" button). */\nexport async function runCloudImprove(request: CloudImproveRequest = { count: 1 }): Promise<CloudImproveResponse> {\n try {\n const result = await post<unknown>(VERSE_CLOUD_IMPROVE_PATH, request);\n const launched = isRecord(result) && Array.isArray(result['launched']) ? (result['launched'] as CloudImproveResponse['launched']) : [];\n const skipped = isRecord(result) && Array.isArray(result['skipped']) ? (result['skipped'] as CloudImproveResponse['skipped']) : [];\n return { launched, skipped };\n } finally {\n settled();\n }\n}\n\n/** Ask the server to re-read every open task from GitHub now. */\nexport async function refreshCloudTasks(): Promise<unknown> {\n try {\n return await post<unknown>(VERSE_CLOUD_REFRESH_PATH, {});\n } finally {\n settled();\n }\n}\n\n/**\n * Stop tracking one task (it becomes `closed`, \"Dismissed in Verse.\"). The id\n * is re-checked against the contract's pattern: it came from the server, but\n * it is spliced into a path the mutation token is sent to.\n */\nexport async function dismissCloudTask(taskId: string): Promise<unknown> {\n if (!CLOUD_TASK_ID_PATTERN.test(taskId)) throw new Error('That task id is not one Verse issued, so nothing was sent.');\n try {\n return await post<unknown>(`${VERSE_CLOUD_TASKS_PATH}/${taskId}/dismiss`, {});\n } finally {\n settled();\n }\n}\n"],"mappings":"kMAkDA,IAAa,EAAY,cAGZ,EAAgB,IAEhB,EAAb,cAAsC,KAAM,CAC1C,aAAc,CACZ,MAAM,+CAA+C,EACrD,KAAK,KAAO,kBACd,CACF,EAOa,EAAb,cAA6C,KAAM,CACJ,QAA7C,YAAY,EAAiB,EAAwD,CACnF,MAAM,CAAO,EAD8B,KAAA,QAAA,EAE3C,KAAK,KAAO,yBACd,CACF,EAEA,SAAS,EAAS,EAAkD,CAClE,OAAyB,OAAO,GAAU,YAAnC,GAA+C,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAOA,SAAgB,EAAoB,EAA4C,CAC9E,GAAI,CAAC,EAAS,CAAG,EAAG,OAAO,KAC3B,GAAM,CAAE,OAAM,SAAQ,QAAO,WAAY,EAEzC,GADI,CAAC,EAAS,CAAI,GAAK,OAAO,EAAK,OAAa,WAC5C,CAAC,EAAS,CAAM,GAAK,CAAC,EAAS,EAAO,MAAS,GAAK,CAAC,EAAS,EAAO,SAAY,GAAK,CAAC,EAAS,EAAO,cAAiB,EAAG,OAAO,KACtI,IAAK,IAAM,IAAO,CAAC,kBAAmB,oBAAqB,wBAAyB,gBAAiB,mBAAoB,SAAS,EAChI,GAAI,OAAO,EAAO,IAAS,UAAY,CAAC,OAAO,SAAS,EAAO,EAAI,EAAG,OAAO,KAI/E,MAFI,CAAC,MAAM,QAAQ,CAAK,GAAK,CAAC,EAAM,MAAO,GAAM,EAAS,CAAC,GAAK,OAAO,EAAE,IAAU,UAAY,OAAO,EAAE,OAAa,QAAQ,GACzH,CAAC,EAAS,CAAO,GAAK,CAAC,MAAM,QAAQ,EAAQ,KAAQ,EAAU,KAC5D,CACT,CAQA,IAAa,EAAqB,2CAGlC,SAAS,EAAQ,EAAsB,CAMrC,OALI,aAAe,EACb,EAAI,SAAW,IAAY,EAC3B,EAAI,SAAW,IAAY,+CACxB,gCAAgC,EAAI,OAAO,GAE7C,sCACT,CAEA,IAAa,EAA4D,CACvE,IAAK,EACL,MAAO,KAAO,IAAW,CACvB,GAAI,CACF,IAAM,EAAQ,EAAoB,MAAM,EAAgB,EAAkB,CAAM,CAAC,EAKjF,OAJI,IAAU,KAEL,CAAE,MAAO,KAAM,UAAW,GAAM,OAAQ,uCAAwC,EAElF,CAAE,QAAO,UAAW,GAAM,OAAQ,IAAK,CAChD,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EACpE,MAAO,CAAE,MAAO,KAAM,UAAW,GAAO,OAAQ,EAAQ,CAAG,CAAE,CAC/D,CACF,CACF,EAEA,eAAe,EAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAEA,SAAS,GAAgB,CACvB,EAAW,CAAS,EACpB,EAAqB,CACvB,CASA,eAAsB,EAAgB,EAAgH,CACpJ,GAAI,CACF,IAAM,EAAW,MAAM,EAA0B,EAAyB,CAAO,EACjF,GAAI,CAAC,EAAS,CAAQ,GAAK,EAAS,KAAO,IAAQ,CAAC,EAAS,EAAS,IAAI,EAGxE,MAAM,IAAI,EAFI,EAAS,CAAQ,GAAK,OAAO,EAAS,OAAU,UAAY,EAAS,MAAQ,EAAS,MAAQ,oEAC5F,EAAS,CAAQ,GAAK,OAAO,EAAS,SAAY,SAAW,EAAS,QAAU,IAChD,EAElD,OAAO,CACT,QAAU,CACR,EAAQ,CACV,CACF,CAGA,eAAsB,EAAkB,EAA6C,CACnF,IAAM,EAAS,MAAM,EAAc,EAAyB,CAAM,EAElE,OADA,EAAW,CAAS,EACb,CACT,CAGA,eAAsB,EAAgB,EAA+B,CAAE,MAAO,CAAE,EAAkC,CAChH,GAAI,CACF,IAAM,EAAS,MAAM,EAAc,EAA0B,CAAO,EAGpE,MAAO,CAAE,SAFQ,EAAS,CAAM,GAAK,MAAM,QAAQ,EAAO,QAAW,EAAK,EAAO,SAAmD,CAAC,EAElH,QADH,EAAS,CAAM,GAAK,MAAM,QAAQ,EAAO,OAAU,EAAK,EAAO,QAAiD,CAAC,CACtG,CAC7B,QAAU,CACR,EAAQ,CACV,CACF,CAGA,eAAsB,GAAsC,CAC1D,GAAI,CACF,OAAO,MAAM,EAAc,EAA0B,CAAC,CAAC,CACzD,QAAU,CACR,EAAQ,CACV,CACF,CAOA,eAAsB,EAAiB,EAAkC,CACvE,GAAI,CAAC,EAAsB,KAAK,CAAM,EAAG,MAAU,MAAM,4DAA4D,EACrH,GAAI,CACF,OAAO,MAAM,EAAc,GAAG,EAAuB,GAAG,EAAO,UAAW,CAAC,CAAC,CAC9E,QAAU,CACR,EAAQ,CACV,CACF"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./rolldown-runtime-hePW80VL.js";import{At as t,Bt as n,Dt as r,Et as i,Ft as a,Gt as o,Ht as s,It as c,Kt as l,Lt as u,Mt as d,Nt as f,Ot as p,Pt as m,Rt as h,Ut as g,Vt as _,Wt as v,jt as y,kt as b,zt as x}from"./VerseConsoleApp-DO84Xscn.js";var S=e({AUTONOMY_SETUP_COMMAND:()=>k,COMMAND_KEYS:()=>i,DESKTOP_COMMANDS:()=>r,OPEN_PANE_COMMAND_RE:()=>p,OPEN_SESSION_COMMAND_RE:()=>b,OPEN_TERMINAL_COMMAND_RE:()=>t,PALETTE_GROUPS:()=>C,PALETTE_OPEN_BUDGET_MS:()=>50,PALETTE_PREFIXES:()=>w,PALETTE_RECENT_LIMIT:()=>5,SCOPE_LAYERS:()=>y,SHORTCUT_SECTIONS:()=>T,SYSTEM_RESERVED_CHORDS:()=>d,WORKBENCH_COMMANDS:()=>P,WORKBENCH_COMMAND_EVENT:()=>f,chordId:()=>m,chordMatches:()=>a,commandCatalogLoaded:()=>c,commandChord:()=>u,detectKeyPlatform:()=>h,eventKeyName:()=>x,findCommand:()=>I,formatChord:()=>n,keyBinding:()=>_,loadedCommand:()=>s,matchCommand:()=>z,matchKey:()=>g,paletteCommands:()=>L,parseChord:()=>v,parseDesktopCommand:()=>o,registerCommandCatalog:()=>l,shortcutSections:()=>R}),C=[{id:`needs-you`,label:`Needs you`},{id:`chats`,label:`Chats`},{id:`actions`,label:`Actions`},{id:`go-to`,label:`Go to`},{id:`seats-apps`,label:`Seats & Apps`},{id:`projects`,label:`Projects`}],w={">":`actions`,"#":`chats`},T=[`Surfaces`,`Navigation`,`Chat`,`Dock`,`Composer`,`Needs you`,`Charts`,`App`];function E(e){let t=i[e];return t.native?{id:e,scope:t.scope,keys:t.keys,native:t.native}:{id:e,scope:t.scope,keys:t.keys}}var D={confirm:{title:`Stop every running chat?`,body:`Each running turn is cancelled. Queued follow-ups are held, not sent.`,confirmLabel:`Stop chats`,destructive:!0},token:!0},O={confirm:{title:`Stop the fleet?`,body:`Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.`,confirmLabel:`Stop fleet`,destructive:!0},token:!0},k=`ashlr authority setup`,A=(e,t,n,r)=>({id:e,title:t,scope:`global`,keys:[],group:`actions`,section:`App`,keywords:n,...r?{surface:r}:{}}),j=(e,t,n)=>A(`autonomy.${e}`,`Autonomy: ${t}`,[`autonomy`,`switch`,...n],`command`),M=(e,t,n)=>A(`budget.${e}`,`Budget mode: ${t}`,[`budget`,`spend`,...n],`command`),N=(e,t)=>({...E(e),title:`Go to ${t}`,group:`go-to`,section:`Surfaces`,keywords:[t.toLowerCase()]}),P=[N(`surface.command`,`Command`),N(`surface.fleet`,`Fleet`),N(`surface.growth`,`Growth`),N(`surface.mind`,`Mind`),N(`surface.chat`,`Chat`),N(`surface.agents`,`Agents`),{...E(`section.settings`),title:`Open Settings`,group:`go-to`,section:`Surfaces`,keywords:[`preferences`,`appearance`]},{id:`section.apps`,title:`Open Apps & Accounts`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`mcp`,`accounts`,`seats`,`integrations`,`ollama`]},{id:`section.usage`,title:`Open Usage`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`capacity`,`spend`,`limits`]},{id:`section.wiki`,title:`Open Repo wiki`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`wiki`,`docs`,`architecture`,`deepwiki`,`knowledge`]},{id:`section.playbooks`,title:`Open Playbooks`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`playbook`,`playbooks`,`template`,`macro`,`procedure`,`recipe`]},{id:`section.automations`,title:`Open Automations`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`automations`,`triggers`,`schedule`,`cron`,`webhook`,`issues`,`label`,`red main`,`ci`]},{...E(`palette.open`),title:`Command palette`,group:null,section:`Navigation`},{...E(`needs-you.open`),title:`Open Needs you`,group:`actions`,section:`Navigation`,keywords:[`approvals`,`inbox`,`triage`]},{...E(`shortcuts.open`),title:`Keyboard shortcuts`,group:`actions`,section:`Navigation`,keywords:[`keys`,`help`]},{...E(`resources.toggle`),title:`Open Resources`,group:`actions`,section:`Navigation`,note:`stops the running turn instead while one runs`,keywords:[`show resources`,`accounts`,`seats`,`capacity`,`credits`,`cloud`,`local models`]},{id:`resources.bar.toggle`,title:`Show or hide the resource bar`,scope:`global`,keys:[],group:`actions`,section:`Navigation`,keywords:[`battery`,`usage bars`,`accounts`,`capacity`,`rail`,`resources`]},{...E(`history.back`),title:`Back`,group:null,section:`Navigation`,note:`through surfaces and chats`},{...E(`history.forward`),title:`Forward`,group:null,section:`Navigation`,note:`through surfaces and chats`},{...E(`chat.recent-next`),title:`Next recent chat`,group:null,section:`Navigation`},{...E(`chat.recent-prev`),title:`Previous recent chat`,group:null,section:`Navigation`},{...E(`rail.toggle-labels`),title:`Show or hide rail labels`,group:`actions`,section:`Navigation`},{...E(`chat.new`),title:`New chat`,group:`actions`,section:`Chat`},{id:`chat.new-on`,title:`New chat on…`,scope:`global`,keys:[],group:`actions`,section:`Chat`,argument:{kind:`seat`,prompt:`Seat`},keywords:[`seat`,`account`,`engine`]},{id:`agents.new`,title:`New agent in its own workspace…`,scope:`global`,keys:[],group:`actions`,section:`Chat`,note:`⌘N on the Agents board`,keywords:[`agent`,`worktree`,`workspace`,`branch`,`parallel`,`background`,`conductor`]},{...E(`agents.new-multi`),title:`Same task on several seats…`,group:`actions`,section:`Chat`,keywords:[`agents`,`best of n`,`fan out`,`parallel`,`worktrees`,`compare`,`race`]},{...E(`chat.sidebar`),title:`Show or hide the chat list`,group:`actions`,section:`Chat`},{...E(`chat.find`),title:`Find in chat`,group:`actions`,section:`Chat`,keywords:[`search`]},{...E(`chat.turn-prev`),title:`Previous turn`,group:null,section:`Chat`},{...E(`chat.turn-next`),title:`Next turn`,group:null,section:`Chat`},{id:`chats.stop-all`,title:`Stop running chats…`,scope:`global`,keys:[],group:`actions`,section:`Chat`,guard:D,keywords:[`cancel`,`halt`]},{id:`composer.cloud`,title:`Run in cloud…`,scope:`chat`,keys:[],group:`actions`,section:`Composer`,keywords:[`cloud`,`remote`,`launch`,`draft pr`]},{id:`composer.devin`,title:`Run in Devin…`,scope:`chat`,keys:[],group:`actions`,section:`Composer`,keywords:[`devin`,`cognition`,`remote`,`launch`,`pr`,`acu`]},{id:`git.create-pr`,title:`Create pull request…`,scope:`chat`,keys:[],group:`actions`,section:`Chat`,keywords:[`pr`,`github`,`git`,`open pull request`]},{id:`git.merge-pr`,title:`Merge pull request…`,scope:`chat`,keys:[],group:`actions`,section:`Chat`,keywords:[`pr`,`github`,`git`,`land`,`ship`]},{...E(`chat.focus-mode`),title:`Focus mode`,group:`actions`,section:`Chat`,keywords:[`zen`,`distraction free`,`hide panels`]},{...E(`dock.toggle`),title:`Show or hide the panel`,group:`actions`,section:`Dock`,keywords:[`dock`]},{id:`dock.placement`,title:`Move the panel (beside or below the chat)`,scope:`chat`,keys:[],group:`actions`,section:`Dock`,keywords:[`bottom`,`right`,`layout`,`dock position`]},{...E(`dock.terminal`),title:`Terminal`,group:`actions`,section:`Dock`,keywords:[`shell`,`console`]},{...E(`dock.terminal-new`),title:`New terminal tab`,group:`actions`,section:`Dock`},{id:`terminal.generate`,title:`Generate command…`,scope:`chat`,keys:[],group:`actions`,section:`Dock`,keywords:[`terminal`,`shell`,`command`,`plain english`,`natural language`,`ai`,`bash`,`how do i`]},{id:`terminal.history`,title:`Search terminal history…`,scope:`chat`,keys:[],group:`actions`,section:`Dock`,keywords:[`terminal`,`shell`,`history`,`ctrl r`,`reverse search`,`previous command`]},{...E(`dock.preview`),title:`Browser`,group:`actions`,section:`Dock`,keywords:[`preview`,`dev server`,`localhost`,`web`]},{...E(`dock.diff`),title:`Changes`,group:`actions`,section:`Dock`,keywords:[`diff`,`git`,`review`]},{...E(`dock.files`),title:`Files`,group:`actions`,section:`Dock`,keywords:[`explorer`,`tree`,`touched`]},{...E(`dock.sources`),title:`Sources`,group:`actions`,section:`Dock`,keywords:[`citations`,`references`,`read`,`fetched`]},{...E(`dock.reasoning`),title:`Reasoning`,group:`actions`,section:`Dock`,keywords:[`thinking`,`why`,`chain of thought`]},{...E(`composer.permission`),title:`Permission mode…`,group:`actions`,section:`Composer`,keywords:[`plan`,`bypass`,`auto`]},{...E(`composer.model`),title:`Model…`,group:`actions`,section:`Composer`},{...E(`composer.effort`),title:`Effort…`,group:`actions`,section:`Composer`,keywords:[`reasoning`,`thinking`]},{...E(`composer.attach`),title:`Attach files…`,group:`actions`,section:`Composer`,keywords:[`upload`,`image`]},{...E(`composer.send`),title:`Send`,group:null,section:`Composer`,note:`queues while a turn runs (up to 3)`},{...E(`composer.stop-and-send`),title:`Stop and send`,group:null,section:`Composer`},{...E(`composer.stop`),title:`Stop the running turn`,group:null,section:`Composer`,note:`only from an empty composer with no overlay open`},{...E(`drawer.next`),title:`Next item`,group:null,section:`Needs you`},{...E(`drawer.prev`),title:`Previous item`,group:null,section:`Needs you`},{...E(`drawer.open`),title:`Open item`,group:null,section:`Needs you`},{...E(`drawer.approve`),title:`Approve`,group:null,section:`Needs you`,note:`confirms, then asks for the token`},{...E(`drawer.reject`),title:`Reject`,group:null,section:`Needs you`,note:`confirms, then asks for the token`},{...E(`drawer.veto`),title:`Veto`,group:null,section:`Needs you`,note:`confirms, then asks for the token`},{...E(`drawer.done`),title:`Mark done`,group:null,section:`Needs you`},{...E(`drawer.select`),title:`Select item`,group:null,section:`Needs you`,note:`A / R / E then act on every selected item`},{...E(`drawer.split-prev`),title:`Previous split`,group:null,section:`Needs you`},{...E(`drawer.split-next`),title:`Next split`,group:null,section:`Needs you`},{...E(`chart.table`),title:`Show as a table`,group:null,section:`Charts`,note:`when a chart card has focus`},{...E(`appearance.toggle-theme`),title:`Toggle light / dark`,group:`actions`,section:`App`,keywords:[`theme`,`dark mode`]},{...E(`app.summon`),title:`Show Verse and focus the composer`,group:null,section:`App`,note:`system-wide; turn on in Settings ▸ Desktop`},{id:`fleet.stop`,title:`Stop the fleet…`,scope:`global`,keys:[],group:`actions`,section:`App`,guard:O,keywords:[`kill`,`halt`,`autonomy`]},{...E(`fleet.start`),title:`Start the fleet…`,group:`actions`,section:`App`,surface:`fleet`,keywords:[`run`,`go`,`turn on`,`autonomy`,`daemon`]},{...E(`fleet.pause`),title:`Pause the fleet`,group:`actions`,section:`App`,surface:`fleet`,keywords:[`hold`,`finish in-flight`,`dispatch`,`autonomy`],note:`runs in flight finish; nothing new starts`},{...E(`fleet.resume`),title:`Resume the fleet`,group:`actions`,section:`App`,surface:`fleet`,keywords:[`continue`,`unpause`,`dispatch`,`autonomy`]},{...E(`fleet.halt`),title:`Stop the fleet (asks first)`,group:null,section:`App`,surface:`fleet`},A(`fleet.restart-daemon`,`Restart the fleet daemon…`,[`resident`,`launchd`,`service`,`reload`,`new release`,`daemon`],`fleet`),A(`fleet.edit-grant`,`Edit the grant scope…`,[`grant scope`,`repos`,`engines`,`leader classes`,`caps`,`narrow`,`widen`],`fleet`),A(`fleet.install-custody`,`Install the custody helper…`,[`custody`,`sudo`,`admin`,`secure enclave`,`upgrade`,`helper`],`fleet`),j(`off`,`Off`,[`disable`,`lower`]),j(`propose`,`Propose`,[`proposals`,`review`]),j(`autonomous`,`Autonomous`,[`auto`,`turn on`,`enable`]),A(`autonomy.grant`,`Approve grant…`,[`touch id`,`re-approve`,`renew`,`authority`,`autonomy`],`command`),A(`autonomy.reapprove`,`Re-approve grant…`,[`renew`,`extend`,`touch id`,`expiry`,`authority`,`autonomy`],`command`),A(`autonomy.status`,`Autonomy status`,[`ladder`,`rollout`,`stage`,`shadow`,`progress`,`would merge`,`autonomy`]),M(`all-in`,`All-in`,[`all in`,`max`]),M(`balanced`,`Balanced`,[`default`]),M(`reserve`,`Reserve`,[`save`,`conserve`]),{id:`leader.message`,title:`Message the Leader…`,scope:`global`,keys:[],group:`actions`,section:`App`,surface:`mind`,keywords:[`leader`,`ask`,`chat`,`strategy`,`memo`,`talk`,`telegram`]},{id:`leader.directive`,title:`Add Leader directive…`,scope:`global`,keys:[],group:`actions`,section:`App`,surface:`mind`,keywords:[`leader`,`directive`,`instruction`,`rule`,`standing order`]},{id:`wiki.open`,title:`Open repo wiki…`,scope:`global`,keys:[],group:`actions`,section:`App`,argument:{kind:`project`,prompt:`Repo`},keywords:[`wiki`,`docs`,`architecture`,`deepwiki`,`modules`,`overview`]},{id:`playbook.run`,title:`Run playbook…`,scope:`global`,keys:[],group:`actions`,section:`App`,keywords:[`playbook`,`macro`,`template`,`run`,`fix bug`,`bump deps`,`add tests`,`docs sync`,`security fix`]},{id:`terminal.workflows`,title:`Run command workflow…`,scope:`global`,keys:[],group:`actions`,section:`Dock`,keywords:[`command workflow`,`workflow`,`terminal`,`shell`,`command`,`snippet`,`template`,`paste`,`params`,`playbook`]},{id:`terminal.launch`,title:`Launch terminal configuration…`,scope:`global`,keys:[],group:`actions`,section:`Dock`,keywords:[`launch`,`launch.json`,`layout`,`terminal`,`dev server`,`test watcher`,`tabs`,`splits`,`claude code`]},{id:`automations.new`,title:`New automation…`,scope:`global`,keys:[],group:`actions`,section:`App`,keywords:[`automation`,`trigger`,`schedule`,`nightly`,`weekly`,`webhook`,`issues labeled`,`fix red main`,`rrule`]},{id:`wiki.ask`,title:`Ask the codebase…`,scope:`global`,keys:[],group:`actions`,section:`App`,keywords:[`ask`,`question`,`codebase`,`where`,`how`,`explain`,`wiki`,`search code`]},A(`autonomy.copy-setup`,`Copy autonomy setup command`,[k,`autonomy`,`turn on`,`clipboard`])],F=new Map(P.map(e=>[e.id,e]));function I(e){return F.get(e)??null}l(I);function L(e){return P.filter(t=>t.group===e)}function R(){let e=P.filter(e=>e.keys.length>0);return T.map(t=>({section:t,commands:e.filter(e=>e.section===t)})).filter(e=>e.commands.length>0)}function z(e,t,n=h()){let r=g(e,t,n);return r?I(r.id):null}export{I as a,R as c,S as i,C as n,z as o,w as r,L as s,k as t};
2
+ //# sourceMappingURL=command-catalog-COH2G2xv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-catalog-COH2G2xv.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/command-catalog.ts"],"sourcesContent":["/**\n * routes/verse/shell/command-catalog.ts — every workbench command, in ONE\n * table (unit C0; SPEC-310C §1).\n *\n * The ⌘K palette (C1), the shortcuts overlay (⌘/), the drawer and every\n * surface's buttons read this table; the key test reads it too, which is how\n * \"no two commands share a key\" and \"no key the native menu already owns\"\n * stay true as units add commands.\n *\n * KEYS are written in ./command-keys.ts, the half of the catalog the chat\n * first paint needs (a key press, a shortcut hint, the desktop menu bridge);\n * a row with keys takes them from there with `bind(id)`, so each key is\n * still written once. This module — titles, palette groups, keywords,\n * guards, the keyless palette actions — loads with the palette's chunk, not\n * with first paint, and re-exports ./command-keys.ts so its importers keep\n * one import site.\n *\n * Pure data plus pure helpers — no React, no DOM — so the palette can import\n * it without pulling a surface into its chunk.\n *\n * Adding a command: one entry below (a change request to C0 when another\n * unit needs it), plus its keys in command-keys.ts if it has any. The\n * handler lives with the unit that owns the behaviour and dispatches on the\n * command `id`.\n */\nimport {\n COMMAND_KEYS,\n matchKey,\n detectKeyPlatform,\n registerCommandCatalog,\n type CommandScope,\n type KeyChord,\n type KeyedCommandId,\n type KeyEventLike,\n type KeyPlatform,\n type NativeBinding,\n} from './command-keys.js';\n\nexport * from './command-keys.js';\n\n// ===========================================================================\n// The palette\n// ===========================================================================\n\n/** Result groups, in the order the palette shows them (SPEC-310C §1). */\nexport const PALETTE_GROUPS = [\n { id: 'needs-you', label: 'Needs you' },\n { id: 'chats', label: 'Chats' },\n { id: 'actions', label: 'Actions' },\n { id: 'go-to', label: 'Go to' },\n { id: 'seats-apps', label: 'Seats & Apps' },\n { id: 'projects', label: 'Projects' },\n] as const;\nexport type PaletteGroupId = (typeof PALETTE_GROUPS)[number]['id'];\n\n/** A leading `>` limits results to actions; `#` to chats. */\nexport const PALETTE_PREFIXES: Readonly<Record<'>' | '#', PaletteGroupId>> = { '>': 'actions', '#': 'chats' };\n\n/** An empty query shows the last this-many actions run. */\nexport const PALETTE_RECENT_LIMIT = 5;\n\n/** The palette opens in under this (it lives in the shell chunk). */\nexport const PALETTE_OPEN_BUDGET_MS = 50;\n\n// ===========================================================================\n// Commands\n// ===========================================================================\n\nexport type CommandArgumentKind = 'seat' | 'project' | 'section' | 'session';\n\n/**\n * A guarded command asks for confirmation FIRST, then the mutation token\n * (the palette must never be a shortcut around the confirm step its regular\n * UI requires).\n */\nexport interface CommandGuard {\n confirm: { title: string; body: string; confirmLabel: string; destructive: boolean };\n token: boolean;\n}\n\n/** Sections of the shortcuts overlay (⌘/), in display order. */\nexport const SHORTCUT_SECTIONS = ['Surfaces', 'Navigation', 'Chat', 'Dock', 'Composer', 'Needs you', 'Charts', 'App'] as const;\nexport type ShortcutSection = (typeof SHORTCUT_SECTIONS)[number];\n\nexport interface WorkbenchCommand {\n id: string;\n /** Palette / overlay text: a verb phrase, operator language. */\n title: string;\n scope: CommandScope;\n /** Empty = reachable from the palette (or a button) only. */\n keys: readonly KeyChord[];\n /** Where the palette lists it; null = not a palette entry (drawer and chart keys). */\n group: 'actions' | 'go-to' | null;\n section: ShortcutSection;\n keywords?: readonly string[];\n /** Tab fills this argument (\"New chat on…\" → a seat). */\n argument?: { kind: CommandArgumentKind; prompt: string };\n guard?: CommandGuard;\n native?: NativeBinding;\n /** A qualifier the overlay prints under the title. */\n note?: string;\n /**\n * The surface that serves it. The command's behaviour — and the dialogs it\n * may open (the Touch ID sheet, the token prompt) — live on that surface,\n * so the shell brings it forward and parks the command until the surface\n * registers its handler (run-command.ts). The palette says where it runs.\n */\n surface?: 'command' | 'mind' | 'fleet';\n}\n\n/** A keyed row's id, scope, keys and native binding — from command-keys.ts, never re-declared here. */\nfunction bind<I extends KeyedCommandId>(id: I): { id: I; scope: CommandScope; keys: readonly KeyChord[]; native?: NativeBinding } {\n const spec: { scope: CommandScope; keys: readonly KeyChord[]; native?: NativeBinding } = COMMAND_KEYS[id];\n return spec.native ? { id, scope: spec.scope, keys: spec.keys, native: spec.native } : { id, scope: spec.scope, keys: spec.keys };\n}\n\nconst STOP_CHATS_GUARD: CommandGuard = {\n confirm: {\n title: 'Stop every running chat?',\n body: 'Each running turn is cancelled. Queued follow-ups are held, not sent.',\n confirmLabel: 'Stop chats',\n destructive: true,\n },\n token: true,\n};\n\nconst STOP_FLEET_GUARD: CommandGuard = {\n confirm: {\n title: 'Stop the fleet?',\n body: 'Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.',\n confirmLabel: 'Stop fleet',\n destructive: true,\n },\n token: true,\n};\n\n/** Where the copy-setup command points: the one CLI step that turns autonomy on. */\nexport const AUTONOMY_SETUP_COMMAND = 'ashlr authority setup';\n\n/**\n * A palette-only App action (no key) — shared shape of the autonomy, grant,\n * budget and setup entries below.\n */\nconst appAction = (id: string, title: string, keywords: readonly string[], surface?: 'command' | 'fleet'): WorkbenchCommand => ({\n id,\n title,\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'App',\n keywords,\n ...(surface ? { surface } : {}),\n});\n\n/**\n * The Command surface's autonomy switch, one palette entry per position.\n * Served by AutonomyBar with the switch's own rules: lowering is instant,\n * raising past the installed grant opens the Touch ID sheet instead.\n */\nconst autonomySwitch = (to: 'off' | 'propose' | 'autonomous', label: string, keywords: readonly string[]) =>\n appAction(`autonomy.${to}`, `Autonomy: ${label}`, ['autonomy', 'switch', ...keywords], 'command');\n\n/** A9's budget mode, set from the palette — clamped to the grant's ceiling like the Budget pill. */\nconst budgetMode = (mode: 'all-in' | 'balanced' | 'reserve', label: string, keywords: readonly string[]) =>\n appAction(`budget.${mode}`, `Budget mode: ${label}`, ['budget', 'spend', ...keywords], 'command');\n\nconst surface = <I extends KeyedCommandId>(id: I, name: string) => ({\n ...bind(id),\n title: `Go to ${name}`,\n group: 'go-to',\n section: 'Surfaces',\n keywords: [name.toLowerCase()],\n} as const);\n\nexport const WORKBENCH_COMMANDS = [\n // ── Surfaces (⌘1 Command … ⌘5 Chat) and the gear tray ────────────────────\n surface('surface.command', 'Command'),\n surface('surface.fleet', 'Fleet'),\n surface('surface.growth', 'Growth'),\n surface('surface.mind', 'Mind'),\n surface('surface.chat', 'Chat'),\n surface('surface.agents', 'Agents'),\n { ...bind('section.settings'), title: 'Open Settings', group: 'go-to', section: 'Surfaces', keywords: ['preferences', 'appearance'] },\n { id: 'section.apps', title: 'Open Apps & Accounts', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['mcp', 'accounts', 'seats', 'integrations', 'ollama'] },\n { id: 'section.usage', title: 'Open Usage', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['capacity', 'spend', 'limits'] },\n { id: 'section.wiki', title: 'Open Repo wiki', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['wiki', 'docs', 'architecture', 'deepwiki', 'knowledge'] },\n { id: 'section.playbooks', title: 'Open Playbooks', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['playbook', 'playbooks', 'template', 'macro', 'procedure', 'recipe'] },\n { id: 'section.automations', title: 'Open Automations', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['automations', 'triggers', 'schedule', 'cron', 'webhook', 'issues', 'label', 'red main', 'ci'] },\n\n // ── Navigation ───────────────────────────────────────────────────────────\n { ...bind('palette.open'), title: 'Command palette', group: null, section: 'Navigation' },\n { ...bind('needs-you.open'), title: 'Open Needs you', group: 'actions', section: 'Navigation', keywords: ['approvals', 'inbox', 'triage'] },\n { ...bind('shortcuts.open'), title: 'Keyboard shortcuts', group: 'actions', section: 'Navigation', keywords: ['keys', 'help'] },\n // The Resources drawer (3.11 C6): the key toggles it, the palette opens it.\n {\n ...bind('resources.toggle'),\n title: 'Open Resources',\n group: 'actions',\n section: 'Navigation',\n // The composer claims ⌘. to stop a running turn (Composer.tsx) — say so\n // where the key is listed, so the same chord is never a surprise.\n note: 'stops the running turn instead while one runs',\n keywords: ['show resources', 'accounts', 'seats', 'capacity', 'credits', 'cloud', 'local models'],\n },\n {\n id: 'resources.bar.toggle',\n title: 'Show or hide the resource bar',\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'Navigation',\n keywords: ['battery', 'usage bars', 'accounts', 'capacity', 'rail', 'resources'],\n },\n { ...bind('history.back'), title: 'Back', group: null, section: 'Navigation', note: 'through surfaces and chats' },\n { ...bind('history.forward'), title: 'Forward', group: null, section: 'Navigation', note: 'through surfaces and chats' },\n { ...bind('chat.recent-next'), title: 'Next recent chat', group: null, section: 'Navigation' },\n { ...bind('chat.recent-prev'), title: 'Previous recent chat', group: null, section: 'Navigation' },\n { ...bind('rail.toggle-labels'), title: 'Show or hide rail labels', group: 'actions', section: 'Navigation' },\n\n // ── Chats ────────────────────────────────────────────────────────────────\n { ...bind('chat.new'), title: 'New chat', group: 'actions', section: 'Chat' },\n {\n id: 'chat.new-on',\n title: 'New chat on…',\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'Chat',\n argument: { kind: 'seat', prompt: 'Seat' },\n keywords: ['seat', 'account', 'engine'],\n },\n // ── Agents (3.16): the board serves these; ⌘N on the board is \"New agent\" ──\n {\n id: 'agents.new',\n title: 'New agent in its own workspace…',\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'Chat',\n note: '⌘N on the Agents board',\n keywords: ['agent', 'worktree', 'workspace', 'branch', 'parallel', 'background', 'conductor'],\n },\n {\n ...bind('agents.new-multi'),\n title: 'Same task on several seats…',\n group: 'actions',\n section: 'Chat',\n keywords: ['agents', 'best of n', 'fan out', 'parallel', 'worktrees', 'compare', 'race'],\n },\n { ...bind('chat.sidebar'), title: 'Show or hide the chat list', group: 'actions', section: 'Chat' },\n { ...bind('chat.find'), title: 'Find in chat', group: 'actions', section: 'Chat', keywords: ['search'] },\n { ...bind('chat.turn-prev'), title: 'Previous turn', group: null, section: 'Chat' },\n { ...bind('chat.turn-next'), title: 'Next turn', group: null, section: 'Chat' },\n { id: 'chats.stop-all', title: 'Stop running chats…', scope: 'global', keys: [], group: 'actions', section: 'Chat', guard: STOP_CHATS_GUARD, keywords: ['cancel', 'halt'] },\n // ── Git (C5's BranchBar serves these) ─────────────────────────────────────\n // Palette-only and unguarded ON PURPOSE: each OPENS BranchBar's own dialog\n // (CreatePrDialog / MergeDialog), which carries the before-click disclosure,\n // and every write inside it still goes through the mutation-token gate —\n // so the palette is never a shortcut around a confirm step. No key: a\n // merge is never one keystroke away. Chat-scoped because the bar lives\n // above the composer; from another surface the shell switches to Chat and\n // parks the command until BranchBar registers (command-bus).\n // ── Cloud (3.11 C3) ──────────────────────────────────────────────────────\n // Opens the composer's Chat settings sheet, where \"Run in cloud\" lives with\n // its own disabled reasons (no GitHub origin, seat not ready, budget gate,\n // empty box) and the token gate — the palette never launches by itself.\n { id: 'composer.cloud', title: 'Run in cloud…', scope: 'chat', keys: [], group: 'actions', section: 'Composer', keywords: ['cloud', 'remote', 'launch', 'draft pr'] },\n // 3.15: the same sheet holds \"Run in Devin\" (its own disabled reasons and token gate).\n { id: 'composer.devin', title: 'Run in Devin…', scope: 'chat', keys: [], group: 'actions', section: 'Composer', keywords: ['devin', 'cognition', 'remote', 'launch', 'pr', 'acu'] },\n { id: 'git.create-pr', title: 'Create pull request…', scope: 'chat', keys: [], group: 'actions', section: 'Chat', keywords: ['pr', 'github', 'git', 'open pull request'] },\n { id: 'git.merge-pr', title: 'Merge pull request…', scope: 'chat', keys: [], group: 'actions', section: 'Chat', keywords: ['pr', 'github', 'git', 'land', 'ship'] },\n\n // ── Dock (the panel area; panes from panes/pane-registry.ts) ─────────────\n { ...bind('chat.focus-mode'), title: 'Focus mode', group: 'actions', section: 'Chat', keywords: ['zen', 'distraction free', 'hide panels'] },\n { ...bind('dock.toggle'), title: 'Show or hide the panel', group: 'actions', section: 'Dock', keywords: ['dock'] },\n { id: 'dock.placement', title: 'Move the panel (beside or below the chat)', scope: 'chat', keys: [], group: 'actions', section: 'Dock', keywords: ['bottom', 'right', 'layout', 'dock position'] },\n { ...bind('dock.terminal'), title: 'Terminal', group: 'actions', section: 'Dock', keywords: ['shell', 'console'] },\n { ...bind('dock.terminal-new'), title: 'New terminal tab', group: 'actions', section: 'Dock' },\n // 3.15: the terminal's input editor. Plain words → a command the operator reviews (never run on its own).\n { id: 'terminal.generate', title: 'Generate command…', scope: 'chat', keys: [], group: 'actions', section: 'Dock', keywords: ['terminal', 'shell', 'command', 'plain english', 'natural language', 'ai', 'bash', 'how do i'] },\n { id: 'terminal.history', title: 'Search terminal history…', scope: 'chat', keys: [], group: 'actions', section: 'Dock', keywords: ['terminal', 'shell', 'history', 'ctrl r', 'reverse search', 'previous command'] },\n { ...bind('dock.preview'), title: 'Browser', group: 'actions', section: 'Dock', keywords: ['preview', 'dev server', 'localhost', 'web'] },\n { ...bind('dock.diff'), title: 'Changes', group: 'actions', section: 'Dock', keywords: ['diff', 'git', 'review'] },\n { ...bind('dock.files'), title: 'Files', group: 'actions', section: 'Dock', keywords: ['explorer', 'tree', 'touched'] },\n { ...bind('dock.sources'), title: 'Sources', group: 'actions', section: 'Dock', keywords: ['citations', 'references', 'read', 'fetched'] },\n { ...bind('dock.reasoning'), title: 'Reasoning', group: 'actions', section: 'Dock', keywords: ['thinking', 'why', 'chain of thought'] },\n\n // ── Composer ─────────────────────────────────────────────────────────────\n { ...bind('composer.permission'), title: 'Permission mode…', group: 'actions', section: 'Composer', keywords: ['plan', 'bypass', 'auto'] },\n { ...bind('composer.model'), title: 'Model…', group: 'actions', section: 'Composer' },\n { ...bind('composer.effort'), title: 'Effort…', group: 'actions', section: 'Composer', keywords: ['reasoning', 'thinking'] },\n { ...bind('composer.attach'), title: 'Attach files…', group: 'actions', section: 'Composer', keywords: ['upload', 'image'] },\n { ...bind('composer.send'), title: 'Send', group: null, section: 'Composer', note: 'queues while a turn runs (up to 3)' },\n { ...bind('composer.stop-and-send'), title: 'Stop and send', group: null, section: 'Composer' },\n { ...bind('composer.stop'), title: 'Stop the running turn', group: null, section: 'Composer', note: 'only from an empty composer with no overlay open' },\n\n // ── Needs-you drawer ─────────────────────────────────────────────────────\n { ...bind('drawer.next'), title: 'Next item', group: null, section: 'Needs you' },\n { ...bind('drawer.prev'), title: 'Previous item', group: null, section: 'Needs you' },\n { ...bind('drawer.open'), title: 'Open item', group: null, section: 'Needs you' },\n { ...bind('drawer.approve'), title: 'Approve', group: null, section: 'Needs you', note: 'confirms, then asks for the token' },\n { ...bind('drawer.reject'), title: 'Reject', group: null, section: 'Needs you', note: 'confirms, then asks for the token' },\n { ...bind('drawer.veto'), title: 'Veto', group: null, section: 'Needs you', note: 'confirms, then asks for the token' },\n { ...bind('drawer.done'), title: 'Mark done', group: null, section: 'Needs you' },\n { ...bind('drawer.select'), title: 'Select item', group: null, section: 'Needs you', note: 'A / R / E then act on every selected item' },\n { ...bind('drawer.split-prev'), title: 'Previous split', group: null, section: 'Needs you' },\n { ...bind('drawer.split-next'), title: 'Next split', group: null, section: 'Needs you' },\n\n // ── Charts ───────────────────────────────────────────────────────────────\n { ...bind('chart.table'), title: 'Show as a table', group: null, section: 'Charts', note: 'when a chart card has focus' },\n\n // ── App ──────────────────────────────────────────────────────────────────\n { ...bind('appearance.toggle-theme'), title: 'Toggle light / dark', group: 'actions', section: 'App', keywords: ['theme', 'dark mode'] },\n { ...bind('app.summon'), title: 'Show Verse and focus the composer', group: null, section: 'App', note: 'system-wide; turn on in Settings ▸ Desktop' },\n { id: 'fleet.stop', title: 'Stop the fleet…', scope: 'global', keys: [], group: 'actions', section: 'App', guard: STOP_FLEET_GUARD, keywords: ['kill', 'halt', 'autonomy'] },\n // ── The fleet's control surface (3.15; the Fleet tab serves these) ──────\n // Start confirms on the Fleet tab (it clears Stop, resumes and raises the\n // switch within the grant); the resident daemon and the custody helper\n // run through the desktop app's native confirm dialog.\n { ...bind('fleet.start'), title: 'Start the fleet…', group: 'actions', section: 'App', surface: 'fleet', keywords: ['run', 'go', 'turn on', 'autonomy', 'daemon'] },\n { ...bind('fleet.pause'), title: 'Pause the fleet', group: 'actions', section: 'App', surface: 'fleet', keywords: ['hold', 'finish in-flight', 'dispatch', 'autonomy'], note: 'runs in flight finish; nothing new starts' },\n { ...bind('fleet.resume'), title: 'Resume the fleet', group: 'actions', section: 'App', surface: 'fleet', keywords: ['continue', 'unpause', 'dispatch', 'autonomy'] },\n // The key for Stop: the Fleet tab's own confirmation (same words as the\n // guarded palette row above), so it is never one keystroke either.\n { ...bind('fleet.halt'), title: 'Stop the fleet (asks first)', group: null, section: 'App', surface: 'fleet' },\n appAction('fleet.restart-daemon', 'Restart the fleet daemon…', ['resident', 'launchd', 'service', 'reload', 'new release', 'daemon'], 'fleet'),\n appAction('fleet.edit-grant', 'Edit the grant scope…', ['grant scope', 'repos', 'engines', 'leader classes', 'caps', 'narrow', 'widen'], 'fleet'),\n appAction('fleet.install-custody', 'Install the custody helper…', ['custody', 'sudo', 'admin', 'secure enclave', 'upgrade', 'helper'], 'fleet'),\n\n // ── Autonomy (Command's AutonomyBar serves these) ────────────────────────\n // No keys on purpose: raising authority is never one keystroke away, and\n // each entry runs the bar's own path (Touch ID sheet, token, read-only).\n autonomySwitch('off', 'Off', ['disable', 'lower']),\n autonomySwitch('propose', 'Propose', ['proposals', 'review']),\n autonomySwitch('autonomous', 'Autonomous', ['auto', 'turn on', 'enable']),\n appAction('autonomy.grant', 'Approve grant…', ['touch id', 're-approve', 'renew', 'authority', 'autonomy'], 'command'),\n // 3.14: renew the ACTIVE grant before it lapses (the bar's sheet, re-approve\n // intent — continues the ladder from the current stage), and jump to the\n // ladder itself. The status entry is the shell's (run-command.ts).\n appAction('autonomy.reapprove', 'Re-approve grant…', ['renew', 'extend', 'touch id', 'expiry', 'authority', 'autonomy'], 'command'),\n appAction('autonomy.status', 'Autonomy status', ['ladder', 'rollout', 'stage', 'shadow', 'progress', 'would merge', 'autonomy']),\n budgetMode('all-in', 'All-in', ['all in', 'max']),\n budgetMode('balanced', 'Balanced', ['default']),\n budgetMode('reserve', 'Reserve', ['save', 'conserve']),\n // ── The Leader (Mind's conversation) ────────────────────────────────────\n // Served by the shell (run-command.ts → leader/leader-focus.ts): it goes to\n // Mind and the conversation panel takes the ask once its chunk mounts.\n { id: 'leader.message', title: 'Message the Leader…', scope: 'global', keys: [], group: 'actions', section: 'App', surface: 'mind', keywords: ['leader', 'ask', 'chat', 'strategy', 'memo', 'talk', 'telegram'] },\n { id: 'leader.directive', title: 'Add Leader directive…', scope: 'global', keys: [], group: 'actions', section: 'App', surface: 'mind', keywords: ['leader', 'directive', 'instruction', 'rule', 'standing order'] },\n // ── The repo wiki (3.15) ────────────────────────────────────────────────\n // Served by the shell (run-command.ts → wiki/wiki-focus.ts): it opens the\n // Wiki section, which takes the request once its chunk mounts. Tab picks a repo.\n { id: 'wiki.open', title: 'Open repo wiki…', scope: 'global', keys: [], group: 'actions', section: 'App', argument: { kind: 'project', prompt: 'Repo' }, keywords: ['wiki', 'docs', 'architecture', 'deepwiki', 'modules', 'overview'] },\n // ── Playbooks (3.15) ──────────────────────────────────────────────────\n // Served by the shell (run-command.ts → playbooks/playbook-focus.ts): opens\n // Playbooks in \"pick one to run\" mode; Run… writes its !macro into the chat.\n { id: 'playbook.run', title: 'Run playbook…', scope: 'global', keys: [], group: 'actions', section: 'App', keywords: ['playbook', 'macro', 'template', 'run', 'fix bug', 'bump deps', 'add tests', 'docs sync', 'security fix'] },\n // Command workflows (kind: command playbooks): fill a command's {{params}}\n // and PASTE it at a terminal prompt — never run. The terminal panel serves\n // it with its picker (CommandWorkflowPicker) when it is mounted; otherwise\n // the shell's fallback (run-command.ts) opens Playbooks narrowed to them.\n { id: 'terminal.workflows', title: 'Run command workflow…', scope: 'global', keys: [], group: 'actions', section: 'Dock', keywords: ['command workflow', 'workflow', 'terminal', 'shell', 'command', 'snippet', 'template', 'paste', 'params', 'playbook'] },\n // Launch configurations (.ashlr/verse/launch.json): named terminal layouts —\n // tabs, splits, cwd, commands. The terminal panel serves it (its dialog);\n // the shell's fallback opens the Terminal pane with the dialog requested.\n // The dialog shows every command; nothing is typed until one is launched.\n { id: 'terminal.launch', title: 'Launch terminal configuration…', scope: 'global', keys: [], group: 'actions', section: 'Dock', keywords: ['launch', 'launch.json', 'layout', 'terminal', 'dev server', 'test watcher', 'tabs', 'splits', 'claude code'] },\n // ── Automations (3.15) ─────────────────────────────────────────────────\n // Served by the shell (run-command.ts → automations/automations-focus.ts).\n { id: 'automations.new', title: 'New automation…', scope: 'global', keys: [], group: 'actions', section: 'App', keywords: ['automation', 'trigger', 'schedule', 'nightly', 'weekly', 'webhook', 'issues labeled', 'fix red main', 'rrule'] },\n { id: 'wiki.ask', title: 'Ask the codebase…', scope: 'global', keys: [], group: 'actions', section: 'App', keywords: ['ask', 'question', 'codebase', 'where', 'how', 'explain', 'wiki', 'search code'] },\n // Served by the shell (run-command.ts → copy-setup.ts), wherever you are.\n appAction('autonomy.copy-setup', 'Copy autonomy setup command', [AUTONOMY_SETUP_COMMAND, 'autonomy', 'turn on', 'clipboard']),\n] as const satisfies readonly WorkbenchCommand[];\n\nexport type CommandId = (typeof WORKBENCH_COMMANDS)[number]['id'];\n\nconst BY_ID: ReadonlyMap<string, WorkbenchCommand> = new Map(WORKBENCH_COMMANDS.map((c) => [c.id, c as WorkbenchCommand]));\n\nexport function findCommand(id: string): WorkbenchCommand | null {\n return BY_ID.get(id) ?? null;\n}\n\n// run-command.ts resolves keyless ids (palette actions, guards, surfaces) through this.\nregisterCommandCatalog(findCommand);\n\n/** Palette entries of one group, in catalog order. */\nexport function paletteCommands(group: 'actions' | 'go-to'): WorkbenchCommand[] {\n return (WORKBENCH_COMMANDS as readonly WorkbenchCommand[]).filter((c) => c.group === group);\n}\n\n/** The shortcuts overlay: every command with keys, grouped by section, in display order. */\nexport function shortcutSections(): Array<{ section: ShortcutSection; commands: WorkbenchCommand[] }> {\n const withKeys = (WORKBENCH_COMMANDS as readonly WorkbenchCommand[]).filter((c) => c.keys.length > 0);\n return SHORTCUT_SECTIONS.map((section) => ({ section, commands: withKeys.filter((c) => c.section === section) })).filter(\n (s) => s.commands.length > 0,\n );\n}\n\n/**\n * The command a key press runs, given the scopes live right now (innermost\n * first, e.g. ['composer', 'chat', 'global']). Null when nothing is bound —\n * the caller must then leave the event alone. The full catalog entry; first\n * paint matches with command-keys.ts matchKey().\n */\nexport function matchCommand(event: KeyEventLike, liveScopes: readonly CommandScope[], platform: KeyPlatform = detectKeyPlatform()): WorkbenchCommand | null {\n const binding = matchKey(event, liveScopes, platform);\n return binding ? findCommand(binding.id) : null;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{C as e,M as t,N as n,O as r,V as i,a,i as o,t as s,w as c}from"./global-CYfRwH6t.js";import{$ as l,Q as u,Y as d,et as f,n as p,q as m,r as h}from"./VerseShared-CFE5B-IY.js";async function g(e){try{let t=await e.json();return{detail:typeof t.error==`string`&&t.error?t.error:null,code:typeof t.code==`string`&&t.code?t.code:null}}catch{return{detail:null,code:null}}}async function _(e,t){if(n())return o(e,t);let i=await fetch(e,{method:`GET`,credentials:`same-origin`,headers:n()?{}:{"x-ashlr-read-client":c()},...t?{signal:t}:{}});if(i.status===401)throw r(),new s(`Read session expired.`,401,e);if(!i.ok){let{detail:t,code:n}=await g(i);throw new s(`GET ${e} failed (HTTP ${i.status})${t?`: ${t}`:``}.`,i.status,e,t,n)}return await i.json()}async function v(n,r,i){let o=e();if(!o)throw new h;let s=await a(n,r,o,i);return t(),s}var y=encodeURIComponent;function b(e,t){return _(`${l}/${y(e)}`,t)}async function x(e,t){let n=await v(`${l}/${y(e)}`,t);return t.model!==void 0&&i(p),n}function S(e){return _(f,e)}function C(e){return v(f,e)}function w(e,t,n){return v(`${m}/${y(e)}`,t,n)}function T(e,t){return v(`${m}/${y(e)}/${y(t)}/delete`,{})}function E(e,t){return _(`${u}/${y(e)}`,t)}function D(e,t,n={}){return v(`${u}/${y(e)}`,n.sendNow?{text:t,sendNow:!0}:{text:t})}function O(e,t){return v(`${u}/${y(e)}/${y(t)}/delete`,{})}function k(e,t){return v(`${u}/${y(e)}/${y(t)}/send`,{})}function A(e,t,n){let r=new URLSearchParams({sessionId:e,q:t});return _(`${d}?${r.toString()}`,n)}export{b as a,k as c,w as d,E as i,C as l,D as n,O as o,S as r,A as s,T as t,x as u};
2
+ //# sourceMappingURL=composer-queries-GxFt1UQm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-queries-GxFt1UQm.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/composer/composer-queries.ts"],"sourcesContent":["/**\n * routes/verse/composer/composer-queries.ts — every call the 3.10 composer\n * makes (unit C3; core/verse/session-controls-api.ts is the server side).\n *\n * Same conventions as ../context/context-queries.ts:\n * - WRITES pull the held mutation token, throw `VerseMutationLockedError`\n * when none is held (so the caller's token gate can ask for it), and touch\n * the hold on success;\n * - READS carry the read-client proof and keep the server's refusal sentence\n * (`ApiError.detail`), because these routes answer a refused read with a\n * sentence written for a person.\n *\n * Spend: none of these start a model call EXCEPT the two that exist to send —\n * a queued follow-up when nothing is running, and [Send now]. Both go through\n * the engine's one `sendTurn` chokepoint, like POST /sessions/:id/turns.\n */\nimport { getMutationToken, getReadClientProof, reportSessionExpired, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { isRemoteMobileMode } from '../../../data/remote-mode.js';\nimport type {\n VerseAttachment,\n VerseAttachmentUpload,\n VerseFilesResponse,\n VerseQueueResponse,\n VerseSessionControlDefaults,\n VerseSessionControlDefaultsUpdate,\n VerseSessionControlsResponse,\n VerseSessionControlsUpdate,\n} from '../../../../core/verse/workbench-types.js';\nimport {\n VERSE_ATTACHMENTS_PATH,\n VERSE_FILES_PATH,\n VERSE_QUEUE_PATH,\n VERSE_SESSION_CONTROL_DEFAULTS_PATH,\n VERSE_SESSION_CONTROLS_PATH,\n} from '../../../../core/verse/workbench-types.js';\nimport { VERSE_SESSIONS_KEY, VerseMutationLockedError } from '../verse-queries.js';\n\n/** POST /queue and /send answer with the queue plus the turn they started, if any. */\nexport type VerseQueueSendResult = VerseQueueResponse & { sentTurnId: string | null };\n\nasync function refusalDetail(res: Response): Promise<{ detail: string | null; code: string | null }> {\n try {\n const body = (await res.json()) as { error?: unknown; code?: unknown };\n return {\n detail: typeof body.error === 'string' && body.error ? body.error : null,\n code: typeof body.code === 'string' && body.code ? body.code : null,\n };\n } catch {\n return { detail: null, code: null };\n }\n}\n\nasync function getJson<T>(path: string, signal?: AbortSignal): Promise<T> {\n if (isRemoteMobileMode()) return apiGet<T>(path, signal);\n const res = await fetch(path, {\n method: 'GET',\n credentials: 'same-origin',\n headers: isRemoteMobileMode() ? {} : { 'x-ashlr-read-client': getReadClientProof() },\n ...(signal ? { signal } : {}),\n });\n if (res.status === 401) {\n reportSessionExpired();\n throw new ApiError('Read session expired.', 401, path);\n }\n if (!res.ok) {\n const { detail, code } = await refusalDetail(res);\n throw new ApiError(`GET ${path} failed (HTTP ${res.status})${detail ? `: ${detail}` : ''}.`, res.status, path, detail, code);\n }\n return (await res.json()) as T;\n}\n\nasync function post<T>(path: string, body: unknown, signal?: AbortSignal): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token, signal);\n touchMutationHold();\n return result;\n}\n\nconst enc = encodeURIComponent;\n\n// ---------------------------------------------------------------------------\n// Controls\n// ---------------------------------------------------------------------------\n\nexport function fetchSessionControls(sessionId: string, signal?: AbortSignal): Promise<VerseSessionControlsResponse> {\n return getJson(`${VERSE_SESSION_CONTROLS_PATH}/${enc(sessionId)}`, signal);\n}\n\nexport async function updateSessionControls(sessionId: string, update: VerseSessionControlsUpdate): Promise<VerseSessionControlsResponse> {\n const result = await post<VerseSessionControlsResponse>(`${VERSE_SESSION_CONTROLS_PATH}/${enc(sessionId)}`, update);\n // A model switch changes the record the header and the chat list draw.\n if (update.model !== undefined) invalidate(VERSE_SESSIONS_KEY);\n return result;\n}\n\nexport function fetchControlDefaults(signal?: AbortSignal): Promise<VerseSessionControlDefaults> {\n return getJson(VERSE_SESSION_CONTROL_DEFAULTS_PATH, signal);\n}\n\nexport function updateControlDefaults(update: VerseSessionControlDefaultsUpdate): Promise<VerseSessionControlDefaults> {\n return post(VERSE_SESSION_CONTROL_DEFAULTS_PATH, update);\n}\n\n// ---------------------------------------------------------------------------\n// Attachments\n// ---------------------------------------------------------------------------\n\nexport function uploadAttachment(sessionId: string, upload: VerseAttachmentUpload, signal?: AbortSignal): Promise<VerseAttachment> {\n return post(`${VERSE_ATTACHMENTS_PATH}/${enc(sessionId)}`, upload, signal);\n}\n\nexport function deleteAttachment(sessionId: string, attachmentId: string): Promise<{ sessionId: string; items: VerseAttachment[] }> {\n return post(`${VERSE_ATTACHMENTS_PATH}/${enc(sessionId)}/${enc(attachmentId)}/delete`, {});\n}\n\n// ---------------------------------------------------------------------------\n// Queue\n// ---------------------------------------------------------------------------\n\nexport function fetchQueue(sessionId: string, signal?: AbortSignal): Promise<VerseQueueResponse> {\n return getJson(`${VERSE_QUEUE_PATH}/${enc(sessionId)}`, signal);\n}\n\nexport function enqueueFollowUp(sessionId: string, text: string, opts: { sendNow?: boolean } = {}): Promise<VerseQueueSendResult> {\n return post(`${VERSE_QUEUE_PATH}/${enc(sessionId)}`, opts.sendNow ? { text, sendNow: true } : { text });\n}\n\nexport function removeFollowUp(sessionId: string, queueId: string): Promise<VerseQueueResponse> {\n return post(`${VERSE_QUEUE_PATH}/${enc(sessionId)}/${enc(queueId)}/delete`, {});\n}\n\nexport function sendFollowUpNow(sessionId: string, queueId: string): Promise<VerseQueueSendResult> {\n return post(`${VERSE_QUEUE_PATH}/${enc(sessionId)}/${enc(queueId)}/send`, {});\n}\n\n// ---------------------------------------------------------------------------\n// Files (`@`)\n// ---------------------------------------------------------------------------\n\n/** The chat's cwd root rides along (additive), so a match there is written relative. */\nexport type VerseFilesResult = VerseFilesResponse & { primaryRoot?: string | null };\n\nexport function searchSessionFiles(sessionId: string, query: string, signal?: AbortSignal): Promise<VerseFilesResult> {\n const params = new URLSearchParams({ sessionId, q: query });\n return getJson(`${VERSE_FILES_PATH}?${params.toString()}`, signal);\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{tt as e}from"./verse-model-DAOz9LrY.js";function t(e){let t=e.trim();return t.length===0?0:Math.max(1,Math.ceil(t.length/4))}function n(n,r){let i=t(n);if(i===0)return null;let a=typeof r.contextWindow==`number`&&r.contextWindow>0?r.contextWindow:null;if(a===null)return null;let o=typeof r.contextTokens==`number`&&Number.isFinite(r.contextTokens)?Math.max(0,r.contextTokens):0,s=e({contextTokens:o+i,contextWindow:a,autoCompactAt:r.autoCompactAt??null,contextTokensExact:r.exact});return s.tone===`ok`||s.tone===`unknown`?null:{draftTokens:i,projectedTokens:s.tokens,projectedPercent:Math.min(999,Math.round((s.ofWindow??0)*100)),autoCompactAt:s.autoCompactAt,pastCompaction:s.ofCompaction!==null&&s.ofCompaction>=1,tone:s.tone,exact:s.exact}}export{n as t};
2
+ //# sourceMappingURL=composer-state-DTAoie2b.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-state-DTAoie2b.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/composer-state.ts"],"sourcesContent":["/**\n * routes/verse/chat/composer-state.ts — the composer's memory, and an\n * honest estimate of what a message will cost.\n *\n * The memory (per-chat drafts and sent messages in `localStorage`) lives in\n * composer-memory.ts and is re-exported here unchanged; see that file.\n */\n\nimport { CHARS_PER_TOKEN, occupancy } from '../../../../core/verse/context-math.js';\n\nexport {\n clearComposerMemory,\n forgetComposerMemory,\n loadDraft,\n loadHistory,\n pushHistory,\n saveDraft,\n VERSE_DRAFT_STORAGE_KEY,\n VERSE_SENT_STORAGE_KEY,\n} from './composer-memory.js';\n\n// ---------------------------------------------------------------------------\n// Cost\n// ---------------------------------------------------------------------------\n\n/**\n * Characters per token — context-math's CHARS_PER_TOKEN, the one estimator\n * every surface uses (handoff size, fit badges, this hint). A rough\n * English/code average, and rough is the point: the real count is the\n * provider's, which this app does not have before the turn runs. Every\n * surface that shows this figure marks it `≈` and never presents it as\n * measured (DESIGN §6, VERSE-TELEMETRY-V2).\n */\nexport function estimateTokens(text: string): number {\n const trimmed = text.trim();\n if (trimmed.length === 0) return 0;\n return Math.max(1, Math.ceil(trimmed.length / CHARS_PER_TOKEN));\n}\n\n/** `over` = the projection is past the whole window, not just the compaction point. */\nexport type CostTone = 'warn' | 'danger' | 'over';\n\nexport interface CostHint {\n /** Estimated tokens for the draft itself. */\n draftTokens: number;\n /** Occupancy this message would push the session to (current + draft), in tokens. */\n projectedTokens: number;\n /** …as a percent of the context WINDOW (the meter's track), unclamped. */\n projectedPercent: number;\n /** Where the CLI auto-compacts, when known. */\n autoCompactAt: number | null;\n /** True when the projection reaches the compaction point: the CLI compacts before or during this turn. */\n pastCompaction: boolean;\n tone: CostTone;\n /** False when the current occupancy is itself an upper bound (codex before its rollout is read). */\n exact: boolean;\n}\n\n/** The session's context budget as the composer sees it (verse-model `sessionContextBudget`). */\nexport interface CostBudget {\n contextTokens: number | null | undefined;\n contextWindow: number | null | undefined;\n autoCompactAt?: number | null;\n exact?: boolean;\n}\n\n/**\n * What sending this draft would do to the context — or null when the window\n * is unknown, the box is empty, or the session stays comfortable.\n *\n * The tones are context-math `occupancy()`'s — measured against the\n * COMPACTION point when it is known (warn from 80%, danger from 95%), else\n * against the window — which is exactly what colours the ContextMeter, so the\n * hint and the meter can never disagree about when things are getting tight.\n */\nexport function costHint(text: string, budget: CostBudget): CostHint | null {\n const draftTokens = estimateTokens(text);\n if (draftTokens === 0) return null;\n const window = typeof budget.contextWindow === 'number' && budget.contextWindow > 0 ? budget.contextWindow : null;\n if (window === null) return null;\n const used = typeof budget.contextTokens === 'number' && Number.isFinite(budget.contextTokens) ? Math.max(0, budget.contextTokens) : 0;\n const projected = occupancy({\n contextTokens: used + draftTokens,\n contextWindow: window,\n autoCompactAt: budget.autoCompactAt ?? null,\n contextTokensExact: budget.exact,\n });\n if (projected.tone === 'ok' || projected.tone === 'unknown') return null;\n return {\n draftTokens,\n projectedTokens: projected.tokens,\n projectedPercent: Math.min(999, Math.round((projected.ofWindow ?? 0) * 100)),\n autoCompactAt: projected.autoCompactAt,\n pastCompaction: projected.ofCompaction !== null && projected.ofCompaction >= 1,\n tone: projected.tone,\n exact: projected.exact,\n };\n}\n"],"mappings":"+CAiCA,SAAgB,EAAe,EAAsB,CACnD,IAAM,EAAU,EAAK,KAAK,EAE1B,OADI,EAAQ,SAAW,EAAU,EAC1B,KAAK,IAAI,EAAG,KAAK,KAAK,EAAQ,OAAA,CAAwB,CAAC,CAChE,CAsCA,SAAgB,EAAS,EAAc,EAAqC,CAC1E,IAAM,EAAc,EAAe,CAAI,EACvC,GAAI,IAAgB,EAAG,OAAO,KAC9B,IAAM,EAAS,OAAO,EAAO,eAAkB,UAAY,EAAO,cAAgB,EAAI,EAAO,cAAgB,KAC7G,GAAI,IAAW,KAAM,OAAO,KAC5B,IAAM,EAAO,OAAO,EAAO,eAAkB,UAAY,OAAO,SAAS,EAAO,aAAa,EAAI,KAAK,IAAI,EAAG,EAAO,aAAa,EAAI,EAC/H,EAAY,EAAU,CAC1B,cAAe,EAAO,EACtB,cAAe,EACf,cAAe,EAAO,eAAiB,KACvC,mBAAoB,EAAO,KAC7B,CAAC,EAED,OADI,EAAU,OAAS,MAAQ,EAAU,OAAS,UAAkB,KAC7D,CACL,cACA,gBAAiB,EAAU,OAC3B,iBAAkB,KAAK,IAAI,IAAK,KAAK,OAAO,EAAU,UAAY,GAAK,GAAG,CAAC,EAC3E,cAAe,EAAU,cACzB,eAAgB,EAAU,eAAiB,MAAQ,EAAU,cAAgB,EAC7E,KAAM,EAAU,KAChB,MAAO,EAAU,KACnB,CACF"}
@@ -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);function r(e,t){if(!e)return`offline`;switch(t.status){case`ready`:return`live`;case`stale`:return`unreachable`;case`unavailable`:return t.error?`unreachable`:`live`;default:return`connecting`}}function i(e,t=Date.now()){if(e===null)return`No update yet`;let n=Math.max(0,Math.round((t-e)/1e3));if(n<45)return`Updated just now`;let r=Math.round(n/60);if(r<60)return`Updated ${r} min ago`;let i=Math.round(r/60);return i<24?`Updated ${i} h ago`:`Updated ${Math.round(i/24)} d ago`}function a(e){return window.addEventListener(`online`,e),window.addEventListener(`offline`,e),()=>{window.removeEventListener(`online`,e),window.removeEventListener(`offline`,e)}}function o(){return typeof navigator>`u`||navigator.onLine!==!1}function s(){return(0,n.useSyncExternalStore)(a,o,()=>!0)}export{i as n,s as r,r as t};
2
+ //# sourceMappingURL=connectivity-zM4_O-XZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectivity-zM4_O-XZ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/connectivity.ts"],"sourcesContent":["/**\n * routes/verse/mobile/connectivity.ts — \"can this phone reach the Mac right\n * now?\", from signals the app already has.\n *\n * offline the phone itself has no network (navigator.onLine false)\n * unreachable the phone is online but the Mac did not answer the last\n * activity poll (asleep, off the relay, tunnel down). The last\n * good data stays on screen, dated — never replaced by zeros\n * live the last poll answered\n * connecting nothing has answered yet\n *\n * The shell's one activity loop (shell/useActivity.ts, 5 s visible / 30 s\n * hidden) is the heartbeat, so this costs no request of its own. Whether the\n * page itself loads offline is the service worker's job (public/verse-m/sw.js).\n */\nimport { useSyncExternalStore } from 'react';\nimport type { ActivityState } from '../shell/useActivity.js';\n\nexport type Reachability = 'live' | 'connecting' | 'offline' | 'unreachable';\n\nexport function reachabilityOf(online: boolean, activity: Pick<ActivityState, 'status' | 'data' | 'error'>): Reachability {\n if (!online) return 'offline';\n switch (activity.status) {\n case 'ready':\n return 'live';\n case 'stale':\n return 'unreachable';\n // A 404 (route not in this build) is 'unavailable' with no error: the Mac\n // answered. With an error and no data, it never answered.\n case 'unavailable':\n return activity.error ? 'unreachable' : 'live';\n default:\n return 'connecting';\n }\n}\n\n/** \"Updated 2 min ago\" — for the banner under a stale screen. */\nexport function sinceText(updatedAt: number | null, now: number = Date.now()): string {\n if (updatedAt === null) return 'No update yet';\n const s = Math.max(0, Math.round((now - updatedAt) / 1000));\n if (s < 45) return 'Updated just now';\n const m = Math.round(s / 60);\n if (m < 60) return `Updated ${m} min ago`;\n const h = Math.round(m / 60);\n return h < 24 ? `Updated ${h} h ago` : `Updated ${Math.round(h / 24)} d ago`;\n}\n\nfunction subscribeOnline(listener: () => void): () => void {\n window.addEventListener('online', listener);\n window.addEventListener('offline', listener);\n return () => {\n window.removeEventListener('online', listener);\n window.removeEventListener('offline', listener);\n };\n}\n\nfunction readOnline(): boolean {\n return typeof navigator === 'undefined' || navigator.onLine !== false;\n}\n\nexport function useOnline(): boolean {\n return useSyncExternalStore(subscribeOnline, readOnline, () => true);\n}\n"],"mappings":"0GAoBA,SAAgB,EAAe,EAAiB,EAA0E,CACxH,GAAI,CAAC,EAAQ,MAAO,UACpB,OAAQ,EAAS,OAAjB,CACE,IAAK,QACH,MAAO,OACT,IAAK,QACH,MAAO,cAGT,IAAK,cACH,OAAO,EAAS,MAAQ,cAAgB,OAC1C,QACE,MAAO,YACX,CACF,CAGA,SAAgB,EAAU,EAA0B,EAAc,KAAK,IAAI,EAAW,CACpF,GAAI,IAAc,KAAM,MAAO,gBAC/B,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,OAAO,EAAM,GAAa,GAAI,CAAC,EAC1D,GAAI,EAAI,GAAI,MAAO,mBACnB,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAC3B,GAAI,EAAI,GAAI,MAAO,WAAW,EAAE,UAChC,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAC3B,OAAO,EAAI,GAAK,WAAW,EAAE,QAAU,WAAW,KAAK,MAAM,EAAI,EAAE,EAAE,OACvE,CAEA,SAAS,EAAgB,EAAkC,CAGzD,OAFA,OAAO,iBAAiB,SAAU,CAAQ,EAC1C,OAAO,iBAAiB,UAAW,CAAQ,MAC9B,CACX,OAAO,oBAAoB,SAAU,CAAQ,EAC7C,OAAO,oBAAoB,UAAW,CAAQ,CAChD,CACF,CAEA,SAAS,GAAsB,CAC7B,OAAO,OAAO,UAAc,KAAe,UAAU,SAAW,EAClE,CAEA,SAAgB,GAAqB,CACnC,OAAA,EAAO,EAAA,qBAAA,CAAqB,EAAiB,MAAkB,EAAI,CACrE"}
@@ -0,0 +1,2 @@
1
+ import{D as e,K as t,Q as n,T as r,et as i,g as a,i as o,j as s,nt as c,q as l,s as u,t as d}from"./verse-model-DAOz9LrY.js";import{p as f}from"./format-V6IiIMAL.js";function p(e,t){return e?a([e],{seatId:e.id,model:t}):null}function m(e,n){return n!==`standard`&&t(e,n)!==null?n:`standard`}function h(e,n){return t(e,m(e,n))}function g(e,t){let n=r(e);if(n!==null)return n;let i=t.unavailableReason;return typeof i==`string`&&i.trim().length>0?i.trim():null}var _={standard:`Standard`,expansive:`Expansive`},v={claude:`Claude Code`,codex:`Codex CLI`,grok:`Grok CLI`,local:`Claude Code`,devin:`Devin`};function y(e){let t=typeof e.cliVersion==`string`?e.cliVersion.trim():``;return t.length>0?`${v[e.engine]} ${t}`:null}function b(e){return(e.notes??[]).filter(e=>typeof e==`string`&&e.trim().length>0)}function x(e){return e===`fallback`}function S(e,n=`standard`){let r=m(e,n),i=t(e,r);return i?`${`${u(i.contextWindow)} ctx${x(e.windowSource)?` (est.)`:``}`}${i.autoCompactAt===null?``:` · compacts ≈${s(i.autoCompactAt)}`}${r===`expansive`?` (expansive)`:``}`:`window unknown`}function C(e){let n=t(e,`standard`),r=i(e)?t(e,`expansive`):null,a=[];if(!n)a.push(`Context window unknown for this model.`);else{let e=n.autoCompactAt===null?``:`; compacts at about ${s(n.autoCompactAt)}${r?` in Standard`:``}`;a.push(`${u(n.contextWindow)}-token window${e}.`)}return r&&a.push(`Expansive runs to about ${s(r.autoCompactAt??r.contextWindow)} before compacting.`),e.windowSource&&a.push(`Window ${o[e.windowSource]}.`),a.join(` `)}function w(e){return e===`codex`?d:null}function T(e){let n=t(e,`standard`),r=t(e,`expansive`),i=n?n.autoCompactAt??n.contextWindow:null,a=r?r.autoCompactAt??r.contextWindow:null;return i===null||a===null||i<=0?null:`A turn at ${s(a)} re-sends ${(a/i).toFixed(1)}× the tokens of one at ${s(i)}.`}function E(e,n,r){let i=t(n,`standard`),a=t(n,`expansive`),o=i?i.autoCompactAt??i.contextWindow:null,c=a?a.autoCompactAt??a.contextWindow:null;if(r===`standard`||c===null)return o===null?`The CLI compacts at its own default point for this model.`:e===`claude`?`Compacts at about ${s(o)}. Every turn re-sends the whole context, so holding it under this point keeps each turn cheaper and recall sharper.`:`Compacts at about ${s(o)} — the CLI's own default budget for this model.`;let l=T(n),u=w(e);return`Runs to about ${s(c)} before compacting — for tightly coupled, cross-cutting work that needs everything in view at once. Each turn re-sends everything held, so a long expansive chat uses noticeably more of your plan per turn.${l?` ${l}`:``}${u?` ${u}`:``}`}function D(e,n){return t(n,`standard`)?e===`grok`||e===`local`?`One budget: this CLI compacts at its own fixed point, and Verse cannot raise it per chat.`:`One budget: this model has no larger window to expand into.`:`This model’s window is unknown, so Verse cannot offer a larger budget for it.`}var O={fits:`code fits`,tight:`code fits, tight`,expansive:`code needs expansive`,split:`code too big — split`},k={fits:`Fits`,tight:`Tight fit`,expansive:`Needs expansive`,split:`Split the work`};function A(e){return e.roots.some(e=>e.truncated)}function j(e,r,i,a){if(typeof e!=`number`||!Number.isFinite(e)||e<0)return null;let o=c(a);if(m(r,i)===`expansive`&&r){let i=t(r,`expansive`);return n(e,{...r,contextWindow:i.contextWindow,autoCompactAt:i.autoCompactAt,expansive:null},o)}return n(e,r,o)}function M(e){let n=`${e.floor?`at least `:``}~${s(e.tokens)} tokens of tracked code`,r=m(e.option,e.mode)===`expansive`,a=t(e.option,`standard`),o=t(e.option,`expansive`),c=a?s(a.autoCompactAt??a.contextWindow):null,l=o?s(o.autoCompactAt??o.contextWindow):null,u=r?l:c,d=r?`Expansive budget`:`budget`;switch(e.verdict){case`fits`:return`All ${n} fits well inside this model's ${d}${u?` (compacts ≈${u})`:``}, with room left for the conversation.`;case`tight`:{let t=!r&&l!==null&&i(e.option)?` Expansive (≈${l}) would hold it with room to spare.`:``;return`${P(n)} fits under the ≈${u??`?`} compaction point${r?` of the Expansive budget`:``}, with little room for the conversation — expect it to compact if the agent reads widely.${t}`}case`expansive`:return`${P(n)} is more than the Standard budget (≈${c??`?`}) holds; only Expansive (≈${l??`?`}) takes it all. Switch to Expansive, or narrow the folders to the part you are changing.`;case`split`:return`${P(n)} is more than any single context on this model holds${l?`, even Expansive (≈${l})`:``}. Split the work: fan it out across several chats, each scoped to one folder or subsystem, or narrow this chat to the part you are changing.`}}function N(e){let t=e?` for ${v[e]}`:``;return`Estimated from the size of tracked text files (bytes ÷ 4), plus an estimated ~${s(c(e))} of fixed prompt${t} that every chat starts with. An upper bound — agents rarely read everything.`}function P(e){return e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}function F(t,n){let r=e(n,t);return{tokens:Math.floor(r.contextTokens),exact:r.exact,window:r.contextWindow,autoCompactAt:r.autoCompactAt,source:r.source,mode:r.mode,hasModes:i(r.option)}}function I(e){return e.cacheReadTokens<=0&&e.cacheCreationTokens<=0?null:l(e)}function L(e){return e===null||!Number.isFinite(e)?`—`:f(e)}function R(e){let t=new Map,n=0,r=null,i=(e,n,r)=>{if(!Number.isFinite(n)||n<0)return;let i=t.get(e)??{exact:null,bound:null};r?i.exact=Math.max(i.exact??0,n):i.bound=Math.max(i.bound??0,n),t.set(e,i)};for(let t of e)switch(t.type){case`usage`:r=t.usage,i(t.turnId,t.usage.contextTokens,t.usage.contextTokensExact!==!1);break;case`context`:t.turnId!==null&&i(t.turnId,t.contextTokens,t.exact);break;case`compaction`:n+=1}let a=0,o=null,s=!0,c=0;for(let e of t.values()){let t=e.exact??e.bound;t!==null&&(e.exact===null&&(s=!1),c+=1,a+=t,o=o===null?t:Math.max(o,t))}return{turns:c,average:c===0?null:Math.round(a/c),peak:o,exact:s,compactions:n,lastTurnCacheHit:r===null?null:I(r)}}function z(e,t,n,r){if(e.status===`running`||r===null)return null;let i=Date.parse(r);if(!Number.isFinite(i))return null;let a=n-i;return a<36e5||t<c(e.engine)?null:{idleMs:a,tokens:t,local:e.engine===`local`}}function B(e,t){return e.window!==null&&t.window!==null?e.tokens/e.window>t.tokens/t.window:e.window!==null||t.window===null&&e.tokens>t.tokens}function V(e,t){let n=new Map;for(let t of e){let e=n.get(t.seatId)??[];e.push(t),n.set(t.seatId,e)}let r=[];for(let[e,i]of n){let n=t.find(t=>t.id===e)??null,a=0,o=0,s=0,c=0,l=0,u=0,d=0,f=null;for(let e of i){a+=e.usage.inputTokens,o+=e.usage.cacheReadTokens,s+=e.usage.cacheCreationTokens,c+=e.usage.outputTokens,l+=e.turnCount,u+=e.compactionCount??0;let n=F(e,t);if(n.mode===`expansive`&&(d+=1),n.tokens<=0)continue;let r={sessionId:e.id,title:e.title,tokens:n.tokens,window:n.window,exact:n.exact};(f===null||B(r,f))&&(f=r)}r.push({seatId:e,label:n?.label??e,engine:n?.engine??i[0].engine,retired:n===null,sessions:i.length,turns:l,promptTokens:a+o+s,outputTokens:c,cacheHitRatio:I({inputTokens:a,cacheReadTokens:o,cacheCreationTokens:s}),compactions:u,expansiveSessions:d,fullest:f})}return r.sort((e,t)=>t.promptTokens-e.promptTokens||e.label.localeCompare(t.label))}export{p as C,V as S,R as T,D as _,h as a,y as b,M as c,L as d,z as f,g,j as h,E as i,A as l,C as m,k as n,w as o,S as p,O as r,T as s,_ as t,N as u,I as v,F as w,b as x,m as y};
2
+ //# sourceMappingURL=context-model-CKXUZd0O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-model-CKXUZd0O.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/usage/context-model.ts"],"sourcesContent":["/**\n * routes/verse/usage/context-model.ts — the ONE projection of context facts\n * for every surface that shows a seat: the seat picker's rows, the new-chat\n * dialog's context block, the resources panel's \"This chat\" efficiency block,\n * and the Usage section's per-seat efficiency table.\n *\n * WHY ONE MODULE. Before V3.9 every surface read `seat.contextWindow` (the\n * DEFAULT model's window) or the session's creation-time window, and three of\n * them rendered \"200k\" for a 1M Claude model. The arithmetic now lives in\n * core/verse/context-math.ts, shared with the server; this module is only the\n * wording and the aggregation, so the picker, the dialog and the panel cannot\n * describe one model's budget three different ways.\n *\n * HONESTY RULES this module enforces (docs/VERSE-CONTEXT.md):\n *\n * 1. UNKNOWN IS NOT A NUMBER. A model whose budget is unknown reads \"window\n * unknown\", never a default dressed as a fact. A Verse fallback window is\n * marked \"est.\", and its source says so in words.\n * 2. AN UPPER BOUND IS NOT A MEASUREMENT. Codex's turn total sums every model\n * call; until its rollout is read, occupancy is \"≤ N\", and any statistic\n * built on such a reading carries the same flag.\n * 3. NO CACHE REPORTED IS NOT A 0% HIT RATE. A provider that reported no\n * cache activity at all (Ollama; codex on its very first call) gets \"none\n * reported\", not a 0% that reads \"caching is broken\".\n * 4. NOTHING HERE SPENDS. Every figure is derived from what the server\n * already returned (seats, sessions, the open chat's event log).\n *\n * Pure: no React, no I/O.\n */\nimport {\n CACHE_IDLE_TTL_MS,\n budgetFor,\n cacheHitRatio,\n fitVerdict,\n hasExpansiveMode,\n sessionOverheadTokens,\n} from '../../../../core/verse/context-math.js';\nimport type {\n VerseContextBudget,\n VerseContextFit,\n VerseContextMode,\n VerseEngine,\n VerseEvent,\n VerseFitVerdict,\n VerseModelOption,\n VerseSeat,\n VerseSession,\n VerseUsage,\n VerseWindowSource,\n} from '../../../../core/verse/types.js';\nimport { CODEX_EXPANSIVE_METERING_NOTE, formatContextWindow, modelOptionFor, seatUnavailableReason, sessionContextBudget, WINDOW_SOURCE_TEXT } from '../verse-model.js';\nimport { formatTokens } from '../verse-readouts.js';\nimport { formatWholePercent } from '../autonomy/format.js';\n\n// ---------------------------------------------------------------------------\n// Models and modes\n// ---------------------------------------------------------------------------\n\n/**\n * A seat's option for a model id, matching through the alias table (a chat\n * remembered on `claude-opus-5.5` is the catalog's `claude-opus-5-5`). The\n * lookup itself is verse-model's `modelOptionFor`, the one the context meter\n * uses, so the picker and the meter can never resolve one id two ways.\n */\nexport function seatModelOption(seat: VerseSeat | null | undefined, modelId: string): VerseModelOption | null {\n return seat ? modelOptionFor([seat], { seatId: seat.id, model: modelId }) : null;\n}\n\n/** `mode` when this model has a budget for it, else `standard` — never a mode the CLI cannot be told. */\nexport function resolveContextMode(option: VerseModelOption | null | undefined, mode: VerseContextMode): VerseContextMode {\n return mode !== 'standard' && budgetFor(option, mode) !== null ? mode : 'standard';\n}\n\n/** The budget a model runs with in a mode (resolved), or null when even its standard window is unknown. */\nexport function effectiveBudget(option: VerseModelOption | null | undefined, mode: VerseContextMode): VerseContextBudget | null {\n return budgetFor(option, resolveContextMode(option, mode));\n}\n\n/** Why this model cannot be chosen on this seat, or null when it can. The seat's own outage wins. */\nexport function modelUnavailableReason(seat: VerseSeat, option: VerseModelOption): string | null {\n const seatReason = seatUnavailableReason(seat);\n if (seatReason !== null) return seatReason;\n const reason = option.unavailableReason;\n return typeof reason === 'string' && reason.trim().length > 0 ? reason.trim() : null;\n}\n\nexport const CONTEXT_MODE_LABEL: Record<VerseContextMode, string> = {\n standard: 'Standard',\n expansive: 'Expansive',\n};\n\n/** How each seat's CLI is named when its pinned version is shown. */\nexport const ENGINE_CLI_NAME: Record<VerseEngine, string> = {\n claude: 'Claude Code',\n codex: 'Codex CLI',\n grok: 'Grok CLI',\n local: 'Claude Code',\n devin: 'Devin',\n};\n\n/** \"Claude Code 2.1.257\" — the binary this seat is pinned to; null when unknown (local seats, old servers). */\nexport function seatCliLine(seat: VerseSeat): string | null {\n const version = typeof seat.cliVersion === 'string' ? seat.cliVersion.trim() : '';\n return version.length > 0 ? `${ENGINE_CLI_NAME[seat.engine]} ${version}` : null;\n}\n\n/** The seat's own plain-language context facts (binary skew, catalog not yet fetched, …). */\nexport function seatContextNotes(seat: VerseSeat): string[] {\n return (seat.notes ?? []).filter((n): n is string => typeof n === 'string' && n.trim().length > 0);\n}\n\n// ---------------------------------------------------------------------------\n// Window provenance\n// ---------------------------------------------------------------------------\n\n// Window provenance wording is verse-model's `WINDOW_SOURCE_TEXT` — the\n// meter's tooltip, the picker and the resources panel all read that one table.\n\nexport function isEstimatedWindow(source: VerseWindowSource | null | undefined): boolean {\n return source === 'fallback';\n}\n\n// ---------------------------------------------------------------------------\n// Picker and dialog wording\n// ---------------------------------------------------------------------------\n\n/**\n * The compact per-model phrase a picker row carries: \"1M ctx · compacts ≈367k\".\n * Uses the budget for `mode` when the model has one, and names the mode only\n * when it is not the default, so an ordinary row stays short.\n */\nexport function modelContextPhrase(option: VerseModelOption, mode: VerseContextMode = 'standard'): string {\n const resolved = resolveContextMode(option, mode);\n const budget = budgetFor(option, resolved);\n if (!budget) return 'window unknown';\n const window = `${formatContextWindow(budget.contextWindow)} ctx${isEstimatedWindow(option.windowSource) ? ' (est.)' : ''}`;\n const compacts = budget.autoCompactAt === null ? '' : ` · compacts ≈${formatTokens(budget.autoCompactAt)}`;\n return `${window}${compacts}${resolved === 'expansive' ? ' (expansive)' : ''}`;\n}\n\n/**\n * The full sentence for a tooltip or the dialog: the window, where each mode\n * compacts, and how the window is known.\n */\nexport function modelContextSentence(option: VerseModelOption): string {\n const standard = budgetFor(option, 'standard');\n const expansive = hasExpansiveMode(option) ? budgetFor(option, 'expansive') : null;\n const parts: string[] = [];\n if (!standard) {\n parts.push('Context window unknown for this model.');\n } else {\n const where = standard.autoCompactAt === null\n ? ''\n : `; compacts at about ${formatTokens(standard.autoCompactAt)}${expansive ? ' in Standard' : ''}`;\n parts.push(`${formatContextWindow(standard.contextWindow)}-token window${where}.`);\n }\n if (expansive) {\n parts.push(`Expansive runs to about ${formatTokens(expansive.autoCompactAt ?? expansive.contextWindow)} before compacting.`);\n }\n if (option.windowSource) parts.push(`Window ${WINDOW_SOURCE_TEXT[option.windowSource]}.`);\n return parts.join(' ');\n}\n\n/**\n * The metering caveat an Expansive cost sentence must carry for this engine,\n * or null when there is none. The wording is verse-model's\n * CODEX_EXPANSIVE_METERING_NOTE — ONE sentence for the new-chat dialog, the\n * handoff dialog, the in-chat mode menu and the \"Expansive could help\" chip.\n * The ratio those surfaces quote (≈3.2× for a 785k vs 245k codex turn) counts\n * re-sent TOKENS only; GPT-5.6-class requests above 272k reportedly also\n * count about 2× against plan limits (docs/VERSE-CONTEXT.md §2.3, a single\n * secondary source), so the note is worded as reported, never as a measured\n * multiplier. Standard never crosses 272k; Expansive does by design.\n */\nexport function expansiveMeteringNote(engine: VerseEngine | null | undefined): string | null {\n return engine === 'codex' ? CODEX_EXPANSIVE_METERING_NOTE : null;\n}\n\n/**\n * \"A turn at 967k re-sends 2.6× the tokens of one at 367k.\" — the only ratio\n * any Expansive cost sentence quotes, and it is arithmetic on the model's own\n * budgets. Null when either compaction point is unknown. It comes BEFORE the\n * codex metering note, whose \"twice that\" refers to it.\n */\nexport function expansiveRatioSentence(option: VerseModelOption | null | undefined): string | null {\n const standard = budgetFor(option, 'standard');\n const expansive = budgetFor(option, 'expansive');\n const stdCap = standard ? standard.autoCompactAt ?? standard.contextWindow : null;\n const expCap = expansive ? expansive.autoCompactAt ?? expansive.contextWindow : null;\n if (stdCap === null || expCap === null || stdCap <= 0) return null;\n return `A turn at ${formatTokens(expCap)} re-sends ${(expCap / stdCap).toFixed(1)}× the tokens of one at ${formatTokens(stdCap)}.`;\n}\n\n/**\n * What each mode costs, in plain words, for the mode selector. Numbers come\n * from the model's own budgets; the only ratio quoted is arithmetic (every\n * turn re-sends everything held, so a turn at X re-sends X/Y of one at Y) —\n * a token ratio, not a usage multiplier, which is why codex also carries the\n * shared metering caveat.\n */\nexport function contextModeDescription(engine: VerseEngine, option: VerseModelOption, mode: VerseContextMode): string {\n const standard = budgetFor(option, 'standard');\n const expansive = budgetFor(option, 'expansive');\n const stdCap = standard ? standard.autoCompactAt ?? standard.contextWindow : null;\n const expCap = expansive ? expansive.autoCompactAt ?? expansive.contextWindow : null;\n if (mode === 'standard' || expCap === null) {\n if (stdCap === null) return 'The CLI compacts at its own default point for this model.';\n return engine === 'claude'\n ? `Compacts at about ${formatTokens(stdCap)}. Every turn re-sends the whole context, so holding it under this point keeps each turn cheaper and recall sharper.`\n : `Compacts at about ${formatTokens(stdCap)} — the CLI's own default budget for this model.`;\n }\n const ratio = expansiveRatioSentence(option);\n const metering = expansiveMeteringNote(engine);\n return `Runs to about ${formatTokens(expCap)} before compacting — for tightly coupled, cross-cutting work that needs everything in view at once. Each turn re-sends everything held, so a long expansive chat uses noticeably more of your plan per turn.${ratio ? ` ${ratio}` : ''}${metering ? ` ${metering}` : ''}`;\n}\n\n/** Why a model offers no mode choice, for the one line where the selector would be. */\nexport function noModeReason(engine: VerseEngine, option: VerseModelOption): string {\n if (!budgetFor(option, 'standard')) return 'This model’s window is unknown, so Verse cannot offer a larger budget for it.';\n if (engine === 'grok' || engine === 'local') return 'One budget: this CLI compacts at its own fixed point, and Verse cannot raise it per chat.';\n return 'One budget: this model has no larger window to expand into.';\n}\n\n// ---------------------------------------------------------------------------\n// Context fit\n// ---------------------------------------------------------------------------\n\n/** Short form for a picker row, where it sits beside the capacity words. */\nexport const FIT_SHORT: Record<VerseFitVerdict, string> = {\n fits: 'code fits',\n tight: 'code fits, tight',\n expansive: 'code needs expansive',\n split: 'code too big — split',\n};\n\n/** Badge text for the chosen model. */\nexport const FIT_LABEL: Record<VerseFitVerdict, string> = {\n fits: 'Fits',\n tight: 'Tight fit',\n expansive: 'Needs expansive',\n split: 'Split the work',\n};\n\n/** A fit reading that is a FLOOR (a root hit its file or time cap). */\nexport function fitIsFloor(fit: VerseContextFit): boolean {\n return fit.roots.some((r) => r.truncated);\n}\n\n/**\n * The verdict for a model IN THE MODE THE CHAT WOULD RUN IN, or null when its\n * budget is unknown (never guessed).\n *\n * `engine` is the seat's engine: the fixed prompt added to the code is that\n * CLI's estimate (context-math `sessionOverheadTokens` — ≈15k local, ≈25k\n * claude), not one flat figure. With a flat 30k a 64k local seat (compacts\n * ≈32.5k) called anything over ~2.5k tokens of code \"too big — split\". Null\n * falls back to the largest estimate.\n *\n * In Standard this is context-math's `fitVerdict` as is — including\n * \"expansive\", the suggestion that only the bigger budget holds the code. In\n * Expansive the bigger budget IS the budget, so the same thresholds are\n * applied to it: the code fits, fits tightly, or no single context on this\n * model holds it. Without this, a chat already set to Expansive would still be\n * told its code \"fits tightly under ≈367k\" — true of a budget it is not using.\n */\nexport function modelFit(\n tokens: number | null | undefined,\n option: VerseModelOption | null | undefined,\n mode: VerseContextMode,\n engine: VerseEngine | null,\n): VerseFitVerdict | null {\n if (typeof tokens !== 'number' || !Number.isFinite(tokens) || tokens < 0) return null;\n const overhead = sessionOverheadTokens(engine);\n if (resolveContextMode(option, mode) === 'expansive' && option) {\n const expansive = budgetFor(option, 'expansive')!;\n return fitVerdict(tokens, { ...option, contextWindow: expansive.contextWindow, autoCompactAt: expansive.autoCompactAt, expansive: null }, overhead);\n }\n return fitVerdict(tokens, option, overhead);\n}\n\n/**\n * The sentence under the fit badge, for the verdict `modelFit` gave in the\n * chat's mode. In Standard a tight fit also names the Expansive budget when\n * one exists, and \"needs expansive\" says what to do — suggestions only;\n * nothing here switches the mode.\n */\nexport function fitExplanation(input: {\n verdict: VerseFitVerdict;\n tokens: number;\n option: VerseModelOption;\n mode: VerseContextMode;\n floor?: boolean;\n}): string {\n const amount = `${input.floor ? 'at least ' : ''}~${formatTokens(input.tokens)} tokens of tracked code`;\n const inExpansive = resolveContextMode(input.option, input.mode) === 'expansive';\n const standard = budgetFor(input.option, 'standard');\n const expansive = budgetFor(input.option, 'expansive');\n const stdCap = standard ? formatTokens(standard.autoCompactAt ?? standard.contextWindow) : null;\n const expCap = expansive ? formatTokens(expansive.autoCompactAt ?? expansive.contextWindow) : null;\n const cap = inExpansive ? expCap : stdCap;\n const budget = inExpansive ? 'Expansive budget' : 'budget';\n switch (input.verdict) {\n case 'fits':\n return `All ${amount} fits well inside this model's ${budget}${cap ? ` (compacts ≈${cap})` : ''}, with room left for the conversation.`;\n case 'tight': {\n const roomier = !inExpansive && expCap !== null && hasExpansiveMode(input.option)\n ? ` Expansive (≈${expCap}) would hold it with room to spare.`\n : '';\n return `${capitalize(amount)} fits under the ≈${cap ?? '?'} compaction point${inExpansive ? ' of the Expansive budget' : ''}, with little room for the conversation — expect it to compact if the agent reads widely.${roomier}`;\n }\n case 'expansive':\n return `${capitalize(amount)} is more than the Standard budget (≈${stdCap ?? '?'}) holds; only Expansive (≈${expCap ?? '?'}) takes it all. Switch to Expansive, or narrow the folders to the part you are changing.`;\n case 'split':\n return `${capitalize(amount)} is more than any single context on this model holds${expCap ? `, even Expansive (≈${expCap})` : ''}. Split the work: fan it out across several chats, each scoped to one folder or subsystem, or narrow this chat to the part you are changing.`;\n }\n}\n\n/**\n * How the working-set figure is made — shown once, beside the badge. Names the\n * fixed-prompt figure the verdict added, and calls it an estimate: no CLI\n * reports its base prompt before a turn has run.\n */\nexport function fitMethodNote(engine: VerseEngine | null): string {\n const cli = engine ? ` for ${ENGINE_CLI_NAME[engine]}` : '';\n return `Estimated from the size of tracked text files (bytes ÷ 4), plus an estimated ~${formatTokens(sessionOverheadTokens(engine))} of fixed prompt${cli} that every chat starts with. An upper bound — agents rarely read everything.`;\n}\n\nfunction capitalize(text: string): string {\n return text.length === 0 ? text : text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n// ---------------------------------------------------------------------------\n// One session's context\n// ---------------------------------------------------------------------------\n\nexport interface SessionContextView {\n tokens: number;\n /** False when `tokens` is an upper bound (codex before its rollout is read). */\n exact: boolean;\n window: number | null;\n autoCompactAt: number | null;\n /** How the window is known; null when nothing says (no window, or a stored one without provenance). */\n source: VerseWindowSource | null;\n mode: VerseContextMode;\n /** The session's model has a real expansive budget on its seat. */\n hasModes: boolean;\n}\n\n/**\n * The window a session is measured against, by the precedence every surface\n * shares — runtime → the seat's CURRENT catalog budget for the model and mode\n * → what the record stored → the seat default. The precedence itself lives in\n * verse-model's `sessionContextBudget` (the context meter reads it too); this\n * only adds whether the model offers a second mode, for the panels here.\n */\nexport function sessionContext(session: VerseSession, seats: readonly VerseSeat[]): SessionContextView {\n const budget = sessionContextBudget(seats, session);\n return {\n tokens: Math.floor(budget.contextTokens),\n exact: budget.exact,\n window: budget.contextWindow,\n autoCompactAt: budget.autoCompactAt,\n source: budget.source,\n mode: budget.mode,\n hasModes: hasExpansiveMode(budget.option),\n };\n}\n\n/**\n * Cache-hit ratio, except when the provider reported no cache activity at all\n * — then null (\"none reported\"), because 0% would claim caching failed when\n * the truth is that nothing was said about it.\n */\nexport function reportedCacheHitRatio(usage: Pick<VerseUsage, 'inputTokens' | 'cacheReadTokens' | 'cacheCreationTokens'>): number | null {\n if (usage.cacheReadTokens <= 0 && usage.cacheCreationTokens <= 0) return null;\n return cacheHitRatio(usage);\n}\n\n/** A 0–1 ratio as a whole percent; a real sliver reads \"<1%\", never \"0%\". */\nexport function formatRatio(ratio: number | null): string {\n if (ratio === null || !Number.isFinite(ratio)) return '—';\n return formatWholePercent(ratio);\n}\n\nexport interface TurnContextStats {\n /** Turns with at least one context reading. */\n turns: number;\n /** Mean of each turn's context (its largest trustworthy reading); null with no turns. */\n average: number | null;\n /** Largest per-turn context seen. */\n peak: number | null;\n /** False when any counted turn had only an upper-bound reading. */\n exact: boolean;\n /** Compactions recorded in the log. */\n compactions: number;\n /** Cache-hit ratio of the most recent turn (see `reportedCacheHitRatio`). */\n lastTurnCacheHit: number | null;\n}\n\n/**\n * Context per turn from the open chat's event log.\n *\n * A turn's context is its LARGEST trustworthy reading: within one turn the\n * prompt only grows, except across a compaction, and the peak is what the\n * turn actually paid for. Exact readings (`context` events, usage frames not\n * flagged as upper bounds) win; a turn whose only reading is codex's turn\n * total contributes that total and flags the statistic as an upper bound —\n * that figure can be many times the real prompt, so it is never mixed in\n * where an exact one exists.\n */\nexport function turnContextStats(events: readonly VerseEvent[]): TurnContextStats {\n const perTurn = new Map<string, { exact: number | null; bound: number | null }>();\n let compactions = 0;\n let lastUsage: VerseUsage | null = null;\n const note = (turnId: string, tokens: number, exact: boolean): void => {\n if (!Number.isFinite(tokens) || tokens < 0) return;\n const entry = perTurn.get(turnId) ?? { exact: null, bound: null };\n if (exact) entry.exact = Math.max(entry.exact ?? 0, tokens);\n else entry.bound = Math.max(entry.bound ?? 0, tokens);\n perTurn.set(turnId, entry);\n };\n for (const event of events) {\n switch (event.type) {\n case 'usage':\n lastUsage = event.usage;\n note(event.turnId, event.usage.contextTokens, event.usage.contextTokensExact !== false);\n break;\n case 'context':\n if (event.turnId !== null) note(event.turnId, event.contextTokens, event.exact);\n break;\n case 'compaction':\n compactions += 1;\n break;\n default:\n break;\n }\n }\n let sum = 0;\n let peak: number | null = null;\n let exact = true;\n let turns = 0;\n for (const entry of perTurn.values()) {\n const value = entry.exact ?? entry.bound;\n if (value === null) continue;\n if (entry.exact === null) exact = false;\n turns += 1;\n sum += value;\n peak = peak === null ? value : Math.max(peak, value);\n }\n return {\n turns,\n average: turns === 0 ? null : Math.round(sum / turns),\n peak,\n exact,\n compactions,\n lastTurnCacheHit: lastUsage === null ? null : reportedCacheHitRatio(lastUsage),\n };\n}\n\nexport interface IdleCacheWarning {\n idleMs: number;\n tokens: number;\n /** A local model: the cost is time, not spend. */\n local: boolean;\n}\n\n/**\n * The next turn of an idle chat re-reads its whole context uncached once the\n * provider's prompt cache has expired (CACHE_IDLE_TTL_MS). Below the fixed\n * prompt every new chat on this engine pays anyway (its estimate) there is\n * nothing worth warning about.\n */\nexport function idleCacheWarning(\n session: Pick<VerseSession, 'status' | 'engine'>,\n tokens: number,\n now: number,\n /**\n * When the chat last TALKED to its provider (`lastTurnActivityAt(events)`),\n * never `session.updatedAt`: a rename or mode switch moves that without\n * warming the provider's cache. Null (no turn yet / log not loaded) → no warning.\n */\n lastActivityAt: string | null,\n): IdleCacheWarning | null {\n if (session.status === 'running' || lastActivityAt === null) return null;\n const last = Date.parse(lastActivityAt);\n if (!Number.isFinite(last)) return null;\n const idleMs = now - last;\n if (idleMs < CACHE_IDLE_TTL_MS || tokens < sessionOverheadTokens(session.engine)) return null;\n return { idleMs, tokens, local: session.engine === 'local' };\n}\n\n// ---------------------------------------------------------------------------\n// Per-seat efficiency across sessions (Usage section)\n// ---------------------------------------------------------------------------\n\nexport interface SeatEfficiencyRow {\n seatId: string;\n label: string;\n engine: VerseEngine;\n /** The seat is no longer in the roster (its sessions remain on disk). */\n retired: boolean;\n sessions: number;\n turns: number;\n /** input + cache read + cache write: every prompt token the seat was sent. */\n promptTokens: number;\n outputTokens: number;\n /** Null when the provider reported no cache activity on any of these sessions. */\n cacheHitRatio: number | null;\n compactions: number;\n expansiveSessions: number;\n /** The fullest context among these sessions right now, as a share of its window. */\n fullest: { sessionId: string; title: string; tokens: number; window: number | null; exact: boolean } | null;\n}\n\n/**\n * \"Fullest\" is a share of the window when both windows are known; a context\n * with a known window outranks one without (its fullness is a fact, the other\n * a size); two unknown windows compare by size.\n */\nfunction fuller(a: NonNullable<SeatEfficiencyRow['fullest']>, b: NonNullable<SeatEfficiencyRow['fullest']>): boolean {\n if (a.window !== null && b.window !== null) return a.tokens / a.window > b.tokens / b.window;\n if (a.window !== null) return true;\n if (b.window !== null) return false;\n return a.tokens > b.tokens;\n}\n\n/**\n * Aggregate every session by seat. Ratios are computed from SUMS, never as a\n * mean of per-session ratios — a two-turn chat must not weigh as much as a\n * two-hundred-turn one. Seats with no sessions are omitted rather than shown\n * as zeros. Sorted by prompt tokens, largest first: that is where efficiency\n * matters most.\n */\nexport function seatEfficiency(sessions: readonly VerseSession[], seats: readonly VerseSeat[]): SeatEfficiencyRow[] {\n const bySeat = new Map<string, VerseSession[]>();\n for (const s of sessions) {\n const list = bySeat.get(s.seatId) ?? [];\n list.push(s);\n bySeat.set(s.seatId, list);\n }\n const rows: SeatEfficiencyRow[] = [];\n for (const [seatId, list] of bySeat) {\n const seat = seats.find((s) => s.id === seatId) ?? null;\n let input = 0;\n let read = 0;\n let write = 0;\n let output = 0;\n let turns = 0;\n let compactions = 0;\n let expansiveSessions = 0;\n let fullest: SeatEfficiencyRow['fullest'] = null;\n for (const s of list) {\n input += s.usage.inputTokens;\n read += s.usage.cacheReadTokens;\n write += s.usage.cacheCreationTokens;\n output += s.usage.outputTokens;\n turns += s.turnCount;\n compactions += s.compactionCount ?? 0;\n // The mode as the meter resolves it (verse-model sessionContextBudget),\n // counted before the empty-reading skip: the mode is a fact about the\n // chat, not about its reading.\n const view = sessionContext(s, seats);\n if (view.mode === 'expansive') expansiveSessions += 1;\n if (view.tokens <= 0) continue;\n const candidate = { sessionId: s.id, title: s.title, tokens: view.tokens, window: view.window, exact: view.exact };\n if (fullest === null || fuller(candidate, fullest)) fullest = candidate;\n }\n rows.push({\n seatId,\n label: seat?.label ?? seatId,\n engine: seat?.engine ?? list[0]!.engine,\n retired: seat === null,\n sessions: list.length,\n turns,\n promptTokens: input + read + write,\n outputTokens: output,\n cacheHitRatio: reportedCacheHitRatio({ inputTokens: input, cacheReadTokens: read, cacheCreationTokens: write }),\n compactions,\n expansiveSessions,\n fullest,\n });\n }\n return rows.sort((a, b) => b.promptTokens - a.promptTokens || a.label.localeCompare(b.label));\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import{J as e,K as t,Q as n,X as r,et as i,j as a,nt as o,s,u as c}from"./verse-model-DAOz9LrY.js";import"./transient-events-nTLhMBND.js";import{_ as l,t as u,y as d}from"./format-V6IiIMAL.js";var f=[`minimal`,`low`,`medium`,`high`,`xhigh`,`max`],p=65536,m=12e3,h=[`This conversation is about to continue in a fresh session that has none of its context.`,`Write the handoff note that new session should start from. Do not edit files or run commands for this — only write the note.`,``,`Cover, concretely:`,`- The goal, and what "done" looks like.`,`- Decisions made so far, each with the reason it was made.`,`- Current state: what is finished, what is half-done, what is untested.`,`- Files changed and anything not yet committed.`,`- How to verify the work (exact commands).`,`- Open questions, risks, and approaches already tried that did not work.`,``,`Keep it under 600 words. Prefer file paths and commands over prose.`].join(`
2
+ `),g=65536,_=139264,v=6144,y=/\s·\spart\s(\d+)$/;function b(e){let t=e.replace(/\s+/g,` `).trim(),n=y.exec(t),r=(n?t.slice(0,n.index):t)||`Untitled chat`,i=` · part ${n?Number.parseInt(n[1],10)+1:2}`,a=120-i.length;return`${r.length>a?`${r.slice(0,a-1).trimEnd()}…`:r}${i}`}function x(t,n){if(!t)return null;let r=t.models.find(e=>e.id===n);if(r)return r;let i=e(n);return t.models.find(t=>e(t.id)===i)??null}function S(e,t,n=Date.now()){return e?e.health.state===`unavailable`?`${e.label} is unavailable: ${u(d(e.health.summary??`no reason given`,n))}.`:t?t.unavailableReason?`${t.label} cannot run on ${e.label}: ${u(d(t.unavailableReason,n))}.`:null:`Pick a model on this seat.`:`Pick a seat to continue on.`}function C(e,t){let n=e.find(e=>e.id===t.seatId);if(n&&n.health.state!==`unavailable`){let e=x(n,t.model);if(e&&!e.unavailableReason)return{seatId:n.id,model:e.id};let r=n.models.find(e=>!e.unavailableReason);if(r)return{seatId:n.id,model:r.id}}for(let t of e){if(t.health.state===`unavailable`)continue;let e=t.models.find(e=>!e.unavailableReason);if(e)return{seatId:t.id,model:e.id}}return null}function w(n){let{option:r,target:i,source:a,preferences:o}=n,s=e=>e!==void 0&&t(r,e)!==null;if(i!==null&&i.seatId===a.seatId&&e(i.model)===e(a.model)&&s(a.contextMode??`standard`))return a.contextMode??`standard`;let c=i?o?.seats[i.seatId]?.contextMode:void 0;return s(c)?c:`standard`}function T(e,n){return t(e,n)===null?void 0:n}function E(e,n){let r=t(e,n);if(!r)return null;let i=`${s(r.contextWindow)} window`;return r.autoCompactAt===null?i:`${i} · compacts ≈${a(r.autoCompactAt)}`}function D(e,i,s,c){let u=r(e),d=o(c),f=u+d,p=n(u,i,d),m=`~${a(u)} tokens of handoff + an estimated ~${a(d)} of fixed prompt`,h=t(i,`standard`),g=h?h.autoCompactAt??h.contextWindow:null,_={verdict:p,handoffTokens:u,overheadTokens:d,needTokens:f};switch(p){case`fits`:return{..._,tone:`ok`,text:`Fits: ${m} leaves most of the budget before the first compaction.`};case`tight`:return{..._,tone:`warn`,text:`Tight: ${m} is ${l(f/(g??f)*100)} of where this model compacts — the new chat will compact early.`};case`expansive`:return s===`expansive`?{..._,tone:`warn`,text:`Fits only the expansive budget: ${m}.`}:{..._,tone:`danger`,text:`Too big for the standard budget (${m}). Switch to Expansive, or trim the handoff.`};case`split`:return{..._,tone:`danger`,text:`Too big for one context on this model (${m}). Trim the handoff or pick a seat with a larger window.`};default:return{..._,verdict:null,tone:`unknown`,text:`This model’s window is not known, so there is no fit estimate.`}}}function O(e){return i(e)}function k(e,t){return e===`local`?`Runs on this machine with ${t}; it spends no subscription usage.`:`Sends one turn to ${t} and spends from its usage. The automatic preview costs nothing.`}var A=typeof TextEncoder==`function`?new TextEncoder:null;function j(e){if(A)return A.encode(e).length;let t=0;for(let n of e){let e=n.codePointAt(0)??0;t+=e<128?1:e<2048?2:e<65536?3:4}return t}var M=65536,N=_;function P(e){return j(JSON.stringify(e)??``)}function F(e){if(!Number.isFinite(e)||e<0)return`—`;if(e<1024)return`${e} B`;let t=e/1024;return`${t<10?t.toFixed(1).replace(/\.0$/,``):Math.round(t)} KB`}function I(e,t=Date.now()){if(!e)return null;let n=c(e,t);return n?n===`now`?`just now`:/^\d+[mhd]$/.test(n)?`${n} ago`:`on ${n}`:null}var L=[{label:`a private key`,re:/-----BEGIN [A-Z ]*PRIVATE KEY-----/},{label:`an Anthropic API key`,re:/\bsk-ant-[A-Za-z0-9_-]{20,}/},{label:`an OpenAI-style API key`,re:/\bsk-(?:proj-)?[A-Za-z0-9_-]{32,}/},{label:`an xAI API key`,re:/\bxai-[A-Za-z0-9]{32,}/},{label:`a GitHub token`,re:/\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{30,}|\bgithub_pat_[A-Za-z0-9_]{40,}/},{label:`an AWS access key`,re:/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/},{label:`a Slack token`,re:/\bxox[abprs]-[A-Za-z0-9-]{10,}/},{label:`a Google API key`,re:/\bAIza[0-9A-Za-z_-]{35}\b/},{label:`a Stripe secret key`,re:/\b(?:sk|rk)_live_[0-9A-Za-z]{20,}/}],R=v,z=`Reading and editing memory here spends nothing. On a paid seat it is not free to use: each new chat’s system prompt carries a memory block of up to ${R/1024} KB, re-sent every turn (cached after the first), and the agent reads and updates MEMORY.md as it works. Local seats spend nothing.`;function B(e){for(let{label:t,re:n}of L)if(n.test(e))return t;return null}var V=`[REDACTED]`;function H(e){return e.split(V).length-1}function U(e){let t=[];for(let n of e.toLowerCase().split(/\s+/))n&&!t.includes(n)&&t.push(n);return t}function W(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function G(e,t){let n=[...t].filter(e=>e.length>0).sort((e,t)=>t.length-e.length);if(n.length===0||e.length===0)return e?[{text:e,match:!1}]:[];let r=new RegExp(n.map(W).join(`|`),`gi`),i=[],a=0;for(let t of e.matchAll(r)){let n=t.index??0;t[0].length!==0&&(n>a&&i.push({text:e.slice(a,n),match:!1}),i.push({text:t[0],match:!0}),a=n+t[0].length)}return a<e.length&&i.push({text:e.slice(a),match:!1}),i}function K(e){let t=new Map;for(let n of e){let e=t.get(n.sessionId);if(!e){t.set(n.sessionId,{sessionId:n.sessionId,title:n.title,projectPath:n.projectPath,engine:n.engine,top:n,count:1,latestAt:n.at});continue}e.count+=1,n.at>e.latestAt&&(e.latestAt=n.at)}return[...t.values()]}export{k as C,h as D,m as E,p as O,S,f as T,H as _,V as a,U as b,C as c,D as d,b as f,O as g,x as h,z as i,g as k,F as l,P as m,R as n,E as o,G as p,N as r,w as s,M as t,K as u,I as v,j as w,B as x,T as y};
3
+ //# sourceMappingURL=context-model-DYkDKK6C.js.map