@ashlr/hub 3.22.0 → 3.22.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 (929) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +5 -5
  3. package/dist/authority-surface.json +16 -11
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/verify-safety-sources.d.ts +4 -0
  6. package/dist/cli/verify-safety-sources.js +41 -0
  7. package/dist/cli/verify-safety-sources.js.map +1 -0
  8. package/dist/cli/verify-safety.js +16 -1
  9. package/dist/cli/verify-safety.js.map +1 -1
  10. package/dist/core/decide/needs-you.d.ts +3 -1
  11. package/dist/core/decide/needs-you.js +52 -28
  12. package/dist/core/decide/needs-you.js.map +1 -1
  13. package/dist/core/fleet/fleet-control-model.d.ts +2 -1
  14. package/dist/core/fleet/fleet-control-model.js +5 -0
  15. package/dist/core/fleet/fleet-control-model.js.map +1 -1
  16. package/dist/core/fleet/fleet-control-types.d.ts +11 -1
  17. package/dist/core/fleet/fleet-control.d.ts +4 -0
  18. package/dist/core/fleet/fleet-control.js +23 -1
  19. package/dist/core/fleet/fleet-control.js.map +1 -1
  20. package/dist/core/fleet/quota.js +1 -1
  21. package/dist/core/fleet/quota.js.map +1 -1
  22. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  23. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
  24. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
  25. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
  26. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
  27. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
  28. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
  29. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
  30. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
  31. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
  32. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
  33. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
  34. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
  35. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
  36. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
  37. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
  38. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
  39. package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
  40. package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
  41. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
  42. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
  43. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
  44. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
  45. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
  46. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
  47. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
  48. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
  49. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
  50. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
  51. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
  52. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
  53. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
  54. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
  55. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
  56. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
  57. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
  58. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
  59. package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
  60. package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
  61. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
  62. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
  63. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
  64. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
  65. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
  66. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
  67. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
  68. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
  69. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
  70. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
  71. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
  72. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
  73. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
  74. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
  75. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
  76. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
  77. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
  78. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
  79. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
  80. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
  81. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
  82. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
  83. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
  84. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
  85. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
  86. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
  87. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
  88. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
  89. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
  90. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
  91. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
  92. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
  93. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
  94. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
  95. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
  96. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
  97. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
  98. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
  99. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
  100. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
  101. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
  102. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
  103. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
  104. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
  105. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
  106. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
  107. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
  108. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
  109. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
  110. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
  111. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
  112. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
  113. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
  114. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
  115. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
  116. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
  117. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
  118. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
  119. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
  120. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
  121. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
  122. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
  123. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
  124. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
  125. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
  126. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
  127. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
  128. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
  129. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
  130. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
  131. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
  132. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
  133. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
  134. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
  135. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
  136. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
  137. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
  138. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
  139. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
  140. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
  141. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
  142. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
  143. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
  144. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
  145. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
  146. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
  147. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
  148. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
  149. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
  150. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
  151. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
  152. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
  153. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
  154. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
  155. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
  156. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
  157. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
  158. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
  159. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
  160. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
  161. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
  162. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
  163. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
  164. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
  165. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
  166. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
  167. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
  168. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
  169. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
  170. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
  171. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
  172. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
  173. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
  174. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
  175. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
  176. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
  177. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
  178. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
  179. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
  180. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
  181. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
  182. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
  183. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
  184. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
  185. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
  186. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
  187. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
  188. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
  189. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
  190. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
  191. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
  192. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
  193. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
  194. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
  195. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
  196. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
  197. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
  198. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
  199. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
  200. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
  201. package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
  202. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
  203. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
  204. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
  205. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
  206. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
  207. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
  208. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
  209. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
  210. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
  211. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
  212. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
  213. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
  214. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
  215. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
  216. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
  217. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
  218. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
  219. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
  220. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
  221. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
  222. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
  223. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
  224. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
  225. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
  226. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
  227. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
  228. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
  229. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
  230. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
  231. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
  232. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
  233. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
  234. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
  235. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
  236. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
  237. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
  238. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
  239. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
  241. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
  242. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
  243. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
  244. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
  245. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
  246. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
  247. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
  248. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
  249. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
  250. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
  251. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
  252. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
  253. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
  254. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
  255. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
  256. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
  257. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
  258. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
  259. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
  260. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
  261. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
  262. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
  263. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
  264. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
  265. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
  266. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
  267. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
  268. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
  269. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
  270. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
  271. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
  272. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
  273. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
  274. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
  275. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
  276. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
  277. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
  278. package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
  279. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
  280. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
  281. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
  282. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
  283. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
  284. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
  285. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
  286. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
  287. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
  288. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
  289. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
  290. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
  291. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
  292. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
  293. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
  294. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
  295. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
  296. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
  297. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
  298. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
  299. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
  300. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
  301. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
  302. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
  303. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
  304. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
  305. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
  306. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
  307. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
  308. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
  309. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
  310. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
  311. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
  312. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
  313. package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
  314. package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
  315. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
  316. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
  317. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
  318. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
  319. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
  320. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
  321. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
  322. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
  323. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
  324. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
  325. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
  326. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
  327. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
  328. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
  329. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
  330. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
  331. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
  332. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
  333. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
  334. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
  335. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
  336. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
  337. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
  338. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
  339. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
  340. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
  341. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
  342. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
  343. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
  344. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
  345. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
  346. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
  347. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
  348. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
  349. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
  350. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
  351. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
  352. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
  353. package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
  354. package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
  355. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
  356. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
  357. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
  358. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
  359. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
  360. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
  361. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
  362. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
  363. package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
  364. package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
  365. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
  366. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
  367. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
  368. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
  369. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
  370. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
  371. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
  372. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
  373. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
  374. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
  375. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
  376. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
  377. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
  378. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
  379. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
  380. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
  381. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
  382. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
  383. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
  384. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
  385. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
  386. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
  387. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
  388. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
  389. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
  390. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
  391. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
  392. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
  393. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
  394. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
  395. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
  396. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
  397. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
  398. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
  399. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
  400. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
  401. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
  402. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
  403. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
  404. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
  405. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
  406. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
  407. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
  408. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
  409. package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
  410. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
  411. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
  412. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
  413. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
  414. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
  415. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
  416. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
  417. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
  418. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
  419. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
  420. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
  421. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
  422. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
  423. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
  424. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
  425. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
  426. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
  427. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
  428. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
  429. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
  430. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
  431. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
  432. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
  433. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
  434. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
  435. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
  436. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
  437. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
  438. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
  439. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
  440. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
  441. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
  442. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
  443. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
  444. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
  445. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
  446. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
  447. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
  448. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
  449. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
  450. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
  451. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
  452. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
  453. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
  454. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
  455. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
  456. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
  457. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
  458. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
  459. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
  460. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
  461. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
  462. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
  463. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
  464. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
  465. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
  466. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
  467. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
  468. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
  469. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
  470. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
  471. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
  472. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
  473. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
  474. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
  475. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
  476. package/dist/core/web/public/next/index.html +1 -1
  477. package/dist/release-dependency-inventory.json +1 -1
  478. package/package.json +1 -1
  479. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
  480. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
  481. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
  482. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
  483. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
  484. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
  485. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
  486. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
  487. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
  488. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
  489. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
  490. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
  491. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
  492. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
  493. package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
  494. package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
  495. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
  496. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
  497. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
  498. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
  499. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
  500. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
  501. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
  502. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
  503. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
  504. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
  505. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
  506. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
  507. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
  508. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
  509. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
  510. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
  511. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
  512. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
  513. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
  514. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
  515. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
  516. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
  517. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
  518. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
  519. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
  520. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
  521. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
  522. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
  523. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
  524. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
  525. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
  526. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
  527. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
  528. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
  529. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
  530. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
  531. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
  532. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
  533. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
  534. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
  535. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
  536. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
  537. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
  538. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
  539. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
  540. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
  541. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
  542. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
  543. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
  544. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
  545. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
  546. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
  547. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
  548. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
  549. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
  550. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
  551. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
  552. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
  553. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
  554. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
  555. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
  556. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
  557. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
  558. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
  559. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
  560. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
  561. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
  562. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
  563. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
  564. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
  565. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
  566. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
  567. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
  568. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
  569. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
  570. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
  571. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
  572. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
  573. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
  574. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
  575. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
  576. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
  577. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
  578. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
  579. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
  580. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
  581. package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
  582. package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
  583. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
  584. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
  585. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
  586. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
  587. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
  588. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
  589. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
  590. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
  591. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
  592. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
  593. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
  594. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
  595. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
  596. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
  597. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
  598. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
  599. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
  600. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
  601. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
  602. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
  603. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
  604. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
  605. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
  606. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
  607. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
  608. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
  609. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
  610. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
  611. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
  612. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
  613. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
  614. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
  615. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
  616. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
  617. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
  618. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
  619. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
  620. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
  621. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
  622. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
  623. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
  624. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
  625. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
  626. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
  627. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
  628. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
  629. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
  630. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
  631. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
  632. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
  633. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
  634. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
  635. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
  636. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
  637. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
  638. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
  639. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
  640. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
  641. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
  642. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
  643. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
  644. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
  645. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
  646. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
  647. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
  648. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
  649. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
  650. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
  651. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
  652. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
  653. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
  654. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
  655. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
  656. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
  657. package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
  658. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
  659. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
  660. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
  661. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
  662. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
  663. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
  664. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
  665. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
  666. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
  667. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
  668. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
  669. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
  670. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
  671. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
  672. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
  673. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
  674. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
  675. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
  676. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
  677. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
  678. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
  679. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
  680. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
  681. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
  682. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
  683. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
  684. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
  685. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
  686. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
  687. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
  688. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
  689. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
  690. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
  691. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
  692. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
  693. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
  694. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
  695. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
  696. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
  697. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
  698. package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
  699. package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
  700. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
  701. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
  702. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
  703. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
  704. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
  705. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
  706. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
  707. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
  708. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
  709. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
  710. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
  711. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
  712. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
  713. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
  714. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
  715. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
  716. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
  717. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
  718. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
  719. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
  720. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
  721. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
  722. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
  723. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
  724. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
  725. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
  726. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
  727. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
  728. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
  729. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
  730. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
  731. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
  732. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
  733. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
  734. package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
  735. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
  736. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
  737. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
  738. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
  739. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
  740. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
  741. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
  742. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
  743. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
  744. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
  745. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
  746. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
  747. package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
  748. package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
  749. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
  750. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
  751. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
  752. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
  753. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
  754. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
  755. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
  756. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
  757. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
  758. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
  759. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
  760. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
  761. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
  762. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
  763. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
  764. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
  765. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
  766. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
  767. package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
  768. package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
  769. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
  770. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
  771. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
  772. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
  773. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
  774. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
  775. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
  776. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
  777. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
  778. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
  779. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
  780. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
  781. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
  782. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
  783. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
  784. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
  785. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
  786. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
  787. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
  788. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
  789. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
  790. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
  791. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
  792. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
  793. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
  794. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
  795. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
  796. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
  797. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
  798. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
  799. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
  800. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
  801. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
  802. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
  803. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
  804. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
  805. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
  806. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
  807. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
  808. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
  809. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
  810. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
  811. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
  812. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
  813. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
  814. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
  815. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
  816. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
  817. package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
  818. package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
  819. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
  820. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
  821. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
  822. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
  823. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
  824. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
  825. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
  826. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
  827. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
  828. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
  829. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
  830. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
  831. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
  832. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
  833. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
  834. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
  835. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
  836. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
  837. package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
  838. package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
  839. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
  840. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
  841. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
  842. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
  843. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
  844. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
  845. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
  846. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
  847. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
  848. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
  849. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
  850. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
  851. package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
  852. package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
  853. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
  854. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
  855. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
  856. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
  857. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
  858. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
  859. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
  860. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
  861. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
  862. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
  863. package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
  864. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
  865. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
  866. package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
  867. package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
  868. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
  869. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
  870. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
  871. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
  872. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
  873. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
  874. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
  875. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
  876. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
  877. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
  878. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
  879. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
  880. package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
  881. package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
  882. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
  883. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
  884. package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
  885. package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
  886. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
  887. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
  888. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
  889. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
  890. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
  891. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
  892. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
  893. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
  894. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
  895. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
  896. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
  897. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
  898. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
  899. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
  900. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
  901. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
  902. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
  903. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
  904. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
  905. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
  906. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
  907. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
  908. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
  909. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
  910. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
  911. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
  912. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
  913. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
  914. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
  915. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
  916. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
  917. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
  918. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
  919. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
  920. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
  921. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
  922. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
  923. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
  924. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
  925. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
  926. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
  927. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
  928. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
  929. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudBudgetForm-D5ajpoMe.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/command-model.ts","../../../../../../src/web-ui/routes/verse/cloud/CloudBudgetForm.tsx"],"sourcesContent":["/**\n * routes/verse/command/command-model.ts — the pure numbers behind Command's\n * KPI row, \"Since you looked\" strip, seat burn-downs and the Needs-you card\n * (unit C7; SPEC-310B §6, SPEC-310C §5).\n *\n * Honesty (docs/VERSE-TELEMETRY-V2.md): a KPI whose source did not answer\n * is \"—\", and a delta is computed only when BOTH windows are fully known — a\n * week with one unreadable day has no honest \"vs prior 7d\". Framework-free;\n * tested directly.\n */\nimport type { FleetLiveSnapshotV1, FleetLiveRun } from '../../../../core/fleet/fleet-types.js';\nimport type { LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport type { LearningStateV1 } from '../../../../core/learn/harness-types.js';\nimport type { NeedsYouItem, NeedsYouSeverity, VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { FleetHistoryDay, FleetHistoryResponse } from '../../../../core/verse/fleet-history-types.js';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport type { CapacityHistoryResponse } from '../../../../core/routing/capacity-history-types.js';\nimport type { SeatReason, SeatReasonKind } from '../../../../core/routing/types.js';\nimport type { VerseSeat } from '../../../../core/verse/types.js';\nimport { classifyWindow } from '../../../../core/routing/headroom.js';\nimport { describeResetAt } from '../../../../core/verse/seat-readiness.js';\nimport type { EffectivePolicy } from '../../../../core/authority/types.js';\nimport type { StatTileDelta } from '../../../components/charts/StatTile.js';\nimport { asSentence, localTimes, parseLegacyReason } from '../fleet/why-seat-model.js';\n\nconst DAY = 86_400_000;\nconst HOUR = 3_600_000;\n\n// ---------------------------------------------------------------------------\n// Windows over the daily history\n// ---------------------------------------------------------------------------\n\n/** Sum of `pick` over days [end-len, end); null if any day in the window is unknown or missing. */\nexport function windowSum(days: readonly FleetHistoryDay[], pick: (d: FleetHistoryDay) => number | null, len: number, endOffset = 0): number | null {\n const end = days.length - endOffset;\n const start = end - len;\n if (start < 0 || len <= 0) return null;\n let total = 0;\n for (let i = start; i < end; i++) {\n const v = pick(days[i]!);\n if (v === null || !Number.isFinite(v)) return null;\n total += v;\n }\n return total;\n}\n\n/** The last `len` values of `pick`, oldest first (nulls kept — the sparkline breaks there). */\nexport function lastValues(days: readonly FleetHistoryDay[], pick: (d: FleetHistoryDay) => number | null, len: number): (number | null)[] {\n return days.slice(Math.max(0, days.length - len)).map(pick);\n}\n\nfunction mean(values: readonly (number | null)[]): number | null {\n const known = values.filter((v): v is number => v !== null && Number.isFinite(v));\n return known.length ? known.reduce((a, b) => a + b, 0) / known.length : null;\n}\n\n// ---------------------------------------------------------------------------\n// KPI row\n// ---------------------------------------------------------------------------\n\nexport interface Kpi {\n id: 'merged' | 'green' | 'cycle' | 'spend' | 'lift';\n label: string;\n /** Display string; \"—\" when unknown. */\n value: string;\n delta: StatTileDelta | null;\n trend: (number | null)[] | undefined;\n trendLabel: string;\n caption: string;\n}\n\nexport interface KpiInputs {\n fleet: FleetLiveSnapshotV1 | null;\n history: FleetHistoryResponse | null;\n learning: LearningStateV1 | null;\n policy: EffectivePolicy | null;\n /**\n * Accepted but no longer read: the spend caption used to list every paid\n * seat's window usage, which the seat burn-downs already show. Kept so\n * callers need not change.\n */\n budget?: BudgetView | null;\n}\n\n/**\n * The per-token (metered API) part of a day's spend, when the server splits\n * it out. WHY not `estCostUsd`: that field prices EVERY run's tokens from a\n * static table — Claude/Codex/Grok subscription CLI runs included — so\n * showing it as \"spend vs the metered cap\" reported subscription work as a\n * budget breach (review 3.10 c10; the default grant's cap is $0/day).\n * Subscriptions are not billed per token: their cost is window usage, shown\n * as percent. fleet-history reports `meteredCostUsd` per day (per-token API\n * engines only — core/verse/fleet-history.ts `runBilling`); a server that\n * predates it leaves the figure unknown — \"—\", never the mixed estimate.\n */\nexport function meteredCost(d: FleetHistoryDay): number | null {\n const v = (d as FleetHistoryDay & { meteredCostUsd?: number | null }).meteredCostUsd;\n return typeof v === 'number' && Number.isFinite(v) && v >= 0 ? v : null;\n}\n\nconst signedInt = (v: number) => (v > 0 ? `+${v}` : String(v));\nconst signedPts = (v: number) => `${v > 0 ? '+' : ''}${v.toFixed(1)}`;\nconst signedUsd = (v: number) => `${v > 0 ? '+' : v < 0 ? '−' : ''}$${Math.abs(v).toFixed(2)}`;\n\n/** \"2h 14m\", \"38m\", \"3d 2h\". */\nexport function formatSpan(ms: number | null): string {\n if (ms === null || !Number.isFinite(ms) || ms < 0) return '—';\n const m = Math.round(ms / 60_000);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 48) return m % 60 ? `${h}h ${m % 60}m` : `${h}h`;\n const d = Math.floor(h / 24);\n return h % 24 ? `${d}d ${h % 24}h` : `${d}d`;\n}\n\n/** Mean daily post-merge green % across repos, per day (oldest first, 14 days). */\nexport function greenTrend(fleet: FleetLiveSnapshotV1 | null): (number | null)[] {\n if (!fleet || fleet.repos.length === 0) return [];\n const len = Math.max(...fleet.repos.map((r) => r.greenTrend.length));\n return Array.from({ length: len }, (_, i) => mean(fleet.repos.map((r) => r.greenTrend[i - (len - r.greenTrend.length)] ?? null)));\n}\n\nexport function buildKpis({ fleet, history, learning, policy }: KpiInputs): Kpi[] {\n const days = history?.days ?? [];\n const merges = (d: FleetHistoryDay) => d.merges.realized;\n const spend = meteredCost;\n\n // Merged · 7d — the live summary when the daemon answers, else the history window.\n const merged7 = fleet?.summary.merged7d ?? windowSum(days, merges, 7);\n const mergedPrior = windowSum(days, merges, 7, 7);\n const mergedNow = windowSum(days, merges, 7);\n const mergedDelta = mergedNow !== null && mergedPrior !== null ? mergedNow - mergedPrior : null;\n\n // Post-merge green — the 7-day figure plus the 14-day repo trend.\n const green = fleet?.summary.postMergeGreenPct7d ?? null;\n const gTrend = greenTrend(fleet);\n const gNow = gTrend.length >= 14 ? mean(gTrend.slice(-7)) : null;\n const gPrior = gTrend.length >= 14 ? mean(gTrend.slice(-14, -7)) : null;\n const greenDelta = gNow !== null && gPrior !== null ? gNow - gPrior : null;\n\n // Metered spend vs cap — per-token API spend ONLY (see meteredCost).\n const spend7 = windowSum(days, spend, 7);\n const spendPrior = windowSum(days, spend, 7, 7);\n const capPerDay = policy ? policy.spend.meteredUsdPerDay : null;\n const spendValue = spend7 === null ? '—' : `$${spend7.toFixed(2)}${capPerDay !== null ? ` / $${(capPerDay * 7).toFixed(0)}` : ''}`;\n const meteredKnown = days.some((d) => meteredCost(d) !== null);\n // One short line. Subscriptions are window usage, not dollars: they live\n // on the seat burn-downs, not in this caption.\n const capWords = capPerDay === null ? 'per-token APIs only' : capPerDay === 0 ? 'metered APIs off' : `cap $${capPerDay}/day`;\n const spendCaption = meteredKnown ? capWords : `${capWords} · not reported yet`;\n\n // Lift — the active harness's own experiment (null = baseline in force).\n const active = learning?.active ?? null;\n const activeExp = active?.experimentId ? learning?.experiments.find((e) => e.id === active.experimentId) ?? null : null;\n const lift = activeExp?.lift ?? null;\n\n return [\n {\n id: 'merged',\n label: 'Merged · 7d',\n value: merged7 === null ? '—' : String(merged7),\n delta: mergedDelta === null ? null : { value: mergedDelta, unit: Math.abs(mergedDelta) === 1 ? 'merge' : 'merges', versus: 'vs prior 7d', goodWhenPositive: true, format: signedInt },\n trend: days.length ? lastValues(days, merges, 14) : undefined,\n trendLabel: 'Merges per day, last 14 days',\n caption: fleet?.summary.mergedToday != null ? `${fleet.summary.mergedToday} today` : 'fleet merges on default branches',\n },\n {\n id: 'green',\n label: 'Post-merge green',\n value: green === null ? '—' : `${Math.round(green)}%`,\n delta: greenDelta === null ? null : { value: greenDelta, unit: 'pts', versus: 'vs prior 7d', goodWhenPositive: true, format: signedPts },\n trend: gTrend.length ? gTrend : undefined,\n trendLabel: 'Post-merge green percent per day',\n caption: green === null ? 'no completed post-merge watch yet' : 'CI + suite 2 h after each merge',\n },\n {\n id: 'cycle',\n label: 'Cycle time',\n value: formatSpan(fleet?.summary.cycleTimeP50Ms7d ?? null),\n delta: null,\n trend: undefined,\n trendLabel: 'Cycle time',\n caption: 'median, proposal → merge, 7d',\n },\n {\n id: 'spend',\n label: 'Metered spend · 7d',\n value: spendValue,\n delta: spend7 !== null && spendPrior !== null ? { value: spend7 - spendPrior, versus: 'vs prior 7d', goodWhenPositive: false, format: signedUsd } : null,\n trend: meteredKnown ? lastValues(days, spend, 14) : undefined,\n trendLabel: 'Metered (per-token API) spend per day',\n caption: spendCaption,\n },\n {\n id: 'lift',\n label: 'Lift',\n value: lift ? `${signedPts(lift.mean)} pts` : '—',\n delta: null,\n trend: undefined,\n trendLabel: 'Harness lift',\n caption: active ? `harness ${active.id} vs baseline${lift ? ` (95% ${signedPts(lift.ciLow)} to ${signedPts(lift.ciHigh)})` : ''}` : 'no harness adopted — defaults in force',\n },\n ];\n}\n\n/**\n * True when the KPI row would say nothing: no merge this week or last, no\n * post-merge reading, no cycle time, no metered spend, no lift — \"0\", four\n * dashes and \"$0.00\". Command drops the row then while its \"Autonomy is off\"\n * banner explains why; a row with any real figure is always kept.\n */\nexport function kpisSayNothing({ fleet, history, learning }: Pick<KpiInputs, 'fleet' | 'history' | 'learning'>): boolean {\n const days = history?.days ?? [];\n const merges = (d: FleetHistoryDay) => d.merges.realized;\n const merged7 = fleet?.summary.merged7d ?? windowSum(days, merges, 7);\n const mergedPrior = windowSum(days, merges, 7, 7);\n const active = learning?.active ?? null;\n const lift = active?.experimentId ? (learning?.experiments.find((e) => e.id === active.experimentId)?.lift ?? null) : null;\n return (\n (merged7 ?? 0) === 0 &&\n (mergedPrior ?? 0) === 0 &&\n (fleet?.summary.postMergeGreenPct7d ?? null) === null &&\n (fleet?.summary.cycleTimeP50Ms7d ?? null) === null &&\n (windowSum(days, meteredCost, 7) ?? 0) === 0 &&\n lift === null\n );\n}\n\n// ---------------------------------------------------------------------------\n// Since you looked\n// ---------------------------------------------------------------------------\n\nexport interface SinceItem {\n id: string;\n text: string;\n tone: 'success' | 'danger' | 'warning' | 'neutral' | 'info';\n}\n\nexport interface SinceInputs {\n /** ISO of the previous visit; null = first visit (nothing is \"new\"). */\n lastLookedAt: string | null;\n fleet: FleetLiveSnapshotV1 | null;\n leader: LeaderStateV1 | null;\n activity: VerseActivityResponse | null;\n}\n\nconst after = (iso: string | null, t: number) => iso !== null && Date.parse(iso) > t;\n\n/** What changed since the operator last opened Command, newest kinds first. */\nexport function sinceYouLooked({ lastLookedAt, fleet, leader, activity }: SinceInputs): SinceItem[] {\n if (!lastLookedAt) return [];\n const t = Date.parse(lastLookedAt);\n if (!Number.isFinite(t)) return [];\n const out: SinceItem[] = [];\n const ended = (fleet?.runs ?? []).filter((r) => after(r.endedAt, t));\n const count = (o: FleetLiveRun['outcome']) => ended.filter((r) => r.outcome === o).length;\n const merged = count('merged');\n const reverted = count('reverted');\n const failed = count('failed') + count('refused');\n if (merged) out.push({ id: 'merged', text: `${merged} merged`, tone: 'success' });\n if (reverted) out.push({ id: 'reverted', text: `${reverted} reverted`, tone: 'danger' });\n if (failed) out.push({ id: 'failed', text: `${failed} refused or failed`, tone: 'warning' });\n const memos = (leader?.timeline ?? []).filter((m) => Date.parse(m.at) > t && m.status === 'ok').length;\n if (memos) out.push({ id: 'memos', text: `${memos} new memo${memos === 1 ? '' : 's'}`, tone: 'info' });\n const fresh = (activity?.needsYou ?? []).filter((i) => Date.parse(i.since) > t).length;\n if (fresh) out.push({ id: 'needs', text: `${fresh} new for you`, tone: 'warning' });\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Needs you (Command card)\n// ---------------------------------------------------------------------------\n\nconst SEVERITY_RANK: Record<NeedsYouSeverity, number> = { high: 0, warn: 1, info: 2 };\n\n/** Most severe first, then newest. Pure — the drawer (C1) owns the full list. */\nexport function rankNeedsYou(items: readonly NeedsYouItem[]): NeedsYouItem[] {\n return [...items].sort((a, b) => SEVERITY_RANK[a.severity] - SEVERITY_RANK[b.severity] || Date.parse(b.since) - Date.parse(a.since));\n}\n\n/**\n * Seat id → the label every other surface names that seat by (\"Claude Max\",\n * never \"claude-a\"): the live roster when the cache holds it, else the\n * budget route's seat info (polled on Command, so present when the roster is\n * not). Both carry the same `VerseSeat.label` for the same id.\n */\nexport function seatNames(\n seats: readonly Pick<VerseSeat, 'id' | 'label'>[] | null | undefined,\n view: Pick<BudgetView, 'seatInfo'> | null | undefined,\n): Map<string, string> {\n const names = new Map<string, string>();\n const put = (id: unknown, label: unknown) => {\n if (typeof id === 'string' && typeof label === 'string' && label.trim().length > 0) names.set(id, label.trim());\n };\n for (const s of view?.seatInfo ?? []) put(s.seatId, s.label);\n for (const s of seats ?? []) put(s.id, s.label);\n return names;\n}\n\n/** Sources that did not answer — the card must not say \"All clear\" while any is listed. */\nexport function silentSources(activity: VerseActivityResponse | null): string[] {\n if (!activity) return [];\n return Object.entries(activity.sources).filter(([, state]) => state !== 'ok').map(([source]) => source);\n}\n\n// ---------------------------------------------------------------------------\n// Seat burn-downs\n// ---------------------------------------------------------------------------\n\nexport type SeatWindow = 'session' | 'weekly';\n\nexport interface SeatReading {\n t: number;\n /** Percent of the window used, 0–100. */\n used: number;\n}\n\n/**\n * Readings are kept per seat WINDOW, not per seat: the binding window can flip\n * between the 5-hour and the weekly window from one poll to the next, and a\n * line that mixed the two would draw a jump that never happened. Seat ids may\n * contain `:` and `/`, never `#` (the server keys its history the same way).\n */\nexport function seriesKey(seatId: string, window: SeatWindow): string {\n return `${seatId}#${window}`;\n}\n\n/**\n * The readings this page has seen since Verse opened, per seat window. The\n * budget route serves ONE reading per seat, so on their own these start the\n * burn-down empty on every load; `mergeSeatHistory` adds the server's recorded\n * history (GET /api/verse/budget/history — core/routing/capacity-history.ts,\n * written by the capacity publishers), so a reload keeps the whole window.\n * Memory only, bounded; never a guessed history.\n *\n * The bound counts CHANGES, not polls: a flat run keeps only its two ends\n * (see `recordReading`). At one poll per 30 s a plain 240-reading ring held\n * two hours — a sliver of a 7-day window — while window percent moves in\n * whole points a few times an hour.\n */\nexport const SEAT_READINGS_MAX = 240;\n/** A merged line (recorded history + this page's readings), flat runs collapsed: a week of changes fits. */\nexport const SEAT_HISTORY_MAX = 2000;\n/** A drop this large between consecutive readings is a window reset: the line starts again. */\nconst RESET_DROP = 20;\n\nfunction isFlatEnd(line: readonly SeatReading[], used: number): boolean {\n const n = line.length;\n return n >= 2 && line[n - 1]!.used === used && line[n - 2]!.used === used;\n}\n\nexport function recordReading(history: Readonly<Record<string, SeatReading[]>>, view: BudgetView | null): Record<string, SeatReading[]> {\n if (!view) return { ...history };\n const t = Date.parse(view.sampledAt);\n if (!Number.isFinite(t)) return { ...history };\n const next: Record<string, SeatReading[]> = { ...history };\n for (const h of view.headroom) {\n const windows: [SeatWindow, number | null][] = [['session', h.sessionUsedPercent], ['weekly', h.weeklyUsedPercent]];\n for (const [window, used] of windows) {\n if (used === null || !Number.isFinite(used)) continue;\n const key = seriesKey(h.seatId, window);\n const prev = next[key] ?? [];\n if (prev.length && prev[prev.length - 1]!.t >= t) continue;\n // A reset (used dropped sharply) starts a new window — drop the old one.\n const fresh = prev.length && used + RESET_DROP < prev[prev.length - 1]!.used ? [] : prev;\n // A flat run keeps only its first and latest reading: the line through\n // them is identical, and the ring then spans hours or days, not minutes.\n next[key] = [...(isFlatEnd(fresh, used) ? fresh.slice(0, -1) : fresh), { t, used }].slice(-SEAT_READINGS_MAX);\n }\n }\n return next;\n}\n\nexport interface MergedSeatHistory {\n /** One line per seat window, oldest first, starting after its last reset. */\n readings: Record<string, SeatReading[]>;\n /** Series keys the server's recorded history contributed readings to. */\n recorded: ReadonlySet<string>;\n}\n\n/**\n * The server's recorded history merged with this page's live readings, per\n * seat window: oldest first, one reading per instant, cut after the last\n * reset drop and with flat runs collapsed — the same rules `recordReading`\n * applies, so the line reads the same either way. `server` is untrusted wire\n * data: malformed series and points are skipped.\n *\n * ONE CLOCK PER STRETCH OF LINE (review 3.10.1). The two sources stamp the\n * same observation differently: a recorded row carries the provider\n * reading's `observedAt` (capacity-history.ts), a live reading the budget\n * route's `sampledAt` — when it was ASKED, which is later, and the budget\n * wire carries no `observedAt` to do better. Interleaved, the same value\n * lands at two instants and an older value can sort after a newer one: a\n * poll just after a reset still serving 85% drew 85 → 3 → 85 → 3. So the\n * recorded history is authoritative for every instant it covers — up to the\n * moment the server answered (`generatedAt`), or its newest row when that is\n * later or `generatedAt` is unreadable — and live readings only extend a\n * recorded line past that point. The server records the snapshot behind\n * each budget read (capacity-history-api.ts, throttled to 15 s), so a live\n * reading hidden this way is recorded at its own `observedAt` by the next\n * history read, and until then the next live poll carries the same value.\n * A live reading after `generatedAt` came from a collector that had already\n * seen every recorded observation, so the extension never runs backwards.\n * Both instants are the Verse server's own clock. A window with no recorded\n * series keeps every live reading.\n */\nexport function mergeSeatHistory(live: Readonly<Record<string, SeatReading[]>>, server: CapacityHistoryResponse | null): MergedSeatHistory {\n const generatedAt = typeof server?.generatedAt === 'string' ? Date.parse(server.generatedAt) : Number.NaN;\n const persisted = new Map<string, SeatReading[]>();\n for (const series of Array.isArray(server?.series) ? server!.series : []) {\n if (!series || typeof series.seatId !== 'string' || (series.window !== 'session' && series.window !== 'weekly') || !Array.isArray(series.points)) continue;\n const points: SeatReading[] = [];\n for (const p of series.points) {\n if (!Array.isArray(p)) continue;\n const [t, used] = p as unknown[];\n if (typeof t === 'number' && Number.isFinite(t) && typeof used === 'number' && Number.isFinite(used) && used >= 0 && used <= 100) points.push({ t, used });\n }\n if (points.length === 0) continue;\n const key = seriesKey(series.seatId, series.window);\n persisted.set(key, [...(persisted.get(key) ?? []), ...points]);\n }\n const readings: Record<string, SeatReading[]> = {};\n const recorded = new Set<string>();\n for (const key of new Set([...Object.keys(live), ...persisted.keys()])) {\n const fromServer = persisted.get(key) ?? [];\n let fromPage = live[key] ?? [];\n if (fromServer.length > 0) {\n recorded.add(key);\n const newestRecorded = Math.max(...fromServer.map((r) => r.t));\n const coveredTo = Number.isFinite(generatedAt) ? Math.max(generatedAt, newestRecorded) : newestRecorded;\n fromPage = fromPage.filter((r) => r.t > coveredTo);\n }\n // Recorded rows can repeat an instant (two series under one key); the\n // last one read stands. Live readings are strictly later than all of them.\n const byT = new Map<number, SeatReading>();\n for (const r of fromServer) byT.set(r.t, r);\n for (const r of fromPage) byT.set(r.t, r);\n const sorted = [...byT.values()].sort((a, b) => a.t - b.t);\n let start = 0;\n for (let i = 1; i < sorted.length; i++) if (sorted[i]!.used + RESET_DROP < sorted[i - 1]!.used) start = i;\n const line: SeatReading[] = [];\n for (const r of sorted.slice(start)) {\n if (isFlatEnd(line, r.used)) line.pop();\n line.push(r);\n }\n readings[key] = line.slice(-SEAT_HISTORY_MAX);\n }\n return { readings, recorded };\n}\n\nexport interface SeatBurn {\n seatId: string;\n label: string;\n engine: 'claude' | 'codex' | 'grok' | 'local';\n window: 'session' | 'weekly' | null;\n /** Remaining percent readings (100 − used), inside [start, resetAt] when the reset is known. */\n points: { t: number; remaining: number | null }[];\n /** `resetAt` minus the window's length; null exactly when `resetAt` is. */\n start: number | null;\n resetAt: number | null;\n /**\n * Where `resetAt` came from: the budget route's machine instant\n * ('provider'), the provider's own reset words read on the clock they name\n * ('words' — see `resetInstantFromWords`), or nowhere (null).\n */\n resetFrom: 'provider' | 'words' | null;\n /**\n * The provider's own reset wording for the binding window, verbatim\n * (\"Sep 25 at 7pm (America/New_York)\"), when the seat roster carries it.\n * Claude publishes ONLY this — never a machine instant. The card always\n * shows the words; when they name a clock time inside this window they\n * also place the reset (`resetFrom: 'words'`), otherwise the card draws the\n * readings with no reset point or projection.\n */\n resetText: string | null;\n reservePercent: number;\n /**\n * The line autonomy stops at IN THE WINDOW THIS CHART DRAWS, as remaining\n * percent (see `bindingLine`); null when that window has no limit.\n */\n line: { value: number; label: string } | null;\n enabled: boolean;\n free: boolean;\n eligible: boolean;\n /**\n * The router's first reason for this seat in words (`seatReasonText`):\n * complete sentences, local times, never the log form's \" (resets <ISO>).\"\n * clause. Null when the route gave none.\n */\n reason: string | null;\n /**\n * True when the server's recorded history contributed to this window's\n * line; false when every point is one this page saw since Verse opened.\n * Picks the card's note when the line starts late in the window.\n */\n recorded: boolean;\n}\n\n/** Length of each provider window, for the chart domain (reset − length → reset). */\nexport const WINDOW_MS = { session: 5 * HOUR, weekly: 7 * DAY } as const;\n\n/**\n * The stop line for the binding window, mirroring core/routing/headroom.ts\n * exactly (review 3.10 d2). The reserve protects the LONG (weekly) window;\n * the 5-hour window is capped by `maxSessionWindowPercent` — except when the\n * seat has no weekly window at all, where the short one carries both limits\n * and the tighter one wins. Drawing the weekly reserve on a 5-hour chart put\n * Mason's balanced cutoff at 60% used instead of 70% and made the verdict say\n * \"autonomy has stopped\" while the server still had the seat eligible.\n *\n * `weeklyUsedPercent === null` stands in for \"no weekly window\": a weekly\n * window whose reading is unknown makes the seat ineligible server-side\n * anyway (unknown usage is never headroom), and the card shows that reason.\n */\nexport function bindingLine(\n h: { bindingWindow: 'session' | 'weekly' | null; weeklyUsedPercent: number | null },\n policy: { reservePercent: number; maxSessionWindowPercent?: number } | undefined,\n): { value: number; label: string } | null {\n if (!policy || h.bindingWindow === null) return null;\n const reserveCeiling = 100 - policy.reservePercent;\n const sessionCeiling = policy.maxSessionWindowPercent ?? 100;\n let ceiling: number;\n let label: string;\n if (h.bindingWindow === 'weekly') {\n ceiling = reserveCeiling;\n label = 'Reserved for you';\n } else if (h.weeklyUsedPercent === null && reserveCeiling < sessionCeiling) {\n ceiling = reserveCeiling;\n label = 'Reserved for you';\n } else {\n ceiling = sessionCeiling;\n label = '5-hour ceiling';\n }\n const value = 100 - ceiling;\n return value > 0 ? { value, label } : null;\n}\n\n/**\n * Axis/verdict time format per window (review 3.10 c17). A weekly window\n * starts exactly seven days before it resets, so weekday + time alone printed\n * \"Sat 10:27 AM … Resets Sat 10:27 AM\"; the weekly form carries the date.\n * It carries ONLY the date (3.10.1): inside one week the weekday repeats what\n * the date says, and at a quarter-width card \"Fri, Sep 18 at 11:46 PM\" +\n * \"Resets Fri, Sep 25 at 11:46 PM\" were wider than the plot and collided.\n */\nexport function burnTimeFormat(window: 'session' | 'weekly' | null): (ms: number) => string {\n const opts: Intl.DateTimeFormatOptions =\n window === 'session'\n ? { weekday: 'short', hour: 'numeric', minute: '2-digit' }\n : { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' };\n return (ms) => {\n const d = new Date(ms);\n return Number.isNaN(d.getTime()) ? '' : d.toLocaleString('en-US', opts);\n };\n}\n\n/**\n * The provider's reset wording for the seat window that plays `binding`'s\n * role. WHY the seat roster and not the budget route: `SeatHeadroom` (the\n * frozen budget wire shape) carries only a machine `resetAt`, which is\n * structurally null for Claude — the provider's sentence lives on the seat's\n * capacity windows. The window is picked with the SAME classifier the server\n * used to choose the binding window (core/routing/headroom.ts), so the words\n * belong to the window the chart draws, not to a per-model window beside it.\n */\nexport function bindingResetText(\n seat: Pick<VerseSeat, 'capacity'> | undefined,\n engine: SeatBurn['engine'],\n binding: 'session' | 'weekly' | null,\n nowMs: number,\n): string | null {\n if (!seat?.capacity || binding === null || engine === 'local') return null;\n for (const w of seat.capacity.windows) {\n const text = typeof w.resetDescription === 'string' ? w.resetDescription.trim() : '';\n if (text.length === 0) continue;\n if (classifyWindow(engine, { id: w.id, usedPercent: w.usedPercent, resetsAt: w.resetsAt, resetDescription: w.resetDescription, limitReached: w.limitReached }, nowMs) === binding) return text;\n }\n return null;\n}\n\n/**\n * \"resets Sep 25 at 7pm (America/New_York)\" from the provider's words. The\n * collector strips the leading \"resets\" (claude-account-usage.ts) but other\n * paths keep it; either way the sentence itself is shown verbatim.\n */\nexport function resetWords(text: string): string {\n return `resets ${text.replace(/^resets\\s+/i, '')}`;\n}\n\nconst MONTHS: readonly string[] = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];\n\n/**\n * The collector's own reset grammar (core/resources/claude-account-usage.ts\n * `RESET`), with the leading \"resets\" optional because other paths keep it.\n * Anything outside it — a changed native format, free prose — stays words.\n */\nconst RESET_WORDS_RE = /^(?:resets\\s+)?(?:([A-Za-z]{3}) ([1-9]|[12]\\d|3[01]) at )?([1-9]|1[0-2])(?::([0-5]\\d))?(am|pm) \\(([A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+){0,2})\\)$/i;\n\ninterface WallClock { y: number; mo: number; d: number; h: number; mi: number }\n\nfunction wallClock(ms: number, fmt: Intl.DateTimeFormat): WallClock | null {\n const parts = fmt.formatToParts(new Date(ms));\n const n = (type: Intl.DateTimeFormatPartTypes) => Number(parts.find((p) => p.type === type)?.value);\n const c = { y: n('year'), mo: n('month') - 1, d: n('day'), h: n('hour') % 24, mi: n('minute') };\n return Object.values(c).every(Number.isFinite) ? c : null;\n}\n\nconst wallAsUtc = (c: WallClock) => Date.UTC(c.y, c.mo, c.d, c.h, c.mi);\n\n/**\n * The instant whose wall clock in `fmt`'s zone reads `want`: start from the\n * wall time as if it were UTC and correct by the zone's offset until the\n * clock agrees. Null when it never does — a time skipped by a DST jump.\n */\nfunction instantAt(want: WallClock, fmt: Intl.DateTimeFormat): number | null {\n const target = wallAsUtc(want);\n let at = target;\n for (let i = 0; i < 3; i++) {\n const seen = wallClock(at, fmt);\n if (!seen) return null;\n const drift = target - wallAsUtc(seen);\n if (drift === 0) return at;\n at += drift;\n }\n return null;\n}\n\n/**\n * The instant named by the provider's reset words — \"Sep 25 at 6:59pm\n * (America/New_York)\" or \"1:40am (America/New_York)\" — or null when the words\n * are not in the collector's grammar or name an unknown zone.\n *\n * WHY this is not \"synthesizing a countdown from a description\"\n * (core/verse/types.ts): the words ARE an instant — a wall-clock minute in a\n * named IANA zone — so reading them on that zone's clock adds nothing the\n * provider did not say. The only thing the words leave out is the year (or,\n * for \"1:40am\", the day), and the candidate nearest `nowMs` is taken; the\n * caller still refuses an instant outside the window's own span\n * (`seatBurns`), so a misread can never stretch or shift the chart by more\n * than the window it draws. Without this, Claude — the seat that matters\n * most — was the one card with no window, no pace line and no projection.\n */\nexport function resetInstantFromWords(text: string, nowMs: number): number | null {\n const m = RESET_WORDS_RE.exec(text.trim());\n if (!m || !Number.isFinite(nowMs)) return null;\n const [, month, day, hour, minute, meridiem, zone] = m;\n let fmt: Intl.DateTimeFormat;\n try {\n fmt = new Intl.DateTimeFormat('en-US', { timeZone: zone, hourCycle: 'h23', year: 'numeric', month: 'numeric', day: 'numeric', hour: 'numeric', minute: 'numeric' });\n } catch {\n return null; // RangeError: not a zone this runtime knows.\n }\n const today = wallClock(nowMs, fmt);\n if (!today) return null;\n const h = (Number(hour) % 12) + (meridiem!.toLowerCase() === 'pm' ? 12 : 0);\n const mi = minute === undefined ? 0 : Number(minute);\n const candidates: WallClock[] = [];\n if (month !== undefined) {\n const mo = MONTHS.indexOf(month.toLowerCase());\n const d = Number(day);\n if (mo < 0) return null;\n for (const y of [today.y - 1, today.y, today.y + 1]) {\n // Feb 30 would roll into March — refuse it rather than move the reset.\n if (new Date(Date.UTC(y, mo, d)).getUTCDate() === d) candidates.push({ y, mo, d, h, mi });\n }\n } else {\n for (const k of [-1, 0, 1]) {\n const date = new Date(Date.UTC(today.y, today.mo, today.d + k));\n candidates.push({ y: date.getUTCFullYear(), mo: date.getUTCMonth(), d: date.getUTCDate(), h, mi });\n }\n }\n let best: number | null = null;\n for (const c of candidates) {\n const at = instantAt(c, fmt);\n if (at !== null && (best === null || Math.abs(at - nowMs) < Math.abs(best - nowMs))) best = at;\n }\n return best;\n}\n\n/**\n * How far a words-derived reset may sit in the past (a reading taken just\n * before the rollover) or beyond one window ahead (the provider rounds its\n * words to the minute or the hour).\n */\nconst WORDS_RESET_SLACK_MS = 15 * 60_000;\n\n/**\n * The binding window's reset instant: the budget route's machine instant when\n * there is one, else the provider's words read on their own clock — but only\n * when that instant can close the window the current reading sits in (no\n * more than one window ahead, no more than a few minutes past). Words that\n * fail either test stay words, and the card says the reset is not placed.\n */\n/** Earliest instant accepted as a real reset (2000-01-01T00:00:00Z). */\nconst PLAUSIBLE_RESET_FLOOR_MS = Date.UTC(2000, 0, 1);\n\nexport function bindingReset(\n machine: string | null,\n resetText: string | null,\n windowMs: number | null,\n nowMs: number,\n): { at: number; from: 'provider' | 'words' } | null {\n const at = machine ? Date.parse(machine) : NaN;\n // A placeholder instant (epoch 0 or anything before 2000) is not a reset —\n // fall through to the provider's words, as if no instant were sent.\n if (Number.isFinite(at) && at >= PLAUSIBLE_RESET_FLOOR_MS) return { at, from: 'provider' };\n if (resetText === null || windowMs === null) return null;\n const words = resetInstantFromWords(resetText, nowMs);\n if (words === null || words < nowMs - WORDS_RESET_SLACK_MS || words > nowMs + windowMs + WORDS_RESET_SLACK_MS) return null;\n return { at: words, from: 'words' };\n}\n\n// ---------------------------------------------------------------------------\n// Seat reasons, in words (3.10.1)\n// ---------------------------------------------------------------------------\n\n/**\n * The budget route's reasons as data. `SeatHeadroom.reasons` carries each\n * one in the router's LOG form — \"… so autonomy stops at 92% (resets\n * 2026-09-26T03:46:56.000Z).\" (core/routing/seat-reasons.ts\n * `reasonSentence`) — so the reset clause is split back off with the Fleet\n * surface's own parser: an instant → `resetsAt`, Claude's words →\n * `resetDescription`. Non-strings and blanks are skipped (wire data).\n */\nexport function seatReasons(reasons: readonly unknown[] | null | undefined): SeatReason[] {\n if (!Array.isArray(reasons)) return [];\n return reasons.filter((r): r is string => typeof r === 'string' && r.trim().length > 0).map(parseLegacyReason);\n}\n\n/** Two resets this close are the same one (the router and the chart read the same window). */\nconst SAME_RESET_MS = 60_000;\n\n/**\n * Reasons whose reset is, by construction, the BINDING window's: headroom.ts\n * attaches `resetOf(bindingRow.window)` to exactly these. A `spent` reason\n * can name the other window (a spent 5-hour window beside a weekly one that\n * is even further past its reserve), so it is never taken for the chart's.\n */\nconst BINDING_RESET_KINDS: ReadonlySet<SeatReasonKind> = new Set<SeatReasonKind>(['reserve', 'session-ceiling']);\n\n/** Claude's words without the \"resets\" some paths lead with. */\nfunction bareResetWords(text: string | null | undefined): string {\n return typeof text === 'string' ? text.trim().replace(/^resets\\s+/i, '') : '';\n}\n\n/**\n * The binding window's reset words from the router's own reasons — the\n * fallback when the roster (read from cache, never fetched here) has none,\n * so a card never says \"reset time not reported\" beside a reason that names\n * the reset.\n */\nexport function reasonResetText(reasons: readonly SeatReason[]): string | null {\n for (const r of reasons) {\n if (!BINDING_RESET_KINDS.has(r.kind)) continue;\n const words = bareResetWords(r.resetDescription);\n if (words) return words;\n }\n return null;\n}\n\n/**\n * When `reason` lifts, in the viewer's words — or null when the card already\n * says it: the chart's reset marker (\"Resets Sep 26, 11:46 PM\", a machine\n * instant or Claude's words placed on their clock) or the header's verbatim\n * words. A reset the card does NOT show (another window's) is kept: a machine\n * instant in the viewer's zone (`describeResetAt`, as Fleet and Accounts\n * word it), Claude's words verbatim.\n */\nfunction unshownReset(reason: SeatReason, card: { resetAt: number | null; resetText: string | null }, nowMs: number): string | null {\n const at = typeof reason.resetsAt === 'string' ? Date.parse(reason.resetsAt) : Number.NaN;\n if (Number.isFinite(at)) {\n if (card.resetAt !== null && Math.abs(at - card.resetAt) <= SAME_RESET_MS) return null;\n return describeResetAt(reason.resetsAt, nowMs);\n }\n const words = bareResetWords(reason.resetDescription);\n if (!words) return null;\n if (card.resetText !== null && bareResetWords(card.resetText).toLowerCase() === words.toLowerCase()) return null;\n return words;\n}\n\n/**\n * What a card says about why the router holds a seat back: the reason's own\n * sentence (any instant inside it in local time — Fleet's `localTimes`),\n * closed by exactly one full stop, then \"Resets ….\" only when the card does\n * not already show that reset (`unshownReset`). Never the log form: held-back\n * cards printed \"… stops at 92% (resets 2026-09-26T03:46:56.000Z).\" and, for\n * Claude, \"… (resets Sep 25 at 7pm (America/New_York)).\" verbatim.\n */\nexport function seatReasonText(reason: SeatReason | undefined, card: { resetAt: number | null; resetText: string | null }, nowMs: number): string | null {\n if (!reason) return null;\n const text = asSentence(localTimes(reason.text, nowMs));\n if (!text) return null;\n const when = unshownReset(reason, card, nowMs);\n return when ? `${text} Resets ${when}.` : text;\n}\n\n/**\n * One burn-down per seat, paid seats first (they are the ones that run out).\n * `history` is keyed by `seriesKey` (seat + window); each card draws its\n * BINDING window's line. `seats` (the live roster, optional) supplies the\n * provider's reset wording for seats that publish no machine reset time (see\n * `bindingResetText`), which also places their reset when it names a clock\n * time (`bindingReset`); without a roster, a reason held at the binding\n * window's reserve or ceiling supplies the same words (`reasonResetText`).\n * `recorded` (from `mergeSeatHistory`) names the lines the server's recorded\n * history contributed to. Each card's `reason` is the router's first reason\n * in words (`seatReasonText`).\n */\nexport function seatBurns(\n view: BudgetView | null,\n history: Readonly<Record<string, SeatReading[]>>,\n seats?: readonly VerseSeat[] | null,\n recorded?: ReadonlySet<string> | null,\n): SeatBurn[] {\n if (!view) return [];\n const info = new Map(view.seatInfo.map((s) => [s.seatId, s]));\n const roster = new Map((seats ?? []).map((s) => [s.id, s]));\n const sampled = Date.parse(view.sampledAt);\n const nowMs = Number.isFinite(sampled) ? sampled : Date.now();\n return view.headroom\n .map((h): SeatBurn => {\n const i = info.get(h.seatId);\n const engine = i?.engine ?? 'local';\n const windowMs = h.bindingWindow ? WINDOW_MS[h.bindingWindow] : null;\n const reasons = seatReasons(h.reasons);\n const resetText =\n bindingResetText(roster.get(h.seatId), engine, h.bindingWindow, nowMs) ??\n (h.bindingWindow === null || engine === 'local' ? null : reasonResetText(reasons));\n // A reset is only placed on a chart that has a window to put before it.\n const reset = windowMs === null ? null : bindingReset(h.resetAt, resetText, windowMs, nowMs);\n const start = reset && windowMs !== null ? reset.at - windowMs : null;\n const key = h.bindingWindow ? seriesKey(h.seatId, h.bindingWindow) : null;\n const readings = key ? history[key] ?? [] : [];\n return {\n seatId: h.seatId,\n label: i?.label ?? h.seatId,\n engine,\n window: h.bindingWindow,\n points: readings.filter((r) => start === null || r.t >= start).map((r) => ({ t: r.t, remaining: Math.max(0, 100 - r.used) })),\n start,\n resetAt: reset?.at ?? null,\n resetFrom: reset?.from ?? null,\n resetText,\n reservePercent: view.effective[h.seatId]?.reservePercent ?? 0,\n line: bindingLine(h, view.effective[h.seatId]),\n enabled: view.effective[h.seatId]?.enabled ?? false,\n free: i?.free ?? false,\n eligible: h.eligibleForAutonomy,\n reason: seatReasonText(reasons[0], { resetAt: reset?.at ?? null, resetText }, nowMs),\n recorded: key !== null && (recorded?.has(key) ?? false),\n };\n })\n .sort((a, b) => Number(a.free) - Number(b.free) || a.label.localeCompare(b.label));\n}\n\n/** \"Claude 40% reserved for you\" — the first enabled Claude seat's reserve, from the live budget. */\nexport function claudeReserve(view: BudgetView | null): { label: string; percent: number } | null {\n if (!view) return null;\n const seat = view.seatInfo.find((s) => s.engine === 'claude');\n if (!seat) return null;\n const policy = view.effective[seat.seatId];\n return policy ? { label: 'Claude', percent: policy.reservePercent } : null;\n}\n","/**\n * routes/verse/cloud/CloudBudgetForm.tsx — the cloud budget's fields, shared\n * by Command's \"Edit budget\" popover and the Usage \"Cloud credits\" panel\n * (3.11 unit C3), so both edit the same numbers the same way.\n *\n * Save sends ONE update with only the fields that changed (cloud-model\n * budgetPatch). The form re-seeds from the server's budget whenever that\n * budget changes and nothing has been typed, so a save elsewhere (the CLI,\n * the other surface) shows up instead of being silently overwritten.\n */\nimport { useEffect, useRef, useState, type FormEvent } from 'react';\nimport type { CloudBudgetUpdate, CloudBudgetV1 } from '../../../../core/cloud/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Input } from '../../../components/primitives/Input.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { BUDGET_FIELDS, budgetFormFrom, budgetPatch, type BudgetErrors, type BudgetForm } from './cloud-model.js';\nimport styles from './cloud.module.css';\n\nexport interface CloudBudgetFormProps {\n budget: CloudBudgetV1;\n /** Runs the save (through the caller's token gate); the form keeps its values until the new budget lands. */\n onSave: (update: CloudBudgetUpdate) => void;\n onCancel?: () => void;\n busy: boolean;\n disabled?: boolean;\n /** The id prefix, so two forms on one page never share field ids. */\n idPrefix: string;\n}\n\nexport function CloudBudgetForm({ budget, onSave, onCancel, busy, disabled = false, idPrefix }: CloudBudgetFormProps) {\n const [form, setForm] = useState<BudgetForm>(() => budgetFormFrom(budget));\n const [errors, setErrors] = useState<BudgetErrors>({});\n const [note, setNote] = useState<string | null>(null);\n const dirty = useRef(false);\n\n // A newer budget from the server replaces the fields only while the\n // operator has not started typing — never under their fingers.\n useEffect(() => {\n if (!dirty.current) setForm(budgetFormFrom(budget));\n }, [budget]);\n\n const edit = (patch: Partial<BudgetForm>) => {\n dirty.current = true;\n setNote(null);\n setForm((prev) => ({ ...prev, ...patch }));\n };\n\n const submit = (event: FormEvent) => {\n event.preventDefault();\n const result = budgetPatch(form, budget);\n if (!result.ok) {\n setErrors(result.errors);\n return;\n }\n setErrors({});\n if (!result.changed) {\n setNote('Nothing changed.');\n return;\n }\n dirty.current = false;\n onSave(result.update);\n };\n\n return (\n <form className={styles.form} onSubmit={submit} noValidate aria-label=\"Cloud budget\">\n <div className={styles.fieldGrid}>\n {BUDGET_FIELDS.map((spec) => (\n <Input\n key={spec.field}\n id={`${idPrefix}-${spec.field}`}\n label={spec.label}\n hint={spec.hint}\n error={errors[spec.field]}\n size=\"sm\"\n inputMode={spec.integer ? 'numeric' : 'decimal'}\n prefix={spec.money ? '$' : undefined}\n value={form[spec.field]}\n disabled={disabled || busy}\n onChange={(e) => edit({ [spec.field]: e.target.value } as Partial<BudgetForm>)}\n />\n ))}\n </div>\n <Switch\n checked={form.selfImprove}\n onChange={(next) => edit({ selfImprove: next })}\n label=\"Verse may launch self-improvement tasks on its own\"\n disabled={disabled || busy}\n />\n {note ? <p className={styles.muted} role=\"status\">{note}</p> : null}\n <div className={styles.formActions}>\n {onCancel ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel} disabled={busy}>\n Cancel\n </Button>\n ) : null}\n <Button type=\"submit\" variant=\"primary\" size=\"sm\" busy={busy} disabled={disabled}>\n Save budget\n </Button>\n </div>\n </form>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/VoiceInput-k3vB_FxV.js","assets/web-speech-q3gDv2ax.js","assets/global-1SED_aTT.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/SkipToContent-c02H5dmz.css","assets/VerseConsoleApp-BmckthwC.css","assets/VoiceInput-Do-EiHxj.css"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,o as n,s as r,t as i}from"./index-BC5Uslm5.js";import{l as a}from"./global-w7KDTTi0.js";import{t as o}from"./focus-trap-BZeH0rVB.js";import{t as s}from"./ProviderLogo-g2YWCmNY.js";import{Bt as c,Ht as l,N as u,d,f,j as p,k as m,w as h}from"./VerseConsoleApp-DjPpZLo1.js";import{V as g,k as _,w as v}from"./VerseShared-Bf-XTHCh.js";import{n as y}from"./verse-bootstrap-query-B3vFD9XK.js";import{c as b}from"./verse-icons-vSkflmRB.js";import{a as x,n as S,r as C,s as w}from"./command-catalog-B0ApAGD0.js";import{t as T}from"./insert-text-BnF_Gm4r.js";import{r as E,t as D}from"./palette-handoff-XL2WWc9I.js";import{t as O}from"./CommandPalette.module-DqfCnLbZ.js";var k=e(r(),1),A=e(n(),1),j={...Object.fromEntries(S.map(e=>[e.id,e.label])),recent:`Recent`},M=[`needs-you`,`recent`,...S.map(e=>e.id).filter(e=>e!==`needs-you`)],N={"needs-you":5,recent:5,chats:8,actions:8,"go-to":6,"seats-apps":5,projects:5};function P(e,t){if(t===0)return!0;let n=e[t-1];return/[\s\-_/.:·›,(]/.test(n)||/[a-z]/.test(n)&&/[A-Z]/.test(e[t])}function F(e,t){let n=e.toLowerCase();if(!n)return 0;let r=t.toLowerCase(),i=r.indexOf(n);if(i>=0){let e=1e3-i*4;return P(t,i)&&(e+=400),i===0&&(e+=200),e}let a=0,o=0,s=-2;for(let e of n){let n=r.indexOf(e,o);if(n<0)return null;a+=n===s+1?30:5,P(t,n)&&(a+=20),a-=Math.min(20,n-o),s=n,o=n+1}return a}function I(e,t){let n=t.trim().split(/\s+/).filter(Boolean);if(n.length===0)return 0;let r=0;for(let t of n){let n=F(t,e.title);for(let r of[e.subtitle??``,...e.keywords]){if(!r)continue;let e=F(t,r);e!==null&&(n=Math.max(n??-1/0,e*.6))}if(n===null)return null;r+=n}return r}function L(e,t){let n=Math.max(0,Math.round((t-Date.parse(e))/1e3));if(!Number.isFinite(n))return`running`;if(n<60)return`running ${n}s`;let r=Math.floor(n/60);return r<60?`running ${r}m ${String(n%60).padStart(2,`0`)}s`:`running ${Math.floor(r/60)}h ${r%60}m`}function R(e,t){let n=Date.parse(e);if(!Number.isFinite(n))return``;let r=Math.round((t-n)/6e4);if(r<1)return`just now`;if(r<60)return`${r}m ago`;let i=Math.round(r/60);return i<36?`${i}h ago`:`${Math.round(i/24)}d ago`}function z(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??e}function B(e,t,n){let r=e.keys[0];return{key:`${n}:cmd:${e.id}`,kind:`command`,group:n,title:e.title,subtitle:e.scope===`chat`||e.scope===`composer`?`in Chat`:e.surface===`command`?`on Command`:e.surface===`mind`?`on Mind`:null,shortcut:r?l(r,t):null,monogram:null,engine:null,keywords:[...e.keywords??[],e.section.toLowerCase()],argument:e.argument?{...e.argument}:null,tone:e.guard?.confirm.destructive?`danger`:`neutral`,payload:{kind:`command`,commandId:e.id}}}function V(e){let t=e.now??Date.now(),n=[];for(let t of e.needsYou)n.push({key:`needs-you:${t.id}`,kind:`needs-you`,group:`needs-you`,title:t.title,subtitle:t.subject.repo??t.subject.seatId??null,shortcut:null,monogram:t.subject.engine?g[t.subject.engine]:null,engine:t.subject.engine,keywords:[t.kind.replace(/-/g,` `),t.source,`needs you`],argument:null,tone:t.severity===`high`?`danger`:t.severity===`warn`?`warn`:`neutral`,payload:{kind:`needs-you`,itemId:t.id}});let r=new Map(e.running.map(e=>[e.sessionId,e])),i=[...e.sessions].sort((e,t)=>{let n=r.has(e.id)||e.status===`running`?0:1,i=r.has(t.id)||t.status===`running`?0:1;return n===i?e.updatedAt<t.updatedAt?1:e.updatedAt>t.updatedAt?-1:0:n-i});for(let e of i){let i=r.get(e.id),a=!!i||e.status===`running`,o=a?i?L(i.startedAt,t):`running`:e.status===`error`?`failed`:R(e.updatedAt,t);n.push({key:`chat:${e.id}`,kind:`chat`,group:`chats`,title:e.title||`Untitled chat`,subtitle:[z(e.projectPath),o].filter(Boolean).join(` · `),shortcut:null,monogram:g[e.engine],engine:e.engine,keywords:[e.model,e.seatId,z(e.projectPath)],argument:null,tone:a?`running`:e.status===`error`?`warn`:`neutral`,payload:{kind:`chat`,sessionId:e.id}})}for(let t of w(`actions`))n.push(B(t,e.platform,`actions`));for(let t of w(`go-to`))n.push(B(t,e.platform,`go-to`));for(let t of e.seats)n.push({key:`seat:${t.id}`,kind:`seat`,group:`seats-apps`,title:`New chat on ${t.label}`,subtitle:t.id,shortcut:null,monogram:g[t.engine],engine:t.engine,keywords:[t.engine,t.label,`seat`,`account`],argument:null,tone:`neutral`,payload:{kind:`seat`,seatId:t.id,label:t.label}});for(let t of e.projects)n.push({key:`project:${t.path}`,kind:`project`,group:`projects`,title:`New chat in ${t.name||z(t.path)}`,subtitle:t.enrolled?`enrolled in the fleet`:null,shortcut:null,monogram:null,engine:null,keywords:[t.name,z(t.path)],argument:null,tone:`neutral`,payload:{kind:`project`,path:t.path,name:t.name||z(t.path)}});return n}function H(e,t){let n=(t,n,r,i,a)=>({key:`arg:${e}:${t}`,kind:`argument`,group:`actions`,title:n,subtitle:r,shortcut:null,monogram:i,engine:a,keywords:[t],argument:null,tone:`neutral`,payload:{kind:`argument`,argument:{kind:e,id:t,label:n}}});switch(e){case`seat`:return t.seats.map(e=>n(e.id,e.label,e.id,g[e.engine],e.engine));case`project`:return t.projects.map(e=>n(e.path,e.name||z(e.path),null,null,null));case`session`:return t.sessions.map(e=>n(e.id,e.title||`Untitled chat`,z(e.projectPath),g[e.engine],e.engine));case`section`:return[];default:return[]}}function U(e,t,n,r){let i=t,a=null,o=i.trimStart().charAt(0);(o===`>`||o===`#`)&&(a=o,i=i.trimStart().slice(1));let s=a?C[a]:null,c=i.trim(),l=new Map,u=(e,t,n)=>{let r=l.get(e.group)??[];r.push({item:e,score:t,order:n}),l.set(e.group,r)};if(c===``&&!a){e.filter(e=>e.group===`needs-you`).slice(0,3).forEach((e,t)=>u(e,0,t));let t=n.map(e=>x(e)).filter(e=>e!==null&&e.group!==null);(t.length>0?t:[`chat.new`,`needs-you.open`,`shortcuts.open`].map(e=>x(e))).slice(0,5).forEach((e,t)=>u(B(e,r,`recent`),0,t))}else e.forEach((e,t)=>{if(s&&e.group!==s)return;let n=c===``?0:I(e,c);n!==null&&u(e,n,t)});let d=[],f=[];for(let e of M){let t=l.get(e);if(!t||t.length===0)continue;let n=t=>e===`chats`&&t.item.tone===`running`?0:1;t.sort((e,t)=>n(e)-n(t)||t.score-e.score||e.order-t.order);let r=a?50:N[e],i=t.slice(0,r);for(let e of i)f.push(e.score);d.push({id:e,label:j[e],items:i.map(e=>e.item)})}let p=0;return c!==``&&f.forEach((e,t)=>{e>f[p]&&(p=t)}),{groups:d,flat:d.flatMap(e=>e.items),prefix:a,best:p}}var W=t(),G=(0,k.lazy)(()=>i(()=>import(`./VoiceInput-k3vB_FxV.js`).then(e=>e.r),__vite__mapDeps([0,1,2,3,4,5,6])));function K({onClose:e=h}){let t=d(),n=_(),r=a(v),i=a(y),l=(0,k.useMemo)(()=>c(),[]),[g,S]=(0,k.useState)(()=>E()??``),[C,w]=(0,k.useState)(0),[j,M]=(0,k.useState)(null),N=(0,k.useRef)(null),P=(0,k.useRef)(null),F=(0,k.useRef)(null),I=(0,k.useId)(),L=(0,k.useId)(),R=(0,k.useRef)(null);R.current=j;let z=(0,k.useCallback)(()=>{R.current?M(null):e()},[e]);o({open:!0,containerRef:N,onClose:z,initialFocusRef:P});let B=(0,k.useMemo)(()=>({needsYou:n.data?.needsYou??[],running:n.data?.running??[],sessions:r.data??i.data?.sessions??[],seats:i.data?.seats??[],projects:i.data?.projects??[],recentActions:t.recentActions,platform:l}),[n.data,r.data,i.data,t.recentActions,l]),K=(0,k.useMemo)(()=>j?.argument?{...U(H(j.argument.kind,B),`>${g}`,[],l),prefix:null}:U(V(B),g,t.recentActions,l),[j,B,g,t.recentActions,l]),q=(0,k.useRef)(g!==``);(0,k.useEffect)(()=>{function e(e){let t=e.detail;E(),typeof t==`string`&&t&&(M(null),S(t),q.current=!0,P.current?.focus())}return window.addEventListener(D,e),()=>window.removeEventListener(D,e)},[]);let J=(0,k.useCallback)(e=>{let t=P.current;S(n=>T(n,e.replace(/[.!?]+$/,``),t?.selectionStart??null,t?.selectionEnd??null).value),q.current=!0},[]);(0,k.useEffect)(()=>{if(q.current){q.current=!1,w(K.best);return}w(e=>K.flat.length===0?0:Math.min(e,K.flat.length-1))},[K]),(0,k.useEffect)(()=>{(F.current?.querySelector(`[data-index="${C}"]`))?.scrollIntoView?.({block:`nearest`})},[C]);function Y(e){M(e),S(``),w(0)}function X(t){if(!t)return;let n=t.payload;if(n.kind===`command`){let t=x(n.commandId);if(t?.argument){Y(t);return}e(),f(n.commandId,{via:`palette`});return}switch(e(),n.kind){case`needs-you`:m({split:`all`,focusId:n.itemId});break;case`chat`:p(n.sessionId);break;case`seat`:f(`chat.new-on`,{via:`palette`,argument:{kind:`seat`,id:n.seatId,label:n.label}});break;case`project`:u(`new-chat`,{projectPath:n.path});break;case`argument`:j&&f(j.id,{via:`palette`,argument:n.argument})}}function Z(t){let n=K.flat.length,r=t.key;if((t.metaKey||t.ctrlKey)&&r.toLowerCase()===`k`){t.preventDefault(),e();return}switch(r){case`ArrowDown`:t.preventDefault(),n>0&&w(e=>(e+1)%n);return;case`ArrowUp`:t.preventDefault(),n>0&&w(e=>(e-1+n)%n);return;case`Home`:n>0&&(t.preventDefault(),w(0));return;case`End`:n>0&&(t.preventDefault(),w(n-1));return;case`Enter`:t.preventDefault(),X(K.flat[C]);return;case`Tab`:{t.preventDefault();let e=K.flat[C],n=e?.payload.kind===`command`?x(e.payload.commandId):null;n?.argument&&Y(n);return}case`Backspace`:j&&g===``&&(t.preventDefault(),M(null));return;case`Escape`:t.preventDefault(),t.stopPropagation(),j?M(null):e();return;default:return}}let Q=K.flat[C],ee=j?.argument?`${j.argument.prompt}…`:`Search chats, actions and places`,$=-1;return(0,A.createPortal)((0,W.jsx)(`div`,{className:O.backdrop,onMouseDown:t=>t.target===t.currentTarget&&e(),children:(0,W.jsxs)(`div`,{ref:N,className:O.panel,role:`dialog`,"aria-modal":`true`,"aria-labelledby":L,"data-verse-overlay":`palette`,children:[(0,W.jsx)(`h2`,{id:L,className:`visually-hidden`,children:`Command palette`}),(0,W.jsxs)(`div`,{className:O.field,children:[j?(0,W.jsxs)(`span`,{className:O.crumb,children:[j.title.replace(/…$/,``),(0,W.jsx)(`span`,{"aria-hidden":`true`,children:` ›`})]}):null,(0,W.jsx)(`input`,{ref:P,className:O.input,value:g,placeholder:ee,"aria-label":j?.argument?j.argument.prompt:`Search commands`,role:`combobox`,"aria-expanded":`true`,"aria-controls":I,"aria-autocomplete":`list`,"aria-activedescendant":Q?`${I}-${C}`:void 0,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,onChange:e=>{S(e.target.value),q.current=!0},onKeyDown:Z}),(0,W.jsx)(k.Suspense,{fallback:null,children:(0,W.jsx)(G,{surface:`palette`,targetRef:P,onInsert:J})})]}),(0,W.jsx)(`div`,{ref:F,id:I,className:O.list,role:`listbox`,"aria-label":`Results`,children:K.flat.length===0?(0,W.jsx)(`p`,{className:O.empty,children:j?`No ${j.argument?.prompt.toLowerCase()??`match`} matches “${g}”.`:`Nothing matches “${g.trim()}”.`}):K.groups.map(e=>(0,W.jsxs)(`div`,{role:`group`,"aria-label":j?j.argument?.prompt??e.label:e.label,className:O.group,children:[(0,W.jsx)(`div`,{className:O.groupLabel,"aria-hidden":`true`,children:j?j.argument?.prompt:e.label}),e.items.map(e=>{$+=1;let t=$;return(0,W.jsxs)(`div`,{id:`${I}-${t}`,"data-index":t,role:`option`,"aria-selected":t===C,className:O.item,"data-tone":e.tone,onMouseMove:()=>t!==C&&w(t),onMouseDown:e=>e.preventDefault(),onClick:()=>X(e),children:[(0,W.jsx)(`span`,{className:O.lead,"aria-hidden":`true`,children:e.monogram?(0,W.jsx)(`span`,{className:O.monogram,"data-engine":e.engine??void 0,children:e.engine?(0,W.jsx)(s,{engine:e.engine,size:13}):e.monogram}):(0,W.jsx)(`span`,{className:O.bullet,"data-kind":e.kind})}),(0,W.jsxs)(`span`,{className:O.text,children:[(0,W.jsx)(`span`,{className:O.title,children:e.title}),e.subtitle?(0,W.jsx)(`span`,{className:O.subtitle,children:e.subtitle}):null]}),(0,W.jsxs)(`span`,{className:O.trail,children:[e.argument?(0,W.jsx)(`kbd`,{className:O.key,children:`⇥`}):null,e.shortcut?(0,W.jsx)(`kbd`,{className:O.key,children:e.shortcut}):null]})]},e.key)})]},e.id))}),(0,W.jsxs)(`div`,{className:O.foot,"aria-hidden":`true`,children:[(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`kbd`,{className:O.key,children:`↑↓`}),` move`]}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`kbd`,{className:O.key,children:(0,W.jsx)(b,{})}),` run`]}),Q?.argument?(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`kbd`,{className:O.key,children:`⇥`}),` `,Q.argument.prompt.toLowerCase()]}):null,(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`kbd`,{className:O.key,children:`esc`}),` `,j?`back`:`close`]}),j?null:(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`kbd`,{className:O.key,children:`>`}),` actions only · `,(0,W.jsx)(`kbd`,{className:O.key,children:`#`}),` chats only`]})]}),(0,W.jsx)(`p`,{className:`visually-hidden`,role:`status`,"aria-live":`polite`,children:K.flat.length===1?`1 result`:`${K.flat.length} results`})]})}),document.body)}export{K as CommandPalette};
3
+ //# sourceMappingURL=CommandPalette-ONyqYZzt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/palette-model.ts","../../../../../../src/web-ui/routes/verse/shell/CommandPalette.tsx"],"sourcesContent":["/**\n * routes/verse/shell/palette-model.ts — the ⌘K palette as data (unit C1;\n * SPEC-310C §1 \"⌘K palette\"). Pure: items in, ranked groups out.\n *\n * Needs you › Chats (running first) › Actions › Go to › Seats & Apps › Projects\n *\n * `>` limits results to actions, `#` to chats (command-catalog PALETTE_PREFIXES).\n * An empty query shows what needs you (top 3) and the last 5 actions run.\n * Tab on an item with an argument (\"New chat on…\") lists its candidates.\n *\n * Ranking is a small fuzzy matcher, not a library: every query word must\n * match (title or keywords), contiguous and word-start matches win, and the\n * catalog's order breaks ties — so \"stop\" puts \"Stop running chats…\" above a\n * chat that merely contains an s, t, o and p.\n */\nimport type { VerseProject, VerseSeat, VerseSession } from '../../../data/api-types.js';\nimport {\n ENGINE_MONOGRAM,\n type NeedsYouItem,\n type VerseActivityRunning,\n} from '../../../../core/verse/workbench-types.js';\nimport {\n formatChord,\n paletteCommands,\n PALETTE_GROUPS,\n PALETTE_PREFIXES,\n PALETTE_RECENT_LIMIT,\n findCommand,\n type CommandArgumentKind,\n type KeyPlatform,\n type PaletteGroupId,\n type WorkbenchCommand,\n} from './command-catalog.js';\n\nexport type PaletteItemKind = 'needs-you' | 'chat' | 'command' | 'seat' | 'project' | 'argument';\n\nexport interface PaletteItem {\n /** Unique across the whole list (React key + active-descendant id). */\n key: string;\n kind: PaletteItemKind;\n group: PaletteGroupId | 'recent';\n title: string;\n /** Muted second part of the row. */\n subtitle: string | null;\n /** Right-aligned shortcut (\"⇧⌘B\"), when the command has one. */\n shortcut: string | null;\n /** A one-letter engine monogram for chats and seats; null otherwise. */\n monogram: string | null;\n engine: VerseSession['engine'] | null;\n /** Extra words that match but are not shown. */\n keywords: readonly string[];\n /** Tab fills this. */\n argument: { kind: CommandArgumentKind; prompt: string } | null;\n /** Painted as a warning (running chat, high-severity item). */\n tone: 'neutral' | 'running' | 'warn' | 'danger';\n /** What Enter does — interpreted by the component. */\n payload:\n | { kind: 'needs-you'; itemId: string }\n | { kind: 'chat'; sessionId: string }\n | { kind: 'command'; commandId: string }\n | { kind: 'seat'; seatId: string; label: string }\n | { kind: 'project'; path: string; name: string }\n | { kind: 'argument'; argument: { kind: CommandArgumentKind; id: string; label: string } };\n}\n\nexport interface PaletteInput {\n needsYou: readonly NeedsYouItem[];\n running: readonly VerseActivityRunning[];\n sessions: readonly VerseSession[];\n seats: readonly VerseSeat[];\n projects: readonly VerseProject[];\n recentActions: readonly string[];\n platform: KeyPlatform;\n now?: number;\n}\n\nexport const GROUP_LABEL: Readonly<Record<PaletteGroupId | 'recent', string>> = {\n ...(Object.fromEntries(PALETTE_GROUPS.map((g) => [g.id, g.label])) as Record<PaletteGroupId, string>),\n recent: 'Recent',\n};\n\nconst GROUP_ORDER: readonly (PaletteGroupId | 'recent')[] = [\n 'needs-you',\n 'recent',\n ...PALETTE_GROUPS.map((g) => g.id).filter((id) => id !== 'needs-you'),\n];\n\n/** Per-group caps with a query (the palette is for jumping, not browsing). */\nconst GROUP_CAP: Readonly<Record<PaletteGroupId | 'recent', number>> = {\n 'needs-you': 5,\n recent: PALETTE_RECENT_LIMIT,\n chats: 8,\n actions: 8,\n 'go-to': 6,\n 'seats-apps': 5,\n projects: 5,\n};\n\n// ---------------------------------------------------------------------------\n// Matching\n// ---------------------------------------------------------------------------\n\nfunction isWordStart(text: string, index: number): boolean {\n if (index === 0) return true;\n const prev = text[index - 1]!;\n return /[\\s\\-_/.:·›,(]/.test(prev) || (/[a-z]/.test(prev) && /[A-Z]/.test(text[index]!));\n}\n\n/**\n * Score one query word against one text; null = no match. Contiguous beats\n * scattered, word-start beats mid-word, earlier beats later.\n */\nexport function fuzzyScore(word: string, text: string): number | null {\n const q = word.toLowerCase();\n if (!q) return 0;\n const lower = text.toLowerCase();\n const at = lower.indexOf(q);\n if (at >= 0) {\n // No length penalty: two titles that both START with the word tie, and\n // the catalog's order decides (\"stop\" → Stop running chats… before Stop\n // the fleet…, the everyday action before the drastic one).\n let score = 1_000 - at * 4;\n if (isWordStart(text, at)) score += 400;\n if (at === 0) score += 200;\n return score;\n }\n // Subsequence: every character in order.\n let score = 0;\n let from = 0;\n let prevHit = -2;\n for (const ch of q) {\n const hit = lower.indexOf(ch, from);\n if (hit < 0) return null;\n score += hit === prevHit + 1 ? 30 : 5;\n if (isWordStart(text, hit)) score += 20;\n score -= Math.min(20, hit - from);\n prevHit = hit;\n from = hit + 1;\n }\n return score;\n}\n\n/** Every word must match the title or a keyword; the best field per word counts. */\nexport function matchItem(item: Pick<PaletteItem, 'title' | 'subtitle' | 'keywords'>, query: string): number | null {\n const words = query.trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) return 0;\n let total = 0;\n for (const word of words) {\n let best: number | null = fuzzyScore(word, item.title);\n for (const field of [item.subtitle ?? '', ...item.keywords]) {\n if (!field) continue;\n const s = fuzzyScore(word, field);\n // A keyword / subtitle hit counts, but less than the title itself.\n if (s !== null) best = Math.max(best ?? Number.NEGATIVE_INFINITY, s * 0.6);\n }\n if (best === null) return null;\n total += best;\n }\n return total;\n}\n\n// ---------------------------------------------------------------------------\n// Items\n// ---------------------------------------------------------------------------\n\nfunction elapsed(startedAt: string, now: number): string {\n const s = Math.max(0, Math.round((now - Date.parse(startedAt)) / 1000));\n if (!Number.isFinite(s)) return 'running';\n if (s < 60) return `running ${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `running ${m}m ${String(s % 60).padStart(2, '0')}s`;\n return `running ${Math.floor(m / 60)}h ${m % 60}m`;\n}\n\nfunction relative(iso: string, now: number): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return '';\n const m = Math.round((now - t) / 60_000);\n if (m < 1) return 'just now';\n if (m < 60) return `${m}m ago`;\n const h = Math.round(m / 60);\n if (h < 36) return `${h}h ago`;\n return `${Math.round(h / 24)}d ago`;\n}\n\nfunction projectName(path: string): string {\n const parts = path.split(/[\\\\/]/).filter(Boolean);\n return parts[parts.length - 1] ?? path;\n}\n\nexport function commandItem(command: WorkbenchCommand, platform: KeyPlatform, group: PaletteGroupId | 'recent'): PaletteItem {\n const chord = command.keys[0];\n return {\n key: `${group}:cmd:${command.id}`,\n kind: 'command',\n group,\n title: command.title,\n subtitle: command.scope === 'chat' || command.scope === 'composer' ? 'in Chat' : command.surface === 'command' ? 'on Command' : command.surface === 'mind' ? 'on Mind' : null,\n shortcut: chord ? formatChord(chord, platform) : null,\n monogram: null,\n engine: null,\n keywords: [...(command.keywords ?? []), command.section.toLowerCase()],\n argument: command.argument ? { ...command.argument } : null,\n tone: command.guard?.confirm.destructive ? 'danger' : 'neutral',\n payload: { kind: 'command', commandId: command.id },\n };\n}\n\n/** Every candidate item, before the query. */\nexport function buildPaletteItems(input: PaletteInput): PaletteItem[] {\n const now = input.now ?? Date.now();\n const items: PaletteItem[] = [];\n\n for (const n of input.needsYou) {\n items.push({\n key: `needs-you:${n.id}`,\n kind: 'needs-you',\n group: 'needs-you',\n title: n.title,\n subtitle: n.subject.repo ?? n.subject.seatId ?? null,\n shortcut: null,\n monogram: n.subject.engine ? ENGINE_MONOGRAM[n.subject.engine] : null,\n engine: n.subject.engine,\n keywords: [n.kind.replace(/-/g, ' '), n.source, 'needs you'],\n argument: null,\n tone: n.severity === 'high' ? 'danger' : n.severity === 'warn' ? 'warn' : 'neutral',\n payload: { kind: 'needs-you', itemId: n.id },\n });\n }\n\n const running = new Map(input.running.map((r) => [r.sessionId, r] as const));\n const sessions = [...input.sessions].sort((a, b) => {\n const ra = running.has(a.id) || a.status === 'running' ? 0 : 1;\n const rb = running.has(b.id) || b.status === 'running' ? 0 : 1;\n if (ra !== rb) return ra - rb;\n return a.updatedAt < b.updatedAt ? 1 : a.updatedAt > b.updatedAt ? -1 : 0;\n });\n for (const s of sessions) {\n const live = running.get(s.id);\n const isRunning = !!live || s.status === 'running';\n const status = isRunning ? (live ? elapsed(live.startedAt, now) : 'running') : s.status === 'error' ? 'failed' : relative(s.updatedAt, now);\n items.push({\n key: `chat:${s.id}`,\n kind: 'chat',\n group: 'chats',\n title: s.title || 'Untitled chat',\n subtitle: [projectName(s.projectPath), status].filter(Boolean).join(' · '),\n shortcut: null,\n monogram: ENGINE_MONOGRAM[s.engine],\n engine: s.engine,\n keywords: [s.model, s.seatId, projectName(s.projectPath)],\n argument: null,\n tone: isRunning ? 'running' : s.status === 'error' ? 'warn' : 'neutral',\n payload: { kind: 'chat', sessionId: s.id },\n });\n }\n\n for (const command of paletteCommands('actions')) items.push(commandItem(command, input.platform, 'actions'));\n for (const command of paletteCommands('go-to')) items.push(commandItem(command, input.platform, 'go-to'));\n\n for (const seat of input.seats) {\n items.push({\n key: `seat:${seat.id}`,\n kind: 'seat',\n group: 'seats-apps',\n title: `New chat on ${seat.label}`,\n subtitle: seat.id,\n shortcut: null,\n monogram: ENGINE_MONOGRAM[seat.engine],\n engine: seat.engine,\n keywords: [seat.engine, seat.label, 'seat', 'account'],\n argument: null,\n tone: 'neutral',\n payload: { kind: 'seat', seatId: seat.id, label: seat.label },\n });\n }\n\n for (const project of input.projects) {\n items.push({\n key: `project:${project.path}`,\n kind: 'project',\n group: 'projects',\n title: `New chat in ${project.name || projectName(project.path)}`,\n subtitle: project.enrolled ? 'enrolled in the fleet' : null,\n shortcut: null,\n monogram: null,\n engine: null,\n keywords: [project.name, projectName(project.path)],\n argument: null,\n tone: 'neutral',\n payload: { kind: 'project', path: project.path, name: project.name || projectName(project.path) },\n });\n }\n\n return items;\n}\n\n/** The candidates Tab offers for an argument. */\nexport function argumentItems(kind: CommandArgumentKind, input: PaletteInput): PaletteItem[] {\n const base = (id: string, label: string, subtitle: string | null, monogram: string | null, engine: PaletteItem['engine']): PaletteItem => ({\n key: `arg:${kind}:${id}`,\n kind: 'argument',\n group: 'actions',\n title: label,\n subtitle,\n shortcut: null,\n monogram,\n engine,\n keywords: [id],\n argument: null,\n tone: 'neutral',\n payload: { kind: 'argument', argument: { kind, id, label } },\n });\n switch (kind) {\n case 'seat':\n return input.seats.map((s) => base(s.id, s.label, s.id, ENGINE_MONOGRAM[s.engine], s.engine));\n case 'project':\n return input.projects.map((p) => base(p.path, p.name || projectName(p.path), null, null, null));\n case 'session':\n return input.sessions.map((s) => base(s.id, s.title || 'Untitled chat', projectName(s.projectPath), ENGINE_MONOGRAM[s.engine], s.engine));\n case 'section':\n return [];\n default:\n return [];\n }\n}\n\nexport interface PaletteGroup {\n id: PaletteGroupId | 'recent';\n label: string;\n items: PaletteItem[];\n}\n\nexport interface PaletteView {\n groups: PaletteGroup[];\n /** Flattened, in display order — what ↑/↓ walks. */\n flat: PaletteItem[];\n /** The prefix in force (`>` / `#`), if any. */\n prefix: '>' | '#' | null;\n /**\n * Index into `flat` of the strongest match — what a fresh query highlights,\n * so Enter runs it. Groups keep their fixed order, which means the best hit\n * can sit in a LATER group: \"usage\" hits the resource-bar toggle's\n * \"usage bars\" keyword in Actions above \"Open Usage\" in Go to, and\n * highlighting row 0 made Enter toggle the bar instead of opening Usage.\n * 0 for an empty query (the rows there are unscored).\n */\n best: number;\n}\n\n/** Items → ranked, grouped, capped view for `rawQuery`. */\nexport function paletteView(items: readonly PaletteItem[], rawQuery: string, recentActions: readonly string[], platform: KeyPlatform): PaletteView {\n let query = rawQuery;\n let prefix: '>' | '#' | null = null;\n const first = query.trimStart().charAt(0);\n if (first === '>' || first === '#') {\n prefix = first;\n query = query.trimStart().slice(1);\n }\n const only: PaletteGroupId | null = prefix ? PALETTE_PREFIXES[prefix] : null;\n const trimmed = query.trim();\n\n const groups = new Map<PaletteGroupId | 'recent', Array<{ item: PaletteItem; score: number; order: number }>>();\n const push = (item: PaletteItem, score: number, order: number) => {\n const list = groups.get(item.group) ?? [];\n list.push({ item, score, order });\n groups.set(item.group, list);\n };\n\n if (trimmed === '' && !prefix) {\n // Empty query: what needs you, then what you did last.\n items.filter((i) => i.group === 'needs-you').slice(0, 3).forEach((item, order) => push(item, 0, order));\n const recent = recentActions.map((id) => findCommand(id)).filter((c): c is WorkbenchCommand => c !== null && c.group !== null);\n const shown = recent.length > 0 ? recent : (['chat.new', 'needs-you.open', 'shortcuts.open'] as const).map((id) => findCommand(id)!);\n shown.slice(0, PALETTE_RECENT_LIMIT).forEach((command, order) => push(commandItem(command, platform, 'recent'), 0, order));\n } else {\n items.forEach((item, order) => {\n if (only && item.group !== only) return;\n const score = trimmed === '' ? 0 : matchItem(item, trimmed);\n if (score === null) return;\n push(item, score, order);\n });\n }\n\n const out: PaletteGroup[] = [];\n const flatScores: number[] = [];\n for (const id of GROUP_ORDER) {\n const list = groups.get(id);\n if (!list || list.length === 0) continue;\n // Chats: running first (SPEC-310C §1), then by match. Everything else by\n // match, with catalog / recency order breaking ties.\n const runRank = (e: { item: PaletteItem }) => (id === 'chats' && e.item.tone === 'running' ? 0 : 1);\n list.sort((a, b) => runRank(a) - runRank(b) || b.score - a.score || a.order - b.order);\n const cap = prefix ? 50 : GROUP_CAP[id];\n const shown = list.slice(0, cap);\n for (const e of shown) flatScores.push(e.score);\n out.push({ id, label: GROUP_LABEL[id], items: shown.map((e) => e.item) });\n }\n // Strictly greater: on a tie the earlier row (group order, then rank) wins.\n let best = 0;\n if (trimmed !== '') {\n flatScores.forEach((score, i) => {\n if (score > flatScores[best]!) best = i;\n });\n }\n return { groups: out, flat: out.flatMap((g) => g.items), prefix, best };\n}\n","/**\n * routes/verse/shell/CommandPalette.tsx — ⌘K (unit C1; SPEC-310C §1).\n *\n * Lives in the SHELL chunk (VerseApp imports it statically), so opening it\n * costs one render — no chunk to fetch, no surface to mount — which is how\n * it opens inside the 50 ms budget. It NEVER switches surface on its own:\n * opening it on Fleet leaves Fleet on screen (the pre-3.10 switcher jumped to\n * Chat first). Only running an item navigates, and only when that is what\n * the item is.\n *\n * Keys (the palette owns every key while open):\n * ↑ ↓ move · ↩ run · ⇥ fill the argument (\"New chat on…\" → a seat) ·\n * ⌫ on an empty argument query steps back · Esc closes (or leaves the\n * argument step) · ⌘K closes.\n *\n * Accessibility: a combobox driving a listbox through aria-activedescendant\n * (focus never leaves the input); group headings are presentational labels\n * the options reference, and the result count is announced politely.\n */\nimport { lazy, Suspense, useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { verseBootstrapQuery, verseSessionsQuery } from '../verse-queries.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { ReturnKeyIcon } from '../verse-icons.js';\nimport { closeVerseOverlay, openVerseNeedsYou, openVerseSession, requestVerseCommand } from '../verse-ui-store.js';\nimport { PALETTE_QUERY_EVENT, takePaletteQuery } from '../voice/palette-handoff.js';\nimport { insertDictation } from '../voice/insert-text.js';\nimport { detectKeyPlatform, findCommand, type WorkbenchCommand } from './command-catalog.js';\nimport { argumentItems, buildPaletteItems, paletteView, type PaletteItem } from './palette-model.js';\nimport { executeCatalogCommand } from './run-command.js';\nimport { useActivity } from './useActivity.js';\nimport styles from './CommandPalette.module.css';\nimport { ProviderLogo } from '../../../components/primitives/ProviderLogo.js';\n\n// Dictation (voice/): lazy, so the palette opens as fast as before.\nconst VoiceInput = lazy(() => import('../voice/VoiceInput.js'));\n\nexport interface CommandPaletteProps {\n onClose?: () => void;\n}\n\nexport function CommandPalette({ onClose = closeVerseOverlay }: CommandPaletteProps) {\n const ui = useVerseUi();\n const activity = useActivity();\n const sessions = useQuery(verseSessionsQuery);\n const bootstrap = useQuery(verseBootstrapQuery);\n const platform = useMemo(() => detectKeyPlatform(), []);\n // ⌃⌥⇧V (voice command mode) opens the palette with the spoken words as the query.\n const [query, setQuery] = useState(() => takePaletteQuery() ?? '');\n const [active, setActive] = useState(0);\n const [argFor, setArgFor] = useState<WorkbenchCommand | null>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const listId = useId();\n const labelId = useId();\n\n // The trap owns Escape (it listens in the capture phase, before the input\n // sees the key), so \"Esc leaves the argument step first\" lives here.\n const argRef = useRef<WorkbenchCommand | null>(null);\n argRef.current = argFor;\n const trapClose = useCallback(() => {\n if (argRef.current) setArgFor(null);\n else onClose();\n }, [onClose]);\n useFocusTrap({ open: true, containerRef: panelRef, onClose: trapClose, initialFocusRef: inputRef });\n\n const input = useMemo(\n () => ({\n needsYou: activity.data?.needsYou ?? [],\n running: activity.data?.running ?? [],\n sessions: sessions.data ?? bootstrap.data?.sessions ?? [],\n seats: bootstrap.data?.seats ?? [],\n projects: bootstrap.data?.projects ?? [],\n recentActions: ui.recentActions,\n platform,\n }),\n [activity.data, sessions.data, bootstrap.data, ui.recentActions, platform],\n );\n\n const view = useMemo(() => {\n if (argFor?.argument) {\n const candidates = argumentItems(argFor.argument.kind, input);\n const shown = paletteView(candidates, `>${query}`, [], platform);\n return { ...shown, prefix: null };\n }\n return paletteView(buildPaletteItems(input), query, ui.recentActions, platform);\n }, [argFor, input, query, ui.recentActions, platform]);\n\n // A new query highlights its best match (see PaletteView.best); a data\n // refresh under an unchanged query only keeps the highlight on a real row,\n // so it never yanks a highlight the operator arrowed to.\n const highlightBestRef = useRef(query !== '');\n // A spoken command while the palette is already open replaces the query.\n useEffect(() => {\n function onSpoken(event: Event) {\n const spoken = (event as CustomEvent<unknown>).detail;\n takePaletteQuery();\n if (typeof spoken !== 'string' || !spoken) return;\n setArgFor(null);\n setQuery(spoken);\n highlightBestRef.current = true;\n inputRef.current?.focus();\n }\n window.addEventListener(PALETTE_QUERY_EVENT, onSpoken);\n return () => window.removeEventListener(PALETTE_QUERY_EVENT, onSpoken);\n }, []);\n // Dictating INTO the query (the mic in the field): appended at the caret.\n const insertDictated = useCallback((chunk: string) => {\n const node = inputRef.current;\n setQuery((current) => insertDictation(current, chunk.replace(/[.!?]+$/, ''), node?.selectionStart ?? null, node?.selectionEnd ?? null).value);\n highlightBestRef.current = true;\n }, []);\n useEffect(() => {\n if (highlightBestRef.current) {\n highlightBestRef.current = false;\n setActive(view.best);\n return;\n }\n setActive((i) => (view.flat.length === 0 ? 0 : Math.min(i, view.flat.length - 1)));\n }, [view]);\n\n useEffect(() => {\n const row = listRef.current?.querySelector<HTMLElement>(`[data-index=\"${active}\"]`);\n row?.scrollIntoView?.({ block: 'nearest' });\n }, [active]);\n\n function enterArgument(command: WorkbenchCommand) {\n setArgFor(command);\n setQuery('');\n setActive(0);\n }\n\n function run(item: PaletteItem | undefined) {\n if (!item) return;\n const payload = item.payload;\n if (payload.kind === 'command') {\n const command = findCommand(payload.commandId);\n // Enter on an argument command asks for the argument, like Tab.\n if (command?.argument) {\n enterArgument(command);\n return;\n }\n onClose();\n executeCatalogCommand(payload.commandId, { via: 'palette' });\n return;\n }\n onClose();\n switch (payload.kind) {\n case 'needs-you':\n openVerseNeedsYou({ split: 'all', focusId: payload.itemId });\n break;\n case 'chat':\n openVerseSession(payload.sessionId);\n break;\n case 'seat':\n executeCatalogCommand('chat.new-on', { via: 'palette', argument: { kind: 'seat', id: payload.seatId, label: payload.label } });\n break;\n case 'project':\n requestVerseCommand('new-chat', { projectPath: payload.path });\n break;\n case 'argument':\n if (argFor) executeCatalogCommand(argFor.id, { via: 'palette', argument: payload.argument });\n break;\n default:\n break;\n }\n }\n\n function onKeyDown(event: ReactKeyboardEvent<HTMLInputElement>) {\n const count = view.flat.length;\n const key = event.key;\n if ((event.metaKey || event.ctrlKey) && key.toLowerCase() === 'k') {\n event.preventDefault();\n onClose();\n return;\n }\n switch (key) {\n case 'ArrowDown':\n event.preventDefault();\n if (count > 0) setActive((i) => (i + 1) % count);\n return;\n case 'ArrowUp':\n event.preventDefault();\n if (count > 0) setActive((i) => (i - 1 + count) % count);\n return;\n case 'Home':\n if (count > 0) { event.preventDefault(); setActive(0); }\n return;\n case 'End':\n if (count > 0) { event.preventDefault(); setActive(count - 1); }\n return;\n case 'Enter':\n event.preventDefault();\n run(view.flat[active]);\n return;\n case 'Tab': {\n // Tab never moves focus out of the palette: it fills an argument or does nothing.\n event.preventDefault();\n const item = view.flat[active];\n const command = item?.payload.kind === 'command' ? findCommand(item.payload.commandId) : null;\n if (command?.argument) enterArgument(command);\n return;\n }\n case 'Backspace':\n if (argFor && query === '') {\n event.preventDefault();\n setArgFor(null);\n }\n return;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n if (argFor) setArgFor(null);\n else onClose();\n return;\n default:\n return;\n }\n }\n\n const activeItem = view.flat[active];\n const placeholder = argFor?.argument\n ? `${argFor.argument.prompt}…`\n : 'Search chats, actions and places';\n let index = -1;\n\n return createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\n <div ref={panelRef} className={styles.panel} role=\"dialog\" aria-modal=\"true\" aria-labelledby={labelId} data-verse-overlay=\"palette\">\n <h2 id={labelId} className=\"visually-hidden\">Command palette</h2>\n <div className={styles.field}>\n {argFor ? (\n <span className={styles.crumb}>\n {argFor.title.replace(/…$/, '')}\n <span aria-hidden=\"true\"> ›</span>\n </span>\n ) : null}\n <input\n ref={inputRef}\n className={styles.input}\n value={query}\n placeholder={placeholder}\n aria-label={argFor?.argument ? argFor.argument.prompt : 'Search commands'}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeItem ? `${listId}-${active}` : undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n onChange={(e) => {\n setQuery(e.target.value);\n highlightBestRef.current = true;\n }}\n onKeyDown={onKeyDown}\n />\n <Suspense fallback={null}>\n <VoiceInput surface=\"palette\" targetRef={inputRef} onInsert={insertDictated} />\n </Suspense>\n </div>\n <div ref={listRef} id={listId} className={styles.list} role=\"listbox\" aria-label=\"Results\">\n {view.flat.length === 0 ? (\n <p className={styles.empty}>\n {argFor ? `No ${argFor.argument?.prompt.toLowerCase() ?? 'match'} matches “${query}”.` : `Nothing matches “${query.trim()}”.`}\n </p>\n ) : (\n view.groups.map((group) => (\n <div key={group.id} role=\"group\" aria-label={argFor ? (argFor.argument?.prompt ?? group.label) : group.label} className={styles.group}>\n <div className={styles.groupLabel} aria-hidden=\"true\">\n {argFor ? argFor.argument?.prompt : group.label}\n </div>\n {group.items.map((item) => {\n index += 1;\n const i = index;\n return (\n <div\n key={item.key}\n id={`${listId}-${i}`}\n data-index={i}\n role=\"option\"\n aria-selected={i === active}\n className={styles.item}\n data-tone={item.tone}\n onMouseMove={() => i !== active && setActive(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => run(item)}\n >\n <span className={styles.lead} aria-hidden=\"true\">\n {item.monogram ? (\n <span className={styles.monogram} data-engine={item.engine ?? undefined}>{item.engine ? <ProviderLogo engine={item.engine} size={13} /> : item.monogram}</span>\n ) : (\n <span className={styles.bullet} data-kind={item.kind} />\n )}\n </span>\n <span className={styles.text}>\n <span className={styles.title}>{item.title}</span>\n {item.subtitle ? <span className={styles.subtitle}>{item.subtitle}</span> : null}\n </span>\n <span className={styles.trail}>\n {item.argument ? <kbd className={styles.key}>⇥</kbd> : null}\n {item.shortcut ? <kbd className={styles.key}>{item.shortcut}</kbd> : null}\n </span>\n </div>\n );\n })}\n </div>\n ))\n )}\n </div>\n <div className={styles.foot} aria-hidden=\"true\">\n <span><kbd className={styles.key}>↑↓</kbd> move</span>\n <span><kbd className={styles.key}><ReturnKeyIcon /></kbd> run</span>\n {activeItem?.argument ? <span><kbd className={styles.key}>⇥</kbd> {activeItem.argument.prompt.toLowerCase()}</span> : null}\n <span><kbd className={styles.key}>esc</kbd> {argFor ? 'back' : 'close'}</span>\n {argFor ? null : <span><kbd className={styles.key}>&gt;</kbd> actions only · <kbd className={styles.key}>#</kbd> chats only</span>}\n </div>\n <p className=\"visually-hidden\" role=\"status\" aria-live=\"polite\">\n {view.flat.length === 1 ? '1 result' : `${view.flat.length} results`}\n </p>\n </div>\n </div>,\n document.body,\n );\n}\n"],"file":"CommandPalette-ONyqYZzt.js"}
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EvidenceTimeline-YmKIoxNx.js","assets/types-BGCo0sbt.js","assets/global-1SED_aTT.css","assets/StatusBadge-BVi0IBb9.css","assets/Button-DrnKsvnQ.css","assets/Sheet-ChxlNivX.css","assets/EvidenceTimeline-PBDAiSuG.css"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n,t as r}from"./index-BC5Uslm5.js";import{B as i,K as a,l as o,n as s,u as c}from"./global-w7KDTTi0.js";import{t as l}from"./focus-trap-BZeH0rVB.js";import{t as u}from"./Dialog-DDHg9cuT.js";import{n as d}from"./StatusBadge-Yz7S3kZ2.js";import{t as f}from"./RefreshIndicator-D96C9qiH.js";import{t as p}from"./ProviderLogo-g2YWCmNY.js";import{t as m}from"./Swimlane-CeMBD_FC.js";import{t as h}from"./StatTile-mYm1GPj7.js";import{t as g}from"./percent-text-CSk89zQF.js";import{Bt as _,Ht as v,R as y,gt as b,wt as x,yt as S,zt as C}from"./VerseConsoleApp-DjPpZLo1.js";import{M as w,j as T,k as ee}from"./VerseShared-Bf-XTHCh.js";import"./verse-bootstrap-query-B3vFD9XK.js";import{n as te}from"./open-terminal-request-BT1UE0fz.js";import{m as ne,n as re}from"./verse-model-DAOz9LrY.js";import{t as E}from"./seat-readiness-a5B9iqP-.js";import{y as D}from"./format-V6IiIMAL.js";import{n as ie}from"./budget-queries-Nvx0H2XE.js";import"./health-queries-D3HgrdU_.js";import{c as O,i as k,r as A,s as j,t as M}from"./capacity-strip-model-CBMJ2U-w.js";import{n as N}from"./budget-model-BZyGzAr4.js";import{n as ae,t as P}from"./Button-CstSJwha.js";import{l as oe,v as se,y as ce}from"./icons-C3G-y5j2.js";import"./command-catalog-B0ApAGD0.js";import{t as le}from"./Meter-VXI75VNe.js";import{t as ue}from"./Switch-Cqc_bSoh.js";import{a as de,c as fe,i as pe,s as me,t as he}from"./AutonomyOffState-nO9lIcCv.js";import{n as ge,t as _e}from"./types-IYKrYLku.js";import{C as ve,S as ye,_ as F,a as be,b as xe,c as Se,d as Ce,f as I,h as we,i as Te,l as Ee,m as De,n as Oe,r as ke,u as Ae,v as L,w as je,x as Me,y as Ne}from"./cloud-model-CzKeuxfm.js";import{a as Pe,c as R,i as Fe,n as Ie,o as Le,r as z,s as Re}from"./cloud-queries-CsU54eNn.js";import{t as B}from"./cloud.module-DOP-N4Ch.js";import{l as ze}from"./authority-model-BeDDHF22.js";import{a as V,c as H,l as U,m as Be,o as Ve,s as He}from"./surface-data-hufdOfpz.js";import{i as W,n as Ue,r as We,t as Ge}from"./nav-CUXtg-Iw.js";import{f as Ke,m as qe,p as G,s as Je,v as Ye}from"./live-model-BPyZCTr1.js";import{a as Xe,n as K,r as q,t as J}from"./Surface-DVOAKl2g.js";import{n as Ze,r as Y,t as Qe}from"./actions-Dg6UJTLn.js";import{t as $e}from"./use-guarded-action-DKKjhPKG.js";import{t as et}from"./use-ticker-w1c3SOqK.js";import{n as tt}from"./LeaderCard-Dhq-w_Mf.js";import{t as nt}from"./Input-Cpn9uYj2.js";import{c as rt,s as it}from"./needs-you-model-DL9EEd2L.js";import{t as at}from"./binding-left-DZpq5sLf.js";import{n as ot}from"./fleet-control-queries-BL-Vlf85.js";import{a as st,c as ct,f as lt,m as ut,o as dt,p as ft,r as pt,t as mt,u as ht}from"./CloudBudgetForm-D5ajpoMe.js";import{n as gt}from"./NeedsYouList-CI_Dy-hi.js";var X=e(n(),1),Z=t(),_t={running:`running`,idle:`ok`,paused:`warning`,stopped:`danger`,blocked:`danger`,off:`muted`};function vt(){let e=o(ot,{freshMs:1e4}).data?.value??null;if(!e)return null;let t=C(`surface.fleet`),n=t?v(t,_()):null,r=e.blocker?`fleet-control`:e.grant.state===`active`?`autonomy`:`fleet-control`;return(0,Z.jsxs)(`div`,{className:G.statusLink,"data-testid":`fleet-status-link`,"data-state":e.state,children:[(0,Z.jsxs)(`p`,{className:G.statusLinkLine,children:[(0,Z.jsx)(`span`,{className:G.dot,"data-tone":_t[e.state],"aria-hidden":`true`}),(0,Z.jsx)(`span`,{children:e.headline})]}),(0,Z.jsxs)(P,{size:`sm`,variant:e.blocker?`primary`:`subtle`,onClick:()=>y(`fleet`,r),"aria-keyshortcuts":n??void 0,children:[e.blocker&&e.blocker.action.kind!==`wait`?`${e.blocker.action.label} in Fleet`:`Open Fleet`,n?(0,Z.jsx)(`kbd`,{className:G.kbd,children:n}):null]})]})}var yt={merged:e=>`${Math.round(e)} merged`,green:e=>`${Math.round(e)}%`,spend:e=>`$${e.toFixed(2)}`};function bt({kpis:e}){return(0,Z.jsx)(`div`,{className:Y.kpis,role:`group`,"aria-label":`Key numbers`,children:e.map(e=>(0,Z.jsx)(h,{label:e.label,value:e.value,delta:e.delta,trend:e.trend,trendLabel:e.trendLabel,describeTrend:yt[e.id],caption:e.caption},e.id))})}var xt=3e4,St={high:`Urgent`,warn:`Soon`,info:`FYI`},Ct={approvals:`approvals`,authority:`authority`,fleet:`fleet`,leader:`Leader`,chats:`chats`,accounts:`accounts`};function wt(e,t){if(t.confirm)return{...t.confirm,destructive:t.destructive};if(t.kind===`approve`||t.kind===`reject`||t.kind===`veto`)return{title:`${t.kind===`approve`?`Approve`:t.kind===`reject`?`Reject`:`Veto`}?`,body:rt(e).text,confirmLabel:t.label,destructive:t.destructive}}function Tt(e){let t=e.target;switch(t.kind){case`url`:return/^https:\/\//.test(t.url)?{label:`Open`,href:t.url}:null;case`section`:return{label:`Show`,onOpen:()=>Ue(t.section,t.anchor)};case`session`:return{label:`Open chat`,onOpen:()=>We(t.sessionId)};case`terminal`:return{label:`Open terminal`,onOpen:()=>te({tabId:t.tabId,blockId:null,sessionId:t.sessionId})};case`approval`:case`seat`:return{label:`Open`,onOpen:()=>W(e.id)};default:return null}}function Et(e){return e===null?null:e.replace(/(^|· )(Partial )?([a-z][\w-]*) run$/,(e,t,n,r)=>{let i=ne(r)?re[r]:`${r.charAt(0).toUpperCase()}${r.slice(1)}`;return`${t}${n??``}${i} run`})}function Dt({item:e,view:t,seatNames:n}){let r=e.subject,i=[];if(t.repo&&i.push((0,Z.jsx)(`span`,{className:Y.needsRepo,title:t.repoFull,children:t.repo},`repo`)),r.pr&&i.push((0,Z.jsxs)(`span`,{children:[`#`,r.pr]},`pr`)),r.seatId){let e=n?.get(r.seatId)??r.seatId;i.push((0,Z.jsx)(`span`,{title:e===r.seatId?void 0:r.seatId,children:e},`seat`))}return i.push((0,Z.jsx)(`span`,{title:t.ageStamp,children:t.age},`age`)),(0,Z.jsx)(`span`,{className:Y.needsMeta,children:i.map((e,t)=>(0,Z.jsxs)(X.Fragment,{children:[t>0?(0,Z.jsx)(`span`,{"aria-hidden":`true`,children:`·`}):null,e]},e.key))})}function Ot({item:e,actions:t,now:n,seatNames:r}){let i=Tt(e),a=e.actions.filter(e=>e.request!==null),o=it(e,n),s=Et(o.kindLabel);return(0,Z.jsxs)(`li`,{className:Y.needsRow,"data-severity":e.severity,id:Ge(e.id),children:[(0,Z.jsx)(`span`,{className:Y.sevDot,"data-severity":e.severity,"aria-hidden":`true`}),(0,Z.jsxs)(`div`,{className:Y.needsText,children:[s?(0,Z.jsx)(`span`,{className:Y.needsKind,children:s}):null,(0,Z.jsxs)(`span`,{className:Y.needsTitle,title:o.fullTitle,children:[(0,Z.jsxs)(`span`,{className:`visually-hidden`,children:[St[e.severity],`: `]}),o.title]}),o.run?(0,Z.jsx)(gt,{run:o.run}):null,o.detail?(0,Z.jsx)(`span`,{className:Y.needsDetail,children:o.detail}):null,(0,Z.jsx)(Dt,{item:e,view:o,seatNames:r})]}),(0,Z.jsxs)(`div`,{className:Y.needsActions,children:[a.map(n=>(0,Z.jsx)(P,{size:`sm`,variant:n.destructive?`danger`:n.kind===`approve`?`primary`:`subtle`,disabled:t.busy||t.readOnly,onClick:()=>t.act(()=>Be(n.request.path,n.request.body),`${n.label}: ${o.title}`,{confirm:wt(e,n)}),children:n.label},n.kind)),i?i.href?(0,Z.jsxs)(`a`,{className:Y.linkButton,href:i.href,target:`_blank`,rel:`noopener noreferrer`,children:[i.label,(0,Z.jsx)(oe,{width:12,height:12,"aria-hidden":`true`}),(0,Z.jsx)(`span`,{className:`visually-hidden`,children:` (opens in a new tab)`})]}):(0,Z.jsx)(`button`,{type:`button`,className:Y.linkButton,onClick:i.onOpen,children:i.label}):null]})]})}function kt(e){return e.status===`unavailable`?{activity:null,loading:!1,reason:e.error?`Needs-you inbox unavailable. ${e.error}`:`The Needs-you inbox is not in this build yet, so this card has no source.`,stale:!1}:e.data?{activity:e.data,loading:!1,reason:null,stale:e.status===`stale`}:{activity:null,loading:!0,reason:null,stale:!1}}function At({state:e,actions:t,fleetLine:n,seatNames:r}){let{activity:i,loading:a,reason:o,stale:s}=kt(e),c=et(xt),l=i?ct(i.needsYou):[],u=ft(i),d=l.slice(0,5),f=i?i.needsYou.length:null;return(0,Z.jsx)(J,{title:f===null?`Needs you`:`Needs you (${f})`,caption:f===null||f===0?void 0:`Most urgent first`,tone:f?`attention`:void 0,actions:(0,Z.jsxs)(`button`,{type:`button`,className:Y.linkButton,onClick:()=>W(),"aria-keyshortcuts":`Meta+J`,children:[`Open all `,(0,Z.jsx)(`kbd`,{className:Y.kbd,children:`⌘J`})]}),children:a?(0,Z.jsx)(`p`,{className:Y.muted,"aria-busy":`true`,children:`Reading the inbox…`}):i?d.length===0?u.length||s?(0,Z.jsx)(K,{tone:`unknown`,children:u.length?`Nothing to show, but ${u.map(e=>Ct[e]??e).join(`, `)} ${u.length===1?`is`:`are`} not answering — this is not an all-clear.`:`Nothing to show, but the last refresh failed — this is not an all-clear.`}):(0,Z.jsxs)(`div`,{className:Y.allClear,role:`status`,children:[(0,Z.jsx)(`span`,{className:Y.allClearTitle,children:`All clear`}),n?(0,Z.jsx)(`span`,{className:Y.allClearBody,children:n}):null]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`ul`,{className:Y.needsList,children:d.map(e=>(0,Z.jsx)(Ot,{item:e,actions:t,now:c,seatNames:r},e.id))}),l.length>d.length?(0,Z.jsxs)(`button`,{type:`button`,className:Y.moreLink,onClick:()=>W(),children:[l.length-d.length,` more in the drawer`]}):null,u.length?(0,Z.jsxs)(`p`,{className:Y.muted,children:[u.map(e=>Ct[e]??e).join(`, `),` not answering — the list may be incomplete.`]}):null,s?(0,Z.jsx)(`p`,{className:Y.muted,children:`The last refresh failed; showing the previous list.`}):null]}):(0,Z.jsxs)(K,{tone:`unknown`,children:[o??`The inbox didn't answer.`,` This is not an all-clear.`]})})}var jt={usable:`ok`,low:`low`,spent:`out`,"signed-out":`out`,unavailable:`out`,checking:`unknown`,"not-checked":`unknown`},Mt=new Set([`usable`,`low`,`checking`]);function Nt(e){let t=e.trim();return/[.!?]$/.test(t)?t:`${t}.`}function Pt(e,t){let n=t.get(e.seatId);if(n)return{status:n.status,why:n.why};if(e.kind!==`local`)return null;let r=[...t.values()].filter(e=>e.free||e.engine===`local`);if(r.length===0)return null;let i=e=>r.find(t=>t.status===e),a=i(`eligible`)??i(`held`)??i(`unknown`)??r[0];return{status:a.status,why:a.why}}var Ft={eligible:`eligible`,held:`held`,off:`off`,unknown:`no-reading`};function It(e,t,n){return e?e.status===`eligible`&&!Mt.has(t.kind)?{kind:`conflict`,word:`Status unknown`,why:`The router lists it as eligible for autonomy, but its readiness check says: ${`${t.label}${t.detail?` — ${t.detail}`:``}`}.`}:{kind:Ft[e.status],word:N[e.status],why:e.why?Nt(e.why):null}:{kind:`none`,word:`Not reported`,why:n?`The budget route does not list this seat.`:null}}function Lt(e,t){if(t.kind===`spent`)return t.detail;let n=e.windows.find(e=>e.binding)??null;return n?.resetText?ht(n.resetText):null}function Rt(e,t,n){let r=M(e,{healthRead:n.healthRead,now:n.now}),i=It(Pt(e,t),r,n.budgetRead),a=jt[r.kind]??`unknown`,o=`${r.label}${r.detail?` · ${r.detail}`:``}`,s,c,l;e.kind===`local`?(s=null,c=r.kind===`usable`?`Free`:r.kind===`unavailable`?`Offline`:`—`,l=r.kind===`usable`?`Runs on this machine`:r.kind===`checking`?`Checking…`:r.detail??r.label):(s=a===`out`?0:at(e),c=a===`out`?r.label:s===null?`—`:`${g(s)} left`,l=Lt(e,r)??(s===null?o:null));let u=e.kind===`local`&&e.localCount>1?`Local models (${e.localCount})`:e.label,d=[`${u}: ${c}`,l&&l!==o?l:null,o,`Autonomy: ${i.word}`].filter(e=>e!==null).join(`. `),f=e.reserve?.percent??null,p=f!==null&&f>0?f:null;return{key:e.seatId,engine:e.engine,name:u,leftPercent:s,level:a,value:c,note:l,status:r.label,autonomy:i,reservePercent:p,reserveLabel:e.reserve?.label??null,spoken:d}}function zt(e,t){let n=O(e),r=[];for(let e of n.values()){let n=e.headroom,i=n?.bindingWindow===`weekly`?n.weeklyUsedPercent:n?.bindingWindow===`session`?n.sessionUsedPercent:null,a=e.free||i==null?null:Math.max(0,Math.min(100,100-i)),o=E(n?.resetAt??null,t),s={kind:Ft[e.status],word:N[e.status],why:e.why?Nt(e.why):null},c=e.free||a===null?`—`:`${g(a)} left`,l=e.free?`Readiness not reported`:o?`resets ${o}`:null;r.push({key:e.seatId,engine:e.engine,name:e.label,leftPercent:a,level:a===null?`unknown`:a<=0?`out`:`ok`,value:c,note:l,status:`Readiness not reported`,autonomy:s,reservePercent:null,reserveLabel:null,spoken:[`${e.label}: ${c}`,l,`Readiness not reported`,`Autonomy: ${s.word}`].filter(Boolean).join(`. `)})}return r.sort((e,t)=>Number(e.engine===`local`)-Number(t.engine===`local`)||e.name.localeCompare(t.name))}function Bt({rows:e,budget:t,healthRead:n,now:r}){if(e.length===0){let e=t?zt(t,r):[];return{items:e,headline:e.length===0?`No seats reported yet`:`Seat roster not loaded — readiness unknown`}}let i=O(t);return{items:j(e,{healthRead:n,now:r}).map(e=>Rt(e,i,{healthRead:n,budgetRead:t!==null,now:r})),headline:k(e)}}function Vt(e,t){let n=Math.max(1,Math.floor(t));if(e===`compact`)return 1;let r=e===`medium`?3:5;if(n<=r)return e===`medium`&&n===4?2:n;let i=Math.ceil(n/r);return Math.ceil(n/i)}var Q={list:`_list_cx4tx_11`,item:`_item_cx4tx_17`,head:`_head_cx4tx_48`,logo:`_logo_cx4tx_55`,name:`_name_cx4tx_59`,value:`_value_cx4tx_71`,meter:`_meter_cx4tx_90`,reserveZone:`_reserveZone_cx4tx_100`,fill:`_fill_cx4tx_108`,"seat-fill-in":`_seat-fill-in_cx4tx_1`,reserve:`_reserve_cx4tx_100`,foot:`_foot_cx4tx_147`,note:`_note_cx4tx_157`,autonomy:`_autonomy_cx4tx_165`,dot:`_dot_cx4tx_173`,tip:`_tip_cx4tx_204`,tipHead:`_tipHead_cx4tx_205`,tipLine:`_tipLine_cx4tx_206`,tipHint:`_tipHint_cx4tx_207`};function Ht(){return(0,X.useSyncExternalStore)((0,X.useCallback)(e=>a(`verse-health`,e),[]),()=>i(`verse-health`),()=>i(`verse-health`)).data??null}function Ut({item:e}){return(0,Z.jsxs)(`div`,{className:Q.tip,children:[(0,Z.jsxs)(`div`,{className:Q.tipHead,children:[(0,Z.jsx)(p,{engine:e.engine,size:14}),(0,Z.jsx)(`strong`,{children:e.name})]}),(0,Z.jsxs)(`div`,{children:[e.status,e.note&&e.note!==e.status?` · ${e.note}`:``]}),e.reserveLabel?(0,Z.jsx)(`div`,{className:Q.tipLine,children:e.reserveLabel}):null,(0,Z.jsxs)(`div`,{className:Q.tipLine,children:[`Autonomy: `,e.autonomy.word,e.autonomy.why?` — ${e.autonomy.why}`:``]}),(0,Z.jsx)(`div`,{className:Q.tipHint,children:`Click for Resources · ⌘.`})]})}function Wt({item:e}){let t={"--fill":`${e.leftPercent??(e.engine===`local`&&e.value===`Free`?100:0)}%`,...e.reservePercent===null?{}:{"--reserve":`${e.reservePercent}%`}};return(0,Z.jsx)(x,{content:(0,Z.jsx)(Ut,{item:e}),placement:`bottom`,children:(0,Z.jsxs)(`button`,{type:`button`,className:Q.item,"data-level":e.level,"data-free":e.engine===`local`||void 0,"aria-label":`${e.spoken}. Open Resources`,"aria-keyshortcuts":`Meta+.`,onClick:()=>S(),children:[(0,Z.jsxs)(`span`,{className:Q.head,children:[(0,Z.jsx)(p,{engine:e.engine,size:14,className:Q.logo}),(0,Z.jsx)(`span`,{className:Q.name,children:e.name}),(0,Z.jsx)(`span`,{className:Q.value,children:e.value})]}),(0,Z.jsxs)(`span`,{className:Q.meter,style:t,"aria-hidden":`true`,children:[e.reservePercent===null?null:(0,Z.jsx)(`span`,{className:Q.reserveZone}),(0,Z.jsx)(`span`,{className:Q.fill}),e.reservePercent===null?null:(0,Z.jsx)(`span`,{className:Q.reserve})]}),(0,Z.jsxs)(`span`,{className:Q.foot,children:[(0,Z.jsx)(`span`,{className:Q.note,children:e.note??e.status}),(0,Z.jsxs)(`span`,{className:Q.autonomy,"data-kind":e.autonomy.kind,children:[(0,Z.jsx)(`span`,{className:Q.dot,"aria-hidden":`true`}),e.autonomy.word]})]})]})})}function Gt({budget:e,seats:t,now:n}){let r=Ht(),{viewport:i}=b(),a=(0,X.useMemo)(()=>{let i=[];try{i=t&&t.length>0?A(t,{health:r?.seats??null,budget:e,now:n}):[]}catch{i=[]}return Bt({rows:i,budget:e,healthRead:r!==null,now:n})},[t,r,e,n]);return(0,Z.jsx)(J,{title:`Seats`,caption:a.headline,actions:(0,Z.jsxs)(`button`,{type:`button`,className:Y.linkButton,onClick:()=>S(),"aria-keyshortcuts":`Meta+.`,children:[`Resources `,(0,Z.jsx)(`kbd`,{className:Y.kbd,children:`⌘.`})]}),children:a.items.length===0?(0,Z.jsx)(K,{tone:`unknown`,children:`Seat capacity unavailable.`}):(0,Z.jsx)(`div`,{className:Q.list,role:`group`,"aria-label":`Capacity per seat`,style:{"--seat-columns":Vt(i,a.items.length)},children:a.items.map(e=>(0,Z.jsx)(Wt,{item:e},e.key))})})}var Kt=new Intl.NumberFormat(`en-US`);function qt({open:e,onClose:t,actions:n,estimatePerSessionUsd:r,onLaunched:i,defaultRepo:a=Oe}){let o=(0,X.useId)(),c=(0,X.useId)(),l=(0,X.useId)(),d=(0,X.useRef)(null),[f,p]=(0,X.useState)({repo:a,baseBranch:``,prompt:``}),[m,h]=(0,X.useState)({}),[g,_]=(0,X.useState)(null);(0,X.useEffect)(()=>{e&&(h({}),_(null))},[e]);let v=e=>{_(null),p(t=>({...t,...e})),h(t=>{let n={...t};for(let t of Object.keys(e))delete n[t];return n})},y=e=>{e.preventDefault();let r=je(f);if(!r.ok){h(r.errors);return}h({}),_(null),n.act(async()=>{try{let e=await Pe({...r.request,origin:`operator`});p(e=>({...e,prompt:``})),i(e.task),t()}catch(e){if(e instanceof s)throw e;_($e(e))}},`Launch a Claude Code cloud session with this task.`)},b=f.prompt.trim().length;return(0,Z.jsx)(u,{open:e,onClose:t,titleId:o,title:`New cloud task`,description:`Runs as a Claude Code cloud session on your Claude account. It delivers a draft PR; nothing merges on its own.`,widthClassName:B.dialogWidth,initialFocusRef:d,children:(0,Z.jsxs)(`form`,{className:B.form,onSubmit:y,noValidate:!0,children:[(0,Z.jsxs)(`div`,{className:B.fieldGrid,children:[(0,Z.jsx)(nt,{label:`Repository`,hint:`GitHub owner/name`,mono:!0,value:f.repo,error:m.repo,autoComplete:`off`,spellCheck:!1,onChange:e=>v({repo:e.target.value})}),(0,Z.jsx)(nt,{label:`Base branch`,hint:`Must be pushed. Empty uses the default branch.`,mono:!0,value:f.baseBranch,placeholder:`default branch`,error:m.baseBranch,autoComplete:`off`,spellCheck:!1,onChange:e=>v({baseBranch:e.target.value})})]}),(0,Z.jsxs)(`div`,{className:B.textareaField,children:[(0,Z.jsx)(`label`,{className:B.label,htmlFor:c,children:`Task`}),(0,Z.jsx)(`textarea`,{ref:d,id:c,className:B.textarea,value:f.prompt,placeholder:`What should the cloud session do? It reads the repo's own guidance and opens a draft PR.`,"aria-invalid":m.prompt?!0:void 0,"aria-describedby":m.prompt?l:void 0,onChange:e=>v({prompt:e.target.value})}),m.prompt?(0,Z.jsx)(`p`,{id:l,className:B.fieldError,role:`alert`,children:m.prompt}):null,(0,Z.jsxs)(`p`,{className:B.muted,children:[Kt.format(b),` of `,Kt.format(ge),` characters`,r===null?``:` · estimated at ${Ce(r)} per session`]})]}),g?(0,Z.jsx)(`p`,{className:B.notice,"data-tone":`danger`,role:`alert`,children:g}):null,(0,Z.jsxs)(`div`,{className:B.formActions,children:[(0,Z.jsx)(P,{variant:`ghost`,onClick:t,disabled:n.busy,children:`Cancel`}),(0,Z.jsx)(P,{type:`submit`,variant:`primary`,busy:n.busy,children:`Launch`})]})]})})}var Jt=(0,X.lazy)(()=>r(()=>import(`./EvidenceTimeline-YmKIoxNx.js`),__vite__mapDeps([0,1,2,3,4,5,6])));function $({href:e,children:t,label:n}){return(0,Z.jsxs)(`a`,{className:B.link,href:e,target:`_blank`,rel:`noreferrer noopener`,"aria-label":n,children:[t,` `,(0,Z.jsx)(oe,{width:12,height:12,"aria-hidden":`true`})]})}function Yt({task:e,actions:t,now:n}){let r=F(e.sessionUrl,`claude.ai`),i=e.pr?F(e.pr.url,`github.com`):null,a=ye(e,n),[o,s]=(0,X.useState)(!1);return(0,Z.jsxs)(`li`,{className:B.task,"data-state":e.state,children:[(0,Z.jsx)(`span`,{className:B.taskChip,children:(0,Z.jsx)(d,{status:e.state,tone:Te[e.state],children:Me(e)})}),(0,Z.jsxs)(`span`,{className:B.taskMain,children:[(0,Z.jsx)(`p`,{className:B.taskTitle,children:e.title}),(0,Z.jsx)(`span`,{className:B.muted,children:ve(e,n)}),a?(0,Z.jsx)(`span`,{className:B.facts,children:a}):null,(0,Z.jsxs)(`span`,{className:B.taskLinks,children:[r?(0,Z.jsx)($,{href:r,label:`Open “${e.title}” in Claude`,children:`Open in Claude`}):null,i&&e.pr?(0,Z.jsx)($,{href:i,label:`Pull request #${e.pr.number} on GitHub`,children:`PR #${e.pr.number}`}):null,(0,Z.jsx)(`button`,{type:`button`,className:B.linkButton,"aria-haspopup":`dialog`,"aria-label":`Evidence for “${e.title}”`,onClick:()=>s(!0),children:`Evidence`}),Se(e)?(0,Z.jsx)(`button`,{type:`button`,className:B.linkButton,disabled:t.busy||t.readOnly,"aria-label":`Dismiss “${e.title}”`,onClick:()=>t.act(()=>Fe(e.id),`Dismiss the cloud task “${e.title}”.`,{confirm:{title:`Dismiss this cloud task?`,body:`Verse stops tracking “${e.title}”. Nothing on GitHub or claude.ai changes — the session and any PR stay where they are.`,confirmLabel:`Dismiss`}}),children:`Dismiss`}):null]})]}),o?(0,Z.jsx)(X.Suspense,{fallback:null,children:(0,Z.jsx)(Jt,{taskId:e.id,title:e.title,open:!0,onClose:()=>s(!1),now:n})}):null]})}function Xt({overview:e,actions:t,onClose:n}){let r=(0,X.useRef)(null),i=(0,X.useId)();return l({open:!0,containerRef:r,onClose:n}),(0,Z.jsxs)(`div`,{ref:r,className:B.popover,role:`dialog`,"aria-modal":`false`,"aria-labelledby":i,tabIndex:-1,children:[(0,Z.jsx)(`h4`,{id:i,className:B.popoverTitle,children:`Cloud budget`}),(0,Z.jsx)(mt,{idPrefix:`cloud-card-budget`,budget:e.budget.budget,busy:t.busy,disabled:t.readOnly,onSave:e=>t.act(()=>R(e),`Change the cloud budget.`,{onDone:n}),onCancel:n})]})}function Zt({overview:e,actions:t,now:n,onNotice:r}){let i=e.budget,a=Ae(i),o=L(e.seat),s=I(i.canLaunch,`The cloud budget does not allow another launch right now.`),{shown:c,hidden:l}=Ee(e.tasks,n),u=i.budget.selfImprove,f=(0,Z.jsxs)(`p`,{className:B.estimateNote,children:[D(i.estimateNote,n),` `,(0,Z.jsx)($,{href:_e,label:`Check the real balance on claude.ai`,children:`Check usage on claude.ai`})]});return(0,Z.jsxs)(`div`,{className:B.body,children:[o?(0,Z.jsxs)(`div`,{className:B.meterBlock,"data-standing":`not-set-up`,children:[(0,Z.jsxs)(`p`,{className:B.standing,title:we(i.estimatedRemainingUsd),children:[(0,Z.jsx)(d,{status:`not-set-up`,tone:`warning`,children:ke}),(0,Z.jsxs)(`span`,{className:B.muted,children:[be(i.estimatedRemainingUsd),` · estimate`]})]}),(0,Z.jsx)(`p`,{className:B.notice,"data-tone":`warning`,role:`note`,children:o}),f]}):(0,Z.jsxs)(`div`,{className:B.meterBlock,children:[(0,Z.jsx)(le,{value:a.value,max:a.max,label:`Credits remaining`,valueText:a.text,tone:a.tone,"aria-label":`Estimated credits remaining: ${a.text}, ${a.usedText}`}),f,a.warning?(0,Z.jsx)(`p`,{className:B.notice,"data-tone":`warning`,role:`note`,children:a.warning}):null]}),(0,Z.jsx)(`p`,{className:B.facts,children:xe(i,n)}),s?(0,Z.jsxs)(`p`,{className:B.notice,"data-tone":`warning`,role:`note`,"data-testid":`cloud-budget-refused`,children:[`New launches are paused: `,s]}):null,(0,Z.jsxs)(`div`,{className:B.toggleRow,children:[(0,Z.jsx)(ue,{checked:u.enabled,label:`Self-improvement`,disabled:t.busy||t.readOnly,onChange:e=>t.act(()=>R({selfImprove:{enabled:e}}),e?`Let Verse launch its own self-improvement tasks.`:`Stop Verse launching its own self-improvement tasks.`,{onDone:()=>r({tone:`success`,text:e?`Self-improvement is on — up to ${u.maxPerDay} a day.`:`Self-improvement is off.`})})}),(0,Z.jsx)(`span`,{className:`${B.muted} ${B.toggleText}`,children:Ne(i)})]}),c.length===0?(0,Z.jsx)(K,{children:`No cloud tasks yet. Start one with New cloud task, or let Verse improve itself.`}):(0,Z.jsx)(`ul`,{className:B.tasks,"aria-label":`Cloud tasks`,children:c.map(e=>(0,Z.jsx)(Yt,{task:e,actions:t,now:n},e.id))}),l>0?(0,Z.jsxs)(`p`,{className:B.muted,children:[l,` more `,l===1?`task is`:`tasks are`,` listed by ashlr cloud list.`]}):null]})}function Qt({actions:e,now:t=Date.now()}){let n=o(z,{freshMs:15e3}),r=c(z);T(r,Ie);let[i,a]=(0,X.useState)(!1),[s,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(null),f=n.data?.value??null,p=!n.data&&(n.status===`loading`||n.status===`idle`),m=f?De(f.seat,f.budget):null,h=e.busy||e.readOnly,g=f?.backlog.nextUp?f.backlog.items.find(e=>e.id===f.backlog.nextUp)??null:null,_=f?L(f.seat)??I(f.budget.canLaunch,`The cloud budget does not allow another launch right now.`)??(g?null:`The self-improvement backlog has nothing left to launch.`):null,v=f?f.budget.budget.estimatedCostPerSessionUsd:null,y=f?(0,Z.jsxs)(`span`,{className:B.headActions,children:[(0,Z.jsx)(x,{label:m??`Start a cloud session with your own task`,children:(0,Z.jsx)(P,{size:`sm`,variant:`primary`,icon:(0,Z.jsx)(se,{width:14,height:14}),disabled:h||m!==null,onClick:()=>a(!0),children:`New cloud task`})}),(0,Z.jsx)(x,{label:_??(g?`Launch the next backlog item: ${g.title}`:`Launch the next backlog item`),children:(0,Z.jsx)(P,{size:`sm`,disabled:h||_!==null,onClick:()=>{f&&g&&e.act(()=>Re({count:1}),`Launch the next self-improvement task as a cloud session.`,{confirm:{title:`Improve Verse now?`,body:`Launches “${g.title}” as a cloud session on ${g.repo??f.budget.budget.selfImprove.repo}${v===null?``:`, estimated at ${Ce(v)}`}. It delivers a draft PR; nothing merges on its own.`,confirmLabel:`Launch`},onDone:e=>{let t=e.launched[0]??null;if(t)d({tone:`success`,text:`Started “${t.title}”.`,href:F(t.sessionUrl,`claude.ai`),linkText:`Open in Claude`});else{let t=e.skipped[0]?.reason??`Nothing was launched, and the server sent no reason.`;d({tone:`warning`,text:D(t)})}}})},children:`Improve Verse`})}),(0,Z.jsx)(x,{label:`Credits, per-session estimate and daily caps`,children:(0,Z.jsx)(P,{size:`sm`,variant:`ghost`,"aria-expanded":s,"aria-haspopup":`dialog`,onClick:()=>l(e=>!e),disabled:e.readOnly,children:`Edit budget`})}),(0,Z.jsx)(x,{label:`Check GitHub for task updates now`,children:(0,Z.jsx)(ae,{size:`sm`,variant:`ghost`,icon:(0,Z.jsx)(ce,{width:14,height:14}),"aria-label":`Check GitHub for task updates now`,disabled:h,onClick:()=>e.act(()=>Le(),`Re-read the cloud tasks from GitHub.`)})}),s?(0,Z.jsx)(Xt,{overview:f,actions:e,onClose:()=>l(!1)}):null]}):null;return n.data?.available===!1&&n.data.reason===`The cloud lane is not in this build yet.`?null:(0,Z.jsx)(J,{title:`Cloud`,caption:`Claude Code cloud sessions on your Claude credits`,actions:y,children:p?(0,Z.jsx)(`p`,{className:B.muted,"aria-busy":`true`,children:`Reading the cloud lane…`}):f?(0,Z.jsxs)(Z.Fragment,{children:[u?(0,Z.jsx)(`div`,{className:B.notice,"data-tone":u.tone,role:`status`,children:(0,Z.jsxs)(`span`,{className:B.noticeRow,children:[(0,Z.jsxs)(`span`,{children:[u.text,u.href?(0,Z.jsxs)(Z.Fragment,{children:[` `,(0,Z.jsx)($,{href:u.href,children:u.linkText??`Open`})]}):null]}),(0,Z.jsx)(`button`,{type:`button`,className:B.linkButton,onClick:()=>d(null),children:`Dismiss`})]})}):null,(0,Z.jsx)(Zt,{overview:f,actions:e,now:t,onNotice:d}),(0,Z.jsx)(qt,{open:i,onClose:()=>a(!1),actions:e,estimatePerSessionUsd:v,onLaunched:e=>d({tone:`success`,text:`Started “${e.title}”.`,href:F(e.sessionUrl,`claude.ai`),linkText:`Open in Claude`})})]}):(0,Z.jsx)(K,{tone:`unknown`,children:n.data?.reason??n.error?.message??`The cloud lane did not answer.`})})}function $t(e){let t=ze(e);return(0,Z.jsx)(`p`,{className:Y.verdict,"data-testid":`verdict`,children:t.map((e,t)=>(0,Z.jsxs)(`span`,{className:Y.verdictPart,"data-tone":e.tone,children:[t>0?(0,Z.jsx)(`span`,{className:Y.verdictSep,"aria-hidden":`true`,children:` · `}):null,e.text]},e.key))})}var en=`ashlr.verse.command.lastLooked.v1`;function tn(){try{let e=window.localStorage.getItem(en);return e&&Number.isFinite(Date.parse(e))?e:null}catch{return null}}function nn(e){try{window.localStorage.setItem(en,e)}catch{}}function rn(){let e=w(),[t,n]=(0,X.useState)(null),r=(0,X.useRef)(!1);return(0,X.useEffect)(()=>{e&&!r.current&&(n(tn()),nn(new Date().toISOString())),r.current=e},[e]),t}function an({lastLookedAt:e,items:t,now:n=Date.now()}){if(!e||t.length===0)return null;let r=new Date(e);if(!Number.isFinite(r.getTime())||n-r.getTime()<36e5)return null;let i=r.toDateString()===new Date(n).toDateString()?r.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`}):r.toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`,minute:`2-digit`});return(0,Z.jsxs)(`div`,{className:Y.since,role:`group`,"aria-label":`Since you looked at ${i}`,children:[(0,Z.jsxs)(`span`,{className:Y.sinceLead,children:[`Since `,i]}),t.map(e=>(0,Z.jsx)(`span`,{className:Y.sinceChip,"data-tone":e.tone,children:e.text},e.id))]})}var on=36e5,sn=1e4,cn=3e4,ln=3e5;function un(){let{compact:e}=b(),t=o(V),n=o(He),r=ee(),s=o(H),l=o(U,{freshMs:6e4}),u=o(Ve,{freshMs:6e4}),d=o(ie,{freshMs:15e3}),p={authority:c(V),fleet:c(He),leader:c(H),learning:c(U),history:c(Ve),budget:c(ie),fleetControl:c(ot)};T(()=>{p.authority(),p.fleet(),p.fleetControl()},sn),T(()=>{p.leader(),p.budget()},cn),T(()=>{p.history(),p.learning()},ln);let h=et(3e4),g=Ze(),_=Ye(g),v=rn(),y=(0,X.useSyncExternalStore)((0,X.useCallback)(e=>a(`verse-bootstrap`,e),[]),()=>i(`verse-bootstrap`),()=>i(`verse-bootstrap`)).data?.seats??null,x=d.data??null,S=t.data?.value??null,C=n.data?.value??null,w=u.data?.value??null,te=me(C),ne=(0,X.useMemo)(()=>pt({fleet:C,history:w,learning:l.data?.value??null,policy:S?.policy??null,budget:x}),[C,w,l.data,S,x]),re=(0,X.useMemo)(()=>lt(y,x),[y,x]),E=pe(S?.grant.state===`none`),D=t.data&&n.data&&E.readiness!==void 0?de({authority:S,live:C,readiness:E.readiness,setup:E.report}):null,O=(0,X.useMemo)(()=>dt({fleet:C,history:w,learning:l.data?.value??null}),[C,w,l.data]),k=ut({lastLookedAt:v,fleet:C,leader:s.data?.value??null,activity:r.data}),A=e?6:12,j=h-A*on,M=(0,X.useMemo)(()=>C?Je(C.runs,j,h):[],[C,j,h]),N=n.data?C?C.state===`dark`&&M.length===0?fe(C):M.length===0?{kind:`empty`,message:`No runs in the last ${A} hours.`}:{kind:`ready`}:{kind:`unknown`,reason:n.data.reason??`the live fleet view did not answer.`}:{kind:`loading`},ae=C?C.state===`dark`?null:`Fleet ${C.state}: ${C.summary.building??`—`} building, ${C.summary.queued??`—`} queued.`:`Fleet status unknown.`,P=[t,n].some(e=>e.status===`refreshing`);return(0,Z.jsxs)(Xe,{title:`Command`,actions:P?(0,Z.jsx)(f,{}):null,lead:(0,Z.jsxs)(`div`,{className:Y.lead,children:[(0,Z.jsx)(qe,{read:t.data,loading:t.status===`loading`,budgetMode:x?.mode??null,actions:g,compact:e,now:h,grantFlow:_}),(0,Z.jsx)(Qe,{actions:g}),D?(0,Z.jsx)(he,{state:D,here:`command`}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(vt,{}),(0,Z.jsx)($t,{authority:S,building:C?.summary.building??null,mergedToday:C?.summary.mergedToday??null,revertsToday:C?.summary.revertsToday??null,reserve:st(x),darkSince:te}),(0,Z.jsx)(an,{lastLookedAt:v,items:k,now:h})]})]}),children:[(0,Z.jsx)(q,{span:5,children:(0,Z.jsx)(At,{state:r,actions:g,fleetLine:ae,seatNames:re})}),(0,Z.jsx)(q,{span:7,children:(0,Z.jsx)(tt,{read:s.data,loading:s.status===`loading`,actions:g})}),D&&O?null:(0,Z.jsx)(q,{span:12,children:(0,Z.jsx)(bt,{kpis:ne})}),(0,Z.jsx)(q,{span:12,children:(0,Z.jsx)(Gt,{budget:x,seats:y,now:h})}),(0,Z.jsx)(q,{span:12,children:(0,Z.jsx)(Qt,{actions:g,now:h})}),D&&M.length===0?null:(0,Z.jsx)(q,{span:12,children:(0,Z.jsx)(m,{title:`Last ${A} hours`,description:`Fleet lanes; bars coloured by status, outlines are queued or parked`,status:N,lanes:M,from:j,to:h,now:h,toneOf:Ke})}),_.sheet,g.dialogs]})}export{sn as COMMAND_FAST_POLL_MS,ln as COMMAND_HISTORY_POLL_MS,cn as COMMAND_SLOW_POLL_MS,un as CommandSection};
3
+ //# sourceMappingURL=CommandSection-DxNIibnI.js.map