@ashlr/hub 3.11.2 → 3.11.3

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 (262) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/build-identity.json +2 -2
  3. package/dist/core/web/public/next/assets/{ActionMenu-_DhtX2gO.js → ActionMenu-FxXeRbPx.js} +2 -2
  4. package/dist/core/web/public/next/assets/{ActionMenu-_DhtX2gO.js.map → ActionMenu-FxXeRbPx.js.map} +1 -1
  5. package/dist/core/web/public/next/assets/{Advanced-CAAfaBke.js → Advanced-D_eS4472.js} +2 -2
  6. package/dist/core/web/public/next/assets/{Advanced-CAAfaBke.js.map → Advanced-D_eS4472.js.map} +1 -1
  7. package/dist/core/web/public/next/assets/{App-BAywyjE8.js → App-Cj4zKbG3.js} +2 -2
  8. package/dist/core/web/public/next/assets/{App-BAywyjE8.js.map → App-Cj4zKbG3.js.map} +1 -1
  9. package/dist/core/web/public/next/assets/{AppsSection-CUypKeog.js → AppsSection-Ddu_RCQE.js} +2 -2
  10. package/dist/core/web/public/next/assets/{AppsSection-CUypKeog.js.map → AppsSection-Ddu_RCQE.js.map} +1 -1
  11. package/dist/core/web/public/next/assets/{AreaTrend-CblDqC8Q.js → AreaTrend-CDxrQU4b.js} +2 -2
  12. package/dist/core/web/public/next/assets/{AreaTrend-CblDqC8Q.js.map → AreaTrend-CDxrQU4b.js.map} +1 -1
  13. package/dist/core/web/public/next/assets/AutonomySection-DuQkHGD_.js +2 -0
  14. package/dist/core/web/public/next/assets/{AutonomySection-D3d8lYO3.js.map → AutonomySection-DuQkHGD_.js.map} +1 -1
  15. package/dist/core/web/public/next/assets/{BranchBar-DU0jAV1E.js → BranchBar-CLsvOcyK.js} +2 -2
  16. package/dist/core/web/public/next/assets/{BranchBar-DU0jAV1E.js.map → BranchBar-CLsvOcyK.js.map} +1 -1
  17. package/dist/core/web/public/next/assets/{BudgetControl-Mm1ZL4u6.js → BudgetControl-TL3FeZ1D.js} +2 -2
  18. package/dist/core/web/public/next/assets/{BudgetControl-Mm1ZL4u6.js.map → BudgetControl-TL3FeZ1D.js.map} +1 -1
  19. package/dist/core/web/public/next/assets/{BurnDown-C1fgcFqo.js → BurnDown-sFXkUGdB.js} +2 -2
  20. package/dist/core/web/public/next/assets/{BurnDown-C1fgcFqo.js.map → BurnDown-sFXkUGdB.js.map} +1 -1
  21. package/dist/core/web/public/next/assets/{Button-DqgLUZvd.js → Button-HHXgoXGr.js} +2 -2
  22. package/dist/core/web/public/next/assets/{Button-DqgLUZvd.js.map → Button-HHXgoXGr.js.map} +1 -1
  23. package/dist/core/web/public/next/assets/{CapacityStrip-nWFHvqFB.js → CapacityStrip-qReu0RaF.js} +2 -2
  24. package/dist/core/web/public/next/assets/{CapacityStrip-nWFHvqFB.js.map → CapacityStrip-qReu0RaF.js.map} +1 -1
  25. package/dist/core/web/public/next/assets/{ChatSection-DUZNpiVr.js → ChatSection-DZuZfTaC.js} +3 -3
  26. package/dist/core/web/public/next/assets/{ChatSection-DUZNpiVr.js.map → ChatSection-DZuZfTaC.js.map} +1 -1
  27. package/dist/core/web/public/next/assets/{CloudBudgetForm-2OW38o_C.js → CloudBudgetForm-DJbiT1wi.js} +2 -2
  28. package/dist/core/web/public/next/assets/{CloudBudgetForm-2OW38o_C.js.map → CloudBudgetForm-DJbiT1wi.js.map} +1 -1
  29. package/dist/core/web/public/next/assets/{CommandPalette-C5w2o1-r.js → CommandPalette-zYLFZRnj.js} +2 -2
  30. package/dist/core/web/public/next/assets/{CommandPalette-C5w2o1-r.js.map → CommandPalette-zYLFZRnj.js.map} +1 -1
  31. package/dist/core/web/public/next/assets/{CommandSection-Bx2knNqY.js → CommandSection-rIeMK5Ch.js} +2 -2
  32. package/dist/core/web/public/next/assets/{CommandSection-Bx2knNqY.js.map → CommandSection-rIeMK5Ch.js.map} +1 -1
  33. package/dist/core/web/public/next/assets/{ConfirmDialog-B7ZwCQOX.js → ConfirmDialog-DLrLKM0c.js} +2 -2
  34. package/dist/core/web/public/next/assets/{ConfirmDialog-B7ZwCQOX.js.map → ConfirmDialog-DLrLKM0c.js.map} +1 -1
  35. package/dist/core/web/public/next/assets/{Dialog-BpgcEW6b.js → Dialog-BS9Dxi3G.js} +2 -2
  36. package/dist/core/web/public/next/assets/{Dialog-BpgcEW6b.js.map → Dialog-BS9Dxi3G.js.map} +1 -1
  37. package/dist/core/web/public/next/assets/{DiffPane-DpqRUtCx.js → DiffPane-TOmUf3b2.js} +2 -2
  38. package/dist/core/web/public/next/assets/{DiffPane-DpqRUtCx.js.map → DiffPane-TOmUf3b2.js.map} +1 -1
  39. package/dist/core/web/public/next/assets/{DiffViewer-CoV5-nUf.js → DiffViewer-BpH56302.js} +2 -2
  40. package/dist/core/web/public/next/assets/{DiffViewer-CoV5-nUf.js.map → DiffViewer-BpH56302.js.map} +1 -1
  41. package/dist/core/web/public/next/assets/{DockHost-C0Pq7Jak.js → DockHost-DzkzR-HD.js} +2 -2
  42. package/dist/core/web/public/next/assets/{DockHost-C0Pq7Jak.js.map → DockHost-DzkzR-HD.js.map} +1 -1
  43. package/dist/core/web/public/next/assets/{EmptyState-DYW29ncw.js → EmptyState-BqR5YAmf.js} +2 -2
  44. package/dist/core/web/public/next/assets/{EmptyState-DYW29ncw.js.map → EmptyState-BqR5YAmf.js.map} +1 -1
  45. package/dist/core/web/public/next/assets/{Epistemic-DVx6oHzp.js → Epistemic-dhvDTwAZ.js} +2 -2
  46. package/dist/core/web/public/next/assets/{Epistemic-DVx6oHzp.js.map → Epistemic-dhvDTwAZ.js.map} +1 -1
  47. package/dist/core/web/public/next/assets/{FleetSection-DSETviPK.js → FleetSection-ViAb549H.js} +3 -3
  48. package/dist/core/web/public/next/assets/{FleetSection-DSETviPK.js.map → FleetSection-ViAb549H.js.map} +1 -1
  49. package/dist/core/web/public/next/assets/{Funnel-DxiGqJrt.js → Funnel-D2u7Wlzc.js} +2 -2
  50. package/dist/core/web/public/next/assets/{Funnel-DxiGqJrt.js.map → Funnel-D2u7Wlzc.js.map} +1 -1
  51. package/dist/core/web/public/next/assets/{GearTray-C3I89sIt.js → GearTray-Cb2npoxM.js} +2 -2
  52. package/dist/core/web/public/next/assets/{GearTray-C3I89sIt.js.map → GearTray-Cb2npoxM.js.map} +1 -1
  53. package/dist/core/web/public/next/assets/{GrowthSection-C3m2bPEz.js → GrowthSection-C5aDPs8B.js} +2 -2
  54. package/dist/core/web/public/next/assets/{GrowthSection-C3m2bPEz.js.map → GrowthSection-C5aDPs8B.js.map} +1 -1
  55. package/dist/core/web/public/next/assets/{HandoffDialog-Bjb96a0N.js → HandoffDialog-BF3AYg-X.js} +2 -2
  56. package/dist/core/web/public/next/assets/{HandoffDialog-Bjb96a0N.js.map → HandoffDialog-BF3AYg-X.js.map} +1 -1
  57. package/dist/core/web/public/next/assets/{Input-ekTehVaH.js → Input-B5dmGLZx.js} +2 -2
  58. package/dist/core/web/public/next/assets/{Input-ekTehVaH.js.map → Input-B5dmGLZx.js.map} +1 -1
  59. package/dist/core/web/public/next/assets/{LeaderCard-85VBbbaZ.js → LeaderCard-DZrmjDbI.js} +2 -2
  60. package/dist/core/web/public/next/assets/{LeaderCard-85VBbbaZ.js.map → LeaderCard-DZrmjDbI.js.map} +1 -1
  61. package/dist/core/web/public/next/assets/{MatrixHeatmap-Bo8j0QPC.js → MatrixHeatmap-BgEUs2Eu.js} +2 -2
  62. package/dist/core/web/public/next/assets/{MatrixHeatmap-Bo8j0QPC.js.map → MatrixHeatmap-BgEUs2Eu.js.map} +1 -1
  63. package/dist/core/web/public/next/assets/McpSection-DZkiOuoq.js +2 -0
  64. package/dist/core/web/public/next/assets/{McpSection-DvHFaVyp.js.map → McpSection-DZkiOuoq.js.map} +1 -1
  65. package/dist/core/web/public/next/assets/{MessageMarkdown-fsY_ltVa.js → MessageMarkdown-BauY8ZTY.js} +3 -3
  66. package/dist/core/web/public/next/assets/{MessageMarkdown-fsY_ltVa.js.map → MessageMarkdown-BauY8ZTY.js.map} +1 -1
  67. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DDdtu82l.js → MessageMarkdownRenderer-DLBNLfsn.js} +2 -2
  68. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DDdtu82l.js.map → MessageMarkdownRenderer-DLBNLfsn.js.map} +1 -1
  69. package/dist/core/web/public/next/assets/{Meter-CeGDXdDM.js → Meter-DNeocJnD.js} +2 -2
  70. package/dist/core/web/public/next/assets/{Meter-CeGDXdDM.js.map → Meter-DNeocJnD.js.map} +1 -1
  71. package/dist/core/web/public/next/assets/{MindSection-CDVhHvXl.js → MindSection-BvJXFjyX.js} +2 -2
  72. package/dist/core/web/public/next/assets/{MindSection-CDVhHvXl.js.map → MindSection-BvJXFjyX.js.map} +1 -1
  73. package/dist/core/web/public/next/assets/{MutationTokenDialog-DTQzEOHR.js → MutationTokenDialog-mxrw0Yvy.js} +2 -2
  74. package/dist/core/web/public/next/assets/{MutationTokenDialog-DTQzEOHR.js.map → MutationTokenDialog-mxrw0Yvy.js.map} +1 -1
  75. package/dist/core/web/public/next/assets/{NeedsYouDrawer-6AuN0BF3.js → NeedsYouDrawer-CO-Balfp.js} +2 -2
  76. package/dist/core/web/public/next/assets/{NeedsYouDrawer-6AuN0BF3.js.map → NeedsYouDrawer-CO-Balfp.js.map} +1 -1
  77. package/dist/core/web/public/next/assets/{NeedsYouList-ChnRmbSk.js → NeedsYouList-CzDZbzRD.js} +2 -2
  78. package/dist/core/web/public/next/assets/{NeedsYouList-ChnRmbSk.js.map → NeedsYouList-CzDZbzRD.js.map} +1 -1
  79. package/dist/core/web/public/next/assets/{NewChatDialog-B06E7sqg.js → NewChatDialog-B8eJjlFf.js} +2 -2
  80. package/dist/core/web/public/next/assets/{NewChatDialog-B06E7sqg.js.map → NewChatDialog-B8eJjlFf.js.map} +1 -1
  81. package/dist/core/web/public/next/assets/{OnboardingFlow-C2M3zov9.js → OnboardingFlow-Cij6KWat.js} +2 -2
  82. package/dist/core/web/public/next/assets/{OnboardingFlow-C2M3zov9.js.map → OnboardingFlow-Cij6KWat.js.map} +1 -1
  83. package/dist/core/web/public/next/assets/{PreviewPane-Bd6HsX1k.js → PreviewPane-BS-CleCd.js} +2 -2
  84. package/dist/core/web/public/next/assets/{PreviewPane-Bd6HsX1k.js.map → PreviewPane-BS-CleCd.js.map} +1 -1
  85. package/dist/core/web/public/next/assets/{ProviderLogo-Bz7KR5j3.js → ProviderLogo-C5mBg8i0.js} +2 -2
  86. package/dist/core/web/public/next/assets/{ProviderLogo-Bz7KR5j3.js.map → ProviderLogo-C5mBg8i0.js.map} +1 -1
  87. package/dist/core/web/public/next/assets/{RailStatus-CctCuuLy.js → RailStatus-cPRyOmrk.js} +2 -2
  88. package/dist/core/web/public/next/assets/{RailStatus-CctCuuLy.js.map → RailStatus-cPRyOmrk.js.map} +1 -1
  89. package/dist/core/web/public/next/assets/{RefreshIndicator-CKY5BGdD.js → RefreshIndicator-CMwSCiz5.js} +2 -2
  90. package/dist/core/web/public/next/assets/{RefreshIndicator-CKY5BGdD.js.map → RefreshIndicator-CMwSCiz5.js.map} +1 -1
  91. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CspIsW_G.js → ResourcePoolConsoleApp-BFi1opsC.js} +2 -2
  92. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CspIsW_G.js.map → ResourcePoolConsoleApp-BFi1opsC.js.map} +1 -1
  93. package/dist/core/web/public/next/assets/{ResourcesChrome-B7fHZ6zX.js → ResourcesChrome-BJCauW_t.js} +3 -3
  94. package/dist/core/web/public/next/assets/{ResourcesChrome-B7fHZ6zX.js.map → ResourcesChrome-BJCauW_t.js.map} +1 -1
  95. package/dist/core/web/public/next/assets/{ResourcesDrawer-B7-N9n7-.js → ResourcesDrawer-BDecg6nO.js} +2 -2
  96. package/dist/core/web/public/next/assets/{ResourcesDrawer-B7-N9n7-.js.map → ResourcesDrawer-BDecg6nO.js.map} +1 -1
  97. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C_B11J0s.js → RouteErrorBoundary-DYtwc2ja.js} +2 -2
  98. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C_B11J0s.js.map → RouteErrorBoundary-DYtwc2ja.js.map} +1 -1
  99. package/dist/core/web/public/next/assets/{RunInCloudAction-_juw4EXd.js → RunInCloudAction-BEGEEM8O.js} +2 -2
  100. package/dist/core/web/public/next/assets/{RunInCloudAction-_juw4EXd.js.map → RunInCloudAction-BEGEEM8O.js.map} +1 -1
  101. package/dist/core/web/public/next/assets/{SeatSelector-D_YXvkPy.js → SeatSelector-CYHRR7Wp.js} +2 -2
  102. package/dist/core/web/public/next/assets/{SeatSelector-D_YXvkPy.js.map → SeatSelector-CYHRR7Wp.js.map} +1 -1
  103. package/dist/core/web/public/next/assets/{Segmented-DnKP6rr7.js → Segmented-BE53BenI.js} +2 -2
  104. package/dist/core/web/public/next/assets/{Segmented-DnKP6rr7.js.map → Segmented-BE53BenI.js.map} +1 -1
  105. package/dist/core/web/public/next/assets/{Select-DlbUupTX.js → Select-BwSGkHCS.js} +2 -2
  106. package/dist/core/web/public/next/assets/{Select-DlbUupTX.js.map → Select-BwSGkHCS.js.map} +1 -1
  107. package/dist/core/web/public/next/assets/{SessionGate-DnuTZACL.js → SessionGate-e0dFJm9d.js} +2 -2
  108. package/dist/core/web/public/next/assets/{SessionGate-DnuTZACL.js.map → SessionGate-e0dFJm9d.js.map} +1 -1
  109. package/dist/core/web/public/next/assets/{SessionInsightChip-C33-k-Q5.js → SessionInsightChip-CxlSyueJ.js} +2 -2
  110. package/dist/core/web/public/next/assets/{SessionInsightChip-C33-k-Q5.js.map → SessionInsightChip-CxlSyueJ.js.map} +1 -1
  111. package/dist/core/web/public/next/assets/{SessionSearch-DhhR9Csg.js → SessionSearch-_yp7S2TP.js} +2 -2
  112. package/dist/core/web/public/next/assets/{SessionSearch-DhhR9Csg.js.map → SessionSearch-_yp7S2TP.js.map} +1 -1
  113. package/dist/core/web/public/next/assets/{SettingsSection-C0xQvCz3.js → SettingsSection-wGnpWeGW.js} +2 -2
  114. package/dist/core/web/public/next/assets/{SettingsSection-C0xQvCz3.js.map → SettingsSection-wGnpWeGW.js.map} +1 -1
  115. package/dist/core/web/public/next/assets/{Sheet-BvNYOYv5.js → Sheet-DVP2Mgy6.js} +2 -2
  116. package/dist/core/web/public/next/assets/{Sheet-BvNYOYv5.js.map → Sheet-DVP2Mgy6.js.map} +1 -1
  117. package/dist/core/web/public/next/assets/{ShortcutsOverlay-1nUBVO-Z.js → ShortcutsOverlay-BcIcoClX.js} +2 -2
  118. package/dist/core/web/public/next/assets/{ShortcutsOverlay-1nUBVO-Z.js.map → ShortcutsOverlay-BcIcoClX.js.map} +1 -1
  119. package/dist/core/web/public/next/assets/{Sidebar-YrVvvBNM.js → Sidebar-DjQOqPbm.js} +3 -3
  120. package/dist/core/web/public/next/assets/{Sidebar-YrVvvBNM.js.map → Sidebar-DjQOqPbm.js.map} +1 -1
  121. package/dist/core/web/public/next/assets/{Slider-B2c-dbQb.js → Slider-BypUWjpH.js} +2 -2
  122. package/dist/core/web/public/next/assets/{Slider-B2c-dbQb.js.map → Slider-BypUWjpH.js.map} +1 -1
  123. package/dist/core/web/public/next/assets/{StatusBadge-Q9YYkijx.js → StatusBadge-HCZp416_.js} +2 -2
  124. package/dist/core/web/public/next/assets/{StatusBadge-Q9YYkijx.js.map → StatusBadge-HCZp416_.js.map} +1 -1
  125. package/dist/core/web/public/next/assets/{StepBand-Ci-C0GUG.js → StepBand-Duz1PUes.js} +2 -2
  126. package/dist/core/web/public/next/assets/{StepBand-Ci-C0GUG.js.map → StepBand-Duz1PUes.js.map} +1 -1
  127. package/dist/core/web/public/next/assets/{Surface-DBovMq4P.js → Surface-B75lVfzm.js} +2 -2
  128. package/dist/core/web/public/next/assets/{Surface-DBovMq4P.js.map → Surface-B75lVfzm.js.map} +1 -1
  129. package/dist/core/web/public/next/assets/{Swimlane-Cdc4TqDe.js → Swimlane-DGcIcnNA.js} +2 -2
  130. package/dist/core/web/public/next/assets/{Swimlane-Cdc4TqDe.js.map → Swimlane-DGcIcnNA.js.map} +1 -1
  131. package/dist/core/web/public/next/assets/{Switch-CUrvzO2k.js → Switch-iveI-8NY.js} +2 -2
  132. package/dist/core/web/public/next/assets/{Switch-CUrvzO2k.js.map → Switch-iveI-8NY.js.map} +1 -1
  133. package/dist/core/web/public/next/assets/{Tag-Bv8u6APt.js → Tag-DH15CUJp.js} +2 -2
  134. package/dist/core/web/public/next/assets/{Tag-Bv8u6APt.js.map → Tag-DH15CUJp.js.map} +1 -1
  135. package/dist/core/web/public/next/assets/{TerminalPane-BE4Xlqi5.js → TerminalPane-MQT-veKZ.js} +2 -2
  136. package/dist/core/web/public/next/assets/{TerminalPane-BE4Xlqi5.js.map → TerminalPane-MQT-veKZ.js.map} +1 -1
  137. package/dist/core/web/public/next/assets/{UniverseConsoleApp-BGwejf0m.js → UniverseConsoleApp-C8yQ0AaR.js} +2 -2
  138. package/dist/core/web/public/next/assets/{UniverseConsoleApp-BGwejf0m.js.map → UniverseConsoleApp-C8yQ0AaR.js.map} +1 -1
  139. package/dist/core/web/public/next/assets/{UniverseView-CgKa-WXC.js → UniverseView-_nPURPqe.js} +2 -2
  140. package/dist/core/web/public/next/assets/{UniverseView-CgKa-WXC.js.map → UniverseView-_nPURPqe.js.map} +1 -1
  141. package/dist/core/web/public/next/assets/{UsageSection-CazsHm1f.js → UsageSection-CqxRGJ40.js} +2 -2
  142. package/dist/core/web/public/next/assets/{UsageSection-CazsHm1f.js.map → UsageSection-CqxRGJ40.js.map} +1 -1
  143. package/dist/core/web/public/next/assets/{VerseConsoleApp-CTF3Shs0.js → VerseConsoleApp-DTjDpGCd.js} +3 -3
  144. package/dist/core/web/public/next/assets/{VerseConsoleApp-CTF3Shs0.js.map → VerseConsoleApp-DTjDpGCd.js.map} +1 -1
  145. package/dist/core/web/public/next/assets/{Workspace-CgdyXiEV.js → Workspace-DfcFGzME.js} +5 -5
  146. package/dist/core/web/public/next/assets/{Workspace-CgdyXiEV.js.map → Workspace-DfcFGzME.js.map} +1 -1
  147. package/dist/core/web/public/next/assets/{actions-MtxBGS5B.js → actions-tWevL9HV.js} +2 -2
  148. package/dist/core/web/public/next/assets/{actions-MtxBGS5B.js.map → actions-tWevL9HV.js.map} +1 -1
  149. package/dist/core/web/public/next/assets/{budget-queries-CP7hgR-p.js → budget-queries-V3wcJVK_.js} +2 -2
  150. package/dist/core/web/public/next/assets/{budget-queries-CP7hgR-p.js.map → budget-queries-V3wcJVK_.js.map} +1 -1
  151. package/dist/core/web/public/next/assets/{capacity-strip-model-fHfu5cph.js → capacity-strip-model-BDbmQ3e3.js} +2 -2
  152. package/dist/core/web/public/next/assets/{capacity-strip-model-fHfu5cph.js.map → capacity-strip-model-BDbmQ3e3.js.map} +1 -1
  153. package/dist/core/web/public/next/assets/{charts-Bis9WSiS.js → charts-CfAjuKMv.js} +2 -2
  154. package/dist/core/web/public/next/assets/{charts-Bis9WSiS.js.map → charts-CfAjuKMv.js.map} +1 -1
  155. package/dist/core/web/public/next/assets/{cloud-queries-BsOepFz6.js → cloud-queries-Br_r0UAz.js} +2 -2
  156. package/dist/core/web/public/next/assets/{cloud-queries-BsOepFz6.js.map → cloud-queries-Br_r0UAz.js.map} +1 -1
  157. package/dist/core/web/public/next/assets/{cloud.module-DoFnr8ZH.js → cloud.module-ascz58c3.js} +2 -2
  158. package/dist/core/web/public/next/assets/{cloud.module-DoFnr8ZH.js.map → cloud.module-ascz58c3.js.map} +1 -1
  159. package/dist/core/web/public/next/assets/{command-bus-CMvbYP5K.js → command-bus-xYZoK9nQ.js} +2 -2
  160. package/dist/core/web/public/next/assets/{command-bus-CMvbYP5K.js.map → command-bus-xYZoK9nQ.js.map} +1 -1
  161. package/dist/core/web/public/next/assets/{context-model-Ci3Ch9t5.js → context-model-BC-HOmPo.js} +2 -2
  162. package/dist/core/web/public/next/assets/{context-model-Ci3Ch9t5.js.map → context-model-BC-HOmPo.js.map} +1 -1
  163. package/dist/core/web/public/next/assets/{context-model-CjiJTnf1.js → context-model-CIBmSugV.js} +2 -2
  164. package/dist/core/web/public/next/assets/{context-model-CjiJTnf1.js.map → context-model-CIBmSugV.js.map} +1 -1
  165. package/dist/core/web/public/next/assets/{context-queries-BDXT6LQ3.js → context-queries-CrPcHWTz.js} +2 -2
  166. package/dist/core/web/public/next/assets/{context-queries-BDXT6LQ3.js.map → context-queries-CrPcHWTz.js.map} +1 -1
  167. package/dist/core/web/public/next/assets/{control-queries-Dv-h1Clu.js → control-queries-CmgBgKV7.js} +2 -2
  168. package/dist/core/web/public/next/assets/{control-queries-Dv-h1Clu.js.map → control-queries-CmgBgKV7.js.map} +1 -1
  169. package/dist/core/web/public/next/assets/{dock-icons-t--Eugrd.js → dock-icons-CUh8dOxJ.js} +2 -2
  170. package/dist/core/web/public/next/assets/{dock-icons-t--Eugrd.js.map → dock-icons-CUh8dOxJ.js.map} +1 -1
  171. package/dist/core/web/public/next/assets/{dock-store-qIu7kSQE.js → dock-store-B2vlxqPu.js} +2 -2
  172. package/dist/core/web/public/next/assets/{dock-store-qIu7kSQE.js.map → dock-store-B2vlxqPu.js.map} +1 -1
  173. package/dist/core/web/public/next/assets/{fleet-model-IRbwfhkR.js → fleet-model-7i-FbzKI.js} +2 -2
  174. package/dist/core/web/public/next/assets/{fleet-model-IRbwfhkR.js.map → fleet-model-7i-FbzKI.js.map} +1 -1
  175. package/dist/core/web/public/next/assets/{fleet-queries-7FVNByX1.js → fleet-queries-DzGoqq8X.js} +2 -2
  176. package/dist/core/web/public/next/assets/{fleet-queries-7FVNByX1.js.map → fleet-queries-DzGoqq8X.js.map} +1 -1
  177. package/dist/core/web/public/next/assets/{focus-trap-QqQxQdvH.js → focus-trap-HtcoXeEq.js} +2 -2
  178. package/dist/core/web/public/next/assets/{focus-trap-QqQxQdvH.js.map → focus-trap-HtcoXeEq.js.map} +1 -1
  179. package/dist/core/web/public/next/assets/{format-CaMmVQCn.js → format-BkWdOQDL.js} +2 -2
  180. package/dist/core/web/public/next/assets/{format-CaMmVQCn.js.map → format-BkWdOQDL.js.map} +1 -1
  181. package/dist/core/web/public/next/assets/{git-model-B4S_GUNA.js → git-model-bk_RXh3y.js} +2 -2
  182. package/dist/core/web/public/next/assets/{git-model-B4S_GUNA.js.map → git-model-bk_RXh3y.js.map} +1 -1
  183. package/dist/core/web/public/next/assets/{global-BkNl4e6E.js → global-oEl9Qj8u.js} +2 -2
  184. package/dist/core/web/public/next/assets/{global-BkNl4e6E.js.map → global-oEl9Qj8u.js.map} +1 -1
  185. package/dist/core/web/public/next/assets/{guarded-action-DHiL8tY5.js → guarded-action-OzqcPjmh.js} +3 -3
  186. package/dist/core/web/public/next/assets/{guarded-action-DHiL8tY5.js.map → guarded-action-OzqcPjmh.js.map} +1 -1
  187. package/dist/core/web/public/next/assets/{guarded-runners-DmGEkM2P.js → guarded-runners-LHLXmXIk.js} +2 -2
  188. package/dist/core/web/public/next/assets/{guarded-runners-DmGEkM2P.js.map → guarded-runners-LHLXmXIk.js.map} +1 -1
  189. package/dist/core/web/public/next/assets/{icon-base-NtFmP2yB.js → icon-base-DvM1eI5V.js} +2 -2
  190. package/dist/core/web/public/next/assets/{icon-base-NtFmP2yB.js.map → icon-base-DvM1eI5V.js.map} +1 -1
  191. package/dist/core/web/public/next/assets/{icons-C5EFt_Ts.js → icons-DEQa2rTx.js} +2 -2
  192. package/dist/core/web/public/next/assets/{icons-C5EFt_Ts.js.map → icons-DEQa2rTx.js.map} +1 -1
  193. package/dist/core/web/public/next/assets/{index-DbDw9UAs.js → index-BVxOlseC.js} +3 -3
  194. package/dist/core/web/public/next/assets/{index-DbDw9UAs.js.map → index-BVxOlseC.js.map} +1 -1
  195. package/dist/core/web/public/next/assets/{live-model-DEwrl7_A.js → live-model-bmsJgnYD.js} +2 -2
  196. package/dist/core/web/public/next/assets/{live-model-DEwrl7_A.js.map → live-model-bmsJgnYD.js.map} +1 -1
  197. package/dist/core/web/public/next/assets/{mind.module-CLhqMQak.js → mind.module-gTGAuJt1.js} +2 -2
  198. package/dist/core/web/public/next/assets/{mind.module-CLhqMQak.js.map → mind.module-gTGAuJt1.js.map} +1 -1
  199. package/dist/core/web/public/next/assets/{mutations-Kvzsg-iK.js → mutations-C5S7okTW.js} +2 -2
  200. package/dist/core/web/public/next/assets/{mutations-Kvzsg-iK.js.map → mutations-C5S7okTW.js.map} +1 -1
  201. package/dist/core/web/public/next/assets/{nav-C0IunEYF.js → nav-NVtnuG7A.js} +2 -2
  202. package/dist/core/web/public/next/assets/{nav-C0IunEYF.js.map → nav-NVtnuG7A.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/{overnight-queries-C_AfcL7q.js → overnight-queries-DGm3qL1b.js} +2 -2
  204. package/dist/core/web/public/next/assets/{overnight-queries-C_AfcL7q.js.map → overnight-queries-DGm3qL1b.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/{preloaded-CctOitLu.js → preloaded-Cwf9rsnZ.js} +2 -2
  206. package/dist/core/web/public/next/assets/{preloaded-CctOitLu.js.map → preloaded-Cwf9rsnZ.js.map} +1 -1
  207. package/dist/core/web/public/next/assets/primitives-DyCKYSBG.js +1 -0
  208. package/dist/core/web/public/next/assets/{queries-THD05gHP.js → queries-CYisSAAB.js} +2 -2
  209. package/dist/core/web/public/next/assets/{queries-THD05gHP.js.map → queries-CYisSAAB.js.map} +1 -1
  210. package/dist/core/web/public/next/assets/{reasoning-pref-BVPu0SME.js → reasoning-pref-BUcFF_5G.js} +2 -2
  211. package/dist/core/web/public/next/assets/{reasoning-pref-BVPu0SME.js.map → reasoning-pref-BUcFF_5G.js.map} +1 -1
  212. package/dist/core/web/public/next/assets/{reveal-anchor-wCT5b4m3.js → reveal-anchor-D-tV8xau.js} +2 -2
  213. package/dist/core/web/public/next/assets/{reveal-anchor-wCT5b4m3.js.map → reveal-anchor-D-tV8xau.js.map} +1 -1
  214. package/dist/core/web/public/next/assets/{seat-subscription-CR_VylsK.js → seat-subscription-B-f9ViU2.js} +2 -2
  215. package/dist/core/web/public/next/assets/{seat-subscription-CR_VylsK.js.map → seat-subscription-B-f9ViU2.js.map} +1 -1
  216. package/dist/core/web/public/next/assets/{section-visibility-B0xXUQJ0.js → section-visibility-Yctxu-if.js} +2 -2
  217. package/dist/core/web/public/next/assets/{section-visibility-B0xXUQJ0.js.map → section-visibility-Yctxu-if.js.map} +1 -1
  218. package/dist/core/web/public/next/assets/{sidebar-model-C5wVXGpb.js → sidebar-model-DQ-FyBHW.js} +2 -2
  219. package/dist/core/web/public/next/assets/{sidebar-model-C5wVXGpb.js.map → sidebar-model-DQ-FyBHW.js.map} +1 -1
  220. package/dist/core/web/public/next/assets/{slots-DDd8cEoh.js → slots-BhP8b8tf.js} +3 -3
  221. package/dist/core/web/public/next/assets/{slots-DDd8cEoh.js.map → slots-BhP8b8tf.js.map} +1 -1
  222. package/dist/core/web/public/next/assets/{surface-data-BFxAlefI.js → surface-data-DTI7LjvH.js} +2 -2
  223. package/dist/core/web/public/next/assets/{surface-data-BFxAlefI.js.map → surface-data-DTI7LjvH.js.map} +1 -1
  224. package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js +2 -0
  225. package/dist/core/web/public/next/assets/{surface-prefetch-CHusyO9q.js.map → surface-prefetch-CdUEBFrl.js.map} +1 -1
  226. package/dist/core/web/public/next/assets/{tasks-model-DvkWveXs.js → tasks-model-BKDNqmmt.js} +2 -2
  227. package/dist/core/web/public/next/assets/{tasks-model-DvkWveXs.js.map → tasks-model-BKDNqmmt.js.map} +1 -1
  228. package/dist/core/web/public/next/assets/{terminal-icons-Dp6pJgV2.js → terminal-icons-D2xe-aM1.js} +2 -2
  229. package/dist/core/web/public/next/assets/{terminal-icons-Dp6pJgV2.js.map → terminal-icons-D2xe-aM1.js.map} +1 -1
  230. package/dist/core/web/public/next/assets/{usage-queries-CUTmnegA.js → usage-queries-BZuAANlI.js} +2 -2
  231. package/dist/core/web/public/next/assets/{usage-queries-CUTmnegA.js.map → usage-queries-BZuAANlI.js.map} +1 -1
  232. package/dist/core/web/public/next/assets/{use-guarded-action-UCX2u1t1.js → use-guarded-action-Cf4MeNBa.js} +2 -2
  233. package/dist/core/web/public/next/assets/{use-guarded-action-UCX2u1t1.js.map → use-guarded-action-Cf4MeNBa.js.map} +1 -1
  234. package/dist/core/web/public/next/assets/{use-ticker-OXAjob3y.js → use-ticker-D9yi49my.js} +2 -2
  235. package/dist/core/web/public/next/assets/{use-ticker-OXAjob3y.js.map → use-ticker-D9yi49my.js.map} +1 -1
  236. package/dist/core/web/public/next/assets/{use-token-gate-CDDRAoKH.js → use-token-gate-DqrSXdX6.js} +2 -2
  237. package/dist/core/web/public/next/assets/{use-token-gate-CDDRAoKH.js.map → use-token-gate-DqrSXdX6.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/{useChartWidth-D9M7kUw7.js → useChartWidth-owwodNVz.js} +2 -2
  239. package/dist/core/web/public/next/assets/{useChartWidth-D9M7kUw7.js.map → useChartWidth-owwodNVz.js.map} +1 -1
  240. package/dist/core/web/public/next/assets/{useSeatsRefresh-B2dCVcj9.js → useSeatsRefresh-DgFy-Ph4.js} +2 -2
  241. package/dist/core/web/public/next/assets/{useSeatsRefresh-B2dCVcj9.js.map → useSeatsRefresh-DgFy-Ph4.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/{useVerseTranscript-BL3CljSI.js → useVerseTranscript-CDYrrWOO.js} +2 -2
  243. package/dist/core/web/public/next/assets/{useVerseTranscript-BL3CljSI.js.map → useVerseTranscript-CDYrrWOO.js.map} +1 -1
  244. package/dist/core/web/public/next/assets/{verse-icons-DASWdYuE.js → verse-icons-F9VwX07_.js} +2 -2
  245. package/dist/core/web/public/next/assets/{verse-icons-DASWdYuE.js.map → verse-icons-F9VwX07_.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/{verse-model-BQ0Y2CSr.js → verse-model-DyCwZF-M.js} +2 -2
  247. package/dist/core/web/public/next/assets/{verse-model-BQ0Y2CSr.js.map → verse-model-DyCwZF-M.js.map} +1 -1
  248. package/dist/core/web/public/next/assets/{verse-ui-store-D7YXi63q.js → verse-ui-store-62DxpVHS.js} +3 -3
  249. package/dist/core/web/public/next/assets/{verse-ui-store-D7YXi63q.js.map → verse-ui-store-62DxpVHS.js.map} +1 -1
  250. package/dist/core/web/public/next/assets/{viewport-BYGH5EgA.js → viewport-nTubFCwf.js} +2 -2
  251. package/dist/core/web/public/next/assets/{viewport-BYGH5EgA.js.map → viewport-nTubFCwf.js.map} +1 -1
  252. package/dist/core/web/public/next/assets/{warmup-AsqwWCUi.js → warmup-HG5vYbsN.js} +3 -3
  253. package/dist/core/web/public/next/assets/{warmup-AsqwWCUi.js.map → warmup-HG5vYbsN.js.map} +1 -1
  254. package/dist/core/web/public/next/assets/{workspace-model-CXorJr0G.js → workspace-model-CbhdPhei.js} +2 -2
  255. package/dist/core/web/public/next/assets/{workspace-model-CXorJr0G.js.map → workspace-model-CbhdPhei.js.map} +1 -1
  256. package/dist/core/web/public/next/index.html +1 -1
  257. package/dist/release-dependency-inventory.json +1 -1
  258. package/package.json +1 -1
  259. package/dist/core/web/public/next/assets/AutonomySection-D3d8lYO3.js +0 -2
  260. package/dist/core/web/public/next/assets/McpSection-DvHFaVyp.js +0 -2
  261. package/dist/core/web/public/next/assets/primitives-CbAGCNKt.js +0 -1
  262. package/dist/core/web/public/next/assets/surface-prefetch-CHusyO9q.js +0 -2
@@ -1,2 +1,2 @@
1
- import{a as e,n as t,s as n}from"./index-DbDw9UAs.js";import{t as r}from"./Button-DqgLUZvd.js";import{t as i}from"./Switch-CUrvzO2k.js";import{a,n as o,o as s,t as c}from"./cloud.module-DoFnr8ZH.js";import{t as l}from"./Input-ekTehVaH.js";var u=n(e(),1),d=t();function f({budget:e,onSave:t,onCancel:n,busy:f,disabled:p=!1,idPrefix:m}){let[h,g]=(0,u.useState)(()=>a(e)),[_,v]=(0,u.useState)({}),[y,b]=(0,u.useState)(null),x=(0,u.useRef)(!1);(0,u.useEffect)(()=>{x.current||g(a(e))},[e]);let S=e=>{x.current=!0,b(null),g(t=>({...t,...e}))};return(0,d.jsxs)(`form`,{className:c.form,onSubmit:n=>{n.preventDefault();let r=s(h,e);if(!r.ok){v(r.errors);return}if(v({}),!r.changed){b(`Nothing changed.`);return}x.current=!1,t(r.update)},noValidate:!0,"aria-label":`Cloud budget`,children:[(0,d.jsx)(`div`,{className:c.fieldGrid,children:o.map(e=>(0,d.jsx)(l,{id:`${m}-${e.field}`,label:e.label,hint:e.hint,error:_[e.field],size:`sm`,inputMode:e.integer?`numeric`:`decimal`,prefix:e.money?`$`:void 0,value:h[e.field],disabled:p||f,onChange:t=>S({[e.field]:t.target.value})},e.field))}),(0,d.jsx)(i,{checked:h.selfImprove,onChange:e=>S({selfImprove:e}),label:`Verse may launch self-improvement tasks on its own`,disabled:p||f}),y?(0,d.jsx)(`p`,{className:c.muted,role:`status`,children:y}):null,(0,d.jsxs)(`div`,{className:c.formActions,children:[n?(0,d.jsx)(r,{variant:`ghost`,size:`sm`,onClick:n,disabled:f,children:`Cancel`}):null,(0,d.jsx)(r,{type:`submit`,variant:`primary`,size:`sm`,busy:f,disabled:p,children:`Save budget`})]})]})}export{f as t};
2
- //# sourceMappingURL=CloudBudgetForm-2OW38o_C.js.map
1
+ import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{t as r}from"./Button-HHXgoXGr.js";import{t as i}from"./Switch-iveI-8NY.js";import{a,n as o,o as s,t as c}from"./cloud.module-ascz58c3.js";import{t as l}from"./Input-B5dmGLZx.js";var u=n(e(),1),d=t();function f({budget:e,onSave:t,onCancel:n,busy:f,disabled:p=!1,idPrefix:m}){let[h,g]=(0,u.useState)(()=>a(e)),[_,v]=(0,u.useState)({}),[y,b]=(0,u.useState)(null),x=(0,u.useRef)(!1);(0,u.useEffect)(()=>{x.current||g(a(e))},[e]);let S=e=>{x.current=!0,b(null),g(t=>({...t,...e}))};return(0,d.jsxs)(`form`,{className:c.form,onSubmit:n=>{n.preventDefault();let r=s(h,e);if(!r.ok){v(r.errors);return}if(v({}),!r.changed){b(`Nothing changed.`);return}x.current=!1,t(r.update)},noValidate:!0,"aria-label":`Cloud budget`,children:[(0,d.jsx)(`div`,{className:c.fieldGrid,children:o.map(e=>(0,d.jsx)(l,{id:`${m}-${e.field}`,label:e.label,hint:e.hint,error:_[e.field],size:`sm`,inputMode:e.integer?`numeric`:`decimal`,prefix:e.money?`$`:void 0,value:h[e.field],disabled:p||f,onChange:t=>S({[e.field]:t.target.value})},e.field))}),(0,d.jsx)(i,{checked:h.selfImprove,onChange:e=>S({selfImprove:e}),label:`Verse may launch self-improvement tasks on its own`,disabled:p||f}),y?(0,d.jsx)(`p`,{className:c.muted,role:`status`,children:y}):null,(0,d.jsxs)(`div`,{className:c.formActions,children:[n?(0,d.jsx)(r,{variant:`ghost`,size:`sm`,onClick:n,disabled:f,children:`Cancel`}):null,(0,d.jsx)(r,{type:`submit`,variant:`primary`,size:`sm`,busy:f,disabled:p,children:`Save budget`})]})]})}export{f as t};
2
+ //# sourceMappingURL=CloudBudgetForm-DJbiT1wi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CloudBudgetForm-2OW38o_C.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/cloud/CloudBudgetForm.tsx"],"sourcesContent":["/**\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":"oQA6BA,SAAgB,EAAgB,CAAE,SAAQ,SAAQ,WAAU,OAAM,WAAW,GAAO,YAAkC,CACpH,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,KAA2B,EAAe,CAAM,CAAC,EACnE,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAuB,CAAC,CAAC,EAC/C,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAwB,IAAI,EAC9C,GAAA,EAAQ,EAAA,OAAA,CAAO,EAAK,GAI1B,EAAA,EAAA,UAAA,KAAgB,CACT,EAAM,SAAS,EAAQ,EAAe,CAAM,CAAC,CACpD,EAAG,CAAC,CAAM,CAAC,EAEX,IAAM,EAAQ,GAA+B,CAC3C,EAAM,QAAU,GAChB,EAAQ,IAAI,EACZ,EAAS,IAAU,CAAE,GAAG,EAAM,GAAG,CAAM,EAAE,CAC3C,EAkBA,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,SAjBhB,GAAqB,CACnC,EAAM,eAAe,EACrB,IAAM,EAAS,EAAY,EAAM,CAAM,EACvC,GAAI,CAAC,EAAO,GAAI,CACd,EAAU,EAAO,MAAM,EACvB,MACF,CAEA,GADA,EAAU,CAAC,CAAC,EACR,CAAC,EAAO,QAAS,CACnB,EAAQ,kBAAkB,EAC1B,MACF,CACA,EAAM,QAAU,GAChB,EAAO,EAAO,MAAM,CACtB,EAGkD,WAAA,GAAW,aAAW,eAAtE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UACpB,SAAA,EAAc,IAAK,IAClB,EAAA,EAAA,IAAA,CAAC,EAAD,CAEE,GAAI,GAAG,EAAS,GAAG,EAAK,QACxB,MAAO,EAAK,MACZ,KAAM,EAAK,KACX,MAAO,EAAO,EAAK,OACnB,KAAK,KACL,UAAW,EAAK,QAAU,UAAY,UACtC,OAAQ,EAAK,MAAQ,IAAM,IAAA,GAC3B,MAAO,EAAK,EAAK,OACjB,SAAU,GAAY,EACtB,SAAW,GAAM,EAAK,EAAG,EAAK,OAAQ,EAAE,OAAO,KAAM,CAAwB,CAC9E,EAXM,EAAK,KAWX,CACF,CACE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAK,YACd,SAAW,GAAS,EAAK,CAAE,YAAa,CAAK,CAAC,EAC9C,MAAM,qDACN,SAAU,GAAY,CACvB,CAAA,EACA,GAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,SAAU,SAAA,CAAQ,CAAA,EAAI,MAC/D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAvB,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,QAAS,EAAU,SAAU,EAAM,SAAA,QAE7D,CAAA,EACN,MACJ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,SAAS,QAAQ,UAAU,KAAK,KAAW,OAAgB,WAAU,SAAA,aAE1E,CAAA,CACL,GACD,GAEV"}
1
+ {"version":3,"file":"CloudBudgetForm-DJbiT1wi.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/cloud/CloudBudgetForm.tsx"],"sourcesContent":["/**\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":"oQA6BA,SAAgB,EAAgB,CAAE,SAAQ,SAAQ,WAAU,OAAM,WAAW,GAAO,YAAkC,CACpH,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,KAA2B,EAAe,CAAM,CAAC,EACnE,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAuB,CAAC,CAAC,EAC/C,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAwB,IAAI,EAC9C,GAAA,EAAQ,EAAA,OAAA,CAAO,EAAK,GAI1B,EAAA,EAAA,UAAA,KAAgB,CACT,EAAM,SAAS,EAAQ,EAAe,CAAM,CAAC,CACpD,EAAG,CAAC,CAAM,CAAC,EAEX,IAAM,EAAQ,GAA+B,CAC3C,EAAM,QAAU,GAChB,EAAQ,IAAI,EACZ,EAAS,IAAU,CAAE,GAAG,EAAM,GAAG,CAAM,EAAE,CAC3C,EAkBA,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,SAjBhB,GAAqB,CACnC,EAAM,eAAe,EACrB,IAAM,EAAS,EAAY,EAAM,CAAM,EACvC,GAAI,CAAC,EAAO,GAAI,CACd,EAAU,EAAO,MAAM,EACvB,MACF,CAEA,GADA,EAAU,CAAC,CAAC,EACR,CAAC,EAAO,QAAS,CACnB,EAAQ,kBAAkB,EAC1B,MACF,CACA,EAAM,QAAU,GAChB,EAAO,EAAO,MAAM,CACtB,EAGkD,WAAA,GAAW,aAAW,eAAtE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UACpB,SAAA,EAAc,IAAK,IAClB,EAAA,EAAA,IAAA,CAAC,EAAD,CAEE,GAAI,GAAG,EAAS,GAAG,EAAK,QACxB,MAAO,EAAK,MACZ,KAAM,EAAK,KACX,MAAO,EAAO,EAAK,OACnB,KAAK,KACL,UAAW,EAAK,QAAU,UAAY,UACtC,OAAQ,EAAK,MAAQ,IAAM,IAAA,GAC3B,MAAO,EAAK,EAAK,OACjB,SAAU,GAAY,EACtB,SAAW,GAAM,EAAK,EAAG,EAAK,OAAQ,EAAE,OAAO,KAAM,CAAwB,CAC9E,EAXM,EAAK,KAWX,CACF,CACE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAK,YACd,SAAW,GAAS,EAAK,CAAE,YAAa,CAAK,CAAC,EAC9C,MAAM,qDACN,SAAU,GAAY,CACvB,CAAA,EACA,GAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,SAAU,SAAA,CAAQ,CAAA,EAAI,MAC/D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAvB,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,QAAS,EAAU,SAAU,EAAM,SAAA,QAE7D,CAAA,EACN,MACJ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,SAAS,QAAQ,UAAU,KAAK,KAAW,OAAgB,WAAU,SAAA,aAE1E,CAAA,CACL,GACD,GAEV"}
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,n,s as r}from"./index-DbDw9UAs.js";import{p as i}from"./global-BkNl4e6E.js";import{t as a}from"./focus-trap-QqQxQdvH.js";import{t as o}from"./ProviderLogo-Bz7KR5j3.js";import{a as s,c,n as l,s as u,t as d,u as f}from"./command-catalog-Bb_PxC5w.js";import{t as p}from"./workbench-types-DzN-5trg.js";import{g as m,m as h,s as g,y as _}from"./verse-ui-store-D7YXi63q.js";import{I as v,L as y,N as b,w as x,x as S}from"./VerseConsoleApp-CTF3Shs0.js";import{a as C}from"./verse-icons-DASWdYuE.js";var w=r(e(),1),T=r(t(),1),E={...Object.fromEntries(d.map(e=>[e.id,e.label])),recent:`Recent`},D=[`needs-you`,`recent`,...d.map(e=>e.id).filter(e=>e!==`needs-you`)],O={"needs-you":5,recent:5,chats:8,actions:8,"go-to":6,"seats-apps":5,projects:5};function k(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 A(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 k(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,k(t,n)&&(a+=20),a-=Math.min(20,n-o),s=n,o=n+1}return a}function j(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=A(t,e.title);for(let r of[e.subtitle??``,...e.keywords]){if(!r)continue;let e=A(t,r);e!==null&&(n=Math.max(n??-1/0,e*.6))}if(n===null)return null;r+=n}return r}function M(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 N(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 P(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??e}function F(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`:null,shortcut:r?c(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 I(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?p[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?M(i.startedAt,t):`running`:e.status===`error`?`failed`:N(e.updatedAt,t);n.push({key:`chat:${e.id}`,kind:`chat`,group:`chats`,title:e.title||`Untitled chat`,subtitle:[P(e.projectPath),o].filter(Boolean).join(` · `),shortcut:null,monogram:p[e.engine],engine:e.engine,keywords:[e.model,e.seatId,P(e.projectPath)],argument:null,tone:a?`running`:e.status===`error`?`warn`:`neutral`,payload:{kind:`chat`,sessionId:e.id}})}for(let t of f(`actions`))n.push(F(t,e.platform,`actions`));for(let t of f(`go-to`))n.push(F(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:p[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||P(t.path)}`,subtitle:t.enrolled?`enrolled in the fleet`:null,shortcut:null,monogram:null,engine:null,keywords:[t.name,P(t.path)],argument:null,tone:`neutral`,payload:{kind:`project`,path:t.path,name:t.name||P(t.path)}});return n}function L(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,p[e.engine],e.engine));case`project`:return t.projects.map(e=>n(e.path,e.name||P(e.path),null,null,null));case`session`:return t.sessions.map(e=>n(e.id,e.title||`Untitled chat`,P(e.projectPath),p[e.engine],e.engine));case`section`:return[];default:return[]}}function R(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?l[a]:null,c=i.trim(),d=new Map,f=(e,t,n)=>{let r=d.get(e.group)??[];r.push({item:e,score:t,order:n}),d.set(e.group,r)};if(c===``&&!a){e.filter(e=>e.group===`needs-you`).slice(0,3).forEach((e,t)=>f(e,0,t));let t=n.map(e=>u(e)).filter(e=>e!==null&&e.group!==null);(t.length>0?t:[`chat.new`,`needs-you.open`,`shortcuts.open`].map(e=>u(e))).slice(0,5).forEach((e,t)=>f(F(e,r,`recent`),0,t))}else e.forEach((e,t)=>{if(s&&e.group!==s)return;let n=c===``?0:j(e,c);n!==null&&f(e,n,t)});let p=[];for(let e of D){let t=d.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:O[e];p.push({id:e,label:E[e],items:t.slice(0,r).map(e=>e.item)})}return{groups:p,flat:p.flatMap(e=>e.items),prefix:a}}var z={backdrop:`_backdrop_qk7b5_4`,fade:`_fade_qk7b5_1`,panel:`_panel_qk7b5_16`,rise:`_rise_qk7b5_1`,field:`_field_qk7b5_29`,crumb:`_crumb_qk7b5_37`,input:`_input_qk7b5_49`,list:`_list_qk7b5_66`,group:`_group_qk7b5_74`,groupLabel:`_groupLabel_qk7b5_76`,item:`_item_qk7b5_86`,lead:`_lead_qk7b5_100`,monogram:`_monogram_qk7b5_109`,bullet:`_bullet_qk7b5_128`,text:`_text_qk7b5_136`,title:`_title_qk7b5_143`,subtitle:`_subtitle_qk7b5_153`,trail:`_trail_qk7b5_168`,key:`_key_qk7b5_175`,empty:`_empty_qk7b5_190`,foot:`_foot_qk7b5_197`},B=n();function V({onClose:e=g}){let t=b(),n=v(),r=i(x),c=i(S),l=(0,w.useMemo)(()=>s(),[]),[d,f]=(0,w.useState)(``),[p,E]=(0,w.useState)(0),[D,O]=(0,w.useState)(null),k=(0,w.useRef)(null),A=(0,w.useRef)(null),j=(0,w.useRef)(null),M=(0,w.useId)(),N=(0,w.useId)(),P=(0,w.useRef)(null);P.current=D;let F=(0,w.useCallback)(()=>{P.current?O(null):e()},[e]);a({open:!0,containerRef:k,onClose:F,initialFocusRef:A});let V=(0,w.useMemo)(()=>({needsYou:n.data?.needsYou??[],running:n.data?.running??[],sessions:r.data??c.data?.sessions??[],seats:c.data?.seats??[],projects:c.data?.projects??[],recentActions:t.recentActions,platform:l}),[n.data,r.data,c.data,t.recentActions,l]),H=(0,w.useMemo)(()=>D?.argument?{...R(L(D.argument.kind,V),`>${d}`,[],l),prefix:null}:R(I(V),d,t.recentActions,l),[D,V,d,t.recentActions,l]);(0,w.useEffect)(()=>{E(e=>H.flat.length===0?0:Math.min(e,H.flat.length-1))},[H.flat.length]),(0,w.useEffect)(()=>{(j.current?.querySelector(`[data-index="${p}"]`))?.scrollIntoView?.({block:`nearest`})},[p]);function U(e){O(e),f(``),E(0)}function W(t){if(!t)return;let n=t.payload;if(n.kind===`command`){let t=u(n.commandId);if(t?.argument){U(t);return}e(),y(n.commandId,{via:`palette`});return}switch(e(),n.kind){case`needs-you`:h({split:`all`,focusId:n.itemId});break;case`chat`:m(n.sessionId);break;case`seat`:y(`chat.new-on`,{via:`palette`,argument:{kind:`seat`,id:n.seatId,label:n.label}});break;case`project`:_(`new-chat`,{projectPath:n.path});break;case`argument`:D&&y(D.id,{via:`palette`,argument:n.argument})}}function G(t){let n=H.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&&E(e=>(e+1)%n);return;case`ArrowUp`:t.preventDefault(),n>0&&E(e=>(e-1+n)%n);return;case`Home`:n>0&&(t.preventDefault(),E(0));return;case`End`:n>0&&(t.preventDefault(),E(n-1));return;case`Enter`:t.preventDefault(),W(H.flat[p]);return;case`Tab`:{t.preventDefault();let e=H.flat[p],n=e?.payload.kind===`command`?u(e.payload.commandId):null;n?.argument&&U(n);return}case`Backspace`:D&&d===``&&(t.preventDefault(),O(null));return;case`Escape`:t.preventDefault(),t.stopPropagation(),D?O(null):e();return;default:return}}let K=H.flat[p],q=D?.argument?`${D.argument.prompt}…`:`Search chats, actions and places`,J=-1;return(0,T.createPortal)((0,B.jsx)(`div`,{className:z.backdrop,onMouseDown:t=>t.target===t.currentTarget&&e(),children:(0,B.jsxs)(`div`,{ref:k,className:z.panel,role:`dialog`,"aria-modal":`true`,"aria-labelledby":N,"data-verse-overlay":`palette`,children:[(0,B.jsx)(`h2`,{id:N,className:`visually-hidden`,children:`Command palette`}),(0,B.jsxs)(`div`,{className:z.field,children:[D?(0,B.jsxs)(`span`,{className:z.crumb,children:[D.title.replace(/…$/,``),(0,B.jsx)(`span`,{"aria-hidden":`true`,children:` ›`})]}):null,(0,B.jsx)(`input`,{ref:A,className:z.input,value:d,placeholder:q,"aria-label":D?.argument?D.argument.prompt:`Search commands`,role:`combobox`,"aria-expanded":`true`,"aria-controls":M,"aria-autocomplete":`list`,"aria-activedescendant":K?`${M}-${p}`:void 0,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,onChange:e=>{f(e.target.value),E(0)},onKeyDown:G})]}),(0,B.jsx)(`div`,{ref:j,id:M,className:z.list,role:`listbox`,"aria-label":`Results`,children:H.flat.length===0?(0,B.jsx)(`p`,{className:z.empty,children:D?`No ${D.argument?.prompt.toLowerCase()??`match`} matches “${d}”.`:`Nothing matches “${d.trim()}”.`}):H.groups.map(e=>(0,B.jsxs)(`div`,{role:`group`,"aria-label":D?D.argument?.prompt??e.label:e.label,className:z.group,children:[(0,B.jsx)(`div`,{className:z.groupLabel,"aria-hidden":`true`,children:D?D.argument?.prompt:e.label}),e.items.map(e=>{J+=1;let t=J;return(0,B.jsxs)(`div`,{id:`${M}-${t}`,"data-index":t,role:`option`,"aria-selected":t===p,className:z.item,"data-tone":e.tone,onMouseMove:()=>t!==p&&E(t),onMouseDown:e=>e.preventDefault(),onClick:()=>W(e),children:[(0,B.jsx)(`span`,{className:z.lead,"aria-hidden":`true`,children:e.monogram?(0,B.jsx)(`span`,{className:z.monogram,"data-engine":e.engine??void 0,children:e.engine?(0,B.jsx)(o,{engine:e.engine,size:13}):e.monogram}):(0,B.jsx)(`span`,{className:z.bullet,"data-kind":e.kind})}),(0,B.jsxs)(`span`,{className:z.text,children:[(0,B.jsx)(`span`,{className:z.title,children:e.title}),e.subtitle?(0,B.jsx)(`span`,{className:z.subtitle,children:e.subtitle}):null]}),(0,B.jsxs)(`span`,{className:z.trail,children:[e.argument?(0,B.jsx)(`kbd`,{className:z.key,children:`⇥`}):null,e.shortcut?(0,B.jsx)(`kbd`,{className:z.key,children:e.shortcut}):null]})]},e.key)})]},e.id))}),(0,B.jsxs)(`div`,{className:z.foot,"aria-hidden":`true`,children:[(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`↑↓`}),` move`]}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:(0,B.jsx)(C,{})}),` run`]}),K?.argument?(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`⇥`}),` `,K.argument.prompt.toLowerCase()]}):null,(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`esc`}),` `,D?`back`:`close`]}),D?null:(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`>`}),` actions only · `,(0,B.jsx)(`kbd`,{className:z.key,children:`#`}),` chats only`]})]}),(0,B.jsx)(`p`,{className:`visually-hidden`,role:`status`,"aria-live":`polite`,children:H.flat.length===1?`1 result`:`${H.flat.length} results`})]})}),document.body)}export{V as CommandPalette};
2
- //# sourceMappingURL=CommandPalette-C5w2o1-r.js.map
1
+ import{a as e,i as t,n,s as r}from"./index-BVxOlseC.js";import{p as i}from"./global-oEl9Qj8u.js";import{t as a}from"./focus-trap-HtcoXeEq.js";import{t as o}from"./ProviderLogo-C5mBg8i0.js";import{a as s,c,n as l,s as u,t as d,u as f}from"./command-catalog-Bb_PxC5w.js";import{t as p}from"./workbench-types-DzN-5trg.js";import{g as m,m as h,s as g,y as _}from"./verse-ui-store-62DxpVHS.js";import{I as v,L as y,N as b,w as x,x as S}from"./VerseConsoleApp-DTjDpGCd.js";import{a as C}from"./verse-icons-F9VwX07_.js";var w=r(e(),1),T=r(t(),1),E={...Object.fromEntries(d.map(e=>[e.id,e.label])),recent:`Recent`},D=[`needs-you`,`recent`,...d.map(e=>e.id).filter(e=>e!==`needs-you`)],O={"needs-you":5,recent:5,chats:8,actions:8,"go-to":6,"seats-apps":5,projects:5};function k(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 A(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 k(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,k(t,n)&&(a+=20),a-=Math.min(20,n-o),s=n,o=n+1}return a}function j(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=A(t,e.title);for(let r of[e.subtitle??``,...e.keywords]){if(!r)continue;let e=A(t,r);e!==null&&(n=Math.max(n??-1/0,e*.6))}if(n===null)return null;r+=n}return r}function M(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 N(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 P(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??e}function F(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`:null,shortcut:r?c(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 I(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?p[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?M(i.startedAt,t):`running`:e.status===`error`?`failed`:N(e.updatedAt,t);n.push({key:`chat:${e.id}`,kind:`chat`,group:`chats`,title:e.title||`Untitled chat`,subtitle:[P(e.projectPath),o].filter(Boolean).join(` · `),shortcut:null,monogram:p[e.engine],engine:e.engine,keywords:[e.model,e.seatId,P(e.projectPath)],argument:null,tone:a?`running`:e.status===`error`?`warn`:`neutral`,payload:{kind:`chat`,sessionId:e.id}})}for(let t of f(`actions`))n.push(F(t,e.platform,`actions`));for(let t of f(`go-to`))n.push(F(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:p[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||P(t.path)}`,subtitle:t.enrolled?`enrolled in the fleet`:null,shortcut:null,monogram:null,engine:null,keywords:[t.name,P(t.path)],argument:null,tone:`neutral`,payload:{kind:`project`,path:t.path,name:t.name||P(t.path)}});return n}function L(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,p[e.engine],e.engine));case`project`:return t.projects.map(e=>n(e.path,e.name||P(e.path),null,null,null));case`session`:return t.sessions.map(e=>n(e.id,e.title||`Untitled chat`,P(e.projectPath),p[e.engine],e.engine));case`section`:return[];default:return[]}}function R(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?l[a]:null,c=i.trim(),d=new Map,f=(e,t,n)=>{let r=d.get(e.group)??[];r.push({item:e,score:t,order:n}),d.set(e.group,r)};if(c===``&&!a){e.filter(e=>e.group===`needs-you`).slice(0,3).forEach((e,t)=>f(e,0,t));let t=n.map(e=>u(e)).filter(e=>e!==null&&e.group!==null);(t.length>0?t:[`chat.new`,`needs-you.open`,`shortcuts.open`].map(e=>u(e))).slice(0,5).forEach((e,t)=>f(F(e,r,`recent`),0,t))}else e.forEach((e,t)=>{if(s&&e.group!==s)return;let n=c===``?0:j(e,c);n!==null&&f(e,n,t)});let p=[];for(let e of D){let t=d.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:O[e];p.push({id:e,label:E[e],items:t.slice(0,r).map(e=>e.item)})}return{groups:p,flat:p.flatMap(e=>e.items),prefix:a}}var z={backdrop:`_backdrop_qk7b5_4`,fade:`_fade_qk7b5_1`,panel:`_panel_qk7b5_16`,rise:`_rise_qk7b5_1`,field:`_field_qk7b5_29`,crumb:`_crumb_qk7b5_37`,input:`_input_qk7b5_49`,list:`_list_qk7b5_66`,group:`_group_qk7b5_74`,groupLabel:`_groupLabel_qk7b5_76`,item:`_item_qk7b5_86`,lead:`_lead_qk7b5_100`,monogram:`_monogram_qk7b5_109`,bullet:`_bullet_qk7b5_128`,text:`_text_qk7b5_136`,title:`_title_qk7b5_143`,subtitle:`_subtitle_qk7b5_153`,trail:`_trail_qk7b5_168`,key:`_key_qk7b5_175`,empty:`_empty_qk7b5_190`,foot:`_foot_qk7b5_197`},B=n();function V({onClose:e=g}){let t=b(),n=v(),r=i(x),c=i(S),l=(0,w.useMemo)(()=>s(),[]),[d,f]=(0,w.useState)(``),[p,E]=(0,w.useState)(0),[D,O]=(0,w.useState)(null),k=(0,w.useRef)(null),A=(0,w.useRef)(null),j=(0,w.useRef)(null),M=(0,w.useId)(),N=(0,w.useId)(),P=(0,w.useRef)(null);P.current=D;let F=(0,w.useCallback)(()=>{P.current?O(null):e()},[e]);a({open:!0,containerRef:k,onClose:F,initialFocusRef:A});let V=(0,w.useMemo)(()=>({needsYou:n.data?.needsYou??[],running:n.data?.running??[],sessions:r.data??c.data?.sessions??[],seats:c.data?.seats??[],projects:c.data?.projects??[],recentActions:t.recentActions,platform:l}),[n.data,r.data,c.data,t.recentActions,l]),H=(0,w.useMemo)(()=>D?.argument?{...R(L(D.argument.kind,V),`>${d}`,[],l),prefix:null}:R(I(V),d,t.recentActions,l),[D,V,d,t.recentActions,l]);(0,w.useEffect)(()=>{E(e=>H.flat.length===0?0:Math.min(e,H.flat.length-1))},[H.flat.length]),(0,w.useEffect)(()=>{(j.current?.querySelector(`[data-index="${p}"]`))?.scrollIntoView?.({block:`nearest`})},[p]);function U(e){O(e),f(``),E(0)}function W(t){if(!t)return;let n=t.payload;if(n.kind===`command`){let t=u(n.commandId);if(t?.argument){U(t);return}e(),y(n.commandId,{via:`palette`});return}switch(e(),n.kind){case`needs-you`:h({split:`all`,focusId:n.itemId});break;case`chat`:m(n.sessionId);break;case`seat`:y(`chat.new-on`,{via:`palette`,argument:{kind:`seat`,id:n.seatId,label:n.label}});break;case`project`:_(`new-chat`,{projectPath:n.path});break;case`argument`:D&&y(D.id,{via:`palette`,argument:n.argument})}}function G(t){let n=H.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&&E(e=>(e+1)%n);return;case`ArrowUp`:t.preventDefault(),n>0&&E(e=>(e-1+n)%n);return;case`Home`:n>0&&(t.preventDefault(),E(0));return;case`End`:n>0&&(t.preventDefault(),E(n-1));return;case`Enter`:t.preventDefault(),W(H.flat[p]);return;case`Tab`:{t.preventDefault();let e=H.flat[p],n=e?.payload.kind===`command`?u(e.payload.commandId):null;n?.argument&&U(n);return}case`Backspace`:D&&d===``&&(t.preventDefault(),O(null));return;case`Escape`:t.preventDefault(),t.stopPropagation(),D?O(null):e();return;default:return}}let K=H.flat[p],q=D?.argument?`${D.argument.prompt}…`:`Search chats, actions and places`,J=-1;return(0,T.createPortal)((0,B.jsx)(`div`,{className:z.backdrop,onMouseDown:t=>t.target===t.currentTarget&&e(),children:(0,B.jsxs)(`div`,{ref:k,className:z.panel,role:`dialog`,"aria-modal":`true`,"aria-labelledby":N,"data-verse-overlay":`palette`,children:[(0,B.jsx)(`h2`,{id:N,className:`visually-hidden`,children:`Command palette`}),(0,B.jsxs)(`div`,{className:z.field,children:[D?(0,B.jsxs)(`span`,{className:z.crumb,children:[D.title.replace(/…$/,``),(0,B.jsx)(`span`,{"aria-hidden":`true`,children:` ›`})]}):null,(0,B.jsx)(`input`,{ref:A,className:z.input,value:d,placeholder:q,"aria-label":D?.argument?D.argument.prompt:`Search commands`,role:`combobox`,"aria-expanded":`true`,"aria-controls":M,"aria-autocomplete":`list`,"aria-activedescendant":K?`${M}-${p}`:void 0,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,onChange:e=>{f(e.target.value),E(0)},onKeyDown:G})]}),(0,B.jsx)(`div`,{ref:j,id:M,className:z.list,role:`listbox`,"aria-label":`Results`,children:H.flat.length===0?(0,B.jsx)(`p`,{className:z.empty,children:D?`No ${D.argument?.prompt.toLowerCase()??`match`} matches “${d}”.`:`Nothing matches “${d.trim()}”.`}):H.groups.map(e=>(0,B.jsxs)(`div`,{role:`group`,"aria-label":D?D.argument?.prompt??e.label:e.label,className:z.group,children:[(0,B.jsx)(`div`,{className:z.groupLabel,"aria-hidden":`true`,children:D?D.argument?.prompt:e.label}),e.items.map(e=>{J+=1;let t=J;return(0,B.jsxs)(`div`,{id:`${M}-${t}`,"data-index":t,role:`option`,"aria-selected":t===p,className:z.item,"data-tone":e.tone,onMouseMove:()=>t!==p&&E(t),onMouseDown:e=>e.preventDefault(),onClick:()=>W(e),children:[(0,B.jsx)(`span`,{className:z.lead,"aria-hidden":`true`,children:e.monogram?(0,B.jsx)(`span`,{className:z.monogram,"data-engine":e.engine??void 0,children:e.engine?(0,B.jsx)(o,{engine:e.engine,size:13}):e.monogram}):(0,B.jsx)(`span`,{className:z.bullet,"data-kind":e.kind})}),(0,B.jsxs)(`span`,{className:z.text,children:[(0,B.jsx)(`span`,{className:z.title,children:e.title}),e.subtitle?(0,B.jsx)(`span`,{className:z.subtitle,children:e.subtitle}):null]}),(0,B.jsxs)(`span`,{className:z.trail,children:[e.argument?(0,B.jsx)(`kbd`,{className:z.key,children:`⇥`}):null,e.shortcut?(0,B.jsx)(`kbd`,{className:z.key,children:e.shortcut}):null]})]},e.key)})]},e.id))}),(0,B.jsxs)(`div`,{className:z.foot,"aria-hidden":`true`,children:[(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`↑↓`}),` move`]}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:(0,B.jsx)(C,{})}),` run`]}),K?.argument?(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`⇥`}),` `,K.argument.prompt.toLowerCase()]}):null,(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`esc`}),` `,D?`back`:`close`]}),D?null:(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`kbd`,{className:z.key,children:`>`}),` actions only · `,(0,B.jsx)(`kbd`,{className:z.key,children:`#`}),` chats only`]})]}),(0,B.jsx)(`p`,{className:`visually-hidden`,role:`status`,"aria-live":`polite`,children:H.flat.length===1?`1 result`:`${H.flat.length} results`})]})}),document.body)}export{V as CommandPalette};
2
+ //# sourceMappingURL=CommandPalette-zYLFZRnj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommandPalette-C5w2o1-r.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/palette-model.ts","../../../../../../src/web-ui/routes/verse/shell/CommandPalette.module.css","../../../../../../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' : 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\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 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 out.push({ id, label: GROUP_LABEL[id], items: list.slice(0, cap).map((e) => e.item) });\n }\n return { groups: out, flat: out.flatMap((g) => g.items), prefix };\n}\n","/* ⌘K — a raised panel over a dimmed workbench. Hairlines, one accent (the\n highlighted row), engine identity only as a monogram tile. */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: var(--z-command-palette);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: 12vh var(--space-4) var(--space-4);\n background: var(--bg-overlay);\n animation: fade var(--duration-fast) var(--ease-standard);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n width: min(640px, 100%);\n max-height: min(560px, 72vh);\n overflow: hidden;\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-xl);\n animation: rise var(--duration-base) var(--ease-decelerate);\n}\n\n.field {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: 0 var(--space-4);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.crumb {\n flex: none;\n padding: 2px var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-selected);\n color: var(--text-primary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n white-space: nowrap;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n /* The palette's search field is a notch taller than a full control, so it\n reads as the palette's title: control + 20px = 52px comfortable, 48px\n compact. Derived rather than literal so Density reaches it. */\n height: calc(var(--control-h) + var(--space-5));\n border: 0;\n background: transparent;\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n}\n.input::placeholder { color: var(--text-tertiary); }\n.input:focus-visible { outline: none; box-shadow: none; }\n\n.list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: var(--space-1) var(--space-2) var(--space-2);\n}\n\n.group + .group { margin-top: var(--space-1); }\n\n.groupLabel {\n padding: var(--space-2) var(--space-2) var(--space-1);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.item {\n display: grid;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--space-3);\n /* A list row plus its 4px+4px padding: 40px comfortable, 34px compact. */\n min-height: calc(var(--density-row) + var(--space-2));\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-md);\n color: var(--text-primary);\n cursor: pointer;\n}\n.item[aria-selected='true'] { background: var(--bg-selected); }\n\n.lead {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Engine identity: a letter on a tile with a 2px engine tick — never a logo.\n Its 20px is intrinsic glyph geometry (a square identity mark, like Apps'\n monogram tile), not a control height, so it does not follow Density. */\n.monogram {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: var(--radius-sm);\n background: var(--bg-hover);\n box-shadow: inset 2px 0 0 var(--text-tertiary);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.monogram[data-engine='claude'] { box-shadow: inset 2px 0 0 var(--engine-claude); }\n.monogram[data-engine='codex'] { box-shadow: inset 2px 0 0 var(--engine-codex); }\n.monogram[data-engine='grok'] { box-shadow: inset 2px 0 0 var(--engine-grok); }\n.monogram[data-engine='local'] { box-shadow: inset 2px 0 0 var(--engine-local); }\n\n.bullet {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n.bullet[data-kind='needs-you'] { background: var(--status-warning-solid); }\n\n.text {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.title {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.subtitle {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.item[data-tone='running'] .subtitle { color: var(--status-running-fg); }\n.item[data-tone='warn'] .subtitle { color: var(--status-warning-fg); }\n.item[data-tone='danger'] .bullet { background: var(--status-danger-solid); }\n\n.trail {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n/* <kbd> keycap: a non-interactive glyph sized to its chord (20px), not a control. */\n.key {\n display: inline-flex;\n align-items: center;\n min-width: 20px;\n height: 20px;\n padding: 0 var(--space-1);\n justify-content: center;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n background: var(--bg-surface);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n color: var(--text-secondary);\n}\n\n.empty {\n padding: var(--space-8) var(--space-4);\n text-align: center;\n font-size: var(--text-sm-size);\n color: var(--text-tertiary);\n}\n\n.foot {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-4);\n padding: var(--space-2) var(--space-4);\n border-top: 1px solid var(--border-subtle);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n}\n.foot span { display: inline-flex; align-items: center; gap: var(--space-1); }\n\n@keyframes fade { from { opacity: 0; } }\n@keyframes rise { from { opacity: 0; transform: translateY(-4px); } }\n\n/* Phone: a full-width sheet from the top; no footer (no keyboard). */\n@media (max-width: 479.98px) {\n .backdrop { padding: var(--space-2); align-items: stretch; }\n .panel { width: 100%; max-height: 100%; border-radius: var(--radius-lg); }\n .foot { display: none; }\n .text { flex-direction: column; align-items: stretch; gap: 0; }\n /* A touch target on a phone — fixed on purpose: the DESKTOP density switch\n must not shrink a finger target (same rule as VerseApp's bottom bar). */\n .item { min-height: 48px; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .backdrop,\n :root:not([data-motion='full']) .panel { animation: none; }\n}\n:root[data-motion='reduce'] .backdrop,\n:root[data-motion='reduce'] .panel { animation: none; }\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 { 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 { 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\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 const [query, setQuery] = useState('');\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 // Keep the highlight on a real row as results change.\n useEffect(() => {\n setActive((i) => (view.flat.length === 0 ? 0 : Math.min(i, view.flat.length - 1)));\n }, [view.flat.length]);\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 setActive(0);\n }}\n onKeyDown={onKeyDown}\n />\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"],"mappings":"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"}
1
+ {"version":3,"file":"CommandPalette-zYLFZRnj.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/palette-model.ts","../../../../../../src/web-ui/routes/verse/shell/CommandPalette.module.css","../../../../../../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' : 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\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 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 out.push({ id, label: GROUP_LABEL[id], items: list.slice(0, cap).map((e) => e.item) });\n }\n return { groups: out, flat: out.flatMap((g) => g.items), prefix };\n}\n","/* ⌘K — a raised panel over a dimmed workbench. Hairlines, one accent (the\n highlighted row), engine identity only as a monogram tile. */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: var(--z-command-palette);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: 12vh var(--space-4) var(--space-4);\n background: var(--bg-overlay);\n animation: fade var(--duration-fast) var(--ease-standard);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n width: min(640px, 100%);\n max-height: min(560px, 72vh);\n overflow: hidden;\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-xl);\n animation: rise var(--duration-base) var(--ease-decelerate);\n}\n\n.field {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: 0 var(--space-4);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.crumb {\n flex: none;\n padding: 2px var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-selected);\n color: var(--text-primary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n white-space: nowrap;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n /* The palette's search field is a notch taller than a full control, so it\n reads as the palette's title: control + 20px = 52px comfortable, 48px\n compact. Derived rather than literal so Density reaches it. */\n height: calc(var(--control-h) + var(--space-5));\n border: 0;\n background: transparent;\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n}\n.input::placeholder { color: var(--text-tertiary); }\n.input:focus-visible { outline: none; box-shadow: none; }\n\n.list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: var(--space-1) var(--space-2) var(--space-2);\n}\n\n.group + .group { margin-top: var(--space-1); }\n\n.groupLabel {\n padding: var(--space-2) var(--space-2) var(--space-1);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.item {\n display: grid;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--space-3);\n /* A list row plus its 4px+4px padding: 40px comfortable, 34px compact. */\n min-height: calc(var(--density-row) + var(--space-2));\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-md);\n color: var(--text-primary);\n cursor: pointer;\n}\n.item[aria-selected='true'] { background: var(--bg-selected); }\n\n.lead {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Engine identity: a letter on a tile with a 2px engine tick — never a logo.\n Its 20px is intrinsic glyph geometry (a square identity mark, like Apps'\n monogram tile), not a control height, so it does not follow Density. */\n.monogram {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: var(--radius-sm);\n background: var(--bg-hover);\n box-shadow: inset 2px 0 0 var(--text-tertiary);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.monogram[data-engine='claude'] { box-shadow: inset 2px 0 0 var(--engine-claude); }\n.monogram[data-engine='codex'] { box-shadow: inset 2px 0 0 var(--engine-codex); }\n.monogram[data-engine='grok'] { box-shadow: inset 2px 0 0 var(--engine-grok); }\n.monogram[data-engine='local'] { box-shadow: inset 2px 0 0 var(--engine-local); }\n\n.bullet {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n.bullet[data-kind='needs-you'] { background: var(--status-warning-solid); }\n\n.text {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.title {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.subtitle {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.item[data-tone='running'] .subtitle { color: var(--status-running-fg); }\n.item[data-tone='warn'] .subtitle { color: var(--status-warning-fg); }\n.item[data-tone='danger'] .bullet { background: var(--status-danger-solid); }\n\n.trail {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n/* <kbd> keycap: a non-interactive glyph sized to its chord (20px), not a control. */\n.key {\n display: inline-flex;\n align-items: center;\n min-width: 20px;\n height: 20px;\n padding: 0 var(--space-1);\n justify-content: center;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n background: var(--bg-surface);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n color: var(--text-secondary);\n}\n\n.empty {\n padding: var(--space-8) var(--space-4);\n text-align: center;\n font-size: var(--text-sm-size);\n color: var(--text-tertiary);\n}\n\n.foot {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-4);\n padding: var(--space-2) var(--space-4);\n border-top: 1px solid var(--border-subtle);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n}\n.foot span { display: inline-flex; align-items: center; gap: var(--space-1); }\n\n@keyframes fade { from { opacity: 0; } }\n@keyframes rise { from { opacity: 0; transform: translateY(-4px); } }\n\n/* Phone: a full-width sheet from the top; no footer (no keyboard). */\n@media (max-width: 479.98px) {\n .backdrop { padding: var(--space-2); align-items: stretch; }\n .panel { width: 100%; max-height: 100%; border-radius: var(--radius-lg); }\n .foot { display: none; }\n .text { flex-direction: column; align-items: stretch; gap: 0; }\n /* A touch target on a phone — fixed on purpose: the DESKTOP density switch\n must not shrink a finger target (same rule as VerseApp's bottom bar). */\n .item { min-height: 48px; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .backdrop,\n :root:not([data-motion='full']) .panel { animation: none; }\n}\n:root[data-motion='reduce'] .backdrop,\n:root[data-motion='reduce'] .panel { animation: none; }\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 { 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 { 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\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 const [query, setQuery] = useState('');\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 // Keep the highlight on a real row as results change.\n useEffect(() => {\n setActive((i) => (view.flat.length === 0 ? 0 : Math.min(i, view.flat.length - 1)));\n }, [view.flat.length]);\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 setActive(0);\n }}\n onKeyDown={onKeyDown}\n />\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"],"mappings":"2hBA4Ea,EAAmE,CAC9E,GAAI,OAAO,YAAY,EAAe,IAAK,GAAM,CAAC,EAAE,GAAI,EAAE,KAAK,CAAC,CAAC,EACjE,OAAQ,QACV,EAEM,EAAsD,CAC1D,YACA,SACA,GAAG,EAAe,IAAK,GAAM,EAAE,EAAE,CAAC,CAAC,OAAQ,GAAO,IAAO,WAAW,CACtE,EAGM,EAAiE,CACrE,YAAa,EACb,OAAA,EACA,MAAO,EACP,QAAS,EACT,QAAS,EACT,aAAc,EACd,SAAU,CACZ,EAMA,SAAS,EAAY,EAAc,EAAwB,CACzD,GAAI,IAAU,EAAG,MAAO,GACxB,IAAM,EAAO,EAAK,EAAQ,GAC1B,MAAO,iBAAiB,KAAK,CAAI,GAAM,QAAQ,KAAK,CAAI,GAAK,QAAQ,KAAK,EAAK,EAAO,CACxF,CAMA,SAAgB,EAAW,EAAc,EAA6B,CACpE,IAAM,EAAI,EAAK,YAAY,EAC3B,GAAI,CAAC,EAAG,MAAO,GACf,IAAM,EAAQ,EAAK,YAAY,EACzB,EAAK,EAAM,QAAQ,CAAC,EAC1B,GAAI,GAAM,EAAG,CAIX,IAAI,EAAQ,IAAQ,EAAK,EAGzB,OAFI,EAAY,EAAM,CAAE,IAAG,GAAS,KAChC,IAAO,IAAG,GAAS,KAChB,CACT,CAEA,IAAI,EAAQ,EACR,EAAO,EACP,EAAU,GACd,IAAK,IAAM,KAAM,EAAG,CAClB,IAAM,EAAM,EAAM,QAAQ,EAAI,CAAI,EAClC,GAAI,EAAM,EAAG,OAAO,KACpB,GAAS,IAAQ,EAAU,EAAI,GAAK,EAChC,EAAY,EAAM,CAAG,IAAG,GAAS,IACrC,GAAS,KAAK,IAAI,GAAI,EAAM,CAAI,EAChC,EAAU,EACV,EAAO,EAAM,CACf,CACA,OAAO,CACT,CAGA,SAAgB,EAAU,EAA4D,EAA8B,CAClH,IAAM,EAAQ,EAAM,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO,EACtD,GAAI,EAAM,SAAW,EAAG,MAAO,GAC/B,IAAI,EAAQ,EACZ,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAI,EAAsB,EAAW,EAAM,EAAK,KAAK,EACrD,IAAK,IAAM,IAAS,CAAC,EAAK,UAAY,GAAI,GAAG,EAAK,QAAQ,EAAG,CAC3D,GAAI,CAAC,EAAO,SACZ,IAAM,EAAI,EAAW,EAAM,CAAK,EAE5B,IAAM,OAAM,EAAO,KAAK,IAAI,GAAQ,KAA0B,EAAI,EAAG,EAC3E,CACA,GAAI,IAAS,KAAM,OAAO,KAC1B,GAAS,CACX,CACA,OAAO,CACT,CAMA,SAAS,EAAQ,EAAmB,EAAqB,CACvD,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,OAAO,EAAM,KAAK,MAAM,CAAS,GAAK,GAAI,CAAC,EACtE,GAAI,CAAC,OAAO,SAAS,CAAC,EAAG,MAAO,UAChC,GAAI,EAAI,GAAI,MAAO,WAAW,EAAE,GAChC,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAE3B,OADI,EAAI,GAAW,WAAW,EAAE,IAAI,OAAO,EAAI,EAAE,CAAC,CAAC,SAAS,EAAG,GAAG,EAAE,GAC7D,WAAW,KAAK,MAAM,EAAI,EAAE,EAAE,IAAI,EAAI,GAAG,EAClD,CAEA,SAAS,EAAS,EAAa,EAAqB,CAClD,IAAM,EAAI,KAAK,MAAM,CAAG,EACxB,GAAI,CAAC,OAAO,SAAS,CAAC,EAAG,MAAO,GAChC,IAAM,EAAI,KAAK,OAAO,EAAM,GAAK,GAAM,EACvC,GAAI,EAAI,EAAG,MAAO,WAClB,GAAI,EAAI,GAAI,MAAO,GAAG,EAAE,OACxB,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAE3B,OADI,EAAI,GAAW,GAAG,EAAE,OACjB,GAAG,KAAK,MAAM,EAAI,EAAE,EAAE,MAC/B,CAEA,SAAS,EAAY,EAAsB,CACzC,IAAM,EAAQ,EAAK,MAAM,OAAO,CAAC,CAAC,OAAO,OAAO,EAChD,OAAO,EAAM,EAAM,OAAS,IAAM,CACpC,CAEA,SAAgB,EAAY,EAA2B,EAAuB,EAA+C,CAC3H,IAAM,EAAQ,EAAQ,KAAK,GAC3B,MAAO,CACL,IAAK,GAAG,EAAM,OAAO,EAAQ,KAC7B,KAAM,UACN,QACA,MAAO,EAAQ,MACf,SAAU,EAAQ,QAAU,QAAU,EAAQ,QAAU,WAAa,UAAY,KACjF,SAAU,EAAQ,EAAY,EAAO,CAAQ,EAAI,KACjD,SAAU,KACV,OAAQ,KACR,SAAU,CAAC,GAAI,EAAQ,UAAY,CAAC,EAAI,EAAQ,QAAQ,YAAY,CAAC,EACrE,SAAU,EAAQ,SAAW,CAAE,GAAG,EAAQ,QAAS,EAAI,KACvD,KAAM,EAAQ,OAAO,QAAQ,YAAc,SAAW,UACtD,QAAS,CAAE,KAAM,UAAW,UAAW,EAAQ,EAAG,CACpD,CACF,CAGA,SAAgB,EAAkB,EAAoC,CACpE,IAAM,EAAM,EAAM,KAAO,KAAK,IAAI,EAC5B,EAAuB,CAAC,EAE9B,IAAK,IAAM,KAAK,EAAM,SACpB,EAAM,KAAK,CACT,IAAK,aAAa,EAAE,KACpB,KAAM,YACN,MAAO,YACP,MAAO,EAAE,MACT,SAAU,EAAE,QAAQ,MAAQ,EAAE,QAAQ,QAAU,KAChD,SAAU,KACV,SAAU,EAAE,QAAQ,OAAS,EAAgB,EAAE,QAAQ,QAAU,KACjE,OAAQ,EAAE,QAAQ,OAClB,SAAU,CAAC,EAAE,KAAK,QAAQ,KAAM,GAAG,EAAG,EAAE,OAAQ,WAAW,EAC3D,SAAU,KACV,KAAM,EAAE,WAAa,OAAS,SAAW,EAAE,WAAa,OAAS,OAAS,UAC1E,QAAS,CAAE,KAAM,YAAa,OAAQ,EAAE,EAAG,CAC7C,CAAC,EAGH,IAAM,EAAU,IAAI,IAAI,EAAM,QAAQ,IAAK,GAAM,CAAC,EAAE,UAAW,CAAC,CAAU,CAAC,EACrE,EAAW,CAAC,GAAG,EAAM,QAAQ,CAAC,CAAC,MAAM,EAAG,IAAM,CAClD,IAAM,EAAK,EAAQ,IAAI,EAAE,EAAE,GAAK,EAAE,SAAW,UAAY,EAAI,EACvD,EAAK,EAAQ,IAAI,EAAE,EAAE,GAAK,EAAE,SAAW,UAAY,EAAI,EAE7D,OADI,IAAO,EACJ,EAAE,UAAY,EAAE,UAAY,EAAI,EAAE,UAAY,EAAE,UAAY,GAAK,EADlD,EAAK,CAE7B,CAAC,EACD,IAAK,IAAM,KAAK,EAAU,CACxB,IAAM,EAAO,EAAQ,IAAI,EAAE,EAAE,EACvB,EAAY,CAAC,CAAC,GAAQ,EAAE,SAAW,UACnC,EAAS,EAAa,EAAO,EAAQ,EAAK,UAAW,CAAG,EAAI,UAAa,EAAE,SAAW,QAAU,SAAW,EAAS,EAAE,UAAW,CAAG,EAC1I,EAAM,KAAK,CACT,IAAK,QAAQ,EAAE,KACf,KAAM,OACN,MAAO,QACP,MAAO,EAAE,OAAS,gBAClB,SAAU,CAAC,EAAY,EAAE,WAAW,EAAG,CAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,EACzE,SAAU,KACV,SAAU,EAAgB,EAAE,QAC5B,OAAQ,EAAE,OACV,SAAU,CAAC,EAAE,MAAO,EAAE,OAAQ,EAAY,EAAE,WAAW,CAAC,EACxD,SAAU,KACV,KAAM,EAAY,UAAY,EAAE,SAAW,QAAU,OAAS,UAC9D,QAAS,CAAE,KAAM,OAAQ,UAAW,EAAE,EAAG,CAC3C,CAAC,CACH,CAEA,IAAK,IAAM,KAAW,EAAgB,SAAS,EAAG,EAAM,KAAK,EAAY,EAAS,EAAM,SAAU,SAAS,CAAC,EAC5G,IAAK,IAAM,KAAW,EAAgB,OAAO,EAAG,EAAM,KAAK,EAAY,EAAS,EAAM,SAAU,OAAO,CAAC,EAExG,IAAK,IAAM,KAAQ,EAAM,MACvB,EAAM,KAAK,CACT,IAAK,QAAQ,EAAK,KAClB,KAAM,OACN,MAAO,aACP,MAAO,eAAe,EAAK,QAC3B,SAAU,EAAK,GACf,SAAU,KACV,SAAU,EAAgB,EAAK,QAC/B,OAAQ,EAAK,OACb,SAAU,CAAC,EAAK,OAAQ,EAAK,MAAO,OAAQ,SAAS,EACrD,SAAU,KACV,KAAM,UACN,QAAS,CAAE,KAAM,OAAQ,OAAQ,EAAK,GAAI,MAAO,EAAK,KAAM,CAC9D,CAAC,EAGH,IAAK,IAAM,KAAW,EAAM,SAC1B,EAAM,KAAK,CACT,IAAK,WAAW,EAAQ,OACxB,KAAM,UACN,MAAO,WACP,MAAO,eAAe,EAAQ,MAAQ,EAAY,EAAQ,IAAI,IAC9D,SAAU,EAAQ,SAAW,wBAA0B,KACvD,SAAU,KACV,SAAU,KACV,OAAQ,KACR,SAAU,CAAC,EAAQ,KAAM,EAAY,EAAQ,IAAI,CAAC,EAClD,SAAU,KACV,KAAM,UACN,QAAS,CAAE,KAAM,UAAW,KAAM,EAAQ,KAAM,KAAM,EAAQ,MAAQ,EAAY,EAAQ,IAAI,CAAE,CAClG,CAAC,EAGH,OAAO,CACT,CAGA,SAAgB,EAAc,EAA2B,EAAoC,CAC3F,IAAM,GAAQ,EAAY,EAAe,EAAyB,EAAyB,KAAgD,CACzI,IAAK,OAAO,EAAK,GAAG,IACpB,KAAM,WACN,MAAO,UACP,MAAO,EACP,WACA,SAAU,KACV,WACA,SACA,SAAU,CAAC,CAAE,EACb,SAAU,KACV,KAAM,UACN,QAAS,CAAE,KAAM,WAAY,SAAU,CAAE,OAAM,KAAI,OAAM,CAAE,CAC7D,GACA,OAAQ,EAAR,CACE,IAAK,OACH,OAAO,EAAM,MAAM,IAAK,GAAM,EAAK,EAAE,GAAI,EAAE,MAAO,EAAE,GAAI,EAAgB,EAAE,QAAS,EAAE,MAAM,CAAC,EAC9F,IAAK,UACH,OAAO,EAAM,SAAS,IAAK,GAAM,EAAK,EAAE,KAAM,EAAE,MAAQ,EAAY,EAAE,IAAI,EAAG,KAAM,KAAM,IAAI,CAAC,EAChG,IAAK,UACH,OAAO,EAAM,SAAS,IAAK,GAAM,EAAK,EAAE,GAAI,EAAE,OAAS,gBAAiB,EAAY,EAAE,WAAW,EAAG,EAAgB,EAAE,QAAS,EAAE,MAAM,CAAC,EAC1I,IAAK,UACH,MAAO,CAAC,EACV,QACE,MAAO,CAAC,CACZ,CACF,CAiBA,SAAgB,EAAY,EAA+B,EAAkB,EAAkC,EAAoC,CACjJ,IAAI,EAAQ,EACR,EAA2B,KACzB,EAAQ,EAAM,UAAU,CAAC,CAAC,OAAO,CAAC,GACpC,IAAU,KAAO,IAAU,OAC7B,EAAS,EACT,EAAQ,EAAM,UAAU,CAAC,CAAC,MAAM,CAAC,GAEnC,IAAM,EAA8B,EAAS,EAAiB,GAAU,KAClE,EAAU,EAAM,KAAK,EAErB,EAAS,IAAI,IACb,GAAQ,EAAmB,EAAe,IAAkB,CAChE,IAAM,EAAO,EAAO,IAAI,EAAK,KAAK,GAAK,CAAC,EACxC,EAAK,KAAK,CAAE,OAAM,QAAO,OAAM,CAAC,EAChC,EAAO,IAAI,EAAK,MAAO,CAAI,CAC7B,EAEA,GAAI,IAAY,IAAM,CAAC,EAAQ,CAE7B,EAAM,OAAQ,GAAM,EAAE,QAAU,WAAW,CAAC,CAAC,MAAM,EAAG,CAAC,CAAC,CAAC,SAAS,EAAM,IAAU,EAAK,EAAM,EAAG,CAAK,CAAC,EACtG,IAAM,EAAS,EAAc,IAAK,GAAO,EAAY,CAAE,CAAC,CAAC,CAAC,OAAQ,GAA6B,IAAM,MAAQ,EAAE,QAAU,IAAI,GAC/G,EAAO,OAAS,EAAI,EAAU,CAAC,WAAY,iBAAkB,gBAAgB,CAAC,CAAW,IAAK,GAAO,EAAY,CAAE,CAAE,EAAA,CAC7H,MAAM,EAAA,CAAuB,CAAC,CAAC,SAAS,EAAS,IAAU,EAAK,EAAY,EAAS,EAAU,QAAQ,EAAG,EAAG,CAAK,CAAC,CAC3H,MACE,EAAM,SAAS,EAAM,IAAU,CAC7B,GAAI,GAAQ,EAAK,QAAU,EAAM,OACjC,IAAM,EAAQ,IAAY,GAAK,EAAI,EAAU,EAAM,CAAO,EACtD,IAAU,MACd,EAAK,EAAM,EAAO,CAAK,CACzB,CAAC,EAGH,IAAM,EAAsB,CAAC,EAC7B,IAAK,IAAM,KAAM,EAAa,CAC5B,IAAM,EAAO,EAAO,IAAI,CAAE,EAC1B,GAAI,CAAC,GAAQ,EAAK,SAAW,EAAG,SAGhC,IAAM,EAAW,GAA8B,IAAO,SAAW,EAAE,KAAK,OAAS,UAAY,EAAI,EACjG,EAAK,MAAM,EAAG,IAAM,EAAQ,CAAC,EAAI,EAAQ,CAAC,GAAK,EAAE,MAAQ,EAAE,OAAS,EAAE,MAAQ,EAAE,KAAK,EACrF,IAAM,EAAM,EAAS,GAAK,EAAU,GACpC,EAAI,KAAK,CAAE,KAAI,MAAO,EAAY,GAAK,MAAO,EAAK,MAAM,EAAG,CAAG,CAAC,CAAC,IAAK,GAAM,EAAE,IAAI,CAAE,CAAC,CACvF,CACA,MAAO,CAAE,OAAQ,EAAK,KAAM,EAAI,QAAS,GAAM,EAAE,KAAK,EAAG,QAAO,CAClE,0hBE7VA,SAAgB,EAAe,CAAE,UAAU,GAA0C,CACnF,IAAM,EAAK,EAAW,EAChB,EAAW,EAAY,EACvB,EAAW,EAAS,CAAkB,EACtC,EAAY,EAAS,CAAmB,EACxC,GAAA,EAAW,EAAA,QAAA,KAAc,EAAkB,EAAG,CAAC,CAAC,EAChD,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAS,EAAE,EAC/B,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,CAAC,EAChC,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAkC,IAAI,EAC5D,GAAA,EAAW,EAAA,OAAA,CAAuB,IAAI,EACtC,GAAA,EAAW,EAAA,OAAA,CAAyB,IAAI,EACxC,GAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,GAAA,EAAS,EAAA,MAAA,CAAM,EACf,GAAA,EAAU,EAAA,MAAA,CAAM,EAIhB,GAAA,EAAS,EAAA,OAAA,CAAgC,IAAI,EACnD,EAAO,QAAU,EACjB,IAAM,GAAA,EAAY,EAAA,YAAA,KAAkB,CAC9B,EAAO,QAAS,EAAU,IAAI,EAC7B,EAAQ,CACf,EAAG,CAAC,CAAO,CAAC,EACZ,EAAa,CAAE,KAAM,GAAM,aAAc,EAAU,QAAS,EAAW,gBAAiB,CAAS,CAAC,EAElG,IAAM,GAAA,EAAQ,EAAA,QAAA,MACL,CACL,SAAU,EAAS,MAAM,UAAY,CAAC,EACtC,QAAS,EAAS,MAAM,SAAW,CAAC,EACpC,SAAU,EAAS,MAAQ,EAAU,MAAM,UAAY,CAAC,EACxD,MAAO,EAAU,MAAM,OAAS,CAAC,EACjC,SAAU,EAAU,MAAM,UAAY,CAAC,EACvC,cAAe,EAAG,cAClB,UACF,GACA,CAAC,EAAS,KAAM,EAAS,KAAM,EAAU,KAAM,EAAG,cAAe,CAAQ,CAC3E,EAEM,GAAA,EAAO,EAAA,QAAA,KACP,GAAQ,SAGH,CAAE,GADK,EADK,EAAc,EAAO,SAAS,KAAM,CAC7B,EAAY,IAAI,IAAS,CAAC,EAAG,CAC3C,EAAO,OAAQ,IAAK,EAE3B,EAAY,EAAkB,CAAK,EAAG,EAAO,EAAG,cAAe,CAAQ,EAC7E,CAAC,EAAQ,EAAO,EAAO,EAAG,cAAe,CAAQ,CAAC,GAGrD,EAAA,EAAA,UAAA,KAAgB,CACd,EAAW,GAAO,EAAK,KAAK,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,EAAK,KAAK,OAAS,CAAC,CAAE,CACnF,EAAG,CAAC,EAAK,KAAK,MAAM,CAAC,GAErB,EAAA,EAAA,UAAA,KAAgB,EACF,EAAQ,SAAS,cAA2B,gBAAgB,EAAO,GAAG,EAAA,EAC7E,iBAAiB,CAAE,MAAO,SAAU,CAAC,CAC5C,EAAG,CAAC,CAAM,CAAC,EAEX,SAAS,EAAc,EAA2B,CAChD,EAAU,CAAO,EACjB,EAAS,EAAE,EACX,EAAU,CAAC,CACb,CAEA,SAAS,EAAI,EAA+B,CAC1C,GAAI,CAAC,EAAM,OACX,IAAM,EAAU,EAAK,QACrB,GAAI,EAAQ,OAAS,UAAW,CAC9B,IAAM,EAAU,EAAY,EAAQ,SAAS,EAE7C,GAAI,GAAS,SAAU,CACrB,EAAc,CAAO,EACrB,MACF,CACA,EAAQ,EACR,EAAsB,EAAQ,UAAW,CAAE,IAAK,SAAU,CAAC,EAC3D,MACF,CAEA,OADA,EAAQ,EACA,EAAQ,KAAhB,CACE,IAAK,YACH,EAAkB,CAAE,MAAO,MAAO,QAAS,EAAQ,MAAO,CAAC,EAC3D,MACF,IAAK,OACH,EAAiB,EAAQ,SAAS,EAClC,MACF,IAAK,OACH,EAAsB,cAAe,CAAE,IAAK,UAAW,SAAU,CAAE,KAAM,OAAQ,GAAI,EAAQ,OAAQ,MAAO,EAAQ,KAAM,CAAE,CAAC,EAC7H,MACF,IAAK,UACH,EAAoB,WAAY,CAAE,YAAa,EAAQ,IAAK,CAAC,EAC7D,MACF,IAAK,WACC,GAAQ,EAAsB,EAAO,GAAI,CAAE,IAAK,UAAW,SAAU,EAAQ,QAAS,CAAC,CAI/F,CACF,CAEA,SAAS,EAAU,EAA6C,CAC9D,IAAM,EAAQ,EAAK,KAAK,OAClB,EAAM,EAAM,IAClB,IAAK,EAAM,SAAW,EAAM,UAAY,EAAI,YAAY,IAAM,IAAK,CACjE,EAAM,eAAe,EACrB,EAAQ,EACR,MACF,CACA,OAAQ,EAAR,CACE,IAAK,YACH,EAAM,eAAe,EACjB,EAAQ,GAAG,EAAW,IAAO,EAAI,GAAK,CAAK,EAC/C,OACF,IAAK,UACH,EAAM,eAAe,EACjB,EAAQ,GAAG,EAAW,IAAO,EAAI,EAAI,GAAS,CAAK,EACvD,OACF,IAAK,OACC,EAAQ,IAAK,EAAM,eAAe,EAAG,EAAU,CAAC,GACpD,OACF,IAAK,MACC,EAAQ,IAAK,EAAM,eAAe,EAAG,EAAU,EAAQ,CAAC,GAC5D,OACF,IAAK,QACH,EAAM,eAAe,EACrB,EAAI,EAAK,KAAK,EAAO,EACrB,OACF,IAAK,MAAO,CAEV,EAAM,eAAe,EACrB,IAAM,EAAO,EAAK,KAAK,GACjB,EAAU,GAAM,QAAQ,OAAS,UAAY,EAAY,EAAK,QAAQ,SAAS,EAAI,KACrF,GAAS,UAAU,EAAc,CAAO,EAC5C,MACF,CACA,IAAK,YACC,GAAU,IAAU,KACtB,EAAM,eAAe,EACrB,EAAU,IAAI,GAEhB,OACF,IAAK,SACH,EAAM,eAAe,EACrB,EAAM,gBAAgB,EAClB,EAAQ,EAAU,IAAI,EACrB,EAAQ,EACb,OACF,QACE,MACJ,CACF,CAEA,IAAM,EAAa,EAAK,KAAK,GACvB,EAAc,GAAQ,SACxB,GAAG,EAAO,SAAS,OAAO,GAC1B,mCACA,EAAQ,GAEZ,OAAA,EAAO,EAAA,aAAA,EACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAU,YAAc,GAAM,EAAE,SAAW,EAAE,eAAiB,EAAQ,EAC3F,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,IAAK,EAAU,UAAW,EAAO,MAAO,KAAK,SAAS,aAAW,OAAO,kBAAiB,EAAS,qBAAmB,UAA1H,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAU,kBAAkB,SAAA,iBAAmB,CAAA,GAChE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,MAAvB,SAAA,CACG,GACC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,SAAA,CACG,EAAO,MAAM,QAAQ,KAAM,EAAE,GAC9B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,cAAY,OAAO,SAAA,IAAQ,CAAA,CAC7B,CACJ,CAAA,EAAA,MACJ,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,IAAK,EACL,UAAW,EAAO,MAClB,MAAO,EACM,cACb,aAAY,GAAQ,SAAW,EAAO,SAAS,OAAS,kBACxD,KAAK,WACL,gBAAc,OACd,gBAAe,EACf,oBAAkB,OAClB,wBAAuB,EAAa,GAAG,EAAO,GAAG,IAAW,IAAA,GAC5D,aAAa,MACb,YAAY,MACZ,WAAY,GACZ,SAAW,GAAM,CACf,EAAS,EAAE,OAAO,KAAK,EACvB,EAAU,CAAC,CACb,EACW,WACZ,CAAA,CACE,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,IAAK,EAAS,GAAI,EAAQ,UAAW,EAAO,KAAM,KAAK,UAAU,aAAW,UAC9E,SAAA,EAAK,KAAK,SAAW,GACpB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAClB,SAAA,EAAS,MAAM,EAAO,UAAU,OAAO,YAAY,GAAK,QAAQ,YAAY,EAAM,IAAM,oBAAoB,EAAM,KAAK,EAAE,GACzH,CAAA,EAEH,EAAK,OAAO,IAAK,IACf,EAAA,EAAA,KAAA,CAAC,MAAD,CAAoB,KAAK,QAAQ,aAAY,EAAU,EAAO,UAAU,QAAU,EAAM,MAAS,EAAM,MAAO,UAAW,EAAO,MAAhI,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAY,cAAY,OAC5C,SAAA,EAAS,EAAO,UAAU,OAAS,EAAM,KACvC,CAAA,EACJ,EAAM,MAAM,IAAK,GAAS,CACzB,GAAS,EACT,IAAM,EAAI,EACV,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAEE,GAAI,GAAG,EAAO,GAAG,IACjB,aAAY,EACZ,KAAK,SACL,gBAAe,IAAM,EACrB,UAAW,EAAO,KAClB,YAAW,EAAK,KAChB,gBAAmB,IAAM,GAAU,EAAU,CAAC,EAC9C,YAAc,GAAM,EAAE,eAAe,EACrC,YAAe,EAAI,CAAI,EAVzB,SAAA,EAYE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,cAAY,OACvC,SAAA,EAAK,UACJ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,cAAa,EAAK,QAAU,IAAA,GAAY,SAAA,EAAK,QAAS,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,OAAQ,EAAK,OAAQ,KAAM,EAAK,CAAA,EAAI,EAAK,QAAe,CAAA,GAE9J,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,OAAQ,YAAW,EAAK,IAAO,CAAA,CAErD,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,EAAK,KAAY,CAAA,EAChD,EAAK,UAAW,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAW,SAAA,EAAK,QAAe,CAAA,EAAI,IACxE,KACN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,SAAA,CACG,EAAK,UAAW,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAI,KACtD,EAAK,UAAW,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAM,SAAA,EAAK,QAAc,CAAA,EAAI,IACjE,GACH,CA1BE,EAAA,EAAK,GA0BP,CAET,CAAC,CACE,CAtCK,EAAA,EAAM,EAsCX,CACN,CAEA,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,cAAY,OAAzC,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,IAAO,CAAA,EAAC,OAAW,CAAA,CAAA,GACrD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAgB,CAAA,CAAM,CAAA,EAAC,MAAU,CAAA,CAAA,EAClE,GAAY,UAAW,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAC,IAAE,EAAW,SAAS,OAAO,YAAY,CAAQ,CAAA,CAAA,EAAI,MACtH,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,KAAQ,CAAA,EAAC,IAAE,EAAS,OAAS,OAAc,CAAA,CAAA,EAC5E,EAAS,MAAO,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAS,CAAA,EAAC,oBAAgB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,IAAK,SAAA,GAAM,CAAA,EAAC,aAAiB,CAAA,CAAA,CAC9H,KACL,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,kBAAkB,KAAK,SAAS,YAAU,SACpD,SAAA,EAAK,KAAK,SAAW,EAAI,WAAa,GAAG,EAAK,KAAK,OAAO,SAC1D,CAAA,CACA,GACF,CAAA,EACL,SAAS,IACX,CACF"}