@ashlr/hub 3.12.0 → 3.14.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 (719) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +29 -16
  3. package/dist/authority-surface.json +274 -148
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +145 -33
  6. package/dist/cli/authority.js +1292 -315
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/cloud.js +12 -3
  9. package/dist/cli/cloud.js.map +1 -1
  10. package/dist/cli/comms.d.ts +33 -19
  11. package/dist/cli/comms.js +128 -151
  12. package/dist/cli/comms.js.map +1 -1
  13. package/dist/cli/completions.js +1 -1
  14. package/dist/cli/completions.js.map +1 -1
  15. package/dist/cli/daemon.js +29 -0
  16. package/dist/cli/daemon.js.map +1 -1
  17. package/dist/cli/director.d.ts +8 -12
  18. package/dist/cli/director.js +17 -52
  19. package/dist/cli/director.js.map +1 -1
  20. package/dist/cli/fleet.js +4 -1
  21. package/dist/cli/fleet.js.map +1 -1
  22. package/dist/cli/help.js +1 -0
  23. package/dist/cli/help.js.map +1 -1
  24. package/dist/cli/leader.d.ts +27 -3
  25. package/dist/cli/leader.js +253 -4
  26. package/dist/cli/leader.js.map +1 -1
  27. package/dist/core/authority/protected-paths.js +11 -0
  28. package/dist/core/authority/protected-paths.js.map +1 -1
  29. package/dist/core/authority/resident.d.ts +101 -0
  30. package/dist/core/authority/resident.js +246 -0
  31. package/dist/core/authority/resident.js.map +1 -0
  32. package/dist/core/authority/server-enforcement.d.ts +110 -0
  33. package/dist/core/authority/server-enforcement.js +260 -0
  34. package/dist/core/authority/server-enforcement.js.map +1 -0
  35. package/dist/core/authority/standing-grant.d.ts +24 -4
  36. package/dist/core/authority/standing-grant.js +19 -3
  37. package/dist/core/authority/standing-grant.js.map +1 -1
  38. package/dist/core/authority/types.d.ts +43 -0
  39. package/dist/core/authority/types.js +6 -0
  40. package/dist/core/authority/types.js.map +1 -1
  41. package/dist/core/cloud/budget.js +11 -1
  42. package/dist/core/cloud/budget.js.map +1 -1
  43. package/dist/core/cloud/cloud-api.d.ts +25 -2
  44. package/dist/core/cloud/cloud-api.js +139 -5
  45. package/dist/core/cloud/cloud-api.js.map +1 -1
  46. package/dist/core/cloud/pr-actions.d.ts +93 -0
  47. package/dist/core/cloud/pr-actions.js +436 -0
  48. package/dist/core/cloud/pr-actions.js.map +1 -0
  49. package/dist/core/cloud/pr-preview.d.ts +128 -0
  50. package/dist/core/cloud/pr-preview.js +228 -0
  51. package/dist/core/cloud/pr-preview.js.map +1 -0
  52. package/dist/core/cloud/store.d.ts +2 -0
  53. package/dist/core/cloud/store.js +28 -0
  54. package/dist/core/cloud/store.js.map +1 -1
  55. package/dist/core/cloud/timeline-api.d.ts +24 -0
  56. package/dist/core/cloud/timeline-api.js +46 -0
  57. package/dist/core/cloud/timeline-api.js.map +1 -0
  58. package/dist/core/cloud/timeline-types.d.ts +62 -0
  59. package/dist/core/cloud/timeline-types.js +36 -0
  60. package/dist/core/cloud/timeline-types.js.map +1 -0
  61. package/dist/core/cloud/timeline.d.ts +102 -0
  62. package/dist/core/cloud/timeline.js +925 -0
  63. package/dist/core/cloud/timeline.js.map +1 -0
  64. package/dist/core/cloud/tracker.js +67 -0
  65. package/dist/core/cloud/tracker.js.map +1 -1
  66. package/dist/core/cloud/types.d.ts +38 -0
  67. package/dist/core/cloud/types.js +1 -1
  68. package/dist/core/cloud/types.js.map +1 -1
  69. package/dist/core/comms/change-digest.d.ts +130 -0
  70. package/dist/core/comms/change-digest.js +451 -0
  71. package/dist/core/comms/change-digest.js.map +1 -0
  72. package/dist/core/comms/director-prompt.d.ts +4 -5
  73. package/dist/core/comms/director-prompt.js +4 -71
  74. package/dist/core/comms/director-prompt.js.map +1 -1
  75. package/dist/core/comms/director.d.ts +24 -61
  76. package/dist/core/comms/director.js +29 -382
  77. package/dist/core/comms/director.js.map +1 -1
  78. package/dist/core/comms/dispatch.d.ts +37 -12
  79. package/dist/core/comms/dispatch.js +244 -177
  80. package/dist/core/comms/dispatch.js.map +1 -1
  81. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  82. package/dist/core/comms/elon-dialogue.js +36 -307
  83. package/dist/core/comms/elon-dialogue.js.map +1 -1
  84. package/dist/core/comms/fleet-pulse.js +4 -7
  85. package/dist/core/comms/fleet-pulse.js.map +1 -1
  86. package/dist/core/comms/handlers.d.ts +10 -6
  87. package/dist/core/comms/handlers.js +14 -48
  88. package/dist/core/comms/handlers.js.map +1 -1
  89. package/dist/core/comms/migrations.d.ts +47 -0
  90. package/dist/core/comms/migrations.js +125 -0
  91. package/dist/core/comms/migrations.js.map +1 -0
  92. package/dist/core/comms/requests.d.ts +32 -5
  93. package/dist/core/comms/requests.js +101 -5
  94. package/dist/core/comms/requests.js.map +1 -1
  95. package/dist/core/comms/telegram-channel.d.ts +104 -0
  96. package/dist/core/comms/telegram-channel.js +622 -0
  97. package/dist/core/comms/telegram-channel.js.map +1 -0
  98. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  99. package/dist/core/comms/telegram-thread-map.js +144 -0
  100. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  101. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  102. package/dist/core/daemon/capacity-publisher.js +40 -2
  103. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  104. package/dist/core/daemon/loop.js +18 -4
  105. package/dist/core/daemon/loop.js.map +1 -1
  106. package/dist/core/daemon/service-install-authority.d.ts +10 -2
  107. package/dist/core/daemon/service-install-authority.js +14 -5
  108. package/dist/core/daemon/service-install-authority.js.map +1 -1
  109. package/dist/core/daemon/service.d.ts +15 -0
  110. package/dist/core/daemon/service.js +26 -0
  111. package/dist/core/daemon/service.js.map +1 -1
  112. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  113. package/dist/core/daemon/tick-deadline.js +83 -0
  114. package/dist/core/daemon/tick-deadline.js.map +1 -0
  115. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  116. package/dist/core/daemon/tick-hooks.js.map +1 -1
  117. package/dist/core/daemon/tick-progress.d.ts +39 -0
  118. package/dist/core/daemon/tick-progress.js +194 -0
  119. package/dist/core/daemon/tick-progress.js.map +1 -0
  120. package/dist/core/dashboard.js +3 -1
  121. package/dist/core/dashboard.js.map +1 -1
  122. package/dist/core/fleet/cloud-intake.d.ts +95 -0
  123. package/dist/core/fleet/cloud-intake.js +557 -0
  124. package/dist/core/fleet/cloud-intake.js.map +1 -0
  125. package/dist/core/fleet/dispatch-router.d.ts +13 -0
  126. package/dist/core/fleet/dispatch-router.js +32 -8
  127. package/dist/core/fleet/dispatch-router.js.map +1 -1
  128. package/dist/core/fleet/fleet-merge-state.d.ts +16 -0
  129. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  130. package/dist/core/fleet/host-merge.d.ts +14 -0
  131. package/dist/core/fleet/host-merge.js +24 -2
  132. package/dist/core/fleet/host-merge.js.map +1 -1
  133. package/dist/core/fleet/merge-gates.d.ts +21 -0
  134. package/dist/core/fleet/merge-gates.js +39 -5
  135. package/dist/core/fleet/merge-gates.js.map +1 -1
  136. package/dist/core/fleet/mirrors.d.ts +162 -6
  137. package/dist/core/fleet/mirrors.js +1051 -49
  138. package/dist/core/fleet/mirrors.js.map +1 -1
  139. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  140. package/dist/core/fleet/standing-merge-pass.js +102 -1
  141. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  142. package/dist/core/fleet/status.d.ts +17 -0
  143. package/dist/core/fleet/status.js +22 -0
  144. package/dist/core/fleet/status.js.map +1 -1
  145. package/dist/core/fleet/tick-hooks-live.d.ts +10 -1
  146. package/dist/core/fleet/tick-hooks-live.js +57 -8
  147. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  148. package/dist/core/fleet/verify-check-run.d.ts +90 -0
  149. package/dist/core/fleet/verify-check-run.js +274 -0
  150. package/dist/core/fleet/verify-check-run.js.map +1 -0
  151. package/dist/core/git.d.ts +17 -0
  152. package/dist/core/git.js +124 -25
  153. package/dist/core/git.js.map +1 -1
  154. package/dist/core/goals/open-goals.d.ts +47 -0
  155. package/dist/core/goals/open-goals.js +33 -0
  156. package/dist/core/goals/open-goals.js.map +1 -0
  157. package/dist/core/inbox/merge.d.ts +5 -0
  158. package/dist/core/inbox/merge.js +58 -2
  159. package/dist/core/inbox/merge.js.map +1 -1
  160. package/dist/core/integrations/locus.d.ts +28 -0
  161. package/dist/core/integrations/locus.js +155 -30
  162. package/dist/core/integrations/locus.js.map +1 -1
  163. package/dist/core/integrations/telegram-format.d.ts +40 -0
  164. package/dist/core/integrations/telegram-format.js +123 -0
  165. package/dist/core/integrations/telegram-format.js.map +1 -0
  166. package/dist/core/integrations/telegram.d.ts +60 -4
  167. package/dist/core/integrations/telegram.js +161 -28
  168. package/dist/core/integrations/telegram.js.map +1 -1
  169. package/dist/core/mcp-registry.d.ts +12 -0
  170. package/dist/core/mcp-registry.js +70 -0
  171. package/dist/core/mcp-registry.js.map +1 -1
  172. package/dist/core/observability/rollup.d.ts +12 -10
  173. package/dist/core/observability/rollup.js +44 -17
  174. package/dist/core/observability/rollup.js.map +1 -1
  175. package/dist/core/resources/connection-monitor.d.ts +9 -0
  176. package/dist/core/resources/connection-monitor.js +19 -9
  177. package/dist/core/resources/connection-monitor.js.map +1 -1
  178. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  179. package/dist/core/resources/quota-refresh-lease.js +34 -1
  180. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  181. package/dist/core/routing/budget-api.d.ts +18 -1
  182. package/dist/core/routing/budget-api.js +120 -10
  183. package/dist/core/routing/budget-api.js.map +1 -1
  184. package/dist/core/routing/budget-store.d.ts +22 -1
  185. package/dist/core/routing/budget-store.js +22 -8
  186. package/dist/core/routing/budget-store.js.map +1 -1
  187. package/dist/core/routing/readiness-types.d.ts +82 -0
  188. package/dist/core/routing/readiness-types.js +23 -0
  189. package/dist/core/routing/readiness-types.js.map +1 -0
  190. package/dist/core/routing/readiness.d.ts +103 -0
  191. package/dist/core/routing/readiness.js +480 -0
  192. package/dist/core/routing/readiness.js.map +1 -0
  193. package/dist/core/sandbox/confine.js +22 -1
  194. package/dist/core/sandbox/confine.js.map +1 -1
  195. package/dist/core/sandbox/policy.d.ts +23 -0
  196. package/dist/core/sandbox/policy.js +100 -0
  197. package/dist/core/sandbox/policy.js.map +1 -1
  198. package/dist/core/types.d.ts +13 -0
  199. package/dist/core/types.js.map +1 -1
  200. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  201. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  202. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  203. package/dist/core/usage/frontier-usage.d.ts +20 -2
  204. package/dist/core/usage/frontier-usage.js +75 -17
  205. package/dist/core/usage/frontier-usage.js.map +1 -1
  206. package/dist/core/verse/account-health.js +9 -3
  207. package/dist/core/verse/account-health.js.map +1 -1
  208. package/dist/core/verse/accounts.d.ts +45 -0
  209. package/dist/core/verse/accounts.js +246 -17
  210. package/dist/core/verse/accounts.js.map +1 -1
  211. package/dist/core/verse/activity-api.d.ts +5 -1
  212. package/dist/core/verse/activity-api.js +62 -14
  213. package/dist/core/verse/activity-api.js.map +1 -1
  214. package/dist/core/verse/apps-api.js +23 -11
  215. package/dist/core/verse/apps-api.js.map +1 -1
  216. package/dist/core/verse/apps.d.ts +11 -9
  217. package/dist/core/verse/apps.js +2 -2
  218. package/dist/core/verse/apps.js.map +1 -1
  219. package/dist/core/verse/authority-api.d.ts +17 -3
  220. package/dist/core/verse/authority-api.js +122 -7
  221. package/dist/core/verse/authority-api.js.map +1 -1
  222. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  223. package/dist/core/verse/autonomy-ladder.js +251 -0
  224. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  225. package/dist/core/verse/context-fit.js +7 -5
  226. package/dist/core/verse/context-fit.js.map +1 -1
  227. package/dist/core/verse/control-api.d.ts +23 -1
  228. package/dist/core/verse/control-api.js +117 -10
  229. package/dist/core/verse/control-api.js.map +1 -1
  230. package/dist/core/verse/fleet-live-api.js +13 -5
  231. package/dist/core/verse/fleet-live-api.js.map +1 -1
  232. package/dist/core/verse/folder-io.d.ts +50 -0
  233. package/dist/core/verse/folder-io.js +142 -0
  234. package/dist/core/verse/folder-io.js.map +1 -0
  235. package/dist/core/verse/git-api.js +5 -4
  236. package/dist/core/verse/git-api.js.map +1 -1
  237. package/dist/core/verse/git-ops.d.ts +10 -1
  238. package/dist/core/verse/git-ops.js +18 -2
  239. package/dist/core/verse/git-ops.js.map +1 -1
  240. package/dist/core/verse/github-api.d.ts +1 -1
  241. package/dist/core/verse/github-api.js +5 -4
  242. package/dist/core/verse/github-api.js.map +1 -1
  243. package/dist/core/verse/github-repo.js +118 -14
  244. package/dist/core/verse/github-repo.js.map +1 -1
  245. package/dist/core/verse/leader-api.d.ts +5 -4
  246. package/dist/core/verse/leader-api.js +237 -10
  247. package/dist/core/verse/leader-api.js.map +1 -1
  248. package/dist/core/verse/local-models.d.ts +10 -0
  249. package/dist/core/verse/local-models.js +10 -1
  250. package/dist/core/verse/local-models.js.map +1 -1
  251. package/dist/core/verse/login-path.d.ts +73 -0
  252. package/dist/core/verse/login-path.js +123 -14
  253. package/dist/core/verse/login-path.js.map +1 -1
  254. package/dist/core/verse/mcp-control-api.js +4 -4
  255. package/dist/core/verse/mcp-control-api.js.map +1 -1
  256. package/dist/core/verse/mcp-scope.d.ts +22 -0
  257. package/dist/core/verse/mcp-scope.js +41 -1
  258. package/dist/core/verse/mcp-scope.js.map +1 -1
  259. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  260. package/dist/core/verse/mcp-seat-view.js +30 -4
  261. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  262. package/dist/core/verse/overnight-api.js +20 -2
  263. package/dist/core/verse/overnight-api.js.map +1 -1
  264. package/dist/core/verse/path-guard.d.ts +24 -0
  265. package/dist/core/verse/path-guard.js +91 -22
  266. package/dist/core/verse/path-guard.js.map +1 -1
  267. package/dist/core/verse/preview-api.js +22 -0
  268. package/dist/core/verse/preview-api.js.map +1 -1
  269. package/dist/core/verse/projects.d.ts +21 -0
  270. package/dist/core/verse/projects.js +82 -0
  271. package/dist/core/verse/projects.js.map +1 -1
  272. package/dist/core/verse/seat-readiness.d.ts +25 -0
  273. package/dist/core/verse/seat-readiness.js +43 -6
  274. package/dist/core/verse/seat-readiness.js.map +1 -1
  275. package/dist/core/verse/session-controls-api.js +5 -3
  276. package/dist/core/verse/session-controls-api.js.map +1 -1
  277. package/dist/core/verse/session-handoff.d.ts +26 -0
  278. package/dist/core/verse/session-handoff.js +90 -12
  279. package/dist/core/verse/session-handoff.js.map +1 -1
  280. package/dist/core/verse/terminal-api.js +7 -4
  281. package/dist/core/verse/terminal-api.js.map +1 -1
  282. package/dist/core/verse/terminal.js +9 -5
  283. package/dist/core/verse/terminal.js.map +1 -1
  284. package/dist/core/verse/verse-api.d.ts +3 -1
  285. package/dist/core/verse/verse-api.js +87 -27
  286. package/dist/core/verse/verse-api.js.map +1 -1
  287. package/dist/core/verse/workspaces.d.ts +51 -0
  288. package/dist/core/verse/workspaces.js +177 -47
  289. package/dist/core/verse/workspaces.js.map +1 -1
  290. package/dist/core/vision/leader-apply.d.ts +40 -0
  291. package/dist/core/vision/leader-apply.js +101 -30
  292. package/dist/core/vision/leader-apply.js.map +1 -1
  293. package/dist/core/vision/leader-cadence.d.ts +114 -0
  294. package/dist/core/vision/leader-cadence.js +127 -0
  295. package/dist/core/vision/leader-cadence.js.map +1 -0
  296. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  297. package/dist/core/vision/leader-goal-evidence.js +36 -0
  298. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  299. package/dist/core/vision/leader-health.d.ts +53 -0
  300. package/dist/core/vision/leader-health.js +92 -0
  301. package/dist/core/vision/leader-health.js.map +1 -0
  302. package/dist/core/vision/leader-operator.d.ts +176 -0
  303. package/dist/core/vision/leader-operator.js +355 -0
  304. package/dist/core/vision/leader-operator.js.map +1 -0
  305. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  306. package/dist/core/vision/leader-run-chain.js +54 -0
  307. package/dist/core/vision/leader-run-chain.js.map +1 -0
  308. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  309. package/dist/core/vision/leader-seat-plan.js +93 -0
  310. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  311. package/dist/core/vision/leader-seat.d.ts +71 -5
  312. package/dist/core/vision/leader-seat.js +235 -33
  313. package/dist/core/vision/leader-seat.js.map +1 -1
  314. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  315. package/dist/core/vision/leader-thread-types.js +9 -0
  316. package/dist/core/vision/leader-thread-types.js.map +1 -0
  317. package/dist/core/vision/leader-thread.d.ts +138 -0
  318. package/dist/core/vision/leader-thread.js +926 -0
  319. package/dist/core/vision/leader-thread.js.map +1 -0
  320. package/dist/core/vision/leader-types.d.ts +75 -1
  321. package/dist/core/vision/leader.d.ts +88 -18
  322. package/dist/core/vision/leader.js +269 -69
  323. package/dist/core/vision/leader.js.map +1 -1
  324. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js → ActionMenu-CIiX2X8w.js} +2 -2
  325. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  327. package/dist/core/web/public/next/assets/{Advanced-B-LqYXvd.js.map → Advanced-DHsysoIL.js.map} +1 -1
  328. package/dist/core/web/public/next/assets/App-CMeAocmW.js +7 -0
  329. package/dist/core/web/public/next/assets/{App-E2zCDRxm.js.map → App-CMeAocmW.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  331. package/dist/core/web/public/next/assets/{AppsSection-8wXPPhZb.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  333. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  334. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js +3 -0
  335. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js.map +1 -0
  336. package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
  337. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  338. package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  340. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  341. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js → BranchBar-BxhdiIpx.js} +2 -2
  342. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js +2 -0
  344. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js.map +1 -0
  345. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-D90dzI_o.js} +2 -2
  346. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-D90dzI_o.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-qKDBC65C.js} +2 -2
  348. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  350. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  351. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  352. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  353. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js.map +1 -0
  354. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  355. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  357. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  358. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  359. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  360. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  361. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  362. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-D3msQlCj.js} +2 -2
  366. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-D3msQlCj.js.map} +1 -1
  367. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Ix6hvXlY.js} +2 -2
  368. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-C4WKsCIe.js} +2 -2
  370. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  371. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  372. package/dist/core/web/public/next/assets/{DockHost-DW9q0NdR.js.map → DockHost-aWP7liri.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-D2IRy3Cg.js} +2 -2
  374. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  375. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-DMr18muX.js} +2 -2
  376. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-DMr18muX.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js +2 -0
  378. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js.map +1 -0
  379. package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
  380. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  381. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  382. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  383. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js → GearTray-Dt-ee32-.js} +2 -2
  385. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  387. package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  388. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-CLJQLe7M.js} +2 -2
  389. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-D_KRJA9V.js} +2 -2
  391. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js.map → Input-D_KRJA9V.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  393. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  394. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  395. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  396. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  397. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  398. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  399. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  400. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  401. package/dist/core/web/public/next/assets/{McpSection-BRuCcTjT.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  402. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-DFvk06qG.js} +3 -3
  403. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  404. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  405. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  406. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-CMj-VafN.js} +2 -2
  407. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js.map → Meter-CMj-VafN.js.map} +1 -1
  408. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  409. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  410. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  411. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  412. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  413. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  414. package/dist/core/web/public/next/assets/NeedsYouList-CCsijdWt.js +2 -0
  415. package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
  417. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  418. package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  419. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js +3 -0
  420. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js.map +1 -0
  421. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  422. package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  423. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  424. package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  425. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  426. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  427. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-Co5UB6We.js} +2 -2
  428. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  429. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  430. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  431. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  432. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  434. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  435. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  436. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  437. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  438. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  439. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  441. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-J5R3zDkB.js} +3 -3
  443. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  444. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-CGh_-tBb.js} +2 -2
  445. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  446. package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-CWnmUzs3.js} +2 -2
  447. package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-CWnmUzs3.js.map} +1 -1
  448. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-sp4KsnUo.js} +2 -2
  449. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  450. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  451. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  452. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-DbFjwR1h.js} +2 -2
  453. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  454. package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js → SettingsSection-Ch23msJ5.js} +2 -2
  455. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  456. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js +2 -0
  457. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js.map +1 -0
  458. package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
  459. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  460. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  461. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js → Sheet-BZ2AG4Eo.js} +2 -2
  462. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  464. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  466. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js.map +1 -0
  467. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-KVoJLDD6.js} +2 -2
  468. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js.map → Slider-KVoJLDD6.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  470. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  471. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  472. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXsYqmdU.js} +2 -2
  473. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  474. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  475. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  476. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js → Surface-BfDmQcKe.js} +2 -2
  477. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-BfDmQcKe.js.map} +1 -1
  478. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  479. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  480. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  481. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js → Switch-9NtO_6Lj.js} +2 -2
  482. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-DscCRFcN.js} +2 -2
  484. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-DscCRFcN.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js} +5 -5
  486. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  487. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  488. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  489. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DG70zH0W.js} +4 -4
  490. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  492. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  493. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  494. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  495. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  496. package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  498. package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js.map → actions-CY-PjpGc.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  500. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js → apps-model-Du02KhAf.js} +2 -2
  501. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-Du02KhAf.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-79SeuKlJ.js} +2 -2
  503. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  505. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  506. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  507. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  508. package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  509. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  510. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  511. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  512. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  513. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  514. package/dist/core/web/public/next/assets/cloud-model-BDivRMqv.js +2 -0
  515. package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  516. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  517. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  519. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js → command-catalog-BIntSa9l.js} +2 -2
  521. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js → context-model-Br8t9jgG.js} +2 -2
  523. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-Br8t9jgG.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-CokrgEUq.js} +3 -3
  525. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js.map → context-model-CokrgEUq.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  527. package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js.map → context-queries-eL3caKVG.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-B9K-wmcB.js} +2 -2
  529. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js +2 -0
  531. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js.map +1 -0
  532. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-BJ6ZqB2t.js} +2 -2
  533. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-BvDR3gjp.js} +2 -2
  535. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-W2UFVMZJ.js} +2 -2
  537. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-CtI1SlMX.js} +2 -2
  539. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/format-CH4g_sl1.js +2 -0
  541. package/dist/core/web/public/next/assets/format-CH4g_sl1.js.map +1 -0
  542. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  543. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js → git-model-Dnkd1TnK.js} +2 -2
  545. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  546. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  547. package/dist/core/web/public/next/assets/{global-CNNGMril.js.map → global-CMNW_dqn.js.map} +1 -1
  548. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  549. package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  550. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-D1sYbCTQ.js} +2 -2
  551. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-D1sYbCTQ.js.map} +1 -1
  552. package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-DZ-UQ7v8.js} +3 -3
  553. package/dist/core/web/public/next/assets/{index-QesfXBsb.js.map → index-DZ-UQ7v8.js.map} +1 -1
  554. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  555. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  556. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  557. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  558. package/dist/core/web/public/next/assets/{live-model-De-q0ZFK.js → live-model-D_32RAOR.js} +2 -2
  559. package/dist/core/web/public/next/assets/live-model-D_32RAOR.js.map +1 -0
  560. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-7hA92hRg.js} +2 -2
  561. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js.map → mind.module-7hA92hRg.js.map} +1 -1
  562. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  563. package/dist/core/web/public/next/assets/{mutations-DTCtKCn_.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  564. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-0dOYe2rJ.js} +2 -2
  565. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-0dOYe2rJ.js.map} +1 -1
  566. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-C4wOnFtE.js} +2 -2
  567. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  568. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  569. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js → queries-BTXWdZzU.js} +2 -2
  570. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-BTXWdZzU.js.map} +1 -1
  571. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  572. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  573. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-DfNLgK_I.js} +2 -2
  574. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  575. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  576. package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  577. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-CLCdqwkR.js} +2 -2
  578. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  579. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-C-qBeu-8.js} +3 -3
  580. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-C-qBeu-8.js.map} +1 -1
  581. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-Dj71tdD-.js} +2 -2
  582. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  583. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  584. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  585. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js → tasks-model-O8yR5YXp.js} +2 -2
  586. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  587. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-CoRZq9iO.js} +2 -2
  588. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  589. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  590. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  591. package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
  592. package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
  593. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-AdjEyEtn.js} +2 -2
  594. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  595. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-CuuMHeDX.js} +2 -2
  596. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  597. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BBcp02SZ.js} +2 -2
  598. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  599. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-CbXVYQYI.js} +2 -2
  600. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  601. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-C_Fpe_sH.js} +2 -2
  602. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  603. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  604. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  605. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-DgbigUlV.js} +2 -2
  606. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  607. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-S56hIiXS.js} +2 -2
  608. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  609. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  610. package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js.map → verse-model-DAVevkNe.js.map} +1 -1
  611. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-B_RAtNZ_.js} +3 -3
  612. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  613. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js +2 -0
  614. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js.map +1 -0
  615. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-dji5-Al3.js} +2 -2
  616. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  617. package/dist/core/web/public/next/index.html +1 -1
  618. package/dist/core/web/read-projection-worker.js +2 -1
  619. package/dist/core/web/read-projection-worker.js.map +1 -1
  620. package/dist/core/web/read-projections.d.ts +3 -0
  621. package/dist/core/web/read-projections.js +2 -2
  622. package/dist/core/web/read-projections.js.map +1 -1
  623. package/dist/core/web/visibility.js +3 -4
  624. package/dist/core/web/visibility.js.map +1 -1
  625. package/dist/release-dependency-inventory.json +1 -1
  626. package/docs/AUTONOMY-GAP.md +1 -1
  627. package/package.json +3 -2
  628. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
  629. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
  630. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
  631. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +0 -2
  632. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js.map +0 -1
  633. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
  634. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
  635. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
  636. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
  637. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
  638. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
  639. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  640. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +0 -2
  641. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +0 -1
  642. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
  643. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
  644. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +0 -2
  645. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +0 -1
  646. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  647. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
  648. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
  649. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
  650. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +0 -3
  651. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +0 -1
  652. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +0 -2
  653. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js.map +0 -1
  654. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +0 -2
  655. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +0 -2
  656. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +0 -2
  658. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js.map +0 -1
  659. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
  660. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +0 -2
  661. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +0 -1
  662. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
  664. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
  665. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
  666. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +0 -3
  667. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
  668. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
  669. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
  670. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +0 -2
  671. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BX2nkdmZ.js +0 -7
  672. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
  673. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +0 -1
  674. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  675. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +0 -2
  676. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +0 -1
  677. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +0 -1
  678. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
  679. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
  680. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  681. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +0 -2
  682. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +0 -1
  683. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +0 -2
  684. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js.map +0 -1
  685. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +0 -2
  686. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js.map +0 -1
  687. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  688. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +0 -2
  689. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +0 -3
  690. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +0 -1
  691. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
  692. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
  693. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +0 -10
  694. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  695. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +0 -2
  696. package/dist/core/web/public/next/assets/budget-queries-DsAjH8ac.js +0 -2
  697. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +0 -2
  698. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +0 -1
  699. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  700. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
  701. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +0 -1
  702. package/dist/core/web/public/next/assets/context-queries-CktFQqSS.js +0 -2
  703. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
  704. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
  705. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
  706. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
  707. package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
  708. package/dist/core/web/public/next/assets/guarded-runners-DPh2d32e.js +0 -2
  709. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
  710. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
  711. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
  712. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +0 -2
  713. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
  714. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +0 -1
  715. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
  716. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
  717. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +0 -2
  718. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
  719. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AppsSection-8wXPPhZb.js","names":[],"sources":["../../../../../../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/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 { copyText } from '../../../components/primitives/clipboard.js';\nimport { IconCheck, IconCopy } from '../../../components/primitives/icons.js';\nimport styles from './Apps.module.css';\n\n// Moved to a style-free module so other surfaces can copy without Apps' CSS.\nexport { copyText };\n\n/** SPEC-310C §4. */\nexport const COPY_CONFIRM_MS = 1_200;\n\nexport function CopyPill({ text, label, what }: { text: string; label?: string; /** \"the Codex launch command\" */ what: string }) {\n const [state, setState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => () => { if (timer.current) clearTimeout(timer.current); }, []);\n\n const onCopy = async () => {\n const ok = await copyText(text);\n setState(ok ? 'copied' : 'failed');\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setState('idle'), COPY_CONFIRM_MS);\n };\n\n return (\n <span className={styles.pillWrap}>\n <button\n type=\"button\"\n className={styles.pill}\n data-state={state}\n onClick={() => void onCopy()}\n aria-label={`Copy ${what}: ${text}`}\n title={`Copy: ${text}`}\n >\n <code className={styles.pillText}>{label ?? text}</code>\n <span className={styles.pillIcon} aria-hidden=\"true\">\n {state === 'copied' ? <IconCheck size={14} /> : <IconCopy size={14} />}\n </span>\n </button>\n <span className={styles.visuallyHidden} role=\"status\" aria-live=\"polite\">\n {state === 'copied' ? 'Copied' : state === 'failed' ? 'Copy failed — select the command and copy it yourself' : ''}\n </span>\n </span>\n );\n}\n","/**\n * routes/verse/apps/launch.ts — where a [Launch ▸] goes.\n *\n * Two homes for the agent's terminal:\n * - INSIDE Verse: a tab in the chat dock's Terminal (C4's pane, C2's dock),\n * in the folder of the chat you have open. Needs the desktop app (the\n * sidecar's Bun PTY — GET /api/verse/terminal says `available`), the\n * Terminal pane to have landed in this build, and an open chat to host it.\n * - Terminal.app: POST /api/verse/apps/:id/launch, in the folder you chose.\n * Works from a plain browser too (macOS).\n *\n * In-Verse launch rides the dock's own one-shot request (dock-store.ts\n * `requestTerminal`): `{ appId }`, plus `{ via, model }` for an Ollama launch\n * (the contract fields on VerseTerminalCreateRequest). The server resolves\n * the command itself — the catalog's own argv, or `ollama launch <id>\n * [--model <tag>]` through the same `resolveAppLaunch` Apps' Terminal.app\n * launch uses, which refuses an agent that is not installed, an Ollama that\n * does not list it, or a tag it does not have — and RUNS it in the new tab.\n * Nothing typed comes from the page; the dialog shows that exact command\n * before the click. (Until 3.10.1 a model launch was only pasted, because\n * the request had no model field.)\n */\nimport { shellCommandText } from '../health/health-model.js';\nimport { requestTerminal } from '../dock/dock-store.js';\nimport { isSlotAvailable } from '../shell/slots.js';\nimport { setVerseSection } from '../verse-ui-store.js';\nimport type { LaunchChoice } from './apps-model.js';\n\n/** An argv as the operator would type it (the same quoting the health banner uses). */\nexport const commandText = shellCommandText;\n\nexport interface InVerseAvailability {\n available: boolean;\n /** Why not, in operator language; null when available. */\n reason: string | null;\n}\n\nexport function inVerseAvailability(input: {\n terminalAvailable: boolean | null;\n terminalReason: string | null;\n activeSessionId: string | null;\n slotLanded?: boolean;\n}): InVerseAvailability {\n const landed = input.slotLanded ?? isSlotAvailable('terminal-pane');\n if (!landed) return { available: false, reason: 'This build has no Verse terminal yet.' };\n if (input.terminalAvailable !== true) {\n return { available: false, reason: input.terminalReason ?? 'The Verse terminal needs the desktop app.' };\n }\n if (input.activeSessionId === null) return { available: false, reason: 'Open a chat first — its terminal hosts the agent.' };\n return { available: true, reason: null };\n}\n\n/** Open the agent in a new dock terminal tab and bring Chat forward. */\nexport function launchInVerse(appId: string, choice: LaunchChoice): void {\n if (choice.via === 'native' && choice.model === null) {\n requestTerminal({ newTab: true, appId });\n } else {\n // A model is an Ollama tag: it only ever launches through Ollama.\n requestTerminal({ newTab: true, appId, via: 'ollama', ...(choice.model !== null ? { model: choice.model } : {}) });\n }\n // The request waits in the dock store until Chat serves it (ChatSection\n // clears requests only on a chat SWITCH, not on its first mount).\n setVerseSection('chat');\n}\n","/**\n * routes/verse/apps/AccountsGroup.tsx — ACCOUNTS: every seat's plan,\n * connection (A2), 5-hour and weekly windows with their resets, and how much\n * is \"Reserved for you\" (A9) — the shared CapacityStrip in its accounts mode —\n * plus the one thing each seat needs from you.\n *\n * Every row leads with a status an operator can read at a glance —\n * \"Connected · usable now\", \"Spent · resets Fri 11:46 PM\" (and \"usable again\n * in 7h 12m\"), \"Signed out · reconnect to use it\", \"Checking…\" — says when it\n * was last checked, and usable accounts come first.\n *\n * Reconnect the provider's own sign-in, opened in Terminal by the health\n * route (Verse never sees a credential);\n * Check again a zero-cost health sweep (status commands only), for a seat\n * that is spent, unread or unavailable — run here, behind the\n * mutation-token gate, with the row reading \"Checking…\";\n * Fix the command A2 says fixes it (a CLI re-pin), shown to copy —\n * never run for you;\n * Edit budget A9's BudgetControl in a sheet.\n */\nimport { useId, useRef, useState } from 'react';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport type { SeatHealthReport } from '../../../../core/verse/health-types.js';\nimport type { VerseSeat } from '../../../data/api-types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { BudgetControl } from '../budget/BudgetControl.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { refreshSeatHealth } from '../health/health-queries.js';\nimport { CapacityStrip } from '../usage/CapacityStrip.js';\nimport { accountStatus, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { accountActions } from './apps-model.js';\nimport { AppGroup } from './AppRow.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText } from './launch.js';\nimport styles from './Apps.module.css';\n\nexport const ACCOUNTS_EMPTY_TEXT =\n 'No accounts connected yet. Sign in to Claude Code, Codex or Grok in a terminal, or start Ollama for local models — they show up here within a minute.';\n\nexport function AccountsGroup({\n seats,\n health,\n budget,\n loading,\n reconnecting,\n onReconnect,\n now,\n}: {\n seats: readonly VerseSeat[];\n health: readonly SeatHealthReport[] | null;\n budget: BudgetView | null;\n loading: boolean;\n /** Seat whose sign-in window is being opened. */\n reconnecting: string | null;\n onReconnect: (row: CapacityRow) => void;\n /** Injected clock for tests. */\n now?: number;\n}) {\n const [fixing, setFixing] = useState<CapacityRow | null>(null);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const [checking, setChecking] = useState<string | null>(null);\n const [note, setNote] = useState<{ tone: 'neutral' | 'danger'; text: string } | null>(null);\n const gate = useTokenGate();\n const fixTitle = useId();\n const sheetTitle = useId();\n const closeRef = useRef<HTMLButtonElement>(null);\n const healthRead = health !== null;\n\n const checkAgain = async (row: CapacityRow) => {\n setChecking(row.seatId);\n setNote(null);\n try {\n const done = await gate.run(`Check ${row.label} again (status commands only — nothing is spent)`, () => refreshSeatHealth());\n if (done) setNote({ tone: 'neutral', text: `Checked ${row.label} again.` });\n } catch (err) {\n setNote({ tone: 'danger', text: describeContextError(err) });\n } finally {\n setChecking(null);\n }\n };\n\n return (\n <AppGroup\n id=\"accounts\"\n title=\"Accounts\"\n caveat=\"Which accounts you can use now, which are spent and when they reset, and how much autonomy leaves for you.\"\n >\n {loading ? (\n <p className={styles.loadingLine} aria-busy=\"true\">Reading accounts…</p>\n ) : (\n <CapacityStrip\n seats={seats}\n health={health}\n budget={budget}\n labelledBy=\"apps-group-accounts\"\n emptyText={ACCOUNTS_EMPTY_TEXT}\n accounts={{ healthRead, checkingSeatId: checking, ...(now !== undefined ? { now } : {}) }}\n renderActions={(row) =>\n // Actions come from the SETTLED status, so \"Check again\" stays in\n // place (busy) while its own check runs instead of vanishing.\n accountActions(row, accountStatus(row, { healthRead, ...(now !== undefined ? { now } : {}) })).map((action) => (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.primary && action.kind !== 'edit-budget' ? 'primary' : 'ghost'}\n busy={(action.kind === 'reconnect' && reconnecting === row.seatId) || (action.kind === 'check-again' && checking === row.seatId)}\n aria-label={`${action.label}: ${row.label}`}\n onClick={() => {\n if (action.kind === 'reconnect') onReconnect(row);\n else if (action.kind === 'check-again') void checkAgain(row);\n else if (action.kind === 'fix') setFixing(row);\n else setBudgetOpen(true);\n }}\n >\n {action.label}\n </Button>\n ))\n }\n />\n )}\n\n <p className={note ? styles.accountsNote : styles.visuallyHidden} data-tone={note?.tone} role=\"status\" aria-live=\"polite\">\n {note?.text ?? ''}\n </p>\n\n {fixing !== null && fixing.connection?.fixCommand ? (\n <Dialog\n open\n onClose={() => setFixing(null)}\n titleId={fixTitle}\n title={`Fix ${fixing.label}`}\n description={fixing.connection.word}\n initialFocusRef={closeRef}\n >\n <div className={styles.dialogBody}>\n {fixing.connection.reasons.map((reason) => <p key={reason}>{reason}</p>)}\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Run this in a terminal</span>\n <CopyPill text={commandText(fixing.connection.fixCommand)} what={`the fix for ${fixing.label}`} />\n </div>\n <p>Verse shows the command and never runs it for you: it changes which CLI this seat is pinned to.</p>\n <div className={styles.dialogActions}>\n <Button ref={closeRef} variant=\"subtle\" onClick={() => setFixing(null)}>Done</Button>\n </div>\n </div>\n </Dialog>\n ) : null}\n\n <Sheet\n open={budgetOpen}\n onClose={() => setBudgetOpen(false)}\n titleId={sheetTitle}\n title=\"Budget\"\n description=\"How much of each seat autonomy may use, and how much is kept for you.\"\n width={560}\n >\n {budgetOpen ? <BudgetControl /> : null}\n </Sheet>\n\n <MutationTokenDialog\n open={gate.dialog.open}\n reason={gate.dialog.reason}\n tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={gate.dialog.onClose}\n onUnlocked={gate.dialog.onUnlocked}\n />\n </AppGroup>\n );\n}\n","/**\n * routes/verse/apps/apps-queries.ts — the reads and writes behind Apps &\n * Accounts (server: core/verse/apps-api.ts; C4's terminal for availability).\n *\n * Reads are OPTIONAL (the Usage/MCP convention): a server without the route\n * answers 404, which means \"this group has no source here\", not \"Verse is\n * broken\" — the page still renders Accounts and MCP from their own routes.\n * A 401 still propagates: an expired read session is the whole surface's\n * problem, not one group's.\n *\n * Writes pull the held mutation token and touch the hold on success. Nothing\n * here spends: refresh re-runs status commands, and toggle/launch open a\n * visible Terminal window that the operator drives.\n */\nimport type { VerseAppsResponse, VerseTerminalListResponse } from '../../../../core/verse/workbench-types.js';\nimport { VERSE_APPS_PATH, VERSE_TERMINAL_PATH } from '../../../../core/verse/workbench-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { refetchQuery } from '../../../data/cache.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { oneShotFetcher } from '../health/health-queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const APPS_KEY = 'verse-apps';\nexport const TERMINAL_STATUS_KEY = 'verse-terminal-status';\n\nexport type OptionalResult<T> =\n | { available: true; data: T }\n | { available: false; reason: string };\n\nasync function optional<T>(path: string, signal?: AbortSignal): Promise<OptionalResult<T>> {\n try {\n return { available: true, data: await apiGet<T>(path, signal) };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n if (err instanceof ApiError && err.status === 404) {\n return { available: false, reason: 'This server is older than Apps & Accounts, so desktop, terminal and local rows are not available.' };\n }\n return { available: false, reason: err instanceof ApiError ? `The apps check answered HTTP ${err.status}.` : 'The apps check could not be reached.' };\n }\n}\n\n/** GET /api/verse/apps — cached on the server; cheap to read. */\nexport const appsQuery: QueryDef<OptionalResult<VerseAppsResponse>> = {\n key: APPS_KEY,\n fetch: (signal) => optional<VerseAppsResponse>(VERSE_APPS_PATH, signal),\n};\n\n/**\n * GET /api/verse/terminal (C4). Only `available` matters here: whether a\n * Launch can open INSIDE Verse (the desktop app's Bun PTY) or has to go to\n * Terminal.app. Absent route = not available.\n */\nexport const terminalStatusQuery: QueryDef<OptionalResult<VerseTerminalListResponse>> = {\n key: TERMINAL_STATUS_KEY,\n fetch: (signal) => optional<VerseTerminalListResponse>(VERSE_TERMINAL_PATH, signal),\n};\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/** Re-ask the login shell for PATH and re-probe every row; every reader sees the result. */\nexport async function refreshApps(): Promise<VerseAppsResponse> {\n const body = await post<VerseAppsResponse>(`${VERSE_APPS_PATH}/refresh`, {});\n await refetchQuery(\n APPS_KEY,\n oneShotFetcher(() => Promise.resolve({ available: true as const, data: body }), () => appsQuery.fetch()),\n true,\n );\n return body;\n}\n\nexport interface AppActionResponse {\n ok: true;\n opened: 'terminal-app';\n /** The command as the operator would type it. */\n command: string[];\n}\n\n/**\n * Flip a desktop switch. `confirm: true` is sent ONLY from the confirmation\n * dialog, after the operator saw both commands; the server refuses anything\n * else.\n */\nexport async function toggleDesktopApp(appId: string, enabled: boolean): Promise<AppActionResponse> {\n const result = await post<AppActionResponse>(`${VERSE_APPS_PATH}/${encodeURIComponent(appId)}/toggle`, { enabled, confirm: true });\n void refetchQuery(APPS_KEY, () => appsQuery.fetch(), true);\n return result;\n}\n\nexport interface LaunchInTerminalAppRequest {\n root: string;\n via?: 'native' | 'ollama';\n model?: string | null;\n}\n\n/** Open the agent in a Terminal.app window, in `root`. */\nexport function launchInTerminalApp(appId: string, request: LaunchInTerminalAppRequest): Promise<AppActionResponse> {\n return post<AppActionResponse>(`${VERSE_APPS_PATH}/${encodeURIComponent(appId)}/launch`, {\n root: request.root,\n ...(request.via ? { via: request.via } : {}),\n ...(request.model ? { model: request.model } : {}),\n });\n}\n","/**\n * routes/verse/apps/DesktopToggleDialog.tsx — the confirmation in front of a\n * desktop switch (SPEC-310C §4: \"Turning either on needs a confirmation that\n * shows the command and --restore\").\n *\n * These switches change ANOTHER app's settings (Claude Desktop, Hermes\n * Desktop), so the dialog shows exactly what will run and exactly how to undo\n * it, and says where it runs: a Terminal window, where the tool's own prompts\n * are answered by the operator — Verse never answers them. Turning Claude\n * Desktop ON carries the recommendation against it (SPEC-310C §0.5).\n */\nimport { useId, useRef } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { commandText } from './launch.js';\nimport { CopyPill } from './CopyPill.js';\nimport styles from './Apps.module.css';\n\nexport function DesktopToggleDialog({\n row,\n enable,\n busy,\n error,\n onCancel,\n onConfirm,\n}: {\n row: VerseAppRow | null;\n /** The direction asked for: true = switch on, false = restore. */\n enable: boolean;\n busy: boolean;\n error: string | null;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n const titleId = useId();\n const cancelRef = useRef<HTMLButtonElement>(null);\n if (row === null || row.toggle === null) return null;\n const run = enable ? row.toggle.command : row.toggle.restoreCommand;\n const undo = enable ? row.toggle.restoreCommand : row.toggle.command;\n const title = enable ? `Turn on “${row.description}”?` : `Restore ${row.name}?`;\n return (\n <Dialog\n open\n onClose={onCancel}\n titleId={titleId}\n title={title}\n initialFocusRef={cancelRef}\n description={enable ? `This changes ${row.name}’s own settings until you restore it.` : `This puts ${row.name} back on its own defaults.`}\n >\n <div className={styles.dialogBody}>\n {row.detail ? <p>{row.detail}</p> : null}\n {enable && row.id === 'claude-desktop' ? (\n <p>\n Recommended: leave this off. Claude Desktop would run local models instead of its own, and Verse’s local\n seats already use Ollama.\n </p>\n ) : null}\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Runs</span>\n <CopyPill text={commandText(run)} what=\"the command this runs\" />\n </div>\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>{enable ? 'Undo later with' : 'Turn back on with'}</span>\n <CopyPill text={commandText(undo)} what={enable ? 'the restore command' : 'the command that turns it on'} />\n </div>\n <p>\n It opens in a Terminal window so you can answer its prompts. Verse does not answer them for you, and nothing\n changes until you do.\n </p>\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button ref={cancelRef} variant=\"subtle\" onClick={onCancel}>Cancel</Button>\n <Button variant={enable ? 'danger' : 'primary'} busy={busy} onClick={onConfirm}>\n {enable ? 'Open in Terminal' : 'Restore in Terminal'}\n </Button>\n </div>\n </div>\n </Dialog>\n );\n}\n","/**\n * routes/verse/apps/LaunchDialog.tsx — the options behind [Launch ▾]: which\n * folder, the agent's own command or `ollama launch <id>`, which local model,\n * and where (a Verse terminal tab, or Terminal.app).\n *\n * The exact command is always on screen before anything opens. The plain\n * [Launch] button beside it skips this dialog with the defaults (the agent's\n * own command, your current chat or most recent project).\n */\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { launchCommand, type LaunchChoice, type LaunchProject, type LaunchVia } from './apps-model.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText, type InVerseAvailability } from './launch.js';\nimport styles from './Apps.module.css';\n\nexport type LaunchTarget = 'verse' | 'terminal-app';\n\nexport interface LaunchRequest {\n choice: LaunchChoice;\n target: LaunchTarget;\n /** Terminal.app only; a Verse tab opens in the open chat's folder. */\n root: string | null;\n command: string[];\n}\n\nexport function LaunchDialog({\n row,\n projects,\n models,\n inVerse,\n busy,\n error,\n onCancel,\n onLaunch,\n}: {\n row: VerseAppRow | null;\n projects: readonly LaunchProject[];\n /** Ollama tags the local seats run. */\n models: readonly string[];\n inVerse: InVerseAvailability;\n busy: boolean;\n error: string | null;\n onCancel: () => void;\n onLaunch: (request: LaunchRequest) => void;\n}) {\n const titleId = useId();\n const firstRef = useRef<HTMLInputElement>(null);\n const [via, setVia] = useState<LaunchVia>('native');\n const [model, setModel] = useState<string>('');\n const [root, setRoot] = useState<string>(projects[0]?.path ?? '');\n\n // A new row opens with fresh defaults.\n useEffect(() => {\n setVia('native');\n setModel('');\n setRoot(projects[0]?.path ?? '');\n // eslint-disable-next-line react-hooks/exhaustive-deps -- reset per opened row only\n }, [row?.id]);\n\n const choice: LaunchChoice = { via, model: via === 'ollama' && model !== '' ? model : null };\n const command = useMemo(() => (row ? launchCommand(row, choice) : null), [row, choice.via, choice.model]); // eslint-disable-line react-hooks/exhaustive-deps\n if (row === null) return null;\n const nativeCommand = launchCommand(row, { via: 'native', model: null });\n const ollamaCommand = row.ollamaLaunch;\n const radioName = `${titleId}-via`;\n const canTerminalApp = root !== '';\n\n return (\n <Dialog\n open\n onClose={onCancel}\n titleId={titleId}\n title={`Launch ${row.name}`}\n description=\"Nothing starts until you choose where.\"\n initialFocusRef={firstRef}\n >\n <div className={styles.dialogBody}>\n <fieldset className={styles.fieldset}>\n <legend className={styles.legend}>Run</legend>\n {nativeCommand ? (\n <label className={styles.radio}>\n <input ref={firstRef} type=\"radio\" name={radioName} checked={via === 'native'} onChange={() => setVia('native')} />\n <code className={styles.inlineCode}>{commandText(nativeCommand)}</code>\n <span className={styles.hint}>its own command</span>\n </label>\n ) : null}\n {ollamaCommand ? (\n <label className={styles.radio}>\n <input type=\"radio\" name={radioName} checked={via === 'ollama'} onChange={() => setVia('ollama')} />\n <code className={styles.inlineCode}>{commandText(ollamaCommand)}</code>\n <span className={styles.hint}>through Ollama</span>\n </label>\n ) : null}\n </fieldset>\n\n {via === 'ollama' ? (\n models.length > 0 ? (\n <Select label=\"Local model\" value={model} onChange={(e) => setModel(e.target.value)}>\n <option value=\"\">Ollama’s default</option>\n {models.map((m) => <option key={m} value={m}>{m}</option>)}\n </Select>\n ) : (\n <p className={styles.hint}>No local models are known to Verse, so Ollama will ask which to use.</p>\n )\n ) : null}\n\n <Select\n label=\"Folder (Terminal.app)\"\n value={root}\n onChange={(e) => setRoot(e.target.value)}\n hint={projects.length === 0 ? 'No chat folders or enrolled projects yet.' : 'A Verse tab opens in the chat you have open.'}\n disabled={projects.length === 0}\n >\n {projects.length === 0 ? <option value=\"\">—</option> : null}\n {projects.map((p) => <option key={p.path} value={p.path}>{p.name}</option>)}\n </Select>\n\n {command ? (\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Command</span>\n <CopyPill text={commandText(command)} what={`the ${row.name} launch command`} />\n </div>\n ) : null}\n\n {via === 'ollama' && inVerse.available ? (\n <p className={styles.hint}>In a Verse tab this runs exactly the command above — Verse builds it from what is installed, never from this page.</p>\n ) : null}\n {!inVerse.available && inVerse.reason ? <p className={styles.hint}>Verse terminal: {inVerse.reason}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n\n <div className={styles.dialogActions}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant={inVerse.available ? 'subtle' : 'primary'}\n busy={busy}\n disabled={!canTerminalApp || command === null}\n onClick={() => command && onLaunch({ choice, target: 'terminal-app', root, command })}\n >\n Open in Terminal.app\n </Button>\n {inVerse.available ? (\n <Button\n variant=\"primary\"\n disabled={command === null}\n onClick={() => command && onLaunch({ choice, target: 'verse', root: null, command })}\n >\n Open in Verse terminal\n </Button>\n ) : null}\n </div>\n </div>\n </Dialog>\n );\n}\n","/**\n * routes/verse/mcp/mcp.module.css — MCP + CLI management styling.\n *\n * Follows docs/VERSE-DESIGN-V2.md, same as usage.module.css: monochrome\n * ground, 1px hairlines and whitespace for separation (no shadows, no nested\n * rounded boxes), display face for headings, mono for anything the operator\n * has to read character-by-character — which here is the whole point, because\n * the command line is the thing being disclosed.\n */\n\n.section {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: var(--space-5);\n display: flex;\n flex-direction: column;\n gap: var(--space-6);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n}\n\n.panelHead {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding-bottom: var(--space-2);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.panelTitle {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.panelNote,\n.muted {\n margin: 0;\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n line-height: 1.5;\n}\n\n/* A fact that changes what the operator should do. Never colour alone: it\n carries a word (\"Version drift\") as well as the rule. */\n.alert {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-warning, var(--border-strong));\n border-left-width: 3px;\n border-radius: var(--radius-sm);\n background: var(--bg-subtle);\n}\n\n.alertTitle {\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n}\n\n.seatList,\n.rowList {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.seatRow,\n.healthRow {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) 0;\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.seatHead {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n flex-wrap: wrap;\n}\n\n.seatLabel {\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.engineTag,\n.code {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-tertiary, var(--text-secondary));\n}\n\n/* The machine-readable code is shown BESIDE the sentence, never as it. */\n.code {\n letter-spacing: 0;\n}\n\n.count {\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n\n/* The disclosure: everything the operator must read before confirming. */\n.disclosure {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n background: var(--bg-subtle);\n}\n\n.commandLine {\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n word-break: break-all;\n white-space: pre-wrap;\n margin: 0;\n}\n\n.envList {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.envItem {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n padding: 2px var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n}\n\n.warnList {\n margin: 0;\n padding-left: var(--space-4);\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n}\n\n.digest {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-tertiary, var(--text-secondary));\n word-break: break-all;\n}\n\n.actions {\n display: flex;\n gap: var(--space-2);\n align-items: center;\n flex-wrap: wrap;\n}\n","/**\n * routes/verse/mcp/McpServerDisclosure.tsx — what an MCP server IS, rendered\n * so it has to be read.\n *\n * Used in two places and identical in both: listing a server a seat already\n * loads, and previewing one that is about to be written. That sameness is the\n * point — the operator reads the same card either way, so \"what will run\" is\n * never presented differently from \"what runs\".\n *\n * Three rules this component enforces at the render layer:\n *\n * 1. The COMMAND and ARGS are shown in full, in mono, wrapped rather than\n * truncated. A command with an ellipsis in the middle is exactly the\n * one worth reading.\n * 2. Environment variables are listed BY KEY, with the value shown as the\n * literal `<set>` that `redactEnv` produced. The count is stated, so a\n * server handing over six credentials cannot look like one handing over\n * none.\n * 3. The source is a home-relative ref, never an absolute path.\n */\nimport type { ReactNode } from 'react';\nimport type { McpServer } from './mcp-contract.js';\nimport styles from './mcp.module.css';\n\nexport function McpServerDisclosure({\n server,\n heading,\n}: {\n server: McpServer;\n heading?: string;\n}): ReactNode {\n const envKeys = server.env === null ? [] : Object.keys(server.env);\n\n return (\n <div className={styles.disclosure}>\n {heading === undefined ? null : <p className={styles.alertTitle}>{heading}</p>}\n\n <p className={styles.commandLine}>\n {server.command}\n {server.args.length > 0 ? ` ${server.args.join(' ')}` : ''}\n </p>\n\n {envKeys.length === 0 ? (\n <p className={styles.muted}>No environment variables are passed to this server.</p>\n ) : (\n <>\n <p className={styles.muted}>\n {envKeys.length} environment variable{envKeys.length === 1 ? '' : 's'} passed to this\n server. Values are never displayed.\n </p>\n <ul className={styles.envList}>\n {envKeys.map((key) => (\n <li key={key} className={styles.envItem}>\n {key}=&lt;set&gt;\n </li>\n ))}\n </ul>\n </>\n )}\n\n <p className={styles.code}>configured in {server.sourceRef}</p>\n </div>\n );\n}\n","/**\n * routes/verse/mcp/mcp-queries.ts — the reads and writes behind the MCP panel.\n *\n * Reads use the non-throwing `optionalGet` shape the Usage section\n * established: a server without these routes answers 404, and a 404 means\n * \"this panel is degraded\", not \"Verse is broken\". 401 still propagates,\n * because an expired read session is an unauthorized state for the whole\n * surface, not a degraded one.\n *\n * Writes pull the held mutation token from auth-store and touch the hold on\n * success, exactly like `autonomy/control-queries.ts`. There is one addition\n * this surface needs that the others do not: `applyMcpServer` CANNOT be\n * called without a digest that `proposeMcpServer` returned, because the\n * server refuses without it. That is deliberate and it is why there is no\n * single `installMcpServer()` helper here — a one-call install is exactly the\n * shape docs/VERSE-WORKSPACES.md §3 rules out, and it should be impossible to\n * write by accident at this layer too.\n */\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\n\nexport const MCP_SNAPSHOT_KEY = 'verse-mcp-snapshot';\nexport const MCP_CLI_HEALTH_KEY = 'verse-mcp-cli-health';\n\n/** A read that is allowed to be absent. `raw` is null when it was. */\nexport interface OptionalRead {\n raw: unknown;\n available: boolean;\n reason: string | null;\n}\n\nfunction describeFailure(path: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return `This server does not expose ${path}, so this panel has no source.`;\n }\n return `${path} answered HTTP ${err.status}.`;\n }\n return `${path} could not be reached.`;\n}\n\nfunction optionalGet(path: string): (signal?: AbortSignal) => Promise<OptionalRead> {\n return async (signal) => {\n try {\n const raw = await apiGet<unknown>(path, signal);\n return { raw, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { raw: null, available: false, reason: describeFailure(path, err) };\n }\n };\n}\n\n/** GET /api/verse/mcp — which servers each seat would load. */\nexport const mcpSnapshotQuery: QueryDef<OptionalRead> = {\n key: MCP_SNAPSHOT_KEY,\n fetch: optionalGet('/api/verse/mcp'),\n};\n\n/** GET /api/verse/mcp/cli-health — auth, plan and version drift per account. */\nexport const mcpCliHealthQuery: QueryDef<OptionalRead> = {\n key: MCP_CLI_HEALTH_KEY,\n fetch: optionalGet('/api/verse/mcp/cli-health'),\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nexport class McpLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token before changing MCP configuration.');\n this.name = 'McpLockedError';\n }\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new McpLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/** The spec an operator typed. Env VALUES are real here and only here. */\nexport interface McpServerInput {\n name: string;\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/**\n * POST /api/verse/mcp/proposal — validate and disclose. Writes nothing.\n *\n * The response carries the digest `applyMcpServer` demands back. A refusal is\n * a 409 with a full body, which `apiPost` surfaces as an ApiError whose\n * detail carries the `note`.\n */\nexport function proposeMcpServer(target: string, server: McpServerInput): Promise<unknown> {\n return post<unknown>('/api/verse/mcp/proposal', { target, server });\n}\n\n/**\n * POST /api/verse/mcp/apply — perform the write the digest confirms.\n *\n * `digest` is not optional and has no default. It must come from a proposal\n * the operator actually saw.\n */\nexport async function applyMcpServer(\n target: string,\n server: McpServerInput,\n digest: string,\n): Promise<unknown> {\n const result = await post<unknown>('/api/verse/mcp/apply', {\n target,\n server,\n digest,\n confirm: true,\n });\n invalidate(MCP_SNAPSHOT_KEY);\n return result;\n}\n\n/**\n * POST /api/verse/mcp/cli-probe — read the installed CLI versions.\n *\n * A POST because it launches the provider CLIs. Nothing about it is a read.\n */\nexport async function probeCliVersions(): Promise<unknown> {\n const result = await post<unknown>('/api/verse/mcp/cli-probe', {});\n invalidate(MCP_CLI_HEALTH_KEY);\n return result;\n}\n","/**\n * routes/verse/apps/McpGroup.tsx — MCP SERVERS, folded in from the old MCP\n * section (SPEC-310C §4): what each seat would ACTUALLY load, the standing\n * caveat that Claude and local seats load none, and an Add that goes through\n * the two-step, digest-bound write the server already enforces\n * (propose → read the disclosure → apply).\n *\n * The rules the old section refused to soften are kept:\n * - \"configured, but unused\" is said first when it is true;\n * - a CLI version drift is an alert quoting the pinned version;\n * - the unenrolled-folder footgun for Codex/Grok seats is stated;\n * - an env VALUE is never displayed (the disclosure forces '<set>').\n */\nimport { useId, useState, type FormEvent } from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconChevronDown, IconChevronRight, IconPlus } from '../../../components/primitives/icons.js';\nimport { Input } from '../../../components/primitives/Input.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { ApiError } from '../../../data/client.js';\nimport { SCOPE_REASON_COPY, narrowServer, reasonSentence, type CliHealthSnapshot, type McpServer, type McpSnapshot } from '../mcp/mcp-contract.js';\nimport { McpServerDisclosure } from '../mcp/McpServerDisclosure.js';\nimport { applyMcpServer, proposeMcpServer, type McpServerInput } from '../mcp/mcp-queries.js';\nimport { mcpSeatRows, mcpTargets, parseEnvLines, splitArgs, type McpSeatRow } from './apps-model.js';\nimport { AppGroup, AppRow } from './AppRow.js';\nimport styles from './Apps.module.css';\n\n/** The token gate the page owns: runs `action` once unlocked; null when dismissed. */\nexport type GatedRun = <T>(reason: string, action: () => Promise<T>) => Promise<T | null>;\n\nfunction SeatRow({ row }: { row: McpSeatRow }) {\n const [open, setOpen] = useState(false);\n const listId = useId();\n const has = row.servers.length > 0;\n return (\n <AppRow\n id={`mcp-${row.seatId}`}\n name={row.label}\n monogram={row.monogram}\n engine={row.engine}\n description={row.sentence}\n health={{ tone: has ? 'success' : 'off', label: row.loads }}\n aside={\n has ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-expanded={open}\n aria-controls={listId}\n icon={open ? <IconChevronDown size={14} /> : <IconChevronRight size={14} />}\n onClick={() => setOpen((v) => !v)}\n >\n {open ? 'Hide servers' : 'Show servers'}\n </Button>\n ) : null\n }\n >\n <span className={styles.reasonCode}>{row.reason}</span>\n {has && open ? (\n <div id={listId} className={styles.servers}>\n {row.servers.map((server) => <McpServerDisclosure key={server.name} server={server} heading={server.name} />)}\n </div>\n ) : null}\n </AppRow>\n );\n}\n\ninterface Proposal {\n server: McpServer;\n targetRef: string;\n targetLabel: string;\n action: 'add' | 'replace';\n replaces: McpServer | null;\n warnings: string[];\n note: string;\n digest: string;\n}\n\nfunction narrowProposal(raw: unknown): Proposal | null {\n if (raw === null || typeof raw !== 'object') return null;\n const r = raw as Record<string, unknown>;\n const server = narrowServer(r['server']);\n const target = r['target'] as Record<string, unknown> | undefined;\n if (!server || typeof r['digest'] !== 'string' || !target) return null;\n return {\n server,\n targetRef: typeof target['ref'] === 'string' ? target['ref'] : '',\n targetLabel: typeof target['label'] === 'string' ? target['label'] : '',\n action: r['action'] === 'replace' ? 'replace' : 'add',\n replaces: narrowServer(r['replaces']),\n warnings: Array.isArray(r['warnings']) ? r['warnings'].filter((w): w is string => typeof w === 'string') : [],\n note: typeof r['note'] === 'string' ? r['note'] : '',\n digest: r['digest'],\n };\n}\n\nfunction describe(err: unknown): string {\n if (err instanceof ApiError) return err.detail ?? `The server refused (HTTP ${err.status}).`;\n if (err instanceof Error && err.name === 'VerseMutationLockedError') return 'Unlock actions with the mutation token first.';\n return 'The request could not be completed.';\n}\n\nfunction AddServerSheet({ open, snapshot, run, onClose, onAdded }: {\n open: boolean;\n snapshot: McpSnapshot | null;\n run: GatedRun;\n onClose: () => void;\n onAdded: (message: string) => void;\n}) {\n const titleId = useId();\n const targets = mcpTargets(snapshot);\n const [target, setTarget] = useState('hub');\n const [name, setName] = useState('');\n const [command, setCommand] = useState('');\n const [args, setArgs] = useState('');\n const [env, setEnv] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [proposal, setProposal] = useState<{ input: McpServerInput; target: string; value: Proposal } | null>(null);\n\n const reset = () => {\n setProposal(null);\n setError(null);\n setBusy(false);\n };\n\n const review = async (event: FormEvent) => {\n event.preventDefault();\n setError(null);\n const parsedEnv = parseEnvLines(env);\n if (!parsedEnv.ok) {\n setError(parsedEnv.error);\n return;\n }\n const input: McpServerInput = {\n name: name.trim(),\n command: command.trim(),\n args: splitArgs(args),\n ...(Object.keys(parsedEnv.env).length > 0 ? { env: parsedEnv.env } : {}),\n };\n setBusy(true);\n try {\n const raw = await run('Review an MCP server before adding it', () => proposeMcpServer(target, input));\n if (raw === null) return;\n const value = narrowProposal(raw);\n if (!value) setError('The server answered with something that is not a proposal.');\n else setProposal({ input, target, value });\n } catch (err) {\n setError(describe(err));\n } finally {\n setBusy(false);\n }\n };\n\n const apply = async () => {\n if (!proposal) return;\n setBusy(true);\n setError(null);\n try {\n const done = await run('Add an MCP server', () => applyMcpServer(proposal.target, proposal.input, proposal.value.digest));\n if (done === null) return;\n onAdded(`${proposal.value.action === 'replace' ? 'Replaced' : 'Added'} ${proposal.value.server.name} in ${proposal.value.targetRef}.`);\n setName('');\n setCommand('');\n setArgs('');\n setEnv('');\n reset();\n onClose();\n } catch (err) {\n setError(describe(err));\n } finally {\n setBusy(false);\n }\n };\n\n const chosen = targets.find((t) => t.id === target);\n return (\n <Sheet\n open={open}\n onClose={() => { reset(); onClose(); }}\n titleId={titleId}\n title={proposal ? 'Review before adding' : 'Add an MCP server'}\n description=\"An MCP server is a program that runs with the agent’s permissions. Nothing is written until you confirm what you read.\"\n width={520}\n >\n {proposal === null ? (\n <form className={styles.dialogBody} onSubmit={(e) => void review(e)}>\n <Select label=\"Add to\" value={target} onChange={(e) => setTarget(e.target.value)}\n hint={chosen?.disabledReason ?? (target === 'hub' ? 'The hub’s own registry.' : 'A Verse chat on a Claude seat still loads none; Claude Code in a terminal does.')}>\n {targets.map((t) => <option key={t.id} value={t.id} disabled={t.disabledReason !== null}>{t.label}</option>)}\n </Select>\n <Input label=\"Name\" value={name} onChange={(e) => setName(e.target.value)} required placeholder=\"filesystem\" autoComplete=\"off\" />\n <Input label=\"Command\" value={command} onChange={(e) => setCommand(e.target.value)} required placeholder=\"/opt/homebrew/bin/npx\" autoComplete=\"off\"\n hint=\"An absolute path is safest; a bare name is looked up on PATH when the server starts.\" />\n <Input label=\"Arguments\" value={args} onChange={(e) => setArgs(e.target.value)} placeholder='-y @modelcontextprotocol/server-filesystem \"~/code\"' autoComplete=\"off\" />\n <label className={styles.fieldLabel}>\n Environment <span className={styles.hint}>One KEY=value per line. Values are sent once and never shown again.</span>\n <textarea className={styles.textarea} value={env} onChange={(e) => setEnv(e.target.value)} spellCheck={false} autoComplete=\"off\" />\n </label>\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>Cancel</Button>\n <Button type=\"submit\" variant=\"primary\" busy={busy} disabled={name.trim() === '' || command.trim() === '' || chosen?.disabledReason != null}>\n Review\n </Button>\n </div>\n </form>\n ) : (\n <div className={styles.dialogBody}>\n <p>\n {proposal.value.action === 'replace' ? 'Replaces' : 'Adds'} <strong>{proposal.value.server.name}</strong> in{' '}\n <code className={styles.inlineCode}>{proposal.value.targetRef}</code>\n {proposal.value.targetLabel ? ` (${proposal.value.targetLabel})` : ''}.\n </p>\n <McpServerDisclosure server={proposal.value.server} heading=\"This will run\" />\n {proposal.value.replaces ? <McpServerDisclosure server={proposal.value.replaces} heading=\"Replacing\" /> : null}\n {proposal.value.warnings.length > 0 ? (\n <ul className={styles.warnings}>{proposal.value.warnings.map((w) => <li key={w}>{w}</li>)}</ul>\n ) : null}\n {proposal.value.note ? <p className={styles.hint}>{proposal.value.note}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button variant=\"ghost\" onClick={() => setProposal(null)}>Back</Button>\n <Button variant=\"primary\" busy={busy} onClick={() => void apply()}>\n {proposal.value.action === 'replace' ? 'Replace server' : 'Add server'}\n </Button>\n </div>\n </div>\n )}\n </Sheet>\n );\n}\n\nexport function McpGroup({\n snapshot,\n cliHealth,\n unavailable,\n loading,\n run,\n onAdded,\n headingRef,\n}: {\n snapshot: McpSnapshot | null;\n cliHealth: CliHealthSnapshot | null;\n /** Why the per-seat read is missing; null when it arrived (or is loading). */\n unavailable: string | null;\n loading: boolean;\n run: GatedRun;\n onAdded: (message: string) => void;\n headingRef?: React.Ref<HTMLHeadingElement>;\n}) {\n const [adding, setAdding] = useState(false);\n const rows = snapshot ? mcpSeatRows(snapshot) : [];\n return (\n <AppGroup\n id=\"mcp-servers\"\n title=\"MCP servers\"\n headingRef={headingRef}\n action={\n <Button variant=\"subtle\" size=\"sm\" icon={<IconPlus size={14} />} onClick={() => setAdding(true)} aria-haspopup=\"dialog\">\n Add server\n </Button>\n }\n caveat={\n <>\n Claude and local seats load no MCP servers: Verse starts them with{' '}\n <code>--strict-mcp-config</code> and an empty <code>--mcp-config</code>. Codex and Grok seats load their own\n account’s config — and an <code>ashlr__</code> write through one is refused on a folder that is not enrolled.\n </>\n }\n >\n {snapshot !== null && snapshot.notes.length > 0 ? (\n <div className={styles.loadingLine} role=\"note\">\n <strong>Configured, but unused.</strong> {snapshot.notes.join(' ')} {snapshot.machine.note}\n </div>\n ) : null}\n {cliHealth !== null && cliHealth.driftDetected ? (\n <div className={styles.loadingLine} role=\"alert\">\n <strong>CLI version drift.</strong> {cliHealth.notes.join(' ')}{' '}\n {cliHealth.accounts.filter((a) => a.versionState === 'drift').map((a) => `${a.label}: ${a.version ?? 'unread'}, pinned ${a.pinnedVersion ?? '—'}.`).join(' ')}\n </div>\n ) : null}\n {snapshot === null ? (\n <p className={styles.loadingLine} aria-busy={loading || undefined}>\n {loading ? 'Reading each seat’s configuration…' : (unavailable ?? 'No per-seat reading is available.')}\n </p>\n ) : (\n <ul className={styles.rows}>\n {rows.map((row) => <SeatRow key={row.seatId} row={row} />)}\n </ul>\n )}\n {snapshot?.scope ? (\n <p className={styles.scopeLine}>\n Scope: {reasonSentence(SCOPE_REASON_COPY, snapshot.scope.reason, 'Locus did not report a usable scope.')}\n {snapshot.scope.tenantRef ? ` (${snapshot.scope.tenantRef})` : ''}\n </p>\n ) : null}\n <AddServerSheet open={adding} snapshot={snapshot} run={run} onClose={() => setAdding(false)} onAdded={onAdded} />\n </AppGroup>\n );\n}\n","/**\n * routes/verse/apps/ServedGroups.tsx — the three groups GET /api/verse/apps\n * serves: DESKTOP (Ollama's switches for other apps), TERMINAL AGENTS and\n * LOCAL MODELS. Rendering only; every decision about a word or an enabled\n * control was made by the server or apps-model.ts.\n */\nimport type { VerseAppGroup, VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconChevronDown, IconPlay } from '../../../components/primitives/icons.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { appHealthTone } from './apps-model.js';\nimport { AppGroup, AppRow } from './AppRow.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText } from './launch.js';\nimport styles from './Apps.module.css';\n\nfunction rowHealth(row: VerseAppRow) {\n return { tone: appHealthTone(row.health.state), label: row.health.label };\n}\n\nexport function DesktopGroup({\n group,\n onToggle,\n onRestore,\n}: {\n group: VerseAppGroup;\n /** Opens the confirmation; never flips anything by itself. */\n onToggle: (row: VerseAppRow, enable: boolean) => void;\n onRestore: (row: VerseAppRow) => void;\n}) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => {\n const restore = row.actions.find((a) => a.kind === 'restore') ?? null;\n return (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n health={rowHealth(row)}\n detail={row.toggle === null ? row.detail : null}\n aside={\n row.toggle === null ? null : (\n <>\n {restore ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onRestore(row)} disabled={restore.disabledReason !== null} title={commandText(restore.command ?? [])}>\n {restore.label}\n </Button>\n ) : null}\n <Switch\n checked={row.toggle.enabled}\n onChange={(next) => onToggle(row, next)}\n aria-label={`${row.description}: ${row.toggle.enabled ? 'on' : 'off'}`}\n aria-describedby={`app-${row.id}-name`}\n />\n </>\n )\n }\n />\n );\n })}\n </ul>\n </AppGroup>\n );\n}\n\nexport function AgentsGroup({\n group,\n quickLaunchReason,\n onQuickLaunch,\n onLaunchOptions,\n}: {\n group: VerseAppGroup;\n /** Why the one-click Launch cannot run anywhere right now (no folder and no Verse tab), or null. */\n quickLaunchReason: string | null;\n onQuickLaunch: (row: VerseAppRow) => void;\n onLaunchOptions: (row: VerseAppRow) => void;\n}) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => {\n const launch = row.actions.find((a) => a.kind === 'launch') ?? null;\n const disabled = launch?.disabledReason ?? quickLaunchReason;\n return (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n version={row.version}\n health={rowHealth(row)}\n detail={row.detail}\n aside={\n <>\n {row.copy && row.installed ? <CopyPill text={row.copy.text} label={row.copy.label} what={`the ${row.name} command`} /> : null}\n {row.ollamaLaunch ? (\n <CopyPill text={commandText(row.ollamaLaunch)} what={`the Ollama launch command for ${row.name}`} />\n ) : null}\n {launch ? (\n launch.disabledReason !== null ? (\n <span className={styles.disabledNote}>{launch.disabledReason}</span>\n ) : (\n <span className={styles.split}>\n <Button\n variant=\"subtle\"\n size=\"sm\"\n icon={<IconPlay size={14} />}\n disabled={disabled !== null}\n title={disabled ?? undefined}\n onClick={() => onQuickLaunch(row)}\n aria-label={`Launch ${row.name}`}\n >\n Launch\n </Button>\n <Button\n variant=\"subtle\"\n size=\"sm\"\n iconOnly\n icon={<IconChevronDown size={14} />}\n aria-label={`Launch options for ${row.name}`}\n title={`Launch options for ${row.name}`}\n aria-haspopup=\"dialog\"\n onClick={() => onLaunchOptions(row)}\n />\n </span>\n )\n ) : null}\n </>\n }\n />\n );\n })}\n </ul>\n </AppGroup>\n );\n}\n\nexport function LocalModelsGroup({ group }: { group: VerseAppGroup }) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n version={row.version}\n health={rowHealth(row)}\n detail={row.detail}\n />\n ))}\n </ul>\n </AppGroup>\n );\n}\n","/**\n * routes/verse/sections/AppsSection.tsx — Apps & Accounts (unit C6,\n * SPEC-310C §4; the gear tray's \"Apps & Accounts\", and where MCP now lives).\n *\n * One page that answers \"what can I run with on this Mac, and is it ready\":\n *\n * ACCOUNTS each seat's plan, connection, 5-hour and weekly windows\n * with resets, \"Reserved for you N%\", and Reconnect / Fix /\n * Edit budget — the shared CapacityStrip;\n * DESKTOP Ollama's switches for Claude Desktop and Hermes Desktop,\n * shown OFF with Restore (SPEC-310C §0.5);\n * TERMINAL AGENTS installed version or \"not installed\", the agent's own\n * command, `ollama launch <id>` only where the installed\n * Ollama lists it, and [Launch ▾];\n * LOCAL MODELS Ollama (models, end-to-end tok/s), llama-server, LM Studio;\n * MCP SERVERS what each seat would load, and Add (propose → disclose → apply).\n *\n * Takes no props, per the shell contract (C1 mounts `sections/*Section.tsx`).\n * `focusGroup` is only for the legacy MCP entry point, which lands on the MCP\n * group of this same page.\n *\n * Polls only while visible (usePollWhileVisible): apps every 60 s (the server\n * caches and re-probes in the background), seats 30 s, health 30 s, budget\n * 60 s. Every mutation goes through the mutation-token gate; nothing on this\n * page spends — the actions open visible Terminal windows or write a config\n * the operator just read.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconRefresh } from '../../../components/primitives/icons.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport type { VerseBootstrap } from '../../../data/api-types.js';\nimport { AccountsGroup } from '../apps/AccountsGroup.js';\nimport { launchProjects, localModelTags, type LaunchChoice } from '../apps/apps-model.js';\nimport { appsQuery, launchInTerminalApp, refreshApps, terminalStatusQuery, toggleDesktopApp } from '../apps/apps-queries.js';\nimport { DesktopToggleDialog } from '../apps/DesktopToggleDialog.js';\nimport { inVerseAvailability, launchInVerse } from '../apps/launch.js';\nimport { LaunchDialog, type LaunchRequest } from '../apps/LaunchDialog.js';\nimport { McpGroup } from '../apps/McpGroup.js';\nimport { AgentsGroup, DesktopGroup, LocalModelsGroup } from '../apps/ServedGroups.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { reconnectSeat, refreshSeatHealth } from '../health/health-queries.js';\nimport { projectCliHealth, projectMcpSnapshot } from '../mcp/mcp-contract.js';\nimport { mcpCliHealthQuery, mcpSnapshotQuery } from '../mcp/mcp-queries.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport type { CapacityRow } from '../usage/capacity-strip-model.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport styles from '../apps/Apps.module.css';\n\n/** The server re-probes in the background after 60 s; reading faster only re-reads its cache. */\nexport const APPS_POLL_MS = 60_000;\n\nfunction checkedAgo(iso: string, now: number): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return 'not checked';\n const minutes = Math.max(0, Math.round((now - t) / 60_000));\n if (minutes < 1) return 'checked just now';\n if (minutes < 120) return `checked ${minutes} min ago`;\n return `checked ${Math.round(minutes / 60)} h ago`;\n}\n\nexport function AppsSection({ focusGroup }: { focusGroup?: 'mcp-servers' } = {}) {\n const apps = useQuery(appsQuery);\n const refetchApps = useRefetch(appsQuery);\n usePollWhileVisible(refetchApps, APPS_POLL_MS);\n const terminal = useQuery(terminalStatusQuery);\n const mcp = useQuery(mcpSnapshotQuery);\n const cli = useQuery(mcpCliHealthQuery);\n const refetchMcp = useRefetch(mcpSnapshotQuery);\n const bootstrap = useQuery(verseBootstrapQuery);\n const capacity = useCapacityData();\n const ui = useVerseUi();\n const gate = useTokenGate();\n\n const [status, setStatus] = useState<{ tone: 'neutral' | 'danger'; text: string } | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n const [reconnecting, setReconnecting] = useState<string | null>(null);\n const [toggle, setToggle] = useState<{ row: VerseAppRow; enable: boolean } | null>(null);\n const [toggleBusy, setToggleBusy] = useState(false);\n const [toggleError, setToggleError] = useState<string | null>(null);\n const [launchRow, setLaunchRow] = useState<VerseAppRow | null>(null);\n const [launchBusy, setLaunchBusy] = useState(false);\n const [launchError, setLaunchError] = useState<string | null>(null);\n const [nowMs, setNowMs] = useState(() => Date.now());\n usePollWhileVisible(() => setNowMs(Date.now()), 30_000);\n\n const mcpHeading = useRef<HTMLHeadingElement>(null);\n useEffect(() => {\n if (focusGroup !== 'mcp-servers') return;\n const el = mcpHeading.current;\n if (!el) return;\n if (typeof el.scrollIntoView === 'function') el.scrollIntoView({ block: 'start' });\n el.focus({ preventScroll: true });\n }, [focusGroup]);\n\n const data = bootstrap.data as VerseBootstrap | undefined;\n const projects = launchProjects(data);\n const models = localModelTags(capacity.seats);\n const inVerse = inVerseAvailability({\n terminalAvailable: terminal.data?.available ? terminal.data.data.available : terminal.data ? false : null,\n terminalReason: terminal.data?.available ? terminal.data.data.reason : null,\n activeSessionId: ui.activeSessionId,\n });\n\n const served = apps.data?.available ? apps.data.data : null;\n const group = (id: 'desktop' | 'terminal-agents' | 'local-models') => served?.groups.find((g) => g.id === id) ?? null;\n const snapshot = mcp.data?.available ? projectMcpSnapshot(mcp.data.raw) : null;\n const cliHealth = cli.data?.available ? projectCliHealth(cli.data.raw) : null;\n\n const say = useCallback((text: string, tone: 'neutral' | 'danger' = 'neutral') => setStatus({ text, tone }), []);\n\n const onRefresh = async () => {\n setRefreshing(true);\n try {\n const done = await gate.run('Check every app and seat again', async () => {\n await Promise.all([refreshApps(), refreshSeatHealth().catch(() => null)]);\n refetchMcp();\n return true;\n });\n if (done) {\n setNowMs(Date.now());\n say('Checked again.');\n }\n } catch (err) {\n say(describeContextError(err), 'danger');\n } finally {\n setRefreshing(false);\n }\n };\n\n const onReconnect = async (row: CapacityRow) => {\n setReconnecting(row.seatId);\n try {\n const done = await gate.run(`Open the sign-in for ${row.label} in Terminal`, async () => {\n await reconnectSeat(row.seatId);\n return true;\n });\n if (done) say(`Opened the sign-in for ${row.label} in Terminal. Finish it there; this page picks it up.`);\n } catch (err) {\n say(describeContextError(err), 'danger');\n } finally {\n setReconnecting(null);\n }\n };\n\n const onConfirmToggle = async () => {\n if (!toggle) return;\n setToggleBusy(true);\n setToggleError(null);\n try {\n const result = await gate.run(`${toggle.enable ? 'Switch on' : 'Restore'} ${toggle.row.name}`, () => toggleDesktopApp(toggle.row.id, toggle.enable));\n if (result) {\n say(`Opened “${result.command.join(' ')}” in Terminal. Answer its prompts there.`);\n setToggle(null);\n }\n } catch (err) {\n setToggleError(describeContextError(err));\n } finally {\n setToggleBusy(false);\n }\n };\n\n const launch = async (row: VerseAppRow, request: LaunchRequest) => {\n if (request.target === 'verse') {\n launchInVerse(row.id, request.choice);\n setLaunchRow(null);\n return;\n }\n if (request.root === null) return;\n setLaunchBusy(true);\n setLaunchError(null);\n try {\n const result = await gate.run(`Launch ${row.name} in Terminal`, () =>\n launchInTerminalApp(row.id, { root: request.root!, via: request.choice.via, model: request.choice.model }));\n if (result) {\n say(`Opened ${row.name} in Terminal.`);\n setLaunchRow(null);\n }\n } catch (err) {\n const message = describeContextError(err);\n if (launchRow) setLaunchError(message);\n else say(message, 'danger');\n } finally {\n setLaunchBusy(false);\n }\n };\n\n const quickLaunchReason = inVerse.available || projects.length > 0 ? null : 'Open a chat or enrol a project first.';\n const onQuickLaunch = (row: VerseAppRow) => {\n const choice: LaunchChoice = { via: 'native', model: null };\n const command = row.actions.find((a) => a.kind === 'launch')?.command ?? null;\n if (!command) return;\n void launch(row, { choice, target: inVerse.available ? 'verse' : 'terminal-app', root: projects[0]?.path ?? null, command });\n };\n\n const servedLoading = apps.data === undefined && (apps.status === 'loading' || apps.status === 'idle');\n\n return (\n <section className={styles.section} aria-label=\"Apps & Accounts\">\n <div className={styles.scroll}>\n <div className={styles.page}>\n <header className={styles.header}>\n <div className={styles.headerText}>\n <h2 className={styles.title}>Apps &amp; Accounts</h2>\n <p className={styles.lede}>Everything Verse can run with on this Mac, and whether it is ready.</p>\n </div>\n <div className={styles.headerMeta}>\n {served ? (\n <span>\n {checkedAgo(served.checkedAt, nowMs)}\n {served.pathSource === 'fallback' ? ' · PATH from known folders (your login shell did not answer)' : ''}\n </span>\n ) : null}\n <Button variant=\"ghost\" size=\"sm\" icon={<IconRefresh size={14} />} busy={refreshing} onClick={() => void onRefresh()}>\n Check again\n </Button>\n </div>\n </header>\n\n <p className={status ? styles.banner : styles.visuallyHidden} data-tone={status?.tone} role=\"status\" aria-live=\"polite\">\n {status?.text ?? ''}\n </p>\n\n <AccountsGroup\n seats={capacity.seats}\n health={capacity.health}\n budget={capacity.budget}\n loading={capacity.loading}\n reconnecting={reconnecting}\n onReconnect={(row) => void onReconnect(row)}\n />\n\n {apps.data && !apps.data.available ? (\n <p className={styles.banner}>{apps.data.reason}</p>\n ) : servedLoading ? (\n <div aria-busy=\"true\" aria-label=\"Checking apps\">\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"80%\" />\n <SkeletonLine width=\"70%\" />\n </div>\n ) : (\n <>\n {group('desktop') ? (\n <DesktopGroup\n group={group('desktop')!}\n onToggle={(row, enable) => { setToggleError(null); setToggle({ row, enable }); }}\n onRestore={(row) => { setToggleError(null); setToggle({ row, enable: false }); }}\n />\n ) : null}\n {group('terminal-agents') ? (\n <AgentsGroup\n group={group('terminal-agents')!}\n quickLaunchReason={quickLaunchReason}\n onQuickLaunch={onQuickLaunch}\n onLaunchOptions={(row) => { setLaunchError(null); setLaunchRow(row); }}\n />\n ) : null}\n {group('local-models') ? <LocalModelsGroup group={group('local-models')!} /> : null}\n </>\n )}\n\n <McpGroup\n snapshot={snapshot}\n cliHealth={cliHealth}\n unavailable={mcp.data && !mcp.data.available ? mcp.data.reason : null}\n loading={mcp.data === undefined}\n run={gate.run}\n onAdded={(text) => { say(text); refetchMcp(); }}\n headingRef={mcpHeading}\n />\n </div>\n </div>\n\n <DesktopToggleDialog\n row={toggle?.row ?? null}\n enable={toggle?.enable ?? false}\n busy={toggleBusy}\n error={toggleError}\n onCancel={() => setToggle(null)}\n onConfirm={() => void onConfirmToggle()}\n />\n <LaunchDialog\n row={launchRow}\n projects={projects}\n models={models}\n inVerse={inVerse}\n busy={launchBusy}\n error={launchError}\n onCancel={() => setLaunchRow(null)}\n onLaunch={(request) => { if (launchRow) void launch(launchRow, request); }}\n />\n <MutationTokenDialog\n open={gate.dialog.open}\n reason={gate.dialog.reason}\n tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={gate.dialog.onClose}\n onUnlocked={gate.dialog.onUnlocked}\n />\n </section>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AppsSection-DISYnMnc.js","names":[],"sources":["../../../../../../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/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 { copyText } from '../../../components/primitives/clipboard.js';\nimport { IconCheck, IconCopy } from '../../../components/primitives/icons.js';\nimport styles from './Apps.module.css';\n\n// Moved to a style-free module so other surfaces can copy without Apps' CSS.\nexport { copyText };\n\n/** SPEC-310C §4. */\nexport const COPY_CONFIRM_MS = 1_200;\n\nexport function CopyPill({ text, label, what }: { text: string; label?: string; /** \"the Codex launch command\" */ what: string }) {\n const [state, setState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => () => { if (timer.current) clearTimeout(timer.current); }, []);\n\n const onCopy = async () => {\n const ok = await copyText(text);\n setState(ok ? 'copied' : 'failed');\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setState('idle'), COPY_CONFIRM_MS);\n };\n\n return (\n <span className={styles.pillWrap}>\n <button\n type=\"button\"\n className={styles.pill}\n data-state={state}\n onClick={() => void onCopy()}\n aria-label={`Copy ${what}: ${text}`}\n title={`Copy: ${text}`}\n >\n <code className={styles.pillText}>{label ?? text}</code>\n <span className={styles.pillIcon} aria-hidden=\"true\">\n {state === 'copied' ? <IconCheck size={14} /> : <IconCopy size={14} />}\n </span>\n </button>\n <span className={styles.visuallyHidden} role=\"status\" aria-live=\"polite\">\n {state === 'copied' ? 'Copied' : state === 'failed' ? 'Copy failed — select the command and copy it yourself' : ''}\n </span>\n </span>\n );\n}\n","/**\n * routes/verse/apps/launch.ts — where a [Launch ▸] goes.\n *\n * Two homes for the agent's terminal:\n * - INSIDE Verse: a tab in the chat dock's Terminal (C4's pane, C2's dock),\n * in the folder of the chat you have open. Needs the desktop app (the\n * sidecar's Bun PTY — GET /api/verse/terminal says `available`), the\n * Terminal pane to have landed in this build, and an open chat to host it.\n * - Terminal.app: POST /api/verse/apps/:id/launch, in the folder you chose.\n * Works from a plain browser too (macOS).\n *\n * In-Verse launch rides the dock's own one-shot request (dock-store.ts\n * `requestTerminal`): `{ appId }`, plus `{ via, model }` for an Ollama launch\n * (the contract fields on VerseTerminalCreateRequest). The server resolves\n * the command itself — the catalog's own argv, or `ollama launch <id>\n * [--model <tag>]` through the same `resolveAppLaunch` Apps' Terminal.app\n * launch uses, which refuses an agent that is not installed, an Ollama that\n * does not list it, or a tag it does not have — and RUNS it in the new tab.\n * Nothing typed comes from the page; the dialog shows that exact command\n * before the click. (Until 3.10.1 a model launch was only pasted, because\n * the request had no model field.)\n */\nimport { shellCommandText } from '../health/health-model.js';\nimport { requestTerminal } from '../dock/dock-store.js';\nimport { isSlotAvailable } from '../shell/slots.js';\nimport { setVerseSection } from '../verse-ui-store.js';\nimport type { LaunchChoice } from './apps-model.js';\n\n/** An argv as the operator would type it (the same quoting the health banner uses). */\nexport const commandText = shellCommandText;\n\nexport interface InVerseAvailability {\n available: boolean;\n /** Why not, in operator language; null when available. */\n reason: string | null;\n}\n\nexport function inVerseAvailability(input: {\n terminalAvailable: boolean | null;\n terminalReason: string | null;\n activeSessionId: string | null;\n slotLanded?: boolean;\n}): InVerseAvailability {\n const landed = input.slotLanded ?? isSlotAvailable('terminal-pane');\n if (!landed) return { available: false, reason: 'This build has no Verse terminal yet.' };\n if (input.terminalAvailable !== true) {\n return { available: false, reason: input.terminalReason ?? 'The Verse terminal needs the desktop app.' };\n }\n if (input.activeSessionId === null) return { available: false, reason: 'Open a chat first — its terminal hosts the agent.' };\n return { available: true, reason: null };\n}\n\n/** Open the agent in a new dock terminal tab and bring Chat forward. */\nexport function launchInVerse(appId: string, choice: LaunchChoice): void {\n if (choice.via === 'native' && choice.model === null) {\n requestTerminal({ newTab: true, appId });\n } else {\n // A model is an Ollama tag: it only ever launches through Ollama.\n requestTerminal({ newTab: true, appId, via: 'ollama', ...(choice.model !== null ? { model: choice.model } : {}) });\n }\n // The request waits in the dock store until Chat serves it (ChatSection\n // clears requests only on a chat SWITCH, not on its first mount).\n setVerseSection('chat');\n}\n","/**\n * routes/verse/apps/AccountsGroup.tsx — ACCOUNTS: every seat's plan,\n * connection (A2), 5-hour and weekly windows with their resets, and how much\n * is \"Reserved for you\" (A9) — the shared CapacityStrip in its accounts mode —\n * plus the one thing each seat needs from you.\n *\n * Every row leads with a status an operator can read at a glance —\n * \"Connected · usable now\", \"Spent · resets Fri 11:46 PM\" (and \"usable again\n * in 7h 12m\"), \"Signed out · reconnect to use it\", \"Checking…\" — says when it\n * was last checked, and usable accounts come first.\n *\n * Reconnect the provider's own sign-in, opened in Terminal by the health\n * route (Verse never sees a credential);\n * Check again a zero-cost health sweep (status commands only), for a seat\n * that is spent, unread or unavailable — run here, behind the\n * mutation-token gate, with the row reading \"Checking…\";\n * Fix the command A2 says fixes it (a CLI re-pin), shown to copy —\n * never run for you;\n * Edit budget A9's BudgetControl in a sheet.\n */\nimport { useId, useRef, useState } from 'react';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport type { SeatHealthReport } from '../../../../core/verse/health-types.js';\nimport type { VerseSeat } from '../../../data/api-types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { BudgetControl } from '../budget/BudgetControl.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { refreshSeatHealth } from '../health/health-queries.js';\nimport { CapacityStrip } from '../usage/CapacityStrip.js';\nimport { accountStatus, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { accountActions } from './apps-model.js';\nimport { AppGroup } from './AppRow.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText } from './launch.js';\nimport styles from './Apps.module.css';\n\nexport const ACCOUNTS_EMPTY_TEXT =\n 'No accounts connected yet. Sign in to Claude Code, Codex or Grok in a terminal, or start Ollama for local models — they show up here within a minute.';\n\nexport function AccountsGroup({\n seats,\n health,\n budget,\n loading,\n reconnecting,\n onReconnect,\n now,\n}: {\n seats: readonly VerseSeat[];\n health: readonly SeatHealthReport[] | null;\n budget: BudgetView | null;\n loading: boolean;\n /** Seat whose sign-in window is being opened. */\n reconnecting: string | null;\n onReconnect: (row: CapacityRow) => void;\n /** Injected clock for tests. */\n now?: number;\n}) {\n const [fixing, setFixing] = useState<CapacityRow | null>(null);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const [checking, setChecking] = useState<string | null>(null);\n const [note, setNote] = useState<{ tone: 'neutral' | 'danger'; text: string } | null>(null);\n const gate = useTokenGate();\n const fixTitle = useId();\n const sheetTitle = useId();\n const closeRef = useRef<HTMLButtonElement>(null);\n const healthRead = health !== null;\n\n const checkAgain = async (row: CapacityRow) => {\n setChecking(row.seatId);\n setNote(null);\n try {\n const done = await gate.run(`Check ${row.label} again (status commands only — nothing is spent)`, () => refreshSeatHealth());\n if (done) setNote({ tone: 'neutral', text: `Checked ${row.label} again.` });\n } catch (err) {\n setNote({ tone: 'danger', text: describeContextError(err) });\n } finally {\n setChecking(null);\n }\n };\n\n return (\n <AppGroup\n id=\"accounts\"\n title=\"Accounts\"\n caveat=\"Which accounts you can use now, which are spent and when they reset, and how much autonomy leaves for you.\"\n >\n {loading ? (\n <p className={styles.loadingLine} aria-busy=\"true\">Reading accounts…</p>\n ) : (\n <CapacityStrip\n seats={seats}\n health={health}\n budget={budget}\n labelledBy=\"apps-group-accounts\"\n emptyText={ACCOUNTS_EMPTY_TEXT}\n accounts={{ healthRead, checkingSeatId: checking, ...(now !== undefined ? { now } : {}) }}\n renderActions={(row) =>\n // Actions come from the SETTLED status, so \"Check again\" stays in\n // place (busy) while its own check runs instead of vanishing.\n accountActions(row, accountStatus(row, { healthRead, ...(now !== undefined ? { now } : {}) })).map((action) => (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.primary && action.kind !== 'edit-budget' ? 'primary' : 'ghost'}\n busy={(action.kind === 'reconnect' && reconnecting === row.seatId) || (action.kind === 'check-again' && checking === row.seatId)}\n aria-label={`${action.label}: ${row.label}`}\n onClick={() => {\n if (action.kind === 'reconnect') onReconnect(row);\n else if (action.kind === 'check-again') void checkAgain(row);\n else if (action.kind === 'fix') setFixing(row);\n else setBudgetOpen(true);\n }}\n >\n {action.label}\n </Button>\n ))\n }\n />\n )}\n\n <p className={note ? styles.accountsNote : styles.visuallyHidden} data-tone={note?.tone} role=\"status\" aria-live=\"polite\">\n {note?.text ?? ''}\n </p>\n\n {fixing !== null && fixing.connection?.fixCommand ? (\n <Dialog\n open\n onClose={() => setFixing(null)}\n titleId={fixTitle}\n title={`Fix ${fixing.label}`}\n description={fixing.connection.word}\n initialFocusRef={closeRef}\n >\n <div className={styles.dialogBody}>\n {fixing.connection.reasons.map((reason) => <p key={reason}>{reason}</p>)}\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Run this in a terminal</span>\n <CopyPill text={commandText(fixing.connection.fixCommand)} what={`the fix for ${fixing.label}`} />\n </div>\n <p>Verse shows the command and never runs it for you: it changes which CLI this seat is pinned to.</p>\n <div className={styles.dialogActions}>\n <Button ref={closeRef} variant=\"subtle\" onClick={() => setFixing(null)}>Done</Button>\n </div>\n </div>\n </Dialog>\n ) : null}\n\n <Sheet\n open={budgetOpen}\n onClose={() => setBudgetOpen(false)}\n titleId={sheetTitle}\n title=\"Budget\"\n description=\"How much of each seat autonomy may use, and how much is kept for you.\"\n width={560}\n >\n {budgetOpen ? <BudgetControl /> : null}\n </Sheet>\n\n <MutationTokenDialog\n open={gate.dialog.open}\n reason={gate.dialog.reason}\n tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={gate.dialog.onClose}\n onUnlocked={gate.dialog.onUnlocked}\n />\n </AppGroup>\n );\n}\n","/**\n * routes/verse/apps/apps-queries.ts — the reads and writes behind Apps &\n * Accounts (server: core/verse/apps-api.ts; C4's terminal for availability).\n *\n * Reads are OPTIONAL (the Usage/MCP convention): a server without the route\n * answers 404, which means \"this group has no source here\", not \"Verse is\n * broken\" — the page still renders Accounts and MCP from their own routes.\n * A 401 still propagates: an expired read session is the whole surface's\n * problem, not one group's.\n *\n * Writes pull the held mutation token and touch the hold on success. Nothing\n * here spends: refresh re-runs status commands, and toggle/launch open a\n * visible Terminal window that the operator drives.\n */\nimport type { VerseAppsResponse, VerseTerminalListResponse } from '../../../../core/verse/workbench-types.js';\nimport { VERSE_APPS_PATH, VERSE_TERMINAL_PATH } from '../../../../core/verse/workbench-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { refetchQuery } from '../../../data/cache.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { oneShotFetcher } from '../health/health-queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const APPS_KEY = 'verse-apps';\nexport const TERMINAL_STATUS_KEY = 'verse-terminal-status';\n\nexport type OptionalResult<T> =\n | { available: true; data: T }\n | { available: false; reason: string };\n\nasync function optional<T>(path: string, signal?: AbortSignal): Promise<OptionalResult<T>> {\n try {\n return { available: true, data: await apiGet<T>(path, signal) };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n if (err instanceof ApiError && err.status === 404) {\n return { available: false, reason: 'This server is older than Apps & Accounts, so desktop, terminal and local rows are not available.' };\n }\n return { available: false, reason: err instanceof ApiError ? `The apps check answered HTTP ${err.status}.` : 'The apps check could not be reached.' };\n }\n}\n\n/** GET /api/verse/apps — cached on the server; cheap to read. */\nexport const appsQuery: QueryDef<OptionalResult<VerseAppsResponse>> = {\n key: APPS_KEY,\n fetch: (signal) => optional<VerseAppsResponse>(VERSE_APPS_PATH, signal),\n};\n\n/**\n * GET /api/verse/terminal (C4). Only `available` matters here: whether a\n * Launch can open INSIDE Verse (the desktop app's Bun PTY) or has to go to\n * Terminal.app. Absent route = not available.\n */\nexport const terminalStatusQuery: QueryDef<OptionalResult<VerseTerminalListResponse>> = {\n key: TERMINAL_STATUS_KEY,\n fetch: (signal) => optional<VerseTerminalListResponse>(VERSE_TERMINAL_PATH, signal),\n};\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/** Re-ask the login shell for PATH and re-probe every row; every reader sees the result. */\nexport async function refreshApps(): Promise<VerseAppsResponse> {\n const body = await post<VerseAppsResponse>(`${VERSE_APPS_PATH}/refresh`, {});\n await refetchQuery(\n APPS_KEY,\n oneShotFetcher(() => Promise.resolve({ available: true as const, data: body }), () => appsQuery.fetch()),\n true,\n );\n return body;\n}\n\nexport interface AppActionResponse {\n ok: true;\n opened: 'terminal-app';\n /** The command as the operator would type it. */\n command: string[];\n}\n\n/**\n * Flip a desktop switch. `confirm: true` is sent ONLY from the confirmation\n * dialog, after the operator saw both commands; the server refuses anything\n * else.\n */\nexport async function toggleDesktopApp(appId: string, enabled: boolean): Promise<AppActionResponse> {\n const result = await post<AppActionResponse>(`${VERSE_APPS_PATH}/${encodeURIComponent(appId)}/toggle`, { enabled, confirm: true });\n void refetchQuery(APPS_KEY, () => appsQuery.fetch(), true);\n return result;\n}\n\nexport interface LaunchInTerminalAppRequest {\n root: string;\n via?: 'native' | 'ollama';\n model?: string | null;\n}\n\n/** Open the agent in a Terminal.app window, in `root`. */\nexport function launchInTerminalApp(appId: string, request: LaunchInTerminalAppRequest): Promise<AppActionResponse> {\n return post<AppActionResponse>(`${VERSE_APPS_PATH}/${encodeURIComponent(appId)}/launch`, {\n root: request.root,\n ...(request.via ? { via: request.via } : {}),\n ...(request.model ? { model: request.model } : {}),\n });\n}\n","/**\n * routes/verse/apps/DesktopToggleDialog.tsx — the confirmation in front of a\n * desktop switch (SPEC-310C §4: \"Turning either on needs a confirmation that\n * shows the command and --restore\").\n *\n * These switches change ANOTHER app's settings (Claude Desktop, Hermes\n * Desktop), so the dialog shows exactly what will run and exactly how to undo\n * it, and says where it runs: a Terminal window, where the tool's own prompts\n * are answered by the operator — Verse never answers them. Turning Claude\n * Desktop ON carries the recommendation against it (SPEC-310C §0.5).\n */\nimport { useId, useRef } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { commandText } from './launch.js';\nimport { CopyPill } from './CopyPill.js';\nimport styles from './Apps.module.css';\n\nexport function DesktopToggleDialog({\n row,\n enable,\n busy,\n error,\n onCancel,\n onConfirm,\n}: {\n row: VerseAppRow | null;\n /** The direction asked for: true = switch on, false = restore. */\n enable: boolean;\n busy: boolean;\n error: string | null;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n const titleId = useId();\n const cancelRef = useRef<HTMLButtonElement>(null);\n if (row === null || row.toggle === null) return null;\n const run = enable ? row.toggle.command : row.toggle.restoreCommand;\n const undo = enable ? row.toggle.restoreCommand : row.toggle.command;\n const title = enable ? `Turn on “${row.description}”?` : `Restore ${row.name}?`;\n return (\n <Dialog\n open\n onClose={onCancel}\n titleId={titleId}\n title={title}\n initialFocusRef={cancelRef}\n description={enable ? `This changes ${row.name}’s own settings until you restore it.` : `This puts ${row.name} back on its own defaults.`}\n >\n <div className={styles.dialogBody}>\n {row.detail ? <p>{row.detail}</p> : null}\n {enable && row.id === 'claude-desktop' ? (\n <p>\n Recommended: leave this off. Claude Desktop would run local models instead of its own, and Verse’s local\n seats already use Ollama.\n </p>\n ) : null}\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Runs</span>\n <CopyPill text={commandText(run)} what=\"the command this runs\" />\n </div>\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>{enable ? 'Undo later with' : 'Turn back on with'}</span>\n <CopyPill text={commandText(undo)} what={enable ? 'the restore command' : 'the command that turns it on'} />\n </div>\n <p>\n It opens in a Terminal window so you can answer its prompts. Verse does not answer them for you, and nothing\n changes until you do.\n </p>\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button ref={cancelRef} variant=\"subtle\" onClick={onCancel}>Cancel</Button>\n <Button variant={enable ? 'danger' : 'primary'} busy={busy} onClick={onConfirm}>\n {enable ? 'Open in Terminal' : 'Restore in Terminal'}\n </Button>\n </div>\n </div>\n </Dialog>\n );\n}\n","/**\n * routes/verse/apps/LaunchDialog.tsx — the options behind [Launch ▾]: which\n * folder, the agent's own command or `ollama launch <id>`, which local model,\n * and where (a Verse terminal tab, or Terminal.app).\n *\n * The exact command is always on screen before anything opens. The plain\n * [Launch] button beside it skips this dialog with the defaults (the agent's\n * own command, your current chat or most recent project).\n */\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { launchCommand, type LaunchChoice, type LaunchProject, type LaunchVia } from './apps-model.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText, type InVerseAvailability } from './launch.js';\nimport styles from './Apps.module.css';\n\nexport type LaunchTarget = 'verse' | 'terminal-app';\n\nexport interface LaunchRequest {\n choice: LaunchChoice;\n target: LaunchTarget;\n /** Terminal.app only; a Verse tab opens in the open chat's folder. */\n root: string | null;\n command: string[];\n}\n\nexport function LaunchDialog({\n row,\n projects,\n models,\n inVerse,\n busy,\n error,\n onCancel,\n onLaunch,\n}: {\n row: VerseAppRow | null;\n projects: readonly LaunchProject[];\n /** Ollama tags the local seats run. */\n models: readonly string[];\n inVerse: InVerseAvailability;\n busy: boolean;\n error: string | null;\n onCancel: () => void;\n onLaunch: (request: LaunchRequest) => void;\n}) {\n const titleId = useId();\n const firstRef = useRef<HTMLInputElement>(null);\n const [via, setVia] = useState<LaunchVia>('native');\n const [model, setModel] = useState<string>('');\n const [root, setRoot] = useState<string>(projects[0]?.path ?? '');\n\n // A new row opens with fresh defaults.\n useEffect(() => {\n setVia('native');\n setModel('');\n setRoot(projects[0]?.path ?? '');\n // eslint-disable-next-line react-hooks/exhaustive-deps -- reset per opened row only\n }, [row?.id]);\n\n const choice: LaunchChoice = { via, model: via === 'ollama' && model !== '' ? model : null };\n const command = useMemo(() => (row ? launchCommand(row, choice) : null), [row, choice.via, choice.model]); // eslint-disable-line react-hooks/exhaustive-deps\n if (row === null) return null;\n const nativeCommand = launchCommand(row, { via: 'native', model: null });\n const ollamaCommand = row.ollamaLaunch;\n const radioName = `${titleId}-via`;\n const canTerminalApp = root !== '';\n\n return (\n <Dialog\n open\n onClose={onCancel}\n titleId={titleId}\n title={`Launch ${row.name}`}\n description=\"Nothing starts until you choose where.\"\n initialFocusRef={firstRef}\n >\n <div className={styles.dialogBody}>\n <fieldset className={styles.fieldset}>\n <legend className={styles.legend}>Run</legend>\n {nativeCommand ? (\n <label className={styles.radio}>\n <input ref={firstRef} type=\"radio\" name={radioName} checked={via === 'native'} onChange={() => setVia('native')} />\n <code className={styles.inlineCode}>{commandText(nativeCommand)}</code>\n <span className={styles.hint}>its own command</span>\n </label>\n ) : null}\n {ollamaCommand ? (\n <label className={styles.radio}>\n <input type=\"radio\" name={radioName} checked={via === 'ollama'} onChange={() => setVia('ollama')} />\n <code className={styles.inlineCode}>{commandText(ollamaCommand)}</code>\n <span className={styles.hint}>through Ollama</span>\n </label>\n ) : null}\n </fieldset>\n\n {via === 'ollama' ? (\n models.length > 0 ? (\n <Select label=\"Local model\" value={model} onChange={(e) => setModel(e.target.value)}>\n <option value=\"\">Ollama’s default</option>\n {models.map((m) => <option key={m} value={m}>{m}</option>)}\n </Select>\n ) : (\n <p className={styles.hint}>No local models are known to Verse, so Ollama will ask which to use.</p>\n )\n ) : null}\n\n <Select\n label=\"Folder (Terminal.app)\"\n value={root}\n onChange={(e) => setRoot(e.target.value)}\n hint={projects.length === 0 ? 'No chat folders or enrolled projects yet.' : 'A Verse tab opens in the chat you have open.'}\n disabled={projects.length === 0}\n >\n {projects.length === 0 ? <option value=\"\">—</option> : null}\n {projects.map((p) => <option key={p.path} value={p.path}>{p.name}</option>)}\n </Select>\n\n {command ? (\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Command</span>\n <CopyPill text={commandText(command)} what={`the ${row.name} launch command`} />\n </div>\n ) : null}\n\n {via === 'ollama' && inVerse.available ? (\n <p className={styles.hint}>In a Verse tab this runs exactly the command above — Verse builds it from what is installed, never from this page.</p>\n ) : null}\n {!inVerse.available && inVerse.reason ? <p className={styles.hint}>Verse terminal: {inVerse.reason}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n\n <div className={styles.dialogActions}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant={inVerse.available ? 'subtle' : 'primary'}\n busy={busy}\n disabled={!canTerminalApp || command === null}\n onClick={() => command && onLaunch({ choice, target: 'terminal-app', root, command })}\n >\n Open in Terminal.app\n </Button>\n {inVerse.available ? (\n <Button\n variant=\"primary\"\n disabled={command === null}\n onClick={() => command && onLaunch({ choice, target: 'verse', root: null, command })}\n >\n Open in Verse terminal\n </Button>\n ) : null}\n </div>\n </div>\n </Dialog>\n );\n}\n","/**\n * routes/verse/mcp/mcp.module.css — MCP + CLI management styling.\n *\n * Follows docs/VERSE-DESIGN-V2.md, same as usage.module.css: monochrome\n * ground, 1px hairlines and whitespace for separation (no shadows, no nested\n * rounded boxes), display face for headings, mono for anything the operator\n * has to read character-by-character — which here is the whole point, because\n * the command line is the thing being disclosed.\n */\n\n.section {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: var(--space-5);\n display: flex;\n flex-direction: column;\n gap: var(--space-6);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n}\n\n.panelHead {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding-bottom: var(--space-2);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.panelTitle {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.panelNote,\n.muted {\n margin: 0;\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n line-height: 1.5;\n}\n\n/* A fact that changes what the operator should do. Never colour alone: it\n carries a word (\"Version drift\") as well as the rule. */\n.alert {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-warning, var(--border-strong));\n border-left-width: 3px;\n border-radius: var(--radius-sm);\n background: var(--bg-subtle);\n}\n\n.alertTitle {\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n}\n\n.seatList,\n.rowList {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.seatRow,\n.healthRow {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) 0;\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.seatHead {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n flex-wrap: wrap;\n}\n\n.seatLabel {\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.engineTag,\n.code {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-tertiary, var(--text-secondary));\n}\n\n/* The machine-readable code is shown BESIDE the sentence, never as it. */\n.code {\n letter-spacing: 0;\n}\n\n.count {\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n\n/* The disclosure: everything the operator must read before confirming. */\n.disclosure {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n background: var(--bg-subtle);\n}\n\n.commandLine {\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n word-break: break-all;\n white-space: pre-wrap;\n margin: 0;\n}\n\n.envList {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.envItem {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n padding: 2px var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n}\n\n.warnList {\n margin: 0;\n padding-left: var(--space-4);\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n}\n\n.digest {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-tertiary, var(--text-secondary));\n word-break: break-all;\n}\n\n.actions {\n display: flex;\n gap: var(--space-2);\n align-items: center;\n flex-wrap: wrap;\n}\n","/**\n * routes/verse/mcp/McpServerDisclosure.tsx — what an MCP server IS, rendered\n * so it has to be read.\n *\n * Used in two places and identical in both: listing a server a seat already\n * loads, and previewing one that is about to be written. That sameness is the\n * point — the operator reads the same card either way, so \"what will run\" is\n * never presented differently from \"what runs\".\n *\n * Three rules this component enforces at the render layer:\n *\n * 1. The COMMAND and ARGS are shown in full, in mono, wrapped rather than\n * truncated. A command with an ellipsis in the middle is exactly the\n * one worth reading.\n * 2. Environment variables are listed BY KEY, with the value shown as the\n * literal `<set>` that `redactEnv` produced. The count is stated, so a\n * server handing over six credentials cannot look like one handing over\n * none.\n * 3. The source is a home-relative ref, never an absolute path.\n */\nimport type { ReactNode } from 'react';\nimport type { McpServer } from './mcp-contract.js';\nimport styles from './mcp.module.css';\n\nexport function McpServerDisclosure({\n server,\n heading,\n}: {\n server: McpServer;\n heading?: string;\n}): ReactNode {\n const envKeys = server.env === null ? [] : Object.keys(server.env);\n\n return (\n <div className={styles.disclosure}>\n {heading === undefined ? null : <p className={styles.alertTitle}>{heading}</p>}\n\n <p className={styles.commandLine}>\n {server.command}\n {server.args.length > 0 ? ` ${server.args.join(' ')}` : ''}\n </p>\n\n {envKeys.length === 0 ? (\n <p className={styles.muted}>No environment variables are passed to this server.</p>\n ) : (\n <>\n <p className={styles.muted}>\n {envKeys.length} environment variable{envKeys.length === 1 ? '' : 's'} passed to this\n server. Values are never displayed.\n </p>\n <ul className={styles.envList}>\n {envKeys.map((key) => (\n <li key={key} className={styles.envItem}>\n {key}=&lt;set&gt;\n </li>\n ))}\n </ul>\n </>\n )}\n\n <p className={styles.code}>configured in {server.sourceRef}</p>\n </div>\n );\n}\n","/**\n * routes/verse/mcp/mcp-queries.ts — the reads and writes behind the MCP panel.\n *\n * Reads use the non-throwing `optionalGet` shape the Usage section\n * established: a server without these routes answers 404, and a 404 means\n * \"this panel is degraded\", not \"Verse is broken\". 401 still propagates,\n * because an expired read session is an unauthorized state for the whole\n * surface, not a degraded one.\n *\n * Writes pull the held mutation token from auth-store and touch the hold on\n * success, exactly like `autonomy/control-queries.ts`. There is one addition\n * this surface needs that the others do not: `applyMcpServer` CANNOT be\n * called without a digest that `proposeMcpServer` returned, because the\n * server refuses without it. That is deliberate and it is why there is no\n * single `installMcpServer()` helper here — a one-call install is exactly the\n * shape docs/VERSE-WORKSPACES.md §3 rules out, and it should be impossible to\n * write by accident at this layer too.\n */\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\n\nexport const MCP_SNAPSHOT_KEY = 'verse-mcp-snapshot';\nexport const MCP_CLI_HEALTH_KEY = 'verse-mcp-cli-health';\n\n/** A read that is allowed to be absent. `raw` is null when it was. */\nexport interface OptionalRead {\n raw: unknown;\n available: boolean;\n reason: string | null;\n}\n\nfunction describeFailure(path: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return `This server does not expose ${path}, so this panel has no source.`;\n }\n return `${path} answered HTTP ${err.status}.`;\n }\n return `${path} could not be reached.`;\n}\n\nfunction optionalGet(path: string): (signal?: AbortSignal) => Promise<OptionalRead> {\n return async (signal) => {\n try {\n const raw = await apiGet<unknown>(path, signal);\n return { raw, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { raw: null, available: false, reason: describeFailure(path, err) };\n }\n };\n}\n\n/** GET /api/verse/mcp — which servers each seat would load. */\nexport const mcpSnapshotQuery: QueryDef<OptionalRead> = {\n key: MCP_SNAPSHOT_KEY,\n fetch: optionalGet('/api/verse/mcp'),\n};\n\n/** GET /api/verse/mcp/cli-health — auth, plan and version drift per account. */\nexport const mcpCliHealthQuery: QueryDef<OptionalRead> = {\n key: MCP_CLI_HEALTH_KEY,\n fetch: optionalGet('/api/verse/mcp/cli-health'),\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nexport class McpLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token before changing MCP configuration.');\n this.name = 'McpLockedError';\n }\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new McpLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/** The spec an operator typed. Env VALUES are real here and only here. */\nexport interface McpServerInput {\n name: string;\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/**\n * POST /api/verse/mcp/proposal — validate and disclose. Writes nothing.\n *\n * The response carries the digest `applyMcpServer` demands back. A refusal is\n * a 409 with a full body, which `apiPost` surfaces as an ApiError whose\n * detail carries the `note`.\n */\nexport function proposeMcpServer(target: string, server: McpServerInput): Promise<unknown> {\n return post<unknown>('/api/verse/mcp/proposal', { target, server });\n}\n\n/**\n * POST /api/verse/mcp/apply — perform the write the digest confirms.\n *\n * `digest` is not optional and has no default. It must come from a proposal\n * the operator actually saw.\n */\nexport async function applyMcpServer(\n target: string,\n server: McpServerInput,\n digest: string,\n): Promise<unknown> {\n const result = await post<unknown>('/api/verse/mcp/apply', {\n target,\n server,\n digest,\n confirm: true,\n });\n invalidate(MCP_SNAPSHOT_KEY);\n return result;\n}\n\n/**\n * POST /api/verse/mcp/cli-probe — read the installed CLI versions.\n *\n * A POST because it launches the provider CLIs. Nothing about it is a read.\n */\nexport async function probeCliVersions(): Promise<unknown> {\n const result = await post<unknown>('/api/verse/mcp/cli-probe', {});\n invalidate(MCP_CLI_HEALTH_KEY);\n return result;\n}\n","/**\n * routes/verse/apps/McpGroup.tsx — MCP SERVERS, folded in from the old MCP\n * section (SPEC-310C §4): what each seat would ACTUALLY load, the standing\n * caveat that Claude and local seats load none, and an Add that goes through\n * the two-step, digest-bound write the server already enforces\n * (propose → read the disclosure → apply).\n *\n * The rules the old section refused to soften are kept:\n * - \"configured, but unused\" is said first when it is true;\n * - a CLI version drift is an alert quoting the pinned version;\n * - the unenrolled-folder footgun for Codex/Grok seats is stated;\n * - an env VALUE is never displayed (the disclosure forces '<set>').\n */\nimport { useId, useState, type FormEvent } from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconChevronDown, IconChevronRight, IconPlus } from '../../../components/primitives/icons.js';\nimport { Input } from '../../../components/primitives/Input.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { ApiError } from '../../../data/client.js';\nimport { SCOPE_REASON_COPY, narrowServer, reasonSentence, type CliHealthSnapshot, type McpServer, type McpSnapshot } from '../mcp/mcp-contract.js';\nimport { McpServerDisclosure } from '../mcp/McpServerDisclosure.js';\nimport { applyMcpServer, proposeMcpServer, type McpServerInput } from '../mcp/mcp-queries.js';\nimport { mcpSeatRows, mcpTargets, parseEnvLines, splitArgs, type McpSeatRow } from './apps-model.js';\nimport { AppGroup, AppRow } from './AppRow.js';\nimport styles from './Apps.module.css';\n\n/** The token gate the page owns: runs `action` once unlocked; null when dismissed. */\nexport type GatedRun = <T>(reason: string, action: () => Promise<T>) => Promise<T | null>;\n\nfunction SeatRow({ row }: { row: McpSeatRow }) {\n const [open, setOpen] = useState(false);\n const listId = useId();\n const has = row.servers.length > 0;\n return (\n <AppRow\n id={`mcp-${row.seatId}`}\n name={row.label}\n monogram={row.monogram}\n engine={row.engine}\n description={row.sentence}\n health={{ tone: has ? 'success' : 'off', label: row.loads }}\n aside={\n has ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-expanded={open}\n aria-controls={listId}\n icon={open ? <IconChevronDown size={14} /> : <IconChevronRight size={14} />}\n onClick={() => setOpen((v) => !v)}\n >\n {open ? 'Hide servers' : 'Show servers'}\n </Button>\n ) : null\n }\n >\n <span className={styles.reasonCode}>{row.reason}</span>\n {has && open ? (\n <div id={listId} className={styles.servers}>\n {row.servers.map((server) => <McpServerDisclosure key={server.name} server={server} heading={server.name} />)}\n </div>\n ) : null}\n </AppRow>\n );\n}\n\ninterface Proposal {\n server: McpServer;\n targetRef: string;\n targetLabel: string;\n action: 'add' | 'replace';\n replaces: McpServer | null;\n warnings: string[];\n note: string;\n digest: string;\n}\n\nfunction narrowProposal(raw: unknown): Proposal | null {\n if (raw === null || typeof raw !== 'object') return null;\n const r = raw as Record<string, unknown>;\n const server = narrowServer(r['server']);\n const target = r['target'] as Record<string, unknown> | undefined;\n if (!server || typeof r['digest'] !== 'string' || !target) return null;\n return {\n server,\n targetRef: typeof target['ref'] === 'string' ? target['ref'] : '',\n targetLabel: typeof target['label'] === 'string' ? target['label'] : '',\n action: r['action'] === 'replace' ? 'replace' : 'add',\n replaces: narrowServer(r['replaces']),\n warnings: Array.isArray(r['warnings']) ? r['warnings'].filter((w): w is string => typeof w === 'string') : [],\n note: typeof r['note'] === 'string' ? r['note'] : '',\n digest: r['digest'],\n };\n}\n\nfunction describe(err: unknown): string {\n if (err instanceof ApiError) return err.detail ?? `The server refused (HTTP ${err.status}).`;\n if (err instanceof Error && err.name === 'VerseMutationLockedError') return 'Unlock actions with the mutation token first.';\n return 'The request could not be completed.';\n}\n\nfunction AddServerSheet({ open, snapshot, run, onClose, onAdded }: {\n open: boolean;\n snapshot: McpSnapshot | null;\n run: GatedRun;\n onClose: () => void;\n onAdded: (message: string) => void;\n}) {\n const titleId = useId();\n const targets = mcpTargets(snapshot);\n const [target, setTarget] = useState('hub');\n const [name, setName] = useState('');\n const [command, setCommand] = useState('');\n const [args, setArgs] = useState('');\n const [env, setEnv] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [proposal, setProposal] = useState<{ input: McpServerInput; target: string; value: Proposal } | null>(null);\n\n const reset = () => {\n setProposal(null);\n setError(null);\n setBusy(false);\n };\n\n const review = async (event: FormEvent) => {\n event.preventDefault();\n setError(null);\n const parsedEnv = parseEnvLines(env);\n if (!parsedEnv.ok) {\n setError(parsedEnv.error);\n return;\n }\n const input: McpServerInput = {\n name: name.trim(),\n command: command.trim(),\n args: splitArgs(args),\n ...(Object.keys(parsedEnv.env).length > 0 ? { env: parsedEnv.env } : {}),\n };\n setBusy(true);\n try {\n const raw = await run('Review an MCP server before adding it', () => proposeMcpServer(target, input));\n if (raw === null) return;\n const value = narrowProposal(raw);\n if (!value) setError('The server answered with something that is not a proposal.');\n else setProposal({ input, target, value });\n } catch (err) {\n setError(describe(err));\n } finally {\n setBusy(false);\n }\n };\n\n const apply = async () => {\n if (!proposal) return;\n setBusy(true);\n setError(null);\n try {\n const done = await run('Add an MCP server', () => applyMcpServer(proposal.target, proposal.input, proposal.value.digest));\n if (done === null) return;\n onAdded(`${proposal.value.action === 'replace' ? 'Replaced' : 'Added'} ${proposal.value.server.name} in ${proposal.value.targetRef}.`);\n setName('');\n setCommand('');\n setArgs('');\n setEnv('');\n reset();\n onClose();\n } catch (err) {\n setError(describe(err));\n } finally {\n setBusy(false);\n }\n };\n\n const chosen = targets.find((t) => t.id === target);\n return (\n <Sheet\n open={open}\n onClose={() => { reset(); onClose(); }}\n titleId={titleId}\n title={proposal ? 'Review before adding' : 'Add an MCP server'}\n description=\"An MCP server is a program that runs with the agent’s permissions. Nothing is written until you confirm what you read.\"\n width={520}\n >\n {proposal === null ? (\n <form className={styles.dialogBody} onSubmit={(e) => void review(e)}>\n <Select label=\"Add to\" value={target} onChange={(e) => setTarget(e.target.value)}\n hint={chosen?.disabledReason ?? (target === 'hub' ? 'The hub’s own registry.' : 'A Verse chat on a Claude seat still loads none; Claude Code in a terminal does.')}>\n {targets.map((t) => <option key={t.id} value={t.id} disabled={t.disabledReason !== null}>{t.label}</option>)}\n </Select>\n <Input label=\"Name\" value={name} onChange={(e) => setName(e.target.value)} required placeholder=\"filesystem\" autoComplete=\"off\" />\n <Input label=\"Command\" value={command} onChange={(e) => setCommand(e.target.value)} required placeholder=\"/opt/homebrew/bin/npx\" autoComplete=\"off\"\n hint=\"An absolute path is safest; a bare name is looked up on PATH when the server starts.\" />\n <Input label=\"Arguments\" value={args} onChange={(e) => setArgs(e.target.value)} placeholder='-y @modelcontextprotocol/server-filesystem \"~/code\"' autoComplete=\"off\" />\n <label className={styles.fieldLabel}>\n Environment <span className={styles.hint}>One KEY=value per line. Values are sent once and never shown again.</span>\n <textarea className={styles.textarea} value={env} onChange={(e) => setEnv(e.target.value)} spellCheck={false} autoComplete=\"off\" />\n </label>\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>Cancel</Button>\n <Button type=\"submit\" variant=\"primary\" busy={busy} disabled={name.trim() === '' || command.trim() === '' || chosen?.disabledReason != null}>\n Review\n </Button>\n </div>\n </form>\n ) : (\n <div className={styles.dialogBody}>\n <p>\n {proposal.value.action === 'replace' ? 'Replaces' : 'Adds'} <strong>{proposal.value.server.name}</strong> in{' '}\n <code className={styles.inlineCode}>{proposal.value.targetRef}</code>\n {proposal.value.targetLabel ? ` (${proposal.value.targetLabel})` : ''}.\n </p>\n <McpServerDisclosure server={proposal.value.server} heading=\"This will run\" />\n {proposal.value.replaces ? <McpServerDisclosure server={proposal.value.replaces} heading=\"Replacing\" /> : null}\n {proposal.value.warnings.length > 0 ? (\n <ul className={styles.warnings}>{proposal.value.warnings.map((w) => <li key={w}>{w}</li>)}</ul>\n ) : null}\n {proposal.value.note ? <p className={styles.hint}>{proposal.value.note}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button variant=\"ghost\" onClick={() => setProposal(null)}>Back</Button>\n <Button variant=\"primary\" busy={busy} onClick={() => void apply()}>\n {proposal.value.action === 'replace' ? 'Replace server' : 'Add server'}\n </Button>\n </div>\n </div>\n )}\n </Sheet>\n );\n}\n\nexport function McpGroup({\n snapshot,\n cliHealth,\n unavailable,\n loading,\n run,\n onAdded,\n headingRef,\n}: {\n snapshot: McpSnapshot | null;\n cliHealth: CliHealthSnapshot | null;\n /** Why the per-seat read is missing; null when it arrived (or is loading). */\n unavailable: string | null;\n loading: boolean;\n run: GatedRun;\n onAdded: (message: string) => void;\n headingRef?: React.Ref<HTMLHeadingElement>;\n}) {\n const [adding, setAdding] = useState(false);\n const rows = snapshot ? mcpSeatRows(snapshot) : [];\n return (\n <AppGroup\n id=\"mcp-servers\"\n title=\"MCP servers\"\n headingRef={headingRef}\n action={\n <Button variant=\"subtle\" size=\"sm\" icon={<IconPlus size={14} />} onClick={() => setAdding(true)} aria-haspopup=\"dialog\">\n Add server\n </Button>\n }\n caveat={\n <>\n Claude and local seats load no MCP servers: Verse starts them with{' '}\n <code>--strict-mcp-config</code> and an empty <code>--mcp-config</code>. Codex and Grok seats load their own\n account’s config — and an <code>ashlr__</code> write through one is refused on a folder that is not enrolled.\n </>\n }\n >\n {snapshot !== null && snapshot.notes.length > 0 ? (\n <div className={styles.loadingLine} role=\"note\">\n <strong>Configured, but unused.</strong> {snapshot.notes.join(' ')} {snapshot.machine.note}\n </div>\n ) : null}\n {cliHealth !== null && cliHealth.driftDetected ? (\n <div className={styles.loadingLine} role=\"alert\">\n <strong>CLI version drift.</strong> {cliHealth.notes.join(' ')}{' '}\n {cliHealth.accounts.filter((a) => a.versionState === 'drift').map((a) => `${a.label}: ${a.version ?? 'unread'}, pinned ${a.pinnedVersion ?? '—'}.`).join(' ')}\n </div>\n ) : null}\n {snapshot === null ? (\n <p className={styles.loadingLine} aria-busy={loading || undefined}>\n {loading ? 'Reading each seat’s configuration…' : (unavailable ?? 'No per-seat reading is available.')}\n </p>\n ) : (\n <ul className={styles.rows}>\n {rows.map((row) => <SeatRow key={row.seatId} row={row} />)}\n </ul>\n )}\n {snapshot?.scope ? (\n <p className={styles.scopeLine}>\n Scope: {reasonSentence(SCOPE_REASON_COPY, snapshot.scope.reason, 'Locus did not report a usable scope.')}\n {snapshot.scope.tenantRef ? ` (${snapshot.scope.tenantRef})` : ''}\n </p>\n ) : null}\n <AddServerSheet open={adding} snapshot={snapshot} run={run} onClose={() => setAdding(false)} onAdded={onAdded} />\n </AppGroup>\n );\n}\n","/**\n * routes/verse/apps/ServedGroups.tsx — the three groups GET /api/verse/apps\n * serves: DESKTOP (Ollama's switches for other apps), TERMINAL AGENTS and\n * LOCAL MODELS. Rendering only; every decision about a word or an enabled\n * control was made by the server or apps-model.ts.\n */\nimport type { VerseAppGroup, VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconChevronDown, IconPlay } from '../../../components/primitives/icons.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { appHealthTone } from './apps-model.js';\nimport { AppGroup, AppRow } from './AppRow.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText } from './launch.js';\nimport styles from './Apps.module.css';\n\nfunction rowHealth(row: VerseAppRow) {\n return { tone: appHealthTone(row.health.state), label: row.health.label };\n}\n\nexport function DesktopGroup({\n group,\n onToggle,\n onRestore,\n}: {\n group: VerseAppGroup;\n /** Opens the confirmation; never flips anything by itself. */\n onToggle: (row: VerseAppRow, enable: boolean) => void;\n onRestore: (row: VerseAppRow) => void;\n}) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => {\n const restore = row.actions.find((a) => a.kind === 'restore') ?? null;\n return (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n health={rowHealth(row)}\n detail={row.toggle === null ? row.detail : null}\n aside={\n row.toggle === null ? null : (\n <>\n {restore ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onRestore(row)} disabled={restore.disabledReason !== null} title={commandText(restore.command ?? [])}>\n {restore.label}\n </Button>\n ) : null}\n <Switch\n checked={row.toggle.enabled}\n onChange={(next) => onToggle(row, next)}\n aria-label={`${row.description}: ${row.toggle.enabled ? 'on' : 'off'}`}\n aria-describedby={`app-${row.id}-name`}\n />\n </>\n )\n }\n />\n );\n })}\n </ul>\n </AppGroup>\n );\n}\n\nexport function AgentsGroup({\n group,\n quickLaunchReason,\n onQuickLaunch,\n onLaunchOptions,\n}: {\n group: VerseAppGroup;\n /** Why the one-click Launch cannot run anywhere right now (no folder and no Verse tab), or null. */\n quickLaunchReason: string | null;\n onQuickLaunch: (row: VerseAppRow) => void;\n onLaunchOptions: (row: VerseAppRow) => void;\n}) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => {\n const launch = row.actions.find((a) => a.kind === 'launch') ?? null;\n const disabled = launch?.disabledReason ?? quickLaunchReason;\n return (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n version={row.version}\n health={rowHealth(row)}\n detail={row.detail}\n aside={\n <>\n {row.copy && row.installed ? <CopyPill text={row.copy.text} label={row.copy.label} what={`the ${row.name} command`} /> : null}\n {row.ollamaLaunch ? (\n <CopyPill text={commandText(row.ollamaLaunch)} what={`the Ollama launch command for ${row.name}`} />\n ) : null}\n {launch ? (\n launch.disabledReason !== null ? (\n <span className={styles.disabledNote}>{launch.disabledReason}</span>\n ) : (\n <span className={styles.split}>\n <Button\n variant=\"subtle\"\n size=\"sm\"\n icon={<IconPlay size={14} />}\n disabled={disabled !== null}\n title={disabled ?? undefined}\n onClick={() => onQuickLaunch(row)}\n aria-label={`Launch ${row.name}`}\n >\n Launch\n </Button>\n <Button\n variant=\"subtle\"\n size=\"sm\"\n iconOnly\n icon={<IconChevronDown size={14} />}\n aria-label={`Launch options for ${row.name}`}\n title={`Launch options for ${row.name}`}\n aria-haspopup=\"dialog\"\n onClick={() => onLaunchOptions(row)}\n />\n </span>\n )\n ) : null}\n </>\n }\n />\n );\n })}\n </ul>\n </AppGroup>\n );\n}\n\nexport function LocalModelsGroup({ group }: { group: VerseAppGroup }) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n version={row.version}\n health={rowHealth(row)}\n detail={row.detail}\n />\n ))}\n </ul>\n </AppGroup>\n );\n}\n","/**\n * routes/verse/sections/AppsSection.tsx — Apps & Accounts (unit C6,\n * SPEC-310C §4; the gear tray's \"Apps & Accounts\", and where MCP now lives).\n *\n * One page that answers \"what can I run with on this Mac, and is it ready\":\n *\n * ACCOUNTS each seat's plan, connection, 5-hour and weekly windows\n * with resets, \"Reserved for you N%\", and Reconnect / Fix /\n * Edit budget — the shared CapacityStrip;\n * DESKTOP Ollama's switches for Claude Desktop and Hermes Desktop,\n * shown OFF with Restore (SPEC-310C §0.5);\n * TERMINAL AGENTS installed version or \"not installed\", the agent's own\n * command, `ollama launch <id>` only where the installed\n * Ollama lists it, and [Launch ▾];\n * LOCAL MODELS Ollama (models, end-to-end tok/s), llama-server, LM Studio;\n * MCP SERVERS what each seat would load, and Add (propose → disclose → apply).\n *\n * Takes no props, per the shell contract (C1 mounts `sections/*Section.tsx`).\n * `focusGroup` is only for the legacy MCP entry point, which lands on the MCP\n * group of this same page.\n *\n * Polls only while visible (usePollWhileVisible): apps every 60 s (the server\n * caches and re-probes in the background), seats 30 s, health 30 s, budget\n * 60 s. Every mutation goes through the mutation-token gate; nothing on this\n * page spends — the actions open visible Terminal windows or write a config\n * the operator just read.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconRefresh } from '../../../components/primitives/icons.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport type { VerseBootstrap } from '../../../data/api-types.js';\nimport { AccountsGroup } from '../apps/AccountsGroup.js';\nimport { launchProjects, localModelTags, type LaunchChoice } from '../apps/apps-model.js';\nimport { appsQuery, launchInTerminalApp, refreshApps, terminalStatusQuery, toggleDesktopApp } from '../apps/apps-queries.js';\nimport { DesktopToggleDialog } from '../apps/DesktopToggleDialog.js';\nimport { inVerseAvailability, launchInVerse } from '../apps/launch.js';\nimport { LaunchDialog, type LaunchRequest } from '../apps/LaunchDialog.js';\nimport { McpGroup } from '../apps/McpGroup.js';\nimport { AgentsGroup, DesktopGroup, LocalModelsGroup } from '../apps/ServedGroups.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { reconnectSeat, refreshSeatHealth } from '../health/health-queries.js';\nimport { projectCliHealth, projectMcpSnapshot } from '../mcp/mcp-contract.js';\nimport { mcpCliHealthQuery, mcpSnapshotQuery } from '../mcp/mcp-queries.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport type { CapacityRow } from '../usage/capacity-strip-model.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport styles from '../apps/Apps.module.css';\n\n/** The server re-probes in the background after 60 s; reading faster only re-reads its cache. */\nexport const APPS_POLL_MS = 60_000;\n\nfunction checkedAgo(iso: string, now: number): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return 'not checked';\n const minutes = Math.max(0, Math.round((now - t) / 60_000));\n if (minutes < 1) return 'checked just now';\n if (minutes < 120) return `checked ${minutes} min ago`;\n return `checked ${Math.round(minutes / 60)} h ago`;\n}\n\nexport function AppsSection({ focusGroup }: { focusGroup?: 'mcp-servers' } = {}) {\n const apps = useQuery(appsQuery);\n const refetchApps = useRefetch(appsQuery);\n usePollWhileVisible(refetchApps, APPS_POLL_MS);\n const terminal = useQuery(terminalStatusQuery);\n const mcp = useQuery(mcpSnapshotQuery);\n const cli = useQuery(mcpCliHealthQuery);\n const refetchMcp = useRefetch(mcpSnapshotQuery);\n const bootstrap = useQuery(verseBootstrapQuery);\n const capacity = useCapacityData();\n const ui = useVerseUi();\n const gate = useTokenGate();\n\n const [status, setStatus] = useState<{ tone: 'neutral' | 'danger'; text: string } | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n const [reconnecting, setReconnecting] = useState<string | null>(null);\n const [toggle, setToggle] = useState<{ row: VerseAppRow; enable: boolean } | null>(null);\n const [toggleBusy, setToggleBusy] = useState(false);\n const [toggleError, setToggleError] = useState<string | null>(null);\n const [launchRow, setLaunchRow] = useState<VerseAppRow | null>(null);\n const [launchBusy, setLaunchBusy] = useState(false);\n const [launchError, setLaunchError] = useState<string | null>(null);\n const [nowMs, setNowMs] = useState(() => Date.now());\n usePollWhileVisible(() => setNowMs(Date.now()), 30_000);\n\n const mcpHeading = useRef<HTMLHeadingElement>(null);\n useEffect(() => {\n if (focusGroup !== 'mcp-servers') return;\n const el = mcpHeading.current;\n if (!el) return;\n if (typeof el.scrollIntoView === 'function') el.scrollIntoView({ block: 'start' });\n el.focus({ preventScroll: true });\n }, [focusGroup]);\n\n const data = bootstrap.data as VerseBootstrap | undefined;\n const projects = launchProjects(data);\n const models = localModelTags(capacity.seats);\n const inVerse = inVerseAvailability({\n terminalAvailable: terminal.data?.available ? terminal.data.data.available : terminal.data ? false : null,\n terminalReason: terminal.data?.available ? terminal.data.data.reason : null,\n activeSessionId: ui.activeSessionId,\n });\n\n const served = apps.data?.available ? apps.data.data : null;\n const group = (id: 'desktop' | 'terminal-agents' | 'local-models') => served?.groups.find((g) => g.id === id) ?? null;\n const snapshot = mcp.data?.available ? projectMcpSnapshot(mcp.data.raw) : null;\n const cliHealth = cli.data?.available ? projectCliHealth(cli.data.raw) : null;\n\n const say = useCallback((text: string, tone: 'neutral' | 'danger' = 'neutral') => setStatus({ text, tone }), []);\n\n const onRefresh = async () => {\n setRefreshing(true);\n try {\n const done = await gate.run('Check every app and seat again', async () => {\n await Promise.all([refreshApps(), refreshSeatHealth().catch(() => null)]);\n refetchMcp();\n return true;\n });\n if (done) {\n setNowMs(Date.now());\n say('Checked again.');\n }\n } catch (err) {\n say(describeContextError(err), 'danger');\n } finally {\n setRefreshing(false);\n }\n };\n\n const onReconnect = async (row: CapacityRow) => {\n setReconnecting(row.seatId);\n try {\n const done = await gate.run(`Open the sign-in for ${row.label} in Terminal`, async () => {\n await reconnectSeat(row.seatId);\n return true;\n });\n if (done) say(`Opened the sign-in for ${row.label} in Terminal. Finish it there; this page picks it up.`);\n } catch (err) {\n say(describeContextError(err), 'danger');\n } finally {\n setReconnecting(null);\n }\n };\n\n const onConfirmToggle = async () => {\n if (!toggle) return;\n setToggleBusy(true);\n setToggleError(null);\n try {\n const result = await gate.run(`${toggle.enable ? 'Switch on' : 'Restore'} ${toggle.row.name}`, () => toggleDesktopApp(toggle.row.id, toggle.enable));\n if (result) {\n say(`Opened “${result.command.join(' ')}” in Terminal. Answer its prompts there.`);\n setToggle(null);\n }\n } catch (err) {\n setToggleError(describeContextError(err));\n } finally {\n setToggleBusy(false);\n }\n };\n\n const launch = async (row: VerseAppRow, request: LaunchRequest) => {\n if (request.target === 'verse') {\n launchInVerse(row.id, request.choice);\n setLaunchRow(null);\n return;\n }\n if (request.root === null) return;\n setLaunchBusy(true);\n setLaunchError(null);\n try {\n const result = await gate.run(`Launch ${row.name} in Terminal`, () =>\n launchInTerminalApp(row.id, { root: request.root!, via: request.choice.via, model: request.choice.model }));\n if (result) {\n say(`Opened ${row.name} in Terminal.`);\n setLaunchRow(null);\n }\n } catch (err) {\n const message = describeContextError(err);\n if (launchRow) setLaunchError(message);\n else say(message, 'danger');\n } finally {\n setLaunchBusy(false);\n }\n };\n\n const quickLaunchReason = inVerse.available || projects.length > 0 ? null : 'Open a chat or enrol a project first.';\n const onQuickLaunch = (row: VerseAppRow) => {\n const choice: LaunchChoice = { via: 'native', model: null };\n const command = row.actions.find((a) => a.kind === 'launch')?.command ?? null;\n if (!command) return;\n void launch(row, { choice, target: inVerse.available ? 'verse' : 'terminal-app', root: projects[0]?.path ?? null, command });\n };\n\n const servedLoading = apps.data === undefined && (apps.status === 'loading' || apps.status === 'idle');\n\n return (\n <section className={styles.section} aria-label=\"Apps & Accounts\">\n <div className={styles.scroll}>\n <div className={styles.page}>\n <header className={styles.header}>\n <div className={styles.headerText}>\n <h2 className={styles.title}>Apps &amp; Accounts</h2>\n <p className={styles.lede}>Everything Verse can run with on this Mac, and whether it is ready.</p>\n </div>\n <div className={styles.headerMeta}>\n {served ? (\n <span>\n {checkedAgo(served.checkedAt, nowMs)}\n {served.pathSource === 'fallback' ? ' · PATH from known folders (your login shell did not answer)' : ''}\n </span>\n ) : null}\n <Button variant=\"ghost\" size=\"sm\" icon={<IconRefresh size={14} />} busy={refreshing} onClick={() => void onRefresh()}>\n Check again\n </Button>\n </div>\n </header>\n\n <p className={status ? styles.banner : styles.visuallyHidden} data-tone={status?.tone} role=\"status\" aria-live=\"polite\">\n {status?.text ?? ''}\n </p>\n\n <AccountsGroup\n seats={capacity.seats}\n health={capacity.health}\n budget={capacity.budget}\n loading={capacity.loading}\n reconnecting={reconnecting}\n onReconnect={(row) => void onReconnect(row)}\n />\n\n {apps.data && !apps.data.available ? (\n <p className={styles.banner}>{apps.data.reason}</p>\n ) : servedLoading ? (\n <div aria-busy=\"true\" aria-label=\"Checking apps\">\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"80%\" />\n <SkeletonLine width=\"70%\" />\n </div>\n ) : (\n <>\n {group('desktop') ? (\n <DesktopGroup\n group={group('desktop')!}\n onToggle={(row, enable) => { setToggleError(null); setToggle({ row, enable }); }}\n onRestore={(row) => { setToggleError(null); setToggle({ row, enable: false }); }}\n />\n ) : null}\n {group('terminal-agents') ? (\n <AgentsGroup\n group={group('terminal-agents')!}\n quickLaunchReason={quickLaunchReason}\n onQuickLaunch={onQuickLaunch}\n onLaunchOptions={(row) => { setLaunchError(null); setLaunchRow(row); }}\n />\n ) : null}\n {group('local-models') ? <LocalModelsGroup group={group('local-models')!} /> : null}\n </>\n )}\n\n <McpGroup\n snapshot={snapshot}\n cliHealth={cliHealth}\n unavailable={mcp.data && !mcp.data.available ? mcp.data.reason : null}\n loading={mcp.data === undefined}\n run={gate.run}\n onAdded={(text) => { say(text); refetchMcp(); }}\n headingRef={mcpHeading}\n />\n </div>\n </div>\n\n <DesktopToggleDialog\n row={toggle?.row ?? null}\n enable={toggle?.enable ?? false}\n busy={toggleBusy}\n error={toggleError}\n onCancel={() => setToggle(null)}\n onConfirm={() => void onConfirmToggle()}\n />\n <LaunchDialog\n row={launchRow}\n projects={projects}\n models={models}\n inVerse={inVerse}\n busy={launchBusy}\n error={launchError}\n onCancel={() => setLaunchRow(null)}\n onLaunch={(request) => { if (launchRow) void launch(launchRow, request); }}\n />\n <MutationTokenDialog\n open={gate.dialog.open}\n reason={gate.dialog.reason}\n tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={gate.dialog.onClose}\n onUnlocked={gate.dialog.onUnlocked}\n />\n </section>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{A as r,F as i,H as a,I as ee,L as te,N as ne,P as re,S as o,U as s,W as c,a as ie,b as ae,c as oe,d as se,f as ce,i as le,j as l,k as ue,n as de,o as fe,r as pe,s as me,t as he,u,v as ge,w as _e,y as ve,z as ye}from"./ChartFrame-DY-GVUb3.js";import{p as d,v as be}from"./colors-DvK0wMHH.js";import{d as xe,f as Se,r as Ce,s as we,t as Te}from"./format-D7nBg2bn.js";var f=t(e(),1),p=n(),m=12,Ee=26,De=12,Oe=6.6,ke=120,Ae=14;function h({title:e,description:t,caveat:n,status:h,series:g,stacked:_=!1,height:v=200,width:je,formatX:y,formatY:b,formatTooltip:Me,formatTooltipX:Ne,threshold:x,yDomain:Pe,ariaLabel:Fe}){let S=y??we,C=b??Te,w=Me??b??Ce,T=(0,f.useRef)(null),E=le(T,je),D=pe(),Ie=ie(),[O,k]=(0,f.useState)(null),A=(0,f.useId)(),j=(0,f.useId)(),M=g.map((e,t)=>e.color??be(t)),N=(0,f.useMemo)(()=>{let e=g.flatMap(e=>e.points.map(e=>e.x)),t=i(e),n=Array.from(new Set(e.filter(t))).sort((e,t)=>e-t),r=g.map(e=>new Map(e.points.map(e=>[e.x,e.y])));return n.map(e=>{let t=r.map(t=>t.has(e)?t.get(e):null);return{x:e,values:t,total:t.some(e=>e===null)?null:t.reduce((e,t)=>e+(t??0),0)}})},[g]),Le=N.some(e=>e.values.some(e=>e!==null)),Re=h??(Le?{kind:`ready`}:{kind:`empty`}),P=_?N.map(e=>e.total).filter(e=>e!==null):N.flatMap(e=>e.values).filter(e=>e!==null),F=b?_e(b):null,I=Pe??(F!==null&&(e=>P.every(t=>t>=e[0]&&t<=e[1]))([0,F])?[0,F]:null),L=oe(Math.min(0,I?.[0]??0,...P),Math.max(0,I?.[1]??0,...P,x?.value??0),{count:4,integer:P.length>0&&me(P),format:b}),R=L.ticks,z=R[0],ze=R[R.length-1],B=re(L.labels,28,64,D),V=v-m-Ee,H=o(z,ze,m+V,m),U=!_&&g.length<=4?Math.max(0,...g.map(e=>e.label.length))*Oe*D+6:0,W=g.flatMap((e,t)=>{for(let n=N.length-1;n>=0;n--){let r=N[n].values[t];if(r!=null)return[{key:e.id,y:H(r)}]}return[]}),G=U>0&&U<=ke&&E>=420?se(W,Ae*D,m,m+V):null,Be=G!==null&&W.length>0,Ve=De+(Be?U:0),K=Math.max(40,E-B-Ve),q=N.length?N[0].x:0,J=N.length?N[N.length-1].x:1,Y=ge(N.map(e=>e.x)),He=Ne??y??(Y?Se(N.map(e=>e.x)):S),[Ue,We]=Y&&J>q?ce(q,J,fe):[q,J],X=o(Ue,We,B,B+K),Ge=(()=>{if(_){let e=N.map(()=>0);return g.map((t,n)=>{let r=N.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 l(r.map(e=>({x:e.x,y:e.y}))).map(e=>({top:e.map(e=>({x:X(e.x),y:H(e.y)})),bottom:e.map(e=>{let t=r.find(t=>t.x===e.x);return{x:X(e.x),y:H(t.base??0)}})}))})}return g.map((e,t)=>l(N.map(e=>({x:e.x,y:e.values[t]??null}))).map(e=>({top:e.map(e=>({x:X(e.x),y:H(e.y)})),bottom:e.map(e=>({x:X(e.x),y:H(Math.max(z,0))}))})))})(),Z=ne(N.length,Math.max(2,Math.floor(K/84))),Ke=Y?xe(q,J,y,Z.map(e=>N[e].x)):[S],qe=ae(Z.map((e,t)=>{let n=X(N[e].x),r=t===0,i=t===Z.length-1;return{key:String(e),x:n,anchor:N.length===1?`middle`:r&&n<=B+.5?`start`:i&&n>=B+K-.5?`end`:`middle`,priority:i?3:r?2:1,required:r||i,variants:Ke.map(t=>t(N[e].x))}}),{min:B,max:B+K,charPx:ve(D)});function Je(e){let t=T.current;if(!t||N.length===0)return null;let n=e-t.getBoundingClientRect().left,r=0,i=1/0;return N.forEach((e,t)=>{let a=Math.abs(X(e.x)-n);a<i&&(i=a,r=t)}),r}function Ye(e){if(N.length===0)return;let t=O??N.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?N.length-1:null;n!==null&&(e.preventDefault(),k(Math.max(0,Math.min(N.length-1,n))))}let Q=O===null?void 0:N[O],$=[...N].reverse().find(e=>e.values.some(e=>e!==null)),Xe=Fe??(N.length?`${e}: ${N.length} points from ${S(q)} to ${S(J)}.`+($?` Latest ${S($.x)}: ${g.map((e,t)=>`${e.label} ${$.values[t]===null?`no data`:C($.values[t])}`).join(`, `)}.`:``):`${e}: no data.`),Ze=[{key:`x`,label:`When`,render:e=>S(e.x)},...g.map((e,t)=>({key:e.id,label:e.label,numeric:!0,render:e=>e.values[t]===null?`—`:C(e.values[t])})),..._&&g.length>1?[{key:`__total`,label:`Total`,numeric:!0,render:e=>e.total===null?`—`:C(e.total)}]:[]];return(0,p.jsx)(he,{title:e,description:t,caveat:n,status:Re,skeleton:`line`,skeletonHeight:v,table:(0,p.jsx)(de,{caption:e,columns:Ze,rows:N,rowKey:e=>String(e.x)}),footer:(0,p.jsx)(te,{items:g.map((e,t)=>({label:e.label,color:M[t],kind:_?`swatch`:`line`}))}),children:(0,p.jsxs)(`div`,{ref:T,className:`${c.plotWrap} ${c.focusable}`,"data-motion":Ie,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read values.`,"aria-describedby":A,onFocus:()=>k(e=>e??(N.length?N.length-1:null)),onBlur:()=>k(null),onKeyDown:Ye,children:[(0,p.jsxs)(`svg`,{className:c.svg,width:E,height:v,viewBox:`0 0 ${E} ${v}`,role:`img`,"aria-label":Xe,onPointerMove:e=>k(Je(e.clientX)),onPointerLeave:()=>k(null),children:[_?null:(0,p.jsx)(`defs`,{children:g.map((e,t)=>(0,p.jsx)(ee,{id:d(j,e.id),color:M[t],top:m,bottom:m+V,from:g.length>1?.16:.22},e.id))}),R.map((e,t)=>(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`line`,{className:c.grid,x1:B,x2:B+K,y1:u(H(e)),y2:u(H(e))}),(0,p.jsx)(`text`,{className:c.tick,x:B-6,y:H(e),dy:`0.32em`,textAnchor:`end`,children:L.labels[t]})]},e)),(0,p.jsx)(`line`,{className:c.axis,x1:B,x2:B+K,y1:u(H(Math.max(z,0))),y2:u(H(Math.max(z,0)))}),qe.map(e=>(0,p.jsx)(`text`,{"data-axis-label":e.key,className:c.tick,x:e.x,y:v-8,textAnchor:e.anchor,children:e.text},e.key)),Ge.map((e,t)=>(0,p.jsxs)(`g`,{"data-series":g[t].id,children:[e.map((e,n)=>(0,p.jsx)(`path`,{"data-role":`area`,d:ue(e.top,e.bottom),fill:_?M[t]:`url(#${d(j,g[t].id)})`,className:_?c.fadeIn:`${c.area} ${c.fadeIn}`,opacity:_?.85:void 0,stroke:_?`var(--chart-surface)`:void 0,strokeWidth:_?1.5:void 0},`a${n}`)),_?null:e.map((e,n)=>e.top.length===1?(0,p.jsx)(`circle`,{cx:e.top[0].x,cy:e.top[0].y,r:3,fill:M[t]},`p${n}`):(0,p.jsx)(`path`,{"data-role":`line`,d:r(e.top),pathLength:1,stroke:M[t],className:`${c.line} ${c.draw}`},`l${n}`)),!_&&e.length&&Q===void 0?(()=>{let n=e[e.length-1].top,r=n[n.length-1];return n.length>1?(0,p.jsx)(`circle`,{"data-role":`end-dot`,className:`${c.endDot} ${c.fadeIn}`,cx:r.x,cy:r.y,r:3.5,fill:M[t]}):null})():null,Be&&e.length?(()=>{let n=e[e.length-1].top,r=n[n.length-1];return(0,p.jsx)(`text`,{"data-end-label":g[t].id,className:c.label,x:r.x+6,y:G.get(g[t].id)??r.y,dy:`0.32em`,children:g[t].label})})():null]},g[t].id)),x?(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`line`,{className:c.reference,x1:B,x2:B+K,y1:H(x.value),y2:H(x.value)}),(0,p.jsxs)(`text`,{className:c.tick,x:B+K,y:H(x.value)-4,textAnchor:`end`,children:[x.label,` · `,C(x.value)]})]}):null,Q?(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`line`,{className:c.crosshair,"data-role":`crosshair`,x1:u(X(Q.x)),x2:u(X(Q.x)),y1:m,y2:m+V}),g.map((e,t)=>{let n=_?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,p.jsx)(`circle`,{className:c.marker,cx:X(Q.x),cy:H(n),r:4,fill:M[t]},e.id)})]}):null]}),(0,p.jsx)(`span`,{id:A,className:c.srOnly,"aria-live":`polite`,children:Q?`${He(Q.x)}: ${g.map((e,t)=>`${e.label} ${Q.values[t]===null?`no data`:w(Q.values[t])}`).join(`, `)}`:``}),Q?(0,p.jsx)(ye,{left:s(X(Q.x),E)?X(Q.x):a(X(Q.x),E),side:s(X(Q.x),E),top:m,title:He(Q.x),rows:[...g.map((e,t)=>({key:e.id,label:e.label,value:Q.values[t]===null?null:w(Q.values[t]),color:M[t],kind:_?`swatch`:`line`})),..._&&g.length>1?[{key:`__t`,label:`Total`,value:Q.total===null?null:w(Q.total),total:!0}]:[]]}):null]})})}export{h as t};
2
+ //# sourceMappingURL=AreaTrend-DK2Y2TbZ.js.map