@ashlr/hub 3.11.5 → 3.13.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 (408) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/README.md +29 -16
  3. package/dist/authority-surface.json +91 -45
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +145 -33
  6. package/dist/cli/authority.js +1196 -313
  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/core/authority/protected-paths.js +11 -0
  11. package/dist/core/authority/protected-paths.js.map +1 -1
  12. package/dist/core/authority/resident.d.ts +101 -0
  13. package/dist/core/authority/resident.js +246 -0
  14. package/dist/core/authority/resident.js.map +1 -0
  15. package/dist/core/authority/trust-roots.js +7 -1
  16. package/dist/core/authority/trust-roots.js.map +1 -1
  17. package/dist/core/authority/types.d.ts +43 -0
  18. package/dist/core/authority/types.js +6 -0
  19. package/dist/core/authority/types.js.map +1 -1
  20. package/dist/core/cloud/budget.js +11 -1
  21. package/dist/core/cloud/budget.js.map +1 -1
  22. package/dist/core/cloud/cloud-api.d.ts +25 -2
  23. package/dist/core/cloud/cloud-api.js +139 -5
  24. package/dist/core/cloud/cloud-api.js.map +1 -1
  25. package/dist/core/cloud/pr-actions.d.ts +93 -0
  26. package/dist/core/cloud/pr-actions.js +436 -0
  27. package/dist/core/cloud/pr-actions.js.map +1 -0
  28. package/dist/core/cloud/pr-preview.d.ts +128 -0
  29. package/dist/core/cloud/pr-preview.js +228 -0
  30. package/dist/core/cloud/pr-preview.js.map +1 -0
  31. package/dist/core/cloud/store.d.ts +2 -0
  32. package/dist/core/cloud/store.js +28 -0
  33. package/dist/core/cloud/store.js.map +1 -1
  34. package/dist/core/cloud/timeline-api.d.ts +24 -0
  35. package/dist/core/cloud/timeline-api.js +46 -0
  36. package/dist/core/cloud/timeline-api.js.map +1 -0
  37. package/dist/core/cloud/timeline-types.d.ts +62 -0
  38. package/dist/core/cloud/timeline-types.js +36 -0
  39. package/dist/core/cloud/timeline-types.js.map +1 -0
  40. package/dist/core/cloud/timeline.d.ts +102 -0
  41. package/dist/core/cloud/timeline.js +919 -0
  42. package/dist/core/cloud/timeline.js.map +1 -0
  43. package/dist/core/cloud/tracker.js +67 -0
  44. package/dist/core/cloud/tracker.js.map +1 -1
  45. package/dist/core/cloud/types.d.ts +38 -0
  46. package/dist/core/cloud/types.js +1 -1
  47. package/dist/core/cloud/types.js.map +1 -1
  48. package/dist/core/daemon/service-install-authority.d.ts +10 -2
  49. package/dist/core/daemon/service-install-authority.js +14 -5
  50. package/dist/core/daemon/service-install-authority.js.map +1 -1
  51. package/dist/core/daemon/service.d.ts +15 -0
  52. package/dist/core/daemon/service.js +26 -0
  53. package/dist/core/daemon/service.js.map +1 -1
  54. package/dist/core/fleet/cloud-intake.d.ts +95 -0
  55. package/dist/core/fleet/cloud-intake.js +557 -0
  56. package/dist/core/fleet/cloud-intake.js.map +1 -0
  57. package/dist/core/fleet/dispatch-router.d.ts +13 -0
  58. package/dist/core/fleet/dispatch-router.js +32 -8
  59. package/dist/core/fleet/dispatch-router.js.map +1 -1
  60. package/dist/core/fleet/fleet-merge-state.d.ts +10 -0
  61. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  62. package/dist/core/fleet/host-merge.d.ts +5 -0
  63. package/dist/core/fleet/host-merge.js +11 -0
  64. package/dist/core/fleet/host-merge.js.map +1 -1
  65. package/dist/core/fleet/merge-gates.d.ts +8 -0
  66. package/dist/core/fleet/merge-gates.js +25 -5
  67. package/dist/core/fleet/merge-gates.js.map +1 -1
  68. package/dist/core/fleet/standing-merge-pass.js +30 -0
  69. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  70. package/dist/core/fleet/tick-hooks-live.d.ts +9 -0
  71. package/dist/core/fleet/tick-hooks-live.js +44 -5
  72. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  73. package/dist/core/fleet/verify-check-run.d.ts +90 -0
  74. package/dist/core/fleet/verify-check-run.js +274 -0
  75. package/dist/core/fleet/verify-check-run.js.map +1 -0
  76. package/dist/core/routing/budget-api.d.ts +11 -0
  77. package/dist/core/routing/budget-api.js +64 -8
  78. package/dist/core/routing/budget-api.js.map +1 -1
  79. package/dist/core/routing/budget-store.d.ts +22 -1
  80. package/dist/core/routing/budget-store.js +22 -8
  81. package/dist/core/routing/budget-store.js.map +1 -1
  82. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  83. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +8 -2
  84. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +7 -1
  85. package/dist/core/verse/account-health.js +9 -3
  86. package/dist/core/verse/account-health.js.map +1 -1
  87. package/dist/core/verse/activity-api.d.ts +5 -1
  88. package/dist/core/verse/activity-api.js +62 -14
  89. package/dist/core/verse/activity-api.js.map +1 -1
  90. package/dist/core/verse/authority-api.d.ts +9 -1
  91. package/dist/core/verse/authority-api.js +82 -2
  92. package/dist/core/verse/authority-api.js.map +1 -1
  93. package/dist/core/verse/seat-readiness.d.ts +25 -0
  94. package/dist/core/verse/seat-readiness.js +43 -6
  95. package/dist/core/verse/seat-readiness.js.map +1 -1
  96. package/dist/core/verse/verse-api.d.ts +3 -1
  97. package/dist/core/verse/verse-api.js +6 -0
  98. package/dist/core/verse/verse-api.js.map +1 -1
  99. package/dist/core/web/public/next/assets/{ActionMenu-DffwPklw.js → ActionMenu-Dwjk6rUQ.js} +2 -2
  100. package/dist/core/web/public/next/assets/{ActionMenu-DffwPklw.js.map → ActionMenu-Dwjk6rUQ.js.map} +1 -1
  101. package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +2 -0
  102. package/dist/core/web/public/next/assets/{Advanced-CxzE6ekM.js.map → Advanced-cVYTAsfB.js.map} +1 -1
  103. package/dist/core/web/public/next/assets/App-IsaWDsdF.js +7 -0
  104. package/dist/core/web/public/next/assets/{App-DFlp-vdv.js.map → App-IsaWDsdF.js.map} +1 -1
  105. package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +2 -0
  106. package/dist/core/web/public/next/assets/{AppsSection-Ct2O605-.js.map → AppsSection-DDqeSrty.js.map} +1 -1
  107. package/dist/core/web/public/next/assets/{AreaTrend-o-GLl2Is.js → AreaTrend-C32rUaxm.js} +2 -2
  108. package/dist/core/web/public/next/assets/{AreaTrend-o-GLl2Is.js.map → AreaTrend-C32rUaxm.js.map} +1 -1
  109. package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
  110. package/dist/core/web/public/next/assets/AutonomyOffState-CpFYS3tQ.js +3 -0
  111. package/dist/core/web/public/next/assets/AutonomyOffState-CpFYS3tQ.js.map +1 -0
  112. package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +2 -0
  113. package/dist/core/web/public/next/assets/{AutonomySection-BTg7yVa1.js.map → AutonomySection-Dwn8UtOy.js.map} +1 -1
  114. package/dist/core/web/public/next/assets/{BranchBar-BjPFtGsj.js → BranchBar-ISZ7xUCj.js} +2 -2
  115. package/dist/core/web/public/next/assets/{BranchBar-BjPFtGsj.js.map → BranchBar-ISZ7xUCj.js.map} +1 -1
  116. package/dist/core/web/public/next/assets/BudgetControl-BARVp-En.js +2 -0
  117. package/dist/core/web/public/next/assets/BudgetControl-BARVp-En.js.map +1 -0
  118. package/dist/core/web/public/next/assets/{Button-OjVJSrFq.js → Button-DtE0rlWD.js} +2 -2
  119. package/dist/core/web/public/next/assets/{Button-OjVJSrFq.js.map → Button-DtE0rlWD.js.map} +1 -1
  120. package/dist/core/web/public/next/assets/{CapacityStrip-Bx4c3dxD.js → CapacityStrip-DKbKA_Aa.js} +2 -2
  121. package/dist/core/web/public/next/assets/{CapacityStrip-Bx4c3dxD.js.map → CapacityStrip-DKbKA_Aa.js.map} +1 -1
  122. package/dist/core/web/public/next/assets/{ChartFrame-B_w2Siqg.js → ChartFrame-DK_BDXCt.js} +2 -2
  123. package/dist/core/web/public/next/assets/{ChartFrame-B_w2Siqg.js.map → ChartFrame-DK_BDXCt.js.map} +1 -1
  124. package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +3 -0
  125. package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js.map +1 -0
  126. package/dist/core/web/public/next/assets/{CloudBudgetForm-5Gf4iAok.js → CloudBudgetForm-CvjK4Oh6.js} +2 -2
  127. package/dist/core/web/public/next/assets/{CloudBudgetForm-5Gf4iAok.js.map → CloudBudgetForm-CvjK4Oh6.js.map} +1 -1
  128. package/dist/core/web/public/next/assets/{CommandPalette-iTpk6I8r.js → CommandPalette-DzPsth0u.js} +2 -2
  129. package/dist/core/web/public/next/assets/{CommandPalette-iTpk6I8r.js.map → CommandPalette-DzPsth0u.js.map} +1 -1
  130. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +3 -0
  131. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +1 -0
  132. package/dist/core/web/public/next/assets/{ConfirmDialog-_S9iE-cJ.js → ConfirmDialog-CLUhzaBj.js} +2 -2
  133. package/dist/core/web/public/next/assets/{ConfirmDialog-_S9iE-cJ.js.map → ConfirmDialog-CLUhzaBj.js.map} +1 -1
  134. package/dist/core/web/public/next/assets/{DeleteChatDialog-KUYUygiA.js → DeleteChatDialog-C_eDhV8b.js} +2 -2
  135. package/dist/core/web/public/next/assets/{DeleteChatDialog-KUYUygiA.js.map → DeleteChatDialog-C_eDhV8b.js.map} +1 -1
  136. package/dist/core/web/public/next/assets/{Dialog-BuIaG6HF.js → Dialog-BRd_B9OE.js} +2 -2
  137. package/dist/core/web/public/next/assets/{Dialog-BuIaG6HF.js.map → Dialog-BRd_B9OE.js.map} +1 -1
  138. package/dist/core/web/public/next/assets/{DiffPane-De4IQt82.js → DiffPane-Cpr9soB2.js} +2 -2
  139. package/dist/core/web/public/next/assets/{DiffPane-De4IQt82.js.map → DiffPane-Cpr9soB2.js.map} +1 -1
  140. package/dist/core/web/public/next/assets/{DiffViewer-B75t6Ile.js → DiffViewer-CNwd0W3Q.js} +2 -2
  141. package/dist/core/web/public/next/assets/{DiffViewer-B75t6Ile.js.map → DiffViewer-CNwd0W3Q.js.map} +1 -1
  142. package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +2 -0
  143. package/dist/core/web/public/next/assets/{DockHost-BPqyhtCP.js.map → DockHost-BcEq2qaS.js.map} +1 -1
  144. package/dist/core/web/public/next/assets/{EmptyState-DXkT4vhW.js → EmptyState-DsN1H6MC.js} +2 -2
  145. package/dist/core/web/public/next/assets/{EmptyState-DXkT4vhW.js.map → EmptyState-DsN1H6MC.js.map} +1 -1
  146. package/dist/core/web/public/next/assets/{Epistemic-CfqFe_aP.js → Epistemic-fycQTBRO.js} +2 -2
  147. package/dist/core/web/public/next/assets/{Epistemic-CfqFe_aP.js.map → Epistemic-fycQTBRO.js.map} +1 -1
  148. package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
  149. package/dist/core/web/public/next/assets/EvidenceTimeline-sCCAdnBK.js +2 -0
  150. package/dist/core/web/public/next/assets/EvidenceTimeline-sCCAdnBK.js.map +1 -0
  151. package/dist/core/web/public/next/assets/{FleetSection-B7f-XBiX.js → FleetSection-BG8iGraG.js} +3 -3
  152. package/dist/core/web/public/next/assets/{FleetSection-B7f-XBiX.js.map → FleetSection-BG8iGraG.js.map} +1 -1
  153. package/dist/core/web/public/next/assets/{Funnel-pXYySwXQ.js → Funnel-B88_wpA4.js} +2 -2
  154. package/dist/core/web/public/next/assets/{Funnel-pXYySwXQ.js.map → Funnel-B88_wpA4.js.map} +1 -1
  155. package/dist/core/web/public/next/assets/{GearTray-gj6lT7ba.js → GearTray-CpDt0xwj.js} +2 -2
  156. package/dist/core/web/public/next/assets/{GearTray-gj6lT7ba.js.map → GearTray-CpDt0xwj.js.map} +1 -1
  157. package/dist/core/web/public/next/assets/{GrowthSection-D8e9m9Wy.js → GrowthSection-BvZezOsX.js} +2 -2
  158. package/dist/core/web/public/next/assets/{GrowthSection-D8e9m9Wy.js.map → GrowthSection-BvZezOsX.js.map} +1 -1
  159. package/dist/core/web/public/next/assets/{HandoffDialog-VfKxKhxF.js → HandoffDialog-B1G6gQyk.js} +2 -2
  160. package/dist/core/web/public/next/assets/{HandoffDialog-VfKxKhxF.js.map → HandoffDialog-B1G6gQyk.js.map} +1 -1
  161. package/dist/core/web/public/next/assets/{Input-u1YR_Ogl.js → Input-CI0yBHmn.js} +2 -2
  162. package/dist/core/web/public/next/assets/{Input-u1YR_Ogl.js.map → Input-CI0yBHmn.js.map} +1 -1
  163. package/dist/core/web/public/next/assets/{LeaderCard-BDELBrnx.js → LeaderCard-BxxiEg4e.js} +2 -2
  164. package/dist/core/web/public/next/assets/{LeaderCard-BDELBrnx.js.map → LeaderCard-BxxiEg4e.js.map} +1 -1
  165. package/dist/core/web/public/next/assets/{MatrixHeatmap-NKLF2srR.js → MatrixHeatmap-iPFEU2Tv.js} +2 -2
  166. package/dist/core/web/public/next/assets/{MatrixHeatmap-NKLF2srR.js.map → MatrixHeatmap-iPFEU2Tv.js.map} +1 -1
  167. package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +2 -0
  168. package/dist/core/web/public/next/assets/{McpSection-D1tDvlRa.js.map → McpSection-nuXer4K-.js.map} +1 -1
  169. package/dist/core/web/public/next/assets/{MessageMarkdown-DlfLEJxu.js → MessageMarkdown-BCe4TsXk.js} +3 -3
  170. package/dist/core/web/public/next/assets/{MessageMarkdown-DlfLEJxu.js.map → MessageMarkdown-BCe4TsXk.js.map} +1 -1
  171. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-BYZzI115.js → MessageMarkdownRenderer-DL3LU5kL.js} +2 -2
  172. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-BYZzI115.js.map → MessageMarkdownRenderer-DL3LU5kL.js.map} +1 -1
  173. package/dist/core/web/public/next/assets/{Meter-BSVhU43Q.js → Meter-b69LM0mU.js} +2 -2
  174. package/dist/core/web/public/next/assets/{Meter-BSVhU43Q.js.map → Meter-b69LM0mU.js.map} +1 -1
  175. package/dist/core/web/public/next/assets/{MindSection-lqV2e_Sq.js → MindSection-Dc5v5rH3.js} +2 -2
  176. package/dist/core/web/public/next/assets/{MindSection-lqV2e_Sq.js.map → MindSection-Dc5v5rH3.js.map} +1 -1
  177. package/dist/core/web/public/next/assets/{MutationTokenDialog-CLGP72g6.js → MutationTokenDialog-Bm34BNVV.js} +2 -2
  178. package/dist/core/web/public/next/assets/{MutationTokenDialog-CLGP72g6.js.map → MutationTokenDialog-Bm34BNVV.js.map} +1 -1
  179. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +3 -0
  180. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +1 -0
  181. package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
  182. package/dist/core/web/public/next/assets/NeedsYouList-D5Kk549g.js +2 -0
  183. package/dist/core/web/public/next/assets/{NeedsYouList-eBOlJr0b.js.map → NeedsYouList-D5Kk549g.js.map} +1 -1
  184. package/dist/core/web/public/next/assets/{NewChatDialog-DoYTH26M.js → NewChatDialog-BqFTWgHU.js} +2 -2
  185. package/dist/core/web/public/next/assets/{NewChatDialog-DoYTH26M.js.map → NewChatDialog-BqFTWgHU.js.map} +1 -1
  186. package/dist/core/web/public/next/assets/OnboardingFlow-DcDsguAM.js +3 -0
  187. package/dist/core/web/public/next/assets/OnboardingFlow-DcDsguAM.js.map +1 -0
  188. package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +3 -0
  189. package/dist/core/web/public/next/assets/{OnboardingGate-DrDEVBqw.js.map → OnboardingGate-BZafM1Vf.js.map} +1 -1
  190. package/dist/core/web/public/next/assets/{PreviewPane-ULN673zm.js → PreviewPane-zT3gK9TD.js} +2 -2
  191. package/dist/core/web/public/next/assets/{PreviewPane-ULN673zm.js.map → PreviewPane-zT3gK9TD.js.map} +1 -1
  192. package/dist/core/web/public/next/assets/{ProviderLogo-8WaUjTlN.js → ProviderLogo-AwHn2sKm.js} +2 -2
  193. package/dist/core/web/public/next/assets/{ProviderLogo-8WaUjTlN.js.map → ProviderLogo-AwHn2sKm.js.map} +1 -1
  194. package/dist/core/web/public/next/assets/{RailStatus-Ckw9nvYU.js → RailStatus-xHrovWvI.js} +2 -2
  195. package/dist/core/web/public/next/assets/{RailStatus-Ckw9nvYU.js.map → RailStatus-xHrovWvI.js.map} +1 -1
  196. package/dist/core/web/public/next/assets/{RefreshIndicator-DGubF4vR.js → RefreshIndicator-SEFZlMB2.js} +2 -2
  197. package/dist/core/web/public/next/assets/{RefreshIndicator-DGubF4vR.js.map → RefreshIndicator-SEFZlMB2.js.map} +1 -1
  198. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BahEaY4d.js → ResourcePoolConsoleApp-CAxPQ4sZ.js} +3 -3
  199. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BahEaY4d.js.map → ResourcePoolConsoleApp-CAxPQ4sZ.js.map} +1 -1
  200. package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +3 -0
  201. package/dist/core/web/public/next/assets/{ResourcesChrome-C2ZrA7la.js.map → ResourcesChrome-BnhnEdJe.js.map} +1 -1
  202. package/dist/core/web/public/next/assets/{ResourcesDrawer-BC93fzwQ.js → ResourcesDrawer-BAFGodny.js} +2 -2
  203. package/dist/core/web/public/next/assets/{ResourcesDrawer-BC93fzwQ.js.map → ResourcesDrawer-BAFGodny.js.map} +1 -1
  204. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BvhHNpE_.js → RouteErrorBoundary-C8WGiixc.js} +2 -2
  205. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BvhHNpE_.js.map → RouteErrorBoundary-C8WGiixc.js.map} +1 -1
  206. package/dist/core/web/public/next/assets/{RunInCloudAction-Dywfnw0C.js → RunInCloudAction-1-IPLYhf.js} +2 -2
  207. package/dist/core/web/public/next/assets/{RunInCloudAction-Dywfnw0C.js.map → RunInCloudAction-1-IPLYhf.js.map} +1 -1
  208. package/dist/core/web/public/next/assets/{SeatSelector-CH7hTgwy.js → SeatSelector-DpwNiX8F.js} +2 -2
  209. package/dist/core/web/public/next/assets/{SeatSelector-CH7hTgwy.js.map → SeatSelector-DpwNiX8F.js.map} +1 -1
  210. package/dist/core/web/public/next/assets/{Segmented-Wynbg0F5.js → Segmented-Wt1ATod9.js} +2 -2
  211. package/dist/core/web/public/next/assets/{Segmented-Wynbg0F5.js.map → Segmented-Wt1ATod9.js.map} +1 -1
  212. package/dist/core/web/public/next/assets/{Select-DMyLCkId.js → Select-By-V9lMc.js} +2 -2
  213. package/dist/core/web/public/next/assets/{Select-DMyLCkId.js.map → Select-By-V9lMc.js.map} +1 -1
  214. package/dist/core/web/public/next/assets/{SessionGate-8RtQFWeZ.js → SessionGate-WROS02tK.js} +2 -2
  215. package/dist/core/web/public/next/assets/{SessionGate-8RtQFWeZ.js.map → SessionGate-WROS02tK.js.map} +1 -1
  216. package/dist/core/web/public/next/assets/{SessionInsightChip-zBJbKv2L.js → SessionInsightChip-DNUcruwp.js} +2 -2
  217. package/dist/core/web/public/next/assets/{SessionInsightChip-zBJbKv2L.js.map → SessionInsightChip-DNUcruwp.js.map} +1 -1
  218. package/dist/core/web/public/next/assets/{SessionSearch-DfJIcxxM.js → SessionSearch-UHtt7a8f.js} +2 -2
  219. package/dist/core/web/public/next/assets/{SessionSearch-DfJIcxxM.js.map → SessionSearch-UHtt7a8f.js.map} +1 -1
  220. package/dist/core/web/public/next/assets/{SettingsSection-Da9RYyH5.js → SettingsSection-Bf74l0Gj.js} +2 -2
  221. package/dist/core/web/public/next/assets/{SettingsSection-Da9RYyH5.js.map → SettingsSection-Bf74l0Gj.js.map} +1 -1
  222. package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
  223. package/dist/core/web/public/next/assets/SetupChecklist-CzpEcfOl.js +2 -0
  224. package/dist/core/web/public/next/assets/SetupChecklist-CzpEcfOl.js.map +1 -0
  225. package/dist/core/web/public/next/assets/{Sheet-DhXyIDmq.js → Sheet-HkBOBMTT.js} +2 -2
  226. package/dist/core/web/public/next/assets/{Sheet-DhXyIDmq.js.map → Sheet-HkBOBMTT.js.map} +1 -1
  227. package/dist/core/web/public/next/assets/{ShortcutsOverlay-Bi5f-wUw.js → ShortcutsOverlay-DiigiT8H.js} +2 -2
  228. package/dist/core/web/public/next/assets/{ShortcutsOverlay-Bi5f-wUw.js.map → ShortcutsOverlay-DiigiT8H.js.map} +1 -1
  229. package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +3 -0
  230. package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js.map +1 -0
  231. package/dist/core/web/public/next/assets/{Slider-Bd9YFWEV.js → Slider-DaEDws-b.js} +2 -2
  232. package/dist/core/web/public/next/assets/{Slider-Bd9YFWEV.js.map → Slider-DaEDws-b.js.map} +1 -1
  233. package/dist/core/web/public/next/assets/{StatTile-DScTd3c-.js → StatTile-CTX41O6y.js} +2 -2
  234. package/dist/core/web/public/next/assets/{StatTile-DScTd3c-.js.map → StatTile-CTX41O6y.js.map} +1 -1
  235. package/dist/core/web/public/next/assets/{StatusBadge-DQ1UtQAJ.js → StatusBadge-CXG3iNL4.js} +2 -2
  236. package/dist/core/web/public/next/assets/{StatusBadge-DQ1UtQAJ.js.map → StatusBadge-CXG3iNL4.js.map} +1 -1
  237. package/dist/core/web/public/next/assets/{StepBand-BB3IJxhr.js → StepBand-jJTqYIdX.js} +2 -2
  238. package/dist/core/web/public/next/assets/{StepBand-BB3IJxhr.js.map → StepBand-jJTqYIdX.js.map} +1 -1
  239. package/dist/core/web/public/next/assets/{Surface-DWMtQe3Q.js → Surface-5bNA08tK.js} +2 -2
  240. package/dist/core/web/public/next/assets/{Surface-DWMtQe3Q.js.map → Surface-5bNA08tK.js.map} +1 -1
  241. package/dist/core/web/public/next/assets/{Swimlane-DcENqtdp.js → Swimlane-LrslsGxw.js} +2 -2
  242. package/dist/core/web/public/next/assets/{Swimlane-DcENqtdp.js.map → Swimlane-LrslsGxw.js.map} +1 -1
  243. package/dist/core/web/public/next/assets/{Switch-CenChEYf.js → Switch-BmCzfFnu.js} +2 -2
  244. package/dist/core/web/public/next/assets/{Switch-CenChEYf.js.map → Switch-BmCzfFnu.js.map} +1 -1
  245. package/dist/core/web/public/next/assets/{Tag-D4k5E3u0.js → Tag-WSUIaMVy.js} +2 -2
  246. package/dist/core/web/public/next/assets/{Tag-D4k5E3u0.js.map → Tag-WSUIaMVy.js.map} +1 -1
  247. package/dist/core/web/public/next/assets/{TerminalPane-DCQTukcE.js → TerminalPane-BVFgYX6K.js} +5 -5
  248. package/dist/core/web/public/next/assets/{TerminalPane-DCQTukcE.js.map → TerminalPane-BVFgYX6K.js.map} +1 -1
  249. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DsuWT0pi.js → UniverseConsoleApp-BpphLqoz.js} +2 -2
  250. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DsuWT0pi.js.map → UniverseConsoleApp-BpphLqoz.js.map} +1 -1
  251. package/dist/core/web/public/next/assets/{UniverseView-DyI5ApsA.js → UniverseView-DbpbSMwO.js} +4 -4
  252. package/dist/core/web/public/next/assets/{UniverseView-DyI5ApsA.js.map → UniverseView-DbpbSMwO.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{UsageSection-Imr28nwK.js → UsageSection-CUlaKtws.js} +3 -3
  254. package/dist/core/web/public/next/assets/{UsageSection-Imr28nwK.js.map → UsageSection-CUlaKtws.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +3 -0
  256. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +1 -0
  257. package/dist/core/web/public/next/assets/{Workspace-CpxBO98E.js → Workspace-RXy0pqp6.js} +5 -5
  258. package/dist/core/web/public/next/assets/{Workspace-CpxBO98E.js.map → Workspace-RXy0pqp6.js.map} +1 -1
  259. package/dist/core/web/public/next/assets/{actions-DE8NoWV_.js → actions-BZTidCXZ.js} +2 -2
  260. package/dist/core/web/public/next/assets/{actions-DE8NoWV_.js.map → actions-BZTidCXZ.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/{apps-model-CFGCUu9p.js → apps-model-CHO133qt.js} +2 -2
  262. package/dist/core/web/public/next/assets/{apps-model-CFGCUu9p.js.map → apps-model-CHO133qt.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/{authority-model-CmnfJzmM.js → authority-model-8NeAEwAF.js} +2 -2
  264. package/dist/core/web/public/next/assets/{authority-model-CmnfJzmM.js.map → authority-model-8NeAEwAF.js.map} +1 -1
  265. package/dist/core/web/public/next/assets/{budget-queries-DjrPRFwl.js → budget-queries-DFF-3ICg.js} +2 -2
  266. package/dist/core/web/public/next/assets/{budget-queries-DjrPRFwl.js.map → budget-queries-DFF-3ICg.js.map} +1 -1
  267. package/dist/core/web/public/next/assets/{capacity-strip-model-C7cdQnuK.js → capacity-strip-model-5ViUgUlP.js} +2 -2
  268. package/dist/core/web/public/next/assets/{capacity-strip-model-C7cdQnuK.js.map → capacity-strip-model-5ViUgUlP.js.map} +1 -1
  269. package/dist/core/web/public/next/assets/{charts-DUD_jprE.js → charts-CzxWrZn7.js} +2 -2
  270. package/dist/core/web/public/next/assets/{charts-DUD_jprE.js.map → charts-CzxWrZn7.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/cloud-model-CfRydq8N.js +2 -0
  272. package/dist/core/web/public/next/assets/{cloud-model-DoxBMDvx.js.map → cloud-model-CfRydq8N.js.map} +1 -1
  273. package/dist/core/web/public/next/assets/{cloud-queries-CTGvO-k-.js → cloud-queries-DmptbjS8.js} +2 -2
  274. package/dist/core/web/public/next/assets/{cloud-queries-CTGvO-k-.js.map → cloud-queries-DmptbjS8.js.map} +1 -1
  275. package/dist/core/web/public/next/assets/{command-catalog-CmrHNFzh.js → command-catalog-ffCAijVY.js} +2 -2
  276. package/dist/core/web/public/next/assets/{command-catalog-CmrHNFzh.js.map → command-catalog-ffCAijVY.js.map} +1 -1
  277. package/dist/core/web/public/next/assets/{context-model-2Owp2jYF.js → context-model-Bb15chFt.js} +2 -2
  278. package/dist/core/web/public/next/assets/{context-model-2Owp2jYF.js.map → context-model-Bb15chFt.js.map} +1 -1
  279. package/dist/core/web/public/next/assets/{context-model-9xywbXxX.js → context-model-CDeyP0cA.js} +2 -2
  280. package/dist/core/web/public/next/assets/{context-model-9xywbXxX.js.map → context-model-CDeyP0cA.js.map} +1 -1
  281. package/dist/core/web/public/next/assets/{context-queries-wvcRnV-I.js → context-queries-_9bFWb9v.js} +2 -2
  282. package/dist/core/web/public/next/assets/{context-queries-wvcRnV-I.js.map → context-queries-_9bFWb9v.js.map} +1 -1
  283. package/dist/core/web/public/next/assets/{control-queries-DB6Kh7UN.js → control-queries-CXtmZZH6.js} +2 -2
  284. package/dist/core/web/public/next/assets/{control-queries-DB6Kh7UN.js.map → control-queries-CXtmZZH6.js.map} +1 -1
  285. package/dist/core/web/public/next/assets/copy-setup-BIp0iaiZ.js +2 -0
  286. package/dist/core/web/public/next/assets/copy-setup-BIp0iaiZ.js.map +1 -0
  287. package/dist/core/web/public/next/assets/{dock-icons-BBUGl4tE.js → dock-icons-Cc43W7r4.js} +2 -2
  288. package/dist/core/web/public/next/assets/{dock-icons-BBUGl4tE.js.map → dock-icons-Cc43W7r4.js.map} +1 -1
  289. package/dist/core/web/public/next/assets/{fleet-model-BRfRWkZl.js → fleet-model-DOK8ZtEt.js} +2 -2
  290. package/dist/core/web/public/next/assets/{fleet-model-BRfRWkZl.js.map → fleet-model-DOK8ZtEt.js.map} +1 -1
  291. package/dist/core/web/public/next/assets/{fleet-queries-tU6UEXN2.js → fleet-queries-BeEAqD6y.js} +2 -2
  292. package/dist/core/web/public/next/assets/{fleet-queries-tU6UEXN2.js.map → fleet-queries-BeEAqD6y.js.map} +1 -1
  293. package/dist/core/web/public/next/assets/{focus-trap-BGOceFvj.js → focus-trap-ChZ5EFfM.js} +2 -2
  294. package/dist/core/web/public/next/assets/{focus-trap-BGOceFvj.js.map → focus-trap-ChZ5EFfM.js.map} +1 -1
  295. package/dist/core/web/public/next/assets/format-BmH2yWL6.js +2 -0
  296. package/dist/core/web/public/next/assets/format-BmH2yWL6.js.map +1 -0
  297. package/dist/core/web/public/next/assets/{git-model-53iRLInY.js → git-model-BFwAVbxF.js} +2 -2
  298. package/dist/core/web/public/next/assets/{git-model-53iRLInY.js.map → git-model-BFwAVbxF.js.map} +1 -1
  299. package/dist/core/web/public/next/assets/global-y_exIyAP.js +2 -0
  300. package/dist/core/web/public/next/assets/{global-CXHHMz9o.js.map → global-y_exIyAP.js.map} +1 -1
  301. package/dist/core/web/public/next/assets/{guarded-runners-B8zFVBVZ.js → guarded-runners-Cd4POBtI.js} +2 -2
  302. package/dist/core/web/public/next/assets/{guarded-runners-B8zFVBVZ.js.map → guarded-runners-Cd4POBtI.js.map} +1 -1
  303. package/dist/core/web/public/next/assets/{icons-D4s-jlxX.js → icons-CygCEFWs.js} +2 -2
  304. package/dist/core/web/public/next/assets/{icons-D4s-jlxX.js.map → icons-CygCEFWs.js.map} +1 -1
  305. package/dist/core/web/public/next/assets/{index-BG177cPN.js → index-CyK31YRm.js} +3 -3
  306. package/dist/core/web/public/next/assets/{index-BG177cPN.js.map → index-CyK31YRm.js.map} +1 -1
  307. package/dist/core/web/public/next/assets/{live-model-CEf01wrW.js → live-model-D7hilYFk.js} +2 -2
  308. package/dist/core/web/public/next/assets/live-model-D7hilYFk.js.map +1 -0
  309. package/dist/core/web/public/next/assets/{mind.module-D_xk6HIQ.js → mind.module-B15k0Y9q.js} +2 -2
  310. package/dist/core/web/public/next/assets/{mind.module-D_xk6HIQ.js.map → mind.module-B15k0Y9q.js.map} +1 -1
  311. package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +2 -0
  312. package/dist/core/web/public/next/assets/{mutations-CbTSofVH.js.map → mutations-CWlxEMEm.js.map} +1 -1
  313. package/dist/core/web/public/next/assets/{nav-CmZcbPFJ.js → nav-mimleI0R.js} +2 -2
  314. package/dist/core/web/public/next/assets/{nav-CmZcbPFJ.js.map → nav-mimleI0R.js.map} +1 -1
  315. package/dist/core/web/public/next/assets/{overnight-queries-CR0b_j-V.js → overnight-queries-DJ4mZKSj.js} +2 -2
  316. package/dist/core/web/public/next/assets/{overnight-queries-CR0b_j-V.js.map → overnight-queries-DJ4mZKSj.js.map} +1 -1
  317. package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +1 -0
  318. package/dist/core/web/public/next/assets/{queries-rvRsAGW2.js → queries-Bw1McHTj.js} +2 -2
  319. package/dist/core/web/public/next/assets/{queries-rvRsAGW2.js.map → queries-Bw1McHTj.js.map} +1 -1
  320. package/dist/core/web/public/next/assets/{reasoning-pref-DMPQkujg.js → reasoning-pref-KkhI_5-j.js} +2 -2
  321. package/dist/core/web/public/next/assets/{reasoning-pref-DMPQkujg.js.map → reasoning-pref-KkhI_5-j.js.map} +1 -1
  322. package/dist/core/web/public/next/assets/{reveal-anchor-BKk2wZZZ.js → reveal-anchor-CCCx_kfT.js} +2 -2
  323. package/dist/core/web/public/next/assets/{reveal-anchor-BKk2wZZZ.js.map → reveal-anchor-CCCx_kfT.js.map} +1 -1
  324. package/dist/core/web/public/next/assets/{seat-subscription-CLn2ReSZ.js → seat-subscription-BhUUz7VL.js} +2 -2
  325. package/dist/core/web/public/next/assets/{seat-subscription-CLn2ReSZ.js.map → seat-subscription-BhUUz7VL.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/{sidebar-model-CjQLvdag.js → sidebar-model-Dcd437cf.js} +2 -2
  327. package/dist/core/web/public/next/assets/{sidebar-model-CjQLvdag.js.map → sidebar-model-Dcd437cf.js.map} +1 -1
  328. package/dist/core/web/public/next/assets/{slots-DRxNosZg.js → slots-BL_J5mmV.js} +3 -3
  329. package/dist/core/web/public/next/assets/{slots-DRxNosZg.js.map → slots-BL_J5mmV.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/{surface-data-DshUC_TU.js → surface-data-C3UAQ4QX.js} +2 -2
  331. package/dist/core/web/public/next/assets/{surface-data-DshUC_TU.js.map → surface-data-C3UAQ4QX.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +2 -0
  333. package/dist/core/web/public/next/assets/{surface-prefetch-DO8r4ttQ.js.map → surface-prefetch-BXKjPsV5.js.map} +1 -1
  334. package/dist/core/web/public/next/assets/{tasks-model-BKPFZAmZ.js → tasks-model-CzHvclVm.js} +2 -2
  335. package/dist/core/web/public/next/assets/{tasks-model-BKPFZAmZ.js.map → tasks-model-CzHvclVm.js.map} +1 -1
  336. package/dist/core/web/public/next/assets/{terminal-icons-DoeQkP3y.js → terminal-icons-BwgQTQP0.js} +2 -2
  337. package/dist/core/web/public/next/assets/{terminal-icons-DoeQkP3y.js.map → terminal-icons-BwgQTQP0.js.map} +1 -1
  338. package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
  339. package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
  340. package/dist/core/web/public/next/assets/{usage-queries-MnUeYzwp.js → usage-queries-pXxvy54x.js} +2 -2
  341. package/dist/core/web/public/next/assets/{usage-queries-MnUeYzwp.js.map → usage-queries-pXxvy54x.js.map} +1 -1
  342. package/dist/core/web/public/next/assets/{use-guarded-action-P12MfNwU.js → use-guarded-action-EgVWjM5c.js} +2 -2
  343. package/dist/core/web/public/next/assets/{use-guarded-action-P12MfNwU.js.map → use-guarded-action-EgVWjM5c.js.map} +1 -1
  344. package/dist/core/web/public/next/assets/{use-ticker-DIvAZ4Ey.js → use-ticker-BoqFxRFG.js} +2 -2
  345. package/dist/core/web/public/next/assets/{use-ticker-DIvAZ4Ey.js.map → use-ticker-BoqFxRFG.js.map} +1 -1
  346. package/dist/core/web/public/next/assets/{use-token-gate-DfEja7Wr.js → use-token-gate-DSNIIpI6.js} +2 -2
  347. package/dist/core/web/public/next/assets/{use-token-gate-DfEja7Wr.js.map → use-token-gate-DSNIIpI6.js.map} +1 -1
  348. package/dist/core/web/public/next/assets/{useOnboarding-CkOHadqC.js → useOnboarding-Bk0VnkxQ.js} +2 -2
  349. package/dist/core/web/public/next/assets/{useOnboarding-CkOHadqC.js.map → useOnboarding-Bk0VnkxQ.js.map} +1 -1
  350. package/dist/core/web/public/next/assets/{useSeatsRefresh-BDlbDlIU.js → useSeatsRefresh-q7Id9RcW.js} +2 -2
  351. package/dist/core/web/public/next/assets/{useSeatsRefresh-BDlbDlIU.js.map → useSeatsRefresh-q7Id9RcW.js.map} +1 -1
  352. package/dist/core/web/public/next/assets/{useVerseTranscript-BGtA55k2.js → useVerseTranscript-CqH51rt9.js} +2 -2
  353. package/dist/core/web/public/next/assets/{useVerseTranscript-BGtA55k2.js.map → useVerseTranscript-CqH51rt9.js.map} +1 -1
  354. package/dist/core/web/public/next/assets/{verse-icons-wOet9JZy.js → verse-icons-DsG1dOQx.js} +2 -2
  355. package/dist/core/web/public/next/assets/{verse-icons-wOet9JZy.js.map → verse-icons-DsG1dOQx.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/{verse-model-CSzzdyu2.js → verse-model-JTuvRBVK.js} +2 -2
  357. package/dist/core/web/public/next/assets/{verse-model-CSzzdyu2.js.map → verse-model-JTuvRBVK.js.map} +1 -1
  358. package/dist/core/web/public/next/assets/{warmup-CecO_Nk0.js → warmup-Bv1RumVq.js} +3 -3
  359. package/dist/core/web/public/next/assets/{warmup-CecO_Nk0.js.map → warmup-Bv1RumVq.js.map} +1 -1
  360. package/dist/core/web/public/next/assets/why-seat-model-Cau8qG6O.js +2 -0
  361. package/dist/core/web/public/next/assets/why-seat-model-Cau8qG6O.js.map +1 -0
  362. package/dist/core/web/public/next/assets/{workspace-model-BdIVybKr.js → workspace-model-D-SLfads.js} +2 -2
  363. package/dist/core/web/public/next/assets/{workspace-model-BdIVybKr.js.map → workspace-model-D-SLfads.js.map} +1 -1
  364. package/dist/core/web/public/next/index.html +1 -1
  365. package/dist/release-dependency-inventory.json +1 -1
  366. package/docs/AUTONOMY-GAP.md +1 -1
  367. package/package.json +1 -1
  368. package/dist/core/web/public/next/assets/Advanced-CxzE6ekM.js +0 -2
  369. package/dist/core/web/public/next/assets/App-DFlp-vdv.js +0 -7
  370. package/dist/core/web/public/next/assets/AppsSection-Ct2O605-.js +0 -2
  371. package/dist/core/web/public/next/assets/AutonomyOffState-CXhXpsim.js +0 -2
  372. package/dist/core/web/public/next/assets/AutonomyOffState-CXhXpsim.js.map +0 -1
  373. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
  374. package/dist/core/web/public/next/assets/AutonomySection-BTg7yVa1.js +0 -2
  375. package/dist/core/web/public/next/assets/BudgetControl-ng6swoZp.js +0 -2
  376. package/dist/core/web/public/next/assets/BudgetControl-ng6swoZp.js.map +0 -1
  377. package/dist/core/web/public/next/assets/ChatSection-Bisj9R6E.js +0 -3
  378. package/dist/core/web/public/next/assets/ChatSection-Bisj9R6E.js.map +0 -1
  379. package/dist/core/web/public/next/assets/CommandSection-D8ZihzvE.js +0 -2
  380. package/dist/core/web/public/next/assets/CommandSection-D8ZihzvE.js.map +0 -1
  381. package/dist/core/web/public/next/assets/DockHost-BPqyhtCP.js +0 -2
  382. package/dist/core/web/public/next/assets/McpSection-D1tDvlRa.js +0 -2
  383. package/dist/core/web/public/next/assets/NeedsYouDrawer-D992XTOn.js +0 -2
  384. package/dist/core/web/public/next/assets/NeedsYouDrawer-D992XTOn.js.map +0 -1
  385. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
  386. package/dist/core/web/public/next/assets/NeedsYouList-eBOlJr0b.js +0 -2
  387. package/dist/core/web/public/next/assets/OnboardingFlow-D3yfITK1.js +0 -2
  388. package/dist/core/web/public/next/assets/OnboardingFlow-D3yfITK1.js.map +0 -1
  389. package/dist/core/web/public/next/assets/OnboardingGate-DrDEVBqw.js +0 -3
  390. package/dist/core/web/public/next/assets/ResourcesChrome-C2ZrA7la.js +0 -3
  391. package/dist/core/web/public/next/assets/Sidebar-BuO3sViG.js +0 -3
  392. package/dist/core/web/public/next/assets/Sidebar-BuO3sViG.js.map +0 -1
  393. package/dist/core/web/public/next/assets/VerseConsoleApp-DeuBEvAO.js +0 -3
  394. package/dist/core/web/public/next/assets/VerseConsoleApp-DeuBEvAO.js.map +0 -1
  395. package/dist/core/web/public/next/assets/cloud-model-DoxBMDvx.js +0 -2
  396. package/dist/core/web/public/next/assets/copy-setup-CJQhFl-4.js +0 -2
  397. package/dist/core/web/public/next/assets/copy-setup-CJQhFl-4.js.map +0 -1
  398. package/dist/core/web/public/next/assets/format-DEAaVF6X.js +0 -2
  399. package/dist/core/web/public/next/assets/format-DEAaVF6X.js.map +0 -1
  400. package/dist/core/web/public/next/assets/global-CXHHMz9o.js +0 -2
  401. package/dist/core/web/public/next/assets/live-model-CEf01wrW.js.map +0 -1
  402. package/dist/core/web/public/next/assets/mutations-CbTSofVH.js +0 -2
  403. package/dist/core/web/public/next/assets/primitives-DNI-uJBd.js +0 -1
  404. package/dist/core/web/public/next/assets/surface-prefetch-DO8r4ttQ.js +0 -2
  405. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
  406. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
  407. package/dist/core/web/public/next/assets/why-seat-model-D68ZA7G8.js +0 -2
  408. package/dist/core/web/public/next/assets/why-seat-model-D68ZA7G8.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ResourcesDrawer-BAFGodny.js","assets/focus-trap-ChZ5EFfM.js","assets/Button-DtE0rlWD.js","assets/icons-CygCEFWs.js","assets/cloud-model-CfRydq8N.js","assets/fleet-queries-BeEAqD6y.js","assets/control-queries-CXtmZZH6.js","assets/mutations-CWlxEMEm.js","assets/fleet-model-DOK8ZtEt.js","assets/usage-queries-pXxvy54x.js","assets/apps-model-CHO133qt.js","assets/global-BlI2BYa1.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/Tag-D0rAEciH.css","assets/CapacityStrip-Cc28CyWk.css","assets/Button-DrnKsvnQ.css","assets/ResourcesDrawer-BCFJ2Uq8.css"])))=>i.map(i=>d[i]);
2
+ import{a as e,c as t,n,s as r,t as i}from"./index-CyK31YRm.js";import{c as a,m as o,o as s}from"./global-y_exIyAP.js";import{t as c}from"./ProviderLogo-AwHn2sKm.js";import{Bt as l,D as u,Ft as d,It as f,Lt as p,N as ee,Rt as te,V as m,Vt as h,X as ne,_n as re,in as g,z as _}from"./VerseConsoleApp-DXDv1aOi.js";import{o as v}from"./verse-model-JTuvRBVK.js";import{i as y}from"./CapacityStrip-DKbKA_Aa.js";import{n as b,t as x}from"./capacity-strip-model-5ViUgUlP.js";import{a as ie}from"./command-catalog-ffCAijVY.js";import{l as S,t as ae}from"./types-IYKrYLku.js";import{t as oe}from"./binding-left-DZpq5sLf.js";import{o as C}from"./local-model-C9xNi9fN.js";var w=t(e(),1),T={handle:`_handle_1pzoz_6`,dot:`_dot_1pzoz_47`,railDot:`_railDot_1pzoz_67`,dock:`_dock_1pzoz_84`},E=n();function D(){return(0,E.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,"aria-hidden":`true`,focusable:`false`,children:[(0,E.jsx)(`path`,{d:`M2.75 4h10.5M2.75 8h10.5M2.75 12h10.5`,opacity:`.35`}),(0,E.jsx)(`path`,{d:`M2.75 4h7M2.75 8h4M2.75 12h8.5`})]})}function O({summary:e,rail:t=!1}){if(!e||e.tone===`unknown`)return null;let n=(0,E.jsx)(`span`,{className:T.dot,"data-tone":e.tone,"data-resources-dot":e.tone,"aria-hidden":`true`});return t?(0,E.jsx)(`span`,{className:T.railDot,children:n}):n}function k(e){return e?`Resources — ${e.spoken}`:`Resources`}function A({summary:e,shortcut:t,onOpen:n,onWarm:r}){return(0,E.jsx)(g,{label:k(e),shortcut:t,placement:`left`,children:(0,E.jsxs)(`button`,{type:`button`,className:T.handle,"data-resources-handle":!0,"aria-label":k(e),"aria-haspopup":`dialog`,onClick:n,onPointerEnter:r,onFocus:r,children:[(0,E.jsx)(D,{}),(0,E.jsx)(O,{summary:e})]})})}var j=new Set([`spent`,`signed-out`,`unavailable`]),se=[[`usable`,`usable`],[`low`,`running low`],[`spent`,`spent`],[`signed-out`,`signed out`],[`unavailable`,`unavailable`]];function ce(e,t){let n=e.filter(e=>e.kind===`subscription`).map(e=>x(e,{healthRead:t.healthRead,...t.now===void 0?{}:{now:t.now}}).kind),r=new Map;for(let e of n)r.set(e,(r.get(e)??0)+1);let i=se.filter(([e])=>r.has(e)).map(([e,t])=>`${r.get(e)} ${t}`).join(` · `),a=`unknown`;return n.some(e=>j.has(e))?a=`alert`:n.includes(`low`)?a=`tight`:n.includes(`usable`)&&(a=`ok`),{tone:a,spoken:i||(n.length===0?`no accounts connected`:`not read yet`)}}function M(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function N(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function P(e){return typeof e==`string`&&e.trim().length>0?e.trim():null}var le=`An estimate from the sessions Verse launched — the real balance is on claude.ai.`;function ue(e){let t=M(e),n=M(t?.budget);if(!t||!n)return null;let r=N(n.creditsTotalUsd),i=N(n.estimatedSpentUsd),a=N(n.estimatedRemainingUsd);if(r===null||i===null&&a===null)return null;let o=Math.max(0,a??r-(i??0)),s=M(t.seat),c=M(n.canLaunch),l=P(n.balanceUrl),u=M(n.budget);return{totalUsd:r,spentUsd:i??Math.max(0,r-o),remainingUsd:o,remainingPercent:r>0?Math.max(0,Math.min(100,o/r*100)):0,running:Math.max(0,N(n.running)??0),sessionsToday:Math.max(0,N(n.sessionsToday)??0),maxSessionsPerDay:N(u?.maxSessionsPerDay),seatReady:s?.ready!==!1,seatReason:P(s?.reason),canLaunch:c?.ok!==!1,canLaunchReason:P(c?.reason),estimateNote:P(n.estimateNote)??le,balanceUrl:l!==null&&l.startsWith(`https://claude.ai/`)?l:ae}}function F(e){let t=Math.max(0,e);return t>=100||Number.isInteger(t)?`$${Math.round(t)}`:`$${t.toFixed(2)}`}var I={"llama-server":`llama-server`,ollama:`Ollama`,vllm:`vLLM`,unknown:`Serving runtime`},L={running:`Running`,starting:`Starting…`,stopping:`Stopping…`,stopped:`Stopped`,unknown:`State not reported`};function R(e){if(!e)return null;let t=[];e.model&&t.push(C(e.model)),e.contextTokens!==null&&t.push(`${v(e.contextTokens)} context per agent`),e.slotsTotal!==null&&e.slotsTotal>0&&t.push(e.slotsBusy===null?`${e.slotsTotal} slots`:`${e.slotsBusy} of ${e.slotsTotal} slots busy`);let n=e.state;return{name:I[e.kind]??I.unknown,state:n,word:L[n]??L.unknown,tone:n===`running`?`success`:n===`starting`||n===`stopping`?`warning`:`neutral`,detail:t.length>0?t.join(` · `):null,canStart:e.supervised&&n===`stopped`,canStop:e.supervised&&n===`running`,managedElsewhere:!e.supervised}}function z(e){let t=e.configuredContext,n=e.nativeContext;return t!==null&&e.contextTruncated&&n!==null?`${v(t)} of ${v(n)} context`:t===null?n===null?null:`${v(n)} context`:`${v(t)} context`}var B={key:`verse-resources-cloud`,fetch:async e=>{try{return{available:!0,credits:ue(await a(S,e))}}catch(e){if(e instanceof s&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{available:!1,credits:null}}}},V={cloud:6e4,local:3e4,runtime:15e3},H={bar:`_bar_uylkk_5`,row:`_row_uylkk_15`,line:`_line_uylkk_40`,battery:`_battery_uylkk_41`,cell:`_cell_uylkk_42`,logo:`_logo_uylkk_44`,cloudLogo:`_cloudLogo_uylkk_45`,name:`_name_uylkk_58`,value:`_value_uylkk_67`,nub:`_nub_uylkk_109`,tip:`_tip_uylkk_133`,tipHead:`_tipHead_uylkk_134`,tipSummary:`_tipSummary_uylkk_135`,tipLine:`_tipLine_uylkk_136`,tipHint:`_tipHint_uylkk_137`},de={usable:`ok`,low:`low`,spent:`out`,"signed-out":`out`,unavailable:`out`,checking:`unknown`,"not-checked":`unknown`};function fe(e,t){let n=[];for(let r of e){if(r.kind===`local`){n.push({key:`local`,engine:`local`,name:r.localCount>1?`Local models (${r.localCount})`:`Local model`,leftPercent:null,level:r.cls===`blocked`?`out`:r.cls===`unread`?`unknown`:`idle`,value:r.cls===`blocked`?`offline`:r.cls===`unread`?`not reported`:`ready`,summary:`${r.label}: ${r.summary}`,detail:[`No usage limits — runs on this Mac.`,...r.notes]});continue}let e=x(r,{healthRead:t.healthRead,now:t.now}),i=de[e.kind]??`unknown`,a=oe(r),o=i===`out`?e.kind===`spent`?`spent`:e.label.toLowerCase():a===null?`—`:`${u(a)} left`,s=r.windows.map(e=>{let t=e.limitReached?`limit reached`:e.usedPercent===null?`no reading`:`${u(e.usedPercent)} used`,n=e.resetText?e.resetText.replace(/^resets\s+/i,``):``;return`${e.label.charAt(0).toUpperCase()}${e.label.slice(1)}: ${t}${n?` · resets ${n}`:``}`});r.reserve&&s.push(r.reserve.label),e.usableAgain&&s.push(`Usable again ${e.usableAgain}`),e.checked&&s.push(`Checked ${e.checked}`),n.push({key:r.seatId,engine:r.engine,name:r.label,leftPercent:i===`out`?0:a,level:i,value:o,summary:`${r.label}: ${e.label}${e.detail?` · ${e.detail}`:``}`,detail:s})}let r={ok:0,low:1,idle:2,unknown:3,out:4};return n.sort((e,t)=>r[e.level]-r[t.level])}function U({left:e,level:t,vertical:n}){let r=e===null?t===`idle`?100:0:Math.max(e>0?6:0,e);return(0,E.jsxs)(`span`,{className:H.battery,"data-level":t,"data-vertical":n||void 0,"aria-hidden":`true`,children:[(0,E.jsx)(`span`,{className:H.cell,style:{"--fill":`${r}%`}}),(0,E.jsx)(`span`,{className:H.nub})]})}function pe({row:e}){return(0,E.jsxs)(`div`,{className:H.tip,children:[(0,E.jsxs)(`div`,{className:H.tipHead,children:[(0,E.jsx)(c,{engine:e.engine,size:14}),(0,E.jsx)(`strong`,{children:e.name})]}),(0,E.jsx)(`div`,{className:H.tipSummary,children:e.summary.slice(e.name.length+2)}),e.detail.map(e=>(0,E.jsx)(`div`,{className:H.tipLine,children:e},e)),(0,E.jsx)(`div`,{className:H.tipHint,children:`Click for Resources · ⌘.`})]})}function W({expanded:e}){let t=y(),n=o(B),r=Date.now(),i=(0,w.useMemo)(()=>t.loading?[]:fe(b(t.seats,{health:t.health,budget:t.budget,local:`collapse`,now:r}),{healthRead:t.health!==null,now:r}),[t.loading,t.seats,t.health,t.budget]),a=n.data?.credits??null,s=a&&a.totalUsd>0?a.remainingUsd/a.totalUsd*100:null,l=a?a.remainingUsd<=0?`out`:(s??0)<20?`low`:`ok`:`unknown`;return i.length===0&&!a?null:(0,E.jsxs)(`div`,{className:H.bar,"data-expanded":e||void 0,role:`group`,"aria-label":`Resources at a glance`,children:[i.map(t=>(0,E.jsx)(g,{content:(0,E.jsx)(pe,{row:t}),placement:`right`,children:(0,E.jsx)(`button`,{type:`button`,className:H.row,"data-level":t.level,"aria-label":`${t.summary}. Open Resources`,onClick:()=>p(),children:e?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsxs)(`span`,{className:H.line,children:[(0,E.jsx)(c,{engine:t.engine,size:14,className:H.logo}),(0,E.jsx)(`span`,{className:H.name,children:t.name})]}),(0,E.jsxs)(`span`,{className:H.line,children:[(0,E.jsx)(U,{left:t.leftPercent,level:t.level,vertical:!1}),(0,E.jsx)(`span`,{className:H.value,children:t.value})]})]}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(c,{engine:t.engine,size:14,className:H.logo}),(0,E.jsx)(U,{left:t.leftPercent,level:t.level,vertical:!0})]})})},t.key)),a?(0,E.jsx)(g,{content:(0,E.jsxs)(`div`,{className:H.tip,children:[(0,E.jsxs)(`div`,{className:H.tipHead,children:[(0,E.jsx)(c,{engine:`claude`,size:14}),(0,E.jsx)(`strong`,{children:`Cloud credits`})]}),(0,E.jsxs)(`div`,{className:H.tipSummary,children:[F(a.remainingUsd),` of `,F(a.totalUsd),` left · estimate`]}),(0,E.jsxs)(`div`,{className:H.tipLine,children:[a.running,` running · `,a.sessionsToday,` today`]}),(0,E.jsx)(`div`,{className:H.tipHint,children:`Click for Resources · ⌘.`})]}),placement:`right`,children:(0,E.jsx)(`button`,{type:`button`,className:H.row,"data-level":l,"aria-label":`Cloud credits: about ${F(a.remainingUsd)} of ${F(a.totalUsd)} left. Open Resources`,onClick:()=>p(),children:e?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsxs)(`span`,{className:H.line,children:[(0,E.jsx)(`span`,{className:H.cloudLogo,children:(0,E.jsx)(c,{engine:`claude`,size:14,className:H.logo})}),(0,E.jsx)(`span`,{className:H.name,children:`Cloud credits`})]}),(0,E.jsxs)(`span`,{className:H.line,children:[(0,E.jsx)(U,{left:s,level:l,vertical:!1}),(0,E.jsxs)(`span`,{className:H.value,children:[F(a.remainingUsd),` left`]})]})]}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`span`,{className:H.cloudLogo,children:(0,E.jsx)(c,{engine:`claude`,size:14,className:H.logo})}),(0,E.jsx)(U,{left:s,level:l,vertical:!0})]})})}):null]})}function me(){let e=y({withBudget:!1}),t=e.health!==null,n=(0,w.useMemo)(()=>e.loading?null:ce(b(e.seats,{health:e.health,local:`hide`}),{healthRead:t}),[e.loading,e.seats,e.health,t]);return(0,w.useEffect)(()=>{l(n)},[n]),null}var he=r({ResourcesBar:()=>W,ResourcesChrome:()=>Q,ResourcesRailButton:()=>$,preloadResourcesDrawer:()=>q,resourcesDocked:()=>Z,runResourcesCommand:()=>Y}),G=()=>i(()=>import(`./ResourcesDrawer-BAFGodny.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17])),K=(0,w.lazy)(()=>G().then(e=>({default:e.ResourcesDrawer})));function q(){return G()}var J=()=>{G().catch(()=>void 0)};function Y(e){if(f().open&&(e===`key`||e===`button`)){d();return}ne(),p()}function X(){let e=ie(`resources.toggle`)?.keys[0];return e?re(e):void 0}function Z(e,t){return e.open&&e.pinned&&!t}function Q({compact:e}){let t=h(),{overlay:n}=ee(),r=Z(t,e);return(0,w.useEffect)(()=>m(`resources.toggle`,e=>Y(e.via)),[]),(0,w.useEffect)(()=>m(`resources.bar.toggle`,()=>te(!f().bar)),[]),(0,w.useEffect)(()=>{n!==null&&!Z(f(),e)&&d()},[n,e]),(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(me,{}),r?(0,E.jsx)(`div`,{className:T.dock,"data-resources-dock":!0,children:(0,E.jsx)(w.Suspense,{fallback:null,children:(0,E.jsx)(K,{mode:`docked`})})}):null,t.open&&!r?(0,E.jsx)(w.Suspense,{fallback:null,children:(0,E.jsx)(K,{mode:`overlay`,compact:e})}):null,t.open?null:(0,E.jsx)(A,{summary:t.summary,shortcut:X(),onWarm:J,onOpen:()=>_(`resources.toggle`,{via:`button`})})]})}function $({expanded:e,buttonClass:t,iconClass:n,labelClass:r}){let i=h(),a=k(i.summary);return(0,E.jsx)(g,{label:a,shortcut:X(),placement:`right`,disabled:e,children:(0,E.jsxs)(`button`,{type:`button`,className:t,"aria-label":a,"aria-expanded":i.open,"data-resources-rail":!0,onPointerEnter:J,onClick:()=>_(`resources.toggle`,{via:`button`}),children:[(0,E.jsxs)(`span`,{className:n,children:[(0,E.jsx)(D,{}),(0,E.jsx)(O,{summary:i.summary,rail:!0})]}),e?(0,E.jsx)(`span`,{className:r,children:`Resources`}):null]})})}export{W as ResourcesBar,Q as ResourcesChrome,$ as ResourcesRailButton,z as a,F as i,V as n,R as o,q as preloadResourcesDrawer,B as r,Z as resourcesDocked,Y as runResourcesCommand,he as t};
3
+ //# sourceMappingURL=ResourcesChrome-BnhnEdJe.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":";uwBAeA,SAAgB,GAAgB,CAC9B,OACE,UAAC,MAAD,CAAK,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OAAO,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,cAAY,OAAO,UAAU,QAAvJ,WACE,SAAC,OAAD,CAAM,EAAE,wCAAwC,QAAQ,KAAO,IAC/D,SAAC,OAAD,CAAM,EAAE,gCAAkC,EACvC,GAET,CAGA,SAAgB,EAAa,CAAE,UAAS,OAAO,IAA+D,CAC5G,GAAI,CAAC,GAAW,EAAQ,OAAS,UAAW,OAAO,KACnD,IAAM,GAAM,SAAC,OAAD,CAAM,UAAW,EAAO,IAAK,YAAW,EAAQ,KAAM,qBAAoB,EAAQ,KAAM,cAAY,MAAQ,GACxH,OAAO,GAAO,SAAC,OAAD,CAAM,UAAW,EAAO,QAAU,UAAU,GAAI,CAChE,CAGA,SAAgB,EAAe,EAA0C,CACvE,OAAO,EAAU,eAAe,EAAQ,SAAW,WACrD,CAEA,SAAgB,EAAgB,CAAE,UAAS,WAAU,SAAQ,UAAuH,CAClL,OACE,SAAC,EAAD,CAAS,MAAO,EAAe,CAAO,EAAa,WAAU,UAAU,OACrE,oBAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,OAAQ,2BAAsB,aAAY,EAAe,CAAO,EAAG,gBAAc,SAAS,QAAS,EAAQ,eAAgB,EAAQ,QAAS,EAApL,WACE,SAAC,EAAD,CAAgB,IAChB,SAAC,EAAD,CAAuB,SAAU,EAC3B,GACD,EAEb,CCLA,IAAM,EAA8C,IAAI,IAAI,CAAC,QAAS,aAAc,aAAa,CAAC,EAE5F,GAA0D,CAC9D,CAAC,SAAU,QAAQ,EACnB,CAAC,MAAO,aAAa,EACrB,CAAC,QAAS,OAAO,EACjB,CAAC,aAAc,YAAY,EAC3B,CAAC,cAAe,aAAa,CAC/B,EAGA,SAAgB,GAAmB,EAA8B,EAA+D,CAC9H,IAAM,EAAQ,EACX,OAAQ,GAAM,EAAE,OAAS,cAAc,CAAC,CACxC,IAAK,GAAM,EAAc,EAAG,CAAE,WAAY,EAAK,WAAY,GAAI,EAAK,MAAQ,OAAgC,CAAC,EAArB,CAAE,IAAK,EAAK,GAAI,CAAQ,CAAC,CAAC,CAAC,IAAI,EACpH,EAAS,IAAI,IACnB,IAAK,IAAM,KAAK,EAAO,EAAO,IAAI,GAAI,EAAO,IAAI,CAAC,GAAK,GAAK,CAAC,EAC7D,IAAM,EAAS,GAAY,QAAQ,CAAC,KAAO,EAAO,IAAI,CAAC,CAAC,CAAC,CACtD,KAAK,CAAC,EAAG,KAAU,GAAG,EAAO,IAAI,CAAC,EAAE,GAAG,GAAM,CAAC,CAC9C,KAAK,KAAK,EACT,EAAsB,UAI1B,OAHI,EAAM,KAAM,GAAM,EAAY,IAAI,CAAC,CAAC,EAAG,EAAO,QACzC,EAAM,SAAS,KAAK,EAAG,EAAO,QAC9B,EAAM,SAAS,QAAQ,IAAG,EAAO,MACnC,CAAE,OAAM,OAAQ,IAAW,EAAM,SAAW,EAAI,wBAA0B,eAAgB,CACnG,CA+BA,SAAS,EAAI,EAAgD,CAC3D,OAAO,OAAO,GAAU,UAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,EAAK,EAAoC,IACrH,CAEA,SAAS,EAAI,EAA+B,CAC1C,OAAO,OAAO,GAAU,UAAY,OAAO,SAAS,CAAK,EAAI,EAAQ,IACvE,CAEA,SAAS,EAAK,EAA+B,CAC3C,OAAO,OAAO,GAAU,UAAY,EAAM,KAAK,CAAC,CAAC,OAAS,EAAI,EAAM,KAAK,EAAI,IAC/E,CAEA,IAAM,GAAwB,mFAG9B,SAAgB,GAAoB,EAAuC,CACzE,IAAM,EAAO,EAAI,CAAG,EACd,EAAS,EAAI,GAAM,MAAM,EAC/B,GAAI,CAAC,GAAQ,CAAC,EAAQ,OAAO,KAC7B,IAAM,EAAQ,EAAI,EAAO,eAAkB,EACrC,EAAQ,EAAI,EAAO,iBAAoB,EACvC,EAAe,EAAI,EAAO,qBAAwB,EACxD,GAAI,IAAU,MAAS,IAAU,MAAQ,IAAiB,KAAO,OAAO,KACxE,IAAM,EAAY,KAAK,IAAI,EAAG,GAAgB,GAAS,GAAS,EAAE,EAC5D,EAAO,EAAI,EAAK,IAAI,EACpB,EAAO,EAAI,EAAO,SAAY,EAC9B,EAAM,EAAK,EAAO,UAAa,EAC/B,EAAS,EAAI,EAAO,MAAS,EACnC,MAAO,CACL,SAAU,EACV,SAAU,GAAS,KAAK,IAAI,EAAG,EAAQ,CAAS,EAChD,aAAc,EACd,iBAAkB,EAAQ,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,IAAM,EAAY,EAAS,GAAG,CAAC,EAAI,EACtF,QAAS,KAAK,IAAI,EAAG,EAAI,EAAO,OAAU,GAAK,CAAC,EAChD,cAAe,KAAK,IAAI,EAAG,EAAI,EAAO,aAAgB,GAAK,CAAC,EAC5D,kBAAmB,EAAI,GAAS,iBAAoB,EACpD,UAAW,GAAO,QAAa,GAC/B,WAAY,EAAK,GAAO,MAAS,EACjC,UAAW,GAAO,KAAU,GAC5B,gBAAiB,EAAK,GAAO,MAAS,EACtC,aAAc,EAAK,EAAO,YAAe,GAAK,GAC9C,WAAY,IAAQ,MAAQ,EAAI,WAAW,oBAAoB,EAAI,EAAM,EAC3E,CACF,CAGA,SAAgB,EAAU,EAAuB,CAC/C,IAAM,EAAI,KAAK,IAAI,EAAG,CAAK,EAC3B,OAAO,GAAK,KAAO,OAAO,UAAU,CAAC,EAAI,IAAI,KAAK,MAAM,CAAC,IAAM,IAAI,EAAE,QAAQ,CAAC,GAChF,CAMA,IAAM,EAAyE,CAC7E,eAAgB,eAChB,OAAQ,SACR,KAAM,OACN,QAAS,iBACX,EAEM,EAAwE,CAC5E,QAAS,UACT,SAAU,YACV,SAAU,YACV,QAAS,UACT,QAAS,oBACX,EAeA,SAAgB,EAAY,EAA4D,CACtF,GAAI,CAAC,EAAS,OAAO,KACrB,IAAM,EAAkB,CAAC,EACrB,EAAQ,OAAO,EAAM,KAAK,EAAgB,EAAQ,KAAK,CAAC,EAExD,EAAQ,gBAAkB,MAAM,EAAM,KAAK,GAAG,EAAoB,EAAQ,aAAa,EAAE,mBAAmB,EAC5G,EAAQ,aAAe,MAAQ,EAAQ,WAAa,GACtD,EAAM,KAAK,EAAQ,YAAc,KAAoE,GAAG,EAAQ,WAAW,QAAnF,GAAG,EAAQ,UAAU,MAAM,EAAQ,WAAW,YAA4C,EAEpI,IAAM,EAAQ,EAAQ,MACtB,MAAO,CACL,KAAM,EAAa,EAAQ,OAAS,EAAa,QACjD,QACA,KAAM,EAAW,IAAU,EAAW,QACtC,KAAM,IAAU,UAAY,UAAY,IAAU,YAAc,IAAU,WAAa,UAAY,UACnG,OAAQ,EAAM,OAAS,EAAI,EAAM,KAAK,KAAK,EAAI,KAC/C,SAAU,EAAQ,YAAc,IAAU,UAC1C,QAAS,EAAQ,YAAc,IAAU,UACzC,iBAAkB,CAAC,EAAQ,UAC7B,CACF,CAOA,SAAgB,EAAiB,EAAqG,CACpI,IAAM,EAAa,EAAI,kBACjB,EAAS,EAAI,cAInB,OAHI,IAAe,MAAQ,EAAI,kBAAoB,IAAW,KAAa,GAAG,EAAoB,CAAU,EAAE,MAAM,EAAoB,CAAM,EAAE,UAC5I,IAAe,KACf,IAAW,KACR,KADqB,GAAG,EAAoB,CAAM,EAAE,UAD3B,GAAG,EAAoB,CAAU,EAAE,SAGrE,CC3LA,IAAa,EAAgD,CAC3D,IAAK,wBACL,MAAO,KAAO,IAAW,CACvB,GAAI,CAEF,MAAO,CAAE,UAAW,GAAM,QAAS,GAAoB,MADrC,EAAgB,EAAkB,CAAM,CACA,CAAE,CAC9D,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EACpE,MAAO,CAAE,UAAW,GAAO,QAAS,IAAK,CAC3C,CACF,CACF,EAGa,EAAoB,CAAE,MAAO,IAAQ,MAAO,IAAQ,QAAS,IAAO,6XCM3E,GAAkE,CACtE,OAAQ,KACR,IAAK,MACL,MAAO,MACP,aAAc,MACd,YAAa,MACb,SAAU,UACV,cAAe,SACjB,EAGA,SAAgB,GAAQ,EAA8B,EAAsD,CAC1G,IAAM,EAAgB,CAAC,EACvB,IAAK,IAAM,KAAO,EAAM,CACtB,GAAI,EAAI,OAAS,QAAS,CACxB,EAAI,KAAK,CACP,IAAK,QACL,OAAQ,QACR,KAAM,EAAI,WAAa,EAAI,iBAAiB,EAAI,WAAW,GAAK,cAChE,YAAa,KAGb,MAAO,EAAI,MAAQ,UAAY,MAAQ,EAAI,MAAQ,SAAW,UAAY,OAC1E,MAAO,EAAI,MAAQ,UAAY,UAAY,EAAI,MAAQ,SAAW,eAAiB,QACnF,QAAS,GAAG,EAAI,MAAM,IAAI,EAAI,UAC9B,OAAQ,CAAC,sCAAuC,GAAG,EAAI,KAAK,CAC9D,CAAC,EACD,QACF,CACA,IAAM,EAAS,EAAc,EAAK,CAAE,WAAY,EAAK,WAAY,IAAK,EAAK,GAAI,CAAC,EAC1E,EAAQ,GAAgB,EAAO,OAAS,UACxC,EAAO,GAAmB,CAAG,EAC7B,EAAQ,IAAU,MAAS,EAAO,OAAS,QAAU,QAAU,EAAO,MAAM,YAAY,EAC1F,IAAS,KAAO,IAAM,GAAG,EAAgB,CAAI,EAAE,OAC7C,EAAS,EAAI,QAAQ,IAAK,GAAM,CACpC,IAAM,EAAO,EAAE,aAAe,gBAAkB,EAAE,cAAgB,KAAO,aAAe,GAAG,EAAgB,EAAE,WAAW,EAAE,OAEpH,EAAQ,EAAE,UAAY,EAAE,UAAU,QAAQ,cAAe,EAAE,EAAI,GACrE,MAAO,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,MAAM,MAAM,CAAC,EAAE,IAAI,IAAO,EAAQ,aAAa,IAAU,IACzG,CAAC,EACG,EAAI,SAAS,EAAO,KAAK,EAAI,QAAQ,KAAK,EAC1C,EAAO,aAAa,EAAO,KAAK,gBAAgB,EAAO,aAAa,EACpE,EAAO,SAAS,EAAO,KAAK,WAAW,EAAO,SAAS,EAC3D,EAAI,KAAK,CACP,IAAK,EAAI,OACT,OAAQ,EAAI,OACZ,KAAM,EAAI,MACV,YAAa,IAAU,MAAQ,EAAI,EACnC,QACA,QACA,QAAS,GAAG,EAAI,MAAM,IAAI,EAAO,QAAQ,EAAO,OAAS,MAAM,EAAO,SAAW,KACjF,QACF,CAAC,CACH,CAEA,IAAM,EAA8B,CAAE,GAAI,EAAG,IAAK,EAAG,KAAM,EAAG,QAAS,EAAG,IAAK,CAAE,EACjF,OAAO,EAAI,MAAM,EAAG,IAAM,EAAK,EAAE,OAAS,EAAK,EAAE,MAAM,CACzD,CAEA,SAAS,EAAQ,CAAE,OAAM,QAAO,YAAsE,CACpG,IAAM,EAAO,IAAS,KAAQ,IAAU,OAAS,IAAM,EAAK,KAAK,IAAI,EAAO,EAAI,EAAI,EAAG,CAAI,EAC3F,OACE,UAAC,OAAD,CAAM,UAAW,EAAO,QAAS,aAAY,EAAO,gBAAe,GAAY,OAAW,cAAY,OAAtG,WACE,SAAC,OAAD,CAAM,UAAW,EAAO,KAAM,MAAO,CAAE,SAAU,GAAG,EAAK,EAAG,CAAqB,IACjF,SAAC,OAAD,CAAM,UAAW,EAAO,GAAM,EAC1B,GAEV,CAEA,SAAS,GAAO,CAAE,OAAwB,CACxC,OACE,UAAC,MAAD,CAAK,UAAW,EAAO,IAAvB,WACE,UAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,WACE,SAAC,EAAD,CAAc,OAAQ,EAAI,OAAQ,KAAM,EAAK,IAC7C,SAAC,SAAD,UAAS,EAAI,IAAa,EACvB,KACL,SAAC,MAAD,CAAK,UAAW,EAAO,WAAa,WAAI,QAAQ,MAAM,EAAI,KAAK,OAAS,CAAC,CAAO,GAC/E,EAAI,OAAO,IAAK,IACf,SAAC,MAAD,CAAgB,UAAW,EAAO,QAAU,UAAU,EAA5C,CAA4C,CACvD,GACD,SAAC,MAAD,CAAK,UAAW,EAAO,QAAS,mCAA6B,EAC1D,GAET,CAEA,SAAgB,EAAa,CAAE,YAAmC,CAGhE,IAAM,EAAO,EAAgB,EACvB,EAAY,EAAS,CAAiB,EACtC,EAAM,KAAK,IAAI,EACf,KAAO,eACJ,EAAK,QAAU,CAAC,EAAI,GAAQ,EAAkB,EAAK,MAAO,CAAE,OAAQ,EAAK,OAAQ,OAAQ,EAAK,OAAQ,MAAO,WAAY,KAAI,CAAC,EAAG,CAAE,WAAY,EAAK,SAAW,KAAM,KAAI,CAAC,EAGjL,CAAC,EAAK,QAAS,EAAK,MAAO,EAAK,OAAQ,EAAK,MAAM,CACrD,EACM,EAAQ,EAAU,MAAM,SAAW,KACnC,EAAY,GAAS,EAAM,SAAW,EAAK,EAAM,aAAe,EAAM,SAAY,IAAM,KACxF,EAAqB,EAAoB,EAAM,cAAgB,EAAI,OAAS,GAAa,GAAK,GAAK,MAAQ,KAA9E,UAGnC,OADI,EAAK,SAAW,GAAK,CAAC,EAAc,MAEtC,UAAC,MAAD,CAAK,UAAW,EAAO,IAAK,gBAAe,GAAY,OAAW,KAAK,QAAQ,aAAW,wBAA1F,UACG,EAAK,IAAK,IACT,SAAC,EAAD,CAAuB,SAAS,SAAC,GAAD,CAAa,KAAM,GAAG,UAAU,QAC9D,mBAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAO,IAClB,aAAY,EAAI,MAChB,aAAY,GAAG,EAAI,QAAQ,kBAC3B,YAAe,EAAc,EAE5B,YACC,iCACE,UAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,WACE,SAAC,EAAD,CAAc,OAAQ,EAAI,OAAQ,KAAM,GAAI,UAAW,EAAO,IAAO,IACrE,SAAC,OAAD,CAAM,UAAW,EAAO,KAAO,WAAI,IAAW,EAC1C,CACN,cAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,WACE,SAAC,EAAD,CAAS,KAAM,EAAI,YAAa,MAAO,EAAI,MAAO,SAAU,EAAQ,IACpE,SAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,WAAI,KAAY,EAC5C,CACN,OAEF,iCACE,SAAC,EAAD,CAAc,OAAQ,EAAI,OAAQ,KAAM,GAAI,UAAW,EAAO,IAAO,IACrE,SAAC,EAAD,CAAS,KAAM,EAAI,YAAa,MAAO,EAAI,MAAO,WAAU,EAC5D,GAEE,EACD,EA1BK,EAAI,GA0BT,CACV,EACA,GACC,SAAC,EAAD,CACE,SACE,UAAC,MAAD,CAAK,UAAW,EAAO,IAAvB,WACE,UAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,WAAgC,SAAC,EAAD,CAAc,OAAO,SAAS,KAAM,EAAK,IAAC,SAAC,SAAD,UAAQ,eAAqB,EAAM,KAC7G,UAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,UAAoC,EAAU,EAAM,YAAY,EAAE,OAAK,EAAU,EAAM,QAAQ,EAAE,kBAAqB,KACtH,UAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,UAAiC,EAAM,QAAQ,cAAY,EAAM,cAAc,QAAW,KAC1F,SAAC,MAAD,CAAK,UAAW,EAAO,QAAS,mCAA6B,EAC1D,IAEP,UAAU,QAEV,mBAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAO,IAClB,aAAY,EACZ,aAAY,wBAAwB,EAAU,EAAM,YAAY,EAAE,MAAM,EAAU,EAAM,QAAQ,EAAE,uBAClG,YAAe,EAAc,EAE5B,YACC,iCACE,UAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,WACE,SAAC,OAAD,CAAM,UAAW,EAAO,UAAW,mBAAC,EAAD,CAAc,OAAO,SAAS,KAAM,GAAI,UAAW,EAAO,IAAO,EAAO,IAC3G,SAAC,OAAD,CAAM,UAAW,EAAO,KAAM,wBAAmB,EAC7C,CACN,cAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,WACE,SAAC,EAAD,CAAS,KAAM,EAAW,MAAO,EAAY,SAAU,EAAQ,IAC/D,UAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,UAAgC,EAAU,EAAM,YAAY,EAAE,OAAW,CACrE,GACN,OAEF,iCACE,SAAC,OAAD,CAAM,UAAW,EAAO,UAAW,mBAAC,EAAD,CAAc,OAAO,SAAS,KAAM,GAAI,UAAW,EAAO,IAAO,EAAO,IAC3G,SAAC,EAAD,CAAS,KAAM,EAAW,MAAO,EAAY,WAAU,EACvD,GAEE,EACD,GACP,IACD,GAET,CC5MA,SAAgB,IAAwB,CACtC,IAAM,EAAO,EAAgB,CAAE,WAAY,EAAM,CAAC,EAC5C,EAAa,EAAK,SAAW,KAC7B,KAAU,eACP,EAAK,QAAU,KAAO,GAAmB,EAAkB,EAAK,MAAO,CAAE,OAAQ,EAAK,OAAQ,MAAO,MAAO,CAAC,EAAG,CAAE,YAAW,CAAC,EACrI,CAAC,EAAK,QAAS,EAAK,MAAO,EAAK,OAAQ,CAAU,CACpD,EAIA,OAHA,mBAAgB,CACd,EAAoB,CAAO,CAC7B,EAAG,CAAC,CAAO,CAAC,EACL,IACT,6JCIM,YAAqB,OAAO,iGAC5B,KAAkB,YAAW,EAAa,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,EAAE,eAAgB,EAAE,CAAC,EAG/F,SAAgB,GAA2C,CACzD,OAAO,EAAa,CACtB,CAEA,IAAM,MAAa,CACjB,EAAkB,CAAC,CAAC,UAAY,MAAS,CAC3C,EAGA,SAAgB,EAAoB,EAA+B,CACjE,GAAI,EAAe,CAAC,CAAC,OAAS,IAAQ,OAAS,IAAQ,UAAW,CAChE,EAAe,EACf,MACF,CAEA,GAAkB,EAClB,EAAc,CAChB,CAEA,SAAS,GAAmC,CAC1C,IAAM,EAAQ,GAAY,kBAAkB,CAAC,EAAE,KAAK,GACpD,OAAO,EAAQ,GAAY,CAAK,EAAI,MACtC,CAGA,SAAgB,EAAgB,EAA2C,EAA2B,CACpG,OAAO,EAAM,MAAQ,EAAM,QAAU,CAAC,CACxC,CAEA,SAAgB,EAAgB,CAAE,WAAiC,CACjE,IAAM,EAAY,EAAe,EAC3B,CAAE,WAAY,GAAW,EACzB,EAAS,EAAgB,EAAW,CAAO,EASjD,OAPA,mBAAgB,EAAuB,mBAAqB,GAAQ,EAAoB,EAAI,GAAG,CAAC,EAAG,CAAC,CAAC,GACrG,mBAAgB,EAAuB,2BAA8B,GAAgB,CAAC,EAAe,CAAC,CAAC,GAAG,CAAC,EAAG,CAAC,CAAC,GAEhH,mBAAgB,CACV,IAAY,MAAQ,CAAC,EAAgB,EAAe,EAAG,CAAO,GAAG,EAAe,CACtF,EAAG,CAAC,EAAS,CAAO,CAAC,GAGnB,iCACE,SAAC,GAAD,CAAwB,GACvB,GACC,SAAC,MAAD,CAAK,UAAW,EAAO,KAAM,yBAC3B,mBAAC,WAAD,CAAU,SAAU,KAClB,mBAAC,EAAD,CAAiB,KAAK,QAAU,EACxB,EACP,GACH,KACH,EAAU,MAAQ,CAAC,GAClB,SAAC,WAAD,CAAU,SAAU,KAClB,mBAAC,EAAD,CAAiB,KAAK,UAAmB,SAAU,EAC3C,GACR,KACH,EAAU,KAAO,MAChB,SAAC,EAAD,CAAiB,QAAS,EAAU,QAAS,SAAU,EAAa,EAAG,OAAQ,EAAM,WAAc,EAAsB,mBAAoB,CAAE,IAAK,QAAS,CAAC,CAAI,EAEpK,GAEN,CAOA,SAAgB,EAAoB,CAAE,WAAU,cAAa,YAAW,cAKrE,CACD,IAAM,EAAY,EAAe,EAC3B,EAAQ,EAAe,EAAU,OAAO,EAC9C,OACE,SAAC,EAAD,CAAgB,QAAO,SAAU,EAAa,EAAG,UAAU,QAAQ,SAAU,EAC3E,oBAAC,SAAD,CACE,KAAK,SACL,UAAW,EACX,aAAY,EACZ,gBAAe,EAAU,KACzB,yBACA,eAAgB,EAChB,YAAe,EAAsB,mBAAoB,CAAE,IAAK,QAAS,CAAC,EAP5E,WASE,UAAC,OAAD,CAAM,UAAW,EAAjB,WACE,SAAC,EAAD,CAAgB,IAChB,SAAC,EAAD,CAAc,QAAS,EAAU,QAAS,OAAM,EAC5C,CACL,MAAW,SAAC,OAAD,CAAM,UAAW,EAAY,oBAAe,GAAI,IACtD,GACD,EAEb","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/resources/ResourcesHandle.tsx","../../../../../../src/web-ui/routes/verse/resources/resources-model.ts","../../../../../../src/web-ui/routes/verse/resources/resources-queries.ts","../../../../../../src/web-ui/routes/verse/resources/ResourcesBar.tsx","../../../../../../src/web-ui/routes/verse/resources/resources-summary.tsx","../../../../../../src/web-ui/routes/verse/resources/ResourcesChrome.tsx"],"sourcesContent":["/**\n * routes/verse/resources/ResourcesHandle.tsx — the slim tab on the right edge\n * of every surface that opens the Resources drawer, its icon and its status\n * dot (unit 3.11 C6).\n *\n * Part of the ResourcesChrome chunk, fetched right after first paint (like the\n * rail's capacity ring). Until the summary has read there is no dot — \"not\n * known\" is never drawn as \"fine\". The dot is a shape plus words in the\n * accessible name, never colour alone.\n */\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport type { ResourcesSummary } from './resources-model.js';\nimport styles from './ResourcesChrome.module.css';\n\n/** Three stacked capacity bars: accounts, compute, credits. 16px, 1.5px stroke, like the shared set. */\nexport function ResourcesIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M2.75 4h10.5M2.75 8h10.5M2.75 12h10.5\" opacity=\".35\" />\n <path d=\"M2.75 4h7M2.75 8h4M2.75 12h8.5\" />\n </svg>\n );\n}\n\n/** `rail`: pinned to the corner of a rail icon, like the rail's own badges. */\nexport function ResourcesDot({ summary, rail = false }: { summary: ResourcesSummary | null; rail?: boolean }) {\n if (!summary || summary.tone === 'unknown') return null;\n const dot = <span className={styles.dot} data-tone={summary.tone} data-resources-dot={summary.tone} aria-hidden=\"true\" />;\n return rail ? <span className={styles.railDot}>{dot}</span> : dot;\n}\n\n/** \"Resources — 2 usable · 1 spent\": the tooltip and the accessible name. */\nexport function resourcesLabel(summary: ResourcesSummary | null): string {\n return summary ? `Resources — ${summary.spoken}` : 'Resources';\n}\n\nexport function ResourcesHandle({ summary, shortcut, onOpen, onWarm }: { summary: ResourcesSummary | null; shortcut: string | undefined; onOpen: () => void; onWarm?: () => void }) {\n return (\n <Tooltip label={resourcesLabel(summary)} shortcut={shortcut} placement=\"left\">\n <button type=\"button\" className={styles.handle} data-resources-handle aria-label={resourcesLabel(summary)} aria-haspopup=\"dialog\" onClick={onOpen} onPointerEnter={onWarm} onFocus={onWarm}>\n <ResourcesIcon />\n <ResourcesDot summary={summary} />\n </button>\n </Tooltip>\n );\n}\n","/**\n * routes/verse/resources/resources-model.ts — what the Resources drawer says,\n * projected from reads other units already own (unit 3.11 C6). Pure: no\n * React, no I/O.\n *\n * Nothing about a seat is worded here. Every account line comes from C6's\n * capacity projection (usage/capacity-strip-model.ts: `accountStatus`,\n * `orderAccountRows`), so the drawer, Apps & Accounts and the rail ring can\n * never describe one seat two ways. What IS new here:\n *\n * - the edge handle's one-dot summary across the paid accounts;\n * - the cloud lane's overview (GET /api/verse/cloud), narrowed field by\n * field — the route is landing in parallel, so a missing or drifted body\n * reads as \"not available yet\", never as a crash or a zero;\n * - short sentences for the serving runtime and each local model's context.\n */\nimport { CLOUD_BALANCE_URL, type CloudOverviewResponse } from '../../../../core/cloud/types.js';\nimport type { ServingRuntimeSnapshot } from '../../../data/api-types.js';\nimport { accountStatus, type AccountStatusKind, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { modelNameInText, type LocalModelRow } from '../usage/local-model.js';\nimport { formatContextWindow } from '../verse-model.js';\n\n// ---------------------------------------------------------------------------\n// The handle's dot\n// ---------------------------------------------------------------------------\n\n/**\n * ok every account read is usable, none tight\n * tight something is running low (or usable only on credits)\n * alert something is spent, signed out or unavailable\n * unknown nothing has been read yet — no dot at all (never \"all good\")\n */\nexport type ResourcesTone = 'ok' | 'tight' | 'alert' | 'unknown';\n\nexport interface ResourcesSummary {\n tone: ResourcesTone;\n /** Appended to the handle's accessible name and tooltip: \"2 usable · 1 spent\". */\n spoken: string;\n}\n\nconst ALERT_KINDS: ReadonlySet<AccountStatusKind> = new Set(['spent', 'signed-out', 'unavailable']);\n\nconst COUNT_WORDS: ReadonlyArray<[AccountStatusKind, string]> = [\n ['usable', 'usable'],\n ['low', 'running low'],\n ['spent', 'spent'],\n ['signed-out', 'signed out'],\n ['unavailable', 'unavailable'],\n];\n\n/** The paid accounts, reduced to one tone and one sentence. Local seats have no quota to run out of. */\nexport function summarizeResources(rows: readonly CapacityRow[], opts: { healthRead: boolean; now?: number }): ResourcesSummary {\n const kinds = rows\n .filter((r) => r.kind === 'subscription')\n .map((r) => accountStatus(r, { healthRead: opts.healthRead, ...(opts.now !== undefined ? { now: opts.now } : {}) }).kind);\n const counts = new Map<AccountStatusKind, number>();\n for (const k of kinds) counts.set(k, (counts.get(k) ?? 0) + 1);\n const spoken = COUNT_WORDS.filter(([k]) => counts.has(k))\n .map(([k, word]) => `${counts.get(k)} ${word}`)\n .join(' · ');\n let tone: ResourcesTone = 'unknown';\n if (kinds.some((k) => ALERT_KINDS.has(k))) tone = 'alert';\n else if (kinds.includes('low')) tone = 'tight';\n else if (kinds.includes('usable')) tone = 'ok';\n return { tone, spoken: spoken || (kinds.length === 0 ? 'no accounts connected' : 'not read yet') };\n}\n\nexport const TONE_WORD: Readonly<Record<ResourcesTone, string>> = {\n ok: 'all usable',\n tight: 'running low',\n alert: 'needs attention',\n unknown: 'not read yet',\n};\n\n// ---------------------------------------------------------------------------\n// Cloud credits\n// ---------------------------------------------------------------------------\n\nexport interface CloudCreditsView {\n totalUsd: number;\n spentUsd: number;\n remainingUsd: number;\n /** 0–100, remaining of total. */\n remainingPercent: number;\n running: number;\n sessionsToday: number;\n maxSessionsPerDay: number | null;\n seatReady: boolean;\n seatReason: string | null;\n canLaunch: boolean;\n canLaunchReason: string | null;\n estimateNote: string;\n /** Always https://claude.ai/… — anything else falls back to the frozen constant. */\n balanceUrl: string;\n}\n\nfunction rec(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as Record<string, unknown>) : null;\n}\n\nfunction num(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nfunction text(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;\n}\n\nconst DEFAULT_ESTIMATE_NOTE = 'An estimate from the sessions Verse launched — the real balance is on claude.ai.';\n\n/** Narrow a GET /api/verse/cloud body; null when it is not one. */\nexport function projectCloudCredits(raw: unknown): CloudCreditsView | null {\n const root = rec(raw) as Partial<Record<keyof CloudOverviewResponse, unknown>> | null;\n const budget = rec(root?.budget);\n if (!root || !budget) return null;\n const total = num(budget['creditsTotalUsd']);\n const spent = num(budget['estimatedSpentUsd']);\n const remainingRaw = num(budget['estimatedRemainingUsd']);\n if (total === null || (spent === null && remainingRaw === null)) return null;\n const remaining = Math.max(0, remainingRaw ?? total - (spent ?? 0));\n const seat = rec(root.seat);\n const gate = rec(budget['canLaunch']);\n const url = text(budget['balanceUrl']);\n const policy = rec(budget['budget']);\n return {\n totalUsd: total,\n spentUsd: spent ?? Math.max(0, total - remaining),\n remainingUsd: remaining,\n remainingPercent: total > 0 ? Math.max(0, Math.min(100, (remaining / total) * 100)) : 0,\n running: Math.max(0, num(budget['running']) ?? 0),\n sessionsToday: Math.max(0, num(budget['sessionsToday']) ?? 0),\n maxSessionsPerDay: num(policy?.['maxSessionsPerDay']),\n seatReady: seat?.['ready'] !== false,\n seatReason: text(seat?.['reason']),\n canLaunch: gate?.['ok'] !== false,\n canLaunchReason: text(gate?.['reason']),\n estimateNote: text(budget['estimateNote']) ?? DEFAULT_ESTIMATE_NOTE,\n balanceUrl: url !== null && url.startsWith('https://claude.ai/') ? url : CLOUD_BALANCE_URL,\n };\n}\n\n/** \"$212\" / \"$3.50\" — whole dollars once the cents stop mattering. */\nexport function formatUsd(value: number): string {\n const v = Math.max(0, value);\n return v >= 100 || Number.isInteger(v) ? `$${Math.round(v)}` : `$${v.toFixed(2)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Local\n// ---------------------------------------------------------------------------\n\nconst RUNTIME_NAME: Readonly<Record<ServingRuntimeSnapshot['kind'], string>> = {\n 'llama-server': 'llama-server',\n ollama: 'Ollama',\n vllm: 'vLLM',\n unknown: 'Serving runtime',\n};\n\nconst STATE_WORD: Readonly<Record<ServingRuntimeSnapshot['state'], string>> = {\n running: 'Running',\n starting: 'Starting…',\n stopping: 'Stopping…',\n stopped: 'Stopped',\n unknown: 'State not reported',\n};\n\nexport interface RuntimeView {\n name: string;\n state: ServingRuntimeSnapshot['state'];\n word: string;\n tone: 'success' | 'warning' | 'neutral';\n /** \"Qwen3-32B · 16k context per agent · 1 of 4 slots busy\" — only the parts that were reported. */\n detail: string | null;\n canStart: boolean;\n canStop: boolean;\n /** Set when Verse cannot start or stop it (launchd, the operator's own terminal). */\n managedElsewhere: boolean;\n}\n\nexport function runtimeView(runtime: ServingRuntimeSnapshot | null): RuntimeView | null {\n if (!runtime) return null;\n const parts: string[] = [];\n if (runtime.model) parts.push(modelNameInText(runtime.model));\n // Per-slot context, the number one agent actually gets (fleet-types.ts).\n if (runtime.contextTokens !== null) parts.push(`${formatContextWindow(runtime.contextTokens)} context per agent`);\n if (runtime.slotsTotal !== null && runtime.slotsTotal > 0) {\n parts.push(runtime.slotsBusy !== null ? `${runtime.slotsBusy} of ${runtime.slotsTotal} slots busy` : `${runtime.slotsTotal} slots`);\n }\n const state = runtime.state;\n return {\n name: RUNTIME_NAME[runtime.kind] ?? RUNTIME_NAME.unknown,\n state,\n word: STATE_WORD[state] ?? STATE_WORD.unknown,\n tone: state === 'running' ? 'success' : state === 'starting' || state === 'stopping' ? 'warning' : 'neutral',\n detail: parts.length > 0 ? parts.join(' · ') : null,\n canStart: runtime.supervised && state === 'stopped',\n canStop: runtime.supervised && state === 'running',\n managedElsewhere: !runtime.supervised,\n };\n}\n\n/**\n * The context a local model runs with. The configured window is the one a\n * turn actually gets; when it is below the model's native window both are\n * said, so \"256k model\" is never read as \"256k here\".\n */\nexport function modelContextText(row: Pick<LocalModelRow, 'nativeContext' | 'configuredContext' | 'contextTruncated'>): string | null {\n const configured = row.configuredContext;\n const native = row.nativeContext;\n if (configured !== null && row.contextTruncated && native !== null) return `${formatContextWindow(configured)} of ${formatContextWindow(native)} context`;\n if (configured !== null) return `${formatContextWindow(configured)} context`;\n if (native !== null) return `${formatContextWindow(native)} context`;\n return null;\n}\n\n/** How many models the drawer lists before pointing at Usage for the rest. */\nexport const LOCAL_MODELS_SHOWN = 6;\n","/**\n * routes/verse/resources/resources-queries.ts — the one read the Resources\n * drawer adds (unit 3.11 C6). Seats, health, budget, local models and the\n * serving runtime are read through their owners' QueryDefs (usage/, health/,\n * budget/, autonomy/fleet-queries); only the cloud lane's overview is new.\n *\n * GET /api/verse/cloud lands in parallel with this drawer. Until it does the\n * server answers 404, and that is a designed state (\"Cloud lane not available\n * yet\"), not an error: the fetcher resolves `{ available: false }` instead of\n * throwing. A 401 still propagates — an expired session is the whole app's\n * problem, not this panel's.\n */\nimport { VERSE_CLOUD_PATH } from '../../../../core/cloud/types.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { projectCloudCredits, type CloudCreditsView } from './resources-model.js';\n\nexport const RESOURCES_CLOUD_KEY = 'verse-resources-cloud';\n\nexport interface CloudCreditsRead {\n /** False when the route is absent (404) or unreachable. */\n available: boolean;\n /** Null when absent, or when the body was not a cloud overview. */\n credits: CloudCreditsView | null;\n}\n\nexport const cloudCreditsQuery: QueryDef<CloudCreditsRead> = {\n key: RESOURCES_CLOUD_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(VERSE_CLOUD_PATH, signal);\n return { available: true, credits: projectCloudCredits(raw) };\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 { available: false, credits: null };\n }\n },\n};\n\n/** While the drawer is open: seats and health ride their own 30 s polls; these are the drawer's own. */\nexport const RESOURCES_POLL_MS = { cloud: 60_000, local: 30_000, runtime: 15_000 } as const;\n","/**\n * routes/verse/resources/ResourcesBar.tsx — the always-on resource bar in the\n * rail foot (3.11.1).\n *\n * One row per resource the operator runs on — each paid account (provider\n * mark + a battery showing how much of its binding window is LEFT), the local\n * models, and the cloud credits — so capacity is visible on every surface\n * without opening anything. Hover (or keyboard focus) shows the detail: every\n * window with its reset, the reserve kept for Mason, the account's state.\n * Clicking a row opens the Resources drawer. The whole bar can be switched\n * off (\"Hide resource bar\" in ⌘K or the drawer), which brings back the rail's\n * single capacity ring.\n *\n * Loaded with the Resources chrome chunk, never on the chat first-paint path.\n * It reads the same app-wide seat + health caches the rail already keeps warm\n * plus the budget view (useCapacityData, as the drawer does) and the\n * drawer's cloud read, so it adds no poll of its own for accounts.\n */\nimport { useMemo, type CSSProperties } from 'react';\nimport { ProviderLogo } from '../../../components/primitives/ProviderLogo.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { usedPercentText } from '../percent-text.js';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport { bindingLeftPercent } from '../usage/binding-left.js';\nimport { accountStatus, buildCapacityRows, type AccountStatus, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { formatUsd } from './resources-model.js';\nimport { cloudCreditsQuery } from './resources-queries.js';\nimport { openResources } from './resources-store.js';\nimport styles from './ResourcesBar.module.css';\n\ntype Level = 'ok' | 'low' | 'out' | 'idle' | 'unknown';\n\nexport interface BarRow {\n key: string;\n engine: 'claude' | 'codex' | 'grok' | 'local';\n name: string;\n /** 0–100 left in the binding window; null when there is no reading. */\n leftPercent: number | null;\n level: Level;\n /** Short value beside the battery in the labelled rail: \"72%\", \"spent\", \"ready\". */\n value: string;\n /** Spoken + hover summary. */\n summary: string;\n detail: string[];\n}\n\nconst LEVEL_OF_STATUS: Readonly<Record<AccountStatus['kind'], Level>> = {\n usable: 'ok',\n low: 'low',\n spent: 'out',\n 'signed-out': 'out',\n unavailable: 'out',\n checking: 'unknown',\n 'not-checked': 'unknown',\n};\n\n/** Pure: capacity rows → bar rows (exported for tests). */\nexport function barRows(rows: readonly CapacityRow[], opts: { healthRead: boolean; now: number }): BarRow[] {\n const out: BarRow[] = [];\n for (const row of rows) {\n if (row.kind === 'local') {\n out.push({\n key: 'local',\n engine: 'local',\n name: row.localCount > 1 ? `Local models (${row.localCount})` : 'Local model',\n leftPercent: null,\n // An unread runtime is not \"ready\": the battery must say what the\n // hover summary does (\"readiness not reported\"), as Command's strip does.\n level: row.cls === 'blocked' ? 'out' : row.cls === 'unread' ? 'unknown' : 'idle',\n value: row.cls === 'blocked' ? 'offline' : row.cls === 'unread' ? 'not reported' : 'ready',\n summary: `${row.label}: ${row.summary}`,\n detail: ['No usage limits — runs on this Mac.', ...row.notes],\n });\n continue;\n }\n const status = accountStatus(row, { healthRead: opts.healthRead, now: opts.now });\n const level = LEVEL_OF_STATUS[status.kind] ?? 'unknown';\n const left = bindingLeftPercent(row);\n const value = level === 'out' ? (status.kind === 'spent' ? 'spent' : status.label.toLowerCase())\n : left === null ? '—' : `${usedPercentText(left)} left`;\n const detail = row.windows.map((w) => {\n const used = w.limitReached ? 'limit reached' : w.usedPercent === null ? 'no reading' : `${usedPercentText(w.usedPercent)} used`;\n // The accounts model already words it \"resets Fri 2:25 PM\"; don't say it twice.\n const reset = w.resetText ? w.resetText.replace(/^resets\\s+/i, '') : '';\n return `${w.label.charAt(0).toUpperCase()}${w.label.slice(1)}: ${used}${reset ? ` · resets ${reset}` : ''}`;\n });\n if (row.reserve) detail.push(row.reserve.label);\n if (status.usableAgain) detail.push(`Usable again ${status.usableAgain}`);\n if (status.checked) detail.push(`Checked ${status.checked}`);\n out.push({\n key: row.seatId,\n engine: row.engine,\n name: row.label,\n leftPercent: level === 'out' ? 0 : left,\n level,\n value,\n summary: `${row.label}: ${status.label}${status.detail ? ` · ${status.detail}` : ''}`,\n detail,\n });\n }\n // Usable first, then running low, then unknown, then spent / signed out; local last among the usable.\n const rank: Record<Level, number> = { ok: 0, low: 1, idle: 2, unknown: 3, out: 4 };\n return out.sort((a, b) => rank[a.level] - rank[b.level]);\n}\n\nfunction Battery({ left, level, vertical }: { left: number | null; level: Level; vertical: boolean }) {\n const fill = left === null ? (level === 'idle' ? 100 : 0) : Math.max(left > 0 ? 6 : 0, left);\n return (\n <span className={styles.battery} data-level={level} data-vertical={vertical || undefined} aria-hidden=\"true\">\n <span className={styles.cell} style={{ '--fill': `${fill}%` } as CSSProperties} />\n <span className={styles.nub} />\n </span>\n );\n}\n\nfunction RowTip({ row }: { row: BarRow }) {\n return (\n <div className={styles.tip}>\n <div className={styles.tipHead}>\n <ProviderLogo engine={row.engine} size={14} />\n <strong>{row.name}</strong>\n </div>\n <div className={styles.tipSummary}>{row.summary.slice(row.name.length + 2)}</div>\n {row.detail.map((line) => (\n <div key={line} className={styles.tipLine}>{line}</div>\n ))}\n <div className={styles.tipHint}>Click for Resources · ⌘.</div>\n </div>\n );\n}\n\nexport function ResourcesBar({ expanded }: { expanded: boolean }) {\n // With the budget view, like the drawer: for seats like Claude and Grok the\n // window readings arrive through it, so without it the batteries read empty.\n const data = useCapacityData();\n const cloudRead = useQuery(cloudCreditsQuery);\n const now = Date.now();\n const rows = useMemo(\n () => (data.loading ? [] : barRows(buildCapacityRows(data.seats, { health: data.health, budget: data.budget, local: 'collapse', now }), { healthRead: data.health !== null, now })),\n // `now` moves every render; the rows only need to follow the data.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [data.loading, data.seats, data.health, data.budget],\n );\n const cloud = cloudRead.data?.credits ?? null;\n const cloudLeft = cloud && cloud.totalUsd > 0 ? (cloud.remainingUsd / cloud.totalUsd) * 100 : null;\n const cloudLevel: Level = !cloud ? 'unknown' : cloud.remainingUsd <= 0 ? 'out' : (cloudLeft ?? 0) < 20 ? 'low' : 'ok';\n\n if (rows.length === 0 && !cloud) return null;\n return (\n <div className={styles.bar} data-expanded={expanded || undefined} role=\"group\" aria-label=\"Resources at a glance\">\n {rows.map((row) => (\n <Tooltip key={row.key} content={<RowTip row={row} />} placement=\"right\">\n <button\n type=\"button\"\n className={styles.row}\n data-level={row.level}\n aria-label={`${row.summary}. Open Resources`}\n onClick={() => openResources()}\n >\n {expanded ? (\n <>\n <span className={styles.line}>\n <ProviderLogo engine={row.engine} size={14} className={styles.logo} />\n <span className={styles.name}>{row.name}</span>\n </span>\n <span className={styles.line}>\n <Battery left={row.leftPercent} level={row.level} vertical={false} />\n <span className={styles.value}>{row.value}</span>\n </span>\n </>\n ) : (\n <>\n <ProviderLogo engine={row.engine} size={14} className={styles.logo} />\n <Battery left={row.leftPercent} level={row.level} vertical />\n </>\n )}\n </button>\n </Tooltip>\n ))}\n {cloud ? (\n <Tooltip\n content={\n <div className={styles.tip}>\n <div className={styles.tipHead}><ProviderLogo engine=\"claude\" size={14} /><strong>Cloud credits</strong></div>\n <div className={styles.tipSummary}>{formatUsd(cloud.remainingUsd)} of {formatUsd(cloud.totalUsd)} left · estimate</div>\n <div className={styles.tipLine}>{cloud.running} running · {cloud.sessionsToday} today</div>\n <div className={styles.tipHint}>Click for Resources · ⌘.</div>\n </div>\n }\n placement=\"right\"\n >\n <button\n type=\"button\"\n className={styles.row}\n data-level={cloudLevel}\n aria-label={`Cloud credits: about ${formatUsd(cloud.remainingUsd)} of ${formatUsd(cloud.totalUsd)} left. Open Resources`}\n onClick={() => openResources()}\n >\n {expanded ? (\n <>\n <span className={styles.line}>\n <span className={styles.cloudLogo}><ProviderLogo engine=\"claude\" size={14} className={styles.logo} /></span>\n <span className={styles.name}>Cloud credits</span>\n </span>\n <span className={styles.line}>\n <Battery left={cloudLeft} level={cloudLevel} vertical={false} />\n <span className={styles.value}>{formatUsd(cloud.remainingUsd)} left</span>\n </span>\n </>\n ) : (\n <>\n <span className={styles.cloudLogo}><ProviderLogo engine=\"claude\" size={14} className={styles.logo} /></span>\n <Battery left={cloudLeft} level={cloudLevel} vertical />\n </>\n )}\n </button>\n </Tooltip>\n ) : null}\n </div>\n );\n}\n","/**\n * routes/verse/resources/resources-summary.tsx — the edge handle's dot,\n * loaded after first paint (unit 3.11 C6).\n *\n * Mounted by the shell once, renders nothing, and publishes one tone and one\n * sentence to resources-store for the handle and the rail button. It reads the\n * same app-wide seat + health caches as the rail's capacity ring\n * (useCapacityData, budget OFF), so it adds no request of its own and keeps\n * no poll alive that the rail does not already keep — the cheap summary the\n * handle needs, never the drawer's heavier reads.\n */\nimport { useEffect, useMemo } from 'react';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport { buildCapacityRows } from '../usage/capacity-strip-model.js';\nimport { summarizeResources } from './resources-model.js';\nimport { setResourcesSummary } from './resources-store.js';\n\nexport function ResourcesSummaryProbe() {\n const data = useCapacityData({ withBudget: false });\n const healthRead = data.health !== null;\n const summary = useMemo(\n () => (data.loading ? null : summarizeResources(buildCapacityRows(data.seats, { health: data.health, local: 'hide' }), { healthRead })),\n [data.loading, data.seats, data.health, healthRead],\n );\n useEffect(() => {\n setResourcesSummary(summary);\n }, [summary]);\n return null;\n}\n","/**\n * routes/verse/resources/ResourcesChrome.tsx — everything the Resources\n * drawer puts on every surface, as ONE chunk fetched right after first paint\n * (unit 3.11 C6):\n *\n * ResourcesChrome the edge tab on the right, the summary behind its\n * dot, the ⌘. / palette command, and the drawer itself\n * (overlay, or the docked column when pinned);\n * ResourcesRailButton the rail-foot button with the same dot.\n *\n * WHY A CHUNK. Chat first paint has ~3 KB of budget left (SPEC-310A §1;\n * `npm run check:first-paint`), and nothing here can draw anything useful\n * before the seat reads answer anyway. The shell keeps only the tiny store\n * static — it must know at first paint whether a pinned column takes a grid\n * track, so the surface never jumps — and mounts this module's two\n * components lazily, like the rail's capacity ring. The drawer body is a\n * further chunk still, mounted only while open (so it polls only while open)\n * and warmed on idle / on hover.\n */\nimport { Suspense, lazy, useEffect } from 'react';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { findCommand, formatChord } from '../shell/command-catalog.js';\nimport { registerCommandHandler } from '../shell/command-bus.js';\nimport { executeCatalogCommand } from '../shell/run-command.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { closeVerseOverlay } from '../verse-ui-store.js';\nimport { ResourcesDot, ResourcesHandle, ResourcesIcon, resourcesLabel } from './ResourcesHandle.js';\nimport { closeResources, getResourcesUi, openResources, setResourcesBar, useResourcesUi } from './resources-store.js';\nexport { ResourcesBar } from './ResourcesBar.js';\nimport { ResourcesSummaryProbe } from './resources-summary.js';\nimport styles from './ResourcesChrome.module.css';\n\nconst importDrawer = () => import('./ResourcesDrawer.js');\nconst ResourcesDrawer = lazy(() => importDrawer().then((m) => ({ default: m.ResourcesDrawer })));\n\n/** Fetch the drawer's chunk ahead of the first open (the shell's idle warm-up, a hover). */\nexport function preloadResourcesDrawer(): Promise<unknown> {\n return importDrawer();\n}\n\nconst warm = () => {\n void importDrawer().catch(() => undefined);\n};\n\n/** The key and the buttons toggle; the palette (\"Open Resources\") and the desktop menu open. */\nexport function runResourcesCommand(via: string | undefined): void {\n if (getResourcesUi().open && (via === 'key' || via === 'button')) {\n closeResources();\n return;\n }\n // One overlay at a time: the drawer replaces ⌘K / ⌘J / ⌘/.\n closeVerseOverlay();\n openResources();\n}\n\nfunction shortcutText(): string | undefined {\n const chord = findCommand('resources.toggle')?.keys[0];\n return chord ? formatChord(chord) : undefined;\n}\n\n/** Pinned docks beside the surface; a phone-width window has no room, so it floats there. */\nexport function resourcesDocked(state: { open: boolean; pinned: boolean }, compact: boolean): boolean {\n return state.open && state.pinned && !compact;\n}\n\nexport function ResourcesChrome({ compact }: { compact: boolean }) {\n const resources = useResourcesUi();\n const { overlay } = useVerseUi();\n const docked = resourcesDocked(resources, compact);\n\n useEffect(() => registerCommandHandler('resources.toggle', (inv) => runResourcesCommand(inv.via)), []);\n useEffect(() => registerCommandHandler('resources.bar.toggle', () => setResourcesBar(!getResourcesUi().bar)), []);\n // Another overlay (⌘K, ⌘J, ⌘/) replaces a FLOATING drawer; a pinned one stays docked.\n useEffect(() => {\n if (overlay !== null && !resourcesDocked(getResourcesUi(), compact)) closeResources();\n }, [overlay, compact]);\n\n return (\n <>\n <ResourcesSummaryProbe />\n {docked ? (\n <div className={styles.dock} data-resources-dock>\n <Suspense fallback={null}>\n <ResourcesDrawer mode=\"docked\" />\n </Suspense>\n </div>\n ) : null}\n {resources.open && !docked ? (\n <Suspense fallback={null}>\n <ResourcesDrawer mode=\"overlay\" compact={compact} />\n </Suspense>\n ) : null}\n {resources.open ? null : (\n <ResourcesHandle summary={resources.summary} shortcut={shortcutText()} onWarm={warm} onOpen={() => executeCatalogCommand('resources.toggle', { via: 'button' })} />\n )}\n </>\n );\n}\n\n/**\n * The rail-foot button. The shell passes its own rail classes so the button\n * is indistinguishable from its neighbours (no tooltip while the rail's\n * labelled mode already shows the name).\n */\nexport function ResourcesRailButton({ expanded, buttonClass, iconClass, labelClass }: {\n expanded: boolean;\n buttonClass: string | undefined;\n iconClass: string | undefined;\n labelClass: string | undefined;\n}) {\n const resources = useResourcesUi();\n const label = resourcesLabel(resources.summary);\n return (\n <Tooltip label={label} shortcut={shortcutText()} placement=\"right\" disabled={expanded}>\n <button\n type=\"button\"\n className={buttonClass}\n aria-label={label}\n aria-expanded={resources.open}\n data-resources-rail\n onPointerEnter={warm}\n onClick={() => executeCatalogCommand('resources.toggle', { via: 'button' })}\n >\n <span className={iconClass}>\n <ResourcesIcon />\n <ResourcesDot summary={resources.summary} rail />\n </span>\n {expanded ? <span className={labelClass}>Resources</span> : null}\n </button>\n </Tooltip>\n );\n}\n"],"file":"ResourcesChrome-C2ZrA7la.js"}
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/resources/ResourcesHandle.tsx","../../../../../../src/web-ui/routes/verse/resources/resources-model.ts","../../../../../../src/web-ui/routes/verse/resources/resources-queries.ts","../../../../../../src/web-ui/routes/verse/resources/ResourcesBar.tsx","../../../../../../src/web-ui/routes/verse/resources/resources-summary.tsx","../../../../../../src/web-ui/routes/verse/resources/ResourcesChrome.tsx"],"sourcesContent":["/**\n * routes/verse/resources/ResourcesHandle.tsx — the slim tab on the right edge\n * of every surface that opens the Resources drawer, its icon and its status\n * dot (unit 3.11 C6).\n *\n * Part of the ResourcesChrome chunk, fetched right after first paint (like the\n * rail's capacity ring). Until the summary has read there is no dot — \"not\n * known\" is never drawn as \"fine\". The dot is a shape plus words in the\n * accessible name, never colour alone.\n */\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport type { ResourcesSummary } from './resources-model.js';\nimport styles from './ResourcesChrome.module.css';\n\n/** Three stacked capacity bars: accounts, compute, credits. 16px, 1.5px stroke, like the shared set. */\nexport function ResourcesIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M2.75 4h10.5M2.75 8h10.5M2.75 12h10.5\" opacity=\".35\" />\n <path d=\"M2.75 4h7M2.75 8h4M2.75 12h8.5\" />\n </svg>\n );\n}\n\n/** `rail`: pinned to the corner of a rail icon, like the rail's own badges. */\nexport function ResourcesDot({ summary, rail = false }: { summary: ResourcesSummary | null; rail?: boolean }) {\n if (!summary || summary.tone === 'unknown') return null;\n const dot = <span className={styles.dot} data-tone={summary.tone} data-resources-dot={summary.tone} aria-hidden=\"true\" />;\n return rail ? <span className={styles.railDot}>{dot}</span> : dot;\n}\n\n/** \"Resources — 2 usable · 1 spent\": the tooltip and the accessible name. */\nexport function resourcesLabel(summary: ResourcesSummary | null): string {\n return summary ? `Resources — ${summary.spoken}` : 'Resources';\n}\n\nexport function ResourcesHandle({ summary, shortcut, onOpen, onWarm }: { summary: ResourcesSummary | null; shortcut: string | undefined; onOpen: () => void; onWarm?: () => void }) {\n return (\n <Tooltip label={resourcesLabel(summary)} shortcut={shortcut} placement=\"left\">\n <button type=\"button\" className={styles.handle} data-resources-handle aria-label={resourcesLabel(summary)} aria-haspopup=\"dialog\" onClick={onOpen} onPointerEnter={onWarm} onFocus={onWarm}>\n <ResourcesIcon />\n <ResourcesDot summary={summary} />\n </button>\n </Tooltip>\n );\n}\n","/**\n * routes/verse/resources/resources-model.ts — what the Resources drawer says,\n * projected from reads other units already own (unit 3.11 C6). Pure: no\n * React, no I/O.\n *\n * Nothing about a seat is worded here. Every account line comes from C6's\n * capacity projection (usage/capacity-strip-model.ts: `accountStatus`,\n * `orderAccountRows`), so the drawer, Apps & Accounts and the rail ring can\n * never describe one seat two ways. What IS new here:\n *\n * - the edge handle's one-dot summary across the paid accounts;\n * - the cloud lane's overview (GET /api/verse/cloud), narrowed field by\n * field — the route is landing in parallel, so a missing or drifted body\n * reads as \"not available yet\", never as a crash or a zero;\n * - short sentences for the serving runtime and each local model's context.\n */\nimport { CLOUD_BALANCE_URL, type CloudOverviewResponse } from '../../../../core/cloud/types.js';\nimport type { ServingRuntimeSnapshot } from '../../../data/api-types.js';\nimport { accountStatus, type AccountStatusKind, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { modelNameInText, type LocalModelRow } from '../usage/local-model.js';\nimport { formatContextWindow } from '../verse-model.js';\n\n// ---------------------------------------------------------------------------\n// The handle's dot\n// ---------------------------------------------------------------------------\n\n/**\n * ok every account read is usable, none tight\n * tight something is running low (or usable only on credits)\n * alert something is spent, signed out or unavailable\n * unknown nothing has been read yet — no dot at all (never \"all good\")\n */\nexport type ResourcesTone = 'ok' | 'tight' | 'alert' | 'unknown';\n\nexport interface ResourcesSummary {\n tone: ResourcesTone;\n /** Appended to the handle's accessible name and tooltip: \"2 usable · 1 spent\". */\n spoken: string;\n}\n\nconst ALERT_KINDS: ReadonlySet<AccountStatusKind> = new Set(['spent', 'signed-out', 'unavailable']);\n\nconst COUNT_WORDS: ReadonlyArray<[AccountStatusKind, string]> = [\n ['usable', 'usable'],\n ['low', 'running low'],\n ['spent', 'spent'],\n ['signed-out', 'signed out'],\n ['unavailable', 'unavailable'],\n];\n\n/** The paid accounts, reduced to one tone and one sentence. Local seats have no quota to run out of. */\nexport function summarizeResources(rows: readonly CapacityRow[], opts: { healthRead: boolean; now?: number }): ResourcesSummary {\n const kinds = rows\n .filter((r) => r.kind === 'subscription')\n .map((r) => accountStatus(r, { healthRead: opts.healthRead, ...(opts.now !== undefined ? { now: opts.now } : {}) }).kind);\n const counts = new Map<AccountStatusKind, number>();\n for (const k of kinds) counts.set(k, (counts.get(k) ?? 0) + 1);\n const spoken = COUNT_WORDS.filter(([k]) => counts.has(k))\n .map(([k, word]) => `${counts.get(k)} ${word}`)\n .join(' · ');\n let tone: ResourcesTone = 'unknown';\n if (kinds.some((k) => ALERT_KINDS.has(k))) tone = 'alert';\n else if (kinds.includes('low')) tone = 'tight';\n else if (kinds.includes('usable')) tone = 'ok';\n return { tone, spoken: spoken || (kinds.length === 0 ? 'no accounts connected' : 'not read yet') };\n}\n\nexport const TONE_WORD: Readonly<Record<ResourcesTone, string>> = {\n ok: 'all usable',\n tight: 'running low',\n alert: 'needs attention',\n unknown: 'not read yet',\n};\n\n// ---------------------------------------------------------------------------\n// Cloud credits\n// ---------------------------------------------------------------------------\n\nexport interface CloudCreditsView {\n totalUsd: number;\n spentUsd: number;\n remainingUsd: number;\n /** 0–100, remaining of total. */\n remainingPercent: number;\n running: number;\n sessionsToday: number;\n maxSessionsPerDay: number | null;\n seatReady: boolean;\n seatReason: string | null;\n canLaunch: boolean;\n canLaunchReason: string | null;\n estimateNote: string;\n /** Always https://claude.ai/… — anything else falls back to the frozen constant. */\n balanceUrl: string;\n}\n\nfunction rec(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as Record<string, unknown>) : null;\n}\n\nfunction num(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nfunction text(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;\n}\n\nconst DEFAULT_ESTIMATE_NOTE = 'An estimate from the sessions Verse launched — the real balance is on claude.ai.';\n\n/** Narrow a GET /api/verse/cloud body; null when it is not one. */\nexport function projectCloudCredits(raw: unknown): CloudCreditsView | null {\n const root = rec(raw) as Partial<Record<keyof CloudOverviewResponse, unknown>> | null;\n const budget = rec(root?.budget);\n if (!root || !budget) return null;\n const total = num(budget['creditsTotalUsd']);\n const spent = num(budget['estimatedSpentUsd']);\n const remainingRaw = num(budget['estimatedRemainingUsd']);\n if (total === null || (spent === null && remainingRaw === null)) return null;\n const remaining = Math.max(0, remainingRaw ?? total - (spent ?? 0));\n const seat = rec(root.seat);\n const gate = rec(budget['canLaunch']);\n const url = text(budget['balanceUrl']);\n const policy = rec(budget['budget']);\n return {\n totalUsd: total,\n spentUsd: spent ?? Math.max(0, total - remaining),\n remainingUsd: remaining,\n remainingPercent: total > 0 ? Math.max(0, Math.min(100, (remaining / total) * 100)) : 0,\n running: Math.max(0, num(budget['running']) ?? 0),\n sessionsToday: Math.max(0, num(budget['sessionsToday']) ?? 0),\n maxSessionsPerDay: num(policy?.['maxSessionsPerDay']),\n seatReady: seat?.['ready'] !== false,\n seatReason: text(seat?.['reason']),\n canLaunch: gate?.['ok'] !== false,\n canLaunchReason: text(gate?.['reason']),\n estimateNote: text(budget['estimateNote']) ?? DEFAULT_ESTIMATE_NOTE,\n balanceUrl: url !== null && url.startsWith('https://claude.ai/') ? url : CLOUD_BALANCE_URL,\n };\n}\n\n/** \"$212\" / \"$3.50\" — whole dollars once the cents stop mattering. */\nexport function formatUsd(value: number): string {\n const v = Math.max(0, value);\n return v >= 100 || Number.isInteger(v) ? `$${Math.round(v)}` : `$${v.toFixed(2)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Local\n// ---------------------------------------------------------------------------\n\nconst RUNTIME_NAME: Readonly<Record<ServingRuntimeSnapshot['kind'], string>> = {\n 'llama-server': 'llama-server',\n ollama: 'Ollama',\n vllm: 'vLLM',\n unknown: 'Serving runtime',\n};\n\nconst STATE_WORD: Readonly<Record<ServingRuntimeSnapshot['state'], string>> = {\n running: 'Running',\n starting: 'Starting…',\n stopping: 'Stopping…',\n stopped: 'Stopped',\n unknown: 'State not reported',\n};\n\nexport interface RuntimeView {\n name: string;\n state: ServingRuntimeSnapshot['state'];\n word: string;\n tone: 'success' | 'warning' | 'neutral';\n /** \"Qwen3-32B · 16k context per agent · 1 of 4 slots busy\" — only the parts that were reported. */\n detail: string | null;\n canStart: boolean;\n canStop: boolean;\n /** Set when Verse cannot start or stop it (launchd, the operator's own terminal). */\n managedElsewhere: boolean;\n}\n\nexport function runtimeView(runtime: ServingRuntimeSnapshot | null): RuntimeView | null {\n if (!runtime) return null;\n const parts: string[] = [];\n if (runtime.model) parts.push(modelNameInText(runtime.model));\n // Per-slot context, the number one agent actually gets (fleet-types.ts).\n if (runtime.contextTokens !== null) parts.push(`${formatContextWindow(runtime.contextTokens)} context per agent`);\n if (runtime.slotsTotal !== null && runtime.slotsTotal > 0) {\n parts.push(runtime.slotsBusy !== null ? `${runtime.slotsBusy} of ${runtime.slotsTotal} slots busy` : `${runtime.slotsTotal} slots`);\n }\n const state = runtime.state;\n return {\n name: RUNTIME_NAME[runtime.kind] ?? RUNTIME_NAME.unknown,\n state,\n word: STATE_WORD[state] ?? STATE_WORD.unknown,\n tone: state === 'running' ? 'success' : state === 'starting' || state === 'stopping' ? 'warning' : 'neutral',\n detail: parts.length > 0 ? parts.join(' · ') : null,\n canStart: runtime.supervised && state === 'stopped',\n canStop: runtime.supervised && state === 'running',\n managedElsewhere: !runtime.supervised,\n };\n}\n\n/**\n * The context a local model runs with. The configured window is the one a\n * turn actually gets; when it is below the model's native window both are\n * said, so \"256k model\" is never read as \"256k here\".\n */\nexport function modelContextText(row: Pick<LocalModelRow, 'nativeContext' | 'configuredContext' | 'contextTruncated'>): string | null {\n const configured = row.configuredContext;\n const native = row.nativeContext;\n if (configured !== null && row.contextTruncated && native !== null) return `${formatContextWindow(configured)} of ${formatContextWindow(native)} context`;\n if (configured !== null) return `${formatContextWindow(configured)} context`;\n if (native !== null) return `${formatContextWindow(native)} context`;\n return null;\n}\n\n/** How many models the drawer lists before pointing at Usage for the rest. */\nexport const LOCAL_MODELS_SHOWN = 6;\n","/**\n * routes/verse/resources/resources-queries.ts — the one read the Resources\n * drawer adds (unit 3.11 C6). Seats, health, budget, local models and the\n * serving runtime are read through their owners' QueryDefs (usage/, health/,\n * budget/, autonomy/fleet-queries); only the cloud lane's overview is new.\n *\n * GET /api/verse/cloud lands in parallel with this drawer. Until it does the\n * server answers 404, and that is a designed state (\"Cloud lane not available\n * yet\"), not an error: the fetcher resolves `{ available: false }` instead of\n * throwing. A 401 still propagates — an expired session is the whole app's\n * problem, not this panel's.\n */\nimport { VERSE_CLOUD_PATH } from '../../../../core/cloud/types.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { projectCloudCredits, type CloudCreditsView } from './resources-model.js';\n\nexport const RESOURCES_CLOUD_KEY = 'verse-resources-cloud';\n\nexport interface CloudCreditsRead {\n /** False when the route is absent (404) or unreachable. */\n available: boolean;\n /** Null when absent, or when the body was not a cloud overview. */\n credits: CloudCreditsView | null;\n}\n\nexport const cloudCreditsQuery: QueryDef<CloudCreditsRead> = {\n key: RESOURCES_CLOUD_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(VERSE_CLOUD_PATH, signal);\n return { available: true, credits: projectCloudCredits(raw) };\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 { available: false, credits: null };\n }\n },\n};\n\n/** While the drawer is open: seats and health ride their own 30 s polls; these are the drawer's own. */\nexport const RESOURCES_POLL_MS = { cloud: 60_000, local: 30_000, runtime: 15_000 } as const;\n","/**\n * routes/verse/resources/ResourcesBar.tsx — the always-on resource bar in the\n * rail foot (3.11.1).\n *\n * One row per resource the operator runs on — each paid account (provider\n * mark + a battery showing how much of its binding window is LEFT), the local\n * models, and the cloud credits — so capacity is visible on every surface\n * without opening anything. Hover (or keyboard focus) shows the detail: every\n * window with its reset, the reserve kept for Mason, the account's state.\n * Clicking a row opens the Resources drawer. The whole bar can be switched\n * off (\"Hide resource bar\" in ⌘K or the drawer), which brings back the rail's\n * single capacity ring.\n *\n * Loaded with the Resources chrome chunk, never on the chat first-paint path.\n * It reads the same app-wide seat + health caches the rail already keeps warm\n * plus the budget view (useCapacityData, as the drawer does) and the\n * drawer's cloud read, so it adds no poll of its own for accounts.\n */\nimport { useMemo, type CSSProperties } from 'react';\nimport { ProviderLogo } from '../../../components/primitives/ProviderLogo.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { usedPercentText } from '../percent-text.js';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport { bindingLeftPercent } from '../usage/binding-left.js';\nimport { accountStatus, buildCapacityRows, type AccountStatus, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { formatUsd } from './resources-model.js';\nimport { cloudCreditsQuery } from './resources-queries.js';\nimport { openResources } from './resources-store.js';\nimport styles from './ResourcesBar.module.css';\n\ntype Level = 'ok' | 'low' | 'out' | 'idle' | 'unknown';\n\nexport interface BarRow {\n key: string;\n engine: 'claude' | 'codex' | 'grok' | 'local';\n name: string;\n /** 0–100 left in the binding window; null when there is no reading. */\n leftPercent: number | null;\n level: Level;\n /** Short value beside the battery in the labelled rail: \"72%\", \"spent\", \"ready\". */\n value: string;\n /** Spoken + hover summary. */\n summary: string;\n detail: string[];\n}\n\nconst LEVEL_OF_STATUS: Readonly<Record<AccountStatus['kind'], Level>> = {\n usable: 'ok',\n low: 'low',\n spent: 'out',\n 'signed-out': 'out',\n unavailable: 'out',\n checking: 'unknown',\n 'not-checked': 'unknown',\n};\n\n/** Pure: capacity rows → bar rows (exported for tests). */\nexport function barRows(rows: readonly CapacityRow[], opts: { healthRead: boolean; now: number }): BarRow[] {\n const out: BarRow[] = [];\n for (const row of rows) {\n if (row.kind === 'local') {\n out.push({\n key: 'local',\n engine: 'local',\n name: row.localCount > 1 ? `Local models (${row.localCount})` : 'Local model',\n leftPercent: null,\n // An unread runtime is not \"ready\": the battery must say what the\n // hover summary does (\"readiness not reported\"), as Command's strip does.\n level: row.cls === 'blocked' ? 'out' : row.cls === 'unread' ? 'unknown' : 'idle',\n value: row.cls === 'blocked' ? 'offline' : row.cls === 'unread' ? 'not reported' : 'ready',\n summary: `${row.label}: ${row.summary}`,\n detail: ['No usage limits — runs on this Mac.', ...row.notes],\n });\n continue;\n }\n const status = accountStatus(row, { healthRead: opts.healthRead, now: opts.now });\n const level = LEVEL_OF_STATUS[status.kind] ?? 'unknown';\n const left = bindingLeftPercent(row);\n const value = level === 'out' ? (status.kind === 'spent' ? 'spent' : status.label.toLowerCase())\n : left === null ? '—' : `${usedPercentText(left)} left`;\n const detail = row.windows.map((w) => {\n const used = w.limitReached ? 'limit reached' : w.usedPercent === null ? 'no reading' : `${usedPercentText(w.usedPercent)} used`;\n // The accounts model already words it \"resets Fri 2:25 PM\"; don't say it twice.\n const reset = w.resetText ? w.resetText.replace(/^resets\\s+/i, '') : '';\n return `${w.label.charAt(0).toUpperCase()}${w.label.slice(1)}: ${used}${reset ? ` · resets ${reset}` : ''}`;\n });\n if (row.reserve) detail.push(row.reserve.label);\n if (status.usableAgain) detail.push(`Usable again ${status.usableAgain}`);\n if (status.checked) detail.push(`Checked ${status.checked}`);\n out.push({\n key: row.seatId,\n engine: row.engine,\n name: row.label,\n leftPercent: level === 'out' ? 0 : left,\n level,\n value,\n summary: `${row.label}: ${status.label}${status.detail ? ` · ${status.detail}` : ''}`,\n detail,\n });\n }\n // Usable first, then running low, then unknown, then spent / signed out; local last among the usable.\n const rank: Record<Level, number> = { ok: 0, low: 1, idle: 2, unknown: 3, out: 4 };\n return out.sort((a, b) => rank[a.level] - rank[b.level]);\n}\n\nfunction Battery({ left, level, vertical }: { left: number | null; level: Level; vertical: boolean }) {\n const fill = left === null ? (level === 'idle' ? 100 : 0) : Math.max(left > 0 ? 6 : 0, left);\n return (\n <span className={styles.battery} data-level={level} data-vertical={vertical || undefined} aria-hidden=\"true\">\n <span className={styles.cell} style={{ '--fill': `${fill}%` } as CSSProperties} />\n <span className={styles.nub} />\n </span>\n );\n}\n\nfunction RowTip({ row }: { row: BarRow }) {\n return (\n <div className={styles.tip}>\n <div className={styles.tipHead}>\n <ProviderLogo engine={row.engine} size={14} />\n <strong>{row.name}</strong>\n </div>\n <div className={styles.tipSummary}>{row.summary.slice(row.name.length + 2)}</div>\n {row.detail.map((line) => (\n <div key={line} className={styles.tipLine}>{line}</div>\n ))}\n <div className={styles.tipHint}>Click for Resources · ⌘.</div>\n </div>\n );\n}\n\nexport function ResourcesBar({ expanded }: { expanded: boolean }) {\n // With the budget view, like the drawer: for seats like Claude and Grok the\n // window readings arrive through it, so without it the batteries read empty.\n const data = useCapacityData();\n const cloudRead = useQuery(cloudCreditsQuery);\n const now = Date.now();\n const rows = useMemo(\n () => (data.loading ? [] : barRows(buildCapacityRows(data.seats, { health: data.health, budget: data.budget, local: 'collapse', now }), { healthRead: data.health !== null, now })),\n // `now` moves every render; the rows only need to follow the data.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [data.loading, data.seats, data.health, data.budget],\n );\n const cloud = cloudRead.data?.credits ?? null;\n const cloudLeft = cloud && cloud.totalUsd > 0 ? (cloud.remainingUsd / cloud.totalUsd) * 100 : null;\n const cloudLevel: Level = !cloud ? 'unknown' : cloud.remainingUsd <= 0 ? 'out' : (cloudLeft ?? 0) < 20 ? 'low' : 'ok';\n\n if (rows.length === 0 && !cloud) return null;\n return (\n <div className={styles.bar} data-expanded={expanded || undefined} role=\"group\" aria-label=\"Resources at a glance\">\n {rows.map((row) => (\n <Tooltip key={row.key} content={<RowTip row={row} />} placement=\"right\">\n <button\n type=\"button\"\n className={styles.row}\n data-level={row.level}\n aria-label={`${row.summary}. Open Resources`}\n onClick={() => openResources()}\n >\n {expanded ? (\n <>\n <span className={styles.line}>\n <ProviderLogo engine={row.engine} size={14} className={styles.logo} />\n <span className={styles.name}>{row.name}</span>\n </span>\n <span className={styles.line}>\n <Battery left={row.leftPercent} level={row.level} vertical={false} />\n <span className={styles.value}>{row.value}</span>\n </span>\n </>\n ) : (\n <>\n <ProviderLogo engine={row.engine} size={14} className={styles.logo} />\n <Battery left={row.leftPercent} level={row.level} vertical />\n </>\n )}\n </button>\n </Tooltip>\n ))}\n {cloud ? (\n <Tooltip\n content={\n <div className={styles.tip}>\n <div className={styles.tipHead}><ProviderLogo engine=\"claude\" size={14} /><strong>Cloud credits</strong></div>\n <div className={styles.tipSummary}>{formatUsd(cloud.remainingUsd)} of {formatUsd(cloud.totalUsd)} left · estimate</div>\n <div className={styles.tipLine}>{cloud.running} running · {cloud.sessionsToday} today</div>\n <div className={styles.tipHint}>Click for Resources · ⌘.</div>\n </div>\n }\n placement=\"right\"\n >\n <button\n type=\"button\"\n className={styles.row}\n data-level={cloudLevel}\n aria-label={`Cloud credits: about ${formatUsd(cloud.remainingUsd)} of ${formatUsd(cloud.totalUsd)} left. Open Resources`}\n onClick={() => openResources()}\n >\n {expanded ? (\n <>\n <span className={styles.line}>\n <span className={styles.cloudLogo}><ProviderLogo engine=\"claude\" size={14} className={styles.logo} /></span>\n <span className={styles.name}>Cloud credits</span>\n </span>\n <span className={styles.line}>\n <Battery left={cloudLeft} level={cloudLevel} vertical={false} />\n <span className={styles.value}>{formatUsd(cloud.remainingUsd)} left</span>\n </span>\n </>\n ) : (\n <>\n <span className={styles.cloudLogo}><ProviderLogo engine=\"claude\" size={14} className={styles.logo} /></span>\n <Battery left={cloudLeft} level={cloudLevel} vertical />\n </>\n )}\n </button>\n </Tooltip>\n ) : null}\n </div>\n );\n}\n","/**\n * routes/verse/resources/resources-summary.tsx — the edge handle's dot,\n * loaded after first paint (unit 3.11 C6).\n *\n * Mounted by the shell once, renders nothing, and publishes one tone and one\n * sentence to resources-store for the handle and the rail button. It reads the\n * same app-wide seat + health caches as the rail's capacity ring\n * (useCapacityData, budget OFF), so it adds no request of its own and keeps\n * no poll alive that the rail does not already keep — the cheap summary the\n * handle needs, never the drawer's heavier reads.\n */\nimport { useEffect, useMemo } from 'react';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport { buildCapacityRows } from '../usage/capacity-strip-model.js';\nimport { summarizeResources } from './resources-model.js';\nimport { setResourcesSummary } from './resources-store.js';\n\nexport function ResourcesSummaryProbe() {\n const data = useCapacityData({ withBudget: false });\n const healthRead = data.health !== null;\n const summary = useMemo(\n () => (data.loading ? null : summarizeResources(buildCapacityRows(data.seats, { health: data.health, local: 'hide' }), { healthRead })),\n [data.loading, data.seats, data.health, healthRead],\n );\n useEffect(() => {\n setResourcesSummary(summary);\n }, [summary]);\n return null;\n}\n","/**\n * routes/verse/resources/ResourcesChrome.tsx — everything the Resources\n * drawer puts on every surface, as ONE chunk fetched right after first paint\n * (unit 3.11 C6):\n *\n * ResourcesChrome the edge tab on the right, the summary behind its\n * dot, the ⌘. / palette command, and the drawer itself\n * (overlay, or the docked column when pinned);\n * ResourcesRailButton the rail-foot button with the same dot.\n *\n * WHY A CHUNK. Chat first paint has ~3 KB of budget left (SPEC-310A §1;\n * `npm run check:first-paint`), and nothing here can draw anything useful\n * before the seat reads answer anyway. The shell keeps only the tiny store\n * static — it must know at first paint whether a pinned column takes a grid\n * track, so the surface never jumps — and mounts this module's two\n * components lazily, like the rail's capacity ring. The drawer body is a\n * further chunk still, mounted only while open (so it polls only while open)\n * and warmed on idle / on hover.\n */\nimport { Suspense, lazy, useEffect } from 'react';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { findCommand, formatChord } from '../shell/command-catalog.js';\nimport { registerCommandHandler } from '../shell/command-bus.js';\nimport { executeCatalogCommand } from '../shell/run-command.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { closeVerseOverlay } from '../verse-ui-store.js';\nimport { ResourcesDot, ResourcesHandle, ResourcesIcon, resourcesLabel } from './ResourcesHandle.js';\nimport { closeResources, getResourcesUi, openResources, setResourcesBar, useResourcesUi } from './resources-store.js';\nexport { ResourcesBar } from './ResourcesBar.js';\nimport { ResourcesSummaryProbe } from './resources-summary.js';\nimport styles from './ResourcesChrome.module.css';\n\nconst importDrawer = () => import('./ResourcesDrawer.js');\nconst ResourcesDrawer = lazy(() => importDrawer().then((m) => ({ default: m.ResourcesDrawer })));\n\n/** Fetch the drawer's chunk ahead of the first open (the shell's idle warm-up, a hover). */\nexport function preloadResourcesDrawer(): Promise<unknown> {\n return importDrawer();\n}\n\nconst warm = () => {\n void importDrawer().catch(() => undefined);\n};\n\n/** The key and the buttons toggle; the palette (\"Open Resources\") and the desktop menu open. */\nexport function runResourcesCommand(via: string | undefined): void {\n if (getResourcesUi().open && (via === 'key' || via === 'button')) {\n closeResources();\n return;\n }\n // One overlay at a time: the drawer replaces ⌘K / ⌘J / ⌘/.\n closeVerseOverlay();\n openResources();\n}\n\nfunction shortcutText(): string | undefined {\n const chord = findCommand('resources.toggle')?.keys[0];\n return chord ? formatChord(chord) : undefined;\n}\n\n/** Pinned docks beside the surface; a phone-width window has no room, so it floats there. */\nexport function resourcesDocked(state: { open: boolean; pinned: boolean }, compact: boolean): boolean {\n return state.open && state.pinned && !compact;\n}\n\nexport function ResourcesChrome({ compact }: { compact: boolean }) {\n const resources = useResourcesUi();\n const { overlay } = useVerseUi();\n const docked = resourcesDocked(resources, compact);\n\n useEffect(() => registerCommandHandler('resources.toggle', (inv) => runResourcesCommand(inv.via)), []);\n useEffect(() => registerCommandHandler('resources.bar.toggle', () => setResourcesBar(!getResourcesUi().bar)), []);\n // Another overlay (⌘K, ⌘J, ⌘/) replaces a FLOATING drawer; a pinned one stays docked.\n useEffect(() => {\n if (overlay !== null && !resourcesDocked(getResourcesUi(), compact)) closeResources();\n }, [overlay, compact]);\n\n return (\n <>\n <ResourcesSummaryProbe />\n {docked ? (\n <div className={styles.dock} data-resources-dock>\n <Suspense fallback={null}>\n <ResourcesDrawer mode=\"docked\" />\n </Suspense>\n </div>\n ) : null}\n {resources.open && !docked ? (\n <Suspense fallback={null}>\n <ResourcesDrawer mode=\"overlay\" compact={compact} />\n </Suspense>\n ) : null}\n {resources.open ? null : (\n <ResourcesHandle summary={resources.summary} shortcut={shortcutText()} onWarm={warm} onOpen={() => executeCatalogCommand('resources.toggle', { via: 'button' })} />\n )}\n </>\n );\n}\n\n/**\n * The rail-foot button. The shell passes its own rail classes so the button\n * is indistinguishable from its neighbours (no tooltip while the rail's\n * labelled mode already shows the name).\n */\nexport function ResourcesRailButton({ expanded, buttonClass, iconClass, labelClass }: {\n expanded: boolean;\n buttonClass: string | undefined;\n iconClass: string | undefined;\n labelClass: string | undefined;\n}) {\n const resources = useResourcesUi();\n const label = resourcesLabel(resources.summary);\n return (\n <Tooltip label={label} shortcut={shortcutText()} placement=\"right\" disabled={expanded}>\n <button\n type=\"button\"\n className={buttonClass}\n aria-label={label}\n aria-expanded={resources.open}\n data-resources-rail\n onPointerEnter={warm}\n onClick={() => executeCatalogCommand('resources.toggle', { via: 'button' })}\n >\n <span className={iconClass}>\n <ResourcesIcon />\n <ResourcesDot summary={resources.summary} rail />\n </span>\n {expanded ? <span className={labelClass}>Resources</span> : null}\n </button>\n </Tooltip>\n );\n}\n"],"file":"ResourcesChrome-BnhnEdJe.js"}
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,i as n,n as r}from"./index-BG177cPN.js";import{m as i,p as a}from"./global-CXHHMz9o.js";import{t as o}from"./focus-trap-BGOceFvj.js";import{D as s,Ft as c,L as l,Mt as u,Rt as d,Vt as f,_n as p,in as m,jt as h,lt as g,zt as _}from"./VerseConsoleApp-DeuBEvAO.js";import{y as v}from"./format-DEAaVF6X.js";import{a as y,i as b,t as x}from"./CapacityStrip-Bx4c3dxD.js";import{E as S,T as C,l as w,n as ee,o as te,r as ne,t as T,w as re}from"./capacity-strip-model-C7cdQnuK.js";import{n as E,t as D}from"./Button-OjVJSrFq.js";import{C as ie,_ as ae,c as O}from"./icons-D4s-jlxX.js";import{a as oe}from"./command-catalog-CmrHNFzh.js";import{a as k,h as A,r as j}from"./cloud-model-DoxBMDvx.js";import{a as M,i as N}from"./fleet-queries-tU6UEXN2.js";import{a as P,s as se}from"./usage-queries-MnUeYzwp.js";import{t as F}from"./local-model-C9xNi9fN.js";import{a as I,i as L,n as R,o as z,r as B}from"./ResourcesChrome-C2ZrA7la.js";import{t as V}from"./apps-model-CFGCUu9p.js";var H=t(e(),1),ce=t(n(),1),U={backdrop:`_backdrop_160d3_8`,fade:`_fade_160d3_1`,panel:`_panel_160d3_18`,slide:`_slide_160d3_1`,head:`_head_160d3_49`,headText:`_headText_160d3_60`,title:`_title_160d3_67`,headline:`_headline_160d3_76`,headActions:`_headActions_160d3_83`,body:`_body_160d3_92`,group:`_group_160d3_100`,groupTitle:`_groupTitle_160d3_102`,cards:`_cards_160d3_113`,card:`_card_160d3_113`,cardHead:`_cardHead_160d3_138`,cardName:`_cardName_160d3_145`,plan:`_plan_160d3_157`,status:`_status_160d3_165`,statusDot:`_statusDot_160d3_180`,statusLabel:`_statusLabel_160d3_192`,statusDetail:`_statusDetail_160d3_197`,stamp:`_stamp_160d3_199`,subtle:`_subtle_160d3_200`,fine:`_fine_160d3_201`,reserveLine:`_reserveLine_160d3_202`,meters:`_meters_160d3_214`,meter:`_meter_160d3_214`,meterLabel:`_meterLabel_160d3_236`,meterTrack:`_meterTrack_160d3_243`,meterFill:`_meterFill_160d3_257`,meterReserve:`_meterReserve_160d3_266`,meterTick:`_meterTick_160d3_276`,meterValue:`_meterValue_160d3_284`,meterReset:`_meterReset_160d3_293`,cardActions:`_cardActions_160d3_301`,note:`_note_160d3_308`,pill:`_pill_160d3_316`,runtime:`_runtime_160d3_334`,runtimeHead:`_runtimeHead_160d3_343`,runtimeName:`_runtimeName_160d3_351`,models:`_models_160d3_353`,model:`_model_160d3_353`,modelName:`_modelName_160d3_373`,modelDetail:`_modelDetail_160d3_380`,modelFacts:`_modelFacts_160d3_386`,creditsHead:`_creditsHead_160d3_398`,creditsAmount:`_creditsAmount_160d3_406`,external:`_external_160d3_416`,foot:`_foot_160d3_434`,linkButton:`_linkButton_160d3_441`,visuallyHidden:`_visuallyHidden_160d3_456`},W=r(),G=20;function K({credits:e,sessions:t}){return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`p`,{className:U.status,"data-tone":`warning`,title:A(e.remainingUsd),children:[(0,W.jsx)(`span`,{className:U.statusDot,"aria-hidden":`true`}),(0,W.jsx)(`span`,{className:U.statusLabel,children:j}),(0,W.jsxs)(`span`,{className:U.subtle,children:[`· `,k(e.remainingUsd)]}),(0,W.jsx)(`span`,{className:U.pill,"data-tone":`neutral`,title:e.estimateNote,children:`estimate`})]}),(0,W.jsx)(`p`,{className:U.subtle,children:e.seatReason??q}),(0,W.jsx)(`p`,{className:U.subtle,children:t})]})}var q=`The Claude seat isn't set up on this Mac.`;function J({credits:e}){let t=e.remainingPercent,n=t<=0?`limit`:t<G?`tight`:`ok`,r=`${L(e.remainingUsd)} of ${L(e.totalUsd)} left`,i=[`${e.running} running`,e.maxSessionsPerDay===null?`${e.sessionsToday} today`:`${e.sessionsToday} of ${e.maxSessionsPerDay} today`].join(` · `);if(!e.seatReady)return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(K,{credits:e,sessions:i}),(0,W.jsx)(`p`,{className:U.fine,children:e.estimateNote}),(0,W.jsx)(Y,{href:e.balanceUrl})]});let a=e.canLaunch?null:e.canLaunchReason;return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`p`,{className:U.creditsHead,children:[(0,W.jsx)(`span`,{className:U.creditsAmount,children:r}),(0,W.jsx)(`span`,{className:U.pill,"data-tone":`neutral`,title:e.estimateNote,children:`estimate`})]}),(0,W.jsxs)(`div`,{className:U.meter,"data-level":n,"data-single":!0,children:[(0,W.jsx)(`span`,{className:U.meterTrack,role:`img`,"aria-label":`Cloud credits: an estimated ${L(e.remainingUsd)} of ${L(e.totalUsd)} left, ${s(t)}`,children:(0,W.jsx)(`span`,{className:U.meterFill,"data-kind":`left`,style:{width:`${Math.round(t)}%`}})}),(0,W.jsxs)(`span`,{className:U.meterValue,"aria-hidden":`true`,children:[s(t),` left`]})]}),(0,W.jsx)(`p`,{className:U.subtle,children:i}),a===null?null:(0,W.jsxs)(`p`,{className:U.status,"data-tone":`warning`,children:[(0,W.jsx)(`span`,{className:U.statusDot,"aria-hidden":`true`}),(0,W.jsx)(`span`,{children:a})]}),(0,W.jsx)(`p`,{className:U.fine,children:e.estimateNote}),(0,W.jsx)(Y,{href:e.balanceUrl})]})}function Y({href:e}){return(0,W.jsxs)(`a`,{className:U.external,href:e,target:`_blank`,rel:`noopener noreferrer`,children:[`Real balance on claude.ai`,(0,W.jsx)(O,{}),(0,W.jsx)(`span`,{className:U.visuallyHidden,children:` (opens in a new tab)`})]})}function le(){let e=a(B),t=i(B);l(t,R.cloud);let n=e.data===void 0&&e.status!==`error`,r=e.data?.available??!1,o=e.data?.credits??null;return(0,W.jsxs)(`li`,{className:U.card,"data-resource":`cloud`,"data-cloud":n?`loading`:r?o?`ready`:`unrecognised`:`unavailable`,children:[(0,W.jsxs)(`div`,{className:U.cardHead,children:[(0,W.jsx)(y,{monogram:`C`,engine:`claude`,size:`sm`}),(0,W.jsxs)(`h4`,{className:U.cardName,children:[(0,W.jsx)(`span`,{children:`Claude cloud credits`}),(0,W.jsx)(`span`,{className:U.plan,children:`claude.ai`})]})]}),n?(0,W.jsx)(`p`,{className:U.subtle,"aria-busy":`true`,children:`Reading cloud credits…`}):r?o===null?(0,W.jsx)(`p`,{className:U.subtle,children:`Unrecognized response — update Ashlr.`}):(0,W.jsx)(J,{credits:o}):(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`p`,{className:U.status,"data-tone":`neutral`,children:[(0,W.jsx)(`span`,{className:U.statusDot,"aria-hidden":`true`}),(0,W.jsx)(`span`,{className:U.statusLabel,children:`Cloud lane not available yet`})]}),(0,W.jsx)(`p`,{className:U.fine,children:`Credits show here once this build has the cloud lane.`})]})]})}var X=90,Z={"all-in":`all-in mode`,balanced:`balanced mode`,reserve:`reserve mode`};function Q(e){return Math.max(0,Math.min(100,Math.round(e)))}function $({status:e}){let t=[e.detail,e.usableAgain].filter(e=>e!==null&&e.length>0),n=[e.label,...t].join(` · `);return(0,W.jsxs)(`p`,{className:U.status,"data-tone":e.tone,"data-status":e.kind,title:n,children:[(0,W.jsx)(`span`,{className:U.statusDot,"aria-hidden":`true`}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`span`,{className:U.statusLabel,children:e.label}),t.map(e=>(0,W.jsx)(`span`,{className:U.statusDetail,children:` · ${e}`},e))]})]})}function ue({row:e,w:t,reservePercent:n}){let r=w(e,t,t.binding?n:null),i=t.binding&&n!==null&&n>0?100-Q(n):null,a=t.label.replace(/ window$/,``),o,c,l=0;return t.limitReached?(o=`limit`,c=`limit reached`,l=100):t.usedPercent===null?(o=`unknown`,c=`no reading`):(l=Q(t.usedPercent),o=l>=X?`tight`:`ok`,c=s(t.usedPercent)),(0,W.jsxs)(`div`,{className:U.meter,"data-binding":t.binding||void 0,"data-level":o,children:[(0,W.jsx)(`span`,{className:U.meterLabel,title:t.label,children:a.charAt(0).toUpperCase()+a.slice(1)}),(0,W.jsxs)(`span`,{className:U.meterTrack,role:`img`,"aria-label":r,"data-unknown":o===`unknown`||void 0,children:[i===null?null:(0,W.jsx)(`span`,{className:U.meterReserve,style:{left:`${i}%`,width:`${100-i}%`}}),o===`unknown`?null:(0,W.jsx)(`span`,{className:U.meterFill,style:{width:`${l}%`}}),i===null?null:(0,W.jsx)(`span`,{className:U.meterTick,style:{left:`${i}%`}})]}),(0,W.jsx)(`span`,{className:U.meterValue,"aria-hidden":`true`,children:c}),t.resetText===null?null:(0,W.jsx)(`span`,{className:U.meterReset,title:t.resetText,"aria-hidden":`true`,children:t.resetText})]})}function de({row:e,status:t,settled:n,mode:r,busy:i,onAction:a}){let o=V(e,n).filter(e=>e.kind!==`edit-budget`),s=e.reserve,c=s===null?null:s.percent!==null&&r!==null?`${s.label} · ${Z[r]}`:s.label;return(0,W.jsxs)(`li`,{className:U.card,"data-status":t.kind,"data-seat":e.seatId,"data-verse-anchor":`resources:${e.seatId}`,children:[(0,W.jsxs)(`div`,{className:U.cardHead,children:[(0,W.jsx)(y,{monogram:e.monogram,engine:e.engine,size:`sm`}),(0,W.jsxs)(`h4`,{className:U.cardName,children:[(0,W.jsx)(`span`,{title:e.label,children:e.label}),e.plan===null?null:(0,W.jsx)(`span`,{className:U.plan,children:e.plan})]})]}),(0,W.jsx)($,{status:t}),t.checked===null?null:(0,W.jsx)(`p`,{className:U.stamp,title:t.checkedTitle??void 0,children:t.checked}),e.windows.length>0?(0,W.jsx)(`div`,{className:U.meters,children:e.windows.map(t=>(0,W.jsx)(ue,{row:e,w:t,reservePercent:s?.percent??null},t.id))}):null,c!==null||e.credits!==null?(0,W.jsxs)(`p`,{className:U.reserveLine,children:[c===null?null:(0,W.jsx)(`span`,{title:s?.why,children:c}),c!==null&&e.credits!==null?` · `:null,e.credits===null?null:(0,W.jsx)(`span`,{children:e.credits})]}):null,o.length>0?(0,W.jsx)(`div`,{className:U.cardActions,children:o.map(t=>(0,W.jsx)(D,{size:`sm`,variant:t.primary?`primary`:`ghost`,busy:i?.seatId===e.seatId&&i.kind===t.kind,"aria-label":`${t.kind===`fix`?`Fix in Apps`:t.label}: ${e.label}`,onClick:()=>a(e,t),children:t.kind===`fix`?`Fix in Apps`:t.label},t.kind))}):null]})}var fe=`Every local agent turn in flight is answered by this process. Stopping it ends those turns — nothing in flight is rolled back, and no local seat can take a new turn until it is running again.`;function pe({status:e,onOpenUsage:t,now:n}){let r=a(P),o=a(M),s=i(P),c=i(M);l(s,R.local),l(c,R.runtime);let[d,f]=(0,H.useState)(null),[p,m]=(0,H.useState)(null),h=r.data?.available?F(se(r.data.raw),n):null,g=z(o.data?.value??null),_=r.data===void 0&&r.status!==`error`,b=h?.rows??[],x=b.slice(0,6),S=b.length-x.length,C=e=>{let t=e===`start`?`Start`:`Stop`;f(null),u({title:`Stop the serving runtime?`,body:fe,confirmLabel:`Stop runtime`,destructive:!0,skipConfirm:e===`start`,token:!0,tokenReason:`${t===`Start`?`Starting`:`Stopping`} the serving runtime requires the dispatch token.`,run:async()=>{m(e);try{let t=await N(e);f({tone:`neutral`,text:(t.note?v(t.note):``)||(e===`start`?`Runtime starting.`:`Runtime stopped.`)})}finally{m(null)}},onError:e=>f({tone:`danger`,text:e})})};return(0,W.jsxs)(`li`,{className:U.card,"data-resource":`local`,"data-status":e?.kind,children:[(0,W.jsxs)(`div`,{className:U.cardHead,children:[(0,W.jsx)(y,{monogram:`L`,engine:`local`,size:`sm`}),(0,W.jsxs)(`h4`,{className:U.cardName,children:[(0,W.jsx)(`span`,{children:`Local models`}),(0,W.jsx)(`span`,{className:U.plan,children:`this machine`})]})]}),e===null?h!==null&&!h.reachable?(0,W.jsxs)(`p`,{className:U.status,"data-tone":`neutral`,children:[(0,W.jsx)(`span`,{className:U.statusDot,"aria-hidden":`true`}),(0,W.jsx)(`span`,{className:U.statusLabel,children:`No local runtime answering`})]}):null:(0,W.jsx)($,{status:e}),g===null?null:(0,W.jsxs)(`div`,{className:U.runtime,"data-runtime-state":g.state,children:[(0,W.jsxs)(`p`,{className:U.runtimeHead,children:[(0,W.jsx)(`span`,{className:U.runtimeName,children:g.name}),(0,W.jsx)(`span`,{className:U.pill,"data-tone":g.tone,children:g.word})]}),g.detail===null?null:(0,W.jsx)(`p`,{className:U.subtle,title:g.detail,children:g.detail}),g.canStart||g.canStop?(0,W.jsxs)(`div`,{className:U.cardActions,children:[g.canStart?(0,W.jsx)(D,{size:`sm`,variant:`primary`,busy:p===`start`,"aria-label":`Start ${g.name}`,onClick:()=>C(`start`),children:`Start`}):null,g.canStop?(0,W.jsx)(D,{size:`sm`,variant:`subtle`,busy:p===`stop`,"aria-label":`Stop ${g.name}`,onClick:()=>C(`stop`),children:`Stop`}):null]}):g.managedElsewhere?(0,W.jsx)(`p`,{className:U.subtle,children:`Started and stopped outside Verse.`}):null]}),_?(0,W.jsx)(`p`,{className:U.subtle,"aria-busy":`true`,children:`Reading local models…`}):r.data?.available?h===null||b.length===0?(0,W.jsx)(`p`,{className:U.subtle,children:h?.reachable?`No models installed.`:`Start Ollama or llama-server to use local models.`}):(0,W.jsx)(`ul`,{className:U.models,"aria-label":`Local models`,children:x.map(e=>{let t=I(e);return(0,W.jsxs)(`li`,{className:U.model,"data-resident":e.resident||void 0,children:[(0,W.jsxs)(`span`,{className:U.modelName,title:e.name,children:[e.displayName,e.nameDetail?(0,W.jsxs)(`span`,{className:U.modelDetail,children:[` `,e.nameDetail]}):null]}),(0,W.jsxs)(`span`,{className:U.modelFacts,children:[e.resident?(0,W.jsx)(`span`,{className:U.pill,"data-tone":`success`,children:`Loaded`}):null,t===null?null:(0,W.jsx)(`span`,{title:e.contextTruncated?`Configured below the model’s native window`:void 0,children:t})]})]},`${e.runtime??`local`}:${e.name}`)})}):(0,W.jsx)(`p`,{className:U.subtle,children:`Local model details are not available from this server yet.`}),S>0?(0,W.jsx)(`button`,{type:`button`,className:U.linkButton,onClick:t,children:`${S} more in Usage`}):null,(0,W.jsx)(`p`,{className:d?U.note:U.visuallyHidden,"data-tone":d?.tone,role:`status`,"aria-live":`polite`,children:d?.text??``})]})}var me=`No accounts connected yet. Sign in to Claude Code, Codex or Grok in a terminal — they show up here within a minute.`;function he({pinned:e}){return(0,W.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:e?`currentColor`:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinejoin:`round`,strokeLinecap:`round`,"aria-hidden":`true`,focusable:`false`,children:[(0,W.jsx)(`path`,{d:`M6 2.5h4l-.5 4 2.25 2.25H4.25L6.5 6.5z`}),(0,W.jsx)(`path`,{d:`M8 8.75v4.75`,fill:`none`})]})}function ge({mode:e,compact:t=!1,now:n}){let r=(0,H.useId)(),a=(0,H.useRef)(null),s=e===`overlay`,d=b(),[f,v]=(0,H.useState)(()=>Date.now());l(()=>v(Date.now()),x,{enabled:n===void 0});let y=n??f,w=d.health!==null,[D,O]=(0,H.useState)(null),[k,A]=(0,H.useState)(null),j=i(S),N=i(P),se=i(M),F=i(B),I=(0,H.useMemo)(()=>ee(d.seats,{health:d.health,budget:d.budget,now:y}),[d.seats,d.health,d.budget,y]),L=(0,H.useMemo)(()=>te(I.filter(e=>e.kind===`subscription`),{healthRead:w,now:y}),[I,w,y]),R=I.find(e=>e.kind===`local`)??null,z=d.budget?.mode??null,V=(0,H.useCallback)(()=>{c()},[]),G=(0,H.useCallback)(()=>{h()||document.querySelector(`[aria-modal="true"]:not([data-verse-overlay])`)||c()},[]);o({open:s,containerRef:a,onClose:G}),(0,H.useEffect)(()=>{if(s)return()=>{window.setTimeout(()=>{let e=document.activeElement;(e===null||e===document.body)&&document.querySelector(`[data-resources-handle]`)?.focus({preventScroll:!0})},0)}},[s]);let K=(e,t=null)=>{s&&c(),g(e,t)},q=(e,t)=>{if(A(null),t.kind===`fix`||t.kind===`edit-budget`){K(`apps`,`seat:${e.seatId}`);return}let n=t.kind===`reconnect`;u({title:n?`Reconnect ${e.label}?`:`Check ${e.label} again?`,body:``,confirmLabel:t.label,destructive:!1,skipConfirm:!0,token:!0,tokenReason:n?`Open the sign-in for ${e.label} in Terminal`:`Check ${e.label} again (status commands only — nothing is spent)`,run:async()=>{O({seatId:e.seatId,kind:t.kind});try{n?await re(e.seatId):await C()}finally{O(null)}},onDone:()=>A({tone:`neutral`,text:n?`Opened the sign-in for ${e.label} in Terminal. Finish it there; this drawer picks it up.`:`Checked ${e.label} again.`}),onError:e=>A({tone:`danger`,text:e})})},J=()=>{A(null),j(),N(),se(),F(),v(Date.now())},Y=oe(`resources.toggle`)?.keys[0],X=Y?p(Y):void 0,Z=!t,Q=e===`docked`,$=(0,W.jsxs)(`div`,{ref:a,className:U.panel,"data-mode":e,"data-presentation":t?`full`:`side`,"data-verse-overlay":`resources`,...s?{role:`dialog`,"aria-modal":!0,"aria-labelledby":r,tabIndex:-1}:{role:`complementary`,"aria-labelledby":r},children:[(0,W.jsxs)(`header`,{className:U.head,children:[(0,W.jsxs)(`div`,{className:U.headText,children:[(0,W.jsx)(`h2`,{id:r,className:U.title,children:`Resources`}),!d.loading&&I.length>0?(0,W.jsx)(`p`,{className:U.headline,children:ne(I)}):null]}),(0,W.jsxs)(`div`,{className:U.headActions,children:[(0,W.jsx)(m,{label:`Read everything again`,placement:`bottom`,children:(0,W.jsx)(E,{variant:`ghost`,size:`sm`,icon:(0,W.jsx)(ae,{}),"aria-label":`Read everything again`,onClick:J})}),Z?(0,W.jsx)(m,{label:Q?`Unpin — float over the page`:`Pin beside the page`,placement:`bottom`,children:(0,W.jsx)(E,{variant:`ghost`,size:`sm`,icon:(0,W.jsx)(he,{pinned:Q}),"aria-label":Q?`Unpin resources`:`Pin resources beside the page`,"aria-pressed":Q,"data-resources-pin":!0,onClick:()=>_(!Q)})}):null,(0,W.jsx)(m,{label:`Close resources`,shortcut:X,placement:`bottom`,children:(0,W.jsx)(E,{variant:`ghost`,size:`sm`,icon:(0,W.jsx)(ie,{}),"aria-label":`Close resources`,onClick:V})})]})]}),(0,W.jsxs)(`div`,{className:U.body,children:[(0,W.jsxs)(`section`,{className:U.group,"aria-labelledby":`${r}-accounts`,children:[(0,W.jsx)(`h3`,{id:`${r}-accounts`,className:U.groupTitle,children:`Accounts`}),d.loading?(0,W.jsx)(`p`,{className:U.subtle,"aria-busy":`true`,children:`Reading accounts…`}):L.length===0?(0,W.jsx)(`p`,{className:U.subtle,children:me}):(0,W.jsx)(`ul`,{className:U.cards,children:L.map(e=>{let t=T(e,{healthRead:w,now:y}),n=D?.seatId===e.seatId&&D.kind===`check-again`?T(e,{healthRead:w,now:y,checking:!0}):t;return(0,W.jsx)(de,{row:e,status:n,settled:t,mode:z,busy:D,onAction:q},e.seatId)})}),(0,W.jsx)(`p`,{className:k?U.note:U.visuallyHidden,"data-tone":k?.tone,role:`status`,"aria-live":`polite`,children:k?.text??``})]}),(0,W.jsxs)(`section`,{className:U.group,"aria-labelledby":`${r}-local`,children:[(0,W.jsx)(`h3`,{id:`${r}-local`,className:U.groupTitle,children:`Local`}),(0,W.jsx)(`ul`,{className:U.cards,children:(0,W.jsx)(pe,{status:R?T(R,{healthRead:w,now:y}):null,onOpenUsage:()=>K(`usage`),now:y})})]}),(0,W.jsxs)(`section`,{className:U.group,"aria-labelledby":`${r}-cloud`,children:[(0,W.jsx)(`h3`,{id:`${r}-cloud`,className:U.groupTitle,children:`Cloud`}),(0,W.jsx)(`ul`,{className:U.cards,children:(0,W.jsx)(le,{})})]})]}),(0,W.jsxs)(`footer`,{className:U.foot,children:[(0,W.jsx)(`button`,{type:`button`,className:U.linkButton,onClick:()=>K(`apps`),children:`Apps & Accounts`}),(0,W.jsx)(`button`,{type:`button`,className:U.linkButton,onClick:()=>K(`usage`),children:`Usage`}),(0,W.jsx)(_e,{})]})]});return s?(0,ce.createPortal)((0,W.jsx)(`div`,{className:U.backdrop,"data-presentation":t?`full`:`side`,onMouseDown:e=>e.target===e.currentTarget&&V(),children:$}),document.body):$}function _e(){let{bar:e}=f();return(0,W.jsx)(`button`,{type:`button`,className:U.linkButton,style:{marginLeft:`auto`},"aria-pressed":e,onClick:()=>d(!e),children:e?`Hide resource bar`:`Show resource bar`})}export{me as RESOURCES_EMPTY_TEXT,ge as ResourcesDrawer};
2
- //# sourceMappingURL=ResourcesDrawer-BC93fzwQ.js.map
1
+ import{a as e,c as t,i as n,n as r}from"./index-CyK31YRm.js";import{h as i,m as a}from"./global-y_exIyAP.js";import{t as o}from"./focus-trap-ChZ5EFfM.js";import{D as s,Ft as c,L as l,Mt as u,Rt as d,Vt as f,_n as p,in as m,jt as h,lt as g,zt as _}from"./VerseConsoleApp-DXDv1aOi.js";import{y as v}from"./format-BmH2yWL6.js";import{a as y,i as b,t as x}from"./CapacityStrip-DKbKA_Aa.js";import{E as S,T as C,l as w,n as ee,o as te,r as ne,t as T,w as re}from"./capacity-strip-model-5ViUgUlP.js";import{n as E,t as D}from"./Button-DtE0rlWD.js";import{C as ie,_ as ae,c as O}from"./icons-CygCEFWs.js";import{a as oe}from"./command-catalog-ffCAijVY.js";import{a as k,h as A,r as j}from"./cloud-model-CfRydq8N.js";import{a as M,i as N}from"./fleet-queries-BeEAqD6y.js";import{a as P,s as se}from"./usage-queries-pXxvy54x.js";import{t as F}from"./local-model-C9xNi9fN.js";import{a as I,i as L,n as R,o as z,r as B}from"./ResourcesChrome-BnhnEdJe.js";import{t as V}from"./apps-model-CHO133qt.js";var H=t(e(),1),ce=t(n(),1),U={backdrop:`_backdrop_160d3_8`,fade:`_fade_160d3_1`,panel:`_panel_160d3_18`,slide:`_slide_160d3_1`,head:`_head_160d3_49`,headText:`_headText_160d3_60`,title:`_title_160d3_67`,headline:`_headline_160d3_76`,headActions:`_headActions_160d3_83`,body:`_body_160d3_92`,group:`_group_160d3_100`,groupTitle:`_groupTitle_160d3_102`,cards:`_cards_160d3_113`,card:`_card_160d3_113`,cardHead:`_cardHead_160d3_138`,cardName:`_cardName_160d3_145`,plan:`_plan_160d3_157`,status:`_status_160d3_165`,statusDot:`_statusDot_160d3_180`,statusLabel:`_statusLabel_160d3_192`,statusDetail:`_statusDetail_160d3_197`,stamp:`_stamp_160d3_199`,subtle:`_subtle_160d3_200`,fine:`_fine_160d3_201`,reserveLine:`_reserveLine_160d3_202`,meters:`_meters_160d3_214`,meter:`_meter_160d3_214`,meterLabel:`_meterLabel_160d3_236`,meterTrack:`_meterTrack_160d3_243`,meterFill:`_meterFill_160d3_257`,meterReserve:`_meterReserve_160d3_266`,meterTick:`_meterTick_160d3_276`,meterValue:`_meterValue_160d3_284`,meterReset:`_meterReset_160d3_293`,cardActions:`_cardActions_160d3_301`,note:`_note_160d3_308`,pill:`_pill_160d3_316`,runtime:`_runtime_160d3_334`,runtimeHead:`_runtimeHead_160d3_343`,runtimeName:`_runtimeName_160d3_351`,models:`_models_160d3_353`,model:`_model_160d3_353`,modelName:`_modelName_160d3_373`,modelDetail:`_modelDetail_160d3_380`,modelFacts:`_modelFacts_160d3_386`,creditsHead:`_creditsHead_160d3_398`,creditsAmount:`_creditsAmount_160d3_406`,external:`_external_160d3_416`,foot:`_foot_160d3_434`,linkButton:`_linkButton_160d3_441`,visuallyHidden:`_visuallyHidden_160d3_456`},W=r(),G=20;function K({credits:e,sessions:t}){return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`p`,{className:U.status,"data-tone":`warning`,title:A(e.remainingUsd),children:[(0,W.jsx)(`span`,{className:U.statusDot,"aria-hidden":`true`}),(0,W.jsx)(`span`,{className:U.statusLabel,children:j}),(0,W.jsxs)(`span`,{className:U.subtle,children:[`· `,k(e.remainingUsd)]}),(0,W.jsx)(`span`,{className:U.pill,"data-tone":`neutral`,title:e.estimateNote,children:`estimate`})]}),(0,W.jsx)(`p`,{className:U.subtle,children:e.seatReason??q}),(0,W.jsx)(`p`,{className:U.subtle,children:t})]})}var q=`The Claude seat isn't set up on this Mac.`;function J({credits:e}){let t=e.remainingPercent,n=t<=0?`limit`:t<G?`tight`:`ok`,r=`${L(e.remainingUsd)} of ${L(e.totalUsd)} left`,i=[`${e.running} running`,e.maxSessionsPerDay===null?`${e.sessionsToday} today`:`${e.sessionsToday} of ${e.maxSessionsPerDay} today`].join(` · `);if(!e.seatReady)return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(K,{credits:e,sessions:i}),(0,W.jsx)(`p`,{className:U.fine,children:e.estimateNote}),(0,W.jsx)(Y,{href:e.balanceUrl})]});let a=e.canLaunch?null:e.canLaunchReason;return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`p`,{className:U.creditsHead,children:[(0,W.jsx)(`span`,{className:U.creditsAmount,children:r}),(0,W.jsx)(`span`,{className:U.pill,"data-tone":`neutral`,title:e.estimateNote,children:`estimate`})]}),(0,W.jsxs)(`div`,{className:U.meter,"data-level":n,"data-single":!0,children:[(0,W.jsx)(`span`,{className:U.meterTrack,role:`img`,"aria-label":`Cloud credits: an estimated ${L(e.remainingUsd)} of ${L(e.totalUsd)} left, ${s(t)}`,children:(0,W.jsx)(`span`,{className:U.meterFill,"data-kind":`left`,style:{width:`${Math.round(t)}%`}})}),(0,W.jsxs)(`span`,{className:U.meterValue,"aria-hidden":`true`,children:[s(t),` left`]})]}),(0,W.jsx)(`p`,{className:U.subtle,children:i}),a===null?null:(0,W.jsxs)(`p`,{className:U.status,"data-tone":`warning`,children:[(0,W.jsx)(`span`,{className:U.statusDot,"aria-hidden":`true`}),(0,W.jsx)(`span`,{children:a})]}),(0,W.jsx)(`p`,{className:U.fine,children:e.estimateNote}),(0,W.jsx)(Y,{href:e.balanceUrl})]})}function Y({href:e}){return(0,W.jsxs)(`a`,{className:U.external,href:e,target:`_blank`,rel:`noopener noreferrer`,children:[`Real balance on claude.ai`,(0,W.jsx)(O,{}),(0,W.jsx)(`span`,{className:U.visuallyHidden,children:` (opens in a new tab)`})]})}function le(){let e=a(B),t=i(B);l(t,R.cloud);let n=e.data===void 0&&e.status!==`error`,r=e.data?.available??!1,o=e.data?.credits??null;return(0,W.jsxs)(`li`,{className:U.card,"data-resource":`cloud`,"data-cloud":n?`loading`:r?o?`ready`:`unrecognised`:`unavailable`,children:[(0,W.jsxs)(`div`,{className:U.cardHead,children:[(0,W.jsx)(y,{monogram:`C`,engine:`claude`,size:`sm`}),(0,W.jsxs)(`h4`,{className:U.cardName,children:[(0,W.jsx)(`span`,{children:`Claude cloud credits`}),(0,W.jsx)(`span`,{className:U.plan,children:`claude.ai`})]})]}),n?(0,W.jsx)(`p`,{className:U.subtle,"aria-busy":`true`,children:`Reading cloud credits…`}):r?o===null?(0,W.jsx)(`p`,{className:U.subtle,children:`Unrecognized response — update Ashlr.`}):(0,W.jsx)(J,{credits:o}):(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`p`,{className:U.status,"data-tone":`neutral`,children:[(0,W.jsx)(`span`,{className:U.statusDot,"aria-hidden":`true`}),(0,W.jsx)(`span`,{className:U.statusLabel,children:`Cloud lane not available yet`})]}),(0,W.jsx)(`p`,{className:U.fine,children:`Credits show here once this build has the cloud lane.`})]})]})}var X=90,Z={"all-in":`all-in mode`,balanced:`balanced mode`,reserve:`reserve mode`};function Q(e){return Math.max(0,Math.min(100,Math.round(e)))}function $({status:e}){let t=[e.detail,e.usableAgain].filter(e=>e!==null&&e.length>0),n=[e.label,...t].join(` · `);return(0,W.jsxs)(`p`,{className:U.status,"data-tone":e.tone,"data-status":e.kind,title:n,children:[(0,W.jsx)(`span`,{className:U.statusDot,"aria-hidden":`true`}),(0,W.jsxs)(`span`,{children:[(0,W.jsx)(`span`,{className:U.statusLabel,children:e.label}),t.map(e=>(0,W.jsx)(`span`,{className:U.statusDetail,children:` · ${e}`},e))]})]})}function ue({row:e,w:t,reservePercent:n}){let r=w(e,t,t.binding?n:null),i=t.binding&&n!==null&&n>0?100-Q(n):null,a=t.label.replace(/ window$/,``),o,c,l=0;return t.limitReached?(o=`limit`,c=`limit reached`,l=100):t.usedPercent===null?(o=`unknown`,c=`no reading`):(l=Q(t.usedPercent),o=l>=X?`tight`:`ok`,c=s(t.usedPercent)),(0,W.jsxs)(`div`,{className:U.meter,"data-binding":t.binding||void 0,"data-level":o,children:[(0,W.jsx)(`span`,{className:U.meterLabel,title:t.label,children:a.charAt(0).toUpperCase()+a.slice(1)}),(0,W.jsxs)(`span`,{className:U.meterTrack,role:`img`,"aria-label":r,"data-unknown":o===`unknown`||void 0,children:[i===null?null:(0,W.jsx)(`span`,{className:U.meterReserve,style:{left:`${i}%`,width:`${100-i}%`}}),o===`unknown`?null:(0,W.jsx)(`span`,{className:U.meterFill,style:{width:`${l}%`}}),i===null?null:(0,W.jsx)(`span`,{className:U.meterTick,style:{left:`${i}%`}})]}),(0,W.jsx)(`span`,{className:U.meterValue,"aria-hidden":`true`,children:c}),t.resetText===null?null:(0,W.jsx)(`span`,{className:U.meterReset,title:t.resetText,"aria-hidden":`true`,children:t.resetText})]})}function de({row:e,status:t,settled:n,mode:r,busy:i,onAction:a}){let o=V(e,n).filter(e=>e.kind!==`edit-budget`),s=e.reserve,c=s===null?null:s.percent!==null&&r!==null?`${s.label} · ${Z[r]}`:s.label;return(0,W.jsxs)(`li`,{className:U.card,"data-status":t.kind,"data-seat":e.seatId,"data-verse-anchor":`resources:${e.seatId}`,children:[(0,W.jsxs)(`div`,{className:U.cardHead,children:[(0,W.jsx)(y,{monogram:e.monogram,engine:e.engine,size:`sm`}),(0,W.jsxs)(`h4`,{className:U.cardName,children:[(0,W.jsx)(`span`,{title:e.label,children:e.label}),e.plan===null?null:(0,W.jsx)(`span`,{className:U.plan,children:e.plan})]})]}),(0,W.jsx)($,{status:t}),t.checked===null?null:(0,W.jsx)(`p`,{className:U.stamp,title:t.checkedTitle??void 0,children:t.checked}),e.windows.length>0?(0,W.jsx)(`div`,{className:U.meters,children:e.windows.map(t=>(0,W.jsx)(ue,{row:e,w:t,reservePercent:s?.percent??null},t.id))}):null,c!==null||e.credits!==null?(0,W.jsxs)(`p`,{className:U.reserveLine,children:[c===null?null:(0,W.jsx)(`span`,{title:s?.why,children:c}),c!==null&&e.credits!==null?` · `:null,e.credits===null?null:(0,W.jsx)(`span`,{children:e.credits})]}):null,o.length>0?(0,W.jsx)(`div`,{className:U.cardActions,children:o.map(t=>(0,W.jsx)(D,{size:`sm`,variant:t.primary?`primary`:`ghost`,busy:i?.seatId===e.seatId&&i.kind===t.kind,"aria-label":`${t.kind===`fix`?`Fix in Apps`:t.label}: ${e.label}`,onClick:()=>a(e,t),children:t.kind===`fix`?`Fix in Apps`:t.label},t.kind))}):null]})}var fe=`Every local agent turn in flight is answered by this process. Stopping it ends those turns — nothing in flight is rolled back, and no local seat can take a new turn until it is running again.`;function pe({status:e,onOpenUsage:t,now:n}){let r=a(P),o=a(M),s=i(P),c=i(M);l(s,R.local),l(c,R.runtime);let[d,f]=(0,H.useState)(null),[p,m]=(0,H.useState)(null),h=r.data?.available?F(se(r.data.raw),n):null,g=z(o.data?.value??null),_=r.data===void 0&&r.status!==`error`,b=h?.rows??[],x=b.slice(0,6),S=b.length-x.length,C=e=>{let t=e===`start`?`Start`:`Stop`;f(null),u({title:`Stop the serving runtime?`,body:fe,confirmLabel:`Stop runtime`,destructive:!0,skipConfirm:e===`start`,token:!0,tokenReason:`${t===`Start`?`Starting`:`Stopping`} the serving runtime requires the dispatch token.`,run:async()=>{m(e);try{let t=await N(e);f({tone:`neutral`,text:(t.note?v(t.note):``)||(e===`start`?`Runtime starting.`:`Runtime stopped.`)})}finally{m(null)}},onError:e=>f({tone:`danger`,text:e})})};return(0,W.jsxs)(`li`,{className:U.card,"data-resource":`local`,"data-status":e?.kind,children:[(0,W.jsxs)(`div`,{className:U.cardHead,children:[(0,W.jsx)(y,{monogram:`L`,engine:`local`,size:`sm`}),(0,W.jsxs)(`h4`,{className:U.cardName,children:[(0,W.jsx)(`span`,{children:`Local models`}),(0,W.jsx)(`span`,{className:U.plan,children:`this machine`})]})]}),e===null?h!==null&&!h.reachable?(0,W.jsxs)(`p`,{className:U.status,"data-tone":`neutral`,children:[(0,W.jsx)(`span`,{className:U.statusDot,"aria-hidden":`true`}),(0,W.jsx)(`span`,{className:U.statusLabel,children:`No local runtime answering`})]}):null:(0,W.jsx)($,{status:e}),g===null?null:(0,W.jsxs)(`div`,{className:U.runtime,"data-runtime-state":g.state,children:[(0,W.jsxs)(`p`,{className:U.runtimeHead,children:[(0,W.jsx)(`span`,{className:U.runtimeName,children:g.name}),(0,W.jsx)(`span`,{className:U.pill,"data-tone":g.tone,children:g.word})]}),g.detail===null?null:(0,W.jsx)(`p`,{className:U.subtle,title:g.detail,children:g.detail}),g.canStart||g.canStop?(0,W.jsxs)(`div`,{className:U.cardActions,children:[g.canStart?(0,W.jsx)(D,{size:`sm`,variant:`primary`,busy:p===`start`,"aria-label":`Start ${g.name}`,onClick:()=>C(`start`),children:`Start`}):null,g.canStop?(0,W.jsx)(D,{size:`sm`,variant:`subtle`,busy:p===`stop`,"aria-label":`Stop ${g.name}`,onClick:()=>C(`stop`),children:`Stop`}):null]}):g.managedElsewhere?(0,W.jsx)(`p`,{className:U.subtle,children:`Started and stopped outside Verse.`}):null]}),_?(0,W.jsx)(`p`,{className:U.subtle,"aria-busy":`true`,children:`Reading local models…`}):r.data?.available?h===null||b.length===0?(0,W.jsx)(`p`,{className:U.subtle,children:h?.reachable?`No models installed.`:`Start Ollama or llama-server to use local models.`}):(0,W.jsx)(`ul`,{className:U.models,"aria-label":`Local models`,children:x.map(e=>{let t=I(e);return(0,W.jsxs)(`li`,{className:U.model,"data-resident":e.resident||void 0,children:[(0,W.jsxs)(`span`,{className:U.modelName,title:e.name,children:[e.displayName,e.nameDetail?(0,W.jsxs)(`span`,{className:U.modelDetail,children:[` `,e.nameDetail]}):null]}),(0,W.jsxs)(`span`,{className:U.modelFacts,children:[e.resident?(0,W.jsx)(`span`,{className:U.pill,"data-tone":`success`,children:`Loaded`}):null,t===null?null:(0,W.jsx)(`span`,{title:e.contextTruncated?`Configured below the model’s native window`:void 0,children:t})]})]},`${e.runtime??`local`}:${e.name}`)})}):(0,W.jsx)(`p`,{className:U.subtle,children:`Local model details are not available from this server yet.`}),S>0?(0,W.jsx)(`button`,{type:`button`,className:U.linkButton,onClick:t,children:`${S} more in Usage`}):null,(0,W.jsx)(`p`,{className:d?U.note:U.visuallyHidden,"data-tone":d?.tone,role:`status`,"aria-live":`polite`,children:d?.text??``})]})}var me=`No accounts connected yet. Sign in to Claude Code, Codex or Grok in a terminal — they show up here within a minute.`;function he({pinned:e}){return(0,W.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:e?`currentColor`:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinejoin:`round`,strokeLinecap:`round`,"aria-hidden":`true`,focusable:`false`,children:[(0,W.jsx)(`path`,{d:`M6 2.5h4l-.5 4 2.25 2.25H4.25L6.5 6.5z`}),(0,W.jsx)(`path`,{d:`M8 8.75v4.75`,fill:`none`})]})}function ge({mode:e,compact:t=!1,now:n}){let r=(0,H.useId)(),a=(0,H.useRef)(null),s=e===`overlay`,d=b(),[f,v]=(0,H.useState)(()=>Date.now());l(()=>v(Date.now()),x,{enabled:n===void 0});let y=n??f,w=d.health!==null,[D,O]=(0,H.useState)(null),[k,A]=(0,H.useState)(null),j=i(S),N=i(P),se=i(M),F=i(B),I=(0,H.useMemo)(()=>ee(d.seats,{health:d.health,budget:d.budget,now:y}),[d.seats,d.health,d.budget,y]),L=(0,H.useMemo)(()=>te(I.filter(e=>e.kind===`subscription`),{healthRead:w,now:y}),[I,w,y]),R=I.find(e=>e.kind===`local`)??null,z=d.budget?.mode??null,V=(0,H.useCallback)(()=>{c()},[]),G=(0,H.useCallback)(()=>{h()||document.querySelector(`[aria-modal="true"]:not([data-verse-overlay])`)||c()},[]);o({open:s,containerRef:a,onClose:G}),(0,H.useEffect)(()=>{if(s)return()=>{window.setTimeout(()=>{let e=document.activeElement;(e===null||e===document.body)&&document.querySelector(`[data-resources-handle]`)?.focus({preventScroll:!0})},0)}},[s]);let K=(e,t=null)=>{s&&c(),g(e,t)},q=(e,t)=>{if(A(null),t.kind===`fix`||t.kind===`edit-budget`){K(`apps`,`seat:${e.seatId}`);return}let n=t.kind===`reconnect`;u({title:n?`Reconnect ${e.label}?`:`Check ${e.label} again?`,body:``,confirmLabel:t.label,destructive:!1,skipConfirm:!0,token:!0,tokenReason:n?`Open the sign-in for ${e.label} in Terminal`:`Check ${e.label} again (status commands only — nothing is spent)`,run:async()=>{O({seatId:e.seatId,kind:t.kind});try{n?await re(e.seatId):await C()}finally{O(null)}},onDone:()=>A({tone:`neutral`,text:n?`Opened the sign-in for ${e.label} in Terminal. Finish it there; this drawer picks it up.`:`Checked ${e.label} again.`}),onError:e=>A({tone:`danger`,text:e})})},J=()=>{A(null),j(),N(),se(),F(),v(Date.now())},Y=oe(`resources.toggle`)?.keys[0],X=Y?p(Y):void 0,Z=!t,Q=e===`docked`,$=(0,W.jsxs)(`div`,{ref:a,className:U.panel,"data-mode":e,"data-presentation":t?`full`:`side`,"data-verse-overlay":`resources`,...s?{role:`dialog`,"aria-modal":!0,"aria-labelledby":r,tabIndex:-1}:{role:`complementary`,"aria-labelledby":r},children:[(0,W.jsxs)(`header`,{className:U.head,children:[(0,W.jsxs)(`div`,{className:U.headText,children:[(0,W.jsx)(`h2`,{id:r,className:U.title,children:`Resources`}),!d.loading&&I.length>0?(0,W.jsx)(`p`,{className:U.headline,children:ne(I)}):null]}),(0,W.jsxs)(`div`,{className:U.headActions,children:[(0,W.jsx)(m,{label:`Read everything again`,placement:`bottom`,children:(0,W.jsx)(E,{variant:`ghost`,size:`sm`,icon:(0,W.jsx)(ae,{}),"aria-label":`Read everything again`,onClick:J})}),Z?(0,W.jsx)(m,{label:Q?`Unpin — float over the page`:`Pin beside the page`,placement:`bottom`,children:(0,W.jsx)(E,{variant:`ghost`,size:`sm`,icon:(0,W.jsx)(he,{pinned:Q}),"aria-label":Q?`Unpin resources`:`Pin resources beside the page`,"aria-pressed":Q,"data-resources-pin":!0,onClick:()=>_(!Q)})}):null,(0,W.jsx)(m,{label:`Close resources`,shortcut:X,placement:`bottom`,children:(0,W.jsx)(E,{variant:`ghost`,size:`sm`,icon:(0,W.jsx)(ie,{}),"aria-label":`Close resources`,onClick:V})})]})]}),(0,W.jsxs)(`div`,{className:U.body,children:[(0,W.jsxs)(`section`,{className:U.group,"aria-labelledby":`${r}-accounts`,children:[(0,W.jsx)(`h3`,{id:`${r}-accounts`,className:U.groupTitle,children:`Accounts`}),d.loading?(0,W.jsx)(`p`,{className:U.subtle,"aria-busy":`true`,children:`Reading accounts…`}):L.length===0?(0,W.jsx)(`p`,{className:U.subtle,children:me}):(0,W.jsx)(`ul`,{className:U.cards,children:L.map(e=>{let t=T(e,{healthRead:w,now:y}),n=D?.seatId===e.seatId&&D.kind===`check-again`?T(e,{healthRead:w,now:y,checking:!0}):t;return(0,W.jsx)(de,{row:e,status:n,settled:t,mode:z,busy:D,onAction:q},e.seatId)})}),(0,W.jsx)(`p`,{className:k?U.note:U.visuallyHidden,"data-tone":k?.tone,role:`status`,"aria-live":`polite`,children:k?.text??``})]}),(0,W.jsxs)(`section`,{className:U.group,"aria-labelledby":`${r}-local`,children:[(0,W.jsx)(`h3`,{id:`${r}-local`,className:U.groupTitle,children:`Local`}),(0,W.jsx)(`ul`,{className:U.cards,children:(0,W.jsx)(pe,{status:R?T(R,{healthRead:w,now:y}):null,onOpenUsage:()=>K(`usage`),now:y})})]}),(0,W.jsxs)(`section`,{className:U.group,"aria-labelledby":`${r}-cloud`,children:[(0,W.jsx)(`h3`,{id:`${r}-cloud`,className:U.groupTitle,children:`Cloud`}),(0,W.jsx)(`ul`,{className:U.cards,children:(0,W.jsx)(le,{})})]})]}),(0,W.jsxs)(`footer`,{className:U.foot,children:[(0,W.jsx)(`button`,{type:`button`,className:U.linkButton,onClick:()=>K(`apps`),children:`Apps & Accounts`}),(0,W.jsx)(`button`,{type:`button`,className:U.linkButton,onClick:()=>K(`usage`),children:`Usage`}),(0,W.jsx)(_e,{})]})]});return s?(0,ce.createPortal)((0,W.jsx)(`div`,{className:U.backdrop,"data-presentation":t?`full`:`side`,onMouseDown:e=>e.target===e.currentTarget&&V(),children:$}),document.body):$}function _e(){let{bar:e}=f();return(0,W.jsx)(`button`,{type:`button`,className:U.linkButton,style:{marginLeft:`auto`},"aria-pressed":e,onClick:()=>d(!e),children:e?`Hide resource bar`:`Show resource bar`})}export{me as RESOURCES_EMPTY_TEXT,ge as ResourcesDrawer};
2
+ //# sourceMappingURL=ResourcesDrawer-BAFGodny.js.map