@ashlr/hub 3.10.1 → 3.11.2

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 (471) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/README.md +343 -82
  3. package/dist/authority-surface.json +80 -15
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/cloud.d.ts +39 -0
  6. package/dist/cli/cloud.js +448 -0
  7. package/dist/cli/cloud.js.map +1 -0
  8. package/dist/cli/completions.js +4 -0
  9. package/dist/cli/completions.js.map +1 -1
  10. package/dist/cli/help.js +2 -0
  11. package/dist/cli/help.js.map +1 -1
  12. package/dist/cli/index.d.ts +1 -0
  13. package/dist/cli/index.js +10 -0
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/core/cloud/backlog.d.ts +17 -0
  16. package/dist/core/cloud/backlog.js +177 -0
  17. package/dist/core/cloud/backlog.js.map +1 -0
  18. package/dist/core/cloud/budget.d.ts +19 -0
  19. package/dist/core/cloud/budget.js +99 -0
  20. package/dist/core/cloud/budget.js.map +1 -0
  21. package/dist/core/cloud/checkout.d.ts +41 -0
  22. package/dist/core/cloud/checkout.js +168 -0
  23. package/dist/core/cloud/checkout.js.map +1 -0
  24. package/dist/core/cloud/cloud-api.d.ts +86 -0
  25. package/dist/core/cloud/cloud-api.js +599 -0
  26. package/dist/core/cloud/cloud-api.js.map +1 -0
  27. package/dist/core/cloud/delivery-contract.d.ts +25 -0
  28. package/dist/core/cloud/delivery-contract.js +138 -0
  29. package/dist/core/cloud/delivery-contract.js.map +1 -0
  30. package/dist/core/cloud/improvement-backlog.d.ts +11 -0
  31. package/dist/core/cloud/improvement-backlog.js +26 -0
  32. package/dist/core/cloud/improvement-backlog.js.map +1 -0
  33. package/dist/core/cloud/launcher.d.ts +68 -0
  34. package/dist/core/cloud/launcher.js +312 -0
  35. package/dist/core/cloud/launcher.js.map +1 -0
  36. package/dist/core/cloud/service.d.ts +51 -0
  37. package/dist/core/cloud/service.js +215 -0
  38. package/dist/core/cloud/service.js.map +1 -0
  39. package/dist/core/cloud/store.d.ts +41 -0
  40. package/dist/core/cloud/store.js +278 -0
  41. package/dist/core/cloud/store.js.map +1 -0
  42. package/dist/core/cloud/tracker.d.ts +30 -0
  43. package/dist/core/cloud/tracker.js +152 -0
  44. package/dist/core/cloud/tracker.js.map +1 -0
  45. package/dist/core/cloud/types.d.ts +233 -0
  46. package/dist/core/cloud/types.js +73 -0
  47. package/dist/core/cloud/types.js.map +1 -0
  48. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  49. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +5 -4
  50. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +4 -3
  51. package/dist/core/universe/campaign.js +9 -1
  52. package/dist/core/universe/campaign.js.map +1 -1
  53. package/dist/core/universe/runner.d.ts +3 -0
  54. package/dist/core/universe/runner.js +7 -3
  55. package/dist/core/universe/runner.js.map +1 -1
  56. package/dist/core/verse/activity-api.d.ts +3 -1
  57. package/dist/core/verse/activity-api.js +16 -1
  58. package/dist/core/verse/activity-api.js.map +1 -1
  59. package/dist/core/verse/activity.d.ts +7 -0
  60. package/dist/core/verse/activity.js +23 -0
  61. package/dist/core/verse/activity.js.map +1 -1
  62. package/dist/core/verse/compaction-point.d.ts +55 -0
  63. package/dist/core/verse/compaction-point.js +75 -0
  64. package/dist/core/verse/compaction-point.js.map +1 -0
  65. package/dist/core/verse/context-math.d.ts +1 -38
  66. package/dist/core/verse/context-math.js +5 -59
  67. package/dist/core/verse/context-math.js.map +1 -1
  68. package/dist/core/verse/verse-api.d.ts +1 -1
  69. package/dist/core/verse/verse-api.js +2 -0
  70. package/dist/core/verse/verse-api.js.map +1 -1
  71. package/dist/core/vision/leader-cloud.d.ts +63 -0
  72. package/dist/core/vision/leader-cloud.js +134 -0
  73. package/dist/core/vision/leader-cloud.js.map +1 -0
  74. package/dist/core/vision/leader.d.ts +6 -0
  75. package/dist/core/vision/leader.js +12 -1
  76. package/dist/core/vision/leader.js.map +1 -1
  77. package/dist/core/web/public/next/assets/{ActionMenu-BBB7VYjz.js → ActionMenu-_DhtX2gO.js} +2 -2
  78. package/dist/core/web/public/next/assets/{ActionMenu-BBB7VYjz.js.map → ActionMenu-_DhtX2gO.js.map} +1 -1
  79. package/dist/core/web/public/next/assets/Advanced-CAAfaBke.js +2 -0
  80. package/dist/core/web/public/next/assets/Advanced-CAAfaBke.js.map +1 -0
  81. package/dist/core/web/public/next/assets/App-BAywyjE8.js +7 -0
  82. package/dist/core/web/public/next/assets/{App-CbDCLAxn.js.map → App-BAywyjE8.js.map} +1 -1
  83. package/dist/core/web/public/next/assets/AppsSection-CUypKeog.js +2 -0
  84. package/dist/core/web/public/next/assets/AppsSection-CUypKeog.js.map +1 -0
  85. package/dist/core/web/public/next/assets/{AreaTrend-BgnK0wAy.js → AreaTrend-CblDqC8Q.js} +2 -2
  86. package/dist/core/web/public/next/assets/{AreaTrend-BgnK0wAy.js.map → AreaTrend-CblDqC8Q.js.map} +1 -1
  87. package/dist/core/web/public/next/assets/AutonomySection-D3d8lYO3.js +2 -0
  88. package/dist/core/web/public/next/assets/{AutonomySection-BF5UCsMv.js.map → AutonomySection-D3d8lYO3.js.map} +1 -1
  89. package/dist/core/web/public/next/assets/BranchBar-DU0jAV1E.js +2 -0
  90. package/dist/core/web/public/next/assets/{BranchBar-nfSb59Kv.js.map → BranchBar-DU0jAV1E.js.map} +1 -1
  91. package/dist/core/web/public/next/assets/{BudgetControl-BESM12dO.js → BudgetControl-Mm1ZL4u6.js} +2 -2
  92. package/dist/core/web/public/next/assets/{BudgetControl-BESM12dO.js.map → BudgetControl-Mm1ZL4u6.js.map} +1 -1
  93. package/dist/core/web/public/next/assets/{BurnDown-D1AfskPT.js → BurnDown-C1fgcFqo.js} +2 -2
  94. package/dist/core/web/public/next/assets/{BurnDown-D1AfskPT.js.map → BurnDown-C1fgcFqo.js.map} +1 -1
  95. package/dist/core/web/public/next/assets/{Button-Cr_qkQEc.js → Button-DqgLUZvd.js} +2 -2
  96. package/dist/core/web/public/next/assets/{Button-Cr_qkQEc.js.map → Button-DqgLUZvd.js.map} +1 -1
  97. package/dist/core/web/public/next/assets/CapacityStrip-nWFHvqFB.js +2 -0
  98. package/dist/core/web/public/next/assets/CapacityStrip-nWFHvqFB.js.map +1 -0
  99. package/dist/core/web/public/next/assets/ChatSection-DUZNpiVr.js +3 -0
  100. package/dist/core/web/public/next/assets/ChatSection-DUZNpiVr.js.map +1 -0
  101. package/dist/core/web/public/next/assets/CloudBudgetForm-2OW38o_C.js +2 -0
  102. package/dist/core/web/public/next/assets/CloudBudgetForm-2OW38o_C.js.map +1 -0
  103. package/dist/core/web/public/next/assets/CommandPalette-C5w2o1-r.js +2 -0
  104. package/dist/core/web/public/next/assets/{CommandPalette-lLV-OR63.js.map → CommandPalette-C5w2o1-r.js.map} +1 -1
  105. package/dist/core/web/public/next/assets/CommandSection-Bx2knNqY.js +2 -0
  106. package/dist/core/web/public/next/assets/CommandSection-Bx2knNqY.js.map +1 -0
  107. package/dist/core/web/public/next/assets/ConfirmDialog-B7ZwCQOX.js +2 -0
  108. package/dist/core/web/public/next/assets/ConfirmDialog-B7ZwCQOX.js.map +1 -0
  109. package/dist/core/web/public/next/assets/ConfirmDialog-Dx15x0Ho.css +1 -0
  110. package/dist/core/web/public/next/assets/Dialog-BpgcEW6b.js +2 -0
  111. package/dist/core/web/public/next/assets/Dialog-BpgcEW6b.js.map +1 -0
  112. package/dist/core/web/public/next/assets/Dialog-tQ8kFulD.css +1 -0
  113. package/dist/core/web/public/next/assets/{DiffPane-BVxhK-cy.js → DiffPane-DpqRUtCx.js} +2 -2
  114. package/dist/core/web/public/next/assets/{DiffPane-BVxhK-cy.js.map → DiffPane-DpqRUtCx.js.map} +1 -1
  115. package/dist/core/web/public/next/assets/{DiffViewer-yCdw9J-Y.js → DiffViewer-CoV5-nUf.js} +2 -2
  116. package/dist/core/web/public/next/assets/{DiffViewer-yCdw9J-Y.js.map → DiffViewer-CoV5-nUf.js.map} +1 -1
  117. package/dist/core/web/public/next/assets/DockHost-C0Pq7Jak.js +2 -0
  118. package/dist/core/web/public/next/assets/{DockHost-BZReKwos.js.map → DockHost-C0Pq7Jak.js.map} +1 -1
  119. package/dist/core/web/public/next/assets/{EmptyState-D1GDxVZy.js → EmptyState-DYW29ncw.js} +2 -2
  120. package/dist/core/web/public/next/assets/{EmptyState-D1GDxVZy.js.map → EmptyState-DYW29ncw.js.map} +1 -1
  121. package/dist/core/web/public/next/assets/{Epistemic-DRp4dBfB.js → Epistemic-DVx6oHzp.js} +2 -2
  122. package/dist/core/web/public/next/assets/{Epistemic-DRp4dBfB.js.map → Epistemic-DVx6oHzp.js.map} +1 -1
  123. package/dist/core/web/public/next/assets/FleetSection-DSETviPK.js +3 -0
  124. package/dist/core/web/public/next/assets/FleetSection-DSETviPK.js.map +1 -0
  125. package/dist/core/web/public/next/assets/{Funnel-zvDj3He4.js → Funnel-DxiGqJrt.js} +2 -2
  126. package/dist/core/web/public/next/assets/{Funnel-zvDj3He4.js.map → Funnel-DxiGqJrt.js.map} +1 -1
  127. package/dist/core/web/public/next/assets/GearTray-C3I89sIt.js +2 -0
  128. package/dist/core/web/public/next/assets/{GearTray-CkviqjYr.js.map → GearTray-C3I89sIt.js.map} +1 -1
  129. package/dist/core/web/public/next/assets/{GrowthSection-Bg5sW0jI.js → GrowthSection-C3m2bPEz.js} +2 -2
  130. package/dist/core/web/public/next/assets/{GrowthSection-Bg5sW0jI.js.map → GrowthSection-C3m2bPEz.js.map} +1 -1
  131. package/dist/core/web/public/next/assets/HandoffDialog-Bjb96a0N.js +2 -0
  132. package/dist/core/web/public/next/assets/{HandoffDialog-DcPj1ri9.js.map → HandoffDialog-Bjb96a0N.js.map} +1 -1
  133. package/dist/core/web/public/next/assets/{Input-Ci7TD96x.js → Input-ekTehVaH.js} +2 -2
  134. package/dist/core/web/public/next/assets/{Input-Ci7TD96x.js.map → Input-ekTehVaH.js.map} +1 -1
  135. package/dist/core/web/public/next/assets/LeaderCard-85VBbbaZ.js +2 -0
  136. package/dist/core/web/public/next/assets/{LeaderCard-BSFTlMRF.js.map → LeaderCard-85VBbbaZ.js.map} +1 -1
  137. package/dist/core/web/public/next/assets/{MatrixHeatmap-DojKZe9L.js → MatrixHeatmap-Bo8j0QPC.js} +2 -2
  138. package/dist/core/web/public/next/assets/{MatrixHeatmap-DojKZe9L.js.map → MatrixHeatmap-Bo8j0QPC.js.map} +1 -1
  139. package/dist/core/web/public/next/assets/McpSection-DvHFaVyp.js +2 -0
  140. package/dist/core/web/public/next/assets/{McpSection-CvcYu1X_.js.map → McpSection-DvHFaVyp.js.map} +1 -1
  141. package/dist/core/web/public/next/assets/{MessageMarkdown-BrLCrb73.js → MessageMarkdown-fsY_ltVa.js} +3 -3
  142. package/dist/core/web/public/next/assets/{MessageMarkdown-BrLCrb73.js.map → MessageMarkdown-fsY_ltVa.js.map} +1 -1
  143. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CjmdBw2p.js → MessageMarkdownRenderer-DDdtu82l.js} +2 -2
  144. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CjmdBw2p.js.map → MessageMarkdownRenderer-DDdtu82l.js.map} +1 -1
  145. package/dist/core/web/public/next/assets/{Meter-DTHbmhQg.js → Meter-CeGDXdDM.js} +2 -2
  146. package/dist/core/web/public/next/assets/{Meter-DTHbmhQg.js.map → Meter-CeGDXdDM.js.map} +1 -1
  147. package/dist/core/web/public/next/assets/MindSection-CDVhHvXl.js +2 -0
  148. package/dist/core/web/public/next/assets/{MindSection-DcO9fmYe.js.map → MindSection-CDVhHvXl.js.map} +1 -1
  149. package/dist/core/web/public/next/assets/MutationTokenDialog-CrfJ0PdD.css +1 -0
  150. package/dist/core/web/public/next/assets/MutationTokenDialog-DTQzEOHR.js +2 -0
  151. package/dist/core/web/public/next/assets/MutationTokenDialog-DTQzEOHR.js.map +1 -0
  152. package/dist/core/web/public/next/assets/NeedsYouDrawer-6AuN0BF3.js +2 -0
  153. package/dist/core/web/public/next/assets/{NeedsYouDrawer-hiTINupk.js.map → NeedsYouDrawer-6AuN0BF3.js.map} +1 -1
  154. package/dist/core/web/public/next/assets/{NeedsYouList-B4Z37Phx.js → NeedsYouList-ChnRmbSk.js} +2 -2
  155. package/dist/core/web/public/next/assets/{NeedsYouList-B4Z37Phx.js.map → NeedsYouList-ChnRmbSk.js.map} +1 -1
  156. package/dist/core/web/public/next/assets/NewChatDialog-B06E7sqg.js +3 -0
  157. package/dist/core/web/public/next/assets/{NewChatDialog-utSckh7C.js.map → NewChatDialog-B06E7sqg.js.map} +1 -1
  158. package/dist/core/web/public/next/assets/OnboardingFlow-C2M3zov9.js +2 -0
  159. package/dist/core/web/public/next/assets/{OnboardingFlow-7N3YSUHN.js.map → OnboardingFlow-C2M3zov9.js.map} +1 -1
  160. package/dist/core/web/public/next/assets/PreviewPane-Bd6HsX1k.js +2 -0
  161. package/dist/core/web/public/next/assets/{PreviewPane-CqzkaAjG.js.map → PreviewPane-Bd6HsX1k.js.map} +1 -1
  162. package/dist/core/web/public/next/assets/ProviderLogo-Bz7KR5j3.js +2 -0
  163. package/dist/core/web/public/next/assets/ProviderLogo-Bz7KR5j3.js.map +1 -0
  164. package/dist/core/web/public/next/assets/RailStatus-CctCuuLy.js +2 -0
  165. package/dist/core/web/public/next/assets/{RailStatus-sZhApA8k.js.map → RailStatus-CctCuuLy.js.map} +1 -1
  166. package/dist/core/web/public/next/assets/{RefreshIndicator-C1uQIegT.js → RefreshIndicator-CKY5BGdD.js} +2 -2
  167. package/dist/core/web/public/next/assets/{RefreshIndicator-C1uQIegT.js.map → RefreshIndicator-CKY5BGdD.js.map} +1 -1
  168. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CM_8pJs6.css → ResourcePoolConsoleApp-BX9JLkT4.css} +1 -1
  169. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-DXjjV6Sh.js → ResourcePoolConsoleApp-CspIsW_G.js} +5 -5
  170. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-DXjjV6Sh.js.map → ResourcePoolConsoleApp-CspIsW_G.js.map} +1 -1
  171. package/dist/core/web/public/next/assets/ResourcesChrome-B7fHZ6zX.js +3 -0
  172. package/dist/core/web/public/next/assets/ResourcesChrome-B7fHZ6zX.js.map +1 -0
  173. package/dist/core/web/public/next/assets/ResourcesChrome-uZEqC2EM.css +1 -0
  174. package/dist/core/web/public/next/assets/ResourcesDrawer-B7-N9n7-.js +2 -0
  175. package/dist/core/web/public/next/assets/ResourcesDrawer-B7-N9n7-.js.map +1 -0
  176. package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +1 -0
  177. package/dist/core/web/public/next/assets/RouteErrorBoundary-C_B11J0s.js +2 -0
  178. package/dist/core/web/public/next/assets/RouteErrorBoundary-C_B11J0s.js.map +1 -0
  179. package/dist/core/web/public/next/assets/RouteErrorBoundary-DdxhTdZ6.css +1 -0
  180. package/dist/core/web/public/next/assets/RunInCloudAction-_juw4EXd.js +2 -0
  181. package/dist/core/web/public/next/assets/RunInCloudAction-_juw4EXd.js.map +1 -0
  182. package/dist/core/web/public/next/assets/SeatSelector-D_YXvkPy.js +3 -0
  183. package/dist/core/web/public/next/assets/{SeatSelector-CT92PqM_.js.map → SeatSelector-D_YXvkPy.js.map} +1 -1
  184. package/dist/core/web/public/next/assets/{Segmented-BMvq-FfD.js → Segmented-DnKP6rr7.js} +2 -2
  185. package/dist/core/web/public/next/assets/{Segmented-BMvq-FfD.js.map → Segmented-DnKP6rr7.js.map} +1 -1
  186. package/dist/core/web/public/next/assets/{Select-DkdeoSQn.js → Select-DlbUupTX.js} +2 -2
  187. package/dist/core/web/public/next/assets/{Select-DkdeoSQn.js.map → Select-DlbUupTX.js.map} +1 -1
  188. package/dist/core/web/public/next/assets/SessionGate-DnuTZACL.js +2 -0
  189. package/dist/core/web/public/next/assets/SessionGate-DnuTZACL.js.map +1 -0
  190. package/dist/core/web/public/next/assets/SessionGate-DvMpXNpJ.css +1 -0
  191. package/dist/core/web/public/next/assets/SessionInsightChip-C33-k-Q5.js +2 -0
  192. package/dist/core/web/public/next/assets/{SessionInsightChip-CwlakUYU.js.map → SessionInsightChip-C33-k-Q5.js.map} +1 -1
  193. package/dist/core/web/public/next/assets/{SessionSearch-DFByh2NZ.js → SessionSearch-DhhR9Csg.js} +2 -2
  194. package/dist/core/web/public/next/assets/{SessionSearch-DFByh2NZ.js.map → SessionSearch-DhhR9Csg.js.map} +1 -1
  195. package/dist/core/web/public/next/assets/SettingsSection-C0xQvCz3.js +2 -0
  196. package/dist/core/web/public/next/assets/SettingsSection-C0xQvCz3.js.map +1 -0
  197. package/dist/core/web/public/next/assets/Sheet-BvNYOYv5.js +2 -0
  198. package/dist/core/web/public/next/assets/{Sheet-C7APkGPt.js.map → Sheet-BvNYOYv5.js.map} +1 -1
  199. package/dist/core/web/public/next/assets/ShortcutsOverlay-1nUBVO-Z.js +2 -0
  200. package/dist/core/web/public/next/assets/{ShortcutsOverlay-ZPyXUS_I.js.map → ShortcutsOverlay-1nUBVO-Z.js.map} +1 -1
  201. package/dist/core/web/public/next/assets/Sidebar-YrVvvBNM.js +3 -0
  202. package/dist/core/web/public/next/assets/{Sidebar-Chsgazmk.js.map → Sidebar-YrVvvBNM.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/{Slider-B0kjW7cd.js → Slider-B2c-dbQb.js} +2 -2
  204. package/dist/core/web/public/next/assets/{Slider-B0kjW7cd.js.map → Slider-B2c-dbQb.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/{StatusBadge-wv4e6f8b.js → StatusBadge-Q9YYkijx.js} +2 -2
  206. package/dist/core/web/public/next/assets/{StatusBadge-wv4e6f8b.js.map → StatusBadge-Q9YYkijx.js.map} +1 -1
  207. package/dist/core/web/public/next/assets/{StepBand-Db8WPw8J.js → StepBand-Ci-C0GUG.js} +2 -2
  208. package/dist/core/web/public/next/assets/{StepBand-Db8WPw8J.js.map → StepBand-Ci-C0GUG.js.map} +1 -1
  209. package/dist/core/web/public/next/assets/{Surface-BkDrQ4t3.js → Surface-DBovMq4P.js} +2 -2
  210. package/dist/core/web/public/next/assets/{Surface-BkDrQ4t3.js.map → Surface-DBovMq4P.js.map} +1 -1
  211. package/dist/core/web/public/next/assets/{Swimlane-Dcve56cP.js → Swimlane-Cdc4TqDe.js} +2 -2
  212. package/dist/core/web/public/next/assets/{Swimlane-Dcve56cP.js.map → Swimlane-Cdc4TqDe.js.map} +1 -1
  213. package/dist/core/web/public/next/assets/{Switch-DamlpSMY.js → Switch-CUrvzO2k.js} +2 -2
  214. package/dist/core/web/public/next/assets/{Switch-DamlpSMY.js.map → Switch-CUrvzO2k.js.map} +1 -1
  215. package/dist/core/web/public/next/assets/{Tag-Cs4tudBN.js → Tag-Bv8u6APt.js} +2 -2
  216. package/dist/core/web/public/next/assets/{Tag-Cs4tudBN.js.map → Tag-Bv8u6APt.js.map} +1 -1
  217. package/dist/core/web/public/next/assets/TerminalPane-BE4Xlqi5.js +7 -0
  218. package/dist/core/web/public/next/assets/{TerminalPane-BDkKFych.js.map → TerminalPane-BE4Xlqi5.js.map} +1 -1
  219. package/dist/core/web/public/next/assets/UniverseConsoleApp-BGwejf0m.js +2 -0
  220. package/dist/core/web/public/next/assets/{UniverseConsoleApp-BE72VyBL.js.map → UniverseConsoleApp-BGwejf0m.js.map} +1 -1
  221. package/dist/core/web/public/next/assets/{UniverseConsoleApp-Dh7A-hLD.css → UniverseConsoleApp-DfuT-wFw.css} +1 -1
  222. package/dist/core/web/public/next/assets/{UniverseView-BbmYY2P4.js → UniverseView-CgKa-WXC.js} +4 -4
  223. package/dist/core/web/public/next/assets/{UniverseView-BbmYY2P4.js.map → UniverseView-CgKa-WXC.js.map} +1 -1
  224. package/dist/core/web/public/next/assets/UsageSection-CazsHm1f.js +2 -0
  225. package/dist/core/web/public/next/assets/UsageSection-CazsHm1f.js.map +1 -0
  226. package/dist/core/web/public/next/assets/VerseConsoleApp-CTF3Shs0.js +3 -0
  227. package/dist/core/web/public/next/assets/VerseConsoleApp-CTF3Shs0.js.map +1 -0
  228. package/dist/core/web/public/next/assets/VerseConsoleApp-Cxqr-3qc.css +1 -0
  229. package/dist/core/web/public/next/assets/Workspace-CgdyXiEV.js +10 -0
  230. package/dist/core/web/public/next/assets/Workspace-CgdyXiEV.js.map +1 -0
  231. package/dist/core/web/public/next/assets/Workspace-Dwri2jFJ.css +1 -0
  232. package/dist/core/web/public/next/assets/actions-MtxBGS5B.js +2 -0
  233. package/dist/core/web/public/next/assets/{actions-BnjZy8a-.js.map → actions-MtxBGS5B.js.map} +1 -1
  234. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +2 -0
  235. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +1 -0
  236. package/dist/core/web/public/next/assets/budget-queries-CP7hgR-p.js +2 -0
  237. package/dist/core/web/public/next/assets/{budget-queries-Cp6vO7FH.js.map → budget-queries-CP7hgR-p.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/{capacity-strip-model-9-Yb211u.js → capacity-strip-model-fHfu5cph.js} +2 -2
  239. package/dist/core/web/public/next/assets/{capacity-strip-model-9-Yb211u.js.map → capacity-strip-model-fHfu5cph.js.map} +1 -1
  240. package/dist/core/web/public/next/assets/{charts-BmbKhjqw.js → charts-Bis9WSiS.js} +2 -2
  241. package/dist/core/web/public/next/assets/{charts-BmbKhjqw.js.map → charts-Bis9WSiS.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +1 -0
  243. package/dist/core/web/public/next/assets/cloud-queries-BsOepFz6.js +2 -0
  244. package/dist/core/web/public/next/assets/cloud-queries-BsOepFz6.js.map +1 -0
  245. package/dist/core/web/public/next/assets/cloud.module-DoFnr8ZH.js +2 -0
  246. package/dist/core/web/public/next/assets/cloud.module-DoFnr8ZH.js.map +1 -0
  247. package/dist/core/web/public/next/assets/{command-bus-DHJJLWh8.js → command-bus-CMvbYP5K.js} +2 -2
  248. package/dist/core/web/public/next/assets/{command-bus-DHJJLWh8.js.map → command-bus-CMvbYP5K.js.map} +1 -1
  249. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js +2 -0
  250. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js.map +1 -0
  251. package/dist/core/web/public/next/assets/compaction-point-VL9oegWS.js +2 -0
  252. package/dist/core/web/public/next/assets/compaction-point-VL9oegWS.js.map +1 -0
  253. package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js → composer-keys-su0g1h9o.js} +2 -2
  254. package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js.map → composer-keys-su0g1h9o.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/context-model-Ci3Ch9t5.js +2 -0
  256. package/dist/core/web/public/next/assets/{context-model-DeJ28uSZ.js.map → context-model-Ci3Ch9t5.js.map} +1 -1
  257. package/dist/core/web/public/next/assets/context-model-CjiJTnf1.js +2 -0
  258. package/dist/core/web/public/next/assets/{context-model-BGznyHNQ.js.map → context-model-CjiJTnf1.js.map} +1 -1
  259. package/dist/core/web/public/next/assets/context-queries-BDXT6LQ3.js +2 -0
  260. package/dist/core/web/public/next/assets/{context-queries-_mEgy4eg.js.map → context-queries-BDXT6LQ3.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/control-queries-Dv-h1Clu.js +2 -0
  262. package/dist/core/web/public/next/assets/{control-queries-C4TG8blN.js.map → control-queries-Dv-h1Clu.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/{dock-icons-BB7Fi6hT.js → dock-icons-t--Eugrd.js} +2 -2
  264. package/dist/core/web/public/next/assets/{dock-icons-BB7Fi6hT.js.map → dock-icons-t--Eugrd.js.map} +1 -1
  265. package/dist/core/web/public/next/assets/{dock-store-CdHQRP8s.js → dock-store-qIu7kSQE.js} +2 -2
  266. package/dist/core/web/public/next/assets/{dock-store-CdHQRP8s.js.map → dock-store-qIu7kSQE.js.map} +1 -1
  267. package/dist/core/web/public/next/assets/{fleet-model-B4FKC7fH.js → fleet-model-IRbwfhkR.js} +2 -2
  268. package/dist/core/web/public/next/assets/{fleet-model-B4FKC7fH.js.map → fleet-model-IRbwfhkR.js.map} +1 -1
  269. package/dist/core/web/public/next/assets/fleet-queries-7FVNByX1.js +2 -0
  270. package/dist/core/web/public/next/assets/fleet-queries-7FVNByX1.js.map +1 -0
  271. package/dist/core/web/public/next/assets/focus-trap-QqQxQdvH.js +2 -0
  272. package/dist/core/web/public/next/assets/focus-trap-QqQxQdvH.js.map +1 -0
  273. package/dist/core/web/public/next/assets/{format-lW58rL2y.js → format-CaMmVQCn.js} +2 -2
  274. package/dist/core/web/public/next/assets/{format-lW58rL2y.js.map → format-CaMmVQCn.js.map} +1 -1
  275. package/dist/core/web/public/next/assets/git-model-B4S_GUNA.js +5 -0
  276. package/dist/core/web/public/next/assets/{git-model-DaGw1SzS.js.map → git-model-B4S_GUNA.js.map} +1 -1
  277. package/dist/core/web/public/next/assets/global-BkNl4e6E.js +2 -0
  278. package/dist/core/web/public/next/assets/global-BkNl4e6E.js.map +1 -0
  279. package/dist/core/web/public/next/assets/global-BlI2BYa1.css +1 -0
  280. package/dist/core/web/public/next/assets/guarded-action-DHiL8tY5.js +3 -0
  281. package/dist/core/web/public/next/assets/guarded-action-DHiL8tY5.js.map +1 -0
  282. package/dist/core/web/public/next/assets/guarded-runners-DmGEkM2P.js +2 -0
  283. package/dist/core/web/public/next/assets/guarded-runners-DmGEkM2P.js.map +1 -0
  284. package/dist/core/web/public/next/assets/icon-base-NtFmP2yB.js +2 -0
  285. package/dist/core/web/public/next/assets/icon-base-NtFmP2yB.js.map +1 -0
  286. package/dist/core/web/public/next/assets/icons-C5EFt_Ts.js +2 -0
  287. package/dist/core/web/public/next/assets/icons-C5EFt_Ts.js.map +1 -0
  288. package/dist/core/web/public/next/assets/{index-Dk8R-3a7.js → index-DbDw9UAs.js} +3 -3
  289. package/dist/core/web/public/next/assets/{index-Dk8R-3a7.js.map → index-DbDw9UAs.js.map} +1 -1
  290. package/dist/core/web/public/next/assets/{live-model-44wEU6I8.js → live-model-DEwrl7_A.js} +2 -2
  291. package/dist/core/web/public/next/assets/{live-model-44wEU6I8.js.map → live-model-DEwrl7_A.js.map} +1 -1
  292. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +2 -0
  293. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +1 -0
  294. package/dist/core/web/public/next/assets/{mind.module-BOABBdi_.js → mind.module-CLhqMQak.js} +2 -2
  295. package/dist/core/web/public/next/assets/{mind.module-BOABBdi_.js.map → mind.module-CLhqMQak.js.map} +1 -1
  296. package/dist/core/web/public/next/assets/mutations-Kvzsg-iK.js +2 -0
  297. package/dist/core/web/public/next/assets/{mutations-DjXM3IDg.js.map → mutations-Kvzsg-iK.js.map} +1 -1
  298. package/dist/core/web/public/next/assets/nav-C0IunEYF.js +2 -0
  299. package/dist/core/web/public/next/assets/nav-C0IunEYF.js.map +1 -0
  300. package/dist/core/web/public/next/assets/overnight-queries-C_AfcL7q.js +2 -0
  301. package/dist/core/web/public/next/assets/{overnight-queries-Be_eossf.js.map → overnight-queries-C_AfcL7q.js.map} +1 -1
  302. package/dist/core/web/public/next/assets/preloaded-CctOitLu.js +2 -0
  303. package/dist/core/web/public/next/assets/preloaded-CctOitLu.js.map +1 -0
  304. package/dist/core/web/public/next/assets/primitives-CbAGCNKt.js +1 -0
  305. package/dist/core/web/public/next/assets/{queries-CYEVCq5r.js → queries-THD05gHP.js} +2 -2
  306. package/dist/core/web/public/next/assets/{queries-CYEVCq5r.js.map → queries-THD05gHP.js.map} +1 -1
  307. package/dist/core/web/public/next/assets/reasoning-pref-BVPu0SME.js +2 -0
  308. package/dist/core/web/public/next/assets/{reasoning-pref-a_ZP6GzU.js.map → reasoning-pref-BVPu0SME.js.map} +1 -1
  309. package/dist/core/web/public/next/assets/reveal-anchor-wCT5b4m3.js +2 -0
  310. package/dist/core/web/public/next/assets/reveal-anchor-wCT5b4m3.js.map +1 -0
  311. package/dist/core/web/public/next/assets/seat-subscription-CR_VylsK.js +2 -0
  312. package/dist/core/web/public/next/assets/{seat-subscription-CRigL-GE.js.map → seat-subscription-CR_VylsK.js.map} +1 -1
  313. package/dist/core/web/public/next/assets/{section-visibility-u7q-Q9AA.js → section-visibility-B0xXUQJ0.js} +2 -2
  314. package/dist/core/web/public/next/assets/{section-visibility-u7q-Q9AA.js.map → section-visibility-B0xXUQJ0.js.map} +1 -1
  315. package/dist/core/web/public/next/assets/{sidebar-model-i4WRuQ6j.js → sidebar-model-C5wVXGpb.js} +2 -2
  316. package/dist/core/web/public/next/assets/{sidebar-model-i4WRuQ6j.js.map → sidebar-model-C5wVXGpb.js.map} +1 -1
  317. package/dist/core/web/public/next/assets/slots-DDd8cEoh.js +3 -0
  318. package/dist/core/web/public/next/assets/{slots-CV9ZuLQU.js.map → slots-DDd8cEoh.js.map} +1 -1
  319. package/dist/core/web/public/next/assets/surface-data-BFxAlefI.js +2 -0
  320. package/dist/core/web/public/next/assets/{surface-data-DLvmUX9z.js.map → surface-data-BFxAlefI.js.map} +1 -1
  321. package/dist/core/web/public/next/assets/surface-prefetch-CHusyO9q.js +2 -0
  322. package/dist/core/web/public/next/assets/surface-prefetch-CHusyO9q.js.map +1 -0
  323. package/dist/core/web/public/next/assets/{tasks-model-DWs5u9RO.js → tasks-model-DvkWveXs.js} +2 -2
  324. package/dist/core/web/public/next/assets/{tasks-model-DWs5u9RO.js.map → tasks-model-DvkWveXs.js.map} +1 -1
  325. package/dist/core/web/public/next/assets/{terminal-icons-Ct9cZsEK.js → terminal-icons-Dp6pJgV2.js} +2 -2
  326. package/dist/core/web/public/next/assets/{terminal-icons-Ct9cZsEK.js.map → terminal-icons-Dp6pJgV2.js.map} +1 -1
  327. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +2 -0
  328. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -0
  329. package/dist/core/web/public/next/assets/{usage-queries-CI_y9oWZ.js → usage-queries-CUTmnegA.js} +2 -2
  330. package/dist/core/web/public/next/assets/{usage-queries-CI_y9oWZ.js.map → usage-queries-CUTmnegA.js.map} +1 -1
  331. package/dist/core/web/public/next/assets/use-guarded-action-UCX2u1t1.js +2 -0
  332. package/dist/core/web/public/next/assets/{use-guarded-action-DVCtLzSo.js.map → use-guarded-action-UCX2u1t1.js.map} +1 -1
  333. package/dist/core/web/public/next/assets/{use-ticker-C3LQ2IYs.js → use-ticker-OXAjob3y.js} +2 -2
  334. package/dist/core/web/public/next/assets/{use-ticker-C3LQ2IYs.js.map → use-ticker-OXAjob3y.js.map} +1 -1
  335. package/dist/core/web/public/next/assets/use-token-gate-CDDRAoKH.js +2 -0
  336. package/dist/core/web/public/next/assets/{use-token-gate-B5gOFkeH.js.map → use-token-gate-CDDRAoKH.js.map} +1 -1
  337. package/dist/core/web/public/next/assets/useChartWidth-BW6SwYIK.css +1 -0
  338. package/dist/core/web/public/next/assets/useChartWidth-D9M7kUw7.js +2 -0
  339. package/dist/core/web/public/next/assets/{useChartWidth-0APW0BR3.js.map → useChartWidth-D9M7kUw7.js.map} +1 -1
  340. package/dist/core/web/public/next/assets/{useSeatsRefresh-BN8bso-n.js → useSeatsRefresh-B2dCVcj9.js} +2 -2
  341. package/dist/core/web/public/next/assets/{useSeatsRefresh-BN8bso-n.js.map → useSeatsRefresh-B2dCVcj9.js.map} +1 -1
  342. package/dist/core/web/public/next/assets/useVerseTranscript-BL3CljSI.js +2 -0
  343. package/dist/core/web/public/next/assets/useVerseTranscript-BL3CljSI.js.map +1 -0
  344. package/dist/core/web/public/next/assets/verse-icons-DASWdYuE.js +2 -0
  345. package/dist/core/web/public/next/assets/verse-icons-DASWdYuE.js.map +1 -0
  346. package/dist/core/web/public/next/assets/verse-model-BQ0Y2CSr.js +2 -0
  347. package/dist/core/web/public/next/assets/verse-model-BQ0Y2CSr.js.map +1 -0
  348. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js +3 -0
  349. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js.map +1 -0
  350. package/dist/core/web/public/next/assets/verse-ui-store-D7YXi63q.js +3 -0
  351. package/dist/core/web/public/next/assets/{verse-ui-store-Dy4HuDBV.js.map → verse-ui-store-D7YXi63q.js.map} +1 -1
  352. package/dist/core/web/public/next/assets/{viewport-DDoJ_xVq.js → viewport-BYGH5EgA.js} +2 -2
  353. package/dist/core/web/public/next/assets/{viewport-DDoJ_xVq.js.map → viewport-BYGH5EgA.js.map} +1 -1
  354. package/dist/core/web/public/next/assets/{warmup-BsL2LdR-.js → warmup-AsqwWCUi.js} +3 -3
  355. package/dist/core/web/public/next/assets/{warmup-BsL2LdR-.js.map → warmup-AsqwWCUi.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/{workspace-model-Dd3LmIym.js → workspace-model-CXorJr0G.js} +2 -2
  357. package/dist/core/web/public/next/assets/{workspace-model-Dd3LmIym.js.map → workspace-model-CXorJr0G.js.map} +1 -1
  358. package/dist/core/web/public/next/index.html +1 -1
  359. package/dist/release-dependency-inventory.json +1 -1
  360. package/package.json +5 -2
  361. package/dist/cli/activation.d.ts +0 -41
  362. package/dist/cli/activation.js +0 -485
  363. package/dist/cli/activation.js.map +0 -1
  364. package/dist/core/fleet/generated-repair-resolution.d.ts +0 -36
  365. package/dist/core/fleet/generated-repair-resolution.js +0 -245
  366. package/dist/core/fleet/generated-repair-resolution.js.map +0 -1
  367. package/dist/core/local-runtime/llama/port.d.ts +0 -17
  368. package/dist/core/local-runtime/llama/port.js +0 -47
  369. package/dist/core/local-runtime/llama/port.js.map +0 -1
  370. package/dist/core/local-runtime/llama/proxy-host.d.ts +0 -54
  371. package/dist/core/local-runtime/llama/proxy-host.js +0 -159
  372. package/dist/core/local-runtime/llama/proxy-host.js.map +0 -1
  373. package/dist/core/local-runtime/llama/proxy-process.d.ts +0 -148
  374. package/dist/core/local-runtime/llama/proxy-process.js +0 -250
  375. package/dist/core/local-runtime/llama/proxy-process.js.map +0 -1
  376. package/dist/core/local-runtime/llama/proxy-record.d.ts +0 -40
  377. package/dist/core/local-runtime/llama/proxy-record.js +0 -133
  378. package/dist/core/local-runtime/llama/proxy-record.js.map +0 -1
  379. package/dist/core/local-runtime/llama/proxy-supervisor.d.ts +0 -118
  380. package/dist/core/local-runtime/llama/proxy-supervisor.js +0 -511
  381. package/dist/core/local-runtime/llama/proxy-supervisor.js.map +0 -1
  382. package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js +0 -2
  383. package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js.map +0 -1
  384. package/dist/core/web/public/next/assets/App-CbDCLAxn.js +0 -7
  385. package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js +0 -2
  386. package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js.map +0 -1
  387. package/dist/core/web/public/next/assets/AutonomySection-BF5UCsMv.js +0 -2
  388. package/dist/core/web/public/next/assets/BranchBar-nfSb59Kv.js +0 -2
  389. package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js +0 -2
  390. package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js.map +0 -1
  391. package/dist/core/web/public/next/assets/ChatSection-DoqjyVoj.js +0 -3
  392. package/dist/core/web/public/next/assets/ChatSection-DoqjyVoj.js.map +0 -1
  393. package/dist/core/web/public/next/assets/CommandPalette-lLV-OR63.js +0 -2
  394. package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js +0 -2
  395. package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js.map +0 -1
  396. package/dist/core/web/public/next/assets/DockHost-BZReKwos.js +0 -2
  397. package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js +0 -3
  398. package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js.map +0 -1
  399. package/dist/core/web/public/next/assets/GearTray-CkviqjYr.js +0 -2
  400. package/dist/core/web/public/next/assets/HandoffDialog-DcPj1ri9.js +0 -2
  401. package/dist/core/web/public/next/assets/LeaderCard-BSFTlMRF.js +0 -2
  402. package/dist/core/web/public/next/assets/McpSection-CvcYu1X_.js +0 -2
  403. package/dist/core/web/public/next/assets/MindSection-DcO9fmYe.js +0 -2
  404. package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js +0 -2
  405. package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js.map +0 -1
  406. package/dist/core/web/public/next/assets/MutationTokenDialog-Cum_DqQZ.css +0 -1
  407. package/dist/core/web/public/next/assets/NeedsYouDrawer-hiTINupk.js +0 -2
  408. package/dist/core/web/public/next/assets/NewChatDialog-utSckh7C.js +0 -3
  409. package/dist/core/web/public/next/assets/OnboardingFlow-7N3YSUHN.js +0 -2
  410. package/dist/core/web/public/next/assets/PreviewPane-CqzkaAjG.js +0 -2
  411. package/dist/core/web/public/next/assets/RailStatus-sZhApA8k.js +0 -2
  412. package/dist/core/web/public/next/assets/RouteErrorBoundary-6RMd_aZg.css +0 -1
  413. package/dist/core/web/public/next/assets/RouteErrorBoundary-D1LZxQjN.js +0 -2
  414. package/dist/core/web/public/next/assets/RouteErrorBoundary-D1LZxQjN.js.map +0 -1
  415. package/dist/core/web/public/next/assets/SeatSelector-CT92PqM_.js +0 -3
  416. package/dist/core/web/public/next/assets/SessionInsightChip-CwlakUYU.js +0 -2
  417. package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js +0 -2
  418. package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js.map +0 -1
  419. package/dist/core/web/public/next/assets/Sheet-C7APkGPt.js +0 -2
  420. package/dist/core/web/public/next/assets/ShortcutsOverlay-ZPyXUS_I.js +0 -2
  421. package/dist/core/web/public/next/assets/Sidebar-Chsgazmk.js +0 -3
  422. package/dist/core/web/public/next/assets/TerminalPane-BDkKFych.js +0 -7
  423. package/dist/core/web/public/next/assets/UniverseConsoleApp-BE72VyBL.js +0 -2
  424. package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js +0 -2
  425. package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js.map +0 -1
  426. package/dist/core/web/public/next/assets/VerseConsoleApp-CXJWDiEM.css +0 -1
  427. package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js +0 -3
  428. package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js.map +0 -1
  429. package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +0 -1
  430. package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js +0 -10
  431. package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js.map +0 -1
  432. package/dist/core/web/public/next/assets/actions-BnjZy8a-.js +0 -2
  433. package/dist/core/web/public/next/assets/budget-queries-Cp6vO7FH.js +0 -2
  434. package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js +0 -2
  435. package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js.map +0 -1
  436. package/dist/core/web/public/next/assets/context-model-BGznyHNQ.js +0 -2
  437. package/dist/core/web/public/next/assets/context-model-DeJ28uSZ.js +0 -2
  438. package/dist/core/web/public/next/assets/context-queries-_mEgy4eg.js +0 -2
  439. package/dist/core/web/public/next/assets/control-queries-C4TG8blN.js +0 -2
  440. package/dist/core/web/public/next/assets/dock-panes-mnIwSpRp.js +0 -2
  441. package/dist/core/web/public/next/assets/dock-panes-mnIwSpRp.js.map +0 -1
  442. package/dist/core/web/public/next/assets/git-model-DaGw1SzS.js +0 -5
  443. package/dist/core/web/public/next/assets/global-DG1fmn4y.js +0 -2
  444. package/dist/core/web/public/next/assets/global-DG1fmn4y.js.map +0 -1
  445. package/dist/core/web/public/next/assets/global-_tOCFt9y.css +0 -1
  446. package/dist/core/web/public/next/assets/guarded-action--lguLXfz.js +0 -2
  447. package/dist/core/web/public/next/assets/guarded-action--lguLXfz.js.map +0 -1
  448. package/dist/core/web/public/next/assets/icons-YPgbel-I.js +0 -2
  449. package/dist/core/web/public/next/assets/icons-YPgbel-I.js.map +0 -1
  450. package/dist/core/web/public/next/assets/mutations-DjXM3IDg.js +0 -2
  451. package/dist/core/web/public/next/assets/overnight-queries-Be_eossf.js +0 -2
  452. package/dist/core/web/public/next/assets/primitives-Dl3SEQvh.js +0 -1
  453. package/dist/core/web/public/next/assets/reasoning-pref-a_ZP6GzU.js +0 -2
  454. package/dist/core/web/public/next/assets/seat-subscription-CRigL-GE.js +0 -2
  455. package/dist/core/web/public/next/assets/slots-CV9ZuLQU.js +0 -3
  456. package/dist/core/web/public/next/assets/surface-data-DLvmUX9z.js +0 -2
  457. package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js +0 -2
  458. package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js.map +0 -1
  459. package/dist/core/web/public/next/assets/use-guarded-action-DVCtLzSo.js +0 -2
  460. package/dist/core/web/public/next/assets/use-token-gate-B5gOFkeH.js +0 -2
  461. package/dist/core/web/public/next/assets/useActivity-C3R1Sudh.js +0 -2
  462. package/dist/core/web/public/next/assets/useActivity-C3R1Sudh.js.map +0 -1
  463. package/dist/core/web/public/next/assets/useChartWidth-0APW0BR3.js +0 -2
  464. package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +0 -1
  465. package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js +0 -2
  466. package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js.map +0 -1
  467. package/dist/core/web/public/next/assets/verse-queries-2PxoBISm.js +0 -2
  468. package/dist/core/web/public/next/assets/verse-queries-2PxoBISm.js.map +0 -1
  469. package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js +0 -3
  470. package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js.map +0 -1
  471. package/dist/core/web/public/next/assets/verse-ui-store-Dy4HuDBV.js +0 -3
@@ -1 +0,0 @@
1
- {"version":3,"file":"AppsSection-B5HWJi9I.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mcp/mcp-contract.ts","../../../../../../src/web-ui/routes/verse/apps/apps-model.ts","../../../../../../src/web-ui/routes/verse/apps/AppRow.tsx","../../../../../../src/web-ui/routes/verse/apps/CopyPill.tsx","../../../../../../src/web-ui/routes/verse/apps/launch.ts","../../../../../../src/web-ui/routes/verse/apps/AccountsGroup.tsx","../../../../../../src/web-ui/routes/verse/apps/apps-queries.ts","../../../../../../src/web-ui/routes/verse/apps/DesktopToggleDialog.tsx","../../../../../../src/web-ui/routes/verse/apps/LaunchDialog.tsx","../../../../../../src/web-ui/routes/verse/mcp/mcp.module.css","../../../../../../src/web-ui/routes/verse/mcp/McpServerDisclosure.tsx","../../../../../../src/web-ui/routes/verse/mcp/mcp-queries.ts","../../../../../../src/web-ui/routes/verse/apps/McpGroup.tsx","../../../../../../src/web-ui/routes/verse/apps/ServedGroups.tsx","../../../../../../src/web-ui/routes/verse/sections/AppsSection.tsx"],"sourcesContent":["/**\n * routes/verse/mcp/mcp-contract.ts — the wire seam for MCP management.\n *\n * Same posture as routes/verse/usage/usage-contract.ts, for the same two\n * reasons:\n *\n * 1. EVERY import from src/core here MUST be type-only. `core/verse/\n * mcp-seat-view.ts` pulls `node:fs` and `node:os`; a VALUE import of even\n * one constant drags that graph into the browser bundle and `vite build`\n * fails. Type-only imports are erased, so the seam guards below cost\n * nothing at runtime.\n * 2. Nothing is CAST. Every read goes through a structural narrower, so a\n * field rename in src/core degrades this panel to an honest \"unknown\"\n * instead of throwing at render time — and the `WIRE_*_KEYS` blocks make\n * that rename fail `npm run typecheck:web` here, at the seam, first.\n *\n * SECURITY: the server already redacts every env value to '<set>' via\n * `redactEnv` and publishes config files as home-relative refs. This module\n * is the client-side backstop on top of that: {@link narrowServer} FORCES\n * every env value to '<set>' whatever arrived, so a server that ever\n * regressed could not print a secret through this panel.\n *\n * Pure: no React, no I/O.\n */\nimport type {\n VerseMcpMachineRegistry,\n VerseMcpSeatView,\n VerseMcpServerView,\n VerseMcpSnapshot,\n} from '../../../../core/verse/mcp-seat-view.js';\nimport type { VerseMcpScope } from '../../../../core/verse/mcp-scope.js';\nimport type {\n VerseAccountCliHealth,\n VerseCliHealthSnapshot,\n} from '../../../../core/verse/mcp-cli-health.js';\n\n// ---------------------------------------------------------------------------\n// Seam contract — compile-time only, zero runtime cost.\n// ---------------------------------------------------------------------------\n\nconst WIRE_SERVER_KEYS = {\n name: 'name',\n command: 'command',\n args: 'args',\n env: 'env',\n sourceRef: 'sourceRef',\n} as const satisfies Record<string, keyof VerseMcpServerView>;\n\nconst WIRE_SEAT_KEYS = {\n seatId: 'seatId',\n label: 'label',\n engine: 'engine',\n accountId: 'accountId',\n servers: 'servers',\n reason: 'reason',\n configFile: 'configFile',\n configFormat: 'configFormat',\n notes: 'notes',\n} as const satisfies Record<string, keyof VerseMcpSeatView>;\n\nconst WIRE_MACHINE_KEYS = {\n servers: 'servers',\n configured: 'configured',\n note: 'note',\n} as const satisfies Record<string, keyof VerseMcpMachineRegistry>;\n\nconst WIRE_SNAPSHOT_KEYS = {\n sampledAt: 'sampledAt',\n seats: 'seats',\n machine: 'machine',\n scope: 'scope',\n notes: 'notes',\n} as const satisfies Record<string, keyof VerseMcpSnapshot>;\n\nconst WIRE_HEALTH_KEYS = {\n accountId: 'accountId',\n label: 'label',\n provider: 'provider',\n authentication: 'authentication',\n state: 'state',\n planType: 'planType',\n reason: 'reason',\n version: 'version',\n pinnedVersion: 'pinnedVersion',\n versionState: 'versionState',\n usageBlockedByPin: 'usageBlockedByPin',\n notes: 'notes',\n} as const satisfies Record<string, keyof VerseAccountCliHealth>;\n\nconst WIRE_HEALTH_SNAPSHOT_KEYS = {\n sampledAt: 'sampledAt',\n accounts: 'accounts',\n driftDetected: 'driftDetected',\n notes: 'notes',\n} as const satisfies Record<string, keyof VerseCliHealthSnapshot>;\n\nconst WIRE_SCOPE_KEYS = {\n available: 'available',\n pinned: 'pinned',\n aliasRef: 'aliasRef',\n tenantRef: 'tenantRef',\n principalRef: 'principalRef',\n reason: 'reason',\n} as const satisfies Record<string, keyof VerseMcpScope>;\n\n// ---------------------------------------------------------------------------\n// Display shapes\n// ---------------------------------------------------------------------------\n\nexport interface McpServer {\n name: string;\n command: string;\n args: string[];\n /** Keys only. Every value is '<set>' — forced here, not merely trusted. */\n env: Record<string, string> | null;\n sourceRef: string;\n}\n\nexport interface McpSeat {\n seatId: string;\n label: string;\n engine: string;\n accountId: string;\n servers: McpServer[];\n reason: string;\n configFile: string | null;\n configFormat: string | null;\n notes: string[];\n}\n\nexport interface McpScope {\n available: boolean;\n pinned: boolean;\n aliasRef: string | null;\n tenantRef: string | null;\n principalRef: string | null;\n reason: string;\n}\n\nexport interface McpSnapshot {\n sampledAt: string | null;\n seats: McpSeat[];\n machine: { servers: McpServer[]; configured: boolean; note: string };\n scope: McpScope | null;\n notes: string[];\n}\n\nexport interface CliHealthRow {\n accountId: string;\n label: string;\n provider: string;\n authentication: string;\n state: string;\n planType: string | null;\n reason: string;\n version: string | null;\n pinnedVersion: string | null;\n versionState: string;\n usageBlockedByPin: boolean;\n notes: string[];\n}\n\nexport interface CliHealthSnapshot {\n sampledAt: string | null;\n accounts: CliHealthRow[];\n driftDetected: boolean;\n notes: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Narrowers\n// ---------------------------------------------------------------------------\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction text(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\nfunction strings(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : [];\n}\n\nfunction flag(value: unknown): boolean {\n return value === true;\n}\n\n/**\n * Narrow one server, forcing every env value to '<set>'.\n *\n * The redaction is re-applied rather than trusted. The server already did it;\n * doing it again here means no future server bug can turn this panel into a\n * secret printer, and it costs one map over at most a handful of keys.\n */\nexport function narrowServer(raw: unknown): McpServer | null {\n const row = record(raw);\n if (row === null) return null;\n const name = text(row[WIRE_SERVER_KEYS.name]);\n const command = text(row[WIRE_SERVER_KEYS.command]);\n if (name === null || command === null) return null;\n\n let env: Record<string, string> | null = null;\n const rawEnv = record(row[WIRE_SERVER_KEYS.env]);\n if (rawEnv !== null) {\n const keys = Object.keys(rawEnv);\n if (keys.length > 0) {\n env = {};\n for (const key of keys) env[key] = '<set>';\n }\n }\n\n return {\n name,\n command,\n args: strings(row[WIRE_SERVER_KEYS.args]),\n env,\n sourceRef: text(row[WIRE_SERVER_KEYS.sourceRef]) ?? '(unknown source)',\n };\n}\n\nfunction narrowSeat(raw: unknown): McpSeat | null {\n const row = record(raw);\n if (row === null) return null;\n const seatId = text(row[WIRE_SEAT_KEYS.seatId]);\n if (seatId === null) return null;\n const servers = Array.isArray(row[WIRE_SEAT_KEYS.servers])\n ? (row[WIRE_SEAT_KEYS.servers] as unknown[]).map(narrowServer).filter((s): s is McpServer => s !== null)\n : [];\n return {\n seatId,\n label: text(row[WIRE_SEAT_KEYS.label]) ?? seatId,\n engine: text(row[WIRE_SEAT_KEYS.engine]) ?? 'unknown',\n accountId: text(row[WIRE_SEAT_KEYS.accountId]) ?? seatId,\n servers,\n reason: text(row[WIRE_SEAT_KEYS.reason]) ?? 'unknown',\n configFile: text(row[WIRE_SEAT_KEYS.configFile]),\n configFormat: text(row[WIRE_SEAT_KEYS.configFormat]),\n notes: strings(row[WIRE_SEAT_KEYS.notes]),\n };\n}\n\nfunction narrowScope(raw: unknown): McpScope | null {\n const row = record(raw);\n if (row === null) return null;\n return {\n available: flag(row[WIRE_SCOPE_KEYS.available]),\n pinned: flag(row[WIRE_SCOPE_KEYS.pinned]),\n aliasRef: text(row[WIRE_SCOPE_KEYS.aliasRef]),\n tenantRef: text(row[WIRE_SCOPE_KEYS.tenantRef]),\n principalRef: text(row[WIRE_SCOPE_KEYS.principalRef]),\n reason: text(row[WIRE_SCOPE_KEYS.reason]) ?? 'unknown',\n };\n}\n\n/** Narrow GET /api/verse/mcp. Null when the body is not this shape at all. */\nexport function projectMcpSnapshot(raw: unknown): McpSnapshot | null {\n const row = record(raw);\n if (row === null) return null;\n if (!Array.isArray(row[WIRE_SNAPSHOT_KEYS.seats])) return null;\n\n const machine = record(row[WIRE_SNAPSHOT_KEYS.machine]);\n const machineServers = machine !== null && Array.isArray(machine[WIRE_MACHINE_KEYS.servers])\n ? (machine[WIRE_MACHINE_KEYS.servers] as unknown[]).map(narrowServer).filter((s): s is McpServer => s !== null)\n : [];\n\n return {\n sampledAt: text(row[WIRE_SNAPSHOT_KEYS.sampledAt]),\n seats: (row[WIRE_SNAPSHOT_KEYS.seats] as unknown[])\n .map(narrowSeat)\n .filter((s): s is McpSeat => s !== null),\n machine: {\n servers: machineServers,\n configured: machine !== null ? flag(machine[WIRE_MACHINE_KEYS.configured]) : machineServers.length > 0,\n note: (machine !== null ? text(machine[WIRE_MACHINE_KEYS.note]) : null) ?? '',\n },\n scope: narrowScope(row[WIRE_SNAPSHOT_KEYS.scope]),\n notes: strings(row[WIRE_SNAPSHOT_KEYS.notes]),\n };\n}\n\nfunction narrowHealthRow(raw: unknown): CliHealthRow | null {\n const row = record(raw);\n if (row === null) return null;\n const accountId = text(row[WIRE_HEALTH_KEYS.accountId]);\n if (accountId === null) return null;\n return {\n accountId,\n label: text(row[WIRE_HEALTH_KEYS.label]) ?? accountId,\n provider: text(row[WIRE_HEALTH_KEYS.provider]) ?? 'unknown',\n authentication: text(row[WIRE_HEALTH_KEYS.authentication]) ?? 'unknown',\n state: text(row[WIRE_HEALTH_KEYS.state]) ?? 'unknown',\n planType: text(row[WIRE_HEALTH_KEYS.planType]),\n reason: text(row[WIRE_HEALTH_KEYS.reason]) ?? 'unknown',\n // A missing version stays NULL. It is never coerced to a string, because\n // \"no reading\" and \"some version\" are different facts.\n version: text(row[WIRE_HEALTH_KEYS.version]),\n pinnedVersion: text(row[WIRE_HEALTH_KEYS.pinnedVersion]),\n versionState: text(row[WIRE_HEALTH_KEYS.versionState]) ?? 'unverified',\n usageBlockedByPin: flag(row[WIRE_HEALTH_KEYS.usageBlockedByPin]),\n notes: strings(row[WIRE_HEALTH_KEYS.notes]),\n };\n}\n\n/** Narrow GET /api/verse/mcp/cli-health. */\nexport function projectCliHealth(raw: unknown): CliHealthSnapshot | null {\n const row = record(raw);\n if (row === null) return null;\n if (!Array.isArray(row[WIRE_HEALTH_SNAPSHOT_KEYS.accounts])) return null;\n const accounts = (row[WIRE_HEALTH_SNAPSHOT_KEYS.accounts] as unknown[])\n .map(narrowHealthRow)\n .filter((a): a is CliHealthRow => a !== null);\n return {\n sampledAt: text(row[WIRE_HEALTH_SNAPSHOT_KEYS.sampledAt]),\n accounts,\n // Derived locally as well as read, so a server that forgot the flag still\n // renders the banner rather than silently hiding a drift.\n driftDetected:\n flag(row[WIRE_HEALTH_SNAPSHOT_KEYS.driftDetected]) ||\n accounts.some((account) => account.versionState === 'drift'),\n notes: strings(row[WIRE_HEALTH_SNAPSHOT_KEYS.notes]),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Copy for the machine-readable reasons this surface renders\n// ---------------------------------------------------------------------------\n\n/**\n * Plain language for each seat reason. The CODE is still shown next to the\n * sentence — it is the thing to search for — but it is never the sentence.\n * Same split `usage/accounts-model.ts` uses for probe reasons.\n */\nexport const SEAT_REASON_COPY: Record<string, string> = {\n 'mcp-seat-isolated-by-adapter':\n 'Verse launches every turn on this seat with an empty MCP configuration, so it loads no MCP '\n + 'servers at all — whatever is configured elsewhere on this machine.',\n 'mcp-account-config-absent':\n 'This account has no MCP configuration file of its own, so it starts with none.',\n 'mcp-account-config-not-json':\n 'This account keeps its MCP servers in a TOML config that the provider CLI reads directly. '\n + 'Hub does not parse or rewrite it, so it cannot list what is in there.',\n 'mcp-account-config-read':\n 'Read from this account\\'s own private configuration.',\n 'mcp-account-config-unreadable':\n 'This account\\'s configuration could not be read, so nothing here is a reading.',\n 'mcp-account-profile-unresolved':\n 'This account\\'s private profile could not be located, so Hub cannot say what it would load.',\n};\n\nexport const SCOPE_REASON_COPY: Record<string, string> = {\n 'mcp-scope-locus-unavailable':\n 'Locus is not reachable on this machine, so writes are not attributable to a tenant.',\n 'mcp-scope-unpinned':\n 'Locus is running but nothing is pinned, so there is no tenant to scope a write to.',\n 'mcp-scope-seal-unverified':\n 'Locus reports a pin whose seal did not verify. Fix the pin before writing anything.',\n 'mcp-scope-expired': 'The Locus pin has expired.',\n 'mcp-scope-pinned': 'Writes are attributed to the pinned Locus tenant shown here.',\n};\n\n/** Prose for a code, or the caller's own sentence. NEVER the raw code alone. */\nexport function reasonSentence(\n copy: Record<string, string>,\n reason: string,\n fallback: string,\n): string {\n return copy[reason] ?? fallback;\n}\n","/**\n * routes/verse/apps/apps-model.ts — pure view-model for Apps & Accounts.\n *\n * The page has five groups (SPEC-310C §4), from three kinds of source:\n * ACCOUNTS the shared capacity rows (usage/capacity-strip-model.ts)\n * plus the actions each seat needs (Reconnect / Check again / Fix / Edit budget);\n * DESKTOP, TERMINAL AGENTS, LOCAL MODELS GET /api/verse/apps, as served;\n * MCP SERVERS GET /api/verse/mcp (what each seat would ACTUALLY load).\n * Everything that decides a word, a tone or whether a control is enabled\n * lives here, so it is unit-tested without a DOM.\n *\n * Pure: no React, no I/O.\n */\nimport type { VerseAppHealthState, VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { ENGINE_MONOGRAM } from '../../../../core/verse/workbench-types.js';\nimport type { VerseBootstrap, VerseEngine, VerseSeat } from '../../../data/api-types.js';\nimport type { HealthTone } from '../health/health-model.js';\nimport type { McpSeat, McpServer, McpSnapshot } from '../mcp/mcp-contract.js';\nimport { reasonSentence, SEAT_REASON_COPY } from '../mcp/mcp-contract.js';\nimport type { AccountStatus, CapacityRow } from '../usage/capacity-strip-model.js';\n\n/** SPEC-310C §4 order. */\nexport const APPS_GROUP_ORDER = ['accounts', 'desktop', 'terminal-agents', 'local-models', 'mcp-servers'] as const;\nexport type AppsGroupId = (typeof APPS_GROUP_ORDER)[number];\n\nexport const APPS_GROUP_TITLE: Readonly<Record<AppsGroupId, string>> = {\n accounts: 'Accounts',\n desktop: 'Desktop',\n 'terminal-agents': 'Terminal agents',\n 'local-models': 'Local models',\n 'mcp-servers': 'MCP servers',\n};\n\nconst HEALTH_TONE: Readonly<Record<VerseAppHealthState, HealthTone | 'off'>> = {\n ok: 'success',\n warn: 'warning',\n error: 'danger',\n off: 'off',\n unknown: 'neutral',\n};\n\n/** A row's dot tone. `off` is its own quiet state (not installed, switched off) — never a fault. */\nexport function appHealthTone(state: VerseAppHealthState): HealthTone | 'off' {\n return HEALTH_TONE[state];\n}\n\nconst VERSE_ENGINES: readonly VerseEngine[] = ['claude', 'codex', 'grok', 'local'];\n\nexport function asEngine(value: string): VerseEngine | null {\n return (VERSE_ENGINES as readonly string[]).includes(value) ? (value as VerseEngine) : null;\n}\n\n// ---------------------------------------------------------------------------\n// Launch targets\n// ---------------------------------------------------------------------------\n\nexport interface LaunchProject {\n path: string;\n name: string;\n}\n\nfunction baseName(path: string): string {\n const trimmed = path.replace(/\\/+$/, '');\n const i = trimmed.lastIndexOf('/');\n return i === -1 ? trimmed : trimmed.slice(i + 1) || trimmed;\n}\n\n/**\n * Where a Launch may start, most relevant first: the folders of the most\n * recently used chats (the \"current project\"), then every discovered project.\n * The server re-checks each against the same two sources, so this list is a\n * convenience, never the gate.\n */\nexport function launchProjects(bootstrap: Pick<VerseBootstrap, 'sessions' | 'projects'> | undefined): LaunchProject[] {\n if (!bootstrap) return [];\n const out: LaunchProject[] = [];\n const seen = new Set<string>();\n const add = (path: string, name?: string) => {\n if (typeof path !== 'string' || path.length === 0 || seen.has(path)) return;\n seen.add(path);\n out.push({ path, name: name ?? baseName(path) });\n };\n const recent = [...bootstrap.sessions].sort((a, b) => Date.parse(b.updatedAt) - Date.parse(a.updatedAt));\n for (const s of recent) add(s.projectPath);\n for (const p of bootstrap.projects) add(p.path, p.name);\n return out;\n}\n\n/** Ollama tags the local seats run — the model choices for `ollama launch <id> --model`. */\nexport function localModelTags(seats: readonly VerseSeat[]): string[] {\n const out: string[] = [];\n for (const seat of seats) {\n if (seat.engine !== 'local') continue;\n const tag = seat.models[0]?.id ?? (seat.id.startsWith('local:') ? seat.id.slice('local:'.length) : null);\n if (tag && !out.includes(tag)) out.push(tag);\n }\n return out;\n}\n\nexport type LaunchVia = 'native' | 'ollama';\n\nexport interface LaunchChoice {\n via: LaunchVia;\n model: string | null;\n}\n\n/** The argv a launch choice runs, as the operator would type it. */\nexport function launchCommand(row: VerseAppRow, choice: LaunchChoice): string[] | null {\n if (choice.via === 'ollama') {\n if (!row.ollamaLaunch) return null;\n return choice.model ? [...row.ollamaLaunch, '--model', choice.model] : [...row.ollamaLaunch];\n }\n return row.actions.find((a) => a.kind === 'launch')?.command ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Accounts\n// ---------------------------------------------------------------------------\n\nexport type AccountActionKind = 'reconnect' | 'check-again' | 'fix' | 'edit-budget';\n\nexport interface AccountAction {\n kind: AccountActionKind;\n label: string;\n /** Fix only: the command the dialog shows. */\n command: string[] | null;\n /** Primary = the one thing this seat needs now. */\n primary: boolean;\n}\n\n/** Statuses a fresh health sweep can change on its own: offer \"Check again\" for them. */\nconst RECHECKABLE: ReadonlySet<AccountStatus['kind']> = new Set(['spent', 'not-checked', 'unavailable']);\n\n/**\n * What a seat row offers, the one it needs most first:\n * Reconnect signed out or sign-in expiring (the provider's own login, in Terminal);\n * Check again spent, not checked, or unavailable — a zero-cost health sweep\n * is what moves those (pass the row's SETTLED status, so the\n * button stays put while its own check runs);\n * Fix A2 has a command for what is wrong (a re-pin);\n * Edit budget every paid seat.\n * Local rows need none of these.\n */\nexport function accountActions(row: CapacityRow, status?: AccountStatus | null): AccountAction[] {\n if (row.kind === 'local') return [];\n const out: AccountAction[] = [];\n const c = row.connection;\n const needsLogin = row.signedOut\n || (c !== null && (c.connection === 'signed-out' || c.connection === 'expiring' || c.fixKind === 'reauth'));\n if (needsLogin) out.push({ kind: 'reconnect', label: 'Reconnect', command: null, primary: true });\n const recheck = !needsLogin && status != null && RECHECKABLE.has(status.kind);\n if (recheck) out.push({ kind: 'check-again', label: 'Check again', command: null, primary: true });\n if (c !== null && c.fixKind !== 'reauth' && c.fixKind !== 'none' && c.fixCommand !== null) {\n out.push({ kind: 'fix', label: 'Fix', command: c.fixCommand, primary: !needsLogin && !recheck });\n }\n out.push({ kind: 'edit-budget', label: 'Edit budget', command: null, primary: false });\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// MCP\n// ---------------------------------------------------------------------------\n\nexport interface McpSeatRow {\n seatId: string;\n label: string;\n engine: VerseEngine | null;\n monogram: string;\n servers: McpServer[];\n /** \"loads 2 servers\", \"loads none — isolated by Verse\". */\n loads: string;\n isolated: boolean;\n /** Plain language for the seat's reason; the code rides beside it. */\n sentence: string;\n reason: string;\n notes: string[];\n}\n\nexport function mcpSeatRows(snapshot: McpSnapshot): McpSeatRow[] {\n return snapshot.seats.map((seat: McpSeat) => {\n const engine = asEngine(seat.engine);\n const isolated = seat.reason === 'mcp-seat-isolated-by-adapter';\n const n = seat.servers.length;\n return {\n seatId: seat.seatId,\n label: seat.label,\n engine,\n monogram: engine ? ENGINE_MONOGRAM[engine] : seat.label.slice(0, 1).toUpperCase(),\n servers: seat.servers,\n loads: n > 0 ? `loads ${n} server${n === 1 ? '' : 's'}` : isolated ? 'loads none — isolated by Verse' : 'loads none',\n isolated,\n sentence: reasonSentence(SEAT_REASON_COPY, seat.reason, 'Hub cannot say what this seat would load.'),\n reason: seat.reason,\n notes: seat.notes,\n };\n });\n}\n\n/** Where an Add can write: the hub registry, and each account whose config is JSON. */\nexport interface McpTargetOption {\n id: string;\n label: string;\n /** Why this target cannot take a write, or null. */\n disabledReason: string | null;\n}\n\nexport function mcpTargets(snapshot: McpSnapshot | null): McpTargetOption[] {\n const out: McpTargetOption[] = [{ id: 'hub', label: 'Hub gateway registry', disabledReason: null }];\n for (const seat of snapshot?.seats ?? []) {\n if (seat.seatId === 'local') continue;\n // An isolated (Claude) account CAN be written — Claude Code in a terminal\n // reads it — and the form says a Verse chat on it still loads nothing.\n const toml = seat.configFormat === 'toml' || seat.reason === 'mcp-account-config-not-json';\n out.push({\n id: `account:${seat.accountId}`,\n label: `${seat.label} (${seat.engine})`,\n disabledReason: toml ? 'Keeps its MCP servers in TOML, which Hub does not rewrite.' : null,\n });\n }\n return out;\n}\n\n/** Split `a \"b c\" d` into argv the way a shell would, for the Add form's arguments field. */\nexport function splitArgs(text: string): string[] {\n const out: string[] = [];\n let current = '';\n let quote: '\"' | \"'\" | null = null;\n let has = false;\n for (const ch of text) {\n if (quote) {\n if (ch === quote) quote = null;\n else current += ch;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch;\n has = true;\n continue;\n }\n if (/\\s/.test(ch)) {\n if (has || current.length > 0) out.push(current);\n current = '';\n has = false;\n continue;\n }\n current += ch;\n }\n if (has || current.length > 0) out.push(current);\n return out;\n}\n\n/** `KEY=value` lines → an env object; the first bad line is reported, never guessed. */\nexport function parseEnvLines(text: string): { ok: true; env: Record<string, string> } | { ok: false; error: string } {\n const env: Record<string, string> = {};\n for (const raw of text.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (line.length === 0 || line.startsWith('#')) continue;\n const eq = line.indexOf('=');\n const key = eq === -1 ? '' : line.slice(0, eq).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) return { ok: false, error: `“${line.slice(0, 40)}” is not KEY=value.` };\n env[key] = line.slice(eq + 1);\n }\n return { ok: true, env };\n}\n","/**\n * routes/verse/apps/AppRow.tsx — one row, the Ollama-style shape every group\n * shares (SPEC-310C §4): a 32px monogram tile, the name (and version), a\n * one-line description, a health dot WITH a word, and on the right a copy\n * pill, a toggle or an action. At the compact width the right side wraps\n * under the description (container query in Apps.module.css).\n */\nimport type { ReactNode } from 'react';\nimport type { VerseEngine } from '../../../data/api-types.js';\nimport type { HealthTone } from '../health/health-model.js';\nimport { MonogramTile } from './MonogramTile.js';\nimport styles from './Apps.module.css';\n\nexport function HealthWord({ tone, label }: { tone: HealthTone | 'off'; label: string }) {\n return (\n <span className={styles.health} data-tone={tone}>\n <span className={styles.healthDot} aria-hidden=\"true\" />\n {label}\n </span>\n );\n}\n\nexport interface AppRowProps {\n /** DOM id prefix; the row's name gets `${id}-name` so controls can reference it. */\n id: string;\n name: string;\n monogram: string;\n engine: VerseEngine | null;\n description: string;\n version?: string | null;\n health: { tone: HealthTone | 'off'; label: string };\n detail?: ReactNode;\n aside?: ReactNode;\n children?: ReactNode;\n}\n\nexport function AppRow({ id, name, monogram, engine, description, version, health, detail, aside, children }: AppRowProps) {\n return (\n <li className={styles.row} data-app={id}>\n <MonogramTile monogram={monogram} engine={engine} />\n <div className={styles.rowMain}>\n <div className={styles.rowHead}>\n <span id={`${id}-name`} className={styles.rowName}>{name}</span>\n {version ? <span className={styles.rowVersion}>{version}</span> : null}\n <HealthWord tone={health.tone} label={health.label} />\n </div>\n <p className={styles.rowDesc}>{description}</p>\n {detail ? <p className={styles.rowDetail}>{detail}</p> : null}\n {children}\n </div>\n {aside ? <div className={styles.rowAside}>{aside}</div> : null}\n </li>\n );\n}\n\n/** A labelled group: micro-label title, an optional standing caveat, and a card of rows. */\nexport function AppGroup({\n id,\n title,\n caveat,\n action,\n children,\n headingRef,\n}: {\n id: string;\n title: string;\n caveat?: ReactNode;\n action?: ReactNode;\n children: ReactNode;\n headingRef?: React.Ref<HTMLHeadingElement>;\n}) {\n const headingId = `apps-group-${id}`;\n return (\n <section className={styles.group} aria-labelledby={headingId} data-group={id}>\n <div className={styles.groupHead}>\n <h3 id={headingId} ref={headingRef} tabIndex={-1} className={styles.groupTitle}>{title}</h3>\n {action}\n </div>\n {caveat ? <p className={styles.caveat}>{caveat}</p> : null}\n <div className={styles.card}>{children}</div>\n </section>\n );\n}\n","/**\n * routes/verse/apps/CopyPill.tsx — a command you can read and copy in one\n * click (SPEC-310C §4: \"a copy pill, ⧉ turns into ✓ for 1.2s\").\n *\n * The command is shown IN FULL in mono on the code background — the operator\n * reads what they are about to paste. The button's accessible name says what\n * it copies; the confirmation is announced through a polite live region, not\n * only drawn, so a screen-reader user hears \"Copied\" too.\n *\n * Clipboard: the async API where the page is allowed it (a secure context,\n * which the desktop webview and localhost are), else a hidden-textarea copy.\n * A copy that fails says so instead of showing a check.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { IconCheck, IconCopy } from '../../../components/primitives/icons.js';\nimport styles from './Apps.module.css';\n\n/** SPEC-310C §4. */\nexport const COPY_CONFIRM_MS = 1_200;\n\nexport async function copyText(text: string): Promise<boolean> {\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // fall through to the textarea path\n }\n if (typeof document === 'undefined') return false;\n const area = document.createElement('textarea');\n area.value = text;\n area.setAttribute('readonly', '');\n area.style.position = 'fixed';\n area.style.opacity = '0';\n document.body.appendChild(area);\n area.select();\n let ok = false;\n try {\n ok = typeof document.execCommand === 'function' && document.execCommand('copy');\n } catch {\n ok = false;\n }\n area.remove();\n return ok;\n}\n\nexport function CopyPill({ text, label, what }: { text: string; label?: string; /** \"the Codex launch command\" */ what: string }) {\n const [state, setState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => () => { if (timer.current) clearTimeout(timer.current); }, []);\n\n const onCopy = async () => {\n const ok = await copyText(text);\n setState(ok ? 'copied' : 'failed');\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setState('idle'), COPY_CONFIRM_MS);\n };\n\n return (\n <span className={styles.pillWrap}>\n <button\n type=\"button\"\n className={styles.pill}\n data-state={state}\n onClick={() => void onCopy()}\n aria-label={`Copy ${what}: ${text}`}\n title={`Copy: ${text}`}\n >\n <code className={styles.pillText}>{label ?? text}</code>\n <span className={styles.pillIcon} aria-hidden=\"true\">\n {state === 'copied' ? <IconCheck size={14} /> : <IconCopy size={14} />}\n </span>\n </button>\n <span className={styles.visuallyHidden} role=\"status\" aria-live=\"polite\">\n {state === 'copied' ? 'Copied' : state === 'failed' ? 'Copy failed — select the command and copy it yourself' : ''}\n </span>\n </span>\n );\n}\n","/**\n * routes/verse/apps/launch.ts — where a [Launch ▸] goes.\n *\n * Two homes for the agent's terminal:\n * - INSIDE Verse: a tab in the chat dock's Terminal (C4's pane, C2's dock),\n * in the folder of the chat you have open. Needs the desktop app (the\n * sidecar's Bun PTY — GET /api/verse/terminal says `available`), the\n * Terminal pane to have landed in this build, and an open chat to host it.\n * - Terminal.app: POST /api/verse/apps/:id/launch, in the folder you chose.\n * Works from a plain browser too (macOS).\n *\n * In-Verse launch rides the dock's own one-shot request (dock-store.ts\n * `requestTerminal`): `{ appId }`, plus `{ via, model }` for an Ollama launch\n * (the contract fields on VerseTerminalCreateRequest). The server resolves\n * the command itself — the catalog's own argv, or `ollama launch <id>\n * [--model <tag>]` through the same `resolveAppLaunch` Apps' Terminal.app\n * launch uses, which refuses an agent that is not installed, an Ollama that\n * does not list it, or a tag it does not have — and RUNS it in the new tab.\n * Nothing typed comes from the page; the dialog shows that exact command\n * before the click. (Until 3.10.1 a model launch was only pasted, because\n * the request had no model field.)\n */\nimport { shellCommandText } from '../health/health-model.js';\nimport { requestTerminal } from '../dock/dock-store.js';\nimport { isSlotAvailable } from '../shell/slots.js';\nimport { setVerseSection } from '../verse-ui-store.js';\nimport type { LaunchChoice } from './apps-model.js';\n\n/** An argv as the operator would type it (the same quoting the health banner uses). */\nexport const commandText = shellCommandText;\n\nexport interface InVerseAvailability {\n available: boolean;\n /** Why not, in operator language; null when available. */\n reason: string | null;\n}\n\nexport function inVerseAvailability(input: {\n terminalAvailable: boolean | null;\n terminalReason: string | null;\n activeSessionId: string | null;\n slotLanded?: boolean;\n}): InVerseAvailability {\n const landed = input.slotLanded ?? isSlotAvailable('terminal-pane');\n if (!landed) return { available: false, reason: 'This build has no Verse terminal yet.' };\n if (input.terminalAvailable !== true) {\n return { available: false, reason: input.terminalReason ?? 'The Verse terminal needs the desktop app.' };\n }\n if (input.activeSessionId === null) return { available: false, reason: 'Open a chat first — its terminal hosts the agent.' };\n return { available: true, reason: null };\n}\n\n/** Open the agent in a new dock terminal tab and bring Chat forward. */\nexport function launchInVerse(appId: string, choice: LaunchChoice): void {\n if (choice.via === 'native' && choice.model === null) {\n requestTerminal({ newTab: true, appId });\n } else {\n // A model is an Ollama tag: it only ever launches through Ollama.\n requestTerminal({ newTab: true, appId, via: 'ollama', ...(choice.model !== null ? { model: choice.model } : {}) });\n }\n // The request waits in the dock store until Chat serves it (ChatSection\n // clears requests only on a chat SWITCH, not on its first mount).\n setVerseSection('chat');\n}\n","/**\n * routes/verse/apps/AccountsGroup.tsx — ACCOUNTS: every seat's plan,\n * connection (A2), 5-hour and weekly windows with their resets, and how much\n * is \"Reserved for you\" (A9) — the shared CapacityStrip in its accounts mode —\n * plus the one thing each seat needs from you.\n *\n * Every row leads with a status an operator can read at a glance —\n * \"Connected · usable now\", \"Spent · resets Fri 11:46 PM\" (and \"usable again\n * in 7h 12m\"), \"Signed out · reconnect to use it\", \"Checking…\" — says when it\n * was last checked, and usable accounts come first.\n *\n * Reconnect the provider's own sign-in, opened in Terminal by the health\n * route (Verse never sees a credential);\n * Check again a zero-cost health sweep (status commands only), for a seat\n * that is spent, unread or unavailable — run here, behind the\n * mutation-token gate, with the row reading \"Checking…\";\n * Fix the command A2 says fixes it (a CLI re-pin), shown to copy —\n * never run for you;\n * Edit budget A9's BudgetControl in a sheet.\n */\nimport { useId, useRef, useState } from 'react';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport type { SeatHealthReport } from '../../../../core/verse/health-types.js';\nimport type { VerseSeat } from '../../../data/api-types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { BudgetControl } from '../budget/BudgetControl.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { refreshSeatHealth } from '../health/health-queries.js';\nimport { CapacityStrip } from '../usage/CapacityStrip.js';\nimport { accountStatus, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { accountActions } from './apps-model.js';\nimport { AppGroup } from './AppRow.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText } from './launch.js';\nimport styles from './Apps.module.css';\n\nexport const ACCOUNTS_EMPTY_TEXT =\n 'No accounts connected yet. Sign in to Claude Code, Codex or Grok in a terminal, or start Ollama for local models — they show up here within a minute.';\n\nexport function AccountsGroup({\n seats,\n health,\n budget,\n loading,\n reconnecting,\n onReconnect,\n now,\n}: {\n seats: readonly VerseSeat[];\n health: readonly SeatHealthReport[] | null;\n budget: BudgetView | null;\n loading: boolean;\n /** Seat whose sign-in window is being opened. */\n reconnecting: string | null;\n onReconnect: (row: CapacityRow) => void;\n /** Injected clock for tests. */\n now?: number;\n}) {\n const [fixing, setFixing] = useState<CapacityRow | null>(null);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const [checking, setChecking] = useState<string | null>(null);\n const [note, setNote] = useState<{ tone: 'neutral' | 'danger'; text: string } | null>(null);\n const gate = useTokenGate();\n const fixTitle = useId();\n const sheetTitle = useId();\n const closeRef = useRef<HTMLButtonElement>(null);\n const healthRead = health !== null;\n\n const checkAgain = async (row: CapacityRow) => {\n setChecking(row.seatId);\n setNote(null);\n try {\n const done = await gate.run(`Check ${row.label} again (status commands only — nothing is spent)`, () => refreshSeatHealth());\n if (done) setNote({ tone: 'neutral', text: `Checked ${row.label} again.` });\n } catch (err) {\n setNote({ tone: 'danger', text: describeContextError(err) });\n } finally {\n setChecking(null);\n }\n };\n\n return (\n <AppGroup\n id=\"accounts\"\n title=\"Accounts\"\n caveat=\"Which accounts you can use now, which are spent and when they reset, and how much autonomy leaves for you.\"\n >\n {loading ? (\n <p className={styles.loadingLine} aria-busy=\"true\">Reading accounts…</p>\n ) : (\n <CapacityStrip\n seats={seats}\n health={health}\n budget={budget}\n labelledBy=\"apps-group-accounts\"\n emptyText={ACCOUNTS_EMPTY_TEXT}\n accounts={{ healthRead, checkingSeatId: checking, ...(now !== undefined ? { now } : {}) }}\n renderActions={(row) =>\n // Actions come from the SETTLED status, so \"Check again\" stays in\n // place (busy) while its own check runs instead of vanishing.\n accountActions(row, accountStatus(row, { healthRead, ...(now !== undefined ? { now } : {}) })).map((action) => (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.primary && action.kind !== 'edit-budget' ? 'primary' : 'ghost'}\n busy={(action.kind === 'reconnect' && reconnecting === row.seatId) || (action.kind === 'check-again' && checking === row.seatId)}\n aria-label={`${action.label}: ${row.label}`}\n onClick={() => {\n if (action.kind === 'reconnect') onReconnect(row);\n else if (action.kind === 'check-again') void checkAgain(row);\n else if (action.kind === 'fix') setFixing(row);\n else setBudgetOpen(true);\n }}\n >\n {action.label}\n </Button>\n ))\n }\n />\n )}\n\n <p className={note ? styles.accountsNote : styles.visuallyHidden} data-tone={note?.tone} role=\"status\" aria-live=\"polite\">\n {note?.text ?? ''}\n </p>\n\n {fixing !== null && fixing.connection?.fixCommand ? (\n <Dialog\n open\n onClose={() => setFixing(null)}\n titleId={fixTitle}\n title={`Fix ${fixing.label}`}\n description={fixing.connection.word}\n initialFocusRef={closeRef}\n >\n <div className={styles.dialogBody}>\n {fixing.connection.reasons.map((reason) => <p key={reason}>{reason}</p>)}\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Run this in a terminal</span>\n <CopyPill text={commandText(fixing.connection.fixCommand)} what={`the fix for ${fixing.label}`} />\n </div>\n <p>Verse shows the command and never runs it for you: it changes which CLI this seat is pinned to.</p>\n <div className={styles.dialogActions}>\n <Button ref={closeRef} variant=\"subtle\" onClick={() => setFixing(null)}>Done</Button>\n </div>\n </div>\n </Dialog>\n ) : null}\n\n <Sheet\n open={budgetOpen}\n onClose={() => setBudgetOpen(false)}\n titleId={sheetTitle}\n title=\"Budget\"\n description=\"How much of each seat autonomy may use, and how much is kept for you.\"\n width={560}\n >\n {budgetOpen ? <BudgetControl /> : null}\n </Sheet>\n\n <MutationTokenDialog\n open={gate.dialog.open}\n reason={gate.dialog.reason}\n tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={gate.dialog.onClose}\n onUnlocked={gate.dialog.onUnlocked}\n />\n </AppGroup>\n );\n}\n","/**\n * routes/verse/apps/apps-queries.ts — the reads and writes behind Apps &\n * Accounts (server: core/verse/apps-api.ts; C4's terminal for availability).\n *\n * Reads are OPTIONAL (the Usage/MCP convention): a server without the route\n * answers 404, which means \"this group has no source here\", not \"Verse is\n * broken\" — the page still renders Accounts and MCP from their own routes.\n * A 401 still propagates: an expired read session is the whole surface's\n * problem, not one group's.\n *\n * Writes pull the held mutation token and touch the hold on success. Nothing\n * here spends: refresh re-runs status commands, and toggle/launch open a\n * visible Terminal window that the operator drives.\n */\nimport type { VerseAppsResponse, VerseTerminalListResponse } from '../../../../core/verse/workbench-types.js';\nimport { VERSE_APPS_PATH, VERSE_TERMINAL_PATH } from '../../../../core/verse/workbench-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { refetchQuery } from '../../../data/cache.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { oneShotFetcher } from '../health/health-queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const APPS_KEY = 'verse-apps';\nexport const TERMINAL_STATUS_KEY = 'verse-terminal-status';\n\nexport type OptionalResult<T> =\n | { available: true; data: T }\n | { available: false; reason: string };\n\nasync function optional<T>(path: string, signal?: AbortSignal): Promise<OptionalResult<T>> {\n try {\n return { available: true, data: await apiGet<T>(path, signal) };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n if (err instanceof ApiError && err.status === 404) {\n return { available: false, reason: 'This server is older than Apps & Accounts, so desktop, terminal and local rows are not available.' };\n }\n return { available: false, reason: err instanceof ApiError ? `The apps check answered HTTP ${err.status}.` : 'The apps check could not be reached.' };\n }\n}\n\n/** GET /api/verse/apps — cached on the server; cheap to read. */\nexport const appsQuery: QueryDef<OptionalResult<VerseAppsResponse>> = {\n key: APPS_KEY,\n fetch: (signal) => optional<VerseAppsResponse>(VERSE_APPS_PATH, signal),\n};\n\n/**\n * GET /api/verse/terminal (C4). Only `available` matters here: whether a\n * Launch can open INSIDE Verse (the desktop app's Bun PTY) or has to go to\n * Terminal.app. Absent route = not available.\n */\nexport const terminalStatusQuery: QueryDef<OptionalResult<VerseTerminalListResponse>> = {\n key: TERMINAL_STATUS_KEY,\n fetch: (signal) => optional<VerseTerminalListResponse>(VERSE_TERMINAL_PATH, signal),\n};\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/** Re-ask the login shell for PATH and re-probe every row; every reader sees the result. */\nexport async function refreshApps(): Promise<VerseAppsResponse> {\n const body = await post<VerseAppsResponse>(`${VERSE_APPS_PATH}/refresh`, {});\n await refetchQuery(\n APPS_KEY,\n oneShotFetcher(() => Promise.resolve({ available: true as const, data: body }), () => appsQuery.fetch()),\n true,\n );\n return body;\n}\n\nexport interface AppActionResponse {\n ok: true;\n opened: 'terminal-app';\n /** The command as the operator would type it. */\n command: string[];\n}\n\n/**\n * Flip a desktop switch. `confirm: true` is sent ONLY from the confirmation\n * dialog, after the operator saw both commands; the server refuses anything\n * else.\n */\nexport async function toggleDesktopApp(appId: string, enabled: boolean): Promise<AppActionResponse> {\n const result = await post<AppActionResponse>(`${VERSE_APPS_PATH}/${encodeURIComponent(appId)}/toggle`, { enabled, confirm: true });\n void refetchQuery(APPS_KEY, () => appsQuery.fetch(), true);\n return result;\n}\n\nexport interface LaunchInTerminalAppRequest {\n root: string;\n via?: 'native' | 'ollama';\n model?: string | null;\n}\n\n/** Open the agent in a Terminal.app window, in `root`. */\nexport function launchInTerminalApp(appId: string, request: LaunchInTerminalAppRequest): Promise<AppActionResponse> {\n return post<AppActionResponse>(`${VERSE_APPS_PATH}/${encodeURIComponent(appId)}/launch`, {\n root: request.root,\n ...(request.via ? { via: request.via } : {}),\n ...(request.model ? { model: request.model } : {}),\n });\n}\n","/**\n * routes/verse/apps/DesktopToggleDialog.tsx — the confirmation in front of a\n * desktop switch (SPEC-310C §4: \"Turning either on needs a confirmation that\n * shows the command and --restore\").\n *\n * These switches change ANOTHER app's settings (Claude Desktop, Hermes\n * Desktop), so the dialog shows exactly what will run and exactly how to undo\n * it, and says where it runs: a Terminal window, where the tool's own prompts\n * are answered by the operator — Verse never answers them. Turning Claude\n * Desktop ON carries the recommendation against it (SPEC-310C §0.5).\n */\nimport { useId, useRef } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { commandText } from './launch.js';\nimport { CopyPill } from './CopyPill.js';\nimport styles from './Apps.module.css';\n\nexport function DesktopToggleDialog({\n row,\n enable,\n busy,\n error,\n onCancel,\n onConfirm,\n}: {\n row: VerseAppRow | null;\n /** The direction asked for: true = switch on, false = restore. */\n enable: boolean;\n busy: boolean;\n error: string | null;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n const titleId = useId();\n const cancelRef = useRef<HTMLButtonElement>(null);\n if (row === null || row.toggle === null) return null;\n const run = enable ? row.toggle.command : row.toggle.restoreCommand;\n const undo = enable ? row.toggle.restoreCommand : row.toggle.command;\n const title = enable ? `Turn on “${row.description}”?` : `Restore ${row.name}?`;\n return (\n <Dialog\n open\n onClose={onCancel}\n titleId={titleId}\n title={title}\n initialFocusRef={cancelRef}\n description={enable ? `This changes ${row.name}’s own settings until you restore it.` : `This puts ${row.name} back on its own defaults.`}\n >\n <div className={styles.dialogBody}>\n {row.detail ? <p>{row.detail}</p> : null}\n {enable && row.id === 'claude-desktop' ? (\n <p>\n Recommended: leave this off. Claude Desktop would run local models instead of its own, and Verse’s local\n seats already use Ollama.\n </p>\n ) : null}\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Runs</span>\n <CopyPill text={commandText(run)} what=\"the command this runs\" />\n </div>\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>{enable ? 'Undo later with' : 'Turn back on with'}</span>\n <CopyPill text={commandText(undo)} what={enable ? 'the restore command' : 'the command that turns it on'} />\n </div>\n <p>\n It opens in a Terminal window so you can answer its prompts. Verse does not answer them for you, and nothing\n changes until you do.\n </p>\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button ref={cancelRef} variant=\"subtle\" onClick={onCancel}>Cancel</Button>\n <Button variant={enable ? 'danger' : 'primary'} busy={busy} onClick={onConfirm}>\n {enable ? 'Open in Terminal' : 'Restore in Terminal'}\n </Button>\n </div>\n </div>\n </Dialog>\n );\n}\n","/**\n * routes/verse/apps/LaunchDialog.tsx — the options behind [Launch ▾]: which\n * folder, the agent's own command or `ollama launch <id>`, which local model,\n * and where (a Verse terminal tab, or Terminal.app).\n *\n * The exact command is always on screen before anything opens. The plain\n * [Launch] button beside it skips this dialog with the defaults (the agent's\n * own command, your current chat or most recent project).\n */\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { launchCommand, type LaunchChoice, type LaunchProject, type LaunchVia } from './apps-model.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText, type InVerseAvailability } from './launch.js';\nimport styles from './Apps.module.css';\n\nexport type LaunchTarget = 'verse' | 'terminal-app';\n\nexport interface LaunchRequest {\n choice: LaunchChoice;\n target: LaunchTarget;\n /** Terminal.app only; a Verse tab opens in the open chat's folder. */\n root: string | null;\n command: string[];\n}\n\nexport function LaunchDialog({\n row,\n projects,\n models,\n inVerse,\n busy,\n error,\n onCancel,\n onLaunch,\n}: {\n row: VerseAppRow | null;\n projects: readonly LaunchProject[];\n /** Ollama tags the local seats run. */\n models: readonly string[];\n inVerse: InVerseAvailability;\n busy: boolean;\n error: string | null;\n onCancel: () => void;\n onLaunch: (request: LaunchRequest) => void;\n}) {\n const titleId = useId();\n const firstRef = useRef<HTMLInputElement>(null);\n const [via, setVia] = useState<LaunchVia>('native');\n const [model, setModel] = useState<string>('');\n const [root, setRoot] = useState<string>(projects[0]?.path ?? '');\n\n // A new row opens with fresh defaults.\n useEffect(() => {\n setVia('native');\n setModel('');\n setRoot(projects[0]?.path ?? '');\n // eslint-disable-next-line react-hooks/exhaustive-deps -- reset per opened row only\n }, [row?.id]);\n\n const choice: LaunchChoice = { via, model: via === 'ollama' && model !== '' ? model : null };\n const command = useMemo(() => (row ? launchCommand(row, choice) : null), [row, choice.via, choice.model]); // eslint-disable-line react-hooks/exhaustive-deps\n if (row === null) return null;\n const nativeCommand = launchCommand(row, { via: 'native', model: null });\n const ollamaCommand = row.ollamaLaunch;\n const radioName = `${titleId}-via`;\n const canTerminalApp = root !== '';\n\n return (\n <Dialog\n open\n onClose={onCancel}\n titleId={titleId}\n title={`Launch ${row.name}`}\n description=\"Nothing starts until you choose where.\"\n initialFocusRef={firstRef}\n >\n <div className={styles.dialogBody}>\n <fieldset className={styles.fieldset}>\n <legend className={styles.legend}>Run</legend>\n {nativeCommand ? (\n <label className={styles.radio}>\n <input ref={firstRef} type=\"radio\" name={radioName} checked={via === 'native'} onChange={() => setVia('native')} />\n <code className={styles.inlineCode}>{commandText(nativeCommand)}</code>\n <span className={styles.hint}>its own command</span>\n </label>\n ) : null}\n {ollamaCommand ? (\n <label className={styles.radio}>\n <input type=\"radio\" name={radioName} checked={via === 'ollama'} onChange={() => setVia('ollama')} />\n <code className={styles.inlineCode}>{commandText(ollamaCommand)}</code>\n <span className={styles.hint}>through Ollama</span>\n </label>\n ) : null}\n </fieldset>\n\n {via === 'ollama' ? (\n models.length > 0 ? (\n <Select label=\"Local model\" value={model} onChange={(e) => setModel(e.target.value)}>\n <option value=\"\">Ollama’s default</option>\n {models.map((m) => <option key={m} value={m}>{m}</option>)}\n </Select>\n ) : (\n <p className={styles.hint}>No local models are known to Verse, so Ollama will ask which to use.</p>\n )\n ) : null}\n\n <Select\n label=\"Folder (Terminal.app)\"\n value={root}\n onChange={(e) => setRoot(e.target.value)}\n hint={projects.length === 0 ? 'No chat folders or enrolled projects yet.' : 'A Verse tab opens in the chat you have open.'}\n disabled={projects.length === 0}\n >\n {projects.length === 0 ? <option value=\"\">—</option> : null}\n {projects.map((p) => <option key={p.path} value={p.path}>{p.name}</option>)}\n </Select>\n\n {command ? (\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Command</span>\n <CopyPill text={commandText(command)} what={`the ${row.name} launch command`} />\n </div>\n ) : null}\n\n {via === 'ollama' && inVerse.available ? (\n <p className={styles.hint}>In a Verse tab this runs exactly the command above — Verse builds it from what is installed, never from this page.</p>\n ) : null}\n {!inVerse.available && inVerse.reason ? <p className={styles.hint}>Verse terminal: {inVerse.reason}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n\n <div className={styles.dialogActions}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant={inVerse.available ? 'subtle' : 'primary'}\n busy={busy}\n disabled={!canTerminalApp || command === null}\n onClick={() => command && onLaunch({ choice, target: 'terminal-app', root, command })}\n >\n Open in Terminal.app\n </Button>\n {inVerse.available ? (\n <Button\n variant=\"primary\"\n disabled={command === null}\n onClick={() => command && onLaunch({ choice, target: 'verse', root: null, command })}\n >\n Open in Verse terminal\n </Button>\n ) : null}\n </div>\n </div>\n </Dialog>\n );\n}\n","/**\n * routes/verse/mcp/mcp.module.css — MCP + CLI management styling.\n *\n * Follows docs/VERSE-DESIGN-V2.md, same as usage.module.css: monochrome\n * ground, 1px hairlines and whitespace for separation (no shadows, no nested\n * rounded boxes), display face for headings, mono for anything the operator\n * has to read character-by-character — which here is the whole point, because\n * the command line is the thing being disclosed.\n */\n\n.section {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: var(--space-5);\n display: flex;\n flex-direction: column;\n gap: var(--space-6);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n}\n\n.panelHead {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding-bottom: var(--space-2);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.panelTitle {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.panelNote,\n.muted {\n margin: 0;\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n line-height: 1.5;\n}\n\n/* A fact that changes what the operator should do. Never colour alone: it\n carries a word (\"Version drift\") as well as the rule. */\n.alert {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-warning, var(--border-strong));\n border-left-width: 3px;\n border-radius: var(--radius-sm);\n background: var(--bg-subtle);\n}\n\n.alertTitle {\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n}\n\n.seatList,\n.rowList {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.seatRow,\n.healthRow {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) 0;\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.seatHead {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n flex-wrap: wrap;\n}\n\n.seatLabel {\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.engineTag,\n.code {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-tertiary, var(--text-secondary));\n}\n\n/* The machine-readable code is shown BESIDE the sentence, never as it. */\n.code {\n letter-spacing: 0;\n}\n\n.count {\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n\n/* The disclosure: everything the operator must read before confirming. */\n.disclosure {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n background: var(--bg-subtle);\n}\n\n.commandLine {\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n word-break: break-all;\n white-space: pre-wrap;\n margin: 0;\n}\n\n.envList {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.envItem {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n padding: 2px var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n}\n\n.warnList {\n margin: 0;\n padding-left: var(--space-4);\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n}\n\n.digest {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-tertiary, var(--text-secondary));\n word-break: break-all;\n}\n\n.actions {\n display: flex;\n gap: var(--space-2);\n align-items: center;\n flex-wrap: wrap;\n}\n","/**\n * routes/verse/mcp/McpServerDisclosure.tsx — what an MCP server IS, rendered\n * so it has to be read.\n *\n * Used in two places and identical in both: listing a server a seat already\n * loads, and previewing one that is about to be written. That sameness is the\n * point — the operator reads the same card either way, so \"what will run\" is\n * never presented differently from \"what runs\".\n *\n * Three rules this component enforces at the render layer:\n *\n * 1. The COMMAND and ARGS are shown in full, in mono, wrapped rather than\n * truncated. A command with an ellipsis in the middle is exactly the\n * one worth reading.\n * 2. Environment variables are listed BY KEY, with the value shown as the\n * literal `<set>` that `redactEnv` produced. The count is stated, so a\n * server handing over six credentials cannot look like one handing over\n * none.\n * 3. The source is a home-relative ref, never an absolute path.\n */\nimport type { ReactNode } from 'react';\nimport type { McpServer } from './mcp-contract.js';\nimport styles from './mcp.module.css';\n\nexport function McpServerDisclosure({\n server,\n heading,\n}: {\n server: McpServer;\n heading?: string;\n}): ReactNode {\n const envKeys = server.env === null ? [] : Object.keys(server.env);\n\n return (\n <div className={styles.disclosure}>\n {heading === undefined ? null : <p className={styles.alertTitle}>{heading}</p>}\n\n <p className={styles.commandLine}>\n {server.command}\n {server.args.length > 0 ? ` ${server.args.join(' ')}` : ''}\n </p>\n\n {envKeys.length === 0 ? (\n <p className={styles.muted}>No environment variables are passed to this server.</p>\n ) : (\n <>\n <p className={styles.muted}>\n {envKeys.length} environment variable{envKeys.length === 1 ? '' : 's'} passed to this\n server. Values are never displayed.\n </p>\n <ul className={styles.envList}>\n {envKeys.map((key) => (\n <li key={key} className={styles.envItem}>\n {key}=&lt;set&gt;\n </li>\n ))}\n </ul>\n </>\n )}\n\n <p className={styles.code}>configured in {server.sourceRef}</p>\n </div>\n );\n}\n","/**\n * routes/verse/mcp/mcp-queries.ts — the reads and writes behind the MCP panel.\n *\n * Reads use the non-throwing `optionalGet` shape the Usage section\n * established: a server without these routes answers 404, and a 404 means\n * \"this panel is degraded\", not \"Verse is broken\". 401 still propagates,\n * because an expired read session is an unauthorized state for the whole\n * surface, not a degraded one.\n *\n * Writes pull the held mutation token from auth-store and touch the hold on\n * success, exactly like `autonomy/control-queries.ts`. There is one addition\n * this surface needs that the others do not: `applyMcpServer` CANNOT be\n * called without a digest that `proposeMcpServer` returned, because the\n * server refuses without it. That is deliberate and it is why there is no\n * single `installMcpServer()` helper here — a one-call install is exactly the\n * shape docs/VERSE-WORKSPACES.md §3 rules out, and it should be impossible to\n * write by accident at this layer too.\n */\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\n\nexport const MCP_SNAPSHOT_KEY = 'verse-mcp-snapshot';\nexport const MCP_CLI_HEALTH_KEY = 'verse-mcp-cli-health';\n\n/** A read that is allowed to be absent. `raw` is null when it was. */\nexport interface OptionalRead {\n raw: unknown;\n available: boolean;\n reason: string | null;\n}\n\nfunction describeFailure(path: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return `This server does not expose ${path}, so this panel has no source.`;\n }\n return `${path} answered HTTP ${err.status}.`;\n }\n return `${path} could not be reached.`;\n}\n\nfunction optionalGet(path: string): (signal?: AbortSignal) => Promise<OptionalRead> {\n return async (signal) => {\n try {\n const raw = await apiGet<unknown>(path, signal);\n return { raw, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { raw: null, available: false, reason: describeFailure(path, err) };\n }\n };\n}\n\n/** GET /api/verse/mcp — which servers each seat would load. */\nexport const mcpSnapshotQuery: QueryDef<OptionalRead> = {\n key: MCP_SNAPSHOT_KEY,\n fetch: optionalGet('/api/verse/mcp'),\n};\n\n/** GET /api/verse/mcp/cli-health — auth, plan and version drift per account. */\nexport const mcpCliHealthQuery: QueryDef<OptionalRead> = {\n key: MCP_CLI_HEALTH_KEY,\n fetch: optionalGet('/api/verse/mcp/cli-health'),\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nexport class McpLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token before changing MCP configuration.');\n this.name = 'McpLockedError';\n }\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new McpLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/** The spec an operator typed. Env VALUES are real here and only here. */\nexport interface McpServerInput {\n name: string;\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/**\n * POST /api/verse/mcp/proposal — validate and disclose. Writes nothing.\n *\n * The response carries the digest `applyMcpServer` demands back. A refusal is\n * a 409 with a full body, which `apiPost` surfaces as an ApiError whose\n * detail carries the `note`.\n */\nexport function proposeMcpServer(target: string, server: McpServerInput): Promise<unknown> {\n return post<unknown>('/api/verse/mcp/proposal', { target, server });\n}\n\n/**\n * POST /api/verse/mcp/apply — perform the write the digest confirms.\n *\n * `digest` is not optional and has no default. It must come from a proposal\n * the operator actually saw.\n */\nexport async function applyMcpServer(\n target: string,\n server: McpServerInput,\n digest: string,\n): Promise<unknown> {\n const result = await post<unknown>('/api/verse/mcp/apply', {\n target,\n server,\n digest,\n confirm: true,\n });\n invalidate(MCP_SNAPSHOT_KEY);\n return result;\n}\n\n/**\n * POST /api/verse/mcp/cli-probe — read the installed CLI versions.\n *\n * A POST because it launches the provider CLIs. Nothing about it is a read.\n */\nexport async function probeCliVersions(): Promise<unknown> {\n const result = await post<unknown>('/api/verse/mcp/cli-probe', {});\n invalidate(MCP_CLI_HEALTH_KEY);\n return result;\n}\n","/**\n * routes/verse/apps/McpGroup.tsx — MCP SERVERS, folded in from the old MCP\n * section (SPEC-310C §4): what each seat would ACTUALLY load, the standing\n * caveat that Claude and local seats load none, and an Add that goes through\n * the two-step, digest-bound write the server already enforces\n * (propose → read the disclosure → apply).\n *\n * The rules the old section refused to soften are kept:\n * - \"configured, but unused\" is said first when it is true;\n * - a CLI version drift is an alert quoting the pinned version;\n * - the unenrolled-folder footgun for Codex/Grok seats is stated;\n * - an env VALUE is never displayed (the disclosure forces '<set>').\n */\nimport { useId, useState, type FormEvent } from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconChevronDown, IconChevronRight, IconPlus } from '../../../components/primitives/icons.js';\nimport { Input } from '../../../components/primitives/Input.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { ApiError } from '../../../data/client.js';\nimport { SCOPE_REASON_COPY, narrowServer, reasonSentence, type CliHealthSnapshot, type McpServer, type McpSnapshot } from '../mcp/mcp-contract.js';\nimport { McpServerDisclosure } from '../mcp/McpServerDisclosure.js';\nimport { applyMcpServer, proposeMcpServer, type McpServerInput } from '../mcp/mcp-queries.js';\nimport { mcpSeatRows, mcpTargets, parseEnvLines, splitArgs, type McpSeatRow } from './apps-model.js';\nimport { AppGroup, AppRow } from './AppRow.js';\nimport styles from './Apps.module.css';\n\n/** The token gate the page owns: runs `action` once unlocked; null when dismissed. */\nexport type GatedRun = <T>(reason: string, action: () => Promise<T>) => Promise<T | null>;\n\nfunction SeatRow({ row }: { row: McpSeatRow }) {\n const [open, setOpen] = useState(false);\n const listId = useId();\n const has = row.servers.length > 0;\n return (\n <AppRow\n id={`mcp-${row.seatId}`}\n name={row.label}\n monogram={row.monogram}\n engine={row.engine}\n description={row.sentence}\n health={{ tone: has ? 'success' : 'off', label: row.loads }}\n aside={\n has ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-expanded={open}\n aria-controls={listId}\n icon={open ? <IconChevronDown size={14} /> : <IconChevronRight size={14} />}\n onClick={() => setOpen((v) => !v)}\n >\n {open ? 'Hide servers' : 'Show servers'}\n </Button>\n ) : null\n }\n >\n <span className={styles.reasonCode}>{row.reason}</span>\n {has && open ? (\n <div id={listId} className={styles.servers}>\n {row.servers.map((server) => <McpServerDisclosure key={server.name} server={server} heading={server.name} />)}\n </div>\n ) : null}\n </AppRow>\n );\n}\n\ninterface Proposal {\n server: McpServer;\n targetRef: string;\n targetLabel: string;\n action: 'add' | 'replace';\n replaces: McpServer | null;\n warnings: string[];\n note: string;\n digest: string;\n}\n\nfunction narrowProposal(raw: unknown): Proposal | null {\n if (raw === null || typeof raw !== 'object') return null;\n const r = raw as Record<string, unknown>;\n const server = narrowServer(r['server']);\n const target = r['target'] as Record<string, unknown> | undefined;\n if (!server || typeof r['digest'] !== 'string' || !target) return null;\n return {\n server,\n targetRef: typeof target['ref'] === 'string' ? target['ref'] : '',\n targetLabel: typeof target['label'] === 'string' ? target['label'] : '',\n action: r['action'] === 'replace' ? 'replace' : 'add',\n replaces: narrowServer(r['replaces']),\n warnings: Array.isArray(r['warnings']) ? r['warnings'].filter((w): w is string => typeof w === 'string') : [],\n note: typeof r['note'] === 'string' ? r['note'] : '',\n digest: r['digest'],\n };\n}\n\nfunction describe(err: unknown): string {\n if (err instanceof ApiError) return err.detail ?? `The server refused (HTTP ${err.status}).`;\n if (err instanceof Error && err.name === 'VerseMutationLockedError') return 'Unlock actions with the mutation token first.';\n return 'The request could not be completed.';\n}\n\nfunction AddServerSheet({ open, snapshot, run, onClose, onAdded }: {\n open: boolean;\n snapshot: McpSnapshot | null;\n run: GatedRun;\n onClose: () => void;\n onAdded: (message: string) => void;\n}) {\n const titleId = useId();\n const targets = mcpTargets(snapshot);\n const [target, setTarget] = useState('hub');\n const [name, setName] = useState('');\n const [command, setCommand] = useState('');\n const [args, setArgs] = useState('');\n const [env, setEnv] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [proposal, setProposal] = useState<{ input: McpServerInput; target: string; value: Proposal } | null>(null);\n\n const reset = () => {\n setProposal(null);\n setError(null);\n setBusy(false);\n };\n\n const review = async (event: FormEvent) => {\n event.preventDefault();\n setError(null);\n const parsedEnv = parseEnvLines(env);\n if (!parsedEnv.ok) {\n setError(parsedEnv.error);\n return;\n }\n const input: McpServerInput = {\n name: name.trim(),\n command: command.trim(),\n args: splitArgs(args),\n ...(Object.keys(parsedEnv.env).length > 0 ? { env: parsedEnv.env } : {}),\n };\n setBusy(true);\n try {\n const raw = await run('Review an MCP server before adding it', () => proposeMcpServer(target, input));\n if (raw === null) return;\n const value = narrowProposal(raw);\n if (!value) setError('The server answered with something that is not a proposal.');\n else setProposal({ input, target, value });\n } catch (err) {\n setError(describe(err));\n } finally {\n setBusy(false);\n }\n };\n\n const apply = async () => {\n if (!proposal) return;\n setBusy(true);\n setError(null);\n try {\n const done = await run('Add an MCP server', () => applyMcpServer(proposal.target, proposal.input, proposal.value.digest));\n if (done === null) return;\n onAdded(`${proposal.value.action === 'replace' ? 'Replaced' : 'Added'} ${proposal.value.server.name} in ${proposal.value.targetRef}.`);\n setName('');\n setCommand('');\n setArgs('');\n setEnv('');\n reset();\n onClose();\n } catch (err) {\n setError(describe(err));\n } finally {\n setBusy(false);\n }\n };\n\n const chosen = targets.find((t) => t.id === target);\n return (\n <Sheet\n open={open}\n onClose={() => { reset(); onClose(); }}\n titleId={titleId}\n title={proposal ? 'Review before adding' : 'Add an MCP server'}\n description=\"An MCP server is a program that runs with the agent’s permissions. Nothing is written until you confirm what you read.\"\n width={520}\n >\n {proposal === null ? (\n <form className={styles.dialogBody} onSubmit={(e) => void review(e)}>\n <Select label=\"Add to\" value={target} onChange={(e) => setTarget(e.target.value)}\n hint={chosen?.disabledReason ?? (target === 'hub' ? 'The hub’s own registry.' : 'A Verse chat on a Claude seat still loads none; Claude Code in a terminal does.')}>\n {targets.map((t) => <option key={t.id} value={t.id} disabled={t.disabledReason !== null}>{t.label}</option>)}\n </Select>\n <Input label=\"Name\" value={name} onChange={(e) => setName(e.target.value)} required placeholder=\"filesystem\" autoComplete=\"off\" />\n <Input label=\"Command\" value={command} onChange={(e) => setCommand(e.target.value)} required placeholder=\"/opt/homebrew/bin/npx\" autoComplete=\"off\"\n hint=\"An absolute path is safest; a bare name is looked up on PATH when the server starts.\" />\n <Input label=\"Arguments\" value={args} onChange={(e) => setArgs(e.target.value)} placeholder='-y @modelcontextprotocol/server-filesystem \"~/code\"' autoComplete=\"off\" />\n <label className={styles.fieldLabel}>\n Environment <span className={styles.hint}>One KEY=value per line. Values are sent once and never shown again.</span>\n <textarea className={styles.textarea} value={env} onChange={(e) => setEnv(e.target.value)} spellCheck={false} autoComplete=\"off\" />\n </label>\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>Cancel</Button>\n <Button type=\"submit\" variant=\"primary\" busy={busy} disabled={name.trim() === '' || command.trim() === '' || chosen?.disabledReason != null}>\n Review\n </Button>\n </div>\n </form>\n ) : (\n <div className={styles.dialogBody}>\n <p>\n {proposal.value.action === 'replace' ? 'Replaces' : 'Adds'} <strong>{proposal.value.server.name}</strong> in{' '}\n <code className={styles.inlineCode}>{proposal.value.targetRef}</code>\n {proposal.value.targetLabel ? ` (${proposal.value.targetLabel})` : ''}.\n </p>\n <McpServerDisclosure server={proposal.value.server} heading=\"This will run\" />\n {proposal.value.replaces ? <McpServerDisclosure server={proposal.value.replaces} heading=\"Replacing\" /> : null}\n {proposal.value.warnings.length > 0 ? (\n <ul className={styles.warnings}>{proposal.value.warnings.map((w) => <li key={w}>{w}</li>)}</ul>\n ) : null}\n {proposal.value.note ? <p className={styles.hint}>{proposal.value.note}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button variant=\"ghost\" onClick={() => setProposal(null)}>Back</Button>\n <Button variant=\"primary\" busy={busy} onClick={() => void apply()}>\n {proposal.value.action === 'replace' ? 'Replace server' : 'Add server'}\n </Button>\n </div>\n </div>\n )}\n </Sheet>\n );\n}\n\nexport function McpGroup({\n snapshot,\n cliHealth,\n unavailable,\n loading,\n run,\n onAdded,\n headingRef,\n}: {\n snapshot: McpSnapshot | null;\n cliHealth: CliHealthSnapshot | null;\n /** Why the per-seat read is missing; null when it arrived (or is loading). */\n unavailable: string | null;\n loading: boolean;\n run: GatedRun;\n onAdded: (message: string) => void;\n headingRef?: React.Ref<HTMLHeadingElement>;\n}) {\n const [adding, setAdding] = useState(false);\n const rows = snapshot ? mcpSeatRows(snapshot) : [];\n return (\n <AppGroup\n id=\"mcp-servers\"\n title=\"MCP servers\"\n headingRef={headingRef}\n action={\n <Button variant=\"subtle\" size=\"sm\" icon={<IconPlus size={14} />} onClick={() => setAdding(true)} aria-haspopup=\"dialog\">\n Add server\n </Button>\n }\n caveat={\n <>\n Claude and local seats load no MCP servers: Verse starts them with{' '}\n <code>--strict-mcp-config</code> and an empty <code>--mcp-config</code>. Codex and Grok seats load their own\n account’s config — and an <code>ashlr__</code> write through one is refused on a folder that is not enrolled.\n </>\n }\n >\n {snapshot !== null && snapshot.notes.length > 0 ? (\n <div className={styles.loadingLine} role=\"note\">\n <strong>Configured, but unused.</strong> {snapshot.notes.join(' ')} {snapshot.machine.note}\n </div>\n ) : null}\n {cliHealth !== null && cliHealth.driftDetected ? (\n <div className={styles.loadingLine} role=\"alert\">\n <strong>CLI version drift.</strong> {cliHealth.notes.join(' ')}{' '}\n {cliHealth.accounts.filter((a) => a.versionState === 'drift').map((a) => `${a.label}: ${a.version ?? 'unread'}, pinned ${a.pinnedVersion ?? '—'}.`).join(' ')}\n </div>\n ) : null}\n {snapshot === null ? (\n <p className={styles.loadingLine} aria-busy={loading || undefined}>\n {loading ? 'Reading each seat’s configuration…' : (unavailable ?? 'No per-seat reading is available.')}\n </p>\n ) : (\n <ul className={styles.rows}>\n {rows.map((row) => <SeatRow key={row.seatId} row={row} />)}\n </ul>\n )}\n {snapshot?.scope ? (\n <p className={styles.scopeLine}>\n Scope: {reasonSentence(SCOPE_REASON_COPY, snapshot.scope.reason, 'Locus did not report a usable scope.')}\n {snapshot.scope.tenantRef ? ` (${snapshot.scope.tenantRef})` : ''}\n </p>\n ) : null}\n <AddServerSheet open={adding} snapshot={snapshot} run={run} onClose={() => setAdding(false)} onAdded={onAdded} />\n </AppGroup>\n );\n}\n","/**\n * routes/verse/apps/ServedGroups.tsx — the three groups GET /api/verse/apps\n * serves: DESKTOP (Ollama's switches for other apps), TERMINAL AGENTS and\n * LOCAL MODELS. Rendering only; every decision about a word or an enabled\n * control was made by the server or apps-model.ts.\n */\nimport type { VerseAppGroup, VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconChevronDown, IconPlay } from '../../../components/primitives/icons.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { appHealthTone } from './apps-model.js';\nimport { AppGroup, AppRow } from './AppRow.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText } from './launch.js';\nimport styles from './Apps.module.css';\n\nfunction rowHealth(row: VerseAppRow) {\n return { tone: appHealthTone(row.health.state), label: row.health.label };\n}\n\nexport function DesktopGroup({\n group,\n onToggle,\n onRestore,\n}: {\n group: VerseAppGroup;\n /** Opens the confirmation; never flips anything by itself. */\n onToggle: (row: VerseAppRow, enable: boolean) => void;\n onRestore: (row: VerseAppRow) => void;\n}) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => {\n const restore = row.actions.find((a) => a.kind === 'restore') ?? null;\n return (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n health={rowHealth(row)}\n detail={row.toggle === null ? row.detail : null}\n aside={\n row.toggle === null ? null : (\n <>\n {restore ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onRestore(row)} disabled={restore.disabledReason !== null} title={commandText(restore.command ?? [])}>\n {restore.label}\n </Button>\n ) : null}\n <Switch\n checked={row.toggle.enabled}\n onChange={(next) => onToggle(row, next)}\n aria-label={`${row.description}: ${row.toggle.enabled ? 'on' : 'off'}`}\n aria-describedby={`app-${row.id}-name`}\n />\n </>\n )\n }\n />\n );\n })}\n </ul>\n </AppGroup>\n );\n}\n\nexport function AgentsGroup({\n group,\n quickLaunchReason,\n onQuickLaunch,\n onLaunchOptions,\n}: {\n group: VerseAppGroup;\n /** Why the one-click Launch cannot run anywhere right now (no folder and no Verse tab), or null. */\n quickLaunchReason: string | null;\n onQuickLaunch: (row: VerseAppRow) => void;\n onLaunchOptions: (row: VerseAppRow) => void;\n}) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => {\n const launch = row.actions.find((a) => a.kind === 'launch') ?? null;\n const disabled = launch?.disabledReason ?? quickLaunchReason;\n return (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n version={row.version}\n health={rowHealth(row)}\n detail={row.detail}\n aside={\n <>\n {row.copy && row.installed ? <CopyPill text={row.copy.text} label={row.copy.label} what={`the ${row.name} command`} /> : null}\n {row.ollamaLaunch ? (\n <CopyPill text={commandText(row.ollamaLaunch)} what={`the Ollama launch command for ${row.name}`} />\n ) : null}\n {launch ? (\n launch.disabledReason !== null ? (\n <span className={styles.disabledNote}>{launch.disabledReason}</span>\n ) : (\n <span className={styles.split}>\n <Button\n variant=\"subtle\"\n size=\"sm\"\n icon={<IconPlay size={14} />}\n disabled={disabled !== null}\n title={disabled ?? undefined}\n onClick={() => onQuickLaunch(row)}\n aria-label={`Launch ${row.name}`}\n >\n Launch\n </Button>\n <Button\n variant=\"subtle\"\n size=\"sm\"\n iconOnly\n icon={<IconChevronDown size={14} />}\n aria-label={`Launch options for ${row.name}`}\n title={`Launch options for ${row.name}`}\n aria-haspopup=\"dialog\"\n onClick={() => onLaunchOptions(row)}\n />\n </span>\n )\n ) : null}\n </>\n }\n />\n );\n })}\n </ul>\n </AppGroup>\n );\n}\n\nexport function LocalModelsGroup({ group }: { group: VerseAppGroup }) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n version={row.version}\n health={rowHealth(row)}\n detail={row.detail}\n />\n ))}\n </ul>\n </AppGroup>\n );\n}\n","/**\n * routes/verse/sections/AppsSection.tsx — Apps & Accounts (unit C6,\n * SPEC-310C §4; the gear tray's \"Apps & Accounts\", and where MCP now lives).\n *\n * One page that answers \"what can I run with on this Mac, and is it ready\":\n *\n * ACCOUNTS each seat's plan, connection, 5-hour and weekly windows\n * with resets, \"Reserved for you N%\", and Reconnect / Fix /\n * Edit budget — the shared CapacityStrip;\n * DESKTOP Ollama's switches for Claude Desktop and Hermes Desktop,\n * shown OFF with Restore (SPEC-310C §0.5);\n * TERMINAL AGENTS installed version or \"not installed\", the agent's own\n * command, `ollama launch <id>` only where the installed\n * Ollama lists it, and [Launch ▾];\n * LOCAL MODELS Ollama (models, end-to-end tok/s), llama-server, LM Studio;\n * MCP SERVERS what each seat would load, and Add (propose → disclose → apply).\n *\n * Takes no props, per the shell contract (C1 mounts `sections/*Section.tsx`).\n * `focusGroup` is only for the legacy MCP entry point, which lands on the MCP\n * group of this same page.\n *\n * Polls only while visible (usePollWhileVisible): apps every 60 s (the server\n * caches and re-probes in the background), seats 30 s, health 30 s, budget\n * 60 s. Every mutation goes through the mutation-token gate; nothing on this\n * page spends — the actions open visible Terminal windows or write a config\n * the operator just read.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconRefresh } from '../../../components/primitives/icons.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport type { VerseBootstrap } from '../../../data/api-types.js';\nimport { AccountsGroup } from '../apps/AccountsGroup.js';\nimport { launchProjects, localModelTags, type LaunchChoice } from '../apps/apps-model.js';\nimport { appsQuery, launchInTerminalApp, refreshApps, terminalStatusQuery, toggleDesktopApp } from '../apps/apps-queries.js';\nimport { DesktopToggleDialog } from '../apps/DesktopToggleDialog.js';\nimport { inVerseAvailability, launchInVerse } from '../apps/launch.js';\nimport { LaunchDialog, type LaunchRequest } from '../apps/LaunchDialog.js';\nimport { McpGroup } from '../apps/McpGroup.js';\nimport { AgentsGroup, DesktopGroup, LocalModelsGroup } from '../apps/ServedGroups.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { reconnectSeat, refreshSeatHealth } from '../health/health-queries.js';\nimport { projectCliHealth, projectMcpSnapshot } from '../mcp/mcp-contract.js';\nimport { mcpCliHealthQuery, mcpSnapshotQuery } from '../mcp/mcp-queries.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport type { CapacityRow } from '../usage/capacity-strip-model.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport styles from '../apps/Apps.module.css';\n\n/** The server re-probes in the background after 60 s; reading faster only re-reads its cache. */\nexport const APPS_POLL_MS = 60_000;\n\nfunction checkedAgo(iso: string, now: number): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return 'not checked';\n const minutes = Math.max(0, Math.round((now - t) / 60_000));\n if (minutes < 1) return 'checked just now';\n if (minutes < 120) return `checked ${minutes} min ago`;\n return `checked ${Math.round(minutes / 60)} h ago`;\n}\n\nexport function AppsSection({ focusGroup }: { focusGroup?: 'mcp-servers' } = {}) {\n const apps = useQuery(appsQuery);\n const refetchApps = useRefetch(appsQuery);\n usePollWhileVisible(refetchApps, APPS_POLL_MS);\n const terminal = useQuery(terminalStatusQuery);\n const mcp = useQuery(mcpSnapshotQuery);\n const cli = useQuery(mcpCliHealthQuery);\n const refetchMcp = useRefetch(mcpSnapshotQuery);\n const bootstrap = useQuery(verseBootstrapQuery);\n const capacity = useCapacityData();\n const ui = useVerseUi();\n const gate = useTokenGate();\n\n const [status, setStatus] = useState<{ tone: 'neutral' | 'danger'; text: string } | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n const [reconnecting, setReconnecting] = useState<string | null>(null);\n const [toggle, setToggle] = useState<{ row: VerseAppRow; enable: boolean } | null>(null);\n const [toggleBusy, setToggleBusy] = useState(false);\n const [toggleError, setToggleError] = useState<string | null>(null);\n const [launchRow, setLaunchRow] = useState<VerseAppRow | null>(null);\n const [launchBusy, setLaunchBusy] = useState(false);\n const [launchError, setLaunchError] = useState<string | null>(null);\n const [nowMs, setNowMs] = useState(() => Date.now());\n usePollWhileVisible(() => setNowMs(Date.now()), 30_000);\n\n const mcpHeading = useRef<HTMLHeadingElement>(null);\n useEffect(() => {\n if (focusGroup !== 'mcp-servers') return;\n const el = mcpHeading.current;\n if (!el) return;\n if (typeof el.scrollIntoView === 'function') el.scrollIntoView({ block: 'start' });\n el.focus({ preventScroll: true });\n }, [focusGroup]);\n\n const data = bootstrap.data as VerseBootstrap | undefined;\n const projects = launchProjects(data);\n const models = localModelTags(capacity.seats);\n const inVerse = inVerseAvailability({\n terminalAvailable: terminal.data?.available ? terminal.data.data.available : terminal.data ? false : null,\n terminalReason: terminal.data?.available ? terminal.data.data.reason : null,\n activeSessionId: ui.activeSessionId,\n });\n\n const served = apps.data?.available ? apps.data.data : null;\n const group = (id: 'desktop' | 'terminal-agents' | 'local-models') => served?.groups.find((g) => g.id === id) ?? null;\n const snapshot = mcp.data?.available ? projectMcpSnapshot(mcp.data.raw) : null;\n const cliHealth = cli.data?.available ? projectCliHealth(cli.data.raw) : null;\n\n const say = useCallback((text: string, tone: 'neutral' | 'danger' = 'neutral') => setStatus({ text, tone }), []);\n\n const onRefresh = async () => {\n setRefreshing(true);\n try {\n const done = await gate.run('Check every app and seat again', async () => {\n await Promise.all([refreshApps(), refreshSeatHealth().catch(() => null)]);\n refetchMcp();\n return true;\n });\n if (done) {\n setNowMs(Date.now());\n say('Checked again.');\n }\n } catch (err) {\n say(describeContextError(err), 'danger');\n } finally {\n setRefreshing(false);\n }\n };\n\n const onReconnect = async (row: CapacityRow) => {\n setReconnecting(row.seatId);\n try {\n const done = await gate.run(`Open the sign-in for ${row.label} in Terminal`, async () => {\n await reconnectSeat(row.seatId);\n return true;\n });\n if (done) say(`Opened the sign-in for ${row.label} in Terminal. Finish it there; this page picks it up.`);\n } catch (err) {\n say(describeContextError(err), 'danger');\n } finally {\n setReconnecting(null);\n }\n };\n\n const onConfirmToggle = async () => {\n if (!toggle) return;\n setToggleBusy(true);\n setToggleError(null);\n try {\n const result = await gate.run(`${toggle.enable ? 'Switch on' : 'Restore'} ${toggle.row.name}`, () => toggleDesktopApp(toggle.row.id, toggle.enable));\n if (result) {\n say(`Opened “${result.command.join(' ')}” in Terminal. Answer its prompts there.`);\n setToggle(null);\n }\n } catch (err) {\n setToggleError(describeContextError(err));\n } finally {\n setToggleBusy(false);\n }\n };\n\n const launch = async (row: VerseAppRow, request: LaunchRequest) => {\n if (request.target === 'verse') {\n launchInVerse(row.id, request.choice);\n setLaunchRow(null);\n return;\n }\n if (request.root === null) return;\n setLaunchBusy(true);\n setLaunchError(null);\n try {\n const result = await gate.run(`Launch ${row.name} in Terminal`, () =>\n launchInTerminalApp(row.id, { root: request.root!, via: request.choice.via, model: request.choice.model }));\n if (result) {\n say(`Opened ${row.name} in Terminal.`);\n setLaunchRow(null);\n }\n } catch (err) {\n const message = describeContextError(err);\n if (launchRow) setLaunchError(message);\n else say(message, 'danger');\n } finally {\n setLaunchBusy(false);\n }\n };\n\n const quickLaunchReason = inVerse.available || projects.length > 0 ? null : 'Open a chat or enrol a project first.';\n const onQuickLaunch = (row: VerseAppRow) => {\n const choice: LaunchChoice = { via: 'native', model: null };\n const command = row.actions.find((a) => a.kind === 'launch')?.command ?? null;\n if (!command) return;\n void launch(row, { choice, target: inVerse.available ? 'verse' : 'terminal-app', root: projects[0]?.path ?? null, command });\n };\n\n const servedLoading = apps.data === undefined && (apps.status === 'loading' || apps.status === 'idle');\n\n return (\n <section className={styles.section} aria-label=\"Apps & Accounts\">\n <div className={styles.scroll}>\n <div className={styles.page}>\n <header className={styles.header}>\n <div className={styles.headerText}>\n <h2 className={styles.title}>Apps &amp; Accounts</h2>\n <p className={styles.lede}>Everything Verse can run with on this Mac, and whether it is ready.</p>\n </div>\n <div className={styles.headerMeta}>\n {served ? (\n <span>\n {checkedAgo(served.checkedAt, nowMs)}\n {served.pathSource === 'fallback' ? ' · PATH from known folders (your login shell did not answer)' : ''}\n </span>\n ) : null}\n <Button variant=\"ghost\" size=\"sm\" icon={<IconRefresh size={14} />} busy={refreshing} onClick={() => void onRefresh()}>\n Check again\n </Button>\n </div>\n </header>\n\n <p className={status ? styles.banner : styles.visuallyHidden} data-tone={status?.tone} role=\"status\" aria-live=\"polite\">\n {status?.text ?? ''}\n </p>\n\n <AccountsGroup\n seats={capacity.seats}\n health={capacity.health}\n budget={capacity.budget}\n loading={capacity.loading}\n reconnecting={reconnecting}\n onReconnect={(row) => void onReconnect(row)}\n />\n\n {apps.data && !apps.data.available ? (\n <p className={styles.banner}>{apps.data.reason}</p>\n ) : servedLoading ? (\n <div aria-busy=\"true\" aria-label=\"Checking apps\">\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"80%\" />\n <SkeletonLine width=\"70%\" />\n </div>\n ) : (\n <>\n {group('desktop') ? (\n <DesktopGroup\n group={group('desktop')!}\n onToggle={(row, enable) => { setToggleError(null); setToggle({ row, enable }); }}\n onRestore={(row) => { setToggleError(null); setToggle({ row, enable: false }); }}\n />\n ) : null}\n {group('terminal-agents') ? (\n <AgentsGroup\n group={group('terminal-agents')!}\n quickLaunchReason={quickLaunchReason}\n onQuickLaunch={onQuickLaunch}\n onLaunchOptions={(row) => { setLaunchError(null); setLaunchRow(row); }}\n />\n ) : null}\n {group('local-models') ? <LocalModelsGroup group={group('local-models')!} /> : null}\n </>\n )}\n\n <McpGroup\n snapshot={snapshot}\n cliHealth={cliHealth}\n unavailable={mcp.data && !mcp.data.available ? mcp.data.reason : null}\n loading={mcp.data === undefined}\n run={gate.run}\n onAdded={(text) => { say(text); refetchMcp(); }}\n headingRef={mcpHeading}\n />\n </div>\n </div>\n\n <DesktopToggleDialog\n row={toggle?.row ?? null}\n enable={toggle?.enable ?? false}\n busy={toggleBusy}\n error={toggleError}\n onCancel={() => setToggle(null)}\n onConfirm={() => void onConfirmToggle()}\n />\n <LaunchDialog\n row={launchRow}\n projects={projects}\n models={models}\n inVerse={inVerse}\n busy={launchBusy}\n error={launchError}\n onCancel={() => setLaunchRow(null)}\n onLaunch={(request) => { if (launchRow) void launch(launchRow, request); }}\n />\n <MutationTokenDialog\n open={gate.dialog.open}\n reason={gate.dialog.reason}\n tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={gate.dialog.onClose}\n onUnlocked={gate.dialog.onUnlocked}\n />\n </section>\n );\n}\n"],"mappings":"spCAwCM,EAAmB,CACvB,KAAM,OACN,QAAS,UACT,KAAM,OACN,IAAK,MACL,UAAW,WACb,EAEM,EAAiB,CACrB,OAAQ,SACR,MAAO,QACP,OAAQ,SACR,UAAW,YACX,QAAS,UACT,OAAQ,SACR,WAAY,aACZ,aAAc,eACd,MAAO,OACT,EAEM,EAAoB,CACxB,QAAS,UACT,WAAY,aACZ,KAAM,MACR,EAEM,EAAqB,CACzB,UAAW,YACX,MAAO,QACP,QAAS,UACT,MAAO,QACP,MAAO,OACT,EAEM,EAAmB,CACvB,UAAW,YACX,MAAO,QACP,SAAU,WACV,eAAgB,iBAChB,MAAO,QACP,SAAU,WACV,OAAQ,SACR,QAAS,UACT,cAAe,gBACf,aAAc,eACd,kBAAmB,oBACnB,MAAO,OACT,EAEM,EAA4B,CAChC,UAAW,YACX,SAAU,WACV,cAAe,gBACf,MAAO,OACT,EAEM,EAAkB,CACtB,UAAW,YACX,OAAQ,SACR,SAAU,WACV,UAAW,YACX,aAAc,eACd,OAAQ,QACV,EAsEA,SAAS,EAAO,EAAgD,CAC9D,OAAyB,OAAO,GAAU,UAAnC,GAA+C,CAAC,MAAM,QAAQ,CAAK,EACrE,EACD,IACN,CAEA,SAAS,EAAK,EAA+B,CAC3C,OAAO,OAAO,GAAU,SAAW,EAAQ,IAC7C,CAEA,SAAS,EAAQ,EAA0B,CACzC,OAAO,MAAM,QAAQ,CAAK,EAAI,EAAM,OAAQ,GAAyB,OAAO,GAAS,QAAQ,EAAI,CAAC,CACpG,CAEA,SAAS,EAAK,EAAyB,CACrC,OAAO,IAAU,EACnB,CASA,SAAgB,EAAa,EAAgC,CAC3D,IAAM,EAAM,EAAO,CAAG,EACtB,GAAI,IAAQ,KAAM,OAAO,KACzB,IAAM,EAAO,EAAK,EAAI,EAAiB,KAAK,EACtC,EAAU,EAAK,EAAI,EAAiB,QAAQ,EAClD,GAAI,IAAS,MAAQ,IAAY,KAAM,OAAO,KAE9C,IAAI,EAAqC,KACnC,EAAS,EAAO,EAAI,EAAiB,IAAI,EAC/C,GAAI,IAAW,KAAM,CACnB,IAAM,EAAO,OAAO,KAAK,CAAM,EAC/B,GAAI,EAAK,OAAS,EAAG,CACnB,EAAM,CAAC,EACP,IAAK,IAAM,KAAO,EAAM,EAAI,GAAO,OACrC,CACF,CAEA,MAAO,CACL,OACA,UACA,KAAM,EAAQ,EAAI,EAAiB,KAAK,EACxC,MACA,UAAW,EAAK,EAAI,EAAiB,UAAU,GAAK,kBACtD,CACF,CAEA,SAAS,GAAW,EAA8B,CAChD,IAAM,EAAM,EAAO,CAAG,EACtB,GAAI,IAAQ,KAAM,OAAO,KACzB,IAAM,EAAS,EAAK,EAAI,EAAe,OAAO,EAC9C,GAAI,IAAW,KAAM,OAAO,KAC5B,IAAM,EAAU,MAAM,QAAQ,EAAI,EAAe,QAAQ,EACpD,EAAI,EAAe,QAAQ,CAAe,IAAI,CAAY,CAAC,CAAC,OAAQ,GAAsB,IAAM,IAAI,EACrG,CAAC,EACL,MAAO,CACL,SACA,MAAO,EAAK,EAAI,EAAe,MAAM,GAAK,EAC1C,OAAQ,EAAK,EAAI,EAAe,OAAO,GAAK,UAC5C,UAAW,EAAK,EAAI,EAAe,UAAU,GAAK,EAClD,UACA,OAAQ,EAAK,EAAI,EAAe,OAAO,GAAK,UAC5C,WAAY,EAAK,EAAI,EAAe,WAAW,EAC/C,aAAc,EAAK,EAAI,EAAe,aAAa,EACnD,MAAO,EAAQ,EAAI,EAAe,MAAM,CAC1C,CACF,CAEA,SAAS,GAAY,EAA+B,CAClD,IAAM,EAAM,EAAO,CAAG,EAEtB,OADI,IAAQ,KAAa,KAClB,CACL,UAAW,EAAK,EAAI,EAAgB,UAAU,EAC9C,OAAQ,EAAK,EAAI,EAAgB,OAAO,EACxC,SAAU,EAAK,EAAI,EAAgB,SAAS,EAC5C,UAAW,EAAK,EAAI,EAAgB,UAAU,EAC9C,aAAc,EAAK,EAAI,EAAgB,aAAa,EACpD,OAAQ,EAAK,EAAI,EAAgB,OAAO,GAAK,SAC/C,CACF,CAGA,SAAgB,GAAmB,EAAkC,CACnE,IAAM,EAAM,EAAO,CAAG,EAEtB,GADI,IAAQ,MACR,CAAC,MAAM,QAAQ,EAAI,EAAmB,MAAM,EAAG,OAAO,KAE1D,IAAM,EAAU,EAAO,EAAI,EAAmB,QAAQ,EAChD,EAAiB,IAAY,MAAQ,MAAM,QAAQ,EAAQ,EAAkB,QAAQ,EACtF,EAAQ,EAAkB,QAAQ,CAAe,IAAI,CAAY,CAAC,CAAC,OAAQ,GAAsB,IAAM,IAAI,EAC5G,CAAC,EAEL,MAAO,CACL,UAAW,EAAK,EAAI,EAAmB,UAAU,EACjD,MAAQ,EAAI,EAAmB,MAAM,CAClC,IAAI,EAAU,CAAC,CACf,OAAQ,GAAoB,IAAM,IAAI,EACzC,QAAS,CACP,QAAS,EACT,WAAY,IAAY,KAAqD,EAAe,OAAS,EAAtE,EAAK,EAAQ,EAAkB,WAAW,EACzE,MAAO,IAAY,KAA+C,KAAxC,EAAK,EAAQ,EAAkB,KAAK,IAAa,EAC7E,EACA,MAAO,GAAY,EAAI,EAAmB,MAAM,EAChD,MAAO,EAAQ,EAAI,EAAmB,MAAM,CAC9C,CACF,CAEA,SAAS,GAAgB,EAAmC,CAC1D,IAAM,EAAM,EAAO,CAAG,EACtB,GAAI,IAAQ,KAAM,OAAO,KACzB,IAAM,EAAY,EAAK,EAAI,EAAiB,UAAU,EAEtD,OADI,IAAc,KAAa,KACxB,CACL,YACA,MAAO,EAAK,EAAI,EAAiB,MAAM,GAAK,EAC5C,SAAU,EAAK,EAAI,EAAiB,SAAS,GAAK,UAClD,eAAgB,EAAK,EAAI,EAAiB,eAAe,GAAK,UAC9D,MAAO,EAAK,EAAI,EAAiB,MAAM,GAAK,UAC5C,SAAU,EAAK,EAAI,EAAiB,SAAS,EAC7C,OAAQ,EAAK,EAAI,EAAiB,OAAO,GAAK,UAG9C,QAAS,EAAK,EAAI,EAAiB,QAAQ,EAC3C,cAAe,EAAK,EAAI,EAAiB,cAAc,EACvD,aAAc,EAAK,EAAI,EAAiB,aAAa,GAAK,aAC1D,kBAAmB,EAAK,EAAI,EAAiB,kBAAkB,EAC/D,MAAO,EAAQ,EAAI,EAAiB,MAAM,CAC5C,CACF,CAGA,SAAgB,GAAiB,EAAwC,CACvE,IAAM,EAAM,EAAO,CAAG,EAEtB,GADI,IAAQ,MACR,CAAC,MAAM,QAAQ,EAAI,EAA0B,SAAS,EAAG,OAAO,KACpE,IAAM,EAAY,EAAI,EAA0B,SAAS,CACtD,IAAI,EAAe,CAAC,CACpB,OAAQ,GAAyB,IAAM,IAAI,EAC9C,MAAO,CACL,UAAW,EAAK,EAAI,EAA0B,UAAU,EACxD,WAGA,cACE,EAAK,EAAI,EAA0B,cAAc,GACjD,EAAS,KAAM,GAAY,EAAQ,eAAiB,OAAO,EAC7D,MAAO,EAAQ,EAAI,EAA0B,MAAM,CACrD,CACF,CAWA,IAAa,GAA2C,CACtD,+BACE,gKAEF,4BACE,iFACF,8BACE,kKAEF,0BACE,sDACF,gCACE,gFACF,iCACE,4FACJ,EAEa,GAA4C,CACvD,8BACE,sFACF,qBACE,qFACF,4BACE,sFACF,oBAAqB,6BACrB,mBAAoB,8DACtB,EAGA,SAAgB,GACd,EACA,EACA,EACQ,CACR,OAAO,EAAK,IAAW,CACzB,CClVA,IAAM,GAAyE,CAC7E,GAAI,UACJ,KAAM,UACN,MAAO,SACP,IAAK,MACL,QAAS,SACX,EAGA,SAAgB,GAAc,EAAgD,CAC5E,OAAO,GAAY,EACrB,CAEA,IAAM,GAAwC,CAAC,SAAU,QAAS,OAAQ,OAAO,EAEjF,SAAgB,GAAS,EAAmC,CAC1D,OAAQ,GAAoC,SAAS,CAAK,EAAK,EAAwB,IACzF,CAWA,SAAS,GAAS,EAAsB,CACtC,IAAM,EAAU,EAAK,QAAQ,OAAQ,EAAE,EACjC,EAAI,EAAQ,YAAY,GAAG,EACjC,OAAO,IAAM,GAAK,EAAU,EAAQ,MAAM,EAAI,CAAC,GAAK,CACtD,CAQA,SAAgB,GAAe,EAAuF,CACpH,GAAI,CAAC,EAAW,MAAO,CAAC,EACxB,IAAM,EAAuB,CAAC,EACxB,EAAO,IAAI,IACX,GAAO,EAAc,IAAkB,CACvC,OAAO,GAAS,UAAY,EAAK,SAAW,GAAK,EAAK,IAAI,CAAI,IAClE,EAAK,IAAI,CAAI,EACb,EAAI,KAAK,CAAE,OAAM,KAAM,GAAQ,GAAS,CAAI,CAAE,CAAC,EACjD,EACM,EAAS,CAAC,GAAG,EAAU,QAAQ,CAAC,CAAC,MAAM,EAAG,IAAM,KAAK,MAAM,EAAE,SAAS,EAAI,KAAK,MAAM,EAAE,SAAS,CAAC,EACvG,IAAK,IAAM,KAAK,EAAQ,EAAI,EAAE,WAAW,EACzC,IAAK,IAAM,KAAK,EAAU,SAAU,EAAI,EAAE,KAAM,EAAE,IAAI,EACtD,OAAO,CACT,CAGA,SAAgB,GAAe,EAAuC,CACpE,IAAM,EAAgB,CAAC,EACvB,IAAK,IAAM,KAAQ,EAAO,CACxB,GAAI,EAAK,SAAW,QAAS,SAC7B,IAAM,EAAM,EAAK,OAAO,EAAE,EAAE,KAAO,EAAK,GAAG,WAAW,QAAQ,EAAI,EAAK,GAAG,MAAM,CAAe,EAAI,MAC/F,GAAO,CAAC,EAAI,SAAS,CAAG,GAAG,EAAI,KAAK,CAAG,CAC7C,CACA,OAAO,CACT,CAUA,SAAgB,GAAc,EAAkB,EAAuC,CAKrF,OAJI,EAAO,MAAQ,SACZ,EAAI,aACF,EAAO,MAAQ,CAAC,GAAG,EAAI,aAAc,UAAW,EAAO,KAAK,EAAI,CAAC,GAAG,EAAI,YAAY,EAD7D,KAGzB,EAAI,QAAQ,KAAM,GAAM,EAAE,OAAS,QAAQ,CAAC,EAAE,SAAW,IAClE,CAkBA,IAAM,GAAkD,IAAI,IAAI,CAAC,QAAS,cAAe,aAAa,CAAC,EAYvG,SAAgB,GAAe,EAAkB,EAAgD,CAC/F,GAAI,EAAI,OAAS,QAAS,MAAO,CAAC,EAClC,IAAM,EAAuB,CAAC,EACxB,EAAI,EAAI,WACR,EAAa,EAAI,WACjB,IAAM,OAAS,EAAE,aAAe,cAAgB,EAAE,aAAe,YAAc,EAAE,UAAY,UAC/F,GAAY,EAAI,KAAK,CAAE,KAAM,YAAa,MAAO,YAAa,QAAS,KAAM,QAAS,EAAK,CAAC,EAChG,IAAM,EAAU,CAAC,GAAc,GAAU,MAAQ,GAAY,IAAI,EAAO,IAAI,EAM5E,OALI,GAAS,EAAI,KAAK,CAAE,KAAM,cAAe,MAAO,cAAe,QAAS,KAAM,QAAS,EAAK,CAAC,EAC7F,IAAM,MAAQ,EAAE,UAAY,UAAY,EAAE,UAAY,QAAU,EAAE,aAAe,MACnF,EAAI,KAAK,CAAE,KAAM,MAAO,MAAO,MAAO,QAAS,EAAE,WAAY,QAAS,CAAC,GAAc,CAAC,CAAQ,CAAC,EAEjG,EAAI,KAAK,CAAE,KAAM,cAAe,MAAO,cAAe,QAAS,KAAM,QAAS,EAAM,CAAC,EAC9E,CACT,CAqBA,SAAgB,GAAY,EAAqC,CAC/D,OAAO,EAAS,MAAM,IAAK,GAAkB,CAC3C,IAAM,EAAS,GAAS,EAAK,MAAM,EAC7B,EAAW,EAAK,SAAW,+BAC3B,EAAI,EAAK,QAAQ,OACvB,MAAO,CACL,OAAQ,EAAK,OACb,MAAO,EAAK,MACZ,SACA,SAAU,EAAS,EAAgB,GAAU,EAAK,MAAM,MAAM,EAAG,CAAC,CAAC,CAAC,YAAY,EAChF,QAAS,EAAK,QACd,MAAO,EAAI,EAAI,SAAS,EAAE,SAAS,IAAM,EAAI,GAAK,MAAQ,EAAW,iCAAmC,aACxG,WACA,SAAU,GAAe,GAAkB,EAAK,OAAQ,2CAA2C,EACnG,OAAQ,EAAK,OACb,MAAO,EAAK,KACd,CACF,CAAC,CACH,CAUA,SAAgB,GAAW,EAAiD,CAC1E,IAAM,EAAyB,CAAC,CAAE,GAAI,MAAO,MAAO,uBAAwB,eAAgB,IAAK,CAAC,EAClG,IAAK,IAAM,KAAQ,GAAU,OAAS,CAAC,EAAG,CACxC,GAAI,EAAK,SAAW,QAAS,SAG7B,IAAM,EAAO,EAAK,eAAiB,QAAU,EAAK,SAAW,8BAC7D,EAAI,KAAK,CACP,GAAI,WAAW,EAAK,YACpB,MAAO,GAAG,EAAK,MAAM,IAAI,EAAK,OAAO,GACrC,eAAgB,EAAO,6DAA+D,IACxF,CAAC,CACH,CACA,OAAO,CACT,CAGA,SAAgB,GAAU,EAAwB,CAChD,IAAM,EAAgB,CAAC,EACnB,EAAU,GACV,EAA0B,KAC1B,EAAM,GACV,IAAK,IAAM,KAAM,EAAM,CACrB,GAAI,EAAO,CACL,IAAO,EAAO,EAAQ,KACrB,GAAW,EAChB,QACF,CACA,GAAI,IAAO,KAAO,IAAO,IAAK,CAC5B,EAAQ,EACR,EAAM,GACN,QACF,CACA,GAAI,KAAK,KAAK,CAAE,EAAG,EACb,GAAO,EAAQ,OAAS,IAAG,EAAI,KAAK,CAAO,EAC/C,EAAU,GACV,EAAM,GACN,QACF,CACA,GAAW,CACb,CAEA,OADI,GAAO,EAAQ,OAAS,IAAG,EAAI,KAAK,CAAO,EACxC,CACT,CAGA,SAAgB,GAAc,EAAwF,CACpH,IAAM,EAA8B,CAAC,EACrC,IAAK,IAAM,KAAO,EAAK,MAAM,OAAO,EAAG,CACrC,IAAM,EAAO,EAAI,KAAK,EACtB,GAAI,EAAK,SAAW,GAAK,EAAK,WAAW,GAAG,EAAG,SAC/C,IAAM,EAAK,EAAK,QAAQ,GAAG,EACrB,EAAM,IAAO,GAAK,GAAK,EAAK,MAAM,EAAG,CAAE,CAAC,CAAC,KAAK,EACpD,GAAI,CAAC,2BAA2B,KAAK,CAAG,EAAG,MAAO,CAAE,GAAI,GAAO,MAAO,IAAI,EAAK,MAAM,EAAG,EAAE,EAAE,oBAAqB,EACjH,EAAI,GAAO,EAAK,MAAM,EAAK,CAAC,CAC9B,CACA,MAAO,CAAE,GAAI,GAAM,KAAI,CACzB,WC1PA,SAAgB,GAAW,CAAE,OAAM,SAAsD,CACvF,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,OAAQ,YAAW,EAA3C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAW,cAAY,MAAQ,CAAA,EACtD,CACG,GAEV,CAgBA,SAAgB,GAAO,CAAE,KAAI,OAAM,WAAU,SAAQ,cAAa,UAAS,SAAQ,SAAQ,QAAO,YAAyB,CACzH,OACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,IAAK,WAAU,EAArC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAwB,WAAkB,QAAS,CAAA,GACnD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAG,EAAG,OAAQ,UAAW,EAAO,QAAU,SAAA,CAAW,CAAA,EAC9D,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,CAAc,CAAA,EAAI,MAClE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,KAAM,EAAO,KAAM,MAAO,EAAO,KAAQ,CAAA,CAClD,KACL,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,QAAU,SAAA,CAAe,CAAA,EAC7C,GAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAY,SAAA,CAAU,CAAA,EAAI,KACxD,CACE,IACJ,GAAQ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAW,SAAA,CAAW,CAAA,EAAI,IACxD,GAER,CAGA,SAAgB,EAAS,CACvB,KACA,QACA,SACA,SACA,WACA,cAQC,CACD,IAAM,EAAY,cAAc,IAChC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,MAAO,kBAAiB,EAAW,aAAY,EAA1E,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAW,IAAK,EAAY,SAAU,GAAI,UAAW,EAAO,WAAa,SAAA,CAAU,CAAA,EAC1F,CACE,IACJ,GAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,OAAS,SAAA,CAAU,CAAA,EAAI,MACtD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAO,UAAc,CAAA,CACrC,GAEb,CChEA,IAAa,GAAkB,KAE/B,eAAsB,GAAS,EAAgC,CAC7D,GAAI,CACF,GAAI,OAAO,UAAc,KAAe,UAAU,WAAa,OAAO,UAAU,UAAU,WAAc,WAEtG,OADA,MAAM,UAAU,UAAU,UAAU,CAAI,EACjC,EAEX,MAAQ,CAER,CACA,GAAI,OAAO,SAAa,IAAa,MAAO,GAC5C,IAAM,EAAO,SAAS,cAAc,UAAU,EAC9C,EAAK,MAAQ,EACb,EAAK,aAAa,WAAY,EAAE,EAChC,EAAK,MAAM,SAAW,QACtB,EAAK,MAAM,QAAU,IACrB,SAAS,KAAK,YAAY,CAAI,EAC9B,EAAK,OAAO,EACZ,IAAI,EAAK,GACT,GAAI,CACF,EAAK,OAAO,SAAS,aAAgB,YAAc,SAAS,YAAY,MAAM,CAChF,MAAQ,CACN,EAAK,EACP,CAEA,OADA,EAAK,OAAO,EACL,CACT,CAEA,SAAgB,EAAS,CAAE,OAAM,QAAO,QAA0F,CAChI,GAAM,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAuC,MAAM,EACjE,GAAA,EAAQ,EAAA,OAAA,CAA6C,IAAI,GAC/D,EAAA,EAAA,UAAA,SAAsB,CAAM,EAAM,SAAS,aAAa,EAAM,OAAO,CAAG,EAAG,CAAC,CAAC,EAE7E,IAAM,EAAS,SAAY,CACzB,IAAM,EAAK,MAAM,GAAS,CAAI,EAC9B,EAAS,EAAK,SAAW,QAAQ,EAC7B,EAAM,SAAS,aAAa,EAAM,OAAO,EAC7C,EAAM,QAAU,eAAiB,EAAS,MAAM,EAAG,EAAe,CACpE,EAEA,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAxB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAO,KAClB,aAAY,EACZ,YAAe,KAAK,EAAO,EAC3B,aAAY,QAAQ,EAAK,IAAI,IAC7B,MAAO,SAAS,IANlB,SAAA,EAQE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAW,SAAA,GAAS,CAAW,CAAA,GACvD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,cAAY,OAC3C,SAAA,IAAU,UAAW,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,GAAD,CAAU,KAAM,EAAK,CAAA,CACjE,CAAA,CACA,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,eAAgB,KAAK,SAAS,YAAU,SAC7D,SAAA,IAAU,SAAW,SAAW,IAAU,SAAW,wDAA0D,EAC5G,CAAA,CACF,GAEV,CClDA,IAAa,EAAc,GAQ3B,SAAgB,GAAoB,EAKZ,CAOtB,OANe,EAAM,YAAc,EAAgB,eAAe,EAE9D,EAAM,oBAAsB,GAG5B,EAAM,kBAAoB,KAAa,CAAE,UAAW,GAAO,OAAQ,mDAAoD,EACpH,CAAE,UAAW,GAAM,OAAQ,IAAK,EAH9B,CAAE,UAAW,GAAO,OAAQ,EAAM,gBAAkB,2CAA4C,EAFrF,CAAE,UAAW,GAAO,OAAQ,uCAAwC,CAM1F,CAGA,SAAgB,GAAc,EAAe,EAA4B,CACnE,EAAO,MAAQ,UAAY,EAAO,QAAU,KAC9C,EAAgB,CAAE,OAAQ,GAAM,OAAM,CAAC,EAGvC,EAAgB,CAAE,OAAQ,GAAM,QAAO,IAAK,SAAU,GAAI,EAAO,QAAU,KAAiC,CAAC,EAA3B,CAAE,MAAO,EAAO,KAAM,CAAQ,CAAC,EAInH,EAAgB,MAAM,CACxB,CCxBA,IAAa,GACX,wJAEF,SAAgB,GAAc,CAC5B,QACA,SACA,SACA,UACA,eACA,cACA,OAWC,CACD,GAAM,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAA6B,IAAI,EACvD,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAK,EAC5C,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAwB,IAAI,EACtD,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAA8D,IAAI,EACpF,EAAO,GAAa,EACpB,GAAA,EAAW,EAAA,MAAA,CAAM,EACjB,GAAA,EAAa,EAAA,MAAA,CAAM,EACnB,GAAA,EAAW,EAAA,OAAA,CAA0B,IAAI,EACzC,EAAa,IAAW,KAExB,EAAa,KAAO,IAAqB,CAC7C,EAAY,EAAI,MAAM,EACtB,EAAQ,IAAI,EACZ,GAAI,CAEE,MADe,EAAK,IAAI,SAAS,EAAI,MAAM,sDAAyD,GAAkB,CAAC,GACjH,EAAQ,CAAE,KAAM,UAAW,KAAM,WAAW,EAAI,MAAM,QAAS,CAAC,CAC5E,OAAS,EAAK,CACZ,EAAQ,CAAE,KAAM,SAAU,KAAM,EAAqB,CAAG,CAAE,CAAC,CAC7D,QAAU,CACR,EAAY,IAAI,CAClB,CACF,EAEA,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,GAAG,WACH,MAAM,WACN,OAAO,6GAHT,SAAA,CAKG,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAa,YAAU,OAAO,SAAA,mBAAoB,CAAA,GAEvE,EAAA,EAAA,IAAA,CAAC,EAAD,CACS,QACC,SACA,SACR,WAAW,sBACX,UAAW,GACX,SAAU,CAAE,aAAY,eAAgB,EAAU,GAAI,IAAQ,IAAA,GAAsB,CAAC,EAAX,CAAE,KAAI,CAAQ,EACxF,cAAgB,GAGd,GAAe,EAAK,GAAc,EAAK,CAAE,aAAY,GAAI,IAAQ,IAAA,GAAsB,CAAC,EAAX,CAAE,KAAI,CAAQ,CAAC,CAAC,CAAC,CAAC,IAAK,IAClG,EAAA,EAAA,IAAA,CAAC,EAAD,CAEE,KAAK,KACL,QAAS,EAAO,SAAW,EAAO,OAAS,cAAgB,UAAY,QACvE,KAAO,EAAO,OAAS,aAAe,IAAiB,EAAI,QAAY,EAAO,OAAS,eAAiB,IAAa,EAAI,OACzH,aAAY,GAAG,EAAO,MAAM,IAAI,EAAI,QACpC,YAAe,CACT,EAAO,OAAS,YAAa,EAAY,CAAG,EACvC,EAAO,OAAS,cAAe,EAAgB,CAAG,EAClD,EAAO,OAAS,MAAO,EAAU,CAAG,EACxC,EAAc,EAAI,CACzB,EAEC,SAAA,EAAO,KACF,EAbD,EAAO,IAaN,CACT,CAEJ,CAAA,GAGH,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,EAAO,aAAe,EAAO,eAAgB,YAAW,GAAM,KAAM,KAAK,SAAS,YAAU,SAC9G,SAAA,GAAM,MAAQ,EACd,CAAA,EAEF,IAAW,MAAQ,EAAO,YAAY,YACrC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAA,GACA,YAAe,EAAU,IAAI,EAC7B,QAAS,EACT,MAAO,OAAO,EAAO,QACrB,YAAa,EAAO,WAAW,KAC/B,gBAAiB,EAEjB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,CACG,EAAO,WAAW,QAAQ,IAAK,IAAW,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAiB,CAAU,EAAnB,CAAmB,CAAC,GACvE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAc,SAAA,wBAA4B,CAAA,GAClE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAY,EAAO,WAAW,UAAU,EAAG,KAAM,eAAe,EAAO,OAAU,CAAA,CAC9F,KACL,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,iGAAkG,CAAA,GACrG,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cACrB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,IAAK,EAAU,QAAQ,SAAS,YAAe,EAAU,IAAI,EAAG,SAAA,MAAY,CAAA,CACjF,CAAA,CACF,GACC,CAAA,EACN,MAEJ,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EACN,YAAe,EAAc,EAAK,EAClC,QAAS,EACT,MAAM,SACN,YAAY,wEACZ,MAAO,IAEN,SAAA,GAAa,EAAA,EAAA,IAAA,CAAC,GAAD,CAAgB,CAAA,EAAI,IAC7B,CAAA,GAEP,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAAK,OAAO,KAClB,OAAQ,EAAK,OAAO,OACpB,WAAW,iBACX,UAAU,yCACV,QAAS,EAAK,OAAO,QACrB,WAAY,EAAK,OAAO,UACzB,CAAA,CACO,GAEd,CCrJA,IAAa,GAAW,aACX,GAAsB,wBAMnC,eAAe,GAAY,EAAc,EAAkD,CACzF,GAAI,CACF,MAAO,CAAE,UAAW,GAAM,KAAM,MAAM,EAAU,EAAM,CAAM,CAAE,CAChE,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EAIpE,OAHI,aAAe,GAAY,EAAI,SAAW,IACrC,CAAE,UAAW,GAAO,OAAQ,mGAAoG,EAElI,CAAE,UAAW,GAAO,OAAQ,aAAe,EAAW,gCAAgC,EAAI,OAAO,GAAK,sCAAuC,CACtJ,CACF,CAGA,IAAa,GAAyD,CACpE,IAAK,GACL,MAAQ,GAAW,GAA4B,EAAiB,CAAM,CACxE,EAOa,GAA2E,CACtF,IAAK,GACL,MAAQ,GAAW,GAAoC,EAAqB,CAAM,CACpF,EAEA,eAAe,GAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAGA,eAAsB,IAA0C,CAC9D,IAAM,EAAO,MAAM,GAAwB,GAAG,EAAgB,UAAW,CAAC,CAAC,EAM3E,OALA,MAAM,EACJ,GACA,OAAqB,QAAQ,QAAQ,CAAE,UAAW,GAAe,KAAM,CAAK,CAAC,MAAS,GAAU,MAAM,CAAC,EACvG,EACF,EACO,CACT,CAcA,eAAsB,GAAiB,EAAe,EAA8C,CAClG,IAAM,EAAS,MAAM,GAAwB,GAAG,EAAgB,GAAG,mBAAmB,CAAK,EAAE,SAAU,CAAE,UAAS,QAAS,EAAK,CAAC,EAEjI,OADA,EAAkB,OAAgB,GAAU,MAAM,EAAG,EAAI,EAClD,CACT,CASA,SAAgB,GAAoB,EAAe,EAAiE,CAClH,OAAO,GAAwB,GAAG,EAAgB,GAAG,mBAAmB,CAAK,EAAE,SAAU,CACvF,KAAM,EAAQ,KACd,GAAI,EAAQ,IAAM,CAAE,IAAK,EAAQ,GAAI,EAAI,CAAC,EAC1C,GAAI,EAAQ,MAAQ,CAAE,MAAO,EAAQ,KAAM,EAAI,CAAC,CAClD,CAAC,CACH,CC1FA,SAAgB,GAAoB,CAClC,MACA,SACA,OACA,QACA,WACA,aASC,CACD,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAY,EAAA,OAAA,CAA0B,IAAI,EAChD,GAAI,IAAQ,MAAQ,EAAI,SAAW,KAAM,OAAO,KAChD,IAAM,EAAM,EAAS,EAAI,OAAO,QAAU,EAAI,OAAO,eAC/C,EAAO,EAAS,EAAI,OAAO,eAAiB,EAAI,OAAO,QACvD,EAAQ,EAAS,YAAY,EAAI,YAAY,IAAM,WAAW,EAAI,KAAK,GAC7E,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAA,GACA,QAAS,EACA,UACF,QACP,gBAAiB,EACjB,YAAa,EAAS,gBAAgB,EAAI,KAAK,uCAAyC,aAAa,EAAI,KAAK,4BAE9G,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,CACG,EAAI,QAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAI,MAAU,CAAA,EAAI,KACnC,GAAU,EAAI,KAAO,kBACpB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,oIAGA,CAAA,EACD,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAc,SAAA,MAAU,CAAA,GAChD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAY,CAAG,EAAG,KAAK,uBAAyB,CAAA,CAC7D,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAe,SAAA,EAAS,kBAAoB,mBAA0B,CAAA,GAC9F,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAY,CAAI,EAAG,KAAM,EAAS,sBAAwB,8BAAiC,CAAA,CACxG,KACL,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,oIAGA,CAAA,EACF,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MAChE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,IAAK,EAAW,QAAQ,SAAS,QAAS,EAAU,SAAA,QAAc,CAAA,GAC1E,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,EAAS,SAAW,UAAiB,OAAM,QAAS,EAClE,SAAA,EAAS,mBAAqB,qBACzB,CAAA,CACL,GACF,GACC,CAAA,CAEZ,CCnDA,SAAgB,GAAa,CAC3B,MACA,WACA,SACA,UACA,OACA,QACA,WACA,YAWC,CACD,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAW,EAAA,OAAA,CAAyB,IAAI,EACxC,CAAC,EAAK,IAAA,EAAU,EAAA,SAAA,CAAoB,QAAQ,EAC5C,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAiB,EAAE,EACvC,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAiB,EAAS,EAAE,EAAE,MAAQ,EAAE,GAGhE,EAAA,EAAA,UAAA,KAAgB,CACd,EAAO,QAAQ,EACf,EAAS,EAAE,EACX,EAAQ,EAAS,EAAE,EAAE,MAAQ,EAAE,CAEjC,EAAG,CAAC,GAAK,EAAE,CAAC,EAEZ,IAAM,EAAuB,CAAE,MAAK,MAAO,IAAQ,UAAY,IAAU,GAAK,EAAQ,IAAK,EACrF,GAAA,EAAU,EAAA,QAAA,KAAe,EAAM,GAAc,EAAK,CAAM,EAAI,KAAO,CAAC,EAAK,EAAO,IAAK,EAAO,KAAK,CAAC,EACxG,GAAI,IAAQ,KAAM,OAAO,KACzB,IAAM,EAAgB,GAAc,EAAK,CAAE,IAAK,SAAU,MAAO,IAAK,CAAC,EACjE,EAAgB,EAAI,aACpB,EAAY,GAAG,EAAQ,MACvB,EAAiB,IAAS,GAEhC,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAA,GACA,QAAS,EACA,UACT,MAAO,UAAU,EAAI,OACrB,YAAY,yCACZ,gBAAiB,EAEjB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,WAAD,CAAU,UAAW,EAAO,SAA5B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,OAAQ,SAAA,KAAW,CAAA,EAC5C,GACC,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,MAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,IAAK,EAAU,KAAK,QAAQ,KAAM,EAAW,QAAS,IAAQ,SAAU,aAAgB,EAAO,QAAQ,CAAI,CAAA,GAClH,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAY,CAAa,CAAQ,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,SAAA,iBAAqB,CAAA,CAC9C,CACL,CAAA,EAAA,KACH,GACC,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,MAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,QAAQ,KAAM,EAAW,QAAS,IAAQ,SAAU,aAAgB,EAAO,QAAQ,CAAI,CAAA,GACnG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAY,CAAa,CAAQ,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,SAAA,gBAAoB,CAAA,CAC7C,CACL,CAAA,EAAA,IACI,IAET,IAAQ,SACP,EAAO,OAAS,GACd,EAAA,EAAA,KAAA,CAAC,EAAD,CAAQ,MAAM,cAAc,MAAO,EAAO,SAAW,GAAM,EAAS,EAAE,OAAO,KAAK,EAAlF,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,kBAAwB,CAAA,EACxC,EAAO,IAAK,IAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAgB,MAAO,EAAI,SAAA,CAAU,EAAxB,CAAwB,CAAC,CACnD,CAER,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,SAAA,sEAAuE,CAAA,EAElG,MAEJ,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,MAAM,wBACN,MAAO,EACP,SAAW,GAAM,EAAQ,EAAE,OAAO,KAAK,EACvC,KAAM,EAAS,SAAW,EAAI,4CAA8C,+CAC5E,SAAU,EAAS,SAAW,EALhC,SAAA,CAOG,EAAS,SAAW,GAAI,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,GAAS,CAAA,EAAI,KACtD,EAAS,IAAK,IAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAqB,MAAO,EAAE,KAAO,SAAA,EAAE,IAAa,EAAvC,EAAE,IAAqC,CAAC,CACpE,IAEP,GACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAc,SAAA,SAAa,CAAA,GACnD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAY,CAAO,EAAG,KAAM,OAAO,EAAI,KAAK,gBAAmB,CAAA,CAC5E,CACH,CAAA,EAAA,KAEH,IAAQ,UAAY,EAAQ,WAC3B,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,SAAA,oHAAqH,CAAA,EAC9I,KACH,CAAC,EAAQ,WAAa,EAAQ,QAAS,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAArB,SAAA,CAA2B,mBAAiB,EAAQ,MAAU,CAAI,CAAA,EAAA,KACzG,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MAEhE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,QAAS,EAAU,SAAA,QAAc,CAAA,GACzD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAQ,UAAY,SAAW,UAClC,OACN,SAAU,CAAC,GAAkB,IAAY,KACzC,YAAe,GAAW,EAAS,CAAE,SAAQ,OAAQ,eAAgB,OAAM,SAAQ,CAAC,EACrF,SAAA,sBAEO,CAAA,EACP,EAAQ,WACP,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,UACR,SAAU,IAAY,KACtB,YAAe,GAAW,EAAS,CAAE,SAAQ,OAAQ,QAAS,KAAM,KAAM,SAAQ,CAAC,EACpF,SAAA,wBAEO,CAAA,EACN,IACD,GACF,GACC,CAAA,CAEZ,suBErIA,SAAgB,GAAoB,CAClC,SACA,WAIY,CACZ,IAAM,EAAU,EAAO,MAAQ,KAAO,CAAC,EAAI,OAAO,KAAK,EAAO,GAAG,EAEjE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,CACG,IAAY,IAAA,GAAY,MAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,WAAa,SAAA,CAAW,CAAA,GAE7E,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAArB,SAAA,CACG,EAAO,QACP,EAAO,KAAK,OAAS,EAAI,IAAI,EAAO,KAAK,KAAK,GAAG,IAAM,EACvD,IAEF,EAAQ,SAAW,GAClB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,SAAA,qDAAsD,CAAA,GAElF,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAArB,SAAA,CACG,EAAQ,OAAO,wBAAsB,EAAQ,SAAW,EAAI,GAAK,IAAI,qDAErE,CACH,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,QACnB,SAAA,EAAQ,IAAK,IACZ,EAAA,EAAA,KAAA,CAAC,KAAD,CAAc,UAAW,EAAO,QAAhC,SAAA,CACG,EAAI,QACH,CAFK,EAAA,CAEL,CACL,CACC,CAAA,CACJ,CAAA,CAAA,GAGJ,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAArB,SAAA,CAA2B,iBAAe,EAAO,SAAa,GAC3D,GAET,CCxCA,IAAa,GAAmB,qBACnB,GAAqB,uBASlC,SAAS,GAAgB,EAAc,EAAsB,CAO3D,OANI,aAAe,EACb,EAAI,SAAW,IACV,+BAA+B,EAAK,gCAEtC,GAAG,EAAK,iBAAiB,EAAI,OAAO,GAEtC,GAAG,EAAK,uBACjB,CAEA,SAAS,GAAY,EAA+D,CAClF,OAAO,KAAO,IAAW,CACvB,GAAI,CAEF,MAAO,CAAE,IAAA,MADS,EAAgB,EAAM,CAAM,EAChC,UAAW,GAAM,OAAQ,IAAK,CAC9C,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EACpE,MAAO,CAAE,IAAK,KAAM,UAAW,GAAO,OAAQ,GAAgB,EAAM,CAAG,CAAE,CAC3E,CACF,CACF,CAGA,IAAa,GAA2C,CACtD,IAAK,GACL,MAAO,GAAY,gBAAgB,CACrC,EAGa,GAA4C,CACvD,IAAK,GACL,MAAO,GAAY,2BAA2B,CAChD,EAMa,GAAb,cAAoC,KAAM,CACxC,aAAc,CACZ,MAAM,2EAA2E,EACjF,KAAK,KAAO,gBACd,CACF,EAEA,eAAe,GAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,GACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAiBA,SAAgB,GAAiB,EAAgB,EAA0C,CACzF,OAAO,GAAc,0BAA2B,CAAE,SAAQ,QAAO,CAAC,CACpE,CAQA,eAAsB,GACpB,EACA,EACA,EACkB,CAClB,IAAM,EAAS,MAAM,GAAc,uBAAwB,CACzD,SACA,SACA,SACA,QAAS,EACX,CAAC,EAED,OADA,EAAW,EAAgB,EACpB,CACT,CC/FA,SAAS,GAAQ,CAAE,OAA4B,CAC7C,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,GAAA,EAAS,EAAA,MAAA,CAAM,EACf,EAAM,EAAI,QAAQ,OAAS,EACjC,OACE,EAAA,EAAA,KAAA,CAAC,GAAD,CACE,GAAI,OAAO,EAAI,SACf,KAAM,EAAI,MACV,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,YAAa,EAAI,SACjB,OAAQ,CAAE,KAAM,EAAM,UAAY,MAAO,MAAO,EAAI,KAAM,EAC1D,MACE,GACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,QACR,KAAK,KACL,gBAAe,EACf,gBAAe,EACf,KAAM,GAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,KAAM,EAAK,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,KAAM,EAAK,CAAA,EAC1E,YAAe,EAAS,GAAM,CAAC,CAAC,EAE/B,SAAA,EAAO,eAAiB,cACnB,CAAA,EACN,KAnBR,SAAA,EAsBE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAI,MAAa,CAAA,EACrD,GAAO,GACN,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,GAAI,EAAQ,UAAW,EAAO,QAChC,SAAA,EAAI,QAAQ,IAAK,IAAW,EAAA,EAAA,IAAA,CAAC,GAAD,CAA+C,SAAQ,QAAS,EAAO,IAAO,EAApD,EAAO,IAA6C,CAAC,CACzG,CAAA,EACH,IACE,GAEZ,CAaA,SAAS,GAAe,EAA+B,CACrD,GAAoB,OAAO,GAAQ,WAA/B,EAAyC,OAAO,KACpD,IAAM,EAAI,EACJ,EAAS,EAAa,EAAE,MAAS,EACjC,EAAS,EAAE,OAEjB,MADI,CAAC,GAAU,OAAO,EAAE,QAAc,UAAY,CAAC,EAAe,KAC3D,CACL,SACA,UAAW,OAAO,EAAO,KAAW,SAAW,EAAO,IAAS,GAC/D,YAAa,OAAO,EAAO,OAAa,SAAW,EAAO,MAAW,GACrE,OAAQ,EAAE,SAAc,UAAY,UAAY,MAChD,SAAU,EAAa,EAAE,QAAW,EACpC,SAAU,MAAM,QAAQ,EAAE,QAAW,EAAI,EAAE,SAAY,OAAQ,GAAmB,OAAO,GAAM,QAAQ,EAAI,CAAC,EAC5G,KAAM,OAAO,EAAE,MAAY,SAAW,EAAE,KAAU,GAClD,OAAQ,EAAE,MACZ,CACF,CAEA,SAAS,GAAS,EAAsB,CAGtC,OAFI,aAAe,EAAiB,EAAI,QAAU,4BAA4B,EAAI,OAAO,IACrF,aAAe,OAAS,EAAI,OAAS,2BAAmC,gDACrE,qCACT,CAEA,SAAS,GAAe,CAAE,OAAM,WAAU,MAAK,UAAS,WAMrD,CACD,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,EAAU,GAAW,CAAQ,EAC7B,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,KAAK,EACpC,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAE,EAC7B,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAS,EAAE,EACnC,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAE,EAC7B,CAAC,EAAK,IAAA,EAAU,EAAA,SAAA,CAAS,EAAE,EAC3B,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAwB,IAAI,EAChD,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAA4E,IAAI,EAE1G,MAAc,CAClB,EAAY,IAAI,EAChB,EAAS,IAAI,EACb,EAAQ,EAAK,CACf,EAEM,EAAS,KAAO,IAAqB,CACzC,EAAM,eAAe,EACrB,EAAS,IAAI,EACb,IAAM,EAAY,GAAc,CAAG,EACnC,GAAI,CAAC,EAAU,GAAI,CACjB,EAAS,EAAU,KAAK,EACxB,MACF,CACA,IAAM,EAAwB,CAC5B,KAAM,EAAK,KAAK,EAChB,QAAS,EAAQ,KAAK,EACtB,KAAM,GAAU,CAAI,EACpB,GAAI,OAAO,KAAK,EAAU,GAAG,CAAC,CAAC,OAAS,EAAI,CAAE,IAAK,EAAU,GAAI,EAAI,CAAC,CACxE,EACA,EAAQ,EAAI,EACZ,GAAI,CACF,IAAM,EAAM,MAAM,EAAI,4CAA+C,GAAiB,EAAQ,CAAK,CAAC,EACpG,GAAI,IAAQ,KAAM,OAClB,IAAM,EAAQ,GAAe,CAAG,EAC3B,EACA,EAAY,CAAE,QAAO,SAAQ,OAAM,CAAC,EAD7B,EAAS,4DAA4D,CAEnF,OAAS,EAAK,CACZ,EAAS,GAAS,CAAG,CAAC,CACxB,QAAU,CACR,EAAQ,EAAK,CACf,CACF,EAEM,GAAQ,SAAY,CACnB,KAEL,CADA,EAAQ,EAAI,EACZ,EAAS,IAAI,EACb,GAAI,CAEF,GAAI,MADe,EAAI,wBAA2B,GAAe,EAAS,OAAQ,EAAS,MAAO,EAAS,MAAM,MAAM,CAAC,IAC3G,KAAM,OACnB,EAAQ,GAAG,EAAS,MAAM,SAAW,UAAY,WAAa,QAAQ,GAAG,EAAS,MAAM,OAAO,KAAK,MAAM,EAAS,MAAM,UAAU,EAAE,EACrI,EAAQ,EAAE,EACV,EAAW,EAAE,EACb,EAAQ,EAAE,EACV,EAAO,EAAE,EACT,EAAM,EACN,EAAQ,CACV,OAAS,EAAK,CACZ,EAAS,GAAS,CAAG,CAAC,CACxB,QAAU,CACR,EAAQ,EAAK,CACf,CAfa,CAgBf,EAEM,EAAS,EAAQ,KAAM,GAAM,EAAE,KAAO,CAAM,EAClD,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACQ,OACN,YAAe,CAAE,EAAM,EAAG,EAAQ,CAAG,EAC5B,UACT,MAAO,EAAW,uBAAyB,oBAC3C,YAAY,yHACZ,MAAO,IAEN,SAAA,IAAa,MACZ,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAY,SAAW,GAAM,KAAK,EAAO,CAAC,EAAlE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAM,SAAS,MAAO,EAAQ,SAAW,GAAM,EAAU,EAAE,OAAO,KAAK,EAC7E,KAAM,GAAQ,iBAAmB,IAAW,MAAQ,0BAA4B,mFAC/E,SAAA,EAAQ,IAAK,IAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAmB,MAAO,EAAE,GAAI,SAAU,EAAE,iBAAmB,KAAO,SAAA,EAAE,KAAc,EAAzE,EAAE,EAAuE,CAAC,CACrG,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAM,OAAO,MAAO,EAAM,SAAW,GAAM,EAAQ,EAAE,OAAO,KAAK,EAAG,SAAA,GAAS,YAAY,aAAa,aAAa,KAAO,CAAA,GACjI,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAM,UAAU,MAAO,EAAS,SAAW,GAAM,EAAW,EAAE,OAAO,KAAK,EAAG,SAAA,GAAS,YAAY,wBAAwB,aAAa,MAC5I,KAAK,sFAAwF,CAAA,GAC/F,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAM,YAAY,MAAO,EAAM,SAAW,GAAM,EAAQ,EAAE,OAAO,KAAK,EAAG,YAAY,sDAAsD,aAAa,KAAO,CAAA,GACtK,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,WAAzB,SAAA,CAAqC,gBACvB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,SAAA,qEAAyE,CAAA,GACnH,EAAA,EAAA,IAAA,CAAC,WAAD,CAAU,UAAW,EAAO,SAAU,MAAO,EAAK,SAAW,GAAM,EAAO,EAAE,OAAO,KAAK,EAAG,WAAY,GAAO,aAAa,KAAO,CAAA,CAC7H,IACN,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MAChE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,SAAS,QAAQ,QAAQ,QAAS,EAAS,SAAA,QAAc,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,SAAS,QAAQ,UAAgB,OAAM,SAAU,EAAK,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAM,IAAM,GAAQ,gBAAkB,KAAM,SAAA,QAErI,CAAA,CACL,GACD,CAEN,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,CACG,EAAS,MAAM,SAAW,UAAY,WAAa,OAAO,KAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAS,MAAM,OAAO,IAAa,CAAA,EAAC,MAAI,KAC7G,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAS,MAAM,SAAgB,CAAA,EACnE,EAAS,MAAM,YAAc,KAAK,EAAS,MAAM,YAAY,GAAK,GAAG,GACrE,CAAA,CAAA,GACH,EAAA,EAAA,IAAA,CAAC,GAAD,CAAqB,OAAQ,EAAS,MAAM,OAAQ,QAAQ,eAAiB,CAAA,EAC5E,EAAS,MAAM,UAAW,EAAA,EAAA,IAAA,CAAC,GAAD,CAAqB,OAAQ,EAAS,MAAM,SAAU,QAAQ,WAAa,CAAA,EAAI,KACzG,EAAS,MAAM,SAAS,OAAS,GAChC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,SAAW,SAAA,EAAS,MAAM,SAAS,IAAK,IAAM,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAa,CAAM,EAAV,CAAU,CAAC,CAAM,CAAA,EAC5F,KACH,EAAS,MAAM,MAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAO,SAAA,EAAS,MAAM,IAAQ,CAAA,EAAI,KAC7E,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MAChE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,YAAe,EAAY,IAAI,EAAG,SAAA,MAAY,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,UAAgB,OAAM,YAAe,KAAK,GAAM,EAC7D,SAAA,EAAS,MAAM,SAAW,UAAY,iBAAmB,YACpD,CAAA,CACL,GACF,GAEF,CAAA,CAEX,CAEA,SAAgB,GAAS,CACvB,WACA,YACA,cACA,UACA,MACA,UACA,cAUC,CACD,GAAM,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,EAAK,EACpC,EAAO,EAAW,GAAY,CAAQ,EAAI,CAAC,EACjD,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,GAAG,cACH,MAAM,cACM,aACZ,QACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAK,CAAA,EAAG,YAAe,EAAU,EAAI,EAAG,gBAAc,SAAS,SAAA,YAEhH,CAAA,EAEV,QACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CAAE,qEACmE,KACnE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,qBAAyB,CAAA,EAAC,kBAAc,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,cAAkB,CAAA,EAAC,oEAC7C,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,SAAa,CAAA,EAAC,iEAC9C,CAAA,CAAA,EAdN,SAAA,CAiBG,IAAa,MAAQ,EAAS,MAAM,OAAS,GAC5C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAa,KAAK,OAAzC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,yBAA+B,CAAA,EAAC,IAAE,EAAS,MAAM,KAAK,GAAG,EAAE,IAAE,EAAS,QAAQ,IACnF,CACH,CAAA,EAAA,KACH,IAAc,MAAQ,EAAU,eAC/B,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAa,KAAK,QAAzC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,oBAA0B,CAAA,EAAC,IAAE,EAAU,MAAM,KAAK,GAAG,EAAG,IAC/D,EAAU,SAAS,OAAQ,GAAM,EAAE,eAAiB,OAAO,CAAC,CAAC,IAAK,GAAM,GAAG,EAAE,MAAM,IAAI,EAAE,SAAW,SAAS,WAAW,EAAE,eAAiB,IAAI,EAAE,CAAC,CAAC,KAAK,GAAG,CACzJ,CACH,CAAA,EAAA,KACH,IAAa,MACZ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAa,YAAW,GAAW,IAAA,GACrD,SAAA,EAAU,qCAAwC,GAAe,mCACjE,CAAA,GAEH,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAK,IAAK,IAAQ,EAAA,EAAA,IAAA,CAAC,GAAD,CAA+B,KAAM,EAAvB,EAAI,MAAmB,CAAC,CACvD,CAAA,EAEL,GAAU,OACT,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CAAgC,UACtB,GAAe,GAAmB,EAAS,MAAM,OAAQ,sCAAsC,EACtG,EAAS,MAAM,UAAY,KAAK,EAAS,MAAM,UAAU,GAAK,EAC9D,CACD,CAAA,EAAA,MACJ,EAAA,EAAA,IAAA,CAAC,GAAD,CAAgB,KAAM,EAAkB,WAAe,MAAK,YAAe,EAAU,EAAK,EAAY,SAAU,CAAA,CACxG,GAEd,CC5RA,SAAS,GAAU,EAAkB,CACnC,MAAO,CAAE,KAAM,GAAc,EAAI,OAAO,KAAK,EAAG,MAAO,EAAI,OAAO,KAAM,CAC1E,CAEA,SAAgB,GAAa,CAC3B,QACA,WACA,aAMC,CACD,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,GAAI,EAAM,GAAI,MAAO,EAAM,MAAO,OAAQ,EAAM,OACxD,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAM,KAAK,IAAK,GAAQ,CACvB,IAAM,EAAU,EAAI,QAAQ,KAAM,GAAM,EAAE,OAAS,SAAS,GAAK,KACjE,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAEE,GAAI,OAAO,EAAI,KACf,KAAM,EAAI,KACV,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,YAAa,EAAI,YACjB,OAAQ,GAAU,CAAG,EACrB,OAAQ,EAAI,SAAW,KAAO,EAAI,OAAS,KAC3C,MACE,EAAI,SAAW,KAAO,MACpB,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,YAAe,EAAU,CAAG,EAAG,SAAU,EAAQ,iBAAmB,KAAM,MAAO,EAAY,EAAQ,SAAW,CAAC,CAAC,EACjJ,SAAA,EAAQ,KACH,CAAA,EACN,MACJ,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,QAAS,EAAI,OAAO,QACpB,SAAW,GAAS,EAAS,EAAK,CAAI,EACtC,aAAY,GAAG,EAAI,YAAY,IAAI,EAAI,OAAO,QAAU,KAAO,QAC/D,mBAAkB,OAAO,EAAI,GAAG,MACjC,CAAA,CACD,CAAA,CAAA,CAGP,EAzBM,EAAI,EAyBV,CAEL,CAAC,CACC,CAAA,CACI,CAAA,CAEd,CAEA,SAAgB,GAAY,CAC1B,QACA,oBACA,gBACA,mBAOC,CACD,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,GAAI,EAAM,GAAI,MAAO,EAAM,MAAO,OAAQ,EAAM,OACxD,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAM,KAAK,IAAK,GAAQ,CACvB,IAAM,EAAS,EAAI,QAAQ,KAAM,GAAM,EAAE,OAAS,QAAQ,GAAK,KACzD,EAAW,GAAQ,gBAAkB,EAC3C,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAEE,GAAI,OAAO,EAAI,KACf,KAAM,EAAI,KACV,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,YAAa,EAAI,YACjB,QAAS,EAAI,QACb,OAAQ,GAAU,CAAG,EACrB,OAAQ,EAAI,OACZ,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,EAAI,MAAQ,EAAI,WAAY,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAI,KAAK,KAAM,MAAO,EAAI,KAAK,MAAO,KAAM,OAAO,EAAI,KAAK,SAAY,CAAA,EAAI,KACxH,EAAI,cACH,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAY,EAAI,YAAY,EAAG,KAAM,iCAAiC,EAAI,MAAS,CAAA,EACjG,KACH,EACC,EAAO,iBAAmB,MAGxB,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,SACR,KAAK,KACL,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAK,CAAA,EAC3B,SAAU,IAAa,KACvB,MAAO,GAAY,IAAA,GACnB,YAAe,EAAc,CAAG,EAChC,aAAY,UAAU,EAAI,OAC3B,SAAA,QAEO,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,SACR,KAAK,KACL,SAAA,GACA,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,KAAM,EAAK,CAAA,EAClC,aAAY,sBAAsB,EAAI,OACtC,MAAO,sBAAsB,EAAI,OACjC,gBAAc,SACd,YAAe,EAAgB,CAAG,CACnC,CAAA,CACG,CAEN,CAAA,GA1BA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAe,SAAA,EAAO,cAAqB,CAAA,EA0BnE,IACJ,CAAA,CAAA,CAEL,EA9CM,EAAI,EA8CV,CAEL,CAAC,CACC,CAAA,CACI,CAAA,CAEd,CAEA,SAAgB,GAAiB,CAAE,SAAmC,CACpE,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,GAAI,EAAM,GAAI,MAAO,EAAM,MAAO,OAAQ,EAAM,OACxD,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAM,KAAK,IAAK,IACf,EAAA,EAAA,IAAA,CAAC,GAAD,CAEE,GAAI,OAAO,EAAI,KACf,KAAM,EAAI,KACV,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,YAAa,EAAI,YACjB,QAAS,EAAI,QACb,OAAQ,GAAU,CAAG,EACrB,OAAQ,EAAI,MACb,EATM,EAAI,EASV,CACF,CACC,CAAA,CACI,CAAA,CAEd,CC7GA,IAAa,GAAe,IAE5B,SAAS,GAAW,EAAa,EAAqB,CACpD,IAAM,EAAI,KAAK,MAAM,CAAG,EACxB,GAAI,CAAC,OAAO,SAAS,CAAC,EAAG,MAAO,cAChC,IAAM,EAAU,KAAK,IAAI,EAAG,KAAK,OAAO,EAAM,GAAK,GAAM,CAAC,EAG1D,OAFI,EAAU,EAAU,mBACpB,EAAU,IAAY,WAAW,EAAQ,UACtC,WAAW,KAAK,MAAM,EAAU,EAAE,EAAE,OAC7C,CAEA,SAAgB,GAAY,CAAE,cAA+C,CAAC,EAAG,CAC/E,IAAM,EAAO,EAAS,EAAS,EACzB,EAAc,EAAW,EAAS,EACxC,EAAoB,EAAa,EAAY,EAC7C,IAAM,EAAW,EAAS,EAAmB,EACvC,EAAM,EAAS,EAAgB,EAC/B,EAAM,EAAS,EAAiB,EAChC,EAAa,EAAW,EAAgB,EACxC,EAAY,EAAS,CAAmB,EACxC,EAAW,GAAgB,EAC3B,EAAK,GAAW,EAChB,EAAO,GAAa,EAEpB,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAA8D,IAAI,EACxF,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAK,EAC5C,CAAC,EAAc,IAAA,EAAmB,EAAA,SAAA,CAAwB,IAAI,EAC9D,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAuD,IAAI,EACjF,CAAC,GAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAK,EAC5C,CAAC,GAAa,IAAA,EAAkB,EAAA,SAAA,CAAwB,IAAI,EAC5D,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAA6B,IAAI,EAC7D,CAAC,GAAY,KAAA,EAAiB,EAAA,SAAA,CAAS,EAAK,EAC5C,CAAC,GAAa,IAAA,EAAkB,EAAA,SAAA,CAAwB,IAAI,EAC5D,CAAC,GAAO,KAAA,EAAY,EAAA,SAAA,KAAe,KAAK,IAAI,CAAC,EACnD,MAA0B,GAAS,KAAK,IAAI,CAAC,EAAG,GAAM,EAEtD,IAAM,GAAA,EAAa,EAAA,OAAA,CAA2B,IAAI,GAClD,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,IAAe,cAAe,OAClC,IAAM,EAAK,EAAW,QACjB,IACD,OAAO,EAAG,gBAAmB,YAAY,EAAG,eAAe,CAAE,MAAO,OAAQ,CAAC,EACjF,EAAG,MAAM,CAAE,cAAe,EAAK,CAAC,EAClC,EAAG,CAAC,CAAU,CAAC,EAEf,IAAM,EAAO,EAAU,KACjB,EAAW,GAAe,CAAI,EAC9B,EAAS,GAAe,EAAS,KAAK,EACtC,EAAU,GAAoB,CAClC,kBAAmB,EAAS,MAAM,UAAY,EAAS,KAAK,KAAK,UAAY,GAAS,MAAe,KACrG,eAAgB,EAAS,MAAM,UAAY,EAAS,KAAK,KAAK,OAAS,KACvE,gBAAiB,EAAG,eACtB,CAAC,EAEK,EAAS,EAAK,MAAM,UAAY,EAAK,KAAK,KAAO,KACjD,EAAS,GAAuD,GAAQ,OAAO,KAAM,GAAM,EAAE,KAAO,CAAE,GAAK,KAC3G,EAAW,EAAI,MAAM,UAAY,GAAmB,EAAI,KAAK,GAAG,EAAI,KACpE,EAAY,EAAI,MAAM,UAAY,GAAiB,EAAI,KAAK,GAAG,EAAI,KAEnE,GAAA,EAAM,EAAA,YAAA,EAAa,EAAc,EAA6B,YAAc,EAAU,CAAE,OAAM,MAAK,CAAC,EAAG,CAAC,CAAC,EAEzG,EAAY,SAAY,CAC5B,EAAc,EAAI,EAClB,GAAI,CAME,MALe,EAAK,IAAI,iCAAkC,UAC5D,MAAM,QAAQ,IAAI,CAAC,GAAY,EAAG,GAAkB,CAAC,CAAC,UAAY,IAAI,CAAC,CAAC,EACxE,EAAW,EACJ,GACR,IAEC,GAAS,KAAK,IAAI,CAAC,EACnB,EAAI,gBAAgB,EAExB,OAAS,EAAK,CACZ,EAAI,EAAqB,CAAG,EAAG,QAAQ,CACzC,QAAU,CACR,EAAc,EAAK,CACrB,CACF,EAEM,EAAc,KAAO,IAAqB,CAC9C,EAAgB,EAAI,MAAM,EAC1B,GAAI,CAKE,MAJe,EAAK,IAAI,wBAAwB,EAAI,MAAM,cAAe,UAC3E,MAAM,GAAc,EAAI,MAAM,EACvB,GACR,GACS,EAAI,0BAA0B,EAAI,MAAM,sDAAsD,CAC1G,OAAS,EAAK,CACZ,EAAI,EAAqB,CAAG,EAAG,QAAQ,CACzC,QAAU,CACR,EAAgB,IAAI,CACtB,CACF,EAEM,EAAkB,SAAY,CAC7B,KAEL,CADA,EAAc,EAAI,EAClB,EAAe,IAAI,EACnB,GAAI,CACF,IAAM,EAAS,MAAM,EAAK,IAAI,GAAG,EAAO,OAAS,YAAc,UAAU,GAAG,EAAO,IAAI,WAAc,GAAiB,EAAO,IAAI,GAAI,EAAO,MAAM,CAAC,EAC/I,IACF,EAAI,WAAW,EAAO,QAAQ,KAAK,GAAG,EAAE,yCAAyC,EACjF,EAAU,IAAI,EAElB,OAAS,EAAK,CACZ,EAAe,EAAqB,CAAG,CAAC,CAC1C,QAAU,CACR,EAAc,EAAK,CACrB,CAXmB,CAYrB,EAEM,EAAS,MAAO,EAAkB,IAA2B,CACjE,GAAI,EAAQ,SAAW,QAAS,CAC9B,GAAc,EAAI,GAAI,EAAQ,MAAM,EACpC,EAAa,IAAI,EACjB,MACF,CACI,KAAQ,OAAS,KAErB,CADA,GAAc,EAAI,EAClB,EAAe,IAAI,EACnB,GAAI,CAGE,MAFiB,EAAK,IAAI,UAAU,EAAI,KAAK,kBAC/C,GAAoB,EAAI,GAAI,CAAE,KAAM,EAAQ,KAAO,IAAK,EAAQ,OAAO,IAAK,MAAO,EAAQ,OAAO,KAAM,CAAC,CAAC,IAE1G,EAAI,UAAU,EAAI,KAAK,cAAc,EACrC,EAAa,IAAI,EAErB,OAAS,EAAK,CACZ,IAAM,EAAU,EAAqB,CAAG,EACpC,EAAW,EAAe,CAAO,EAChC,EAAI,EAAS,QAAQ,CAC5B,QAAU,CACR,GAAc,EAAK,CACrB,CAdmB,CAerB,EAEM,EAAoB,EAAQ,WAAa,EAAS,OAAS,EAAI,KAAO,wCACtE,GAAiB,GAAqB,CAC1C,IAAM,EAAuB,CAAE,IAAK,SAAU,MAAO,IAAK,EACpD,EAAU,EAAI,QAAQ,KAAM,GAAM,EAAE,OAAS,QAAQ,CAAC,EAAE,SAAW,KACpE,GACL,EAAY,EAAK,CAAE,SAAQ,OAAQ,EAAQ,UAAY,QAAU,eAAgB,KAAM,EAAS,EAAE,EAAE,MAAQ,KAAM,SAAQ,CAAC,CAC7H,EAEM,GAAgB,EAAK,OAAS,IAAA,KAAc,EAAK,SAAW,WAAa,EAAK,SAAW,QAE/F,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,QAAS,aAAW,kBAA/C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OACrB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,OAA1B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,MAAO,SAAA,iBAAuB,CAAA,GACpD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,SAAA,qEAAsE,CAAA,CAC9F,CACL,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,CACG,GACC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CACG,GAAW,EAAO,UAAW,EAAK,EAClC,EAAO,aAAe,WAAa,+DAAiE,EACjG,CAAA,CAAA,EACJ,MACJ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAK,CAAA,EAAG,KAAM,EAAY,YAAe,KAAK,EAAU,EAAG,SAAA,aAE9G,CAAA,CACL,CACC,CAAA,CAAA,KAER,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAS,EAAO,OAAS,EAAO,eAAgB,YAAW,GAAQ,KAAM,KAAK,SAAS,YAAU,SAC5G,SAAA,GAAQ,MAAQ,EAChB,CAAA,GAEH,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,MAAO,EAAS,MAChB,OAAQ,EAAS,OACjB,OAAQ,EAAS,OACjB,QAAS,EAAS,QACJ,eACd,YAAc,GAAQ,KAAK,EAAY,CAAG,CAC3C,CAAA,EAEA,EAAK,MAAQ,CAAC,EAAK,KAAK,WACvB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,OAAS,SAAA,EAAK,KAAK,MAAU,CAAA,EAChD,IACF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,YAAU,OAAO,aAAW,gBAAjC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,CACxB,CAEL,CAAA,GAAA,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,EAAM,SAAS,GACd,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,MAAO,EAAM,SAAS,EACtB,UAAW,EAAK,IAAW,CAAE,EAAe,IAAI,EAAG,EAAU,CAAE,MAAK,QAAO,CAAC,CAAG,EAC/E,UAAY,GAAQ,CAAE,EAAe,IAAI,EAAG,EAAU,CAAE,MAAK,OAAQ,EAAM,CAAC,CAAG,CAChF,CAAA,EACC,KACH,EAAM,iBAAiB,GACtB,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,MAAO,EAAM,iBAAiB,EACX,oBACJ,iBACf,gBAAkB,GAAQ,CAAE,EAAe,IAAI,EAAG,EAAa,CAAG,CAAG,CACtE,CAAA,EACC,KACH,EAAM,cAAc,GAAI,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,MAAO,EAAM,cAAc,CAAK,CAAA,EAAI,IAC/E,CAAA,CAAA,GAGJ,EAAA,EAAA,IAAA,CAAC,GAAD,CACY,WACC,YACX,YAAa,EAAI,MAAQ,CAAC,EAAI,KAAK,UAAY,EAAI,KAAK,OAAS,KACjE,QAAS,EAAI,OAAS,IAAA,GACtB,IAAK,EAAK,IACV,QAAU,GAAS,CAAE,EAAI,CAAI,EAAG,EAAW,CAAG,EAC9C,WAAY,CACb,CAAA,CACE,GACF,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,IAAK,GAAQ,KAAO,KACpB,OAAQ,GAAQ,QAAU,GAC1B,KAAM,GACN,MAAO,GACP,aAAgB,EAAU,IAAI,EAC9B,cAAiB,KAAK,EAAgB,CACvC,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,IAAK,EACK,WACF,SACC,UACT,KAAM,GACN,MAAO,GACP,aAAgB,EAAa,IAAI,EACjC,SAAW,GAAY,CAAM,GAAW,EAAY,EAAW,CAAO,CAAG,CAC1E,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAAK,OAAO,KAClB,OAAQ,EAAK,OAAO,OACpB,WAAW,iBACX,UAAU,yCACV,QAAS,EAAK,OAAO,QACrB,WAAY,EAAK,OAAO,UACzB,CAAA,CACM,GAEb"}
@@ -1,2 +0,0 @@
1
- import{n as e}from"./index-Dk8R-3a7.js";import{n as t}from"./Advanced-xVYFAeA8.js";var n=e();function r(){return(0,n.jsx)(t,{})}export{r as AutonomySection};
2
- //# sourceMappingURL=AutonomySection-BF5UCsMv.js.map
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-Dk8R-3a7.js";import{n as r,t as i}from"./MutationTokenDialog-Cqn2uPV6.js";import{n as a}from"./viewport-DDoJ_xVq.js";import{a as o}from"./command-bus-DHJJLWh8.js";import{i as s,r as c}from"./section-visibility-u7q-Q9AA.js";import{a as l}from"./icons-YPgbel-I.js";import{C as u,S as d,_ as f,a as p,b as m,c as h,d as g,f as _,g as v,h as y,i as b,m as x,o as S,p as C,r as w,s as T,u as E,w as D,x as O}from"./git-model-DaGw1SzS.js";import{t as k}from"./Button-Cr_qkQEc.js";import{n as A}from"./use-token-gate-B5gOFkeH.js";var j=n(e(),1),M={bar:`_bar_1j44k_8`,rows:`_rows_1j44k_15`,row:`_row_1j44k_15`,ident:`_ident_1j44k_39`,glyph:`_glyph_1j44k_47`,repo:`_repo_1j44k_48`,branch:`_branch_1j44k_57`,drift:`_drift_1j44k_66`,stat:`_stat_1j44k_72`,add:`_add_1j44k_90`,del:`_del_1j44k_91`,checking:`_checking_1j44k_93`,conflicts:`_conflicts_1j44k_94`,spacer:`_spacer_1j44k_101`,split:`_split_1j44k_105`,primary:`_primary_1j44k_113`,menuButton:`_menuButton_1j44k_114`,visuallyHidden:`_visuallyHidden_1j44k_148`,primaryLabel:`_primaryLabel_1j44k_162`,spinner:`_spinner_1j44k_163`,"branch-spin":`_branch-spin_1j44k_1`,menu:`_menu_1j44k_114`,"menu-in":`_menu-in_1j44k_1`,menuItem:`_menuItem_1j44k_204`,menuLabel:`_menuLabel_1j44k_224`,menuReason:`_menuReason_1j44k_225`,more:`_more_1j44k_233`,notice:`_notice_1j44k_248`},N=t();function P({primary:e,items:t,onSelect:n,menuLabel:r,disabled:i=!1}){let[a,o]=(0,j.useState)(!1),[s,c]=(0,j.useState)(-1),u=(0,j.useId)(),d=(0,j.useId)(),f=(0,j.useRef)(null),p=(0,j.useRef)(null),m=(0,j.useRef)([]),h=t.map((e,t)=>e.disabledReason===null?t:-1).filter(e=>e>=0),g=(0,j.useCallback)(e=>{o(!1),c(-1),e&&f.current?.focus()},[]),_=e=>{o(!0),c(h.length===0?-1:e===`first`?h[0]:h[h.length-1])};(0,j.useEffect)(()=>{a&&(s>=0?m.current[s]?.focus():p.current?.focus())},[a,s]),(0,j.useEffect)(()=>{if(!a)return;let e=e=>{let t=e.target;p.current?.contains(t)||f.current?.contains(t)||g(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[a,g]);let v=e=>{if(h.length===0)return;let t=h.indexOf(s),n=t===-1?e===1?0:h.length-1:(t+e+h.length)%h.length;c(h[n])},y=e=>{e.key===`ArrowDown`?(e.preventDefault(),_(`first`)):e.key===`ArrowUp`&&(e.preventDefault(),_(`last`))},b=e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),v(1);break;case`ArrowUp`:e.preventDefault(),v(-1);break;case`Home`:e.preventDefault(),h.length&&c(h[0]);break;case`End`:e.preventDefault(),h.length&&c(h[h.length-1]);break;case`Escape`:e.preventDefault(),e.stopPropagation(),g(!0);break;case`Tab`:g(!1)}},x=e=>{e.disabledReason===null&&(g(!0),n(e.id))};return(0,N.jsxs)(`div`,{className:M.split,"data-open":a?`true`:`false`,children:[e?(0,N.jsxs)(`button`,{type:`button`,className:M.primary,"data-tone":e.tone??`primary`,onClick:e.onClick,disabled:i||e.busy,"aria-busy":e.busy||void 0,"aria-describedby":d,title:e.disclosure,children:[e.busy?(0,N.jsx)(`span`,{className:M.spinner,"aria-hidden":`true`}):null,(0,N.jsx)(`span`,{className:M.primaryLabel,children:e.label})]}):null,(0,N.jsx)(`span`,{id:d,className:M.visuallyHidden,children:e?.disclosure??``}),(0,N.jsx)(`button`,{ref:f,type:`button`,className:M.menuButton,"data-alone":e?`false`:`true`,"aria-haspopup":`menu`,"aria-expanded":a,"aria-controls":a?u:void 0,"aria-label":r,title:r,disabled:i,onClick:()=>a?g(!1):_(`first`),onKeyDown:y,children:(0,N.jsx)(l,{width:14,height:14,"aria-hidden":`true`})}),a?(0,N.jsx)(`div`,{ref:p,id:u,role:`menu`,"aria-label":r,className:M.menu,tabIndex:-1,onKeyDown:b,children:t.map((e,t)=>(0,N.jsxs)(`button`,{ref:e=>{m.current[t]=e},type:`button`,role:`menuitem`,className:M.menuItem,tabIndex:t===s?0:-1,"aria-disabled":e.disabledReason!==null||void 0,onClick:()=>x(e),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),x(e))},children:[(0,N.jsx)(`span`,{className:M.menuLabel,children:e.label}),e.disabledReason?(0,N.jsx)(`span`,{className:M.menuReason,children:e.disabledReason}):null]},e.id))}):null]})}var F={form:`_form_1pzii_5`,facts:`_facts_1pzii_11`,fact:`_fact_1pzii_11`,factWord:`_factWord_1pzii_34`,ref:`_ref_1pzii_45`,label:`_label_1pzii_55`,optional:`_optional_1pzii_62`,input:`_input_1pzii_68`,textarea:`_textarea_1pzii_69`,mono:`_mono_1pzii_85`,row:`_row_1pzii_87`,field:`_field_1pzii_93`,check:`_check_1pzii_100`,hint:`_hint_1pzii_111`,error:`_error_1pzii_126`,actions:`_actions_1pzii_137`};function I(e){e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),e.currentTarget.requestSubmit())}function L({children:e}){return(0,N.jsx)(`ul`,{className:F.facts,children:e})}function R({tone:e=`neutral`,children:t}){return(0,N.jsxs)(`li`,{className:F.fact,"data-tone":e,children:[e===`warning`?(0,N.jsx)(`span`,{className:F.factWord,children:`Note`}):null,(0,N.jsx)(`span`,{children:t})]})}function z({error:e}){return e?(0,N.jsx)(`p`,{role:`alert`,className:F.error,children:e}):null}function B({name:e}){return(0,N.jsx)(`code`,{className:F.ref,children:e??`HEAD`})}function V({open:e,status:t,onClose:n,onSubmit:i,error:a,busy:o}){let s=(0,j.useId)(),c=(0,j.useId)(),[l,u]=(0,j.useState)(``),d=(0,j.useRef)(null);return(0,j.useEffect)(()=>{e&&u(``)},[e]),(0,N.jsx)(r,{open:e,onClose:n,titleId:s,title:`Commit changes`,initialFocusRef:d,children:(0,N.jsxs)(`form`,{className:F.form,onSubmit:e=>{e.preventDefault(),l.trim()&&!o&&i(l.trim())},onKeyDown:I,children:[(0,N.jsx)(L,{children:(0,N.jsxs)(R,{children:[h(t.dirty),` changed `,t.dirty===1?`file`:`files`,` in `,(0,N.jsx)(`strong`,{children:t.name}),` on `,(0,N.jsx)(B,{name:t.branch}),`, untracked files included.`]})}),(0,N.jsx)(`label`,{className:F.label,htmlFor:c,children:`Message`}),(0,N.jsx)(`textarea`,{id:c,ref:d,className:F.textarea,rows:4,value:l,onChange:e=>u(e.target.value),placeholder:`What changed, and why`,maxLength:1e4,required:!0}),(0,N.jsxs)(`p`,{className:F.hint,children:[`Git hooks in this repository run as usual. `,(0,N.jsx)(`kbd`,{children:`⌘`}),(0,N.jsx)(`kbd`,{children:`Enter`}),` commits.`]}),(0,N.jsx)(z,{error:a}),(0,N.jsxs)(`div`,{className:F.actions,children:[(0,N.jsx)(k,{variant:`ghost`,onClick:n,children:`Cancel`}),(0,N.jsx)(k,{type:`submit`,variant:`primary`,busy:o,disabled:!l.trim(),children:`Commit`})]})]})})}function H({open:e,status:t,onClose:n,onSubmit:i,error:a,busy:o,draft:s}){let c=(0,j.useId)(),l=(0,j.useId)(),u=(0,j.useId)(),d=(0,j.useId)(),[f,p]=(0,j.useState)(``),[m,g]=(0,j.useState)(``),[_,v]=(0,j.useState)(``),[y,x]=(0,j.useState)(s),S=(0,j.useRef)(null);(0,j.useEffect)(()=>{e&&(p(b(t)),g(``),v(t.base??``),x(s))},[e]);let C=t.upstream===null||t.ahead>0;return(0,N.jsx)(r,{open:e,onClose:n,titleId:c,title:y?`Create draft pull request`:`Create pull request`,initialFocusRef:S,children:(0,N.jsxs)(`form`,{className:F.form,onSubmit:e=>{e.preventDefault(),f.trim()&&_.trim()&&!o&&i({title:f.trim(),body:m,base:_.trim(),draft:y})},onKeyDown:I,children:[(0,N.jsxs)(L,{children:[C?(0,N.jsxs)(R,{children:[`Pushes `,(0,N.jsx)(B,{name:t.branch}),` to `,t.upstream??`origin`,` first`,t.upstream&&t.ahead>0?` (${h(t.ahead)} ${t.ahead===1?`commit`:`commits`})`:``,`.`]}):null,(0,N.jsxs)(R,{children:[`Then opens a PR from `,(0,N.jsx)(B,{name:t.branch}),` into `,(0,N.jsx)(B,{name:_.trim()||null}),`:`,` `,h(t.diffstat.files),` `,t.diffstat.files===1?`file`:`files`,`, `,T(t.diffstat.additions,t.diffstat.deletions),`.`]}),t.dirty>0?(0,N.jsxs)(R,{tone:`warning`,children:[h(t.dirty),` uncommitted `,t.dirty===1?`change is`:`changes are`,` not in the PR. Commit first to include `,t.dirty===1?`it`:`them`,`.`]}):null]}),(0,N.jsx)(`label`,{className:F.label,htmlFor:l,children:`Title`}),(0,N.jsx)(`input`,{id:l,ref:S,className:F.input,value:f,onChange:e=>p(e.target.value),maxLength:256,required:!0}),(0,N.jsxs)(`label`,{className:F.label,htmlFor:u,children:[`Description `,(0,N.jsx)(`span`,{className:F.optional,children:`optional`})]}),(0,N.jsx)(`textarea`,{id:u,className:F.textarea,rows:4,value:m,onChange:e=>g(e.target.value),maxLength:6e4}),(0,N.jsxs)(`div`,{className:F.row,children:[(0,N.jsxs)(`div`,{className:F.field,children:[(0,N.jsx)(`label`,{className:F.label,htmlFor:d,children:`Base branch`}),(0,N.jsx)(`input`,{id:d,className:`${F.input} ${F.mono}`,value:_,onChange:e=>v(e.target.value),spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,required:!0})]}),(0,N.jsxs)(`label`,{className:F.check,children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:y,onChange:e=>x(e.target.checked)}),`Draft`]})]}),(0,N.jsx)(z,{error:a}),(0,N.jsxs)(`div`,{className:F.actions,children:[(0,N.jsx)(k,{variant:`ghost`,onClick:n,children:`Cancel`}),(0,N.jsx)(k,{type:`submit`,variant:`primary`,busy:o,disabled:!f.trim()||!_.trim(),children:y?`Create draft PR`:`Create PR`})]})]})})}function U({open:e,pin:t,live:n,onClose:i,onSubmit:a,error:o,busy:s}){let c=(0,j.useId)(),l=(0,j.useRef)(null),u=C(t),d=_(t,n)??(u.verified?null:`This head has not passed every check GitHub needs to merge it.`);return(0,N.jsx)(r,{open:e,onClose:i,titleId:c,title:`Merge #${t.number}?`,description:t.title,initialFocusRef:l,children:(0,N.jsxs)(`form`,{className:F.form,onSubmit:e=>{e.preventDefault(),!s&&d===null&&a()},onKeyDown:I,children:[(0,N.jsxs)(L,{children:[(0,N.jsxs)(R,{children:[`Squash-merges `,(0,N.jsx)(B,{name:t.headRef||null}),` into `,(0,N.jsx)(B,{name:t.baseRef||null}),` on GitHub.`]}),(0,N.jsxs)(R,{tone:u.verified?`neutral`:`warning`,children:[`Head `,(0,N.jsx)(`code`,{className:F.ref,children:u.sha}),`, `,u.detail]}),(0,N.jsx)(R,{children:`Only this head merges: GitHub re-checks it first, so if a commit landed after it, nothing merges. Admin overrides are never used.`}),d===null?null:(0,N.jsx)(R,{tone:`warning`,children:d})]}),(0,N.jsx)(z,{error:o}),(0,N.jsxs)(`div`,{className:F.actions,children:[(0,N.jsx)(k,{variant:`ghost`,onClick:i,children:`Cancel`}),(0,N.jsxs)(k,{ref:l,type:`submit`,variant:`primary`,busy:s,disabled:d!==null,children:[`Merge #`,t.number]})]})]})})}var W={chip:`_chip_1sdua_5`,glyph:`_glyph_1sdua_26`,state:`_state_1sdua_30`,checks:`_checks_1sdua_33`,number:`_number_1sdua_37`,title:`_title_1sdua_43`,pulse:`_pulse_1sdua_65`,"pr-pulse":`_pr-pulse_1sdua_1`};function G({pr:e,counts:t=null,showTitle:n=!0}){let r=y(e,t);return(0,N.jsxs)(`a`,{className:W.chip,"data-tone":r.tone,href:e.url,target:`_blank`,rel:`noopener noreferrer`,"aria-label":`${r.label}. Opens on GitHub.`,title:`${r.label}. Opens on GitHub.`,children:[(0,N.jsx)(K,{tone:r.tone,state:e.state}),(0,N.jsx)(`span`,{className:W.number,children:r.number}),n&&e.title?(0,N.jsx)(`span`,{className:W.title,children:e.title}):null,(0,N.jsxs)(`span`,{className:W.state,children:[r.state,e.state===`merged`?` ✓`:``]}),r.checks?(0,N.jsx)(`span`,{className:W.checks,children:r.checks}):null]})}function K({tone:e,state:t}){let n={width:12,height:12,viewBox:`0 0 16 16`,"aria-hidden":!0,className:W.glyph};return t===`merged`?(0,N.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,children:[(0,N.jsx)(`circle`,{cx:`4`,cy:`3.5`,r:`1.8`}),(0,N.jsx)(`circle`,{cx:`4`,cy:`12.5`,r:`1.8`}),(0,N.jsx)(`circle`,{cx:`12`,cy:`8`,r:`1.8`}),(0,N.jsx)(`path`,{d:`M4 5.3v5.4M5.2 4.6c1.4 2.2 3.2 3.4 5 3.4`})]}):t===`closed`?(0,N.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,children:[(0,N.jsx)(`circle`,{cx:`4`,cy:`3.5`,r:`1.8`}),(0,N.jsx)(`circle`,{cx:`4`,cy:`12.5`,r:`1.8`}),(0,N.jsx)(`path`,{d:`M4 5.3v5.4M10 3l4 4M14 3l-4 4`})]}):e===`running`?(0,N.jsx)(`span`,{className:W.pulse,"aria-hidden":`true`}):e===`danger`?(0,N.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,children:[(0,N.jsx)(`circle`,{cx:`8`,cy:`8`,r:`6`}),(0,N.jsx)(`path`,{d:`M5.8 5.8l4.4 4.4M10.2 5.8l-4.4 4.4`})]}):e===`success`?(0,N.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,N.jsx)(`circle`,{cx:`8`,cy:`8`,r:`6`}),(0,N.jsx)(`path`,{d:`M5.2 8.2l2 2 3.6-4`})]}):(0,N.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,strokeDasharray:t===`draft`?`2 2`:void 0,children:[(0,N.jsx)(`circle`,{cx:`4`,cy:`3.5`,r:`1.8`}),(0,N.jsx)(`circle`,{cx:`4`,cy:`12.5`,r:`1.8`}),(0,N.jsx)(`circle`,{cx:`12`,cy:`12.5`,r:`1.8`}),(0,N.jsx)(`path`,{d:`M4 5.3v5.4M12 10.7V6.5c0-1.4-.8-2.2-2.2-2.2H7.5`})]})}var q=1e4,J=2500;function ee(e,t={}){let n=t.fetchStatus??m,r=t.enabled??!0,i=s(),a=e.join(`\0`),o=(0,j.useMemo)(()=>a===``?[]:a.split(`\0`),[a]),[l,u]=(0,j.useState)({}),[d,f]=(0,j.useState)(new Set),[p,h]=(0,j.useState)(null),g=(0,j.useRef)(new Set),_=(0,j.useRef)(null),v=(0,j.useRef)(null),y=(0,j.useRef)(!0),b=(0,j.useCallback)(()=>{_.current?.abort();let e=new AbortController;_.current=e;let t=o.filter(e=>!g.current.has(e));if(t.length===0){f(new Set(o));return}Promise.all(t.map(async t=>{try{return{root:t,status:await n(t,e.signal),err:null}}catch(e){return{root:t,status:null,err:e}}})).then(t=>{if(!y.current||e.signal.aborted)return;let n=null,r=!1,i={},a=[];for(let e of t)e.status?(i[e.root]=e.status,e.status.prLookup===`pending`&&(r=!0)):O(e.err)?(g.current.add(e.root),a.push(e.root)):(console.warn(`[verse] git status failed`,e.err),n=`Could not read git status.`);u(e=>{let t={...e,...i};for(let e of a)delete t[e];return t}),f(new Set(o)),h(n),r&&v.current===null&&(v.current=setTimeout(()=>{v.current=null,y.current&&x.current()},J))})},[o,n]),x=(0,j.useRef)(b);x.current=b,(0,j.useEffect)(()=>{g.current=new Set,u({}),f(new Set),h(null)},[a]);let S=(0,j.useRef)(i);S.current=i,(0,j.useEffect)(()=>{r&&S.current&&b()},[b,r]),c(b,q,{enabled:r}),(0,j.useEffect)(()=>(y.current=!0,()=>{y.current=!1,_.current?.abort(),v.current!==null&&clearTimeout(v.current)}),[]);let C=(0,j.useCallback)((e,t)=>{u(n=>({...n,[e]:{...t,root:e}}))},[]);return{statuses:(0,j.useMemo)(()=>o.map(e=>l[e]).filter(e=>e!==void 0),[o,l]),loading:o.some(e=>!d.has(e)),error:p,refresh:b,replace:C}}var te=6e3;function Y({roots:e,onOpenDiff:t,statusOptions:n}){let{statuses:r,loading:s,replace:c}=ee(e,n),{compact:l}=a(),m=A(),[h,v]=(0,j.useState)(!1),[y,b]=(0,j.useState)(null),[S,C]=(0,j.useState)(null),[T,O]=(0,j.useState)(null),[k,P]=(0,j.useState)(null),[F,I]=(0,j.useState)(null),L=(0,j.useId)();(0,j.useEffect)(()=>{if(k?.tone!==`ok`)return;let e=setTimeout(()=>P(null),te);return()=>clearTimeout(e)},[k]);let R=w(r).filter(E),z=e=>r.find(t=>t.root===e)??null,B=(0,j.useCallback)(async(e,t,n,r,i)=>{C(e),O(null),P(null);try{let i=await m.run(t,n);if(i===null)return;c(e,i.status),b(null),P({text:r(i.status),tone:`ok`})}catch(e){console.warn(`[verse] git action failed`,e);let t=p(e);i?O(t):P({text:t,tone:`error`})}finally{C(null)}},[m,c]),W=e=>B(e.root,`Push ${e.branch??`this branch`} to ${e.upstream??`origin`}.`,()=>D(e.root),e=>`Pushed ${e.branch??`the branch`} to ${e.upstream??`origin`}.`,!1),G=e=>t(e),K=e=>{let t=x(e);t&&(O(null),b({kind:`merge`,root:e.root,pin:t}))},q=e=>{switch(e.suggested){case`commit`:O(null),b({kind:`commit`,root:e.root});break;case`push`:W(e);break;case`create-pr`:O(null),b({kind:`pr`,root:e.root,draft:!1});break;case`merge`:K(e);break;case`view-pr`:e.pr&&window.open(e.pr.url,`_blank`,`noopener,noreferrer`)}},J=(e,t)=>{switch(t){case`draft-pr`:O(null),b({kind:`pr`,root:e.root,draft:!0});break;case`commit`:O(null),b({kind:`commit`,root:e.root});break;case`push`:W(e);break;case`open-github`:e.pr&&window.open(e.pr.url,`_blank`,`noopener,noreferrer`);break;case`copy-branch`:e.branch&&navigator.clipboard?.writeText(e.branch).then(()=>P({text:`Copied ${e.branch}.`,tone:`ok`}),()=>P({text:`Could not copy the branch name.`,tone:`error`}));break;case`review`:G({root:e.root,scope:e.dirty>0&&e.diffstat.files===0?`working`:`branch`})}},Y=e=>{if(O(null),e===`create-pr`){let e=R.find(e=>e.suggested===`create-pr`)??R.find(e=>g(e).find(e=>e.id===`draft-pr`)?.disabledReason===null);if(e){P(null),b({kind:`pr`,root:e.root,draft:!1});return}let t=R.length>0?g(R[0]).find(e=>e.id===`draft-pr`)?.disabledReason:null;P({text:t?`Can't open a pull request: ${t}.`:`No branch in this chat has changes to open a pull request from.`,tone:`error`});return}let t=R.find(e=>e.suggested===`merge`&&e.pr!==null);if(t){P(null),K(t);return}let n=R.find(e=>e.pr!==null&&(e.pr.state===`open`||e.pr.state===`draft`));P({text:n?.pr?`#${n.pr.number} isn't ready to merge yet — its checks haven't passed or it isn't mergeable.`:`No pull request in this chat is ready to merge.`,tone:`error`})},X=e=>{s?I(e):Y(e)};o(`git.create-pr`,()=>X(`create-pr`)),o(`git.merge-pr`,()=>X(`merge`));let Z=(0,j.useRef)(Y);if(Z.current=Y,(0,j.useEffect)(()=>{F===null||s||(I(null),Z.current(F))},[F,s]),R.length===0&&!k)return null;let Q=h?R:R.slice(0,1),re=R.length-Q.length,$=y?z(y.root):null;return(0,N.jsxs)(`section`,{className:M.bar,"aria-label":`Branches`,"data-compact":l?`true`:`false`,children:[(0,N.jsx)(`ul`,{id:L,className:M.rows,children:Q.map(e=>(0,N.jsx)(ne,{status:e,compact:l,busy:S===e.root,onPrimary:()=>q(e),onMenu:t=>J(e,t),onOpenDiff:()=>G({root:e.root,scope:`branch`})},e.gitRoot??e.root))}),R.length>1?(0,N.jsx)(`button`,{type:`button`,className:M.more,"aria-expanded":h,"aria-controls":L,onClick:()=>v(e=>!e),children:h?`Show fewer`:`Show ${re} more`}):null,(0,N.jsx)(`p`,{className:M.notice,role:k?.tone===`error`?`alert`:`status`,"aria-live":k?.tone===`error`?`assertive`:`polite`,"data-tone":k?.tone??`ok`,children:k?.text??``}),$&&y?.kind===`commit`?(0,N.jsx)(V,{open:!0,status:$,busy:S===y.root,error:T,onClose:()=>b(null),onSubmit:e=>void B(y.root,`Commit ${$.dirty} changed files on ${$.branch??`this branch`}.`,()=>f({root:y.root,message:e}),e=>`Committed on ${e.branch??`the branch`}.`,!0)}):null,$&&y?.kind===`pr`?(0,N.jsx)(H,{open:!0,draft:y.draft,status:$,busy:S===y.root,error:T,onClose:()=>b(null),onSubmit:e=>void B(y.root,`Push ${$.branch??`this branch`} and open a pull request into ${e.base}.`,async()=>{let t=await u({root:y.root,title:e.title,base:e.base,...e.body.trim()?{body:e.body}:{},...e.draft?{draft:!0}:{}});return{status:{...t.status,pr:t.pr??t.status.pr}}},e=>e.pr?`Opened #${e.pr.number}.`:`Opened the pull request.`,!0)}):null,y?.kind===`merge`?(0,N.jsx)(U,{open:!0,pin:y.pin,live:$,busy:S===y.root,error:T,onClose:()=>b(null),onSubmit:()=>{let{pin:e}=y;e.headSha!==null&&_(e,z(y.root))===null&&B(y.root,`Squash-merge #${e.number} (head ${e.headSha.slice(0,7)}) into ${e.baseRef}.`,async()=>{let t=await d({root:y.root,number:e.number,headSha:e.headSha});return{status:{...t.status,pr:t.pr??t.status.pr}}},()=>`Merged #${e.number} into ${e.baseRef}.`,!0)}}):null,(0,N.jsx)(i,{...m.dialog,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`})]})}function ne({status:e,compact:t,busy:n,onPrimary:r,onMenu:i,onOpenDiff:a}){let o=v(e),s=g(e),c=e.diffstat.files>0,l=e.pr===null&&e.prLookup===`pending`&&e.branch!==null&&e.suggested===`none`;return(0,N.jsxs)(`li`,{className:M.row,"aria-label":`${e.name}, ${e.branch?`branch ${e.branch}`:`detached HEAD`}`,children:[(0,N.jsxs)(`span`,{className:M.ident,children:[(0,N.jsx)(X,{}),(0,N.jsx)(`span`,{className:M.repo,title:e.gitRoot??e.root,children:e.name}),(0,N.jsx)(`span`,{className:M.branch,title:e.branch??void 0,children:e.branch??`detached HEAD`}),e.behind>0?(0,N.jsxs)(`span`,{className:M.drift,children:[e.behind,` behind`]}):null]}),c?(0,N.jsxs)(`button`,{type:`button`,className:M.stat,onClick:a,"aria-label":`${S(e.diffstat.files,e.diffstat.additions,e.diffstat.deletions)}. Open the branch diff.`,title:`Open the branch diff`,children:[(0,N.jsxs)(`span`,{className:M.add,children:[`+`,h(e.diffstat.additions)]}),(0,N.jsxs)(`span`,{className:M.del,children:[`−`,h(e.diffstat.deletions)]})]}):null,e.pr?(0,N.jsx)(G,{pr:e.pr,counts:e.prCheckCounts??null,showTitle:!t}):null,l?(0,N.jsx)(`span`,{className:M.checking,children:`Checking GitHub…`}):null,(e.conflicts??0)>0?(0,N.jsxs)(`span`,{className:M.conflicts,children:[e.conflicts,` conflicted`]}):null,(0,N.jsx)(`span`,{className:M.spacer}),(0,N.jsx)(P,{primary:o?{label:o.label,disclosure:o.disclosure,onClick:r,busy:n,tone:o.action===`view-pr`?`subtle`:`primary`}:null,items:s,onSelect:i,menuLabel:`More git actions for ${e.name}`,disabled:n})]})}function X(){return(0,N.jsxs)(`svg`,{className:M.glyph,width:`14`,height:`14`,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,"aria-hidden":`true`,children:[(0,N.jsx)(`circle`,{cx:`4.5`,cy:`3.5`,r:`1.7`}),(0,N.jsx)(`circle`,{cx:`4.5`,cy:`12.5`,r:`1.7`}),(0,N.jsx)(`circle`,{cx:`11.5`,cy:`5`,r:`1.7`}),(0,N.jsx)(`path`,{d:`M4.5 5.2v5.6M11.5 6.7c0 3-3.5 2.7-6.3 4.6`})]})}export{Y as BranchBar};
2
- //# sourceMappingURL=BranchBar-nfSb59Kv.js.map
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-Dk8R-3a7.js";import{h as r,m as i}from"./global-DG1fmn4y.js";import{x as a}from"./verse-queries-2PxoBISm.js";import{i as o,r as s}from"./section-visibility-u7q-Q9AA.js";import{g as c}from"./format-lW58rL2y.js";import{r as l}from"./Tag-Cs4tudBN.js";import{n as u}from"./budget-queries-Cp6vO7FH.js";import{n as d,t as f}from"./useSeatsRefresh-BN8bso-n.js";import{a as p,l as m,n as h,o as g,r as _,t as v}from"./capacity-strip-model-9-Yb211u.js";var y=n(e(),1),b={section:`_section_1vcn6_8`,scroll:`_scroll_1vcn6_16`,page:`_page_1vcn6_34`,header:`_header_1vcn6_43`,headerText:`_headerText_1vcn6_50`,title:`_title_1vcn6_56`,lede:`_lede_1vcn6_65`,headerMeta:`_headerMeta_1vcn6_71`,banner:`_banner_1vcn6_80`,accountsNote:`_accountsNote_1vcn6_96`,group:`_group_1vcn6_108`,groupHead:`_groupHead_1vcn6_114`,groupTitle:`_groupTitle_1vcn6_121`,caveat:`_caveat_1vcn6_138`,inlineCode:`_inlineCode_1vcn6_145`,card:`_card_1vcn6_154`,rows:`_rows_1vcn6_162`,row:`_row_1vcn6_162`,rowMain:`_rowMain_1vcn6_180`,rowHead:`_rowHead_1vcn6_187`,rowName:`_rowName_1vcn6_194`,rowVersion:`_rowVersion_1vcn6_200`,rowDesc:`_rowDesc_1vcn6_205`,rowDetail:`_rowDetail_1vcn6_206`,rowAside:`_rowAside_1vcn6_217`,health:`_health_1vcn6_228`,healthDot:`_healthDot_1vcn6_237`,loadingLine:`_loadingLine_1vcn6_263`,tile:`_tile_1vcn6_273`,pillWrap:`_pillWrap_1vcn6_314`,pill:`_pill_1vcn6_314`,pillText:`_pillText_1vcn6_348`,pillIcon:`_pillIcon_1vcn6_356`,visuallyHidden:`_visuallyHidden_1vcn6_367`,split:`_split_1vcn6_381`,disabledNote:`_disabledNote_1vcn6_394`,dialogBody:`_dialogBody_1vcn6_404`,commandBlock:`_commandBlock_1vcn6_415`,commandLabel:`_commandLabel_1vcn6_420`,dialogActions:`_dialogActions_1vcn6_428`,fieldset:`_fieldset_1vcn6_435`,legend:`_legend_1vcn6_443`,radio:`_radio_1vcn6_450`,error:`_error_1vcn6_460`,textarea:`_textarea_1vcn6_466`,fieldLabel:`_fieldLabel_1vcn6_483`,hint:`_hint_1vcn6_491`,warnings:`_warnings_1vcn6_495`,servers:`_servers_1vcn6_505`,reasonCode:`_reasonCode_1vcn6_511`,scopeLine:`_scopeLine_1vcn6_517`},x=t();function S({monogram:e,engine:t,size:n=`md`}){let r=t===null?void 0:{"--tile-hue":l(t)};return(0,x.jsx)(`span`,{className:b.tile,"data-size":n,"data-engine":t??void 0,style:r,"aria-hidden":`true`,children:e.slice(0,2)})}var C={strip:`_strip_o9cqi_7`,visuallyHidden:`_visuallyHidden_o9cqi_15`,headline:`_headline_o9cqi_27`,empty:`_empty_o9cqi_35`,rows:`_rows_o9cqi_42`,row:`_row_o9cqi_42`,main:`_main_o9cqi_67`,head:`_head_o9cqi_27`,nameWrap:`_nameWrap_o9cqi_82`,nameButton:`_nameButton_o9cqi_83`,name:`_name_o9cqi_82`,plan:`_plan_o9cqi_121`,word:`_word_o9cqi_131`,dot:`_dot_o9cqi_140`,status:`_status_o9cqi_163`,statusLabel:`_statusLabel_o9cqi_176`,statusDetail:`_statusDetail_o9cqi_195`,stamp:`_stamp_o9cqi_199`,usableAgain:`_usableAgain_o9cqi_206`,summary:`_summary_o9cqi_211`,meta:`_meta_o9cqi_212`,autonomy:`_autonomy_o9cqi_222`,bars:`_bars_o9cqi_232`,bar:`_bar_o9cqi_232`,barLabel:`_barLabel_o9cqi_251`,track:`_track_o9cqi_262`,trackUnknown:`_trackUnknown_o9cqi_270`,used:`_used_o9cqi_276`,reserve:`_reserve_o9cqi_287`,ceiling:`_ceiling_o9cqi_297`,value:`_value_o9cqi_306`,reset:`_reset_o9cqi_319`,actions:`_actions_o9cqi_326`},w=90,T=3e4;function E(e){return Math.max(0,Math.min(100,Math.round(e)))}function D({row:e,w:t,reservePercent:n,compact:r}){let i=m(e,t,t.binding?n:null),a=t.binding&&n!==null&&n>0?100-E(n):null,o,s;if(t.limitReached)o=(0,x.jsx)(`span`,{className:C.track,role:`img`,"aria-label":i,children:(0,x.jsx)(`span`,{className:C.used,"data-level":`limit`,style:{width:`100%`}})}),s=(0,x.jsx)(`span`,{className:C.value,"data-level":`limit`,children:`limit reached`});else if(t.usedPercent===null)o=(0,x.jsx)(`span`,{className:C.trackUnknown,role:`img`,"aria-label":i}),s=(0,x.jsx)(`span`,{className:C.value,"data-level":`unknown`,children:`no reading`});else{let e=E(t.usedPercent),n=e>=w?`tight`:`ok`;o=(0,x.jsxs)(`span`,{className:C.track,role:`img`,"aria-label":i,children:[a===null?null:(0,x.jsx)(`span`,{className:C.reserve,style:{left:`${a}%`,width:`${100-a}%`}}),(0,x.jsx)(`span`,{className:C.used,"data-level":n,style:{width:`${e}%`}}),a===null?null:(0,x.jsx)(`span`,{className:C.ceiling,style:{left:`${a}%`}})]}),s=(0,x.jsx)(`span`,{className:C.value,"data-level":n,children:c(t.usedPercent)})}return(0,x.jsxs)(`div`,{className:C.bar,"data-binding":t.binding||void 0,"data-compact":r||void 0,children:[(0,x.jsx)(`span`,{className:C.barLabel,title:t.label,children:t.label.replace(/ window$/,``)}),o,s,!r&&t.resetText!==null?(0,x.jsx)(`span`,{className:C.reset,title:t.resetText,children:t.resetText}):null]})}function O({row:e,onSelect:t,selected:n}){let r=(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(`span`,{className:C.name,children:e.label}),e.plan===null?null:(0,x.jsx)(`span`,{className:C.plan,children:e.plan})]});return t?(0,x.jsx)(`button`,{type:`button`,className:C.nameButton,"aria-pressed":n,onClick:()=>t(e.seatId),children:r}):(0,x.jsx)(`span`,{className:C.nameWrap,children:r})}function k({status:e}){return(0,x.jsxs)(`span`,{className:C.status,"data-tone":e.tone,"data-status":e.kind,children:[(0,x.jsx)(`span`,{className:C.dot,"aria-hidden":`true`}),(0,x.jsx)(`span`,{className:C.statusLabel,children:e.label}),e.detail===null?null:(0,x.jsx)(`span`,{className:C.statusDetail,children:`· ${e.detail}`})]})}function A({status:e}){return e.usableAgain===null&&e.checked===null?null:(0,x.jsxs)(`p`,{className:C.stamp,children:[e.usableAgain===null?null:(0,x.jsx)(`span`,{className:C.usableAgain,children:e.usableAgain}),e.usableAgain!==null&&e.checked!==null?` · `:null,e.checked===null?null:(0,x.jsx)(`span`,{title:e.checkedTitle??void 0,children:e.checked})]})}function j({row:e,compact:t,renderActions:n,onSelectSeat:r,selected:i,status:a}){let o=p(e.cls),s=e.windows.find(e=>e.binding)??null,c=t?s?[s]:[]:e.windows,l=n?n(e):null,u=e.reserve;return(0,x.jsxs)(`li`,{className:C.row,"data-capacity":e.cls,"data-compact":t||void 0,"data-status":a?.kind,children:[(0,x.jsx)(S,{monogram:e.monogram,engine:e.engine,size:`sm`}),(0,x.jsxs)(`div`,{className:C.main,children:[(0,x.jsxs)(`div`,{className:C.head,children:[(0,x.jsx)(O,{row:e,onSelect:r,selected:i}),a===null?(0,x.jsxs)(`span`,{className:C.word,"data-tone":o,children:[(0,x.jsx)(`span`,{className:C.dot,"aria-hidden":`true`}),e.word]}):(0,x.jsx)(k,{status:a}),e.connection!==null&&e.connection.connection!==`connected`&&e.connection.connection!==`unknown`&&!(a?.coversConnection??!1)&&a?.kind!==`signed-out`?(0,x.jsxs)(`span`,{className:C.word,"data-tone":e.connection.tone,children:[(0,x.jsx)(`span`,{className:C.dot,"aria-hidden":`true`}),e.connection.word]}):null]}),!t||c.length===0?(0,x.jsx)(`p`,{className:C.summary,children:e.summary}):null,a!==null&&!t?(0,x.jsx)(A,{status:a}):null,c.length>0?(0,x.jsx)(`div`,{className:C.bars,children:c.map(n=>(0,x.jsx)(D,{row:e,w:n,reservePercent:u?.percent??null,compact:t},n.id))}):null,!t&&(u!==null||e.credits!==null)?(0,x.jsxs)(`p`,{className:C.meta,children:[u===null?null:(0,x.jsxs)(`span`,{title:u.why,children:[u.label,u.autonomy===`off`?null:(0,x.jsxs)(x.Fragment,{children:[` · Autonomy: `,(0,x.jsx)(`span`,{className:C.autonomy,"data-status":u.autonomy,children:u.autonomyWord})]})]}),u!==null&&e.credits!==null?` · `:null,e.credits===null?null:(0,x.jsx)(`span`,{children:e.credits})]}):null]}),l?(0,x.jsx)(`div`,{className:C.actions,children:l}):null]})}function M({seats:e,health:t,budget:n,local:r,seatIds:i,density:a=`full`,headline:o,title:c=`Seat capacity`,labelledBy:l,renderActions:u,onSelectSeat:d,selectedSeatId:f=null,emptyText:p=`No seats yet. Connect an account or start Ollama — an empty roster, not seats at zero.`,accounts:m}){let b=(0,y.useId)(),[S,w]=(0,y.useState)(()=>Date.now());s(()=>w(Date.now()),T,{enabled:m!==void 0&&m.now===void 0});let E=m?.now??S,D=m?.healthRead??!1,O=m!==void 0,k=O?E:void 0,A=(0,y.useMemo)(()=>h(e,{health:t??null,budget:n??null,...r?{local:r}:{},...i?{seatIds:i}:{},...k===void 0?{}:{now:k}}),[e,t,n,r,i,k]),M=(0,y.useMemo)(()=>O?g(A,{healthRead:D,now:E}):A,[A,O,D,E]),N=a===`compact`,P=o??!N;return(0,x.jsxs)(l?`div`:`section`,{className:C.strip,"aria-labelledby":l?void 0:b,"data-density":a,children:[l?null:(0,x.jsx)(`h3`,{id:b,className:C.visuallyHidden,children:c}),P&&M.length>0?(0,x.jsx)(`p`,{className:C.headline,children:_(M)}):null,M.length===0?(0,x.jsx)(`p`,{className:C.empty,children:p}):(0,x.jsx)(`ul`,{className:C.rows,"aria-label":l?void 0:c,"aria-labelledby":l,children:M.map(e=>(0,x.jsx)(j,{row:e,compact:N,renderActions:u,onSelectSeat:d,selected:f===e.seatId,status:m?v(e,{healthRead:D,now:E,checking:m.checkingSeatId===e.seatId}):null},e.seatId))})]})}var N=6e4;function P(e={}){let t=o(),n=e.withBudget??!0,c=e.withHealth??!0,l=i(a);f(t);let p=d(t&&c),m=i(u),h=r(u);s(h,N,{enabled:n});let g=l.data;return{seats:g?.seats??[],health:c?p.data?.seats??null:null,budget:n?m.data??null:null,loading:g===void 0&&(l.status===`loading`||l.status===`idle`)}}function F({seats:e,...t}){let n=P();return e===void 0&&n.loading?(0,x.jsx)(`p`,{className:C.empty,"aria-busy":`true`,children:`Reading seats…`}):(0,x.jsx)(M,{...t,seats:e??n.seats,health:n.health,budget:n.budget})}export{b as a,S as i,F as n,P as r,M as t};
2
- //# sourceMappingURL=CapacityStrip-DqqYnLek.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CapacityStrip-DqqYnLek.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/apps/Apps.module.css","../../../../../../src/web-ui/routes/verse/apps/MonogramTile.tsx","../../../../../../src/web-ui/routes/verse/usage/CapacityStrip.module.css","../../../../../../src/web-ui/routes/verse/usage/CapacityStrip.tsx"],"sourcesContent":["/*\n * Apps & Accounts (SPEC-310C §4) — grouped rows in the Ollama style, max\n * 880px. Tokens only (DESIGN.md §13; style-scan-310 enforces it): no raw\n * colour, no px font size. The row adapts to its container: at the compact\n * width (480, viewport.ts) the right-hand pill wraps under the description.\n */\n\n.section {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: var(--space-6) var(--space-4) var(--space-12);\n /* Desktop shell (desktop/README.md \"Desktop shell contract\"): this page has\n no 48px strip, so its title sits inside the OS title-bar band. Once the\n window is narrow enough that the 880px column stops centring (minWidth\n is 900), the column's left edge lands at rail + 16px — under the macOS\n traffic lights, which cover the top-left 92px of the WINDOW. Owe the same\n overlap every header strip owes (inset − rail, 36px on a 56px rail);\n the vars are absent in a browser and the expanded rail sits under the\n lights itself, so both floor to --space-4 and nothing moves there. The\n whole column shifts, not just the header, so the title stays aligned\n with the rows under it. */\n padding-left: max(var(--space-4), calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px)));\n}\n\n.page {\n container-type: inline-size;\n max-width: 880px;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: var(--space-8);\n}\n\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n justify-content: space-between;\n gap: var(--space-3) var(--space-4);\n}\n.headerText {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n letter-spacing: var(--tracking-display);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.lede {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n.headerMeta {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.banner {\n margin: 0;\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n.banner[data-tone='danger'] {\n border-color: color-mix(in srgb, var(--status-danger-solid) 40%, var(--border-subtle));\n color: var(--status-danger-fg);\n}\n\n/* The Accounts group's own \"Checked … again\" line, under the strip. */\n.accountsNote {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n.accountsNote[data-tone='danger'] {\n color: var(--status-danger-fg);\n}\n\n/* ── Groups ─────────────────────────────────────────────────────────── */\n\n.group {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n scroll-margin-top: var(--space-6);\n}\n.groupHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n min-height: var(--control-h-sm);\n}\n.groupTitle {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n}\n.groupTitle:focus {\n outline: none;\n}\n.groupTitle:focus-visible {\n box-shadow: var(--shadow-focus-ring);\n border-radius: var(--radius-xs);\n}\n.caveat {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-secondary);\n}\n.caveat code,\n.inlineCode {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n background: var(--bg-code);\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n overflow-wrap: anywhere;\n}\n\n.card {\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n padding: 0 var(--card-pad);\n box-shadow: inset 0 1px 0 var(--hairline-lift);\n}\n\n.rows {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.row {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: start;\n gap: var(--space-3);\n padding: var(--space-3) 0;\n border-top: 1px solid var(--border-subtle);\n}\n.row:first-child {\n border-top: 0;\n}\n\n.rowMain {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n padding-top: var(--space-1);\n}\n.rowHead {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--space-1) var(--space-3);\n min-width: 0;\n}\n.rowName {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.rowVersion {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n.rowDesc,\n.rowDetail {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-secondary);\n overflow-wrap: anywhere;\n}\n.rowDetail {\n color: var(--text-tertiary);\n}\n\n.rowAside {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--space-2);\n padding-top: var(--space-1);\n max-width: 26rem;\n}\n\n/* A health state is a WORD; the dot reinforces it (DESIGN §13.2). */\n.health {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n white-space: nowrap;\n}\n.healthDot {\n width: 7px;\n height: 7px;\n border-radius: var(--radius-full);\n background: var(--status-neutral-solid);\n flex: none;\n}\n.health[data-tone='success'] .healthDot { background: var(--status-success-solid); }\n.health[data-tone='warning'] { color: var(--status-warning-fg); }\n.health[data-tone='warning'] .healthDot { background: var(--status-warning-solid); }\n.health[data-tone='danger'] { color: var(--status-danger-fg); }\n.health[data-tone='danger'] .healthDot { background: var(--status-danger-solid); }\n.health[data-tone='off'] { color: var(--text-tertiary); }\n.health[data-tone='off'] .healthDot {\n background: transparent;\n border: 1px solid var(--border-strong);\n}\n.health[data-tone='neutral'] {\n font-style: italic;\n color: var(--status-unknown-fg);\n}\n.health[data-tone='neutral'] .healthDot {\n background: transparent;\n border: 1px dashed var(--status-unknown-solid);\n}\n\n.loadingLine {\n margin: 0;\n padding: var(--space-3) 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n\n/* ── Monogram tile (32px rows, 24px capacity rows) ───────────────────── */\n\n.tile {\n --tile-hue: var(--text-tertiary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 32px;\n height: 32px;\n border-radius: var(--radius-md);\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-subtle);\n position: relative;\n overflow: hidden;\n}\n.tile[data-engine] {\n background: color-mix(in srgb, var(--tile-hue) 12%, var(--bg-surface));\n border-color: color-mix(in srgb, var(--tile-hue) 28%, var(--border-subtle));\n}\n/* The 2px identity tick. */\n.tile[data-engine]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--tile-hue);\n}\n.tile[data-size='sm'] {\n width: 24px;\n height: 24px;\n border-radius: var(--radius-sm);\n font-size: var(--text-xs-size);\n}\n\n/* ── Copy pill ───────────────────────────────────────────────────────── */\n\n.pillWrap {\n display: inline-flex;\n min-width: 0;\n max-width: 100%;\n}\n/*\n * A long command WRAPS rather than ellipsizing: the operator reads what they\n * are about to paste, and a command cut mid-word (\"node ~/.ashlr/nat…\") is\n * exactly the part they need. One line keeps the pill shape (the radius is\n * half the control height); two lines become a soft capsule.\n */\n.pill {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n max-width: 100%;\n min-height: var(--control-h-sm);\n padding: 2px var(--space-2) 2px var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: calc(var(--control-h-sm) / 2);\n text-align: left;\n background: var(--bg-code);\n color: var(--text-primary);\n cursor: pointer;\n transition: border-color var(--duration-fast) var(--ease-standard);\n}\n.pill:hover {\n border-color: var(--border-strong);\n}\n.pill:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n.pillText {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n white-space: normal;\n overflow-wrap: anywhere;\n min-width: 0;\n}\n.pillIcon {\n display: inline-flex;\n color: var(--text-tertiary);\n}\n.pill[data-state='copied'] .pillIcon {\n color: var(--status-success-fg);\n}\n.pill[data-state='failed'] {\n border-color: var(--status-danger-solid);\n}\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* ── Launch split button ─────────────────────────────────────────────── */\n\n.split {\n display: inline-flex;\n align-items: stretch;\n}\n.split > :first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.split > :last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n margin-left: -1px;\n}\n.disabledNote {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n max-width: 18rem;\n text-align: right;\n}\n\n/* ── Dialog bodies ───────────────────────────────────────────────────── */\n\n.dialogBody {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n.dialogBody p {\n margin: 0;\n}\n.commandBlock {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n}\n.commandLabel {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n color: var(--text-tertiary);\n}\n.dialogActions {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--space-2);\n margin-top: var(--space-2);\n}\n.fieldset {\n border: 0;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n.legend {\n padding: 0;\n margin-bottom: var(--space-1);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.radio {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n}\n.radio input {\n accent-color: var(--accent-500);\n}\n.error {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--status-danger-fg);\n}\n.textarea {\n width: 100%;\n min-height: 5rem;\n resize: vertical;\n padding: var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n}\n.textarea:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n.fieldLabel {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n}\n.hint {\n font-weight: var(--font-weight-regular);\n color: var(--text-tertiary);\n}\n.warnings {\n margin: 0;\n padding-left: var(--space-4);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--status-warning-fg);\n}\n\n/* ── MCP ─────────────────────────────────────────────────────────────── */\n\n.servers {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n margin-top: var(--space-2);\n}\n.reasonCode {\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n color: var(--text-tertiary);\n}\n\n.scopeLine {\n margin: 0;\n padding: 0 0 var(--space-3);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-tertiary);\n}\n\n/* ── Compact container (a 375 window, or a narrow pane) ──────────────── */\n@container (max-width: 480px) {\n .row {\n grid-template-columns: auto minmax(0, 1fr);\n }\n .rowAside {\n grid-column: 2;\n justify-content: flex-start;\n max-width: none;\n }\n .disabledNote {\n text-align: left;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .pill {\n transition: none;\n }\n}\n","/**\n * routes/verse/apps/MonogramTile.tsx — the square letter tile every seat and\n * app row leads with (SPEC-310C §6: engines are a monogram and a 2px tick,\n * never a vendor logo — no brand impersonation, and one visual grammar for\n * the rail, the sidebar, Apps and the capacity strip).\n *\n * Engine-backed tiles take a 12% tint of the engine hue with an ink letter,\n * so the letter's contrast never depends on the hue; neutral tiles (Aider,\n * Goose, …) sit on the surface with a hairline. Decorative: the row's name\n * carries the meaning.\n */\nimport type { CSSProperties } from 'react';\nimport type { VerseEngine } from '../../../data/api-types.js';\nimport { engineColor } from '../../../components/primitives/Tag.js';\nimport styles from './Apps.module.css';\n\nexport function MonogramTile({\n monogram,\n engine,\n size = 'md',\n}: {\n monogram: string;\n engine: VerseEngine | null;\n /** md = 32px (Apps rows), sm = 24px (capacity rows). */\n size?: 'sm' | 'md';\n}) {\n const style = engine === null ? undefined : ({ '--tile-hue': engineColor(engine) } as CSSProperties);\n return (\n <span\n className={styles.tile}\n data-size={size}\n data-engine={engine ?? undefined}\n style={style}\n aria-hidden=\"true\"\n >\n {monogram.slice(0, 2)}\n </span>\n );\n}\n","/*\n * The shared capacity strip. Tokens only (DESIGN.md §13): no raw colour, no\n * px font size. It adapts to ITS container, not the window — the same strip\n * sits in an 880px Apps column and a 300px Resources panel — so the narrow\n * layout is a container query at the compact breakpoint (480, viewport.ts).\n */\n.strip {\n container-type: inline-size;\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n min-width: 0;\n}\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n.headline {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n}\n\n.empty {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n\n.rows {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n.row {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: start;\n gap: var(--space-3);\n padding: var(--space-3) 0;\n border-top: 1px solid var(--border-subtle);\n}\n.row:first-child {\n border-top: 0;\n}\n.row[data-compact] {\n padding: var(--space-2) 0;\n gap: var(--space-2);\n align-items: center;\n}\n\n.main {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.head {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--space-1) var(--space-3);\n min-width: 0;\n}\n\n.nameWrap,\n.nameButton {\n display: inline-flex;\n align-items: baseline;\n gap: var(--space-2);\n min-width: 0;\n}\n.nameButton {\n padding: 0;\n border: 0;\n background: none;\n font: inherit;\n color: inherit;\n cursor: pointer;\n border-radius: var(--radius-xs);\n}\n.nameButton:hover .name {\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n.nameButton:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n.nameButton[aria-pressed='true'] .name {\n color: var(--text-link);\n}\n\n/* The seat name is often a control (Usage's toggle): it wraps, never cut mid-word. */\n.name {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n min-width: 0;\n overflow-wrap: anywhere;\n text-align: left;\n}\n\n.plan {\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n font-family: var(--font-display);\n color: var(--text-tertiary);\n}\n\n/* A state is a WORD; the dot only reinforces it. */\n.word {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n white-space: nowrap;\n}\n.dot {\n width: 7px;\n height: 7px;\n border-radius: var(--radius-full);\n background: var(--status-neutral-solid);\n flex: none;\n}\n.word[data-tone='success'] .dot { background: var(--status-success-solid); }\n.word[data-tone='warning'] { color: var(--status-warning-fg); }\n.word[data-tone='warning'] .dot { background: var(--status-warning-solid); }\n.word[data-tone='danger'] { color: var(--status-danger-fg); }\n.word[data-tone='danger'] .dot { background: var(--status-danger-solid); }\n.word[data-tone='neutral'] { font-style: italic; }\n.word[data-tone='neutral'] .dot {\n background: transparent;\n border: 1px solid var(--status-unknown-solid);\n}\n\n/*\n * Accounts mode: the row's status reads as a short sentence — a label in the\n * tone's colour, then the detail in secondary text. The detail may wrap (a\n * provider's reset prose can be long); the label never truncates.\n */\n.status {\n display: inline-flex;\n align-items: baseline;\n flex-wrap: wrap;\n gap: 0 var(--space-1);\n min-width: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n.status .dot {\n align-self: center;\n}\n.statusLabel {\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n white-space: nowrap;\n}\n.status[data-tone='success'] .dot { background: var(--status-success-solid); }\n.status[data-tone='success'] .statusLabel { color: var(--status-success-fg); }\n.status[data-tone='warning'] .dot { background: var(--status-warning-solid); }\n.status[data-tone='warning'] .statusLabel { color: var(--status-warning-fg); }\n.status[data-tone='danger'] .dot { background: var(--status-danger-solid); }\n.status[data-tone='danger'] .statusLabel { color: var(--status-danger-fg); }\n.status[data-tone='neutral'] .dot {\n background: transparent;\n border: 1px solid var(--status-unknown-solid);\n}\n.status[data-tone='neutral'] .statusLabel {\n color: var(--text-secondary);\n font-style: italic;\n}\n.statusDetail {\n overflow-wrap: anywhere;\n}\n\n.stamp {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n font-variant-numeric: tabular-nums;\n}\n.usableAgain {\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n}\n\n.summary,\n.meta {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-secondary);\n overflow-wrap: anywhere;\n}\n.meta {\n color: var(--text-tertiary);\n}\n.autonomy {\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n}\n.autonomy[data-status='eligible'] { color: var(--status-success-fg); }\n.autonomy[data-status='unknown'] {\n font-style: italic;\n color: var(--status-unknown-fg);\n}\n\n.bars {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n margin-top: var(--space-1);\n}\n\n.bar {\n display: grid;\n grid-template-columns: minmax(4.5rem, 7.5rem) minmax(5rem, 1fr) minmax(2.75rem, auto) minmax(0, 12rem);\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.bar[data-compact] {\n grid-template-columns: minmax(3.5rem, 5.5rem) minmax(3rem, 1fr) auto;\n}\n\n.barLabel {\n color: var(--text-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.bar[data-binding] .barLabel {\n color: var(--text-secondary);\n}\n\n/* used (solid) · room (track) · kept for you (hatched, past the tick). */\n.track {\n position: relative;\n display: block;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--meter-track);\n overflow: hidden;\n}\n.trackUnknown {\n display: block;\n height: 6px;\n border-radius: var(--radius-full);\n border: 1px dashed var(--border-strong);\n}\n.used {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n border-radius: var(--radius-full);\n background: var(--data-seq-5);\n transition: width var(--duration-base) var(--ease-standard);\n}\n.used[data-level='tight'] { background: var(--status-warning-solid); }\n.used[data-level='limit'] { background: var(--status-danger-solid); }\n.reserve {\n position: absolute;\n top: 0;\n bottom: 0;\n background: repeating-linear-gradient(\n 135deg,\n color-mix(in srgb, var(--text-tertiary) 34%, transparent) 0 2px,\n transparent 2px 5px\n );\n}\n.ceiling {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 2px;\n margin-left: -1px;\n background: var(--text-secondary);\n}\n\n.value {\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n white-space: nowrap;\n text-align: right;\n}\n.value[data-level='tight'] { color: var(--status-warning-fg); }\n.value[data-level='limit'] { color: var(--status-danger-fg); }\n.value[data-level='unknown'] {\n font-style: italic;\n color: var(--status-unknown-fg);\n}\n\n.reset {\n color: var(--text-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--space-1);\n}\n\n/* Narrow container (a side panel, or a 375 window): actions and resets wrap. */\n@container (max-width: 480px) {\n .row {\n grid-template-columns: auto minmax(0, 1fr);\n }\n .actions {\n grid-column: 2;\n justify-content: flex-start;\n }\n .bar {\n grid-template-columns: minmax(0, 1fr) auto;\n row-gap: var(--space-1);\n }\n .bar .track,\n .bar .trackUnknown {\n grid-column: 1 / -1;\n grid-row: 2;\n }\n .reset {\n grid-column: 1 / -1;\n grid-row: 3;\n white-space: normal;\n }\n .bar[data-compact] {\n grid-template-columns: minmax(3rem, auto) minmax(3rem, 1fr) auto;\n }\n .bar[data-compact] .track,\n .bar[data-compact] .trackUnknown {\n grid-column: auto;\n grid-row: auto;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .used {\n transition: none;\n }\n}\n","/**\n * routes/verse/usage/CapacityStrip.tsx — THE capacity view (SPEC-310C §4:\n * \"Resources, NewChatDialog and onboarding drop their own capacity views and\n * import usage/CapacityStrip instead\"). Apps & Accounts and Usage render it\n * too, so every surface answers \"how much of each seat is left\" the same way.\n *\n * [C] Claude Max · max ● connected [actions]\n * usable · 62% of 5-hour window used\n * 5-hour window ▇▇▇▇▇▇▇░░░░│▨▨▨ 62% resets 7pm\n * weekly window ▇▇▇░░░░░░░░│▨▨▨ 40% resets Thu\n * Reserved for you 40% · Autonomy: Eligible\n *\n * Each bar reads left to right: used (solid), what autonomy may still use\n * (track), and the band KEPT FOR YOU (hatched) past a tick at 100 − reserve —\n * so \"Reserved for you 40%\" is something you can see, not just read. The\n * reserve applies to the binding window; the other windows carry no tick.\n *\n * Honesty (docs/VERSE-TELEMETRY-V2.md), enforced by the model and kept here:\n * - no reading → a dashed track and the words \"no reading\", never a 0% bar;\n * - a flagged limit → \"limit reached\", never \"100%\";\n * - reset prose is printed verbatim, never turned into a countdown;\n * - every state is a WORD first; colour only reinforces it.\n *\n * Three entry points:\n * <CapacityStrip seats health? budget? …/> pure: props in, markup out;\n * <LiveCapacityStrip …/> reads the shared caches itself\n * (bootstrap seats, /health,\n * /budget) — drop-in for C1/C2;\n * useCapacityRows() the rows, for a custom layout\n * (the rail ring, the seat chip).\n */\nimport { useId, useMemo, useState, type CSSProperties, type ReactNode } from 'react';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport type { SeatHealthReport } from '../../../../core/verse/health-types.js';\nimport type { VerseBootstrap, VerseSeat } from '../../../data/api-types.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { MonogramTile } from '../apps/MonogramTile.js';\nimport { budgetQuery } from '../budget/budget-queries.js';\nimport { useSeatHealth } from '../health/useSeatHealth.js';\nimport { usePollWhileVisible, useSectionVisible } from '../shell/section-visibility.js';\nimport { useSeatsRefresh } from '../useSeatsRefresh.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport {\n accountStatus,\n buildCapacityRows,\n capacityHeadline,\n capacityTone,\n orderAccountRows,\n percentText,\n windowSentence,\n type AccountStatus,\n type CapacityInputs,\n type CapacityRow,\n type CapacityWindowRow,\n} from './capacity-strip-model.js';\nimport styles from './CapacityStrip.module.css';\n\n/** Above this share of a window the bar turns amber (the word \"tight\" rides with it). */\nconst TIGHT_AT = 90;\n\n/** How often an accounts strip re-reads the clock (\"usable again in 7h\", \"checked 2m ago\"). */\nexport const ACCOUNT_CLOCK_MS = 30_000;\n\n/**\n * Apps & Accounts mode: every row leads with a sentence-case status\n * (\"Connected · usable now\", \"Spent · resets Fri 11:46 PM\", \"Signed out ·\n * reconnect to use it\", \"Checking…\"), says when it was last checked and — for\n * a spent seat — when it is usable again, and usable rows come first.\n */\nexport interface CapacityAccountsMode {\n /** False until the health sweep has answered once. */\n healthRead: boolean;\n /** The seat whose check is running now (its row reads \"Checking…\"). */\n checkingSeatId?: string | null;\n /** Injected clock for tests; otherwise the strip ticks every ACCOUNT_CLOCK_MS while visible. */\n now?: number;\n}\n\nexport interface CapacityStripProps {\n seats: readonly VerseSeat[];\n health?: readonly SeatHealthReport[] | null;\n budget?: BudgetView | null;\n local?: CapacityInputs['local'];\n seatIds?: readonly string[];\n /** full: every window with resets and the reserve; compact: one line per seat (pickers, side panels). */\n density?: 'full' | 'compact';\n /** Show the one-sentence summary above the rows. Default true for full, false for compact. */\n headline?: boolean;\n /** Heading for assistive tech (visually hidden). */\n title?: string;\n /**\n * The id of a heading that already names this strip (Apps' \"Accounts\"\n * group). The strip then labels itself by it instead of adding a second,\n * hidden heading — two regions with one name is noise to a screen reader.\n */\n labelledBy?: string;\n /** Per-seat trailing controls (Apps passes Reconnect / Fix / Edit budget). */\n renderActions?: (row: CapacityRow) => ReactNode;\n /** Makes each seat name a toggle (Usage opens the account's detail). */\n onSelectSeat?: (seatId: string) => void;\n selectedSeatId?: string | null;\n /** Shown instead of rows when the roster is empty. */\n emptyText?: string;\n /** Apps & Accounts: a status per row, when it was checked, usable rows first. */\n accounts?: CapacityAccountsMode;\n}\n\nfunction pct(n: number): number {\n return Math.max(0, Math.min(100, Math.round(n)));\n}\n\nfunction WindowBar({\n row,\n w,\n reservePercent,\n compact,\n}: {\n row: CapacityRow;\n w: CapacityWindowRow;\n reservePercent: number | null;\n compact: boolean;\n}) {\n const sentence = windowSentence(row, w, w.binding ? reservePercent : null);\n const ceiling = w.binding && reservePercent !== null && reservePercent > 0 ? 100 - pct(reservePercent) : null;\n let track: ReactNode;\n let value: ReactNode;\n if (w.limitReached) {\n track = (\n <span className={styles.track} role=\"img\" aria-label={sentence}>\n <span className={styles.used} data-level=\"limit\" style={{ width: '100%' }} />\n </span>\n );\n value = <span className={styles.value} data-level=\"limit\">limit reached</span>;\n } else if (w.usedPercent === null) {\n // Absence drawn as absence. Never a 0% bar.\n track = <span className={styles.trackUnknown} role=\"img\" aria-label={sentence} />;\n value = <span className={styles.value} data-level=\"unknown\">no reading</span>;\n } else {\n const used = pct(w.usedPercent);\n const level = used >= TIGHT_AT ? 'tight' : 'ok';\n track = (\n <span className={styles.track} role=\"img\" aria-label={sentence}>\n {ceiling !== null ? (\n <span className={styles.reserve} style={{ left: `${ceiling}%`, width: `${100 - ceiling}%` } as CSSProperties} />\n ) : null}\n <span className={styles.used} data-level={level} style={{ width: `${used}%` }} />\n {ceiling !== null ? <span className={styles.ceiling} style={{ left: `${ceiling}%` }} /> : null}\n </span>\n );\n value = <span className={styles.value} data-level={level}>{percentText(w.usedPercent)}</span>;\n }\n return (\n <div className={styles.bar} data-binding={w.binding || undefined} data-compact={compact || undefined}>\n <span className={styles.barLabel} title={w.label}>{w.label.replace(/ window$/, '')}</span>\n {track}\n {value}\n {!compact && w.resetText !== null ? <span className={styles.reset} title={w.resetText}>{w.resetText}</span> : null}\n </div>\n );\n}\n\nfunction SeatName({ row, onSelect, selected }: { row: CapacityRow; onSelect: ((id: string) => void) | undefined; selected: boolean }) {\n const text = (\n <>\n <span className={styles.name}>{row.label}</span>\n {row.plan !== null ? <span className={styles.plan}>{row.plan}</span> : null}\n </>\n );\n // A control only when there is something for it to open.\n if (!onSelect) return <span className={styles.nameWrap}>{text}</span>;\n return (\n <button type=\"button\" className={styles.nameButton} aria-pressed={selected} onClick={() => onSelect(row.seatId)}>\n {text}\n </button>\n );\n}\n\nfunction StatusLine({ status }: { status: AccountStatus }) {\n return (\n <span className={styles.status} data-tone={status.tone} data-status={status.kind}>\n <span className={styles.dot} aria-hidden=\"true\" />\n <span className={styles.statusLabel}>{status.label}</span>\n {status.detail !== null ? <span className={styles.statusDetail}>{`· ${status.detail}`}</span> : null}\n </span>\n );\n}\n\n/** \"usable again in 7h 12m · checked 2m ago\" — the row's clock facts, when it has any. */\nfunction StampLine({ status }: { status: AccountStatus }) {\n if (status.usableAgain === null && status.checked === null) return null;\n return (\n <p className={styles.stamp}>\n {status.usableAgain !== null ? <span className={styles.usableAgain}>{status.usableAgain}</span> : null}\n {status.usableAgain !== null && status.checked !== null ? ' · ' : null}\n {status.checked !== null ? <span title={status.checkedTitle ?? undefined}>{status.checked}</span> : null}\n </p>\n );\n}\n\nfunction CapacityRowView({\n row,\n compact,\n renderActions,\n onSelectSeat,\n selected,\n status,\n}: {\n row: CapacityRow;\n compact: boolean;\n renderActions: CapacityStripProps['renderActions'];\n onSelectSeat: CapacityStripProps['onSelectSeat'];\n selected: boolean;\n status: AccountStatus | null;\n}) {\n const tone = capacityTone(row.cls);\n const binding = row.windows.find((w) => w.binding) ?? null;\n const windows = compact ? (binding ? [binding] : []) : row.windows;\n const actions = renderActions ? renderActions(row) : null;\n const reserve = row.reserve;\n return (\n <li className={styles.row} data-capacity={row.cls} data-compact={compact || undefined} data-status={status?.kind}>\n <MonogramTile monogram={row.monogram} engine={row.engine} size=\"sm\" />\n <div className={styles.main}>\n <div className={styles.head}>\n <SeatName row={row} onSelect={onSelectSeat} selected={selected} />\n {status !== null ? (\n <StatusLine status={status} />\n ) : (\n <span className={styles.word} data-tone={tone}>\n <span className={styles.dot} aria-hidden=\"true\" />\n {row.word}\n </span>\n )}\n {row.connection !== null && row.connection.connection !== 'connected' && row.connection.connection !== 'unknown'\n && !(status?.coversConnection ?? false) && !(status?.kind === 'signed-out') ? (\n <span className={styles.word} data-tone={row.connection.tone}>\n <span className={styles.dot} aria-hidden=\"true\" />\n {row.connection.word}\n </span>\n ) : null}\n </div>\n {!compact || windows.length === 0 ? <p className={styles.summary}>{row.summary}</p> : null}\n {status !== null && !compact ? <StampLine status={status} /> : null}\n {windows.length > 0 ? (\n <div className={styles.bars}>\n {windows.map((w) => (\n <WindowBar key={w.id} row={row} w={w} reservePercent={reserve?.percent ?? null} compact={compact} />\n ))}\n </div>\n ) : null}\n {!compact && (reserve !== null || row.credits !== null) ? (\n <p className={styles.meta}>\n {reserve !== null ? (\n <span title={reserve.why}>\n {reserve.label}\n {/* \"Autonomy off — all yours\" already says it; no second \"Off\". */}\n {reserve.autonomy === 'off' ? null : (\n <> · Autonomy: <span className={styles.autonomy} data-status={reserve.autonomy}>{reserve.autonomyWord}</span></>\n )}\n </span>\n ) : null}\n {reserve !== null && row.credits !== null ? ' · ' : null}\n {row.credits !== null ? <span>{row.credits}</span> : null}\n </p>\n ) : null}\n </div>\n {actions ? <div className={styles.actions}>{actions}</div> : null}\n </li>\n );\n}\n\nexport function CapacityStrip({\n seats,\n health,\n budget,\n local,\n seatIds,\n density = 'full',\n headline,\n title = 'Seat capacity',\n labelledBy,\n renderActions,\n onSelectSeat,\n selectedSeatId = null,\n emptyText = 'No seats yet. Connect an account or start Ollama — an empty roster, not seats at zero.',\n accounts,\n}: CapacityStripProps) {\n const headingId = useId();\n const [tick, setTick] = useState(() => Date.now());\n usePollWhileVisible(() => setTick(Date.now()), ACCOUNT_CLOCK_MS, { enabled: accounts !== undefined && accounts.now === undefined });\n const now = accounts?.now ?? tick;\n const healthRead = accounts?.healthRead ?? false;\n const accountsMode = accounts !== undefined;\n // Accounts mode words every window reset and reason against the SAME clock\n // as its status line (\"Spent · resets Sat 11:46 PM\"), so the two never\n // disagree about which day \"today\" is.\n const rowsNow = accountsMode ? now : undefined;\n const built = useMemo(\n () => buildCapacityRows(seats, {\n health: health ?? null,\n budget: budget ?? null,\n ...(local ? { local } : {}),\n ...(seatIds ? { seatIds } : {}),\n ...(rowsNow !== undefined ? { now: rowsNow } : {}),\n }),\n [seats, health, budget, local, seatIds, rowsNow],\n );\n const rows = useMemo(\n () => (accountsMode ? orderAccountRows(built, { healthRead, now }) : built),\n [built, accountsMode, healthRead, now],\n );\n const compact = density === 'compact';\n const showHeadline = headline ?? !compact;\n // Named by the caller's heading: a plain block inside the caller's region,\n // not a second region with the same name.\n const Wrapper = labelledBy ? 'div' : 'section';\n return (\n <Wrapper className={styles.strip} aria-labelledby={labelledBy ? undefined : headingId} data-density={density}>\n {labelledBy ? null : <h3 id={headingId} className={styles.visuallyHidden}>{title}</h3>}\n {showHeadline && rows.length > 0 ? <p className={styles.headline}>{capacityHeadline(rows)}</p> : null}\n {rows.length === 0 ? (\n <p className={styles.empty}>{emptyText}</p>\n ) : (\n <ul className={styles.rows} aria-label={labelledBy ? undefined : title} aria-labelledby={labelledBy}>\n {rows.map((row) => (\n <CapacityRowView\n key={row.seatId}\n row={row}\n compact={compact}\n renderActions={renderActions}\n onSelectSeat={onSelectSeat}\n selected={selectedSeatId === row.seatId}\n status={accounts\n ? accountStatus(row, { healthRead, now, checking: accounts.checkingSeatId === row.seatId })\n : null}\n />\n ))}\n </ul>\n )}\n </Wrapper>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Live data\n// ---------------------------------------------------------------------------\n\n/** Budget moves with the collector (30 s); a minute is plenty for a strip. */\nexport const CAPACITY_BUDGET_POLL_MS = 60_000;\n\nexport interface CapacityData {\n seats: readonly VerseSeat[];\n health: readonly SeatHealthReport[] | null;\n budget: BudgetView | null;\n /** True until the seat roster has been read once. */\n loading: boolean;\n}\n\n/**\n * The three shared reads behind the strip, kept live while the surface is on\n * screen: seats (the /seats poll merged into bootstrap), A2's health (30 s)\n * and A9's budget (60 s). Each is the app-wide cache entry — mounting this\n * twice costs no extra request.\n */\nexport function useCapacityData(opts: { withBudget?: boolean; withHealth?: boolean } = {}): CapacityData {\n const visible = useSectionVisible();\n const withBudget = opts.withBudget ?? true;\n const withHealth = opts.withHealth ?? true;\n const bootstrap = useQuery(verseBootstrapQuery);\n useSeatsRefresh(visible);\n const health = useSeatHealth(visible && withHealth);\n const budget = useQuery(budgetQuery);\n const refetchBudget = useRefetch(budgetQuery);\n usePollWhileVisible(refetchBudget, CAPACITY_BUDGET_POLL_MS, { enabled: withBudget });\n const data = bootstrap.data as VerseBootstrap | undefined;\n return {\n seats: data?.seats ?? [],\n health: withHealth ? (health.data?.seats ?? null) : null,\n budget: withBudget ? (budget.data ?? null) : null,\n loading: data === undefined && (bootstrap.status === 'loading' || bootstrap.status === 'idle'),\n };\n}\n\n/** The rows for a custom layout (the rail's capacity ring, the composer's seat chip). */\nexport function useCapacityRows(inputs: Omit<CapacityInputs, 'health' | 'budget'> = {}): CapacityRow[] {\n const data = useCapacityData();\n return useMemo(\n () => buildCapacityRows(data.seats, { health: data.health, budget: data.budget, ...inputs }),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- inputs is a small literal; its fields are the identity.\n [data.seats, data.health, data.budget, inputs.local, inputs.seatIds],\n );\n}\n\nexport interface LiveCapacityStripProps extends Omit<CapacityStripProps, 'seats' | 'health' | 'budget'> {\n /**\n * The roster, when the caller already holds it (the new-chat dialog, whose\n * seat list IS this roster and whose pre-fill works from its own props).\n * The strip then adds only health and budget, and never shows \"Reading\n * seats…\" over a roster that is already on screen.\n */\n seats?: readonly VerseSeat[];\n}\n\n/** Drop-in strip that reads its own data — what NewChatDialog and onboarding mount. */\nexport function LiveCapacityStrip({ seats: given, ...props }: LiveCapacityStripProps) {\n const data = useCapacityData();\n if (given === undefined && data.loading) {\n return <p className={styles.empty} aria-busy=\"true\">Reading seats…</p>;\n }\n return <CapacityStrip {...props} seats={given ?? data.seats} health={data.health} budget={data.budget} />;\n}\n"],"mappings":"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"}