@ashlr/hub 3.10.0 → 3.11.0

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 (534) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +343 -82
  3. package/dist/authority-surface.json +109 -29
  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/daemon/capacity-publisher.d.ts +19 -0
  49. package/dist/core/daemon/capacity-publisher.js +49 -2
  50. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  51. package/dist/core/daemon/overnight-status.d.ts +13 -0
  52. package/dist/core/daemon/overnight-status.js +93 -8
  53. package/dist/core/daemon/overnight-status.js.map +1 -1
  54. package/dist/core/fleet/dispatch-router.js +26 -9
  55. package/dist/core/fleet/dispatch-router.js.map +1 -1
  56. package/dist/core/fleet/fleet-runtime-journal.js +12 -5
  57. package/dist/core/fleet/fleet-runtime-journal.js.map +1 -1
  58. package/dist/core/fleet/fleet-types.d.ts +13 -0
  59. package/dist/core/routing/budget-store.js +11 -5
  60. package/dist/core/routing/budget-store.js.map +1 -1
  61. package/dist/core/routing/capacity-history-api.d.ts +30 -0
  62. package/dist/core/routing/capacity-history-api.js +147 -0
  63. package/dist/core/routing/capacity-history-api.js.map +1 -0
  64. package/dist/core/routing/capacity-history-types.d.ts +63 -0
  65. package/dist/core/routing/capacity-history-types.js +18 -0
  66. package/dist/core/routing/capacity-history-types.js.map +1 -0
  67. package/dist/core/routing/capacity-history.d.ts +130 -0
  68. package/dist/core/routing/capacity-history.js +654 -0
  69. package/dist/core/routing/capacity-history.js.map +1 -0
  70. package/dist/core/routing/headroom.d.ts +5 -1
  71. package/dist/core/routing/headroom.js +82 -41
  72. package/dist/core/routing/headroom.js.map +1 -1
  73. package/dist/core/routing/router.d.ts +8 -1
  74. package/dist/core/routing/router.js +49 -16
  75. package/dist/core/routing/router.js.map +1 -1
  76. package/dist/core/routing/seat-reasons.d.ts +35 -0
  77. package/dist/core/routing/seat-reasons.js +48 -0
  78. package/dist/core/routing/seat-reasons.js.map +1 -0
  79. package/dist/core/routing/types.d.ts +37 -0
  80. package/dist/core/routing/types.js.map +1 -1
  81. package/dist/core/verse/activity-api.d.ts +3 -1
  82. package/dist/core/verse/activity-api.js +16 -1
  83. package/dist/core/verse/activity-api.js.map +1 -1
  84. package/dist/core/verse/activity.d.ts +7 -0
  85. package/dist/core/verse/activity.js +23 -0
  86. package/dist/core/verse/activity.js.map +1 -1
  87. package/dist/core/verse/fleet-history-types.d.ts +12 -4
  88. package/dist/core/verse/fleet-history-types.js +4 -2
  89. package/dist/core/verse/fleet-history-types.js.map +1 -1
  90. package/dist/core/verse/fleet-live-api.d.ts +14 -1
  91. package/dist/core/verse/fleet-live-api.js +31 -11
  92. package/dist/core/verse/fleet-live-api.js.map +1 -1
  93. package/dist/core/verse/preferences.d.ts +3 -1
  94. package/dist/core/verse/preferences.js +5 -2
  95. package/dist/core/verse/preferences.js.map +1 -1
  96. package/dist/core/verse/types.d.ts +5 -1
  97. package/dist/core/verse/types.js.map +1 -1
  98. package/dist/core/verse/verse-api.d.ts +1 -1
  99. package/dist/core/verse/verse-api.js +4 -1
  100. package/dist/core/verse/verse-api.js.map +1 -1
  101. package/dist/core/vision/leader-cloud.d.ts +63 -0
  102. package/dist/core/vision/leader-cloud.js +134 -0
  103. package/dist/core/vision/leader-cloud.js.map +1 -0
  104. package/dist/core/vision/leader.d.ts +6 -0
  105. package/dist/core/vision/leader.js +12 -1
  106. package/dist/core/vision/leader.js.map +1 -1
  107. package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js → ActionMenu-CQvNJvHY.js} +2 -2
  108. package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js.map → ActionMenu-CQvNJvHY.js.map} +1 -1
  109. package/dist/core/web/public/next/assets/Advanced-Bywv_iYR.css +1 -0
  110. package/dist/core/web/public/next/assets/Advanced-DEM93sKI.js +2 -0
  111. package/dist/core/web/public/next/assets/Advanced-DEM93sKI.js.map +1 -0
  112. package/dist/core/web/public/next/assets/{App-DyBg1v_q.js → App-CimXmK0L.js} +5 -5
  113. package/dist/core/web/public/next/assets/{App-DyBg1v_q.js.map → App-CimXmK0L.js.map} +1 -1
  114. package/dist/core/web/public/next/assets/AppsSection-D6U-dSj6.js +2 -0
  115. package/dist/core/web/public/next/assets/AppsSection-D6U-dSj6.js.map +1 -0
  116. package/dist/core/web/public/next/assets/AreaTrend-LD9lCPkT.js +2 -0
  117. package/dist/core/web/public/next/assets/AreaTrend-LD9lCPkT.js.map +1 -0
  118. package/dist/core/web/public/next/assets/AutonomySection-3V9pUyxm.js +2 -0
  119. package/dist/core/web/public/next/assets/{AutonomySection-CoMngwNB.js.map → AutonomySection-3V9pUyxm.js.map} +1 -1
  120. package/dist/core/web/public/next/assets/BranchBar-BZNQ50YE.css +1 -0
  121. package/dist/core/web/public/next/assets/BranchBar-U8UdpfEB.js +2 -0
  122. package/dist/core/web/public/next/assets/BranchBar-U8UdpfEB.js.map +1 -0
  123. package/dist/core/web/public/next/assets/BudgetControl-DOTlMSmW.js +2 -0
  124. package/dist/core/web/public/next/assets/BudgetControl-DOTlMSmW.js.map +1 -0
  125. package/dist/core/web/public/next/assets/BurnDown-x4PWH9JF.js +2 -0
  126. package/dist/core/web/public/next/assets/BurnDown-x4PWH9JF.js.map +1 -0
  127. package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js → Button-DYv_KKxr.js} +2 -2
  128. package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js.map → Button-DYv_KKxr.js.map} +1 -1
  129. package/dist/core/web/public/next/assets/CapacityStrip-C667yQe8.js +2 -0
  130. package/dist/core/web/public/next/assets/CapacityStrip-C667yQe8.js.map +1 -0
  131. package/dist/core/web/public/next/assets/CapacityStrip-Cc28CyWk.css +1 -0
  132. package/dist/core/web/public/next/assets/ChatSection-CCcIPpOq.js +3 -0
  133. package/dist/core/web/public/next/assets/{ChatSection-B9cdRKUh.js.map → ChatSection-CCcIPpOq.js.map} +1 -1
  134. package/dist/core/web/public/next/assets/CloudBudgetForm-DJeJvBEu.js +2 -0
  135. package/dist/core/web/public/next/assets/CloudBudgetForm-DJeJvBEu.js.map +1 -0
  136. package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js → CommandPalette-FiD4N8XD.js} +2 -2
  137. package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js.map → CommandPalette-FiD4N8XD.js.map} +1 -1
  138. package/dist/core/web/public/next/assets/CommandSection-DN8KwH-X.js +2 -0
  139. package/dist/core/web/public/next/assets/CommandSection-DN8KwH-X.js.map +1 -0
  140. package/dist/core/web/public/next/assets/Composer-ByzxOJK6.css +1 -0
  141. package/dist/core/web/public/next/assets/Composer.module-C8U73KdQ.js +2 -0
  142. package/dist/core/web/public/next/assets/{Composer.module-DJMdrqNt.js.map → Composer.module-C8U73KdQ.js.map} +1 -1
  143. package/dist/core/web/public/next/assets/DiffPane-BAvvbBsf.css +1 -0
  144. package/dist/core/web/public/next/assets/DiffPane-DLJ3gGGK.js +2 -0
  145. package/dist/core/web/public/next/assets/DiffPane-DLJ3gGGK.js.map +1 -0
  146. package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js → DiffViewer-B7NWPjIO.js} +2 -2
  147. package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js.map → DiffViewer-B7NWPjIO.js.map} +1 -1
  148. package/dist/core/web/public/next/assets/DockHost-B4RaYOET.css +1 -0
  149. package/dist/core/web/public/next/assets/DockHost-DvR-hPhZ.js +2 -0
  150. package/dist/core/web/public/next/assets/DockHost-DvR-hPhZ.js.map +1 -0
  151. package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js → EmptyState-DhNgDDrF.js} +2 -2
  152. package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js.map → EmptyState-DhNgDDrF.js.map} +1 -1
  153. package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js → Epistemic-uARPnx9x.js} +2 -2
  154. package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js.map → Epistemic-uARPnx9x.js.map} +1 -1
  155. package/dist/core/web/public/next/assets/FleetSection-CFiWeOEs.css +1 -0
  156. package/dist/core/web/public/next/assets/FleetSection-D_zRBCub.js +3 -0
  157. package/dist/core/web/public/next/assets/FleetSection-D_zRBCub.js.map +1 -0
  158. package/dist/core/web/public/next/assets/Funnel-CL8uHONq.js +2 -0
  159. package/dist/core/web/public/next/assets/Funnel-CL8uHONq.js.map +1 -0
  160. package/dist/core/web/public/next/assets/GearTray-C7k4l_BW.js +2 -0
  161. package/dist/core/web/public/next/assets/GearTray-C7k4l_BW.js.map +1 -0
  162. package/dist/core/web/public/next/assets/GrowthSection-DwdNSGj8.js +2 -0
  163. package/dist/core/web/public/next/assets/GrowthSection-DwdNSGj8.js.map +1 -0
  164. package/dist/core/web/public/next/assets/HandoffDialog-FPVOqOMN.js +2 -0
  165. package/dist/core/web/public/next/assets/HandoffDialog-FPVOqOMN.js.map +1 -0
  166. package/dist/core/web/public/next/assets/{Input-CTu0CycC.js → Input-B9-VLcHS.js} +2 -2
  167. package/dist/core/web/public/next/assets/{Input-CTu0CycC.js.map → Input-B9-VLcHS.js.map} +1 -1
  168. package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js → LeaderCard-4R0BhDzT.js} +2 -2
  169. package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js.map → LeaderCard-4R0BhDzT.js.map} +1 -1
  170. package/dist/core/web/public/next/assets/{MatrixHeatmap-9dKgJ_pT.css → MatrixHeatmap-Bmnvo1l1.css} +1 -1
  171. package/dist/core/web/public/next/assets/MatrixHeatmap-DiuushcS.js +2 -0
  172. package/dist/core/web/public/next/assets/MatrixHeatmap-DiuushcS.js.map +1 -0
  173. package/dist/core/web/public/next/assets/McpSection-CJ__OJKl.js +2 -0
  174. package/dist/core/web/public/next/assets/{McpSection-1UncWBpW.js.map → McpSection-CJ__OJKl.js.map} +1 -1
  175. package/dist/core/web/public/next/assets/MessageMarkdown-Cgh5f1-Q.css +1 -0
  176. package/dist/core/web/public/next/assets/MessageMarkdown-qWKyJvAQ.js +3 -0
  177. package/dist/core/web/public/next/assets/{MessageMarkdown-C4pl9LI5.js.map → MessageMarkdown-qWKyJvAQ.js.map} +1 -1
  178. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js → MessageMarkdownRenderer-x05TrsrW.js} +2 -2
  179. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js.map → MessageMarkdownRenderer-x05TrsrW.js.map} +1 -1
  180. package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js → Meter-D-hncpkO.js} +2 -2
  181. package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js.map → Meter-D-hncpkO.js.map} +1 -1
  182. package/dist/core/web/public/next/assets/MindSection-BjXHkQPS.js +2 -0
  183. package/dist/core/web/public/next/assets/MindSection-BjXHkQPS.js.map +1 -0
  184. package/dist/core/web/public/next/assets/MutationTokenDialog-SkRxqV_I.js +2 -0
  185. package/dist/core/web/public/next/assets/MutationTokenDialog-SkRxqV_I.js.map +1 -0
  186. package/dist/core/web/public/next/assets/NeedsYouDrawer-BpvidnM2.css +1 -0
  187. package/dist/core/web/public/next/assets/NeedsYouDrawer-rSd1ZHAR.js +2 -0
  188. package/dist/core/web/public/next/assets/NeedsYouDrawer-rSd1ZHAR.js.map +1 -0
  189. package/dist/core/web/public/next/assets/NeedsYouList-CG-nB1tr.js +2 -0
  190. package/dist/core/web/public/next/assets/NeedsYouList-CG-nB1tr.js.map +1 -0
  191. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +1 -0
  192. package/dist/core/web/public/next/assets/NewChatDialog-BeDQ1eW3.js +3 -0
  193. package/dist/core/web/public/next/assets/{NewChatDialog-B_BsS9pr.js.map → NewChatDialog-BeDQ1eW3.js.map} +1 -1
  194. package/dist/core/web/public/next/assets/OnboardingFlow-CkTZtt-m.js +2 -0
  195. package/dist/core/web/public/next/assets/{OnboardingFlow-CtCPpgoX.js.map → OnboardingFlow-CkTZtt-m.js.map} +1 -1
  196. package/dist/core/web/public/next/assets/PreviewPane-DoMsJSG3.css +1 -0
  197. package/dist/core/web/public/next/assets/PreviewPane-kzbbSK4u.js +2 -0
  198. package/dist/core/web/public/next/assets/PreviewPane-kzbbSK4u.js.map +1 -0
  199. package/dist/core/web/public/next/assets/RailStatus-D-t2gPae.js +2 -0
  200. package/dist/core/web/public/next/assets/RailStatus-D-t2gPae.js.map +1 -0
  201. package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js → RefreshIndicator-BLnr9IOM.js} +2 -2
  202. package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js.map → RefreshIndicator-BLnr9IOM.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js → ResourcePoolConsoleApp-BeG0gBif.js} +4 -4
  204. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js.map → ResourcePoolConsoleApp-BeG0gBif.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/ResourcesChrome-B3Z3O98t.css +1 -0
  206. package/dist/core/web/public/next/assets/ResourcesChrome-BzV6bkIa.js +3 -0
  207. package/dist/core/web/public/next/assets/ResourcesChrome-BzV6bkIa.js.map +1 -0
  208. package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +1 -0
  209. package/dist/core/web/public/next/assets/ResourcesDrawer-o4ILHdep.js +2 -0
  210. package/dist/core/web/public/next/assets/ResourcesDrawer-o4ILHdep.js.map +1 -0
  211. package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js → RouteErrorBoundary-C5SxA2Dg.js} +2 -2
  212. package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js.map → RouteErrorBoundary-C5SxA2Dg.js.map} +1 -1
  213. package/dist/core/web/public/next/assets/RunInCloudAction-C3LBp7C4.js +2 -0
  214. package/dist/core/web/public/next/assets/RunInCloudAction-C3LBp7C4.js.map +1 -0
  215. package/dist/core/web/public/next/assets/SeatSelector-DpvvbjNm.js +3 -0
  216. package/dist/core/web/public/next/assets/{SeatSelector-DaUO-zoK.js.map → SeatSelector-DpvvbjNm.js.map} +1 -1
  217. package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js → Segmented-BL40udoO.js} +2 -2
  218. package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js.map → Segmented-BL40udoO.js.map} +1 -1
  219. package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js → Select-FWLnAw_j.js} +2 -2
  220. package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js.map → Select-FWLnAw_j.js.map} +1 -1
  221. package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js → SessionInsightChip-CWye87Ju.js} +2 -2
  222. package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js.map → SessionInsightChip-CWye87Ju.js.map} +1 -1
  223. package/dist/core/web/public/next/assets/SessionSearch-YvCHFUuN.js +2 -0
  224. package/dist/core/web/public/next/assets/{SessionSearch-B5aQ0BCM.js.map → SessionSearch-YvCHFUuN.js.map} +1 -1
  225. package/dist/core/web/public/next/assets/SettingsSection-Dr18upeE.js +2 -0
  226. package/dist/core/web/public/next/assets/SettingsSection-Dr18upeE.js.map +1 -0
  227. package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js → Sheet-DZKcQXQg.js} +2 -2
  228. package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js.map → Sheet-DZKcQXQg.js.map} +1 -1
  229. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js → ShortcutsOverlay-BpDimdPq.js} +2 -2
  230. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js.map → ShortcutsOverlay-BpDimdPq.js.map} +1 -1
  231. package/dist/core/web/public/next/assets/Sidebar-BRc1vGDF.css +1 -0
  232. package/dist/core/web/public/next/assets/Sidebar-BoBzBEFX.js +3 -0
  233. package/dist/core/web/public/next/assets/Sidebar-BoBzBEFX.js.map +1 -0
  234. package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js → Slider-DUMo9HDD.js} +2 -2
  235. package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js.map → Slider-DUMo9HDD.js.map} +1 -1
  236. package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js → StatusBadge-BwnBNFQr.js} +2 -2
  237. package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js.map → StatusBadge-BwnBNFQr.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/StepBand-PDXMIlRk.js +2 -0
  239. package/dist/core/web/public/next/assets/StepBand-PDXMIlRk.js.map +1 -0
  240. package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js → Surface-B3TZVoER.js} +2 -2
  241. package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js.map → Surface-B3TZVoER.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/Swimlane-DR4OgON_.js +2 -0
  243. package/dist/core/web/public/next/assets/Swimlane-DR4OgON_.js.map +1 -0
  244. package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js → Switch-CcR5Llk5.js} +2 -2
  245. package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js.map → Switch-CcR5Llk5.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js → Tag-_-K1h7Hk.js} +2 -2
  247. package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js.map → Tag-_-K1h7Hk.js.map} +1 -1
  248. package/dist/core/web/public/next/assets/TerminalPane-BwfMbnJz.css +1 -0
  249. package/dist/core/web/public/next/assets/TerminalPane-_1aH4ndN.js +7 -0
  250. package/dist/core/web/public/next/assets/TerminalPane-_1aH4ndN.js.map +1 -0
  251. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUsq-inZ.js +2 -0
  252. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DKqAf-eD.js.map → UniverseConsoleApp-BUsq-inZ.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js → UniverseView-Dogy_dsB.js} +2 -2
  254. package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js.map → UniverseView-Dogy_dsB.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/UsageSection-DiX_dTyo.js +2 -0
  256. package/dist/core/web/public/next/assets/UsageSection-DiX_dTyo.js.map +1 -0
  257. package/dist/core/web/public/next/assets/UsageSection-DsB-Jqyl.css +1 -0
  258. package/dist/core/web/public/next/assets/VerseConsoleApp-Cxqr-3qc.css +1 -0
  259. package/dist/core/web/public/next/assets/VerseConsoleApp-WVeyJnW7.js +3 -0
  260. package/dist/core/web/public/next/assets/VerseConsoleApp-WVeyJnW7.js.map +1 -0
  261. package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +1 -0
  262. package/dist/core/web/public/next/assets/Workspace-BbxZHwQd.js +10 -0
  263. package/dist/core/web/public/next/assets/Workspace-BbxZHwQd.js.map +1 -0
  264. package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +1 -0
  265. package/dist/core/web/public/next/assets/actions-s2lfm_5k.js +2 -0
  266. package/dist/core/web/public/next/assets/actions-s2lfm_5k.js.map +1 -0
  267. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +2 -0
  268. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +1 -0
  269. package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js → budget-queries-wUshcovN.js} +2 -2
  270. package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js.map → budget-queries-wUshcovN.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js +2 -0
  272. package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js.map +1 -0
  273. package/dist/core/web/public/next/assets/capacity-strip-model-Bj_9ztzs.js +2 -0
  274. package/dist/core/web/public/next/assets/capacity-strip-model-Bj_9ztzs.js.map +1 -0
  275. package/dist/core/web/public/next/assets/charts-CMSgAUKn.js +2 -0
  276. package/dist/core/web/public/next/assets/charts-CMSgAUKn.js.map +1 -0
  277. package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +1 -0
  278. package/dist/core/web/public/next/assets/cloud-queries-CnV1yaNG.js +2 -0
  279. package/dist/core/web/public/next/assets/cloud-queries-CnV1yaNG.js.map +1 -0
  280. package/dist/core/web/public/next/assets/cloud.module-CiwatLj3.js +2 -0
  281. package/dist/core/web/public/next/assets/cloud.module-CiwatLj3.js.map +1 -0
  282. package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js +2 -0
  283. package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js.map +1 -0
  284. package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js → command-bus-DqimKCUY.js} +2 -2
  285. package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js.map → command-bus-DqimKCUY.js.map} +1 -1
  286. package/dist/core/web/public/next/assets/command-catalog-BdtDH93o.js +2 -0
  287. package/dist/core/web/public/next/assets/command-catalog-BdtDH93o.js.map +1 -0
  288. package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js → composer-keys-DBRymxQn.js} +2 -2
  289. package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js.map → composer-keys-DBRymxQn.js.map} +1 -1
  290. package/dist/core/web/public/next/assets/context-model-Dwd49-dp.js +2 -0
  291. package/dist/core/web/public/next/assets/context-model-Dwd49-dp.js.map +1 -0
  292. package/dist/core/web/public/next/assets/context-model-MT17V86_.js +2 -0
  293. package/dist/core/web/public/next/assets/context-model-MT17V86_.js.map +1 -0
  294. package/dist/core/web/public/next/assets/context-queries-xVKIeynP.js +2 -0
  295. package/dist/core/web/public/next/assets/context-queries-xVKIeynP.js.map +1 -0
  296. package/dist/core/web/public/next/assets/context.module-BijAfoJw.js +2 -0
  297. package/dist/core/web/public/next/assets/context.module-BijAfoJw.js.map +1 -0
  298. package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js → control-queries-DOZR-D8G.js} +2 -2
  299. package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js.map → control-queries-DOZR-D8G.js.map} +1 -1
  300. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +2 -0
  301. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +1 -0
  302. package/dist/core/web/public/next/assets/dock-icons-8EtARwUm.js +2 -0
  303. package/dist/core/web/public/next/assets/dock-icons-8EtARwUm.js.map +1 -0
  304. package/dist/core/web/public/next/assets/dock-panes-UKS-mXhr.js +2 -0
  305. package/dist/core/web/public/next/assets/{dock-panes-BNTLvX7G.js.map → dock-panes-UKS-mXhr.js.map} +1 -1
  306. package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js → dock-store-BA1cHOYA.js} +2 -2
  307. package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js.map → dock-store-BA1cHOYA.js.map} +1 -1
  308. package/dist/core/web/public/next/assets/fleet-model-CNe8Wh-s.js +2 -0
  309. package/dist/core/web/public/next/assets/fleet-model-CNe8Wh-s.js.map +1 -0
  310. package/dist/core/web/public/next/assets/fleet-queries-BSdRlUwJ.js +2 -0
  311. package/dist/core/web/public/next/assets/fleet-queries-BSdRlUwJ.js.map +1 -0
  312. package/dist/core/web/public/next/assets/format-B8DAVcn2.js +2 -0
  313. package/dist/core/web/public/next/assets/format-B8DAVcn2.js.map +1 -0
  314. package/dist/core/web/public/next/assets/format-DKrNjdwD.js +2 -0
  315. package/dist/core/web/public/next/assets/format-DKrNjdwD.js.map +1 -0
  316. package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js → git-model-CivuBY_D.js} +2 -2
  317. package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js.map → git-model-CivuBY_D.js.map} +1 -1
  318. package/dist/core/web/public/next/assets/global-Di2PUgj4.js +2 -0
  319. package/dist/core/web/public/next/assets/global-Di2PUgj4.js.map +1 -0
  320. package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js → guarded-action-CvOHcqyH.js} +2 -2
  321. package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js.map → guarded-action-CvOHcqyH.js.map} +1 -1
  322. package/dist/core/web/public/next/assets/{icons-DWb24OA6.js → icons-B_yuAgdN.js} +2 -2
  323. package/dist/core/web/public/next/assets/{icons-DWb24OA6.js.map → icons-B_yuAgdN.js.map} +1 -1
  324. package/dist/core/web/public/next/assets/{index-afDA8cwW.js → index-oAAq8XJa.js} +3 -3
  325. package/dist/core/web/public/next/assets/{index-afDA8cwW.js.map → index-oAAq8XJa.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/live-model-DCw_IFRI.js +2 -0
  327. package/dist/core/web/public/next/assets/live-model-DCw_IFRI.js.map +1 -0
  328. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +2 -0
  329. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +1 -0
  330. package/dist/core/web/public/next/assets/mind-B9PzLcl0.css +1 -0
  331. package/dist/core/web/public/next/assets/mind.module-vnuJcwvD.js +2 -0
  332. package/dist/core/web/public/next/assets/mind.module-vnuJcwvD.js.map +1 -0
  333. package/dist/core/web/public/next/assets/mutations-Dpsql5t7.js +2 -0
  334. package/dist/core/web/public/next/assets/{mutations-C6E10SPX.js.map → mutations-Dpsql5t7.js.map} +1 -1
  335. package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js → overnight-queries-X-44Gsw5.js} +2 -2
  336. package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js.map → overnight-queries-X-44Gsw5.js.map} +1 -1
  337. package/dist/core/web/public/next/assets/pane-chrome-8JmEhHVD.css +1 -0
  338. package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js +2 -0
  339. package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js.map +1 -0
  340. package/dist/core/web/public/next/assets/primitives-BDIcUvob.js +1 -0
  341. package/dist/core/web/public/next/assets/{queries-BuYIEHst.js → queries-BA4rNGD-.js} +2 -2
  342. package/dist/core/web/public/next/assets/{queries-BuYIEHst.js.map → queries-BA4rNGD-.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js → reasoning-pref-B9-DJUXP.js} +2 -2
  344. package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js.map → reasoning-pref-B9-DJUXP.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/seat-subscription-CH6fW4fJ.js +2 -0
  346. package/dist/core/web/public/next/assets/seat-subscription-CH6fW4fJ.js.map +1 -0
  347. package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js → section-visibility-qFqc_d4Z.js} +2 -2
  348. package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js.map → section-visibility-qFqc_d4Z.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js → sidebar-model-M1GaQU5l.js} +2 -2
  350. package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js.map → sidebar-model-M1GaQU5l.js.map} +1 -1
  351. package/dist/core/web/public/next/assets/slots-Ds9ZIqUL.js +3 -0
  352. package/dist/core/web/public/next/assets/{slots-W8gkmdfE.js.map → slots-Ds9ZIqUL.js.map} +1 -1
  353. package/dist/core/web/public/next/assets/surface-data-J52iIGMD.js +2 -0
  354. package/dist/core/web/public/next/assets/surface-data-J52iIGMD.js.map +1 -0
  355. package/dist/core/web/public/next/assets/surface-prefetch-CgZ-LEJK.js +2 -0
  356. package/dist/core/web/public/next/assets/surface-prefetch-CgZ-LEJK.js.map +1 -0
  357. package/dist/core/web/public/next/assets/tasks-model-ent8f0jZ.js +2 -0
  358. package/dist/core/web/public/next/assets/{tasks-model-CnYQzgxk.js.map → tasks-model-ent8f0jZ.js.map} +1 -1
  359. package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js → terminal-icons-DJTK7QpR.js} +2 -2
  360. package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js.map → terminal-icons-DJTK7QpR.js.map} +1 -1
  361. package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js → tool-semantics-GX8ScuSH.js} +2 -2
  362. package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js.map → tool-semantics-GX8ScuSH.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js → turn-files-BPHQzYuH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js.map → turn-files-BPHQzYuH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +2 -0
  366. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -0
  367. package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js → usage-queries-Bn8ccqyN.js} +2 -2
  368. package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js.map → usage-queries-Bn8ccqyN.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/use-guarded-action-C2HlSzkz.js +2 -0
  370. package/dist/core/web/public/next/assets/use-guarded-action-C2HlSzkz.js.map +1 -0
  371. package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js → use-ticker-BNc1H4ZC.js} +2 -2
  372. package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js.map → use-ticker-BNc1H4ZC.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/use-token-gate-B3IJL6bf.js +2 -0
  374. package/dist/core/web/public/next/assets/use-token-gate-B3IJL6bf.js.map +1 -0
  375. package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js → useActivity-Bk3XgXjL.js} +2 -2
  376. package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js.map → useActivity-Bk3XgXjL.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +1 -0
  378. package/dist/core/web/public/next/assets/useChartWidth-lZ9PrQn0.js +2 -0
  379. package/dist/core/web/public/next/assets/useChartWidth-lZ9PrQn0.js.map +1 -0
  380. package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js → useSeatsRefresh-CG4jczeL.js} +2 -2
  381. package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js.map → useSeatsRefresh-CG4jczeL.js.map} +1 -1
  382. package/dist/core/web/public/next/assets/verse-model-D7NZQFAR.js +2 -0
  383. package/dist/core/web/public/next/assets/verse-model-D7NZQFAR.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js → verse-queries-DvIJcn6Z.js} +2 -2
  385. package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js.map → verse-queries-DvIJcn6Z.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/verse-store-DjBWj04q.js +3 -0
  387. package/dist/core/web/public/next/assets/verse-store-DjBWj04q.js.map +1 -0
  388. package/dist/core/web/public/next/assets/verse-ui-store-zafyzXKD.js +3 -0
  389. package/dist/core/web/public/next/assets/{verse-ui-store-KTTKfv-T.js.map → verse-ui-store-zafyzXKD.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js → viewport-BEqGUoTA.js} +2 -2
  391. package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js.map → viewport-BEqGUoTA.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/warmup-BR6pxAKs.js +3 -0
  393. package/dist/core/web/public/next/assets/warmup-BR6pxAKs.js.map +1 -0
  394. package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js → workspace-model-D_tWD5Wt.js} +2 -2
  395. package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js.map → workspace-model-D_tWD5Wt.js.map} +1 -1
  396. package/dist/core/web/public/next/index.html +1 -1
  397. package/dist/release-dependency-inventory.json +1 -1
  398. package/package.json +1 -1
  399. package/dist/core/web/public/next/assets/Advanced-CHjxJt2z.css +0 -1
  400. package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js +0 -2
  401. package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js.map +0 -1
  402. package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js +0 -2
  403. package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js.map +0 -1
  404. package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js +0 -2
  405. package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js.map +0 -1
  406. package/dist/core/web/public/next/assets/AutonomySection-CoMngwNB.js +0 -2
  407. package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js +0 -2
  408. package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js.map +0 -1
  409. package/dist/core/web/public/next/assets/BranchBar-C9BpPVLr.css +0 -1
  410. package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js +0 -2
  411. package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js.map +0 -1
  412. package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js +0 -2
  413. package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js.map +0 -1
  414. package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js +0 -2
  415. package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js.map +0 -1
  416. package/dist/core/web/public/next/assets/CapacityStrip-wgFP9MUA.css +0 -1
  417. package/dist/core/web/public/next/assets/ChatSection-B9cdRKUh.js +0 -3
  418. package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js +0 -2
  419. package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js.map +0 -1
  420. package/dist/core/web/public/next/assets/Composer-CkcwbQhG.css +0 -1
  421. package/dist/core/web/public/next/assets/Composer.module-DJMdrqNt.js +0 -2
  422. package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js +0 -2
  423. package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js.map +0 -1
  424. package/dist/core/web/public/next/assets/DiffPane-Csboxnn0.css +0 -1
  425. package/dist/core/web/public/next/assets/DockHost-BGnTgdIb.css +0 -1
  426. package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js +0 -2
  427. package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js.map +0 -1
  428. package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js +0 -3
  429. package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js.map +0 -1
  430. package/dist/core/web/public/next/assets/FleetSection-w9AjqfTR.css +0 -1
  431. package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js +0 -2
  432. package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js.map +0 -1
  433. package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js +0 -2
  434. package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js.map +0 -1
  435. package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js +0 -2
  436. package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js.map +0 -1
  437. package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js +0 -2
  438. package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js.map +0 -1
  439. package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js +0 -2
  440. package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js.map +0 -1
  441. package/dist/core/web/public/next/assets/McpSection-1UncWBpW.js +0 -2
  442. package/dist/core/web/public/next/assets/MessageMarkdown-C4pl9LI5.js +0 -3
  443. package/dist/core/web/public/next/assets/MessageMarkdown-Czcl3L_Q.css +0 -1
  444. package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js +0 -2
  445. package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js.map +0 -1
  446. package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js +0 -2
  447. package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js.map +0 -1
  448. package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js +0 -2
  449. package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js.map +0 -1
  450. package/dist/core/web/public/next/assets/NeedsYouDrawer-SkhvvdLb.css +0 -1
  451. package/dist/core/web/public/next/assets/NewChatDialog-B_BsS9pr.js +0 -3
  452. package/dist/core/web/public/next/assets/OnboardingFlow-CtCPpgoX.js +0 -2
  453. package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js +0 -2
  454. package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js.map +0 -1
  455. package/dist/core/web/public/next/assets/PreviewPane-WQJFjSXe.css +0 -1
  456. package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js +0 -2
  457. package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js.map +0 -1
  458. package/dist/core/web/public/next/assets/SeatSelector-DaUO-zoK.js +0 -3
  459. package/dist/core/web/public/next/assets/SessionSearch-B5aQ0BCM.js +0 -2
  460. package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js +0 -2
  461. package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js.map +0 -1
  462. package/dist/core/web/public/next/assets/Sidebar-DfD8MNZt.css +0 -1
  463. package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js +0 -3
  464. package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js.map +0 -1
  465. package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js +0 -2
  466. package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js.map +0 -1
  467. package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js +0 -2
  468. package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js.map +0 -1
  469. package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js +0 -7
  470. package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js.map +0 -1
  471. package/dist/core/web/public/next/assets/TerminalPane-CmE2QL-Q.css +0 -1
  472. package/dist/core/web/public/next/assets/UniverseConsoleApp-DKqAf-eD.js +0 -2
  473. package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js +0 -2
  474. package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js.map +0 -1
  475. package/dist/core/web/public/next/assets/UsageSection-DwgNOYvi.css +0 -1
  476. package/dist/core/web/public/next/assets/VerseConsoleApp-C0V221WL.css +0 -1
  477. package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js +0 -3
  478. package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js.map +0 -1
  479. package/dist/core/web/public/next/assets/Workspace-DQXMVDf7.css +0 -1
  480. package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js +0 -10
  481. package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js.map +0 -1
  482. package/dist/core/web/public/next/assets/actions-Bszsdpms.js +0 -2
  483. package/dist/core/web/public/next/assets/actions-Bszsdpms.js.map +0 -1
  484. package/dist/core/web/public/next/assets/actions-Dug8YIf0.css +0 -1
  485. package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js +0 -2
  486. package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js.map +0 -1
  487. package/dist/core/web/public/next/assets/charts-D4NaLaXA.js +0 -2
  488. package/dist/core/web/public/next/assets/charts-D4NaLaXA.js.map +0 -1
  489. package/dist/core/web/public/next/assets/colors-B-vHsX1S.js +0 -2
  490. package/dist/core/web/public/next/assets/colors-B-vHsX1S.js.map +0 -1
  491. package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js +0 -2
  492. package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js.map +0 -1
  493. package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js +0 -2
  494. package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js.map +0 -1
  495. package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js +0 -2
  496. package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js.map +0 -1
  497. package/dist/core/web/public/next/assets/context.module-B_k02HNU.js +0 -2
  498. package/dist/core/web/public/next/assets/context.module-B_k02HNU.js.map +0 -1
  499. package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js +0 -2
  500. package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js.map +0 -1
  501. package/dist/core/web/public/next/assets/dock-panes-BNTLvX7G.js +0 -2
  502. package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js +0 -2
  503. package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js.map +0 -1
  504. package/dist/core/web/public/next/assets/format-BNYWGJat.js +0 -2
  505. package/dist/core/web/public/next/assets/format-BNYWGJat.js.map +0 -1
  506. package/dist/core/web/public/next/assets/global-DVgMguLr.js +0 -2
  507. package/dist/core/web/public/next/assets/global-DVgMguLr.js.map +0 -1
  508. package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js +0 -2
  509. package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js.map +0 -1
  510. package/dist/core/web/public/next/assets/mind-B-lYfSUJ.css +0 -1
  511. package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js +0 -2
  512. package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js.map +0 -1
  513. package/dist/core/web/public/next/assets/mutations-C6E10SPX.js +0 -2
  514. package/dist/core/web/public/next/assets/primitives-DQvYikjm.js +0 -1
  515. package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js +0 -2
  516. package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js.map +0 -1
  517. package/dist/core/web/public/next/assets/slots-W8gkmdfE.js +0 -3
  518. package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js +0 -2
  519. package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js.map +0 -1
  520. package/dist/core/web/public/next/assets/tasks-model-CnYQzgxk.js +0 -2
  521. package/dist/core/web/public/next/assets/types-Dypu22dp.js +0 -3
  522. package/dist/core/web/public/next/assets/types-Dypu22dp.js.map +0 -1
  523. package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js +0 -2
  524. package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js.map +0 -1
  525. package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js +0 -2
  526. package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js.map +0 -1
  527. package/dist/core/web/public/next/assets/useChartWidth-B8E5mJgM.css +0 -1
  528. package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js +0 -2
  529. package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js.map +0 -1
  530. package/dist/core/web/public/next/assets/verse-model-E98kXngO.js +0 -2
  531. package/dist/core/web/public/next/assets/verse-model-E98kXngO.js.map +0 -1
  532. package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js +0 -2
  533. package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js.map +0 -1
  534. package/dist/core/web/public/next/assets/verse-ui-store-KTTKfv-T.js +0 -3
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{D as r,P as i,a,h as o,it as s,l as c,m as l,ot as u,s as d,u as f}from"./global-DVgMguLr.js";import{n as p,t as m}from"./MutationTokenDialog-Dn0tzCrh.js";import{s as h,t as g,v as _}from"./workbench-types-DzN-5trg.js";import{s as v}from"./dock-store-_E5h6TEq.js";import{C as y}from"./verse-ui-store-KTTKfv-T.js";import{r as b,x}from"./verse-queries-BjQoOTwv.js";import{r as S}from"./section-visibility-CSrsTcwK.js";import{_ as C,a as w,o as ee,r as T,s as te,v as E,y as ne}from"./icons-DWb24OA6.js";import{p as re}from"./VerseConsoleApp-bjARLPwN.js";import{u as D}from"./capacity-strip-model-BR539Ci8.js";import{a as O,i as k,r as ie,t as ae}from"./CapacityStrip-D6Yyg4a1.js";import{a as oe,i as se,r as ce}from"./useSeatsRefresh-4Ov9eT1F.js";import{t as A}from"./Button-0-nNbv1h.js";import{n as le,t as ue}from"./use-token-gate-DYA2-ALC.js";import{o as de}from"./slots-W8gkmdfE.js";import{t as j}from"./Switch-BzRXtNPt.js";import{t as fe}from"./BudgetControl-P5lMxHvQ.js";import{t as M}from"./Select-Bl5g5Dt_.js";import{t as N}from"./Input-CTu0CycC.js";import{t as pe}from"./Sheet-CVjk-cLI.js";var P=n(e(),1),F={name:`name`,command:`command`,args:`args`,env:`env`,sourceRef:`sourceRef`},I={seatId:`seatId`,label:`label`,engine:`engine`,accountId:`accountId`,servers:`servers`,reason:`reason`,configFile:`configFile`,configFormat:`configFormat`,notes:`notes`},L={servers:`servers`,configured:`configured`,note:`note`},R={sampledAt:`sampledAt`,seats:`seats`,machine:`machine`,scope:`scope`,notes:`notes`},z={accountId:`accountId`,label:`label`,provider:`provider`,authentication:`authentication`,state:`state`,planType:`planType`,reason:`reason`,version:`version`,pinnedVersion:`pinnedVersion`,versionState:`versionState`,usageBlockedByPin:`usageBlockedByPin`,notes:`notes`},B={sampledAt:`sampledAt`,accounts:`accounts`,driftDetected:`driftDetected`,notes:`notes`},V={available:`available`,pinned:`pinned`,aliasRef:`aliasRef`,tenantRef:`tenantRef`,principalRef:`principalRef`,reason:`reason`};function H(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function U(e){return typeof e==`string`?e:null}function W(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function G(e){return e===!0}function K(e){let t=H(e);if(t===null)return null;let n=U(t[F.name]),r=U(t[F.command]);if(n===null||r===null)return null;let i=null,a=H(t[F.env]);if(a!==null){let e=Object.keys(a);if(e.length>0){i={};for(let t of e)i[t]=`<set>`}}return{name:n,command:r,args:W(t[F.args]),env:i,sourceRef:U(t[F.sourceRef])??`(unknown source)`}}function me(e){let t=H(e);if(t===null)return null;let n=U(t[I.seatId]);if(n===null)return null;let r=Array.isArray(t[I.servers])?t[I.servers].map(K).filter(e=>e!==null):[];return{seatId:n,label:U(t[I.label])??n,engine:U(t[I.engine])??`unknown`,accountId:U(t[I.accountId])??n,servers:r,reason:U(t[I.reason])??`unknown`,configFile:U(t[I.configFile]),configFormat:U(t[I.configFormat]),notes:W(t[I.notes])}}function he(e){let t=H(e);return t===null?null:{available:G(t[V.available]),pinned:G(t[V.pinned]),aliasRef:U(t[V.aliasRef]),tenantRef:U(t[V.tenantRef]),principalRef:U(t[V.principalRef]),reason:U(t[V.reason])??`unknown`}}function ge(e){let t=H(e);if(t===null||!Array.isArray(t[R.seats]))return null;let n=H(t[R.machine]),r=n!==null&&Array.isArray(n[L.servers])?n[L.servers].map(K).filter(e=>e!==null):[];return{sampledAt:U(t[R.sampledAt]),seats:t[R.seats].map(me).filter(e=>e!==null),machine:{servers:r,configured:n===null?r.length>0:G(n[L.configured]),note:(n===null?null:U(n[L.note]))??``},scope:he(t[R.scope]),notes:W(t[R.notes])}}function _e(e){let t=H(e);if(t===null)return null;let n=U(t[z.accountId]);return n===null?null:{accountId:n,label:U(t[z.label])??n,provider:U(t[z.provider])??`unknown`,authentication:U(t[z.authentication])??`unknown`,state:U(t[z.state])??`unknown`,planType:U(t[z.planType]),reason:U(t[z.reason])??`unknown`,version:U(t[z.version]),pinnedVersion:U(t[z.pinnedVersion]),versionState:U(t[z.versionState])??`unverified`,usageBlockedByPin:G(t[z.usageBlockedByPin]),notes:W(t[z.notes])}}function ve(e){let t=H(e);if(t===null||!Array.isArray(t[B.accounts]))return null;let n=t[B.accounts].map(_e).filter(e=>e!==null);return{sampledAt:U(t[B.sampledAt]),accounts:n,driftDetected:G(t[B.driftDetected])||n.some(e=>e.versionState===`drift`),notes:W(t[B.notes])}}var ye={"mcp-seat-isolated-by-adapter":`Verse launches every turn on this seat with an empty MCP configuration, so it loads no MCP servers at all — whatever is configured elsewhere on this machine.`,"mcp-account-config-absent":`This account has no MCP configuration file of its own, so it starts with none.`,"mcp-account-config-not-json":`This account keeps its MCP servers in a TOML config that the provider CLI reads directly. Hub does not parse or rewrite it, so it cannot list what is in there.`,"mcp-account-config-read":`Read from this account's own private configuration.`,"mcp-account-config-unreadable":`This account's configuration could not be read, so nothing here is a reading.`,"mcp-account-profile-unresolved":`This account's private profile could not be located, so Hub cannot say what it would load.`},be={"mcp-scope-locus-unavailable":`Locus is not reachable on this machine, so writes are not attributable to a tenant.`,"mcp-scope-unpinned":`Locus is running but nothing is pinned, so there is no tenant to scope a write to.`,"mcp-scope-seal-unverified":`Locus reports a pin whose seal did not verify. Fix the pin before writing anything.`,"mcp-scope-expired":`The Locus pin has expired.`,"mcp-scope-pinned":`Writes are attributed to the pinned Locus tenant shown here.`};function xe(e,t,n){return e[t]??n}var Se={ok:`success`,warn:`warning`,error:`danger`,off:`off`,unknown:`neutral`};function Ce(e){return Se[e]}var we=[`claude`,`codex`,`grok`,`local`];function Te(e){return we.includes(e)?e:null}function Ee(e){let t=e.replace(/\/+$/,``),n=t.lastIndexOf(`/`);return n===-1?t:t.slice(n+1)||t}function De(e){if(!e)return[];let t=[],n=new Set,r=(e,r)=>{typeof e!=`string`||e.length===0||n.has(e)||(n.add(e),t.push({path:e,name:r??Ee(e)}))},i=[...e.sessions].sort((e,t)=>Date.parse(t.updatedAt)-Date.parse(e.updatedAt));for(let e of i)r(e.projectPath);for(let t of e.projects)r(t.path,t.name);return t}function Oe(e){let t=[];for(let n of e){if(n.engine!==`local`)continue;let e=n.models[0]?.id??(n.id.startsWith(`local:`)?n.id.slice(6):null);e&&!t.includes(e)&&t.push(e)}return t}function ke(e,t){return t.via===`ollama`?e.ollamaLaunch?t.model?[...e.ollamaLaunch,`--model`,t.model]:[...e.ollamaLaunch]:null:e.actions.find(e=>e.kind===`launch`)?.command??null}function Ae(e){if(e.kind===`local`)return[];let t=[],n=e.connection,r=n!==null&&(n.connection===`signed-out`||n.connection===`expiring`||n.fixKind===`reauth`);return r&&t.push({kind:`reconnect`,label:`Reconnect`,command:null,primary:!0}),n!==null&&n.fixKind!==`reauth`&&n.fixKind!==`none`&&n.fixCommand!==null&&t.push({kind:`fix`,label:`Fix`,command:n.fixCommand,primary:!r}),t.push({kind:`edit-budget`,label:`Edit budget`,command:null,primary:!1}),t}function je(e){return e.seats.map(e=>{let t=Te(e.engine),n=e.reason===`mcp-seat-isolated-by-adapter`,r=e.servers.length;return{seatId:e.seatId,label:e.label,engine:t,monogram:t?g[t]:e.label.slice(0,1).toUpperCase(),servers:e.servers,loads:r>0?`loads ${r} server${r===1?``:`s`}`:n?`loads none — isolated by Verse`:`loads none`,isolated:n,sentence:xe(ye,e.reason,`Hub cannot say what this seat would load.`),reason:e.reason,notes:e.notes}})}function Me(e){let t=[{id:`hub`,label:`Hub gateway registry`,disabledReason:null}];for(let n of e?.seats??[]){if(n.seatId===`local`)continue;let e=n.configFormat===`toml`||n.reason===`mcp-account-config-not-json`;t.push({id:`account:${n.accountId}`,label:`${n.label} (${n.engine})`,disabledReason:e?`Keeps its MCP servers in TOML, which Hub does not rewrite.`:null})}return t}function Ne(e){let t=[],n=``,r=null,i=!1;for(let a of e){if(r){a===r?r=null:n+=a;continue}if(a===`"`||a===`'`){r=a,i=!0;continue}if(/\s/.test(a)){(i||n.length>0)&&t.push(n),n=``,i=!1;continue}n+=a}return(i||n.length>0)&&t.push(n),t}function Pe(e){let t={};for(let n of e.split(/\r?\n/)){let e=n.trim();if(e.length===0||e.startsWith(`#`))continue;let r=e.indexOf(`=`),i=r===-1?``:e.slice(0,r).trim();if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(i))return{ok:!1,error:`“${e.slice(0,40)}” is not KEY=value.`};t[i]=e.slice(r+1)}return{ok:!0,env:t}}var q=t();function Fe({tone:e,label:t}){return(0,q.jsxs)(`span`,{className:O.health,"data-tone":e,children:[(0,q.jsx)(`span`,{className:O.healthDot,"aria-hidden":`true`}),t]})}function J({id:e,name:t,monogram:n,engine:r,description:i,version:a,health:o,detail:s,aside:c,children:l}){return(0,q.jsxs)(`li`,{className:O.row,"data-app":e,children:[(0,q.jsx)(k,{monogram:n,engine:r}),(0,q.jsxs)(`div`,{className:O.rowMain,children:[(0,q.jsxs)(`div`,{className:O.rowHead,children:[(0,q.jsx)(`span`,{id:`${e}-name`,className:O.rowName,children:t}),a?(0,q.jsx)(`span`,{className:O.rowVersion,children:a}):null,(0,q.jsx)(Fe,{tone:o.tone,label:o.label})]}),(0,q.jsx)(`p`,{className:O.rowDesc,children:i}),s?(0,q.jsx)(`p`,{className:O.rowDetail,children:s}):null,l]}),c?(0,q.jsx)(`div`,{className:O.rowAside,children:c}):null]})}function Y({id:e,title:t,caveat:n,action:r,children:i,headingRef:a}){let o=`apps-group-${e}`;return(0,q.jsxs)(`section`,{className:O.group,"aria-labelledby":o,"data-group":e,children:[(0,q.jsxs)(`div`,{className:O.groupHead,children:[(0,q.jsx)(`h3`,{id:o,ref:a,tabIndex:-1,className:O.groupTitle,children:t}),r]}),n?(0,q.jsx)(`p`,{className:O.caveat,children:n}):null,(0,q.jsx)(`div`,{className:O.card,children:i})]})}var Ie=1200;async function Le(e){try{if(typeof navigator<`u`&&navigator.clipboard&&typeof navigator.clipboard.writeText==`function`)return await navigator.clipboard.writeText(e),!0}catch{}if(typeof document>`u`)return!1;let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n=!1;try{n=typeof document.execCommand==`function`&&document.execCommand(`copy`)}catch{n=!1}return t.remove(),n}function X({text:e,label:t,what:n}){let[r,i]=(0,P.useState)(`idle`),a=(0,P.useRef)(null);(0,P.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]);let o=async()=>{let t=await Le(e);i(t?`copied`:`failed`),a.current&&clearTimeout(a.current),a.current=setTimeout(()=>i(`idle`),Ie)};return(0,q.jsxs)(`span`,{className:O.pillWrap,children:[(0,q.jsxs)(`button`,{type:`button`,className:O.pill,"data-state":r,onClick:()=>void o(),"aria-label":`Copy ${n}: ${e}`,title:`Copy: ${e}`,children:[(0,q.jsx)(`code`,{className:O.pillText,children:t??e}),(0,q.jsx)(`span`,{className:O.pillIcon,"aria-hidden":`true`,children:r===`copied`?(0,q.jsx)(T,{size:14}):(0,q.jsx)(te,{size:14})})]}),(0,q.jsx)(`span`,{className:O.visuallyHidden,role:`status`,"aria-live":`polite`,children:r===`copied`?`Copied`:r===`failed`?`Copy failed — select the command and copy it yourself`:``})]})}var Z=D;function Re(e){return e.slotLanded??de(`terminal-pane`)?e.terminalAvailable===!0?e.activeSessionId===null?{available:!1,reason:`Open a chat first — its terminal hosts the agent.`}:{available:!0,reason:null}:{available:!1,reason:e.terminalReason??`The Verse terminal needs the desktop app.`}:{available:!1,reason:`This build has no Verse terminal yet.`}}function ze(e,t){t.via===`native`&&t.model===null?v({newTab:!0,appId:e}):v({newTab:!0,appId:e,via:`ollama`,...t.model===null?{}:{model:t.model}}),y(`chat`)}function Be({seats:e,health:t,budget:n,loading:r,reconnecting:i,onReconnect:a}){let[o,s]=(0,P.useState)(null),[c,l]=(0,P.useState)(!1),u=(0,P.useId)(),d=(0,P.useId)(),f=(0,P.useRef)(null);return(0,q.jsxs)(Y,{id:`accounts`,title:`Accounts`,caveat:`What each seat has left, when it resets, and how much autonomy leaves for you.`,children:[r?(0,q.jsx)(`p`,{className:O.loadingLine,"aria-busy":`true`,children:`Reading seats…`}):(0,q.jsx)(ae,{seats:e,health:t,budget:n,labelledBy:`apps-group-accounts`,renderActions:e=>Ae(e).map(t=>(0,q.jsx)(A,{size:`sm`,variant:t.primary&&t.kind!==`edit-budget`?`primary`:`ghost`,busy:t.kind===`reconnect`&&i===e.seatId,"aria-label":`${t.label}: ${e.label}`,onClick:()=>{t.kind===`reconnect`?a(e):t.kind===`fix`?s(e):l(!0)},children:t.label},t.kind))}),o!==null&&o.connection?.fixCommand?(0,q.jsx)(p,{open:!0,onClose:()=>s(null),titleId:u,title:`Fix ${o.label}`,description:o.connection.word,initialFocusRef:f,children:(0,q.jsxs)(`div`,{className:O.dialogBody,children:[o.connection.reasons.map(e=>(0,q.jsx)(`p`,{children:e},e)),(0,q.jsxs)(`div`,{className:O.commandBlock,children:[(0,q.jsx)(`span`,{className:O.commandLabel,children:`Run this in a terminal`}),(0,q.jsx)(X,{text:Z(o.connection.fixCommand),what:`the fix for ${o.label}`})]}),(0,q.jsx)(`p`,{children:`Verse shows the command and never runs it for you: it changes which CLI this seat is pinned to.`}),(0,q.jsx)(`div`,{className:O.dialogActions,children:(0,q.jsx)(A,{ref:f,variant:`subtle`,onClick:()=>s(null),children:`Done`})})]})}):null,(0,q.jsx)(pe,{open:c,onClose:()=>l(!1),titleId:d,title:`Budget`,description:`How much of each seat autonomy may use, and how much is kept for you.`,width:560,children:c?(0,q.jsx)(fe,{}):null})]})}var Ve=`verse-apps`,He=`verse-terminal-status`;async function Ue(e,t){try{return{available:!0,data:await c(e,t)}}catch(e){if(e instanceof d&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return e instanceof d&&e.status===404?{available:!1,reason:`This server is older than Apps & Accounts, so desktop, terminal and local rows are not available.`}:{available:!1,reason:e instanceof d?`The apps check answered HTTP ${e.status}.`:`The apps check could not be reached.`}}}var Q={key:Ve,fetch:e=>Ue(h,e)},We={key:He,fetch:e=>Ue(_,e)};async function Ge(e,t){let n=r();if(!n)throw new b;let a=await f(e,t,n);return i(),a}async function Ke(){let e=await Ge(`${h}/refresh`,{});return await u(Ve,ce(()=>Promise.resolve({available:!0,data:e}),()=>Q.fetch()),!0),e}async function qe(e,t){let n=await Ge(`${h}/${encodeURIComponent(e)}/toggle`,{enabled:t,confirm:!0});return u(Ve,()=>Q.fetch(),!0),n}function Je(e,t){return Ge(`${h}/${encodeURIComponent(e)}/launch`,{root:t.root,...t.via?{via:t.via}:{},...t.model?{model:t.model}:{}})}function Ye({row:e,enable:t,busy:n,error:r,onCancel:i,onConfirm:a}){let o=(0,P.useId)(),s=(0,P.useRef)(null);if(e===null||e.toggle===null)return null;let c=t?e.toggle.command:e.toggle.restoreCommand,l=t?e.toggle.restoreCommand:e.toggle.command,u=t?`Turn on “${e.description}”?`:`Restore ${e.name}?`;return(0,q.jsx)(p,{open:!0,onClose:i,titleId:o,title:u,initialFocusRef:s,description:t?`This changes ${e.name}’s own settings until you restore it.`:`This puts ${e.name} back on its own defaults.`,children:(0,q.jsxs)(`div`,{className:O.dialogBody,children:[e.detail?(0,q.jsx)(`p`,{children:e.detail}):null,t&&e.id===`claude-desktop`?(0,q.jsx)(`p`,{children:`Recommended: leave this off. Claude Desktop would run local models instead of its own, and Verse’s local seats already use Ollama.`}):null,(0,q.jsxs)(`div`,{className:O.commandBlock,children:[(0,q.jsx)(`span`,{className:O.commandLabel,children:`Runs`}),(0,q.jsx)(X,{text:Z(c),what:`the command this runs`})]}),(0,q.jsxs)(`div`,{className:O.commandBlock,children:[(0,q.jsx)(`span`,{className:O.commandLabel,children:t?`Undo later with`:`Turn back on with`}),(0,q.jsx)(X,{text:Z(l),what:t?`the restore command`:`the command that turns it on`})]}),(0,q.jsx)(`p`,{children:`It opens in a Terminal window so you can answer its prompts. Verse does not answer them for you, and nothing changes until you do.`}),r?(0,q.jsx)(`p`,{className:O.error,role:`alert`,children:r}):null,(0,q.jsxs)(`div`,{className:O.dialogActions,children:[(0,q.jsx)(A,{ref:s,variant:`subtle`,onClick:i,children:`Cancel`}),(0,q.jsx)(A,{variant:t?`danger`:`primary`,busy:n,onClick:a,children:t?`Open in Terminal`:`Restore in Terminal`})]})]})})}function Xe({row:e,projects:t,models:n,inVerse:r,busy:i,error:a,onCancel:o,onLaunch:s}){let c=(0,P.useId)(),l=(0,P.useRef)(null),[u,d]=(0,P.useState)(`native`),[f,m]=(0,P.useState)(``),[h,g]=(0,P.useState)(t[0]?.path??``);(0,P.useEffect)(()=>{d(`native`),m(``),g(t[0]?.path??``)},[e?.id]);let _={via:u,model:u===`ollama`&&f!==``?f:null},v=(0,P.useMemo)(()=>e?ke(e,_):null,[e,_.via,_.model]);if(e===null)return null;let y=ke(e,{via:`native`,model:null}),b=e.ollamaLaunch,x=`${c}-via`,S=h!==``;return(0,q.jsx)(p,{open:!0,onClose:o,titleId:c,title:`Launch ${e.name}`,description:`Nothing starts until you choose where.`,initialFocusRef:l,children:(0,q.jsxs)(`div`,{className:O.dialogBody,children:[(0,q.jsxs)(`fieldset`,{className:O.fieldset,children:[(0,q.jsx)(`legend`,{className:O.legend,children:`Run`}),y?(0,q.jsxs)(`label`,{className:O.radio,children:[(0,q.jsx)(`input`,{ref:l,type:`radio`,name:x,checked:u===`native`,onChange:()=>d(`native`)}),(0,q.jsx)(`code`,{className:O.inlineCode,children:Z(y)}),(0,q.jsx)(`span`,{className:O.hint,children:`its own command`})]}):null,b?(0,q.jsxs)(`label`,{className:O.radio,children:[(0,q.jsx)(`input`,{type:`radio`,name:x,checked:u===`ollama`,onChange:()=>d(`ollama`)}),(0,q.jsx)(`code`,{className:O.inlineCode,children:Z(b)}),(0,q.jsx)(`span`,{className:O.hint,children:`through Ollama`})]}):null]}),u===`ollama`?n.length>0?(0,q.jsxs)(M,{label:`Local model`,value:f,onChange:e=>m(e.target.value),children:[(0,q.jsx)(`option`,{value:``,children:`Ollama’s default`}),n.map(e=>(0,q.jsx)(`option`,{value:e,children:e},e))]}):(0,q.jsx)(`p`,{className:O.hint,children:`No local models are known to Verse, so Ollama will ask which to use.`}):null,(0,q.jsxs)(M,{label:`Folder (Terminal.app)`,value:h,onChange:e=>g(e.target.value),hint:t.length===0?`No chat folders or enrolled projects yet.`:`A Verse tab opens in the chat you have open.`,disabled:t.length===0,children:[t.length===0?(0,q.jsx)(`option`,{value:``,children:`—`}):null,t.map(e=>(0,q.jsx)(`option`,{value:e.path,children:e.name},e.path))]}),v?(0,q.jsxs)(`div`,{className:O.commandBlock,children:[(0,q.jsx)(`span`,{className:O.commandLabel,children:`Command`}),(0,q.jsx)(X,{text:Z(v),what:`the ${e.name} launch command`})]}):null,u===`ollama`&&r.available?(0,q.jsx)(`p`,{className:O.hint,children:`In a Verse tab this runs exactly the command above — Verse builds it from what is installed, never from this page.`}):null,!r.available&&r.reason?(0,q.jsxs)(`p`,{className:O.hint,children:[`Verse terminal: `,r.reason]}):null,a?(0,q.jsx)(`p`,{className:O.error,role:`alert`,children:a}):null,(0,q.jsxs)(`div`,{className:O.dialogActions,children:[(0,q.jsx)(A,{variant:`ghost`,onClick:o,children:`Cancel`}),(0,q.jsx)(A,{variant:r.available?`subtle`:`primary`,busy:i,disabled:!S||v===null,onClick:()=>v&&s({choice:_,target:`terminal-app`,root:h,command:v}),children:`Open in Terminal.app`}),r.available?(0,q.jsx)(A,{variant:`primary`,disabled:v===null,onClick:()=>v&&s({choice:_,target:`verse`,root:null,command:v}),children:`Open in Verse terminal`}):null]})]})})}var $={section:`_section_mum7s_11`,body:`_body_mum7s_19`,panel:`_panel_mum7s_29`,panelHead:`_panelHead_mum7s_35`,panelTitle:`_panelTitle_mum7s_43`,panelNote:`_panelNote_mum7s_51`,muted:`_muted_mum7s_52`,alert:`_alert_mum7s_61`,alertTitle:`_alertTitle_mum7s_72`,seatList:`_seatList_mum7s_78`,rowList:`_rowList_mum7s_79`,seatRow:`_seatRow_mum7s_85`,healthRow:`_healthRow_mum7s_86`,seatHead:`_seatHead_mum7s_94`,seatLabel:`_seatLabel_mum7s_101`,engineTag:`_engineTag_mum7s_106`,code:`_code_mum7s_107`,count:`_count_mum7s_118`,disclosure:`_disclosure_mum7s_124`,commandLine:`_commandLine_mum7s_134`,envList:`_envList_mum7s_143`,envItem:`_envItem_mum7s_152`,warnList:`_warnList_mum7s_161`,digest:`_digest_mum7s_171`,actions:`_actions_mum7s_178`};function Ze({server:e,heading:t}){let n=e.env===null?[]:Object.keys(e.env);return(0,q.jsxs)(`div`,{className:$.disclosure,children:[t===void 0?null:(0,q.jsx)(`p`,{className:$.alertTitle,children:t}),(0,q.jsxs)(`p`,{className:$.commandLine,children:[e.command,e.args.length>0?` ${e.args.join(` `)}`:``]}),n.length===0?(0,q.jsx)(`p`,{className:$.muted,children:`No environment variables are passed to this server.`}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`p`,{className:$.muted,children:[n.length,` environment variable`,n.length===1?``:`s`,` passed to this server. Values are never displayed.`]}),(0,q.jsx)(`ul`,{className:$.envList,children:n.map(e=>(0,q.jsxs)(`li`,{className:$.envItem,children:[e,`=<set>`]},e))})]}),(0,q.jsxs)(`p`,{className:$.code,children:[`configured in `,e.sourceRef]})]})}var Qe=`verse-mcp-snapshot`,$e=`verse-mcp-cli-health`;function et(e,t){return t instanceof d?t.status===404?`This server does not expose ${e}, so this panel has no source.`:`${e} answered HTTP ${t.status}.`:`${e} could not be reached.`}function tt(e){return async t=>{try{return{raw:await c(e,t),available:!0,reason:null}}catch(t){if(t instanceof d&&t.status===401||t instanceof DOMException&&t.name===`AbortError`)throw t;return{raw:null,available:!1,reason:et(e,t)}}}}var nt={key:Qe,fetch:tt(`/api/verse/mcp`)},rt={key:$e,fetch:tt(`/api/verse/mcp/cli-health`)},it=class extends Error{constructor(){super(`Unlock actions with the mutation token before changing MCP configuration.`),this.name=`McpLockedError`}};async function at(e,t){let n=r();if(!n)throw new it;let a=await f(e,t,n);return i(),a}function ot(e,t){return at(`/api/verse/mcp/proposal`,{target:e,server:t})}async function st(e,t,n){let r=await at(`/api/verse/mcp/apply`,{target:e,server:t,digest:n,confirm:!0});return s(Qe),r}function ct({row:e}){let[t,n]=(0,P.useState)(!1),r=(0,P.useId)(),i=e.servers.length>0;return(0,q.jsxs)(J,{id:`mcp-${e.seatId}`,name:e.label,monogram:e.monogram,engine:e.engine,description:e.sentence,health:{tone:i?`success`:`off`,label:e.loads},aside:i?(0,q.jsx)(A,{variant:`ghost`,size:`sm`,"aria-expanded":t,"aria-controls":r,icon:t?(0,q.jsx)(w,{size:14}):(0,q.jsx)(ee,{size:14}),onClick:()=>n(e=>!e),children:t?`Hide servers`:`Show servers`}):null,children:[(0,q.jsx)(`span`,{className:O.reasonCode,children:e.reason}),i&&t?(0,q.jsx)(`div`,{id:r,className:O.servers,children:e.servers.map(e=>(0,q.jsx)(Ze,{server:e,heading:e.name},e.name))}):null]})}function lt(e){if(typeof e!=`object`||!e)return null;let t=e,n=K(t.server),r=t.target;return!n||typeof t.digest!=`string`||!r?null:{server:n,targetRef:typeof r.ref==`string`?r.ref:``,targetLabel:typeof r.label==`string`?r.label:``,action:t.action===`replace`?`replace`:`add`,replaces:K(t.replaces),warnings:Array.isArray(t.warnings)?t.warnings.filter(e=>typeof e==`string`):[],note:typeof t.note==`string`?t.note:``,digest:t.digest}}function ut(e){return e instanceof d?e.detail??`The server refused (HTTP ${e.status}).`:e instanceof Error&&e.name===`VerseMutationLockedError`?`Unlock actions with the mutation token first.`:`The request could not be completed.`}function dt({open:e,snapshot:t,run:n,onClose:r,onAdded:i}){let a=(0,P.useId)(),o=Me(t),[s,c]=(0,P.useState)(`hub`),[l,u]=(0,P.useState)(``),[d,f]=(0,P.useState)(``),[p,m]=(0,P.useState)(``),[h,g]=(0,P.useState)(``),[_,v]=(0,P.useState)(null),[y,b]=(0,P.useState)(!1),[x,S]=(0,P.useState)(null),C=()=>{S(null),v(null),b(!1)},w=async e=>{e.preventDefault(),v(null);let t=Pe(h);if(!t.ok){v(t.error);return}let r={name:l.trim(),command:d.trim(),args:Ne(p),...Object.keys(t.env).length>0?{env:t.env}:{}};b(!0);try{let e=await n(`Review an MCP server before adding it`,()=>ot(s,r));if(e===null)return;let t=lt(e);t?S({input:r,target:s,value:t}):v(`The server answered with something that is not a proposal.`)}catch(e){v(ut(e))}finally{b(!1)}},ee=async()=>{if(x){b(!0),v(null);try{if(await n(`Add an MCP server`,()=>st(x.target,x.input,x.value.digest))===null)return;i(`${x.value.action===`replace`?`Replaced`:`Added`} ${x.value.server.name} in ${x.value.targetRef}.`),u(``),f(``),m(``),g(``),C(),r()}catch(e){v(ut(e))}finally{b(!1)}}},T=o.find(e=>e.id===s);return(0,q.jsx)(pe,{open:e,onClose:()=>{C(),r()},titleId:a,title:x?`Review before adding`:`Add an MCP server`,description:`An MCP server is a program that runs with the agent’s permissions. Nothing is written until you confirm what you read.`,width:520,children:x===null?(0,q.jsxs)(`form`,{className:O.dialogBody,onSubmit:e=>void w(e),children:[(0,q.jsx)(M,{label:`Add to`,value:s,onChange:e=>c(e.target.value),hint:T?.disabledReason??(s===`hub`?`The hub’s own registry.`:`A Verse chat on a Claude seat still loads none; Claude Code in a terminal does.`),children:o.map(e=>(0,q.jsx)(`option`,{value:e.id,disabled:e.disabledReason!==null,children:e.label},e.id))}),(0,q.jsx)(N,{label:`Name`,value:l,onChange:e=>u(e.target.value),required:!0,placeholder:`filesystem`,autoComplete:`off`}),(0,q.jsx)(N,{label:`Command`,value:d,onChange:e=>f(e.target.value),required:!0,placeholder:`/opt/homebrew/bin/npx`,autoComplete:`off`,hint:`An absolute path is safest; a bare name is looked up on PATH when the server starts.`}),(0,q.jsx)(N,{label:`Arguments`,value:p,onChange:e=>m(e.target.value),placeholder:`-y @modelcontextprotocol/server-filesystem "~/code"`,autoComplete:`off`}),(0,q.jsxs)(`label`,{className:O.fieldLabel,children:[`Environment `,(0,q.jsx)(`span`,{className:O.hint,children:`One KEY=value per line. Values are sent once and never shown again.`}),(0,q.jsx)(`textarea`,{className:O.textarea,value:h,onChange:e=>g(e.target.value),spellCheck:!1,autoComplete:`off`})]}),_?(0,q.jsx)(`p`,{className:O.error,role:`alert`,children:_}):null,(0,q.jsxs)(`div`,{className:O.dialogActions,children:[(0,q.jsx)(A,{type:`button`,variant:`ghost`,onClick:r,children:`Cancel`}),(0,q.jsx)(A,{type:`submit`,variant:`primary`,busy:y,disabled:l.trim()===``||d.trim()===``||T?.disabledReason!=null,children:`Review`})]})]}):(0,q.jsxs)(`div`,{className:O.dialogBody,children:[(0,q.jsxs)(`p`,{children:[x.value.action===`replace`?`Replaces`:`Adds`,` `,(0,q.jsx)(`strong`,{children:x.value.server.name}),` in`,` `,(0,q.jsx)(`code`,{className:O.inlineCode,children:x.value.targetRef}),x.value.targetLabel?` (${x.value.targetLabel})`:``,`.`]}),(0,q.jsx)(Ze,{server:x.value.server,heading:`This will run`}),x.value.replaces?(0,q.jsx)(Ze,{server:x.value.replaces,heading:`Replacing`}):null,x.value.warnings.length>0?(0,q.jsx)(`ul`,{className:O.warnings,children:x.value.warnings.map(e=>(0,q.jsx)(`li`,{children:e},e))}):null,x.value.note?(0,q.jsx)(`p`,{className:O.hint,children:x.value.note}):null,_?(0,q.jsx)(`p`,{className:O.error,role:`alert`,children:_}):null,(0,q.jsxs)(`div`,{className:O.dialogActions,children:[(0,q.jsx)(A,{variant:`ghost`,onClick:()=>S(null),children:`Back`}),(0,q.jsx)(A,{variant:`primary`,busy:y,onClick:()=>void ee(),children:x.value.action===`replace`?`Replace server`:`Add server`})]})]})})}function ft({snapshot:e,cliHealth:t,unavailable:n,loading:r,run:i,onAdded:a,headingRef:o}){let[s,c]=(0,P.useState)(!1),l=e?je(e):[];return(0,q.jsxs)(Y,{id:`mcp-servers`,title:`MCP servers`,headingRef:o,action:(0,q.jsx)(A,{variant:`subtle`,size:`sm`,icon:(0,q.jsx)(E,{size:14}),onClick:()=>c(!0),"aria-haspopup":`dialog`,children:`Add server`}),caveat:(0,q.jsxs)(q.Fragment,{children:[`Claude and local seats load no MCP servers: Verse starts them with`,` `,(0,q.jsx)(`code`,{children:`--strict-mcp-config`}),` and an empty `,(0,q.jsx)(`code`,{children:`--mcp-config`}),`. Codex and Grok seats load their own account’s config — and an `,(0,q.jsx)(`code`,{children:`ashlr__`}),` write through one is refused on a folder that is not enrolled.`]}),children:[e!==null&&e.notes.length>0?(0,q.jsxs)(`div`,{className:O.loadingLine,role:`note`,children:[(0,q.jsx)(`strong`,{children:`Configured, but unused.`}),` `,e.notes.join(` `),` `,e.machine.note]}):null,t!==null&&t.driftDetected?(0,q.jsxs)(`div`,{className:O.loadingLine,role:`alert`,children:[(0,q.jsx)(`strong`,{children:`CLI version drift.`}),` `,t.notes.join(` `),` `,t.accounts.filter(e=>e.versionState===`drift`).map(e=>`${e.label}: ${e.version??`unread`}, pinned ${e.pinnedVersion??`—`}.`).join(` `)]}):null,e===null?(0,q.jsx)(`p`,{className:O.loadingLine,"aria-busy":r||void 0,children:r?`Reading each seat’s configuration…`:n??`No per-seat reading is available.`}):(0,q.jsx)(`ul`,{className:O.rows,children:l.map(e=>(0,q.jsx)(ct,{row:e},e.seatId))}),e?.scope?(0,q.jsxs)(`p`,{className:O.scopeLine,children:[`Scope: `,xe(be,e.scope.reason,`Locus did not report a usable scope.`),e.scope.tenantRef?` (${e.scope.tenantRef})`:``]}):null,(0,q.jsx)(dt,{open:s,snapshot:e,run:i,onClose:()=>c(!1),onAdded:a})]})}function pt(e){return{tone:Ce(e.health.state),label:e.health.label}}function mt({group:e,onToggle:t,onRestore:n}){return(0,q.jsx)(Y,{id:e.id,title:e.title,caveat:e.caveat,children:(0,q.jsx)(`ul`,{className:O.rows,children:e.apps.map(e=>{let r=e.actions.find(e=>e.kind===`restore`)??null;return(0,q.jsx)(J,{id:`app-${e.id}`,name:e.name,monogram:e.monogram,engine:e.engine,description:e.description,health:pt(e),detail:e.toggle===null?e.detail:null,aside:e.toggle===null?null:(0,q.jsxs)(q.Fragment,{children:[r?(0,q.jsx)(A,{variant:`ghost`,size:`sm`,onClick:()=>n(e),disabled:r.disabledReason!==null,title:Z(r.command??[]),children:r.label}):null,(0,q.jsx)(j,{checked:e.toggle.enabled,onChange:n=>t(e,n),"aria-label":`${e.description}: ${e.toggle.enabled?`on`:`off`}`,"aria-describedby":`app-${e.id}-name`})]})},e.id)})})})}function ht({group:e,quickLaunchReason:t,onQuickLaunch:n,onLaunchOptions:r}){return(0,q.jsx)(Y,{id:e.id,title:e.title,caveat:e.caveat,children:(0,q.jsx)(`ul`,{className:O.rows,children:e.apps.map(e=>{let i=e.actions.find(e=>e.kind===`launch`)??null,a=i?.disabledReason??t;return(0,q.jsx)(J,{id:`app-${e.id}`,name:e.name,monogram:e.monogram,engine:e.engine,description:e.description,version:e.version,health:pt(e),detail:e.detail,aside:(0,q.jsxs)(q.Fragment,{children:[e.copy&&e.installed?(0,q.jsx)(X,{text:e.copy.text,label:e.copy.label,what:`the ${e.name} command`}):null,e.ollamaLaunch?(0,q.jsx)(X,{text:Z(e.ollamaLaunch),what:`the Ollama launch command for ${e.name}`}):null,i?i.disabledReason===null?(0,q.jsxs)(`span`,{className:O.split,children:[(0,q.jsx)(A,{variant:`subtle`,size:`sm`,icon:(0,q.jsx)(C,{size:14}),disabled:a!==null,title:a??void 0,onClick:()=>n(e),"aria-label":`Launch ${e.name}`,children:`Launch`}),(0,q.jsx)(A,{variant:`subtle`,size:`sm`,iconOnly:!0,icon:(0,q.jsx)(w,{size:14}),"aria-label":`Launch options for ${e.name}`,"aria-haspopup":`dialog`,onClick:()=>r(e)})]}):(0,q.jsx)(`span`,{className:O.disabledNote,children:i.disabledReason}):null]})},e.id)})})})}function gt({group:e}){return(0,q.jsx)(Y,{id:e.id,title:e.title,caveat:e.caveat,children:(0,q.jsx)(`ul`,{className:O.rows,children:e.apps.map(e=>(0,q.jsx)(J,{id:`app-${e.id}`,name:e.name,monogram:e.monogram,engine:e.engine,description:e.description,version:e.version,health:pt(e),detail:e.detail},e.id))})})}var _t=6e4;function vt(e,t){let n=Date.parse(e);if(!Number.isFinite(n))return`not checked`;let r=Math.max(0,Math.round((t-n)/6e4));return r<1?`checked just now`:r<120?`checked ${r} min ago`:`checked ${Math.round(r/60)} h ago`}function yt({focusGroup:e}={}){let t=l(Q),n=o(Q);S(n,_t);let r=l(We),i=l(nt),s=l(rt),c=o(nt),u=l(x),d=ie(),f=re(),p=le(),[h,g]=(0,P.useState)(null),[_,v]=(0,P.useState)(!1),[y,b]=(0,P.useState)(null),[C,w]=(0,P.useState)(null),[ee,T]=(0,P.useState)(!1),[te,E]=(0,P.useState)(null),[D,k]=(0,P.useState)(null),[ae,ce]=(0,P.useState)(!1),[de,j]=(0,P.useState)(null),[fe,M]=(0,P.useState)(()=>Date.now());S(()=>M(Date.now()),3e4);let N=(0,P.useRef)(null);(0,P.useEffect)(()=>{if(e!==`mcp-servers`)return;let t=N.current;t&&(typeof t.scrollIntoView==`function`&&t.scrollIntoView({block:`start`}),t.focus({preventScroll:!0}))},[e]);let pe=u.data,F=De(pe),I=Oe(d.seats),L=Re({terminalAvailable:r.data?.available?r.data.data.available:!r.data&&null,terminalReason:r.data?.available?r.data.data.reason:null,activeSessionId:f.activeSessionId}),R=t.data?.available?t.data.data:null,z=e=>R?.groups.find(t=>t.id===e)??null,B=i.data?.available?ge(i.data.raw):null,V=s.data?.available?ve(s.data.raw):null,H=(0,P.useCallback)((e,t=`neutral`)=>g({text:e,tone:t}),[]),U=async()=>{v(!0);try{await p.run(`Check every app and seat again`,async()=>(await Promise.all([Ke(),oe().catch(()=>null)]),c(),!0))&&(M(Date.now()),H(`Checked again.`))}catch(e){H(ue(e),`danger`)}finally{v(!1)}},W=async e=>{b(e.seatId);try{await p.run(`Open the sign-in for ${e.label} in Terminal`,async()=>(await se(e.seatId),!0))&&H(`Opened the sign-in for ${e.label} in Terminal. Finish it there; this page picks it up.`)}catch(e){H(ue(e),`danger`)}finally{b(null)}},G=async()=>{if(C){T(!0),E(null);try{let e=await p.run(`${C.enable?`Switch on`:`Restore`} ${C.row.name}`,()=>qe(C.row.id,C.enable));e&&(H(`Opened “${e.command.join(` `)}” in Terminal. Answer its prompts there.`),w(null))}catch(e){E(ue(e))}finally{T(!1)}}},K=async(e,t)=>{if(t.target===`verse`){ze(e.id,t.choice),k(null);return}if(t.root!==null){ce(!0),j(null);try{await p.run(`Launch ${e.name} in Terminal`,()=>Je(e.id,{root:t.root,via:t.choice.via,model:t.choice.model}))&&(H(`Opened ${e.name} in Terminal.`),k(null))}catch(e){let t=ue(e);D?j(t):H(t,`danger`)}finally{ce(!1)}}},me=L.available||F.length>0?null:`Open a chat or enrol a project first.`,he=e=>{let t={via:`native`,model:null},n=e.actions.find(e=>e.kind===`launch`)?.command??null;n&&K(e,{choice:t,target:L.available?`verse`:`terminal-app`,root:F[0]?.path??null,command:n})},_e=t.data===void 0&&(t.status===`loading`||t.status===`idle`);return(0,q.jsxs)(`section`,{className:O.section,"aria-label":`Apps & Accounts`,children:[(0,q.jsx)(`div`,{className:O.scroll,children:(0,q.jsxs)(`div`,{className:O.page,children:[(0,q.jsxs)(`header`,{className:O.header,children:[(0,q.jsxs)(`div`,{className:O.headerText,children:[(0,q.jsx)(`h2`,{className:O.title,children:`Apps & Accounts`}),(0,q.jsx)(`p`,{className:O.lede,children:`Everything Verse can run with on this Mac, and whether it is ready.`})]}),(0,q.jsxs)(`div`,{className:O.headerMeta,children:[R?(0,q.jsxs)(`span`,{children:[vt(R.checkedAt,fe),R.pathSource===`fallback`?` · PATH from known folders (your login shell did not answer)`:``]}):null,(0,q.jsx)(A,{variant:`ghost`,size:`sm`,icon:(0,q.jsx)(ne,{size:14}),busy:_,onClick:()=>void U(),children:`Check again`})]})]}),(0,q.jsx)(`p`,{className:h?O.banner:O.visuallyHidden,"data-tone":h?.tone,role:`status`,"aria-live":`polite`,children:h?.text??``}),(0,q.jsx)(Be,{seats:d.seats,health:d.health,budget:d.budget,loading:d.loading,reconnecting:y,onReconnect:e=>void W(e)}),t.data&&!t.data.available?(0,q.jsx)(`p`,{className:O.banner,children:t.data.reason}):_e?(0,q.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Checking apps`,children:[(0,q.jsx)(a,{width:`30%`}),(0,q.jsx)(a,{width:`80%`}),(0,q.jsx)(a,{width:`70%`})]}):(0,q.jsxs)(q.Fragment,{children:[z(`desktop`)?(0,q.jsx)(mt,{group:z(`desktop`),onToggle:(e,t)=>{E(null),w({row:e,enable:t})},onRestore:e=>{E(null),w({row:e,enable:!1})}}):null,z(`terminal-agents`)?(0,q.jsx)(ht,{group:z(`terminal-agents`),quickLaunchReason:me,onQuickLaunch:he,onLaunchOptions:e=>{j(null),k(e)}}):null,z(`local-models`)?(0,q.jsx)(gt,{group:z(`local-models`)}):null]}),(0,q.jsx)(ft,{snapshot:B,cliHealth:V,unavailable:i.data&&!i.data.available?i.data.reason:null,loading:i.data===void 0,run:p.run,onAdded:e=>{H(e),c()},headingRef:N})]})}),(0,q.jsx)(Ye,{row:C?.row??null,enable:C?.enable??!1,busy:ee,error:te,onCancel:()=>w(null),onConfirm:()=>void G()}),(0,q.jsx)(Xe,{row:D,projects:F,models:I,inVerse:L,busy:ae,error:de,onCancel:()=>k(null),onLaunch:e=>{D&&K(D,e)}}),(0,q.jsx)(m,{open:p.dialog.open,reason:p.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:p.dialog.onClose,onUnlocked:p.dialog.onUnlocked})]})}export{_t as APPS_POLL_MS,yt as AppsSection};
2
- //# sourceMappingURL=AppsSection-CXxbfPJQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AppsSection-CXxbfPJQ.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 / 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 { 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' | '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/**\n * What a seat row offers. Reconnect when the seat is signed out or its\n * sign-in is expiring (the provider's own login, in Terminal); Fix when A2\n * has a command for what is wrong (a re-pin); Edit budget for every paid seat.\n * Local rows need none of these.\n */\nexport function accountActions(row: CapacityRow): AccountAction[] {\n if (row.kind === 'local') return [];\n const out: AccountAction[] = [];\n const c = row.connection;\n const needsLogin = 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 if (c !== null && c.fixKind !== 'reauth' && c.fixKind !== 'none' && c.fixCommand !== null) {\n out.push({ kind: 'fix', label: 'Fix', command: c.fixCommand, primary: !needsLogin });\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 — plus the one thing\n * each seat needs from you:\n *\n * Reconnect the provider's own sign-in, opened in Terminal by the health\n * route (Verse never sees a credential);\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 { 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 { CapacityStrip } from '../usage/CapacityStrip.js';\nimport 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 function AccountsGroup({\n seats,\n health,\n budget,\n loading,\n reconnecting,\n onReconnect,\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}) {\n const [fixing, setFixing] = useState<CapacityRow | null>(null);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const fixTitle = useId();\n const sheetTitle = useId();\n const closeRef = useRef<HTMLButtonElement>(null);\n\n return (\n <AppGroup\n id=\"accounts\"\n title=\"Accounts\"\n caveat=\"What each seat has left, when it resets, and how much autonomy leaves for you.\"\n >\n {loading ? (\n <p className={styles.loadingLine} aria-busy=\"true\">Reading seats…</p>\n ) : (\n <CapacityStrip\n seats={seats}\n health={health}\n budget={budget}\n labelledBy=\"apps-group-accounts\"\n renderActions={(row) =>\n accountActions(row).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}\n aria-label={`${action.label}: ${row.label}`}\n onClick={() => {\n if (action.kind === 'reconnect') onReconnect(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 {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 </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 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":"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"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{A as r,C as i,E as a,T as ee,_ as o,b as s,c as te,h as c,l,n as u,t as d,u as ne,v as f,w as p,y as re}from"./useChartWidth-MEXvDxDL.js";import{g as ie}from"./colors-B-vHsX1S.js";var m=n(e(),1),h=t(),g=12,_=26,ae=12,v=6.6,y=120;function b({title:e,description:t,caveat:n,status:b,series:x,stacked:S=!1,height:C=200,width:oe,formatX:w=r,formatY:T=a,threshold:E,ariaLabel:D}){let O=(0,m.useRef)(null),k=d(O,oe),[A,j]=(0,m.useState)(null),M=(0,m.useId)(),N=x.map((e,t)=>e.color??ie(t)),P=(0,m.useMemo)(()=>{let e=Array.from(new Set(x.flatMap(e=>e.points.map(e=>e.x)))).sort((e,t)=>e-t),t=x.map(e=>new Map(e.points.map(e=>[e.x,e.y])));return e.map(e=>{let n=t.map(t=>t.has(e)?t.get(e):null);return{x:e,values:n,total:n.some(e=>e===null)?null:n.reduce((e,t)=>e+(t??0),0)}})},[x]),F=P.some(e=>e.values.some(e=>e!==null)),I=b??(F?{kind:`ready`}:{kind:`empty`}),L=S?P.map(e=>e.total).filter(e=>e!==null):P.flatMap(e=>e.values).filter(e=>e!==null),R=ne(Math.min(0,...L),Math.max(0,...L,E?.value??0,1e-4),4),z=R[0],B=R[R.length-1],V=Math.max(...R.map(e=>T(e).length))*7+10,H=Math.min(64,Math.max(28,V)),U=!S&&x.length<=4?Math.max(0,...x.map(e=>e.label.length))*v+6:0,W=U>0&&U<=y&&k>=420,G=ae+(W?U:0),K=Math.max(40,k-H-G),q=C-g-_,J=P.length?P[0].x:0,Y=P.length?P[P.length-1].x:1,X=l(J,Y,H,H+K),Z=l(z,B,g+q,g),se=(()=>{if(S){let e=P.map(()=>0);return x.map((t,n)=>{let r=P.map((t,r)=>{if(t.total===null)return{x:t.x,y:null,base:null};let i=e[r];return e[r]=i+(t.values[n]??0),{x:t.x,y:e[r],base:i}});return c(r.map(e=>({x:e.x,y:e.y}))).map(e=>({top:e.map(e=>({x:X(e.x),y:Z(e.y)})),bottom:e.map(e=>{let t=r.find(t=>t.x===e.x);return{x:X(e.x),y:Z(t.base??0)}})}))})}return x.map((e,t)=>c(P.map(e=>({x:e.x,y:e.values[t]??null}))).map(e=>({top:e.map(e=>({x:X(e.x),y:Z(e.y)})),bottom:e.map(e=>({x:X(e.x),y:Z(Math.max(z,0))}))})))})(),ce=o(P.length,Math.max(2,Math.floor(K/84)));function le(e){let t=O.current;if(!t||P.length===0)return null;let n=e-t.getBoundingClientRect().left,r=0,i=1/0;return P.forEach((e,t)=>{let a=Math.abs(X(e.x)-n);a<i&&(i=a,r=t)}),r}function ue(e){if(P.length===0)return;let t=A??P.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?P.length-1:null;n!==null&&(e.preventDefault(),j(Math.max(0,Math.min(P.length-1,n))))}let Q=A===null?void 0:P[A],$=[...P].reverse().find(e=>e.values.some(e=>e!==null)),de=D??(P.length?`${e}: ${P.length} points from ${w(J)} to ${w(Y)}.`+($?` Latest ${w($.x)}: ${x.map((e,t)=>`${e.label} ${$.values[t]===null?`no data`:T($.values[t])}`).join(`, `)}.`:``):`${e}: no data.`),fe=[{key:`x`,label:`When`,render:e=>w(e.x)},...x.map((e,t)=>({key:e.id,label:e.label,numeric:!0,render:e=>e.values[t]===null?`—`:T(e.values[t])})),...S&&x.length>1?[{key:`__total`,label:`Total`,numeric:!0,render:e=>e.total===null?`—`:T(e.total)}]:[]];return(0,h.jsx)(f,{title:e,description:t,caveat:n,status:I,table:(0,h.jsx)(ee,{caption:e,columns:fe,rows:P,rowKey:e=>String(e.x)}),footer:(0,h.jsx)(re,{items:x.map((e,t)=>({label:e.label,color:N[t],kind:S?`swatch`:`line`}))}),children:(0,h.jsxs)(`div`,{ref:O,className:`${p.plotWrap} ${p.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read values.`,"aria-describedby":M,onFocus:()=>j(e=>e??(P.length?P.length-1:null)),onBlur:()=>j(null),onKeyDown:ue,children:[(0,h.jsxs)(`svg`,{className:p.svg,width:k,height:C,viewBox:`0 0 ${k} ${C}`,role:`img`,"aria-label":de,onPointerMove:e=>j(le(e.clientX)),onPointerLeave:()=>j(null),children:[R.map(e=>(0,h.jsxs)(`g`,{children:[(0,h.jsx)(`line`,{className:p.grid,x1:H,x2:H+K,y1:Z(e),y2:Z(e)}),(0,h.jsx)(`text`,{className:p.tick,x:H-6,y:Z(e),dy:`0.32em`,textAnchor:`end`,children:T(e)})]},e)),(0,h.jsx)(`line`,{className:p.axis,x1:H,x2:H+K,y1:Z(Math.max(z,0)),y2:Z(Math.max(z,0))}),ce.map((e,t)=>(0,h.jsx)(`text`,{className:p.tick,x:X(P[e].x),y:C-8,textAnchor:P.length===1?`middle`:t===0&&e===0?`start`:e===P.length-1?`end`:`middle`,children:w(P[e].x)},e)),se.map((e,t)=>(0,h.jsxs)(`g`,{"data-series":x[t].id,children:[e.map((e,n)=>(0,h.jsx)(`path`,{d:u(e.top,e.bottom),fill:N[t],className:S?void 0:p.wash,opacity:S?.85:void 0,stroke:S?`var(--chart-surface)`:void 0,strokeWidth:S?2:void 0},`a${n}`)),S?null:e.map((e,n)=>e.top.length===1?(0,h.jsx)(`circle`,{cx:e.top[0].x,cy:e.top[0].y,r:3,fill:N[t]},`p${n}`):(0,h.jsx)(`path`,{d:te(e.top),stroke:N[t],className:p.line},`l${n}`)),W&&e.length?(()=>{let n=e[e.length-1].top,r=n[n.length-1];return(0,h.jsx)(`text`,{className:p.label,x:r.x+6,y:r.y,dy:`0.32em`,children:x[t].label})})():null]},x[t].id)),E?(0,h.jsxs)(`g`,{children:[(0,h.jsx)(`line`,{className:p.reference,x1:H,x2:H+K,y1:Z(E.value),y2:Z(E.value)}),(0,h.jsxs)(`text`,{className:p.tick,x:H+K,y:Z(E.value)-4,textAnchor:`end`,children:[E.label,` · `,T(E.value)]})]}):null,Q?(0,h.jsxs)(`g`,{children:[(0,h.jsx)(`line`,{className:p.crosshair,x1:X(Q.x),x2:X(Q.x),y1:g,y2:g+q}),x.map((e,t)=>{let n=S?Q.total===null?null:Q.values.slice(0,t+1).reduce((e,t)=>e+(t??0),0):Q.values[t];return n==null?null:(0,h.jsx)(`circle`,{className:p.marker,cx:X(Q.x),cy:Z(n),r:4,fill:N[t]},e.id)})]}):null]}),(0,h.jsx)(`span`,{id:M,className:p.srOnly,"aria-live":`polite`,children:Q?`${w(Q.x)}: ${x.map((e,t)=>`${e.label} ${Q.values[t]===null?`no data`:T(Q.values[t])}`).join(`, `)}`:``}),Q?(0,h.jsx)(s,{left:i(X(Q.x),k),top:g,title:w(Q.x),rows:[...x.map((e,t)=>({key:e.id,label:e.label,value:Q.values[t]===null?null:T(Q.values[t]),color:N[t]})),...S&&x.length>1?[{key:`__t`,label:`Total`,value:Q.total===null?null:T(Q.total)}]:[]]}):null]})})}export{b as t};
2
- //# sourceMappingURL=AreaTrend-gUVXkfhf.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AreaTrend-gUVXkfhf.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/AreaTrend.tsx"],"sourcesContent":["/**\n * components/charts/AreaTrend.tsx — change over time for 1–4 series, as lines\n * over a 10% wash (overlaid) or as a stacked composition (`stacked`).\n *\n * Honesty: a `null` y is a GAP — the line and wash break there, and in stacked\n * mode an unknown in any layer breaks the whole stack at that x (the total is\n * unknown), never a silent zero. One y-axis only; a threshold is a labelled\n * reference line, not a second scale.\n *\n * Interaction: crosshair + tooltip on hover; the plot is focusable and the\n * arrow keys (Home/End) walk the same crosshair, announced through a live\n * region. The Table view carries every value without hovering.\n */\nimport { useId, useMemo, useRef, useState, type KeyboardEvent, type PointerEvent } from 'react';\nimport type { Series } from './types.js';\nimport { seriesColor } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, ChartTooltip, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { areaPath, linePath, linearScale, niceTicks, splitRuns, thinIndexes, type XY } from './chart-math.js';\nimport { formatCompact, formatTimeLabel } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\n\nexport interface AreaTrendSeries extends Series {\n /** Override the identity colour (defaults to the fixed categorical slot by index). */\n color?: string;\n}\n\nexport interface AreaTrendProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n series: AreaTrendSeries[];\n stacked?: boolean;\n /** Plot height in px, including the x-axis band. */\n height?: number;\n /** Fixed width (tests, print). Omit to fill the container. */\n width?: number;\n formatX?: (x: number) => string;\n formatY?: (y: number) => string;\n /** A labelled horizontal reference (a cap, a target). */\n threshold?: { value: number; label: string };\n /** Accessible summary override. */\n ariaLabel?: string;\n}\n\nconst PAD_T = 12;\nconst PAD_B = 26;\nconst PAD_R = 12;\nconst END_LABEL_CH = 6.6;\nconst END_LABEL_MAX = 120;\n\ninterface Row {\n x: number;\n values: (number | null)[];\n total: number | null;\n}\n\nexport function AreaTrend({\n title,\n description,\n caveat,\n status,\n series,\n stacked = false,\n height = 200,\n width: fixedWidth,\n formatX = formatTimeLabel,\n formatY = formatCompact,\n threshold,\n ariaLabel,\n}: AreaTrendProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n\n const colors = series.map((s, i) => s.color ?? seriesColor(i));\n\n const rows: Row[] = useMemo(() => {\n const xs = Array.from(new Set(series.flatMap((s) => s.points.map((p) => p.x)))).sort((a, b) => a - b);\n const lookup = series.map((s) => new Map(s.points.map((p) => [p.x, p.y])));\n return xs.map((x) => {\n const values = lookup.map((m) => (m.has(x) ? m.get(x)! : null));\n const total = values.some((v) => v === null) ? null : values.reduce<number>((a, v) => a + (v ?? 0), 0);\n return { x, values, total };\n });\n }, [series]);\n\n const hasData = rows.some((r) => r.values.some((v) => v !== null));\n const resolvedStatus: ChartStatus = status ?? (hasData ? { kind: 'ready' } : { kind: 'empty' });\n\n // ── scales ─────────────────────────────────────────────────────────────\n const known = stacked\n ? rows.map((r) => r.total).filter((v): v is number => v !== null)\n : rows.flatMap((r) => r.values).filter((v): v is number => v !== null);\n const ticksY = niceTicks(Math.min(0, ...known), Math.max(0, ...known, threshold?.value ?? 0, 0.0001), 4);\n const yMin = ticksY[0]!;\n const yMax = ticksY[ticksY.length - 1]!;\n const tickLabelW = Math.max(...ticksY.map((t) => formatY(t).length)) * 7 + 10;\n const padL = Math.min(64, Math.max(28, tickLabelW));\n const endLabels = !stacked && series.length <= 4\n ? Math.max(0, ...series.map((s) => s.label.length)) * END_LABEL_CH + 6\n : 0;\n const showEndLabels = endLabels > 0 && endLabels <= END_LABEL_MAX && width >= 420;\n const padR = PAD_R + (showEndLabels ? endLabels : 0);\n const plotW = Math.max(40, width - padL - padR);\n const plotH = height - PAD_T - PAD_B;\n const xMin = rows.length ? rows[0]!.x : 0;\n const xMax = rows.length ? rows[rows.length - 1]!.x : 1;\n const xs = linearScale(xMin, xMax, padL, padL + plotW);\n const ys = linearScale(yMin, yMax, PAD_T + plotH, PAD_T);\n\n // ── geometry ───────────────────────────────────────────────────────────\n // Recomputed per render on purpose: the scales depend on the measured width.\n const layers = (() => {\n if (stacked) {\n const acc = rows.map(() => 0);\n return series.map((_, si) => {\n const top = rows.map((r, ri) => {\n if (r.total === null) return { x: r.x, y: null as number | null, base: null as number | null };\n const base = acc[ri]!;\n acc[ri] = base + (r.values[si] ?? 0);\n return { x: r.x, y: acc[ri]!, base };\n });\n const runs = splitRuns(top.map((p) => ({ x: p.x, y: p.y })));\n return runs.map((run) => {\n const topPx: XY[] = run.map((p) => ({ x: xs(p.x), y: ys(p.y) }));\n const bottomPx: XY[] = run.map((p) => {\n const src = top.find((t) => t.x === p.x)!;\n return { x: xs(p.x), y: ys(src.base ?? 0) };\n });\n return { top: topPx, bottom: bottomPx };\n });\n });\n }\n return series.map((_, si) => {\n const runs = splitRuns(rows.map((r) => ({ x: r.x, y: r.values[si] ?? null })));\n return runs.map((run) => {\n const topPx = run.map((p) => ({ x: xs(p.x), y: ys(p.y) }));\n const bottomPx = run.map((p) => ({ x: xs(p.x), y: ys(Math.max(yMin, 0)) }));\n return { top: topPx, bottom: bottomPx };\n });\n });\n })();\n\n const xTickIdx = thinIndexes(rows.length, Math.max(2, Math.floor(plotW / 84)));\n\n function indexAt(clientX: number): number | null {\n const el = wrapRef.current;\n if (!el || rows.length === 0) return null;\n const rect = el.getBoundingClientRect();\n const px = clientX - rect.left;\n let best = 0;\n let bestD = Infinity;\n rows.forEach((r, i) => {\n const d = Math.abs(xs(r.x) - px);\n if (d < bestD) { bestD = d; best = i; }\n });\n return best;\n }\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (rows.length === 0) return;\n const cur = active ?? rows.length - 1;\n const next = e.key === 'ArrowLeft' ? cur - 1 : e.key === 'ArrowRight' ? cur + 1 : e.key === 'Home' ? 0 : e.key === 'End' ? rows.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(rows.length - 1, next)));\n }\n\n const activeRow = active !== null ? rows[active] : undefined;\n const latest = [...rows].reverse().find((r) => r.values.some((v) => v !== null));\n const summary = ariaLabel ?? (rows.length\n ? `${title}: ${rows.length} points from ${formatX(xMin)} to ${formatX(xMax)}.` +\n (latest ? ` Latest ${formatX(latest.x)}: ${series.map((s, i) => `${s.label} ${latest.values[i] === null ? 'no data' : formatY(latest.values[i]!)}`).join(', ')}.` : '')\n : `${title}: no data.`);\n\n const columns: TableColumn<Row>[] = [\n { key: 'x', label: 'When', render: (r) => formatX(r.x) },\n ...series.map((s, i) => ({\n key: s.id,\n label: s.label,\n numeric: true,\n render: (r: Row) => (r.values[i] === null ? '—' : formatY(r.values[i]!)),\n })),\n ...(stacked && series.length > 1\n ? [{ key: '__total', label: 'Total', numeric: true, render: (r: Row) => (r.total === null ? '—' : formatY(r.total)) }]\n : []),\n ];\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r) => String(r.x)} />}\n footer={\n <ChartLegend\n items={series.map((s, i) => ({ label: s.label, color: colors[i], kind: stacked ? 'swatch' : 'line' }))}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the left and right arrow keys to read values.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (rows.length ? rows.length - 1 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg\n className={plot.svg}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={summary}\n onPointerMove={(e: PointerEvent<SVGSVGElement>) => setActive(indexAt(e.clientX))}\n onPointerLeave={() => setActive(null)}\n >\n {ticksY.map((t) => (\n <g key={t}>\n <line className={plot.grid} x1={padL} x2={padL + plotW} y1={ys(t)} y2={ys(t)} />\n <text className={plot.tick} x={padL - 6} y={ys(t)} dy=\"0.32em\" textAnchor=\"end\">{formatY(t)}</text>\n </g>\n ))}\n <line className={plot.axis} x1={padL} x2={padL + plotW} y1={ys(Math.max(yMin, 0))} y2={ys(Math.max(yMin, 0))} />\n {xTickIdx.map((i, n) => (\n <text\n key={i}\n className={plot.tick}\n x={xs(rows[i]!.x)}\n y={height - 8}\n textAnchor={rows.length === 1 ? 'middle' : n === 0 && i === 0 ? 'start' : i === rows.length - 1 ? 'end' : 'middle'}\n >\n {formatX(rows[i]!.x)}\n </text>\n ))}\n\n {layers.map((runs, si) => (\n <g key={series[si]!.id} data-series={series[si]!.id}>\n {runs.map((run, ri) => (\n <path\n key={`a${ri}`}\n d={areaPath(run.top, run.bottom)}\n fill={colors[si]}\n className={stacked ? undefined : plot.wash}\n opacity={stacked ? 0.85 : undefined}\n stroke={stacked ? 'var(--chart-surface)' : undefined}\n strokeWidth={stacked ? 2 : undefined}\n />\n ))}\n {!stacked\n ? runs.map((run, ri) =>\n run.top.length === 1 ? (\n <circle key={`p${ri}`} cx={run.top[0]!.x} cy={run.top[0]!.y} r={3} fill={colors[si]} />\n ) : (\n <path key={`l${ri}`} d={linePath(run.top)} stroke={colors[si]} className={plot.line} />\n ),\n )\n : null}\n {showEndLabels && runs.length ? (() => {\n const last = runs[runs.length - 1]!.top;\n const end = last[last.length - 1]!;\n return (\n <text className={plot.label} x={end.x + 6} y={end.y} dy=\"0.32em\">{series[si]!.label}</text>\n );\n })() : null}\n </g>\n ))}\n\n {threshold ? (\n <g>\n <line className={plot.reference} x1={padL} x2={padL + plotW} y1={ys(threshold.value)} y2={ys(threshold.value)} />\n <text className={plot.tick} x={padL + plotW} y={ys(threshold.value) - 4} textAnchor=\"end\">\n {threshold.label} · {formatY(threshold.value)}\n </text>\n </g>\n ) : null}\n\n {activeRow ? (\n <g>\n <line className={plot.crosshair} x1={xs(activeRow.x)} x2={xs(activeRow.x)} y1={PAD_T} y2={PAD_T + plotH} />\n {series.map((s, si) => {\n const v = stacked\n ? (activeRow.total === null ? null : activeRow.values.slice(0, si + 1).reduce<number>((a, b) => a + (b ?? 0), 0))\n : activeRow.values[si];\n return v === null || v === undefined ? null : (\n <circle key={s.id} className={plot.marker} cx={xs(activeRow.x)} cy={ys(v)} r={4} fill={colors[si]} />\n );\n })}\n </g>\n ) : null}\n\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">\n {activeRow\n ? `${formatX(activeRow.x)}: ${series.map((s, i) => `${s.label} ${activeRow.values[i] === null ? 'no data' : formatY(activeRow.values[i]!)}`).join(', ')}`\n : ''}\n </span>\n {activeRow ? (\n <ChartTooltip\n left={clampTooltipLeft(xs(activeRow.x), width)}\n top={PAD_T}\n title={formatX(activeRow.x)}\n rows={[\n ...series.map((s, i) => ({\n key: s.id,\n label: s.label,\n value: activeRow.values[i] === null ? null : formatY(activeRow.values[i]!),\n color: colors[i],\n })),\n ...(stacked && series.length > 1\n ? [{ key: '__t', label: 'Total', value: activeRow.total === null ? null : formatY(activeRow.total) }]\n : []),\n ]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{n as e}from"./index-afDA8cwW.js";import{n as t}from"./Advanced-DM0DYibH.js";var n=e();function r(){return(0,n.jsx)(t,{})}export{r as AutonomySection};
2
- //# sourceMappingURL=AutonomySection-CoMngwNB.js.map
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{n as r,t as i}from"./MutationTokenDialog-Dn0tzCrh.js";import{n as a}from"./viewport-ZB86jdES.js";import{a as o}from"./command-bus-CpYuam1F.js";import{i as s,r as c}from"./section-visibility-CSrsTcwK.js";import{a as l}from"./icons-DWb24OA6.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-5v5xGobf.js";import{t as k}from"./Button-0-nNbv1h.js";import{n as A}from"./use-token-gate-DYA2-ALC.js";var j=n(e(),1),M={bar:`_bar_14lez_8`,rows:`_rows_14lez_15`,row:`_row_14lez_15`,ident:`_ident_14lez_39`,glyph:`_glyph_14lez_47`,repo:`_repo_14lez_48`,branch:`_branch_14lez_57`,drift:`_drift_14lez_66`,stat:`_stat_14lez_72`,add:`_add_14lez_90`,del:`_del_14lez_91`,checking:`_checking_14lez_93`,conflicts:`_conflicts_14lez_94`,spacer:`_spacer_14lez_101`,split:`_split_14lez_105`,primary:`_primary_14lez_113`,menuButton:`_menuButton_14lez_114`,visuallyHidden:`_visuallyHidden_14lez_148`,spinner:`_spinner_14lez_159`,"branch-spin":`_branch-spin_14lez_1`,menu:`_menu_14lez_114`,"menu-in":`_menu-in_14lez_1`,menuItem:`_menuItem_14lez_196`,menuLabel:`_menuLabel_14lez_216`,menuReason:`_menuReason_14lez_217`,more:`_more_14lez_225`,notice:`_notice_14lez_240`},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,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,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_j74d0_5`,glyph:`_glyph_j74d0_26`,state:`_state_j74d0_30`,checks:`_checks_j74d0_33`,number:`_number_j74d0_37`,title:`_title_j74d0_43`,pulse:`_pulse_j74d0_61`,"pr-pulse":`_pr-pulse_j74d0_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:e.title,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,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-C-NovaXr.js.map