@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
@@ -1 +0,0 @@
1
- {"version":3,"file":"AutonomyOffState-CXhXpsim.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/fleet/dark-since.ts","../../../../../../src/web-ui/routes/verse/autonomy/autonomy-off-model.ts","../../../../../../src/web-ui/routes/verse/autonomy/autonomy-off.module.css","../../../../../../src/web-ui/routes/verse/autonomy/AutonomyOffState.tsx"],"sourcesContent":["/**\n * routes/verse/fleet/dark-since.ts — the ONE \"Fleet dark since …\" (3.10.1).\n *\n * 3.10.0 said it three ways: Command and Fleet took the live snapshot's\n * `lastActivityAt` (\"Sep 1\"), Growth took fleet history's `darkSince` (\"Aug\n * 18\"), and Command fell back to history whenever the live read was not dark.\n * Those are two different facts:\n *\n * dark since — autonomy is shut (no standing grant, or no daemon) and\n * the fleet last showed any sign of life then. Served once,\n * as `FleetLiveSnapshotV1.darkSince` (core/verse/\n * fleet-live-api.ts `fleetDarkSince`). Only this value may be\n * worded \"Fleet dark since …\".\n * quiet since — fleet history's `darkSince`: the last run started or\n * proposal filed. Worded \"Nothing produced since …\"\n * (`quietSinceStatus`), never \"dark\".\n *\n * Dates are the viewer's LOCAL calendar day everywhere (\"Sep 1\"), so the\n * verdict line and the chart beside it can never name different days.\n *\n * Framework-free; tested directly.\n */\nimport type { FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { asSentence } from '../autonomy/format.js';\n\n/**\n * The fleet's dark-since instant, or null when the fleet is not dark. A\n * pre-3.10.1 server sends no `darkSince`; the same rule is applied to what it\n * does send.\n */\nexport function fleetDarkSince(live: FleetLiveSnapshotV1 | null | undefined): string | null {\n if (!live) return null;\n if (live.darkSince !== undefined) return live.darkSince;\n return live.state === 'dark' ? live.lastActivityAt : null;\n}\n\n/** The viewer's local calendar day for an instant, as `YYYY-MM-DD`. */\nfunction localDay(ms: number): string {\n const d = new Date(ms);\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\n}\n\n/** \"Sep 1\" — the viewer's local day for `iso`. */\nexport function darkSinceLabel(iso: string): string {\n const ms = Date.parse(iso);\n if (!Number.isFinite(ms)) return 'an unknown day';\n return new Date(ms).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n}\n\n/**\n * `iso` as the viewer's local `YYYY-MM-DD`, for ChartFrame's dark state:\n * ChartFrame labels the day it is GIVEN (a bare ISO instant would be cut to\n * its UTC day, which an evening west of UTC turns into tomorrow).\n */\nexport function darkSinceDay(iso: string): string {\n const ms = Date.parse(iso);\n return Number.isFinite(ms) ? localDay(ms) : iso;\n}\n\n/**\n * The chart state for a DARK live fleet, from THE dark-since instant: \"Fleet\n * dark since Sep 1\" (the viewer's local day). When the server knows the fleet\n * is dark but not since when (`darkSince: null` — a fresh install, a cleared\n * ledger and journal), it says just \"Fleet dark.\", as Command's line does —\n * never \"since <today>\" from the snapshot's own `generatedAt`.\n */\nexport function fleetDarkStatus(live: FleetLiveSnapshotV1): ChartStatus {\n const since = fleetDarkSince(live);\n const detail = live.stateReason?.trim() || undefined;\n if (since !== null && Number.isFinite(Date.parse(since))) return { kind: 'dark', since: darkSinceDay(since), detail };\n if (!detail) return { kind: 'empty', message: 'Fleet dark.' };\n return { kind: 'empty', message: `Fleet dark. ${asSentence(detail)}` };\n}\n\n/**\n * A chart status built over fleet HISTORY, re-worded: history's `darkSince`\n * is \"quiet since\" (the last run or proposal), so its dark state becomes a\n * plain \"Nothing produced since Aug 18.\" Every other status passes\n * through untouched.\n */\nexport function quietSinceStatus(status: ChartStatus): ChartStatus {\n if (status.kind !== 'dark') return status;\n return { kind: 'empty', message: `Nothing produced since ${darkSinceLabel(status.since)}.` };\n}\n","/**\n * routes/verse/autonomy/autonomy-off-model.ts — the ONE \"autonomy is off\"\n * decision every fleet surface (Command, Fleet, Growth, Mind) renders.\n *\n * Before this, a dormant fleet showed up as a wall of identical empty cards\n * (\"No fleet runs or proposals since Aug 18.\" six times on Growth, five dashes\n * on Command). Each surface now asks this model once and, when it answers,\n * shows a single state that says what is off, why it matters, and the one\n * thing that turns it back on.\n *\n * Precedence (first match wins):\n * stopped — Stop is in force (authority `kill`, or the live view says so);\n * setup — no grant, and none can be drafted yet (the grant draft\n * answers `no-trust-roots` / `custody-key-unknown`): the one-time\n * `ashlr authority setup`;\n * grant — no grant, or it is paused, expired, revoked or invalid, and a\n * new one can be drafted: approve it (Touch ID, on Command);\n * off — a grant is in force but the switch holds autonomy at Off;\n * dark — the live view is dark for another reason (daemon not running);\n * paused — the daemon is parked;\n * quiet — autonomy is on but nothing was produced lately (fleet\n * history's \"quiet since\"); never worded \"dark\".\n * null — autonomy is on and producing (or nothing has answered yet).\n *\n * Only the live snapshot's `darkSince` may be worded \"Fleet dark since …\"\n * (fleet/dark-since.ts); history's date is \"Nothing produced since …\".\n *\n * Framework-free; tested directly.\n */\nimport type { AuthorityStatusV1 } from '../../../../core/authority/types.js';\nimport type { FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { WorkbenchSectionId } from '../../../../core/verse/workbench-types.js';\nimport { darkSinceLabel, fleetDarkSince } from '../fleet/dark-since.js';\n\n/** The single command that walks Mason through every setup step, resuming where it stopped. */\nexport const SETUP_COMMAND = 'ashlr authority setup';\n\nexport type AutonomyOffKind = 'stopped' | 'setup' | 'grant' | 'off' | 'dark' | 'paused' | 'quiet';\n\n/** One setup step the server can see (custody probe + grant). `null` = unknown. */\nexport interface SetupCheck {\n id: 'custody' | 'key' | 'github-app' | 'claude-token' | 'grant';\n label: string;\n done: boolean | null;\n}\n\nexport interface AutonomyOffState {\n kind: AutonomyOffKind;\n /** The dot: neutral for a fleet that was never switched on, warning for a lapse, danger for Stop. */\n tone: 'neutral' | 'warning' | 'danger';\n /** \"Autonomy is off\" — what is off, in three or four words. */\n title: string;\n /** Why it matters, one line. */\n why: string;\n /** \"Fleet dark since Sep 1\" / \"Nothing produced since Aug 18\"; null when no date is known. */\n since: string | null;\n /** The primary action when it is a command to run (copied, never executed). */\n command: string | null;\n /** The primary action when it is a place in the app. */\n go: { section: WorkbenchSectionId; anchor: string | null; label: string } | null;\n /** Command's own action: open the Touch ID sheet with this intent (it holds the sheet). */\n grant: { intent: 'grant' | 're-approve'; label: string } | null;\n /** Setup progress the server can see; [] when none of it is known. */\n checks: SetupCheck[];\n}\n\nexport interface AutonomyOffInputs {\n /** The authority read's value; null = the service did not answer. */\n authority: AuthorityStatusV1 | null;\n /** The live fleet read's value; null = the view did not answer. */\n live: FleetLiveSnapshotV1 | null;\n /** Fleet history's `darkSince` (\"quiet since\"); null = produced within 48 h, or unknown. */\n quietSince?: string | null;\n /** Whether a new grant can be drafted (`draftReadiness`); only consulted when there is no grant. */\n draft?: DraftReadiness;\n}\n\n/**\n * What GET /api/verse/authority/draft says about setup: `ready` — a grant can\n * be drafted, so approving it is the next step; `setup` — the build has no\n * trust root for this Mac's custody key yet, which only the one-time setup\n * fixes; `unknown` — any other answer (the Touch ID sheet shows its reason).\n */\nexport type DraftReadiness = 'ready' | 'setup' | 'unknown';\n\nconst SETUP_CODES: ReadonlySet<string> = new Set(['no-trust-roots', 'custody-key-unknown']);\n\nexport function draftReadiness(read: { value: unknown; code?: string | null } | undefined): DraftReadiness | undefined {\n if (!read) return undefined;\n if (read.value) return 'ready';\n return read.code && SETUP_CODES.has(read.code) ? 'setup' : 'unknown';\n}\n\nconst GO_COMMAND = { section: 'command', anchor: null, label: 'Open Command' } as const;\nconst GO_FLEET = { section: 'fleet', anchor: null, label: 'Open Fleet' } as const;\n\n/** The five setup facts the authority read carries. The CLI's own list is longer; this is what Verse can check. */\nexport function setupChecks(authority: AuthorityStatusV1): SetupCheck[] {\n const c = authority.custody;\n const checks: SetupCheck[] = [\n { id: 'custody', label: 'Custody helper', done: c.installed },\n { id: 'key', label: 'Signing key', done: c.keyInitialized },\n { id: 'github-app', label: 'GitHub App', done: c.githubApp },\n { id: 'claude-token', label: 'Claude token', done: c.claudeToken },\n { id: 'grant', label: 'Standing grant', done: authority.grant.state === 'active' },\n ];\n // Custody unreadable: four unknowns and a ✗ say nothing the title does not.\n return checks.slice(0, 4).every((s) => s.done === null) ? [] : checks;\n}\n\nfunction sentence(text: string | null | undefined): string | null {\n const t = text?.trim();\n if (!t) return null;\n return /[.!?…]$/.test(t) ? t : `${t}.`;\n}\n\nconst GRANT_TITLE = { paused: 'Grant paused', expired: 'Grant expired', revoked: 'Grant revoked', invalid: 'Grant invalid' } as const;\n\nexport function autonomyOffState({ authority, live, quietSince = null, draft = 'unknown' }: AutonomyOffInputs): AutonomyOffState | null {\n if (!authority && !live) return null;\n const dark = fleetDarkSince(live);\n const since = dark\n ? `Fleet dark since ${darkSinceLabel(dark)}`\n : quietSince\n ? `Nothing produced since ${darkSinceLabel(quietSince)}`\n : null;\n const base = { since, tone: 'neutral' as const, command: null, go: null, grant: null, checks: [] as SetupCheck[] };\n\n if (authority?.kill || live?.state === 'stopped') {\n return { ...base, kind: 'stopped', tone: 'danger', title: 'Fleet stopped', why: 'Nothing new starts until you resume it.', go: GO_COMMAND };\n }\n\n if (authority) {\n const grant = authority.grant.state;\n if (grant === 'none' && draft === 'setup') {\n return {\n ...base,\n kind: 'setup',\n title: 'Autonomy is off',\n why: 'Nothing runs or merges on its own until the one-time setup is done.',\n command: SETUP_COMMAND,\n checks: setupChecks(authority),\n };\n }\n if (grant === 'none') {\n return {\n ...base,\n kind: 'grant',\n title: 'Autonomy is off',\n why: 'Approve a standing grant to let the fleet work.',\n go: { ...GO_COMMAND, label: 'Approve in Command' },\n grant: { intent: 'grant', label: 'Approve grant' },\n checks: setupChecks(authority),\n };\n }\n if (grant !== 'active') {\n const paused = grant === 'paused';\n return {\n ...base,\n kind: 'grant',\n tone: 'warning',\n title: GRANT_TITLE[grant],\n why: paused ? 'Autonomy is off until you re-approve it.' : 'Autonomy is off until you approve a new grant.',\n go: { ...GO_COMMAND, label: paused ? 'Re-approve in Command' : 'Approve in Command' },\n grant: paused ? { intent: 're-approve', label: 'Re-approve grant' } : { intent: 'grant', label: 'Approve grant' },\n };\n }\n if (authority.effectiveSwitch === 'off') {\n return {\n ...base,\n kind: 'off',\n title: 'Autonomy is off',\n why: authority.switch === 'off' ? 'Switch it to Propose or Autonomous to start the fleet.' : (sentence(authority.effectiveReason) ?? 'Something holds the switch at Off.'),\n go: GO_COMMAND,\n };\n }\n }\n\n if (live?.state === 'dark') {\n return { ...base, kind: 'dark', title: 'Fleet is dark', why: sentence(live.stateReason) ?? 'The daemon runs nothing on its own.', go: GO_FLEET };\n }\n if (live?.state === 'paused') {\n return { ...base, kind: 'paused', tone: 'warning', title: 'Fleet paused', why: sentence(live.stateReason) ?? 'The daemon is parked; your own tools still work.', go: GO_FLEET };\n }\n if (quietSince && live?.state !== 'running') {\n return { ...base, kind: 'quiet', title: 'Fleet is quiet', why: 'Autonomy is on, but no runs or proposals were filed.', go: GO_FLEET };\n }\n return null;\n}\n","/*\n * routes/verse/autonomy/autonomy-off.module.css — the shared \"autonomy is\n * off\" state (AutonomyOffState.tsx). The same frame as a surface card so it\n * sits in the grid like one; inside, one title row, one line, one action.\n * Colour only on the dot and the done marks. Tokens only (style-scan-310).\n */\n.state {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-3);\n min-width: 0;\n padding: var(--card-pad);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n}\n\n.head {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-2);\n width: 100%;\n}\n\n/* The dot stays on the title's first line however the title wraps. */\n.titleRow {\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.dot {\n width: 8px;\n height: 8px;\n flex: none;\n margin-top: calc((var(--text-lg-line) - 8px) / 2);\n border-radius: var(--radius-full);\n background: var(--status-neutral-solid);\n}\n.dot[data-tone='danger'] {\n background: var(--status-danger-solid);\n}\n.dot[data-tone='warning'] {\n background: var(--status-warning-solid);\n}\n\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-lg-size);\n line-height: var(--text-lg-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.since {\n margin-left: auto;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n.why {\n margin: calc(-1 * var(--space-2)) 0 0;\n max-width: 64ch;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n\n/* The command reads in full, in mono, before it is copied. */\n.command {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n width: min(100%, 460px);\n padding: var(--space-1) var(--space-1) var(--space-1) var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-code);\n}\n.command[data-state='failed'] {\n border-color: var(--status-danger-solid);\n}\n\n.code {\n flex: 1;\n min-width: 0;\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n overflow-wrap: anywhere;\n}\n\n.prompt {\n color: var(--text-tertiary);\n user-select: none;\n}\n\n.action {\n display: flex;\n}\n\n.progress {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--space-2) var(--space-4);\n padding-top: var(--space-3);\n border-top: 1px solid var(--border-subtle);\n width: 100%;\n}\n\n.count {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n color: var(--text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.checks {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-4);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.check {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n.check[data-mark='todo'],\n.check[data-mark='unknown'] {\n color: var(--text-tertiary);\n}\n\n.mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n flex: none;\n border: 1.5px solid var(--border-strong);\n border-radius: var(--radius-full);\n}\n.check[data-mark='done'] .mark {\n border-color: var(--status-success-solid);\n background: var(--status-success-solid);\n color: var(--text-on-accent);\n}\n.check[data-mark='unknown'] .mark {\n border-style: dashed;\n border-color: var(--status-unknown-solid);\n}\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n","/**\n * routes/verse/autonomy/AutonomyOffState.tsx — the one \"autonomy is off\"\n * state Command, Fleet, Growth and Mind show in place of their empty cards.\n *\n * ● Autonomy is off Fleet dark since Sep 1\n * Nothing runs or merges on its own until setup is done.\n * [ $ ashlr authority setup ⧉ Copy ]\n * ✓ Custody helper ✓ Signing key ○ GitHub App ○ Claude token ○ Standing grant\n *\n * One title, one line of why, ONE primary action: copy the setup command, or\n * go to the surface that has the control (left out when that surface is the\n * one showing the state — its control is already on screen). The decision is\n * autonomy-off-model.ts; `useAutonomyOff` reads it for the surfaces that do\n * not already hold the authority and live reads.\n */\nimport { useCallback, useEffect, useId, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport type { WorkbenchSectionId } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { copyText } from '../../../components/primitives/clipboard.js';\nimport { IconCheck, IconCopy } from '../../../components/primitives/icons.js';\nimport type { AuthorityGrantDraft } from '../../../../core/authority/types.js';\nimport { ensureQuery, getQuerySnapshot, subscribeQuery } from '../../../data/cache.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { goToSection } from '../command/nav.js';\nimport { authorityDraftQuery, authorityQuery, fleetLiveQuery, type OptionalRead } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { autonomyOffState, draftReadiness, type AutonomyOffState as OffState, type DraftReadiness, type SetupCheck } from './autonomy-off-model.js';\nimport styles from './autonomy-off.module.css';\n\n/** How long \"Copied\" stays on the button (SPEC-310C §4's copy-pill timing). */\nconst COPIED_MS = 1_200;\n\n/** Authority and the live view move slowly while autonomy is off; a minute is plenty for a state. */\nexport const AUTONOMY_OFF_POLL_MS = 60_000;\n\n/** A drafted grant is only a readiness probe here; a minute-old answer is fine (the sheet re-drafts on open). */\nconst DRAFT_FRESH_MS = 60_000;\n\n/**\n * Whether a new grant can be drafted — read ONLY while `enabled` (there is\n * no grant), so an active fleet never asks the server to draft one.\n * Undefined while that read is in flight.\n */\nexport function useDraftReadiness(enabled: boolean): DraftReadiness | undefined {\n const key = authorityDraftQuery.key;\n const snap = useSyncExternalStore(\n useCallback((listener: () => void) => subscribeQuery(key, listener), [key]),\n () => getQuerySnapshot<OptionalRead<AuthorityGrantDraft>>(key),\n () => getQuerySnapshot<OptionalRead<AuthorityGrantDraft>>(key),\n );\n useEffect(() => {\n if (enabled) void ensureQuery(key, () => authorityDraftQuery.fetch(), DRAFT_FRESH_MS);\n }, [enabled, key]);\n return enabled ? draftReadiness(snap.data) : 'unknown';\n}\n\n/**\n * The state for a surface that does not hold the authority / live reads\n * itself. Undefined until everything it needs has answered (so a loading\n * surface never flashes \"off\"); null when autonomy is on.\n */\nexport function useAutonomyOff(quietSince: string | null = null): OffState | null | undefined {\n const authority = useQuery(authorityQuery, { freshMs: 30_000 });\n const live = useQuery(fleetLiveQuery, { freshMs: 10_000 });\n const refetchAuthority = useRefetch(authorityQuery);\n const refetchLive = useRefetch(fleetLiveQuery);\n usePollWhileVisible(() => {\n refetchAuthority();\n refetchLive();\n }, AUTONOMY_OFF_POLL_MS);\n const noGrant = authority.data?.value?.grant.state === 'none';\n const draft = useDraftReadiness(noGrant);\n if (!authority.data || !live.data || draft === undefined) return undefined;\n return autonomyOffState({ authority: authority.data.value, live: live.data.value, quietSince, draft });\n}\n\nfunction CopyCommand({ command }: { command: string }) {\n const [state, setState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => () => { if (timer.current) clearTimeout(timer.current); }, []);\n const copy = async () => {\n const ok = await copyText(command);\n setState(ok ? 'copied' : 'failed');\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setState('idle'), COPIED_MS);\n };\n return (\n <div className={styles.command} data-state={state}>\n <code className={styles.code}>\n <span className={styles.prompt} aria-hidden=\"true\">$ </span>\n {command}\n </code>\n <Button\n variant=\"primary\"\n size=\"sm\"\n icon={state === 'copied' ? <IconCheck /> : <IconCopy />}\n onClick={() => void copy()}\n aria-label={`Copy the command: ${command}`}\n >\n {state === 'copied' ? 'Copied' : 'Copy'}\n </Button>\n <span className={styles.visuallyHidden} role=\"status\" aria-live=\"polite\">\n {state === 'copied' ? 'Copied' : state === 'failed' ? 'Copy failed. Select the command and copy it yourself.' : ''}\n </span>\n </div>\n );\n}\n\nfunction Checks({ checks }: { checks: SetupCheck[] }) {\n const done = checks.filter((c) => c.done === true).length;\n return (\n <div className={styles.progress}>\n <span className={styles.count} aria-hidden=\"true\">\n {done} of {checks.length} ready\n </span>\n <ul className={styles.checks} aria-label={`Setup: ${done} of ${checks.length} ready`}>\n {checks.map((c) => {\n const mark = c.done === true ? 'done' : c.done === false ? 'todo' : 'unknown';\n return (\n <li key={c.id} className={styles.check} data-mark={mark}>\n <span className={styles.mark} aria-hidden=\"true\">\n {mark === 'done' ? <IconCheck size={10} strokeWidth={2.5} /> : null}\n </span>\n {c.label}\n <span className={styles.visuallyHidden}>{mark === 'done' ? ' — done' : mark === 'todo' ? ' — to do' : ' — unknown'}</span>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\nexport interface AutonomyOffStateProps {\n /** The autonomy state; null = autonomy is on (a surface's own empty line, no action). */\n state: OffState | null;\n /** The surface showing it: a \"go to\" action pointing here is left out. */\n here: WorkbenchSectionId;\n /** A surface's own headline in place of the state's (\"Growth starts with the first fleet run.\"). */\n title?: string;\n /** A surface's own line in place of the state's why. */\n why?: string | null;\n /**\n * Command only: opens its Touch ID sheet. When given and the state carries\n * a grant action, that button is the primary action instead of \"go to\".\n */\n onGrant?: (intent: 'grant' | 're-approve') => void;\n}\n\nexport function AutonomyOffState({ state, here, title, why, onGrant }: AutonomyOffStateProps) {\n const titleId = useId();\n const go = state?.go && state.go.section !== here ? state.go : null;\n const grant = onGrant && state?.grant ? state.grant : null;\n let action: ReactNode = null;\n if (state?.command) action = <CopyCommand command={state.command} />;\n else if (grant) {\n action = (\n <div className={styles.action}>\n <Button variant=\"primary\" size=\"sm\" onClick={() => onGrant?.(grant.intent)}>\n {grant.label}\n </Button>\n </div>\n );\n } else if (go) {\n action = (\n <div className={styles.action}>\n <Button variant=\"primary\" size=\"sm\" onClick={() => goToSection(go.section, go.anchor)}>\n {go.label}\n </Button>\n </div>\n );\n }\n // A surface headline takes the title's place, so the state's own title\n // becomes the start of the line: \"Autonomy is off. Approve a standing grant…\"\n const line = why !== undefined ? why : !state ? null : title ? `${state.title}. ${state.why}` : state.why;\n return (\n <section className={styles.state} aria-labelledby={titleId} data-kind={state?.kind ?? 'none'} data-testid=\"autonomy-off\">\n <header className={styles.head}>\n <span className={styles.titleRow}>\n <span className={styles.dot} data-tone={state?.tone ?? 'neutral'} aria-hidden=\"true\" />\n <h3 id={titleId} className={styles.title}>{title ?? state?.title ?? ''}</h3>\n </span>\n {state?.since ? <span className={styles.since}>{state.since}</span> : null}\n </header>\n {line ? <p className={styles.why}>{line}</p> : null}\n {action}\n {state && state.checks.length > 0 ? <Checks checks={state.checks} /> : null}\n </section>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- ._state_pz212_7{align-items:flex-start;gap:var(--space-3);min-width:0;padding:var(--card-pad);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);background:var(--bg-surface);flex-direction:column;display:flex}._head_pz212_19{align-items:center;gap:var(--space-1) var(--space-2);flex-wrap:wrap;width:100%;display:flex}._titleRow_pz212_28{align-items:flex-start;gap:var(--space-2);min-width:0;display:flex}._dot_pz212_35{width:8px;height:8px;margin-top:calc((var(--text-lg-line) - 8px) / 2);border-radius:var(--radius-full);background:var(--status-neutral-solid);flex:none}._dot_pz212_35[data-tone=danger]{background:var(--status-danger-solid)}._dot_pz212_35[data-tone=warning]{background:var(--status-warning-solid)}._title_pz212_28{font-family:var(--font-display);font-size:var(--text-lg-size);line-height:var(--text-lg-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display);color:var(--text-primary);margin:0}._since_pz212_60{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary);font-variant-numeric:tabular-nums;margin-left:auto}._why_pz212_68{margin:calc(-1 * var(--space-2)) 0 0;max-width:64ch;font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-secondary)}._command_pz212_77{align-items:center;gap:var(--space-3);width:min(100%,460px);padding:var(--space-1) var(--space-1) var(--space-1) var(--space-3);border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:var(--bg-code);display:flex}._command_pz212_77[data-state=failed]{border-color:var(--status-danger-solid)}._code_pz212_91{min-width:0;font-family:var(--font-mono);font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);overflow-wrap:anywhere;flex:1}._prompt_pz212_101{color:var(--text-tertiary);-webkit-user-select:none;user-select:none}._action_pz212_106{display:flex}._progress_pz212_110{align-items:center;gap:var(--space-2) var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--border-subtle);flex-wrap:wrap;width:100%;display:flex}._count_pz212_120{font-size:var(--text-xs-size);line-height:var(--text-xs-line);font-weight:var(--font-weight-medium);color:var(--text-secondary);font-variant-numeric:tabular-nums}._checks_pz212_128{gap:var(--space-1) var(--space-4);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}._check_pz212_128{align-items:center;gap:var(--space-2);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);display:inline-flex}._check_pz212_128[data-mark=todo],._check_pz212_128[data-mark=unknown]{color:var(--text-tertiary)}._mark_pz212_150{border:1.5px solid var(--border-strong);border-radius:var(--radius-full);flex:none;justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}._check_pz212_128[data-mark=done] ._mark_pz212_150{border-color:var(--status-success-solid);background:var(--status-success-solid);color:var(--text-on-accent)}._check_pz212_128[data-mark=unknown] ._mark_pz212_150{border-style:dashed;border-color:var(--status-unknown-solid)}._visuallyHidden_pz212_170{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}
@@ -1,2 +0,0 @@
1
- import{n as e}from"./index-BG177cPN.js";import{n as t}from"./Advanced-CxzE6ekM.js";var n=e();function r(){return(0,n.jsx)(t,{})}export{r as AutonomySection};
2
- //# sourceMappingURL=AutonomySection-BTg7yVa1.js.map
@@ -1,2 +0,0 @@
1
- import{a as e,c as t,n,s as r}from"./index-BG177cPN.js";import{m as i,p as a}from"./global-CXHHMz9o.js";import{t as o}from"./MutationTokenDialog-CLGP72g6.js";import{t as s}from"./Segmented-Wynbg0F5.js";import{_ as c,y as l}from"./format-DEAaVF6X.js";import{t as u}from"./Tag-D4k5E3u0.js";import{n as d,r as f,t as p}from"./budget-queries-DjrPRFwl.js";import{_ as m,b as h,g,s as _,v,x as y,y as b}from"./capacity-strip-model-C7cdQnuK.js";import{n as x,t as S}from"./use-token-gate-DfEja7Wr.js";import{t as C}from"./Slider-Bd9YFWEV.js";import{t as w}from"./Switch-CenChEYf.js";var T=t(e(),1),E={panel:`_panel_18a87_5`,header:`_header_18a87_14`,title:`_title_18a87_20`,summary:`_summary_18a87_26`,age:`_age_18a87_32`,mode:`_mode_18a87_38`,modeText:`_modeText_18a87_44`,preview:`_preview_18a87_51`,previewLead:`_previewLead_18a87_62`,previewWhy:`_previewWhy_18a87_63`,error:`_error_18a87_69`,loading:`_loading_18a87_74`,empty:`_empty_18a87_75`,seats:`_seats_18a87_81`,seat:`_seat_18a87_81`,seatHead:`_seatHead_18a87_98`,marker:`_marker_18a87_105`,seatName:`_seatName_18a87_111`,status:`_status_18a87_119`,free:`_free_18a87_131`,toggle:`_toggle_18a87_135`,bars:`_bars_18a87_137`,bar:`_bar_18a87_137`,barLabel:`_barLabel_18a87_149`,bindingMark:`_bindingMark_18a87_157`,barValue:`_barValue_18a87_161`,unknown:`_unknown_18a87_166`,track:`_track_18a87_172`,used:`_used_18a87_179`,room:`_room_18a87_180`,reserveBand:`_reserveBand_18a87_181`,ceiling:`_ceiling_18a87_203`,trackUnknown:`_trackUnknown_18a87_211`,controls:`_controls_18a87_218`,freeLine:`_freeLine_18a87_224`,why:`_why_18a87_225`,more:`_more_18a87_230`,footnote:`_footnote_18a87_240`},D=r({BUDGET_COMMIT_DELAY_MS:()=>450,BUDGET_POLL_MS:()=>k,BudgetControl:()=>P,BudgetControlView:()=>N}),O=n(),k=6e4;function A({bar:e}){let t=e.usedPercent,n=b(e.ceilingPercent);if(t===null)return(0,O.jsxs)(`div`,{className:E.bar,"data-binding":e.binding||void 0,children:[(0,O.jsx)(`span`,{className:E.barLabel,children:e.label}),(0,O.jsx)(`div`,{className:E.trackUnknown,role:`img`,"aria-label":e.description}),(0,O.jsx)(`span`,{className:`${E.barValue} ${E.unknown}`,children:`no reading`})]});let r=b(t),i=r>=n;return(0,O.jsxs)(`div`,{className:E.bar,"data-binding":e.binding||void 0,children:[(0,O.jsxs)(`span`,{className:E.barLabel,children:[e.label,e.binding?(0,O.jsx)(`span`,{className:E.bindingMark,title:`This window limits autonomy right now`,children:`binding`}):null]}),(0,O.jsxs)(`div`,{className:E.track,role:`img`,"aria-label":e.description,children:[n<100?(0,O.jsx)(`div`,{className:E.reserveBand,style:{left:`${n}%`,width:`${100-n}%`}}):null,i?null:(0,O.jsx)(`div`,{className:E.room,style:{left:`${r}%`,width:`${n-r}%`}}),(0,O.jsx)(`div`,{className:E.used,"data-over":i||void 0,style:{width:`${r}%`}}),n<100?(0,O.jsx)(`div`,{className:E.ceiling,style:{left:`${n}%`}}):null]}),(0,O.jsxs)(`span`,{className:E.barValue,children:[c(t),` used`,n<100?` · stops at ${n}%`:``]})]})}function j(e,t){let[n,r]=(0,T.useState)(e),i=(0,T.useRef)(!1),a=(0,T.useRef)(null),o=(0,T.useRef)(t);return o.current=t,(0,T.useEffect)(()=>{i.current||r(e)},[e]),(0,T.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]),[n,(0,T.useCallback)(e=>{r(e),i.current=!0,a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{i.current=!1,a.current=null,o.current(e)},450)},[])]}function M({row:e,saving:t,readOnly:n,onSeat:r}){let i=(0,T.useId)(),a=e.policy.reservePercent,o=e.policy.maxSessionWindowPercent??100,[s,c]=j(a,t=>{t!==a&&r(e.seatId,{reservePercent:t})}),[l,d]=j(o,t=>{t!==o&&r(e.seatId,{maxSessionWindowPercent:t>=100?null:t})}),f=n||t;return(0,O.jsxs)(`li`,{className:E.seat,"aria-labelledby":i,"data-status":e.status,"aria-busy":t||void 0,children:[(0,O.jsxs)(`div`,{className:E.seatHead,children:[(0,O.jsx)(u,{engine:e.engine,className:E.marker}),(0,O.jsx)(`span`,{id:i,className:E.seatName,title:e.label,children:e.label}),(0,O.jsx)(`span`,{className:E.status,"data-status":e.status,children:m[e.status]}),e.free?(0,O.jsx)(`span`,{className:E.free,children:`free`}):null,(0,O.jsx)(w,{className:E.toggle,checked:e.policy.enabled,disabled:f,"aria-label":`Autonomy on ${e.label}`,label:`Autonomy`,onChange:t=>r(e.seatId,{enabled:t})})]}),e.bars.length>0?(0,O.jsx)(`div`,{className:E.bars,children:e.bars.map(e=>(0,O.jsx)(A,{bar:e},e.kind))}):e.free?(0,O.jsx)(`p`,{className:E.freeLine,children:`No usage window — local models cost nothing and are never held back for you.`}):null,!e.free&&e.policy.enabled?(0,O.jsxs)(`div`,{className:E.controls,children:[(0,O.jsx)(C,{label:`Kept for you`,min:0,max:100,step:5,value:s,disabled:f,valueLabel:`${s}%`,valueText:`${s} percent of the ${e.engine===`grok`?`billing period`:`weekly window`} kept for you`,onChange:e=>c(b(Number(e.currentTarget.value)))}),e.hasSessionCeiling?(0,O.jsx)(C,{label:`5-hour ceiling`,min:10,max:100,step:5,value:l,disabled:f,valueLabel:l>=100?`none`:`${l}%`,valueText:l>=100?`no 5-hour ceiling`:`autonomy stops at ${l} percent of the 5-hour window`,onChange:e=>d(b(Number(e.currentTarget.value),10,100))}):null]}):null,(0,O.jsx)(`p`,{className:E.why,children:e.why}),e.more.length>0?(0,O.jsxs)(`details`,{className:E.more,children:[(0,O.jsx)(`summary`,{children:e.more.length===1?`1 more note`:`${e.more.length} more notes`}),(0,O.jsx)(`ul`,{children:e.more.map(e=>(0,O.jsx)(`li`,{children:e},e))})]}):null]})}function N({view:e,preview:t,nowMs:n,pending:r,error:i,readOnly:a=!1,maxMode:o=null,onMode:c,onSeat:u}){let d=(0,T.useId)(),f=[..._(e).values()],p=v(f),m=g.find(t=>t.value===e.mode)??null,b=m??g[1],x=typeof e.readingMaxAgeMs==`number`&&Number.isFinite(e.readingMaxAgeMs)?e.readingMaxAgeMs:null,S=o?g.find(e=>e.value===o)?.label??o:null,C=h(e.mode,o),w=t?.seatId?f.find(e=>e.seatId===t.seatId):null;return(0,O.jsxs)(`section`,{className:E.panel,"aria-labelledby":d,children:[(0,O.jsxs)(`header`,{className:E.header,children:[(0,O.jsx)(`h2`,{id:d,className:E.title,children:`Budget`}),(0,O.jsx)(`p`,{className:E.summary,children:p.sentence}),(0,O.jsx)(`span`,{className:E.age,children:Number.isFinite(Date.parse(e.sampledAt))?`Readings ${y(e.sampledAt,n)}`:`Reading time not reported`})]}),(0,O.jsxs)(`div`,{className:E.mode,children:[(0,O.jsx)(s,{"aria-label":`Budget mode`,options:g.map(e=>({value:e.value,label:e.label,...h(e.value,o)?{ariaLabel:`${e.label} — above your grant`}:{},disabled:a||r!==null||h(e.value,o)})),value:e.mode,onChange:t=>{t!==e.mode&&!h(t,o)&&c(t)}}),(0,O.jsx)(`p`,{className:E.modeText,children:m?b.description:`The server did not say which mode is on.`}),S?(0,O.jsx)(`p`,{className:E.modeText,"data-ceiling":``,children:C?`Your grant allows up to ${S}, so autonomy spends as ${S} until this moves down.`:`Your grant allows up to ${S}; modes above it are off. Re-approve the grant to raise it.`}):null]}),t?(0,O.jsxs)(`p`,{className:E.preview,"aria-live":`polite`,children:[(0,O.jsx)(`span`,{className:E.previewLead,children:`Next medium task →`}),` `,(0,O.jsx)(`strong`,{children:w?.label??t.seatId??`nowhere right now`}),(0,O.jsx)(`span`,{className:E.previewWhy,children:typeof t.why==`string`?l(t.why,n):null})]}):null,i?(0,O.jsx)(`p`,{className:E.error,role:`alert`,children:i}):null,f.length===0?(0,O.jsx)(`p`,{className:E.empty,children:`No seats yet — connect an account or start Ollama, and they appear here.`}):(0,O.jsx)(`ul`,{className:E.seats,children:f.map(e=>(0,O.jsx)(M,{row:e,saving:r===e.seatId||r===`mode`,readOnly:a,onSeat:u},e.seatId))}),(0,O.jsxs)(`p`,{className:E.footnote,children:[`Reserves limit autonomy only; your chats can always use a seat. A seat with no reading, or one`,` `,x===null?`whose reading is stale`:`older than ${Math.round(x/6e4)} minutes`,`, is held back.`]})]})}function P({maxMode:e=null}={}){let t=a(d,{freshMs:0}),n=a(p,{freshMs:0}),r=i(d),s=i(p),c=x(),[l,u]=(0,T.useState)(null),[m,h]=(0,T.useState)(null),[g,_]=(0,T.useState)(null),[v,y]=(0,T.useState)(()=>Date.now());(0,T.useEffect)(()=>{let e=()=>{(typeof document>`u`||document.visibilityState!==`hidden`)&&(r(),s(),y(Date.now()))},t=window.setInterval(e,k);return document.addEventListener(`visibilitychange`,e),()=>{window.clearInterval(t),document.removeEventListener(`visibilitychange`,e)}},[r,s]);let b=t.data,C=l&&(!b||!(Date.parse(l.sampledAt)<Date.parse(b.sampledAt)))?l:b,w=(0,T.useCallback)(async(e,t,n)=>{h(e),_(null);try{let e=await c.run(t,()=>f(n));e&&u(e)}catch(e){_(S(e))}finally{h(null),y(Date.now())}},[c]);return C?(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(N,{view:C,preview:n.data??null,nowMs:v,pending:m,error:g,maxMode:e,onMode:e=>void w(`mode`,`Switch the budget to ${e}`,{mode:e}),onSeat:(e,t)=>void w(e,`Change the budget for ${e}`,{seatId:e,policy:t})}),(0,O.jsx)(o,{open:c.dialog.open,reason:c.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:c.dialog.onClose,onUnlocked:c.dialog.onUnlocked})]}):(0,O.jsx)(`section`,{className:E.panel,"aria-label":`Budget`,children:t.status===`error`?(0,O.jsxs)(`p`,{className:E.error,role:`alert`,children:[`Budget unavailable: `,t.error?.message??`the request failed.`]}):(0,O.jsx)(`p`,{className:E.loading,children:`Reading seat usage…`})})}export{D as n,P as t};
2
- //# sourceMappingURL=BudgetControl-ng6swoZp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BudgetControl-ng6swoZp.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/budget/BudgetControl.module.css","../../../../../../src/web-ui/routes/verse/budget/BudgetControl.tsx"],"sourcesContent":["/* Budget panel. Hairlines and whitespace, no nested boxes (DESIGN-V2 §6).\n Every state is a WORD first; colour reinforces it. Status tokens are\n defined for both themes in tokens.css, so nothing here needs a dark rule. */\n\n.panel {\n display: flex;\n flex-direction: column;\n gap: var(--space-4);\n min-width: 0;\n color: var(--text-primary);\n font-family: var(--font-ui);\n}\n\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--space-2) var(--space-3);\n}\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-lg-size);\n font-weight: var(--font-weight-semibold);\n}\n.summary {\n margin: 0;\n flex: 1 1 16rem;\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n.age {\n font-size: var(--text-2xs-size);\n color: var(--text-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n.mode {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2) var(--space-3);\n}\n.modeText {\n margin: 0;\n flex: 1 1 14rem;\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n\n.preview {\n margin: 0;\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--space-1) var(--space-2);\n padding: var(--space-2) 0;\n border-top: 1px solid var(--border-subtle);\n border-bottom: 1px solid var(--border-subtle);\n font-size: var(--text-sm-size);\n}\n.previewLead { color: var(--text-secondary); }\n.previewWhy {\n flex-basis: 100%;\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n\n.error {\n margin: 0;\n font-size: var(--text-sm-size);\n color: var(--status-danger-fg);\n}\n.loading,\n.empty {\n margin: 0;\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n\n.seats {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n.seat {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) 0;\n border-bottom: 1px solid var(--border-subtle);\n min-width: 0;\n}\n.seat[aria-busy='true'] { opacity: 0.7; }\n\n.seatHead {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n}\n.marker {\n width: 3px;\n height: 16px;\n border-radius: 2px;\n flex: none;\n}\n.seatName {\n font-weight: var(--font-weight-medium);\n font-size: var(--text-base-size);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.status {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-medium);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n color: var(--status-unknown-fg);\n}\n.status[data-status='eligible'] { color: var(--status-success-fg); }\n.status[data-status='held'] { color: var(--status-warning-fg); }\n.status[data-status='off'] { color: var(--status-neutral-fg); }\n.status[data-status='unknown'] { color: var(--status-unknown-fg); }\n.free {\n font-size: var(--text-2xs-size);\n color: var(--text-tertiary);\n}\n.toggle { margin-left: auto; }\n\n.bars {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n}\n.bar {\n display: grid;\n grid-template-columns: 6.5rem minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-xs-size);\n}\n.barLabel {\n display: inline-flex;\n align-items: baseline;\n gap: var(--space-1);\n color: var(--text-secondary);\n white-space: nowrap;\n}\n.bar[data-binding] .barLabel { color: var(--text-primary); }\n.bindingMark {\n font-size: var(--text-2xs-size);\n color: var(--text-tertiary);\n}\n.barValue {\n font-variant-numeric: tabular-nums;\n color: var(--text-secondary);\n white-space: nowrap;\n}\n.unknown {\n font-style: italic;\n color: var(--status-unknown-fg);\n}\n\n/* The track: used (solid) · autonomy room (tint) · kept for you (hatched). */\n.track {\n position: relative;\n height: 8px;\n border-radius: var(--radius-full);\n background: var(--meter-track);\n overflow: hidden;\n}\n.used,\n.room,\n.reserveBand {\n position: absolute;\n top: 0;\n bottom: 0;\n}\n.used {\n left: 0;\n /* Quantity, not interaction: the fixed azure ramp, never the operator-chosen accent (DESIGN §13.2). */\n background: var(--data-seq-5);\n border-radius: var(--radius-full) 0 0 var(--radius-full);\n}\n.used[data-over] { background: var(--status-warning-solid); }\n.room {\n background: color-mix(in srgb, var(--data-seq-5) 28%, transparent);\n}\n.reserveBand {\n background: repeating-linear-gradient(\n 135deg,\n color-mix(in srgb, var(--text-tertiary) 30%, transparent) 0 3px,\n transparent 3px 6px\n );\n}\n.ceiling {\n position: absolute;\n top: -2px;\n bottom: -2px;\n width: 2px;\n margin-left: -1px;\n background: var(--text-primary);\n}\n.trackUnknown {\n height: 8px;\n border-radius: var(--radius-full);\n border: 1px dashed var(--border-strong);\n background: transparent;\n}\n\n.controls {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));\n gap: var(--space-2) var(--space-4);\n}\n\n.freeLine,\n.why {\n margin: 0;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n.more {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n.more summary { cursor: pointer; }\n.more ul {\n margin: var(--space-1) 0 0;\n padding-left: var(--space-4);\n}\n\n.footnote {\n margin: 0;\n font-size: var(--text-2xs-size);\n color: var(--text-tertiary);\n}\n\n@media (max-width: 480px) {\n .bar {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n .bar .track,\n .bar .trackUnknown {\n grid-column: 1 / -1;\n grid-row: 2;\n }\n .toggle { margin-left: 0; }\n}\n","/**\n * routes/verse/budget/BudgetControl.tsx — budget modes, per-seat reserves and\n * live headroom, in one panel.\n *\n * ┌ Budget ─────────────────────────── 3 of 7 seats can take autonomous work\n * │ [ Reserve | Balanced | All-in ] Autonomy stops at each seat's reserve…\n * │ Next medium task → Grok · why\n * │ ● Claude Code Eligible Autonomy [on]\n * │ Weekly ███████▒▒▒▒▒▒▒▒░░░░░░░░░ 20% used · stops at 60%\n * │ 5-hour ███▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░ 15% used · stops at 70%\n * │ Kept for you ──●──── 40% 5-hour ceiling ─────●── 70%\n * │ 40% of the weekly window is left for autonomy (40% kept for you).\n *\n * Each bar reads left to right: what is USED (solid), what autonomy may\n * still use (tinted), and the band KEPT FOR MASON (hatched) past the ceiling\n * tick. An unread window is a dashed track and the words \"no reading\" —\n * never an empty bar (which would claim headroom) or a full one.\n *\n * `BudgetControlView` is pure (props in, callbacks out) and is what the tests\n * render; `BudgetControl` wires it to the API, the mutation-token gate and a\n * 60 s refresh while the document is visible.\n *\n * Mount point: a Track B surface (Command home / Autonomy) owns placement —\n * this file only exports the panel.\n */\nimport { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport type { BudgetMode, SeatDecision } from '../../../../core/routing/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { Slider } from '../../../components/primitives/Slider.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { EngineMarker } from '../../../components/primitives/Tag.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { percentText, tidyProse } from '../autonomy/format.js';\nimport { readBudgetRows } from '../usage/capacity-strip-model.js';\nimport {\n BUDGET_MODE_OPTIONS,\n budgetSummary,\n clampPercent,\n modeAboveCeiling,\n readingAge,\n STATUS_WORDS,\n type BudgetBar,\n type BudgetSeatRow,\n} from './budget-model.js';\nimport { budgetPreviewQuery, budgetQuery, updateBudget, type BudgetSeatPatchWire } from './budget-queries.js';\nimport styles from './BudgetControl.module.css';\n\n/** Headroom moves with the collector (30 s cycle); a minute is plenty for a settings panel. */\nexport const BUDGET_POLL_MS = 60_000;\n/** Slider changes are committed this long after the last movement. */\nexport const BUDGET_COMMIT_DELAY_MS = 450;\n\n// ---------------------------------------------------------------------------\n// Headroom bar\n// ---------------------------------------------------------------------------\n\nfunction HeadroomBar({ bar }: { bar: BudgetBar }) {\n const used = bar.usedPercent;\n const ceiling = clampPercent(bar.ceilingPercent);\n if (used === null) {\n return (\n <div className={styles.bar} data-binding={bar.binding || undefined}>\n <span className={styles.barLabel}>{bar.label}</span>\n <div className={styles.trackUnknown} role=\"img\" aria-label={bar.description} />\n <span className={`${styles.barValue} ${styles.unknown}`}>no reading</span>\n </div>\n );\n }\n const usedPct = clampPercent(used);\n const over = usedPct >= ceiling;\n return (\n <div className={styles.bar} data-binding={bar.binding || undefined}>\n <span className={styles.barLabel}>\n {bar.label}\n {bar.binding ? <span className={styles.bindingMark} title=\"This window limits autonomy right now\">binding</span> : null}\n </span>\n <div className={styles.track} role=\"img\" aria-label={bar.description}>\n {ceiling < 100 ? (\n <div className={styles.reserveBand} style={{ left: `${ceiling}%`, width: `${100 - ceiling}%` }} />\n ) : null}\n {!over ? (\n <div className={styles.room} style={{ left: `${usedPct}%`, width: `${ceiling - usedPct}%` }} />\n ) : null}\n <div className={styles.used} data-over={over || undefined} style={{ width: `${usedPct}%` }} />\n {ceiling < 100 ? <div className={styles.ceiling} style={{ left: `${ceiling}%` }} /> : null}\n </div>\n <span className={styles.barValue}>\n {/* Words by the one percent rule; the bar geometry stays numeric. */}\n {percentText(used)} used{ceiling < 100 ? ` · stops at ${ceiling}%` : ''}\n </span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Draft slider — commits after the hand leaves it\n// ---------------------------------------------------------------------------\n\nfunction useCommittedDraft(serverValue: number, commit: (value: number) => void): [number, (v: number) => void] {\n const [draft, setDraft] = useState(serverValue);\n const dirty = useRef(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const commitRef = useRef(commit);\n commitRef.current = commit;\n\n // A new server value wins unless the operator is mid-drag.\n useEffect(() => {\n if (!dirty.current) setDraft(serverValue);\n }, [serverValue]);\n\n useEffect(() => () => {\n if (timer.current) clearTimeout(timer.current);\n }, []);\n\n const change = useCallback((value: number) => {\n setDraft(value);\n dirty.current = true;\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n dirty.current = false;\n timer.current = null;\n commitRef.current(value);\n }, BUDGET_COMMIT_DELAY_MS);\n }, []);\n\n return [draft, change];\n}\n\n// ---------------------------------------------------------------------------\n// One seat\n// ---------------------------------------------------------------------------\n\ninterface SeatRowProps {\n row: BudgetSeatRow;\n saving: boolean;\n readOnly: boolean;\n onSeat: (seatId: string, patch: BudgetSeatPatchWire) => void;\n}\n\nfunction SeatRow({ row, saving, readOnly, onSeat }: SeatRowProps) {\n const headingId = useId();\n const reserveServer = row.policy.reservePercent;\n const sessionServer = row.policy.maxSessionWindowPercent ?? 100;\n const [reserve, setReserve] = useCommittedDraft(reserveServer, (v) => {\n if (v !== reserveServer) onSeat(row.seatId, { reservePercent: v });\n });\n const [session, setSession] = useCommittedDraft(sessionServer, (v) => {\n if (v !== sessionServer) onSeat(row.seatId, { maxSessionWindowPercent: v >= 100 ? null : v });\n });\n const disabled = readOnly || saving;\n\n return (\n <li className={styles.seat} aria-labelledby={headingId} data-status={row.status} aria-busy={saving || undefined}>\n <div className={styles.seatHead}>\n <EngineMarker engine={row.engine} className={styles.marker} />\n {/* The name may truncate in a narrow sheet; the full name rides in the tooltip. */}\n <span id={headingId} className={styles.seatName} title={row.label}>{row.label}</span>\n <span className={styles.status} data-status={row.status}>{STATUS_WORDS[row.status]}</span>\n {row.free ? <span className={styles.free}>free</span> : null}\n <Switch\n className={styles.toggle}\n checked={row.policy.enabled}\n disabled={disabled}\n aria-label={`Autonomy on ${row.label}`}\n label=\"Autonomy\"\n onChange={(next) => onSeat(row.seatId, { enabled: next })}\n />\n </div>\n\n {row.bars.length > 0 ? (\n <div className={styles.bars}>\n {row.bars.map((bar) => <HeadroomBar key={bar.kind} bar={bar} />)}\n </div>\n ) : row.free ? (\n <p className={styles.freeLine}>No usage window — local models cost nothing and are never held back for you.</p>\n ) : null}\n\n {!row.free && row.policy.enabled ? (\n <div className={styles.controls}>\n <Slider\n label=\"Kept for you\"\n min={0}\n max={100}\n step={5}\n value={reserve}\n disabled={disabled}\n valueLabel={`${reserve}%`}\n valueText={`${reserve} percent of the ${row.engine === 'grok' ? 'billing period' : 'weekly window'} kept for you`}\n onChange={(e) => setReserve(clampPercent(Number(e.currentTarget.value)))}\n />\n {row.hasSessionCeiling ? (\n <Slider\n label=\"5-hour ceiling\"\n min={10}\n max={100}\n step={5}\n value={session}\n disabled={disabled}\n valueLabel={session >= 100 ? 'none' : `${session}%`}\n valueText={session >= 100 ? 'no 5-hour ceiling' : `autonomy stops at ${session} percent of the 5-hour window`}\n onChange={(e) => setSession(clampPercent(Number(e.currentTarget.value), 10, 100))}\n />\n ) : null}\n </div>\n ) : null}\n\n <p className={styles.why}>{row.why}</p>\n {row.more.length > 0 ? (\n <details className={styles.more}>\n <summary>{row.more.length === 1 ? '1 more note' : `${row.more.length} more notes`}</summary>\n <ul>\n {row.more.map((reason) => <li key={reason}>{reason}</li>)}\n </ul>\n </details>\n ) : null}\n </li>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Pure view\n// ---------------------------------------------------------------------------\n\nexport interface BudgetControlViewProps {\n view: BudgetView;\n preview: SeatDecision | null;\n nowMs: number;\n /** `'mode'` or a seat id while its change is in flight. */\n pending: string | null;\n error: string | null;\n readOnly?: boolean;\n /**\n * The standing grant's ceiling (`spend.maxMode`). Modes above it are shown\n * DISABLED with the reason — never hidden — because autonomy could not\n * spend them anyway. Moving toward Reserve is always allowed. Null/absent\n * = no grant ceiling applies (every mode selectable).\n */\n maxMode?: BudgetMode | null;\n onMode: (mode: BudgetMode) => void;\n onSeat: (seatId: string, patch: BudgetSeatPatchWire) => void;\n}\n\nexport function BudgetControlView({ view, preview, nowMs, pending, error, readOnly = false, maxMode = null, onMode, onSeat }: BudgetControlViewProps) {\n const titleId = useId();\n // The wire view is read defensively (the capacity strip's own guard): this\n // panel is opened from Apps, the composer's seat chip and the autonomy bar,\n // and a budget answer of `{}` or a garbled seat entry used to throw inside\n // buildBudgetRows and take the whole sheet down. A seat whose policy is\n // malformed is dropped, not shown as \"off\" — see readBudgetRows.\n const rows = [...readBudgetRows(view).values()];\n const summary = budgetSummary(rows);\n const knownMode = BUDGET_MODE_OPTIONS.find((o) => o.value === view.mode) ?? null;\n const mode = knownMode ?? BUDGET_MODE_OPTIONS[1]!;\n const maxAgeMs = typeof view.readingMaxAgeMs === 'number' && Number.isFinite(view.readingMaxAgeMs) ? view.readingMaxAgeMs : null;\n const ceilingLabel = maxMode ? BUDGET_MODE_OPTIONS.find((o) => o.value === maxMode)?.label ?? maxMode : null;\n const aboveNow = modeAboveCeiling(view.mode, maxMode);\n const chosen = preview?.seatId ? rows.find((r) => r.seatId === preview.seatId) : null;\n\n return (\n <section className={styles.panel} aria-labelledby={titleId}>\n <header className={styles.header}>\n <h2 id={titleId} className={styles.title}>Budget</h2>\n <p className={styles.summary}>{summary.sentence}</p>\n <span className={styles.age}>\n {Number.isFinite(Date.parse(view.sampledAt)) ? `Readings ${readingAge(view.sampledAt, nowMs)}` : 'Reading time not reported'}\n </span>\n </header>\n\n <div className={styles.mode}>\n <Segmented\n aria-label=\"Budget mode\"\n options={BUDGET_MODE_OPTIONS.map((o) => ({\n value: o.value,\n label: o.label,\n ...(modeAboveCeiling(o.value, maxMode) ? { ariaLabel: `${o.label} — above your grant` } : {}),\n disabled: readOnly || pending !== null || modeAboveCeiling(o.value, maxMode),\n }))}\n value={view.mode}\n onChange={(next) => { if (next !== view.mode && !modeAboveCeiling(next, maxMode)) onMode(next); }}\n />\n {/* No option is pressed when the server named no mode we know —\n showing Balanced there would claim a setting nobody read. */}\n <p className={styles.modeText}>{knownMode ? mode.description : 'The server did not say which mode is on.'}</p>\n {ceilingLabel ? (\n <p className={styles.modeText} data-ceiling=\"\">\n {aboveNow\n ? `Your grant allows up to ${ceilingLabel}, so autonomy spends as ${ceilingLabel} until this moves down.`\n : `Your grant allows up to ${ceilingLabel}; modes above it are off. Re-approve the grant to raise it.`}\n </p>\n ) : null}\n </div>\n\n {preview ? (\n <p className={styles.preview} aria-live=\"polite\">\n <span className={styles.previewLead}>Next medium task →</span>{' '}\n <strong>{chosen?.label ?? (preview.seatId ?? 'nowhere right now')}</strong>\n <span className={styles.previewWhy}>{/* A `{}` preview (an older server) has no why: say nothing rather than crash. */}\n {typeof preview.why === 'string' ? tidyProse(preview.why, nowMs) : null}</span>\n </p>\n ) : null}\n\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n\n {rows.length === 0 ? (\n <p className={styles.empty}>No seats yet — connect an account or start Ollama, and they appear here.</p>\n ) : (\n <ul className={styles.seats}>\n {rows.map((row) => (\n <SeatRow key={row.seatId} row={row} saving={pending === row.seatId || pending === 'mode'} readOnly={readOnly} onSeat={onSeat} />\n ))}\n </ul>\n )}\n\n <p className={styles.footnote}>\n Reserves limit autonomy only; your chats can always use a seat. A seat with no reading, or one{' '}\n {maxAgeMs !== null ? `older than ${Math.round(maxAgeMs / 60_000)} minutes` : 'whose reading is stale'}, is held back.\n </p>\n </section>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Connected panel\n// ---------------------------------------------------------------------------\n\nexport function BudgetControl({ maxMode = null }: { maxMode?: BudgetMode | null } = {}) {\n const budget = useQuery(budgetQuery, { freshMs: 0 });\n const preview = useQuery(budgetPreviewQuery, { freshMs: 0 });\n const refetchBudget = useRefetch(budgetQuery);\n const refetchPreview = useRefetch(budgetPreviewQuery);\n const gate = useTokenGate();\n const [latest, setLatest] = useState<BudgetView | null>(null);\n const [pending, setPending] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [nowMs, setNowMs] = useState(() => Date.now());\n\n // Poll while visible; read immediately on return (useSeatsRefresh's pattern).\n useEffect(() => {\n const tick = (): void => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return;\n refetchBudget();\n refetchPreview();\n setNowMs(Date.now());\n };\n const timer = window.setInterval(tick, BUDGET_POLL_MS);\n document.addEventListener('visibilitychange', tick);\n return () => {\n window.clearInterval(timer);\n document.removeEventListener('visibilitychange', tick);\n };\n }, [refetchBudget, refetchPreview]);\n\n // The POST response is newer than the cached read until the refetch lands.\n // A cached read with no parseable sampledAt cannot be shown to be newer, so\n // the POST's answer wins (NaN comparisons are always false).\n const cached = budget.data;\n const view = latest && (!cached || !(Date.parse(latest.sampledAt) < Date.parse(cached.sampledAt))) ? latest : cached;\n\n const apply = useCallback(async (key: string, reason: string, update: Parameters<typeof updateBudget>[0]) => {\n setPending(key);\n setError(null);\n try {\n const next = await gate.run(reason, () => updateBudget(update));\n if (next) setLatest(next);\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setPending(null);\n setNowMs(Date.now());\n }\n }, [gate]);\n\n if (!view) {\n return (\n <section className={styles.panel} aria-label=\"Budget\">\n {budget.status === 'error' ? (\n <p className={styles.error} role=\"alert\">Budget unavailable: {budget.error?.message ?? 'the request failed.'}</p>\n ) : (\n <p className={styles.loading}>Reading seat usage…</p>\n )}\n </section>\n );\n }\n\n return (\n <>\n <BudgetControlView\n view={view}\n preview={preview.data ?? null}\n nowMs={nowMs}\n pending={pending}\n error={error}\n maxMode={maxMode}\n onMode={(mode) => void apply('mode', `Switch the budget to ${mode}`, { mode })}\n onSeat={(seatId, patch) => void apply(seatId, `Change the budget for ${seatId}`, { seatId, policy: patch })}\n />\n <MutationTokenDialog open={gate.dialog.open} reason={gate.dialog.reason} tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\" onClose={gate.dialog.onClose} onUnlocked={gate.dialog.onUnlocked} />\n </>\n );\n}\n"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DockHost-BPqyhtCP.js","assets/MutationTokenDialog-CLGP72g6.js","assets/Dialog-BuIaG6HF.js","assets/focus-trap-BGOceFvj.js","assets/ProviderLogo-8WaUjTlN.js","assets/verse-model-CSzzdyu2.js","assets/format-DEAaVF6X.js","assets/format-DKrNjdwD.js","assets/context-queries-wvcRnV-I.js","assets/context-model-9xywbXxX.js","assets/context-model-2Owp2jYF.js","assets/workspace-model-BdIVybKr.js","assets/ActionMenu-DffwPklw.js","assets/tool-semantics-GX8ScuSH.js","assets/line-diff-B5Eonif2.js","assets/dock-icons-BBUGl4tE.js","assets/command-catalog-CmrHNFzh.js","assets/tasks-model-BKPFZAmZ.js","assets/sidebar-model-CjQLvdag.js","assets/use-token-gate-DfEja7Wr.js","assets/EmptyState-DXkT4vhW.js","assets/slots-DRxNosZg.js","assets/Button-OjVJSrFq.js","assets/useVerseTranscript-BGtA55k2.js","assets/Switch-CenChEYf.js","assets/context.module-BijAfoJw.js","assets/global-BlI2BYa1.css","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/ActionMenu-DPjsLU1g.css","assets/dock-icons-1w9hA2-h.css","assets/EmptyState-B3YUPGaa.css","assets/Button-DrnKsvnQ.css","assets/Switch-CU044EaE.css","assets/context-DiToyj6s.css","assets/DockHost-B4RaYOET.css","assets/NewChatDialog-DoYTH26M.js","assets/Segmented-Wynbg0F5.js","assets/git-model-53iRLInY.js","assets/SeatSelector-CH7hTgwy.js","assets/seat-subscription-CLn2ReSZ.js","assets/Composer.module-C8U73KdQ.js","assets/CapacityStrip-Bx4c3dxD.js","assets/Tag-D4k5E3u0.js","assets/budget-queries-DjrPRFwl.js","assets/capacity-strip-model-C7cdQnuK.js","assets/useSeatsRefresh-BDlbDlIU.js","assets/folder-picker-C8zo3A56.js","assets/Segmented-BnjHbKzH.css","assets/Composer-ByzxOJK6.css","assets/Tag-D0rAEciH.css","assets/CapacityStrip-Cc28CyWk.css","assets/NewChatDialog-yyQpA9p_.css","assets/Workspace-CpxBO98E.js","assets/highlight-CMCZK9jW.js","assets/DiffViewer-B75t6Ile.js","assets/MessageMarkdown-DlfLEJxu.js","assets/icons-D4s-jlxX.js","assets/verse-icons-wOet9JZy.js","assets/reasoning-pref-DMPQkujg.js","assets/Meter-BSVhU43Q.js","assets/DiffViewer-C8HHTnVE.css","assets/MessageMarkdown-Cgh5f1-Q.css","assets/Meter-CYt9KpM0.css","assets/Workspace-Dwri2jFJ.css","assets/Sidebar-BuO3sViG.js","assets/RefreshIndicator-DGubF4vR.js","assets/RefreshIndicator-CVv22U_j.css","assets/Sidebar-BRc1vGDF.css","assets/DeleteChatDialog-KUYUygiA.js","assets/turn-files-BPHQzYuH.js"])))=>i.map(i=>d[i]);
2
- import{a as e,c as t,n,s as r,t as i}from"./index-BG177cPN.js";import{C as a,D as o,F as s,T as c,f as l,h as u,i as d,m as f,o as p,p as m,s as h}from"./global-CXHHMz9o.js";import{r as ee}from"./RouteErrorBoundary-BvhHNpE_.js";import{C as g,Ct as te,Dt as ne,E as re,H as _,L as ie,N as ae,Nt as v,Ot as oe,Pt as se,R as ce,S as le,St as ue,T as de,Tt as fe,Y as pe,_t as me,a as he,b as y,bn as ge,c as _e,d as ve,et as ye,f as be,ft as xe,h as Se,i as Ce,it as we,lt as Te,m as Ee,o as De,p as Oe,st as ke,u as Ae,ut as b,v as je,w as x,wt as Me}from"./VerseConsoleApp-DeuBEvAO.js";import{a as Ne,c as Pe,d as S,f as Fe,i as C,l as Ie,m as w,n as Le,r as Re,s as ze,t as Be,u as Ve}from"./verse-store-DNVRuiJL.js";var T=t(e(),1),E=new Map;function D(e,t){return E.set(e,t),()=>{E.get(e)===t&&E.delete(e)}}function O(e,t){let n=t.replace(/\s+$/,``);return e.trim()?`${e.replace(/\s+$/,``)}\n\n${n}`:n}function He(e=document){let t=e.querySelector(`textarea[aria-label="Message"]`);return t instanceof HTMLTextAreaElement?t:null}function Ue(e,t){if(!t.trim())return!1;let n=E.get(e);if(n)return n(t),!0;let r=He();if(!r||r.disabled)return!1;let i=O(r.value,t),a=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,`value`)?.set;a?a.call(r,i):r.value=i,r.dispatchEvent(new Event(`input`,{bubbles:!0})),r.focus();let o=r.value.length;try{r.setSelectionRange(o,o)}catch{}return!0}function k(e){return`verse-session-roots:${e}`}var A={key:`verse-session-roots:none`,fetch:async()=>null};function We(e){return e?[e.projectPath,...(e.extraRoots??[]).filter(t=>t!==e.projectPath)]:[]}function Ge(e){let t=e?.id??null,n=(0,T.useMemo)(()=>t?{key:k(t),fetch:e=>ve(t,e)}:A,[t]),r=m(n),i=f(n),a=e?.turnCount??0,o=(0,T.useRef)({id:t,turns:a});(0,T.useEffect)(()=>{let e=o.current;o.current={id:t,turns:a},e.id===t&&e.turns!==a&&t&&i()},[t,a,i]);let s=r.data??null,c=s!==null&&Array.isArray(s.roots)?s:null,l=(0,T.useMemo)(()=>We(e),[e?.projectPath,e?.extraRoots]),u=(0,T.useMemo)(()=>{if(!c||c.roots.length===0)return l;let e=c.roots.filter(e=>e.primary).map(e=>e.path),t=c.roots.filter(e=>!e.primary).map(e=>e.path);return[...e,...t]},[c,l]),d=c?.roots.find(e=>e.primary)??c?.roots[0]??null;return{data:c,error:r.status===`error`?r.error?.message??`could not read this chat’s folders`:null,roots:u,branch:d?.git?.branch??null}}var Ke=new Set;function qe(e){return Ke.add(e),()=>Ke.delete(e)}function j(e){let t=!1;for(let n of[...Ke])n(e)&&(t=!0);return t}var M=new Set;function N(e){return M.add(e),()=>M.delete(e)}function Je(){let e=!1;for(let t of[...M])t()&&(e=!0);return e}var P=new Set;function Ye(e){return P.add(e),()=>P.delete(e)}function Xe(e){let t=!1;for(let n of[...P])n(e)&&(t=!0);return t}var F=n(),Ze=[`user-message`,`turn-started`,`text-delta`,`assistant-message`,`thinking`,`tool-use`,`tool-result`,`usage`,`turn-done`,`error`,`cancelled`,`compaction`,`context`,`thinking-delta`,`thinking-progress`,`progress`,`status`,`recovered`,`history-truncated`];function I(e){return Math.min(1e3*2**e,15e3)}var L=e=>e===null||typeof e==`number`&&Number.isFinite(e)&&e>=0;function R(e){return e.type===`context`?typeof e.contextTokens==`number`&&Number.isFinite(e.contextTokens)&&e.contextTokens>=0&&typeof e.exact==`boolean`&&L(e.contextWindow)&&(e.autoCompactAt===void 0||L(e.autoCompactAt)):e.type!==`compaction`||(e.trigger===`auto`||e.trigger===`manual`)&&L(e.preTokens)&&L(e.postTokens)&&L(e.durationMs)}var Qe=e=>e===void 0||typeof e==`number`&&Number.isFinite(e)&&e>=0;function $e(e){switch(e.type){case`thinking-delta`:return typeof e.text==`string`;case`thinking-progress`:return e.estimatedTokens!==void 0&&Qe(e.estimatedTokens);case`progress`:return(e.phase===`thinking`||e.phase===`tool`||e.phase===`writing`||e.phase===`waiting`)&&typeof e.elapsedMs==`number`&&Number.isFinite(e.elapsedMs)&&e.elapsedMs>=0&&(e.tool===void 0||typeof e.tool==`string`)&&Qe(e.outTokens)&&Qe(e.tokPerSec);case`status`:return(e.kind===`retry`||e.kind===`preflight`||e.kind===`watchdog`)&&typeof e.message==`string`;case`history-truncated`:return typeof e.droppedBefore==`number`&&Number.isFinite(e.droppedBefore);default:return!0}}function et(e){try{let t=JSON.parse(e);if(!t||typeof t!=`object`)return null;let n=t;return typeof n.seq!=`number`||typeof n.type!=`string`||!R(t)||!$e(t)?null:t}catch{return null}}var tt=`verse-sessions`;function nt(e=!0){return`/api/events?${e?`topics=${tt}&`:``}client=${encodeURIComponent(o())}`}var z=!1;function rt(){let e=null,t=null,n=0,r=!1,i=!1,a=()=>{if(r||typeof EventSource>`u`||c().phase!==`authenticated`)return;let o=!z&&!i,s=new EventSource(nt(o),{withCredentials:!0}),l=!1;e=s,s.onopen=()=>{l=!0,n=0,i&&=(z=!0,!1)},s.addEventListener(`verse-sessions`,()=>be()),s.onerror=()=>{if(s.close(),e===s&&(e=null),!(r||c().phase!==`authenticated`)){if(!l&&o){i=!0,a();return}i=!1,t=setTimeout(()=>{t=null,n+=1,a()},I(n))}}};return a(),()=>{r=!0,t&&clearTimeout(t),t=null,e?.close(),e=null}}var it=9e4,at=250;function ot(e,t){let n=Number.isSafeInteger(t)&&t>0?`after=${t}&`:``;return`${x(e,`/events`)}?${n}client=${encodeURIComponent(o())}`}function st(e){return Math.min(1e3*2**e,15e3)}function ct(){return globalThis.IS_REACT_ACT_ENVIRONMENT===!0}var lt=e=>{let t=!1,n=()=>{t||(t=!0,r!==null&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(r),clearTimeout(i),e())},r=(typeof document>`u`||document.visibilityState!==`hidden`)&&typeof requestAnimationFrame==`function`?requestAnimationFrame(n):null,i=setTimeout(n,r===null?0:at);return()=>{t=!0,r!==null&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(r),clearTimeout(i)}};function ut(e){return ct()?(e(),null):lt(e)}var dt=class{sessionId;queue=[];cancel=null;scheduled=!1;constructor(e){this.sessionId=e}push(e){if(this.queue.push(e),this.scheduled)return;this.scheduled=!0;let t=ut(()=>this.flush());this.scheduled&&(this.cancel=t)}flush(){if(this.scheduled=!1,this.cancel?.(),this.cancel=null,this.queue.length===0)return;let e=this.queue;this.queue=[],Be(this.sessionId,e).settled&&be()}drop(){this.scheduled=!1,this.cancel?.(),this.cancel=null,this.queue=[]}},ft=!1,pt=0;function B(e){let t=null,n=null,r=0,i=!1,a=!1,o=new dt(e),s=()=>{if(i||typeof EventSource>`u`||c().phase!==`authenticated`)return;S(e,r===0?`connecting`:`reconnecting`);let l=ft||a?0:Ne(e).lastSeq,u=new EventSource(ot(e,l),{withCredentials:!0}),d=!1;t=u,u.onopen=()=>{d=!0,r=0,a&&=(ft=!0,!1),S(e,`open`)};for(let e of Ze)u.addEventListener(e,e=>{if(t!==u)return;let n=et(e.data);n&&o.push(n)});u.onerror=f=>{if(!(typeof MessageEvent<`u`&&f instanceof MessageEvent)&&(o.flush(),!i)){if(typeof u.readyState==`number`&&u.readyState===pt){S(e,`reconnecting`);return}if(u.close(),t===u&&(t=null),S(e,`reconnecting`),c().phase===`authenticated`){if(!d&&l>0&&!a){a=!0,s();return}a=!1,n=setTimeout(()=>{n=null,r+=1,s()},st(r))}}}},l=()=>{n&&clearTimeout(n),n=null,t?.close(),t=null};return s(),{close(){i||(i=!0,l(),o.flush(),o.drop(),S(e,`closed`))},restart(){i||(l(),o.flush(),r=0,s())}}}var V=new Map;function H(e){let t=V.get(e);t&&(V.delete(e),t.idleTimer&&clearTimeout(t.idleTimer),t.stream.close())}function U(){let e=[...V.entries()].filter(([,e])=>e.refs===0).sort((e,t)=>e[1].releasedAt-t[1].releasedAt);for(;e.length>1;)H(e.shift()[0])}function mt(e){let t=V.get(e);t?(t.refs+=1,t.idleTimer&&clearTimeout(t.idleTimer),t.idleTimer=null):(t={stream:B(e),refs:1,idleTimer:null,releasedAt:0},V.set(e,t));let n=t,r=!1;return()=>{r||(r=!0,V.get(e)===n&&(--n.refs,!(n.refs>0)&&(n.releasedAt=Date.now(),n.idleTimer=setTimeout(()=>{V.get(e)===n&&n.refs===0&&H(e)},it),U())))}}function ht(){for(let e of[...V.keys()])H(e)}w(e=>{e.kind===`reset`?ht():H(e.sessionId)});function gt(e,t={}){let n=new AbortController,r=null,i=!1,a=()=>{i||r||(r=mt(e))},o=Ne(e);return t.reload!==!0&&o.loaded&&o.loadError===null?a():(t.reload&&V.get(e)?.stream.restart(),Ae(e,n.signal).then(t=>{n.signal.aborted||(ze(e,t.session,t.events),a())}).catch(t=>{n.signal.aborted||Pe(e,t instanceof Error?t.message:`Could not load this chat.`)})),()=>{i=!0,n.abort(),r?.(),r=null}}var _t=()=>()=>{};function W(e){return(0,T.useCallback)(t=>e?Fe(e,t):_t(),[e])}function vt(e,t=0){let n=W(e),r=(0,T.useSyncExternalStore)(n,()=>C(e),()=>C(e)),i=(0,T.useRef)({sessionId:null,reload:t});return(0,T.useEffect)(()=>{let n=i.current;if(i.current={sessionId:e,reload:t},e)return gt(e,{reload:n.sessionId===e&&n.reload!==t})},[e,t]),r}function yt(e){let t=W(e);return(0,T.useSyncExternalStore)(t,()=>Re(e),()=>Re(e))}var G=5e3,K=new Map,bt=new Set;function xt(e){return bt.add(e),()=>bt.delete(e)}function St(){return K}function Ct(e,t){if(!((K.get(e)??-1)>=t)){K=new Map(K).set(e,t);for(let e of[...bt])e();Oe(e,t)}}function wt(){return(0,T.useSyncExternalStore)(xt,St,St)}function Tt(){let e=m(y,{freshMs:4500}),t=m(g),n=f(y),r=(0,T.useCallback)(()=>n(),[n]);ie(r,G);let i=wt();return{activity:e.data??null,meta:t.data??null,localSeen:i}}var q={sidebar:{min:220,max:420,def:264},resources:{min:240,max:520,def:320}},Et=1,Dt=`ashlr.verse.panels.v1`,Ot=`ashlr.verse.ui.v2`,kt={containerWidth:0,sidebarVisible:!0,resourcesVisible:!0};function J(e,t){let n=q[e],r=Number(t);return!Number.isFinite(r)||r<=0?n.def:Math.max(n.min,Math.min(n.max,Math.round(r)))}function At(e,t){let n=J(`sidebar`,e.sidebar),r=J(`resources`,e.resources);if(!Number.isFinite(t.containerWidth)||t.containerWidth<=0)return{sidebar:n,resources:r};let i=(t.sidebarVisible?Et:0)+(t.resourcesVisible?Et:0),a=t.containerWidth-480-i,o=(t.sidebarVisible?n:0)+(t.resourcesVisible?r:0)-a;if(o<=0)return{sidebar:n,resources:r};if(t.resourcesVisible){let e=Math.min(o,r-q.resources.min);r-=e,o-=e}if(o>0&&t.sidebarVisible){let e=Math.min(o,n-q.sidebar.min);n-=e}return{sidebar:n,resources:r}}function jt(){return{sidebar:q.sidebar.def,resources:q.resources.def}}function Mt(e){if(e===null||e===``)return null;let t;try{t=JSON.parse(e)}catch{return null}if(!t||typeof t!=`object`||Array.isArray(t))return null;let n=t,r=n.sidebar??n.sidebarWidth,i=n.resources??n.resourcesWidth;return r===void 0&&i===void 0?null:{sidebar:J(`sidebar`,r),resources:J(`resources`,i)}}function Nt(){try{return Mt(localStorage.getItem(Dt))||(Mt(localStorage.getItem(Ot))??jt())}catch{return jt()}}function Pt(e){try{localStorage.setItem(Dt,JSON.stringify({sidebar:e.sidebar,resources:e.resources}))}catch{}}var Y=Nt(),X=kt,Z={desired:Y,effective:At(Y,X)},Ft=new Set;function It(e,t){return e.sidebar===t.sidebar&&e.resources===t.resources}function Lt(){let e=At(Y,X);if(!(It(Z.desired,Y)&&It(Z.effective,e))){Z={desired:Y,effective:e};for(let e of Ft)e()}}function Rt(e){return Ft.add(e),()=>{Ft.delete(e)}}function zt(){return Z}function Bt(e){(X.containerWidth!==e.containerWidth||X.sidebarVisible!==e.sidebarVisible||X.resourcesVisible!==e.resourcesVisible)&&(X=e,Lt())}function Vt(e){It(Y,e)||(Y=e,Pt(Y),Lt())}function Q(e,t){Vt({...Y,[e]:J(e,t)})}function Ht(e,t){Q(e,Z.effective[e]+t)}function Ut(e){Q(e,q[e].def)}function Wt(){return(0,T.useSyncExternalStore)(Rt,zt,zt)}var Gt=`verseResizing`;function Kt(e){try{e?document.body.dataset[Gt]=`true`:delete document.body.dataset[Gt]}catch{}}function qt({side:e,label:t,className:n}){let r=Wt(),i=q[e],a=r.effective[e],o=(0,T.useRef)(null),[s,c]=(0,T.useState)(!1),l=(0,T.useCallback)(()=>{o.current&&(o.current=null,c(!1),Kt(!1))},[]),u=(0,T.useCallback)(e=>{if(e.button===0){e.preventDefault(),o.current={pointerId:e.pointerId,originX:e.clientX,startWidth:a},c(!0),Kt(!0);try{e.currentTarget.setPointerCapture?.(e.pointerId)}catch{}}},[a]);(0,T.useEffect)(()=>{if(!s)return;let t=t=>{let n=o.current;if(!n||t.pointerId!==n.pointerId)return;let r=t.clientX-n.originX;Q(e,e===`sidebar`?n.startWidth+r:n.startWidth-r)},n=e=>{let t=o.current;t&&e.pointerId!==t.pointerId||l()},r=t=>{let n=o.current;n&&t.key===`Escape`&&(Q(e,n.startWidth),l())},i=()=>l();return window.addEventListener(`pointermove`,t),window.addEventListener(`pointerup`,n),window.addEventListener(`pointercancel`,n),window.addEventListener(`keydown`,r),window.addEventListener(`blur`,i),()=>{window.removeEventListener(`pointermove`,t),window.removeEventListener(`pointerup`,n),window.removeEventListener(`pointercancel`,n),window.removeEventListener(`keydown`,r),window.removeEventListener(`blur`,i),Kt(!1)}},[s,e,l]);let d=(0,T.useCallback)(t=>{let n=t.shiftKey?64:16,r=e===`sidebar`?1:-1;switch(t.key){case`ArrowRight`:Ht(e,n*r);break;case`ArrowLeft`:Ht(e,-n*r);break;case`Home`:Q(e,i.min);break;case`End`:Q(e,i.max);break;case`Enter`:Ut(e);break;default:return}t.preventDefault()},[e,i.min,i.max]);return(0,F.jsx)(`div`,{className:n,"data-verse-resizer":e,"data-dragging":s?`true`:void 0,role:`separator`,"aria-orientation":`vertical`,"aria-label":t,"aria-valuemin":i.min,"aria-valuemax":i.max,"aria-valuenow":a,"aria-valuetext":`${a} pixels`,tabIndex:0,onPointerDown:u,onPointerUp:l,onPointerCancel:l,onLostPointerCapture:l,onKeyDown:d,onDoubleClick:()=>Ut(e)})}var $={chat:`_chat_14h0e_13`,main:`_main_14h0e_36`,banner:`_banner_14h0e_46`,bannerWarn:`_bannerWarn_14h0e_47`,resize:`_resize_14h0e_90`,scrim:`_scrim_14h0e_11`,dialogActions:`_dialogActions_14h0e_157`,sidebarSkeleton:`_sidebarSkeleton_14h0e_167`,workspaceSkeleton:`_workspaceSkeleton_14h0e_175`,skeletonHeader:`_skeletonHeader_14h0e_181`,skeletonBody:`_skeletonBody_14h0e_189`,skeletonComposer:`_skeletonComposer_14h0e_199`},Jt=r({ChatSection:()=>yn,describeChatError:()=>hn,preloadChatSurface:()=>un}),Yt=(0,T.lazy)(()=>i(()=>import(`./DockHost-BPqyhtCP.js`).then(e=>({default:e.DockHost})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37]))),Xt=(0,T.lazy)(()=>i(()=>import(`./NewChatDialog-DoYTH26M.js`).then(e=>({default:e.NewChatDialog})),__vite__mapDeps([38,2,3,5,39,8,6,7,40,9,41,42,43,44,4,45,46,47,10,48,11,49,26,27,29,30,50,51,52,53,54]))),Zt=v(()=>i(()=>import(`./Workspace-CpxBO98E.js`).then(e=>e.Workspace),__vite__mapDeps([55,3,2,1,4,56,57,58,5,6,7,8,42,43,46,47,10,48,22,12,13,14,15,59,60,16,17,18,61,19,21,20,23,62,26,27,28,63,29,30,64,51,34,31,32,33,65,66]))),Qt=Zt.Slot,$t=v(()=>i(()=>import(`./Sidebar-BuO3sViG.js`).then(e=>e.Sidebar),__vite__mapDeps([67,2,3,68,5,42,6,7,11,49,22,12,15,13,14,18,60,59,16,26,27,69,29,30,34,31,32,70]))),en=$t.Slot,tn=v(()=>i(()=>import(`./DeleteChatDialog-KUYUygiA.js`).then(e=>e.DeleteChatDialog),__vite__mapDeps([71,2,3,22,27,34]))),nn=tn.Slot,rn=v(()=>i(()=>import(`./MutationTokenDialog-CLGP72g6.js`).then(e=>e.n).then(e=>e.MutationTokenDialog),__vite__mapDeps([1,2,3,26,27,28]))),an=rn.Slot,on=se(()=>Promise.all([i(()=>import(`./tasks-model-BKPFZAmZ.js`),__vite__mapDeps([17,5,13,14,18,26,29,30])),i(()=>import(`./turn-files-BPHQzYuH.js`),__vite__mapDeps([72,13,14]))]).then(([e,t])=>({otherRunningChats:e.otherRunningChats,lastTurnFiles:t.lastTurnFiles}))),sn=se(()=>i(()=>import(`./verse-model-CSzzdyu2.js`).then(e=>e.T).then(e=>({firstRunnableModel:e.firstRunnableModel,seatById:e.seatById})),__vite__mapDeps([5,26,29,30]))),cn=[],ln=[];function un(){return Promise.all([Zt.ready(),$t.ready(),tn.ready(),rn.ready(),on.ready(),sn.ready()])}function dn(){return(0,F.jsx)(`nav`,{className:$.sidebarSkeleton,"aria-busy":`true`,"aria-label":`Loading chat list`,children:[64,82,58,76,70].map(e=>(0,F.jsx)(d,{width:`${e}%`},e))})}function fn(){return(0,F.jsxs)(`div`,{className:$.workspaceSkeleton,role:`status`,"aria-label":`Loading chat`,children:[(0,F.jsx)(`div`,{className:$.skeletonHeader,children:(0,F.jsx)(d,{width:`32%`})}),(0,F.jsxs)(`div`,{className:$.skeletonBody,children:[(0,F.jsx)(d,{width:`72%`}),(0,F.jsx)(d,{width:`88%`}),(0,F.jsx)(d,{width:`64%`})]}),(0,F.jsx)(`div`,{className:$.skeletonComposer,children:(0,F.jsx)(d,{width:`100%`})})]})}var pn=`ashlr.verse.selected.v1`;function mn(){try{return localStorage.getItem(pn)}catch{return null}}function hn(e){return e instanceof h?"This server was started without dispatch — run `ashlr verse` to chat.":e instanceof p?e.code===`VERSE_MODEL_UNAVAILABLE`?`${(e.detail??`This chat's model cannot run on its seat.`).replace(/\.?$/,`.`)} Continue in a fresh chat on a model this seat can run, or re-pin the seat's CLI (\`ashlr resources profile repin\`).`:e.status===409&&(e.code===null||e.code===`VERSE_SESSION_BUSY`)?`A turn is already running in this chat. Stop it first.`:e.status===413?`That message is too large (64 KB max).`:e.status===401?`Mutation token was rejected. Unlock again with the token ashlr verse printed.`:e.detail??e.message:e instanceof Error?e.message:`Something went wrong.`}function gn(){let[e,t]=(0,T.useState)(()=>typeof window>`u`?1440:window.innerWidth||1440);return(0,T.useEffect)(()=>{let e=()=>t(window.innerWidth||1440);return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),e}function _n(){requestAnimationFrame(()=>{document.querySelector(`textarea[aria-label="Message"]`)?.focus()})}function vn(e){return e instanceof Element&&e.closest(`[role="dialog"], [role="menu"], [role="listbox"], [aria-modal="true"]`)!==null}function yn(){let e=m(le),t=m(de),n=u(de),r=u(le),i=l(),o=ee(),c=ae(),d=ce(),f=Me(),p=Tt(),h=gn(),[g,ie]=(0,T.useState)(mn),[v,se]=(0,T.useState)(``),[y,ve]=(0,T.useState)({open:!1}),[be,Oe]=(0,T.useState)(!1),[Ae,x]=(0,T.useState)(null),[Ne,Pe]=(0,T.useState)(0),[S,Fe]=(0,T.useState)({open:!1,reason:``}),[C,w]=(0,T.useState)(null),[Re,ze]=(0,T.useState)(null),[Be,E]=(0,T.useState)(0),D=(0,T.useRef)(null),O=(0,T.useRef)(null),He=Wt(),k=(0,T.useMemo)(()=>e.data?.seats??[],[e.data]),A=(0,T.useMemo)(()=>e.data?.projects??[],[e.data]),We=m(re),Ke=(0,T.useMemo)(()=>We.data?.workspaces??[],[We.data]),qe=e.data?.dispatchEnabled??!0,j=vt(g,Ne),M=Ge(j.session),N=(0,T.useMemo)(()=>{let n=t.data??e.data?.sessions??[];if(!j.session)return n;let r=j.session;return n.some(e=>e.id===r.id)?n.map(e=>e.id===r.id?r:e):[r,...n]},[t.data,e.data,j.session]),P=(0,T.useCallback)(e=>{ie(e);try{e?localStorage.setItem(pn,e):localStorage.removeItem(pn)}catch{}},[]);(0,T.useEffect)(()=>{g&&t.data&&!t.data.some(e=>e.id===g)&&!j.session&&P(null)},[g,t.data,j.session,P]),(0,T.useEffect)(()=>rt(),[]);let Ye=(0,T.useRef)(g);(0,T.useEffect)(()=>{ke(g),Ye.current!==g&&(Ye.current=g,xe())},[g]);let Ze=j.session?.turnCount??null;(0,T.useEffect)(()=>{d&&g&&Ze!==null&&(typeof document>`u`||document.visibilityState!==`hidden`)&&Ct(g,Ze)},[d,g,Ze]);let I=(0,T.useCallback)((e,t)=>i.hasHold?t():new Promise((n,r)=>{D.current={run:()=>{t().then(n,r)},cancel:()=>n(null)},Fe({open:!0,reason:e})}),[i.hasHold]),L=(0,T.useCallback)(e=>{e instanceof Ce||o.show(hn(e),`danger`)},[o]),R=(0,T.useCallback)((e={})=>{x(null);let t=j.session,n=e.projectPath===void 0?t?.projectPath??null:e.projectPath,r=t&&n===t.projectPath?{seatId:t.seatId,model:t.model}:null,i=e.seat??r??ye(n);ve({open:!0,projectPath:n,seat:i})},[j.session]),Qe=(0,T.useCallback)(async e=>{await I(`Starting a chat spawns an agent process for this project.`,async()=>{Oe(!0),x(null);try{let t=await De(e);we(t.projectPath,{seatId:t.seatId,model:t.model}),Ie(t.id,t),ve({open:!1}),P(t.id),o.show(`Started “${t.title}”`,`success`)}catch(e){x(hn(e))}finally{Oe(!1)}})},[I,P,o]),$e=(0,T.useCallback)(async e=>{let t=g;return t?await I(`Sending a message runs the agent against this project.`,async()=>{Ve(t,`running`);try{let n=await Se(t,e);return Ie(t,n.session,n.turnId),!0}catch(e){return Ve(t,`idle`),L(e),!1}})===!0:!1},[g,I,L]),et=(0,T.useCallback)((e=g)=>{e&&I(`Stopping the running turn.`,async()=>{try{await he(e)}catch(e){L(e)}})},[g,I,L]),tt=(0,T.useCallback)(async(e,t)=>await I(`Renaming a chat.`,async()=>{try{let n=await Ee(e,t);return Ie(e,n),!0}catch(e){return L(e),!1}})===!0,[I,L]),nt=(0,T.useCallback)(async e=>await I(`Deleting a chat removes its transcript from disk.`,async()=>{try{return await _e(e),Le(e),s(e),e===g&&P(null),o.show(`Chat deleted.`,`neutral`),!0}catch(e){return L(e),!1}})===!0,[I,L,P,o,g]),z=(0,T.useCallback)((e,t,n)=>{I(n,async()=>{try{await je(e,t)}catch(e){L(e)}})},[I,L]),it=(0,T.useCallback)(e=>{let t=j.session;t&&(R({projectPath:t.projectPath,seat:e}),o.show(`Chats are bound to one seat — starting a new chat on the same project.`,`neutral`))},[j.session,R,o]),at=(0,T.useCallback)(e=>{let t=N.find(t=>t.id===e)??null;t&&ze(t)},[N]),ot=(0,T.useCallback)(e=>{e!==g&&P(e),w(e)},[g,P]),st=(0,T.useCallback)(e=>{P(e),window.matchMedia?.(`(max-width: 760px)`)?.matches===!0&&b(!0)},[P]),ct=(0,T.useCallback)(()=>b(!c.sidebarCollapsed),[c.sidebarCollapsed]),lt=f.state.open&&(f.state.active===`terminal`||f.state.splitWith===`terminal`),ut=(0,T.useCallback)(()=>{lt?te(`terminal`):me({})},[lt]),dt=(0,T.useCallback)(()=>me({newTab:!0}),[]),ft=(0,T.useRef)(0),pt=sn.useLoaded();(0,T.useEffect)(()=>{let e=c.command;if(e&&e.nonce!==ft.current&&(e.name!==`new-chat`||pt)){switch(ft.current=e.nonce,e.name){case`open-session`:e.sessionId&&P(e.sessionId);break;case`focus-composer`:_n();break;case`new-chat`:{let{seatById:t,firstRunnableModel:n}=pt,r=e.seatId?t(k,e.seatId):void 0,i=ye(e.projectPath??null),a=r?i?.seatId===r.id?i.model:n(r)?.id:void 0;R({...e.projectPath===void 0?{}:{projectPath:e.projectPath},...r&&a?{seat:{seatId:r.id,model:a}}:{}});break}}pe()}},[c.command,R,k,P,pt]);let B=new Map([[`chat.sidebar`,ct],[`chat.find`,()=>Je()],[`chat.turn-prev`,()=>Xe(-1)],[`chat.turn-next`,()=>Xe(1)],[`dock.toggle`,ue],[`dock.terminal`,ut],[`dock.terminal-new`,dt],[`dock.preview`,()=>te(`preview`)],[`dock.diff`,()=>te(`diff`)]]);_(`chat.sidebar`,B.get(`chat.sidebar`)),_(`chat.find`,B.get(`chat.find`)),_(`chat.turn-prev`,B.get(`chat.turn-prev`)),_(`chat.turn-next`,B.get(`chat.turn-next`)),_(`dock.toggle`,B.get(`dock.toggle`)),_(`dock.terminal`,B.get(`dock.terminal`)),_(`dock.terminal-new`,B.get(`dock.terminal-new`)),_(`dock.preview`,B.get(`dock.preview`)),_(`dock.diff`,B.get(`dock.diff`));let V=(0,T.useRef)(B);V.current=B,(0,T.useEffect)(()=>{if(!d)return;let e=e=>{if(e.defaultPrevented||vn(e.target))return;let t=ge(e,[`chat`]);if(!t||t.scope!==`chat`||t.id===`chat.find`||t.id===`chat.turn-prev`||t.id===`chat.turn-next`)return;let n=V.current.get(t.id);n&&(e.preventDefault(),n())};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[d]);let H=e.data?!e.data.dispatchEnabled:!1,U=c.sidebarCollapsed,mt=oe(h),ht=f.state.open&&f.state.tabs.length>0,gt=ht&&mt===`column`,_t=U?0:q.sidebar.min,W=gt?Math.max(fe.minWidth,Math.min(ne(f.state.width,h),Be>0?Be-480-_t:1/0)):0;(0,T.useEffect)(()=>{let e=O.current;if(!e)return;let t=()=>{E(e.clientWidth),Bt({containerWidth:Math.max(0,e.clientWidth-W),sidebarVisible:!U,resourcesVisible:!1})};t();let n=typeof ResizeObserver==`function`?new ResizeObserver(t):null;return n?.observe(e),window.addEventListener(`resize`,t),()=>{n?.disconnect(),window.removeEventListener(`resize`,t)}},[U,W]);let yt={"--verse-sidebar-width":`${He.effective.sidebar}px`,"--verse-dock-width":`${W}px`},G=on.useLoaded(),K=(0,T.useMemo)(()=>G?G.otherRunningChats(N,p.activity,g):cn,[G,N,p.activity,g]),bt=(0,T.useMemo)(()=>G?G.lastTurnFiles(j.events,M.roots):ln,[G,M.roots,j.events]),xt={setPinned:(e,t)=>z(e,{pinned:t},t?`Pinning a chat.`:`Unpinning a chat.`),setArchived:(e,t)=>z(e,{archived:t},t?`Archiving a chat.`:`Unarchiving a chat.`),rename:tt,handoff:ot,requestDelete:at,dispatchEnabled:qe};return(0,F.jsxs)(`div`,{ref:O,className:$.chat,style:yt,"data-sidebar":U?`collapsed`:`open`,"data-dock":gt?`open`:`closed`,children:[(0,F.jsx)(T.Suspense,{fallback:(0,F.jsx)(dn,{}),children:(0,F.jsx)(en,{sessions:N,sessionsStatus:t.status,sessionsError:t.error?.message??null,projects:A,seats:k,selectedId:g,query:v,onQuery:se,onSelect:st,onNew:()=>R(),onRetry:()=>{n(),r()},onCollapse:()=>b(!0),onDisconnect:()=>{a()},activity:p.activity,meta:p.meta,localSeen:p.localSeen,actions:xt})}),U?null:(0,F.jsx)(qt,{side:`sidebar`,label:`Resize chat list`,className:$.resize}),(0,F.jsx)(`button`,{type:`button`,className:$.scrim,"aria-label":`Close chat list`,tabIndex:-1,onClick:()=>b(!0)}),(0,F.jsxs)(`div`,{className:$.main,children:[e.status===`error`&&!e.data?(0,F.jsxs)(`div`,{role:`alert`,className:$.banner,children:[(0,F.jsx)(`span`,{children:e.error?.message??`Could not load Verse.`}),(0,F.jsx)(`button`,{type:`button`,onClick:r,children:`Retry`})]}):H?(0,F.jsxs)(`div`,{role:`status`,className:$.bannerWarn,children:[`Read-only: this server was started without dispatch. Run `,(0,F.jsx)(`code`,{children:`ashlr verse`}),` to send messages.`]}):null,(0,F.jsx)(T.Suspense,{fallback:(0,F.jsx)(fn,{}),children:(0,F.jsx)(Qt,{view:j,seats:k,projects:A,dispatchEnabled:qe,locked:!i.hasHold,hasAnySessions:N.length>0,onSend:$e,onStop:()=>et(),onRename:e=>g?tt(g,e):Promise.resolve(!1),onRequestDelete:()=>{g&&at(g)},onSeatChange:it,onNew:()=>R(),onRetry:()=>Pe(e=>e+1),sidebarCollapsed:U,onToggleSidebar:()=>b(!U),onOpenSession:P,handoffOpen:C!==null&&C===g,onHandoffOpenChange:e=>w(e?g:null),otherRunning:K})})]}),ht?(0,F.jsx)(T.Suspense,{fallback:null,children:(0,F.jsx)(Yt,{presentation:mt,windowWidth:h,columnWidth:W,session:j.session,seats:k,events:j.events,roots:M.roots,rootsData:M.data,rootsError:M.error,turnFiles:bt,otherRunning:K,dispatchEnabled:qe,onOpenSession:P,onHandoff:e=>w(e),onOpenAccounts:()=>Te(`apps`),onSendToChat:e=>{(!g||!Ue(g,e))&&o.show(`Open a chat to send this to it.`,`neutral`)},onAddToMessage:e=>{(!g||!Ue(g,e))&&o.show(`Open a chat to add this to its message.`,`neutral`)}})}):null,y.open?(0,F.jsx)(T.Suspense,{fallback:null,children:(0,F.jsx)(Xt,{open:!0,onClose:()=>ve({open:!1}),projects:A,seats:k,workspaces:Ke,initialProjectPath:y.projectPath??null,initialSeat:y.seat??null,busy:be,error:Ae,onCreate:Qe,runMutation:I})}):null,(0,F.jsxs)(T.Suspense,{fallback:null,children:[(0,F.jsx)(nn,{target:Re,onClose:()=>ze(null),onDelete:nt,actionsClassName:$.dialogActions}),(0,F.jsx)(an,{open:S.open,reason:S.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:()=>{Fe({open:!1,reason:``});let e=D.current;e&&setTimeout(()=>{D.current===e&&(D.current=null,e.cancel())},0)},onUnlocked:()=>{let e=D.current;D.current=null,e?.run()}})]})]})}export{yn as ChatSection,qe as a,Ge as c,hn as describeChatError,N as i,O as l,W as n,Ye as o,un as preloadChatSurface,yt as r,j as s,Jt as t,D as u};
3
- //# sourceMappingURL=ChatSection-Bisj9R6E.js.map