@ashlr/hub 3.10.0 → 3.10.1
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.
- package/CHANGELOG.md +101 -0
- package/dist/authority-surface.json +43 -23
- package/dist/build-identity.json +2 -2
- package/dist/core/daemon/capacity-publisher.d.ts +19 -0
- package/dist/core/daemon/capacity-publisher.js +49 -2
- package/dist/core/daemon/capacity-publisher.js.map +1 -1
- package/dist/core/daemon/overnight-status.d.ts +13 -0
- package/dist/core/daemon/overnight-status.js +93 -8
- package/dist/core/daemon/overnight-status.js.map +1 -1
- package/dist/core/fleet/dispatch-router.js +26 -9
- package/dist/core/fleet/dispatch-router.js.map +1 -1
- package/dist/core/fleet/fleet-runtime-journal.js +12 -5
- package/dist/core/fleet/fleet-runtime-journal.js.map +1 -1
- package/dist/core/fleet/fleet-types.d.ts +13 -0
- package/dist/core/routing/budget-store.js +11 -5
- package/dist/core/routing/budget-store.js.map +1 -1
- package/dist/core/routing/capacity-history-api.d.ts +30 -0
- package/dist/core/routing/capacity-history-api.js +147 -0
- package/dist/core/routing/capacity-history-api.js.map +1 -0
- package/dist/core/routing/capacity-history-types.d.ts +63 -0
- package/dist/core/routing/capacity-history-types.js +18 -0
- package/dist/core/routing/capacity-history-types.js.map +1 -0
- package/dist/core/routing/capacity-history.d.ts +130 -0
- package/dist/core/routing/capacity-history.js +654 -0
- package/dist/core/routing/capacity-history.js.map +1 -0
- package/dist/core/routing/headroom.d.ts +5 -1
- package/dist/core/routing/headroom.js +82 -41
- package/dist/core/routing/headroom.js.map +1 -1
- package/dist/core/routing/router.d.ts +8 -1
- package/dist/core/routing/router.js +49 -16
- package/dist/core/routing/router.js.map +1 -1
- package/dist/core/routing/seat-reasons.d.ts +35 -0
- package/dist/core/routing/seat-reasons.js +48 -0
- package/dist/core/routing/seat-reasons.js.map +1 -0
- package/dist/core/routing/types.d.ts +37 -0
- package/dist/core/routing/types.js.map +1 -1
- package/dist/core/verse/fleet-history-types.d.ts +12 -4
- package/dist/core/verse/fleet-history-types.js +4 -2
- package/dist/core/verse/fleet-history-types.js.map +1 -1
- package/dist/core/verse/fleet-live-api.d.ts +14 -1
- package/dist/core/verse/fleet-live-api.js +31 -11
- package/dist/core/verse/fleet-live-api.js.map +1 -1
- package/dist/core/verse/preferences.d.ts +3 -1
- package/dist/core/verse/preferences.js +5 -2
- package/dist/core/verse/preferences.js.map +1 -1
- package/dist/core/verse/types.d.ts +5 -1
- package/dist/core/verse/types.js.map +1 -1
- package/dist/core/verse/verse-api.js +2 -1
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js → ActionMenu-BBB7VYjz.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js.map → ActionMenu-BBB7VYjz.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-Bywv_iYR.css +1 -0
- package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js.map +1 -0
- package/dist/core/web/public/next/assets/{App-DyBg1v_q.js → App-CbDCLAxn.js} +5 -5
- package/dist/core/web/public/next/assets/{App-DyBg1v_q.js.map → App-CbDCLAxn.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-BgnK0wAy.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-BgnK0wAy.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-BF5UCsMv.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-CoMngwNB.js.map → AutonomySection-BF5UCsMv.js.map} +1 -1
- package/dist/core/web/public/next/assets/BranchBar-BZNQ50YE.css +1 -0
- package/dist/core/web/public/next/assets/BranchBar-nfSb59Kv.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-nfSb59Kv.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-BESM12dO.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-BESM12dO.js.map +1 -0
- package/dist/core/web/public/next/assets/BurnDown-D1AfskPT.js +2 -0
- package/dist/core/web/public/next/assets/BurnDown-D1AfskPT.js.map +1 -0
- package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js → Button-Cr_qkQEc.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js.map → Button-Cr_qkQEc.js.map} +1 -1
- package/dist/core/web/public/next/assets/CapacityStrip-Cc28CyWk.css +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-DoqjyVoj.js +3 -0
- package/dist/core/web/public/next/assets/{ChatSection-B9cdRKUh.js.map → ChatSection-DoqjyVoj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js → CommandPalette-lLV-OR63.js} +2 -2
- package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js.map → CommandPalette-lLV-OR63.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js +2 -0
- package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js.map +1 -0
- package/dist/core/web/public/next/assets/Composer-ByzxOJK6.css +1 -0
- package/dist/core/web/public/next/assets/Composer.module-C8U73KdQ.js +2 -0
- package/dist/core/web/public/next/assets/{Composer.module-DJMdrqNt.js.map → Composer.module-C8U73KdQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/DiffPane-BAvvbBsf.css +1 -0
- package/dist/core/web/public/next/assets/DiffPane-BVxhK-cy.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-BVxhK-cy.js.map +1 -0
- package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js → DiffViewer-yCdw9J-Y.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js.map → DiffViewer-yCdw9J-Y.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-B4RaYOET.css +1 -0
- package/dist/core/web/public/next/assets/DockHost-BZReKwos.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-BZReKwos.js.map +1 -0
- package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js → EmptyState-D1GDxVZy.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js.map → EmptyState-D1GDxVZy.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js → Epistemic-DRp4dBfB.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js.map → Epistemic-DRp4dBfB.js.map} +1 -1
- package/dist/core/web/public/next/assets/FleetSection-CFiWeOEs.css +1 -0
- package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js +3 -0
- package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-zvDj3He4.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-zvDj3He4.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-CkviqjYr.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-CkviqjYr.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-Bg5sW0jI.js +2 -0
- package/dist/core/web/public/next/assets/GrowthSection-Bg5sW0jI.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-DcPj1ri9.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-DcPj1ri9.js.map +1 -0
- package/dist/core/web/public/next/assets/{Input-CTu0CycC.js → Input-Ci7TD96x.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-CTu0CycC.js.map → Input-Ci7TD96x.js.map} +1 -1
- package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js → LeaderCard-BSFTlMRF.js} +2 -2
- package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js.map → LeaderCard-BSFTlMRF.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MatrixHeatmap-9dKgJ_pT.css → MatrixHeatmap-Bmnvo1l1.css} +1 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-DojKZe9L.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-DojKZe9L.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-CvcYu1X_.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-1UncWBpW.js.map → McpSection-CvcYu1X_.js.map} +1 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-BrLCrb73.js +3 -0
- package/dist/core/web/public/next/assets/{MessageMarkdown-C4pl9LI5.js.map → MessageMarkdown-BrLCrb73.js.map} +1 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-Cgh5f1-Q.css +1 -0
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js → MessageMarkdownRenderer-CjmdBw2p.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js.map → MessageMarkdownRenderer-CjmdBw2p.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js → Meter-DTHbmhQg.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js.map → Meter-DTHbmhQg.js.map} +1 -1
- package/dist/core/web/public/next/assets/MindSection-DcO9fmYe.js +2 -0
- package/dist/core/web/public/next/assets/MindSection-DcO9fmYe.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BpvidnM2.css +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-hiTINupk.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-hiTINupk.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-B4Z37Phx.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-B4Z37Phx.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-utSckh7C.js +3 -0
- package/dist/core/web/public/next/assets/{NewChatDialog-B_BsS9pr.js.map → NewChatDialog-utSckh7C.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-7N3YSUHN.js +2 -0
- package/dist/core/web/public/next/assets/{OnboardingFlow-CtCPpgoX.js.map → OnboardingFlow-7N3YSUHN.js.map} +1 -1
- package/dist/core/web/public/next/assets/PreviewPane-CqzkaAjG.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-CqzkaAjG.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-DoMsJSG3.css +1 -0
- package/dist/core/web/public/next/assets/RailStatus-sZhApA8k.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-sZhApA8k.js.map +1 -0
- package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js → RefreshIndicator-C1uQIegT.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js.map → RefreshIndicator-C1uQIegT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js → ResourcePoolConsoleApp-DXjjV6Sh.js} +4 -4
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js.map → ResourcePoolConsoleApp-DXjjV6Sh.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js → RouteErrorBoundary-D1LZxQjN.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js.map → RouteErrorBoundary-D1LZxQjN.js.map} +1 -1
- package/dist/core/web/public/next/assets/SeatSelector-CT92PqM_.js +3 -0
- package/dist/core/web/public/next/assets/{SeatSelector-DaUO-zoK.js.map → SeatSelector-CT92PqM_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js → Segmented-BMvq-FfD.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js.map → Segmented-BMvq-FfD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js → Select-DkdeoSQn.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js.map → Select-DkdeoSQn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js → SessionInsightChip-CwlakUYU.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js.map → SessionInsightChip-CwlakUYU.js.map} +1 -1
- package/dist/core/web/public/next/assets/SessionSearch-DFByh2NZ.js +2 -0
- package/dist/core/web/public/next/assets/{SessionSearch-B5aQ0BCM.js.map → SessionSearch-DFByh2NZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js.map +1 -0
- package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js → Sheet-C7APkGPt.js} +2 -2
- package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js.map → Sheet-C7APkGPt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js → ShortcutsOverlay-ZPyXUS_I.js} +2 -2
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js.map → ShortcutsOverlay-ZPyXUS_I.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-BRc1vGDF.css +1 -0
- package/dist/core/web/public/next/assets/Sidebar-Chsgazmk.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-Chsgazmk.js.map +1 -0
- package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js → Slider-B0kjW7cd.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js.map → Slider-B0kjW7cd.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js → StatusBadge-wv4e6f8b.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js.map → StatusBadge-wv4e6f8b.js.map} +1 -1
- package/dist/core/web/public/next/assets/StepBand-Db8WPw8J.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-Db8WPw8J.js.map +1 -0
- package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js → Surface-BkDrQ4t3.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js.map → Surface-BkDrQ4t3.js.map} +1 -1
- package/dist/core/web/public/next/assets/Swimlane-Dcve56cP.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-Dcve56cP.js.map +1 -0
- package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js → Switch-DamlpSMY.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js.map → Switch-DamlpSMY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js → Tag-Cs4tudBN.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js.map → Tag-Cs4tudBN.js.map} +1 -1
- package/dist/core/web/public/next/assets/TerminalPane-BDkKFych.js +7 -0
- package/dist/core/web/public/next/assets/TerminalPane-BDkKFych.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-BwfMbnJz.css +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BE72VyBL.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-DKqAf-eD.js.map → UniverseConsoleApp-BE72VyBL.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js → UniverseView-BbmYY2P4.js} +2 -2
- package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js.map → UniverseView-BbmYY2P4.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-DsB-Jqyl.css +1 -0
- package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js +2 -0
- package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CXJWDiEM.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +1 -0
- package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js +10 -0
- package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-BnjZy8a-.js +2 -0
- package/dist/core/web/public/next/assets/actions-BnjZy8a-.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +1 -0
- package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js → budget-queries-Cp6vO7FH.js} +2 -2
- package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js.map → budget-queries-Cp6vO7FH.js.map} +1 -1
- package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js +2 -0
- package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-9-Yb211u.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-9-Yb211u.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-BmbKhjqw.js +2 -0
- package/dist/core/web/public/next/assets/charts-BmbKhjqw.js.map +1 -0
- package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js +2 -0
- package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js.map +1 -0
- package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js → command-bus-DHJJLWh8.js} +2 -2
- package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js.map → command-bus-DHJJLWh8.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-model-BGznyHNQ.js +2 -0
- package/dist/core/web/public/next/assets/context-model-BGznyHNQ.js.map +1 -0
- package/dist/core/web/public/next/assets/context-model-DeJ28uSZ.js +2 -0
- package/dist/core/web/public/next/assets/context-model-DeJ28uSZ.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-_mEgy4eg.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-_mEgy4eg.js.map +1 -0
- package/dist/core/web/public/next/assets/context.module-BijAfoJw.js +2 -0
- package/dist/core/web/public/next/assets/context.module-BijAfoJw.js.map +1 -0
- package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js → control-queries-C4TG8blN.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js.map → control-queries-C4TG8blN.js.map} +1 -1
- package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +2 -0
- package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-BB7Fi6hT.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-BB7Fi6hT.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-mnIwSpRp.js +2 -0
- package/dist/core/web/public/next/assets/{dock-panes-BNTLvX7G.js.map → dock-panes-mnIwSpRp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js → dock-store-CdHQRP8s.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js.map → dock-store-CdHQRP8s.js.map} +1 -1
- package/dist/core/web/public/next/assets/fleet-model-B4FKC7fH.js +2 -0
- package/dist/core/web/public/next/assets/fleet-model-B4FKC7fH.js.map +1 -0
- package/dist/core/web/public/next/assets/format-DKrNjdwD.js +2 -0
- package/dist/core/web/public/next/assets/format-DKrNjdwD.js.map +1 -0
- package/dist/core/web/public/next/assets/format-lW58rL2y.js +2 -0
- package/dist/core/web/public/next/assets/format-lW58rL2y.js.map +1 -0
- package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js → git-model-DaGw1SzS.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js.map → git-model-DaGw1SzS.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-DG1fmn4y.js +2 -0
- package/dist/core/web/public/next/assets/global-DG1fmn4y.js.map +1 -0
- package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js → guarded-action--lguLXfz.js} +2 -2
- package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js.map → guarded-action--lguLXfz.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-DWb24OA6.js → icons-YPgbel-I.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-DWb24OA6.js.map → icons-YPgbel-I.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-afDA8cwW.js → index-Dk8R-3a7.js} +3 -3
- package/dist/core/web/public/next/assets/{index-afDA8cwW.js.map → index-Dk8R-3a7.js.map} +1 -1
- package/dist/core/web/public/next/assets/live-model-44wEU6I8.js +2 -0
- package/dist/core/web/public/next/assets/live-model-44wEU6I8.js.map +1 -0
- package/dist/core/web/public/next/assets/mind-B9PzLcl0.css +1 -0
- package/dist/core/web/public/next/assets/mind.module-BOABBdi_.js +2 -0
- package/dist/core/web/public/next/assets/mind.module-BOABBdi_.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-DjXM3IDg.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-C6E10SPX.js.map → mutations-DjXM3IDg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js → overnight-queries-Be_eossf.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js.map → overnight-queries-Be_eossf.js.map} +1 -1
- package/dist/core/web/public/next/assets/pane-chrome-8JmEhHVD.css +1 -0
- package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js +2 -0
- package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-Dl3SEQvh.js +1 -0
- package/dist/core/web/public/next/assets/{queries-BuYIEHst.js → queries-CYEVCq5r.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-BuYIEHst.js.map → queries-CYEVCq5r.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js → reasoning-pref-a_ZP6GzU.js} +2 -2
- package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js.map → reasoning-pref-a_ZP6GzU.js.map} +1 -1
- package/dist/core/web/public/next/assets/seat-subscription-CRigL-GE.js +2 -0
- package/dist/core/web/public/next/assets/seat-subscription-CRigL-GE.js.map +1 -0
- package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js → section-visibility-u7q-Q9AA.js} +2 -2
- package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js.map → section-visibility-u7q-Q9AA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js → sidebar-model-i4WRuQ6j.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js.map → sidebar-model-i4WRuQ6j.js.map} +1 -1
- package/dist/core/web/public/next/assets/slots-CV9ZuLQU.js +3 -0
- package/dist/core/web/public/next/assets/{slots-W8gkmdfE.js.map → slots-CV9ZuLQU.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-data-DLvmUX9z.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-DLvmUX9z.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js.map +1 -0
- package/dist/core/web/public/next/assets/tasks-model-DWs5u9RO.js +2 -0
- package/dist/core/web/public/next/assets/{tasks-model-CnYQzgxk.js.map → tasks-model-DWs5u9RO.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js → terminal-icons-Ct9cZsEK.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js.map → terminal-icons-Ct9cZsEK.js.map} +1 -1
- package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js → tool-semantics-GX8ScuSH.js} +2 -2
- package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js.map → tool-semantics-GX8ScuSH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js → turn-files-BPHQzYuH.js} +2 -2
- package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js.map → turn-files-BPHQzYuH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js → usage-queries-CI_y9oWZ.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js.map → usage-queries-CI_y9oWZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/use-guarded-action-DVCtLzSo.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DVCtLzSo.js.map +1 -0
- package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js → use-ticker-C3LQ2IYs.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js.map → use-ticker-C3LQ2IYs.js.map} +1 -1
- package/dist/core/web/public/next/assets/use-token-gate-B5gOFkeH.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-B5gOFkeH.js.map +1 -0
- package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js → useActivity-C3R1Sudh.js} +2 -2
- package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js.map → useActivity-C3R1Sudh.js.map} +1 -1
- package/dist/core/web/public/next/assets/useChartWidth-0APW0BR3.js +2 -0
- package/dist/core/web/public/next/assets/useChartWidth-0APW0BR3.js.map +1 -0
- package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +1 -0
- package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js → useSeatsRefresh-BN8bso-n.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js.map → useSeatsRefresh-BN8bso-n.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js.map +1 -0
- package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js → verse-queries-2PxoBISm.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js.map → verse-queries-2PxoBISm.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js +3 -0
- package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-ui-store-Dy4HuDBV.js +3 -0
- package/dist/core/web/public/next/assets/{verse-ui-store-KTTKfv-T.js.map → verse-ui-store-Dy4HuDBV.js.map} +1 -1
- package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js → viewport-DDoJ_xVq.js} +2 -2
- package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js.map → viewport-DDoJ_xVq.js.map} +1 -1
- package/dist/core/web/public/next/assets/warmup-BsL2LdR-.js +3 -0
- package/dist/core/web/public/next/assets/warmup-BsL2LdR-.js.map +1 -0
- package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js → workspace-model-Dd3LmIym.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js.map → workspace-model-Dd3LmIym.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/Advanced-CHjxJt2z.css +0 -1
- package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-CoMngwNB.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-C9BpPVLr.css +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js.map +0 -1
- package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js +0 -2
- package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-wgFP9MUA.css +0 -1
- package/dist/core/web/public/next/assets/ChatSection-B9cdRKUh.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js +0 -2
- package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js.map +0 -1
- package/dist/core/web/public/next/assets/Composer-CkcwbQhG.css +0 -1
- package/dist/core/web/public/next/assets/Composer.module-DJMdrqNt.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-Csboxnn0.css +0 -1
- package/dist/core/web/public/next/assets/DockHost-BGnTgdIb.css +0 -1
- package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js +0 -3
- package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-w9AjqfTR.css +0 -1
- package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js +0 -2
- package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-1UncWBpW.js +0 -2
- package/dist/core/web/public/next/assets/MessageMarkdown-C4pl9LI5.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-Czcl3L_Q.css +0 -1
- package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-SkhvvdLb.css +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-B_BsS9pr.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-CtCPpgoX.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-WQJFjSXe.css +0 -1
- package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-DaUO-zoK.js +0 -3
- package/dist/core/web/public/next/assets/SessionSearch-B5aQ0BCM.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-DfD8MNZt.css +0 -1
- package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js +0 -7
- package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-CmE2QL-Q.css +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-DKqAf-eD.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-DwgNOYvi.css +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-C0V221WL.css +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-DQXMVDf7.css +0 -1
- package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js +0 -10
- package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-Bszsdpms.js +0 -2
- package/dist/core/web/public/next/assets/actions-Bszsdpms.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-Dug8YIf0.css +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-D4NaLaXA.js +0 -2
- package/dist/core/web/public/next/assets/charts-D4NaLaXA.js.map +0 -1
- package/dist/core/web/public/next/assets/colors-B-vHsX1S.js +0 -2
- package/dist/core/web/public/next/assets/colors-B-vHsX1S.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js +0 -2
- package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js.map +0 -1
- package/dist/core/web/public/next/assets/context.module-B_k02HNU.js +0 -2
- package/dist/core/web/public/next/assets/context.module-B_k02HNU.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-BNTLvX7G.js +0 -2
- package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js +0 -2
- package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js.map +0 -1
- package/dist/core/web/public/next/assets/format-BNYWGJat.js +0 -2
- package/dist/core/web/public/next/assets/format-BNYWGJat.js.map +0 -1
- package/dist/core/web/public/next/assets/global-DVgMguLr.js +0 -2
- package/dist/core/web/public/next/assets/global-DVgMguLr.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js +0 -2
- package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js.map +0 -1
- package/dist/core/web/public/next/assets/mind-B-lYfSUJ.css +0 -1
- package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js +0 -2
- package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-C6E10SPX.js +0 -2
- package/dist/core/web/public/next/assets/primitives-DQvYikjm.js +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js +0 -2
- package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-W8gkmdfE.js +0 -3
- package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js.map +0 -1
- package/dist/core/web/public/next/assets/tasks-model-CnYQzgxk.js +0 -2
- package/dist/core/web/public/next/assets/types-Dypu22dp.js +0 -3
- package/dist/core/web/public/next/assets/types-Dypu22dp.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js.map +0 -1
- package/dist/core/web/public/next/assets/useChartWidth-B8E5mJgM.css +0 -1
- package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js +0 -2
- package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-E98kXngO.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-E98kXngO.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js +0 -2
- package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-ui-store-KTTKfv-T.js +0 -3
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DockHost-CBV_6Ehi.js","assets/index-afDA8cwW.js","assets/global-DVgMguLr.js","assets/global-_tOCFt9y.css","assets/MutationTokenDialog-Dn0tzCrh.js","assets/MutationTokenDialog-Cum_DqQZ.css","assets/workbench-types-DzN-5trg.js","assets/dock-store-_E5h6TEq.js","assets/viewport-ZB86jdES.js","assets/types-Dypu22dp.js","assets/verse-store-BgKx_YGs.js","assets/context-queries-DVdSLrYy.js","assets/verse-queries-BjQoOTwv.js","assets/verse-model-E98kXngO.js","assets/context-model-Bto3LZn2.js","assets/workspace-model-4hq_Mv3N.js","assets/ActionMenu-DhbNne-M.js","assets/ActionMenu-DPjsLU1g.css","assets/dock-icons-oG8d7mNZ.js","assets/dock-icons-1w9hA2-h.css","assets/tool-semantics-CTRuLF5j.js","assets/line-diff-B5Eonif2.js","assets/tasks-model-CnYQzgxk.js","assets/sidebar-model-C8fyqSQY.js","assets/use-token-gate-DYA2-ALC.js","assets/EmptyState-DdJ4CxtO.js","assets/EmptyState-B3YUPGaa.css","assets/slots-W8gkmdfE.js","assets/Button-0-nNbv1h.js","assets/Button-DrnKsvnQ.css","assets/dock-panes-BNTLvX7G.js","assets/Switch-BzRXtNPt.js","assets/Switch-CU044EaE.css","assets/context.module-B_k02HNU.js","assets/context-DiToyj6s.css","assets/DockHost-BGnTgdIb.css","assets/NewChatDialog-B_BsS9pr.js","assets/Segmented-B_8c_83S.js","assets/Segmented-BnjHbKzH.css","assets/git-model-5v5xGobf.js","assets/SeatSelector-DaUO-zoK.js","assets/capacity-strip-model-BR539Ci8.js","assets/seat-subscription-CrWOV4Qc.js","assets/Composer.module-DJMdrqNt.js","assets/Composer-CkcwbQhG.css","assets/CapacityStrip-D6Yyg4a1.js","assets/section-visibility-CSrsTcwK.js","assets/Tag-DEEbDz7T.js","assets/Tag-D0rAEciH.css","assets/budget-queries-Dacv1VYP.js","assets/useSeatsRefresh-4Ov9eT1F.js","assets/CapacityStrip-wgFP9MUA.css","assets/folder-picker-C8zo3A56.js","assets/NewChatDialog-yyQpA9p_.css","assets/Workspace-DtJb5tiM.js","assets/highlight-CMCZK9jW.js","assets/DiffViewer-tOGWk0CA.js","assets/DiffViewer-C8HHTnVE.css","assets/command-catalog-s3W6Z96D.js","assets/verse-ui-store-KTTKfv-T.js","assets/composer-keys-CYz4U4Bg.js","assets/icons-DWb24OA6.js","assets/VerseConsoleApp-bjARLPwN.js","assets/RouteErrorBoundary-AyUPCIb3.js","assets/RouteErrorBoundary-6RMd_aZg.css","assets/guarded-action-vOPc8v75.js","assets/command-bus-CpYuam1F.js","assets/useActivity-Cg_9-7nt.js","assets/VerseConsoleApp-C0V221WL.css","assets/MessageMarkdown-C4pl9LI5.js","assets/MessageMarkdown-Czcl3L_Q.css","assets/reasoning-pref-BVzGczV7.js","assets/Meter-C18ciKz4.js","assets/Meter-CYt9KpM0.css","assets/Workspace-DQXMVDf7.css","assets/Sidebar-q11dtYZf.js","assets/RefreshIndicator-CnhEovMZ.js","assets/RefreshIndicator-CVv22U_j.css","assets/Sidebar-DfD8MNZt.css","assets/turn-files-BvB5LLNw.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e,n as t,o as n,s as r,t as i}from"./index-afDA8cwW.js";import{E as a,I as o,O as s,T as c,a as l,c as u,g as d,h as f,m as p,p as ee,s as m}from"./global-DVgMguLr.js";import{n as te,t as ne}from"./MutationTokenDialog-Dn0tzCrh.js";import{r as re}from"./RouteErrorBoundary-AyUPCIb3.js";import{l as ie}from"./command-catalog-s3W6Z96D.js";import{b as ae,g as oe,h as se,m as ce,p as le,s as ue,t as de,x as fe}from"./dock-store-_E5h6TEq.js";import{C as pe,o as me,p as he,v as ge,w as h,x as _e}from"./verse-ui-store-KTTKfv-T.js";import{C as ve,S as g,T as ye,_ as be,a as xe,d as Se,f as Ce,i as we,l as Te,m as Ee,p as De,r as Oe,s as ke,u as _,w as Ae,x as je,y as v}from"./verse-queries-BjQoOTwv.js";import{a as y}from"./command-bus-CpYuam1F.js";import{i as Me,r as Ne}from"./section-visibility-CSrsTcwK.js";import{p as Pe}from"./VerseConsoleApp-bjARLPwN.js";import{_ as Fe,a as Ie,d as Le,f as Re,h as ze,i as Be,m as b,n as Ve,o as He,p as Ue,s as We,t as x,u as S}from"./verse-store-BgKx_YGs.js";import{t as Ge}from"./Button-0-nNbv1h.js";var C=r(e(),1),w=new Map;function T(e,t){return w.set(e,t),()=>{w.get(e)===t&&w.delete(e)}}function E(e,t){let n=t.replace(/\s+$/,``);return e.trim()?`${e.replace(/\s+$/,``)}\n\n${n}`:n}function Ke(e=document){let t=e.querySelector(`textarea[aria-label="Message"]`);return t instanceof HTMLTextAreaElement?t:null}function qe(e,t){if(!t.trim())return!1;let n=w.get(e);if(n)return n(t),!0;let r=Ke();if(!r||r.disabled)return!1;let i=E(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 Je(e){return`verse-session-roots:${e}`}var D={key:`verse-session-roots:none`,fetch:async()=>null};function Ye(e){return e?[e.projectPath,...(e.extraRoots??[]).filter(t=>t!==e.projectPath)]:[]}function Xe(e){let t=e?.id??null,n=(0,C.useMemo)(()=>t?{key:Je(t),fetch:e=>_(t,e)}:D,[t]),r=p(n),i=f(n),a=e?.turnCount??0,o=(0,C.useRef)({id:t,turns:a});(0,C.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,C.useMemo)(()=>Ye(e),[e?.projectPath,e?.extraRoots]),u=(0,C.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 Ze=new Set;function O(e){return Ze.add(e),()=>Ze.delete(e)}function Qe(e){let t=!1;for(let n of[...Ze])n(e)&&(t=!0);return t}var k=new Set;function $e(e){return k.add(e),()=>k.delete(e)}function et(){let e=!1;for(let t of[...k])t()&&(e=!0);return e}var A=new Set;function j(e){return A.add(e),()=>A.delete(e)}function tt(e){let t=!1;for(let n of[...A])n(e)&&(t=!0);return t}var M=t(),N=[`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 P(e){return Math.min(1e3*2**e,15e3)}var F=e=>e===null||typeof e==`number`&&Number.isFinite(e)&&e>=0;function nt(e){return e.type===`context`?typeof e.contextTokens==`number`&&Number.isFinite(e.contextTokens)&&e.contextTokens>=0&&typeof e.exact==`boolean`&&F(e.contextWindow)&&(e.autoCompactAt===void 0||F(e.autoCompactAt)):e.type!==`compaction`||(e.trigger===`auto`||e.trigger===`manual`)&&F(e.preTokens)&&F(e.postTokens)&&F(e.durationMs)}var I=e=>e===void 0||typeof e==`number`&&Number.isFinite(e)&&e>=0;function L(e){switch(e.type){case`thinking-delta`:return typeof e.text==`string`;case`thinking-progress`:return e.estimatedTokens!==void 0&&I(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`)&&I(e.outTokens)&&I(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 R(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`||!nt(t)||!L(t)?null:t}catch{return null}}var z=`verse-sessions`;function rt(e=!0){return`/api/events?${e?`topics=${z}&`:``}client=${encodeURIComponent(s())}`}var it=!1;function at(){let e=null,t=null,n=0,r=!1,i=!1,o=()=>{if(r||typeof EventSource>`u`||a().phase!==`authenticated`)return;let s=!it&&!i,c=new EventSource(rt(s),{withCredentials:!0}),l=!1;e=c,c.onopen=()=>{l=!0,n=0,i&&=(it=!0,!1)},c.addEventListener(`verse-sessions`,()=>Se()),c.onerror=()=>{if(c.close(),e===c&&(e=null),!(r||a().phase!==`authenticated`)){if(!l&&s){i=!0,o();return}i=!1,t=setTimeout(()=>{t=null,n+=1,o()},P(n))}}};return o(),()=>{r=!0,t&&clearTimeout(t),t=null,e?.close(),e=null}}var ot=9e4,st=250;function ct(e,t){let n=Number.isSafeInteger(t)&&t>0?`after=${t}&`:``;return`${ve(e,`/events`)}?${n}client=${encodeURIComponent(s())}`}function lt(e){return Math.min(1e3*2**e,15e3)}function ut(){return globalThis.IS_REACT_ACT_ENVIRONMENT===!0}var dt=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:st);return()=>{t=!0,r!==null&&typeof cancelAnimationFrame==`function`&&cancelAnimationFrame(r),clearTimeout(i)}};function ft(e){return ut()?(e(),null):dt(e)}var pt=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=ft(()=>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=[],x(this.sessionId,e).settled&&Se()}drop(){this.scheduled=!1,this.cancel?.(),this.cancel=null,this.queue=[]}},mt=!1,ht=0;function gt(e){let t=null,n=null,r=0,i=!1,o=!1,s=new pt(e),c=()=>{if(i||typeof EventSource>`u`||a().phase!==`authenticated`)return;b(e,r===0?`connecting`:`reconnecting`);let l=mt||o?0:He(e).lastSeq,u=new EventSource(ct(e,l),{withCredentials:!0}),d=!1;t=u,u.onopen=()=>{d=!0,r=0,o&&=(mt=!0,!1),b(e,`open`)};for(let e of N)u.addEventListener(e,e=>{if(t!==u)return;let n=R(e.data);n&&s.push(n)});u.onerror=f=>{if(!(typeof MessageEvent<`u`&&f instanceof MessageEvent)&&(s.flush(),!i)){if(typeof u.readyState==`number`&&u.readyState===ht){b(e,`reconnecting`);return}if(u.close(),t===u&&(t=null),b(e,`reconnecting`),a().phase===`authenticated`){if(!d&&l>0&&!o){o=!0,c();return}o=!1,n=setTimeout(()=>{n=null,r+=1,c()},lt(r))}}}},l=()=>{n&&clearTimeout(n),n=null,t?.close(),t=null};return c(),{close(){i||(i=!0,l(),s.flush(),s.drop(),b(e,`closed`))},restart(){i||(l(),s.flush(),r=0,c())}}}var B=new Map;function V(e){let t=B.get(e);t&&(B.delete(e),t.idleTimer&&clearTimeout(t.idleTimer),t.stream.close())}function _t(){let e=[...B.entries()].filter(([,e])=>e.refs===0).sort((e,t)=>e[1].releasedAt-t[1].releasedAt);for(;e.length>1;)V(e.shift()[0])}function H(e){let t=B.get(e);t?(t.refs+=1,t.idleTimer&&clearTimeout(t.idleTimer),t.idleTimer=null):(t={stream:gt(e),refs:1,idleTimer:null,releasedAt:0},B.set(e,t));let n=t,r=!1;return()=>{r||(r=!0,B.get(e)===n&&(--n.refs,!(n.refs>0)&&(n.releasedAt=Date.now(),n.idleTimer=setTimeout(()=>{B.get(e)===n&&n.refs===0&&V(e)},ot),_t())))}}function vt(){for(let e of[...B.keys()])V(e)}Fe(e=>{e.kind===`reset`?vt():V(e.sessionId)});function yt(e,t={}){let n=new AbortController,r=null,i=!1,a=()=>{i||r||(r=H(e))},o=He(e);return t.reload!==!0&&o.loaded&&o.loadError===null?a():(t.reload&&B.get(e)?.stream.restart(),Te(e,n.signal).then(t=>{n.signal.aborted||(S(e,t.session,t.events),a())}).catch(t=>{n.signal.aborted||Le(e,t instanceof Error?t.message:`Could not load this chat.`)})),()=>{i=!0,n.abort(),r?.(),r=null}}var U=()=>()=>{};function W(e){return(0,C.useCallback)(t=>e?ze(e,t):U(),[e])}function bt(e,t=0){let n=W(e),r=(0,C.useSyncExternalStore)(n,()=>Ie(e),()=>Ie(e)),i=(0,C.useRef)({sessionId:null,reload:t});return(0,C.useEffect)(()=>{let n=i.current;if(i.current={sessionId:e,reload:t},e)return yt(e,{reload:n.sessionId===e&&n.reload!==t})},[e,t]),r}function xt(e){let t=W(e);return(0,C.useSyncExternalStore)(t,()=>We(e),()=>We(e))}function St(e){let t=W(e);return(0,C.useSyncExternalStore)(t,()=>Be(e),()=>Be(e))}var Ct=5e3,G=new Map,wt=new Set;function K(e){return wt.add(e),()=>wt.delete(e)}function Tt(){return G}function Et(e,t){if(!((G.get(e)??-1)>=t)){G=new Map(G).set(e,t);for(let e of[...wt])e();Ce(e,t)}}function Dt(){return(0,C.useSyncExternalStore)(K,Tt,Tt)}function Ot(){let e=p(v,{freshMs:4500}),t=p(g),n=f(v),r=(0,C.useCallback)(()=>n(),[n]);Ne(r,Ct);let i=Dt();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}},kt=1,At=`ashlr.verse.panels.v1`,jt=`ashlr.verse.ui.v2`,Mt={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 Nt(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?kt:0)+(t.resourcesVisible?kt: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 Pt(){return{sidebar:q.sidebar.def,resources:q.resources.def}}function Ft(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 It(){try{return Ft(localStorage.getItem(At))||(Ft(localStorage.getItem(jt))??Pt())}catch{return Pt()}}function Lt(e){try{localStorage.setItem(At,JSON.stringify({sidebar:e.sidebar,resources:e.resources}))}catch{}}var Y=It(),X=Mt,Z={desired:Y,effective:Nt(Y,X)},Rt=new Set;function zt(e,t){return e.sidebar===t.sidebar&&e.resources===t.resources}function Bt(){let e=Nt(Y,X);if(!(zt(Z.desired,Y)&&zt(Z.effective,e))){Z={desired:Y,effective:e};for(let e of Rt)e()}}function Vt(e){return Rt.add(e),()=>{Rt.delete(e)}}function Ht(){return Z}function Ut(e){(X.containerWidth!==e.containerWidth||X.sidebarVisible!==e.sidebarVisible||X.resourcesVisible!==e.resourcesVisible)&&(X=e,Bt())}function Wt(e){zt(Y,e)||(Y=e,Lt(Y),Bt())}function Q(e,t){Wt({...Y,[e]:J(e,t)})}function Gt(e,t){Q(e,Z.effective[e]+t)}function Kt(e){Q(e,q[e].def)}function qt(){return(0,C.useSyncExternalStore)(Vt,Ht,Ht)}var Jt=`verseResizing`;function Yt(e){try{e?document.body.dataset[Jt]=`true`:delete document.body.dataset[Jt]}catch{}}function Xt({side:e,label:t,className:n}){let r=qt(),i=q[e],a=r.effective[e],o=(0,C.useRef)(null),[s,c]=(0,C.useState)(!1),l=(0,C.useCallback)(()=>{o.current&&(o.current=null,c(!1),Yt(!1))},[]),u=(0,C.useCallback)(e=>{if(e.button===0){e.preventDefault(),o.current={pointerId:e.pointerId,originX:e.clientX,startWidth:a},c(!0),Yt(!0);try{e.currentTarget.setPointerCapture?.(e.pointerId)}catch{}}},[a]);(0,C.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),Yt(!1)}},[s,e,l]);let d=(0,C.useCallback)(t=>{let n=t.shiftKey?64:16,r=e===`sidebar`?1:-1;switch(t.key){case`ArrowRight`:Gt(e,n*r);break;case`ArrowLeft`:Gt(e,-n*r);break;case`Home`:Q(e,i.min);break;case`End`:Q(e,i.max);break;case`Enter`:Kt(e);break;default:return}t.preventDefault()},[e,i.min,i.max]);return(0,M.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:()=>Kt(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`},Zt=n({ChatSection:()=>bn,describeChatError:()=>gn,preloadChatSurface:()=>dn}),Qt=(0,C.lazy)(()=>i(()=>import(`./DockHost-CBV_6Ehi.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]))),$t=(0,C.lazy)(()=>i(()=>import(`./NewChatDialog-B_BsS9pr.js`).then(e=>({default:e.NewChatDialog})),__vite__mapDeps([36,1,2,3,4,5,12,6,37,38,10,9,11,39,13,14,40,41,42,43,44,45,46,47,48,49,50,51,15,52,53])));function en(e){let t=null,n=null,r=()=>(n??=e().then(e=>t=e,e=>{throw n=null,e}),n),i=(0,C.lazy)(()=>r().then(e=>({default:e})));function a(e){let[n]=(0,C.useState)(()=>t);return n?(0,M.jsx)(n,{...e}):(0,M.jsx)(i,{...e})}return typeof window<`u`&&r().catch(()=>void 0),{Slot:a,ready:r}}var tn=en(()=>i(()=>import(`./Workspace-DtJb5tiM.js`).then(e=>e.Workspace),__vite__mapDeps([54,1,2,3,4,5,55,56,57,58,6,8,7,59,12,60,61,62,63,64,65,66,46,67,68,69,70,10,9,11,41,13,42,43,44,49,50,16,17,18,19,20,21,22,23,28,29,71,24,27,25,26,30,72,73,74]))),nn=tn.Slot,rn=en(()=>i(()=>import(`./Sidebar-q11dtYZf.js`).then(e=>e.Sidebar),__vite__mapDeps([75,1,2,3,4,5,76,77,12,6,62,63,64,58,65,8,59,7,60,66,46,67,61,68,13,42,15,52,16,17,18,19,23,78]))),an=rn.Slot,on=un(()=>Promise.all([i(()=>import(`./tasks-model-CnYQzgxk.js`),__vite__mapDeps([22,13,1,2,3,23,20,21])),i(()=>import(`./turn-files-BvB5LLNw.js`),__vite__mapDeps([79,20,21]))]).then(([e,t])=>({otherRunningChats:e.otherRunningChats,lastTurnFiles:t.lastTurnFiles}))),sn=un(()=>i(()=>import(`./verse-model-E98kXngO.js`).then(e=>e.S).then(e=>({firstRunnableModel:e.firstRunnableModel,seatById:e.seatById})),__vite__mapDeps([13,1,2,3]))),cn=[],ln=[];function un(e){let t=null,n=null,r=()=>(n??=e().then(e=>t=e,e=>{throw n=null,e}),n);function i(){let[e,n]=(0,C.useState)(()=>({current:t}));return(0,C.useEffect)(()=>{if(e.current)return;let t=!0;return r().then(e=>{t&&n({current:e})},()=>void 0),()=>{t=!1}},[e]),e.current}return typeof window<`u`&&r().catch(()=>void 0),{ready:r,useLoaded:i}}function dn(){return Promise.all([tn.ready(),rn.ready(),on.ready(),sn.ready()])}function fn(){return(0,M.jsx)(`nav`,{className:$.sidebarSkeleton,"aria-busy":`true`,"aria-label":`Loading chat list`,children:[64,82,58,76,70].map(e=>(0,M.jsx)(l,{width:`${e}%`},e))})}function pn(){return(0,M.jsxs)(`div`,{className:$.workspaceSkeleton,role:`status`,"aria-label":`Loading chat`,children:[(0,M.jsx)(`div`,{className:$.skeletonHeader,children:(0,M.jsx)(l,{width:`32%`})}),(0,M.jsxs)(`div`,{className:$.skeletonBody,children:[(0,M.jsx)(l,{width:`72%`}),(0,M.jsx)(l,{width:`88%`}),(0,M.jsx)(l,{width:`64%`})]}),(0,M.jsx)(`div`,{className:$.skeletonComposer,children:(0,M.jsx)(l,{width:`100%`})})]})}var mn=`ashlr.verse.selected.v1`;function hn(){try{return localStorage.getItem(mn)}catch{return null}}function gn(e){return e instanceof u?"This server was started without dispatch — run `ashlr verse` to chat.":e instanceof m?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 _n(){let[e,t]=(0,C.useState)(()=>typeof window>`u`?1440:window.innerWidth||1440);return(0,C.useEffect)(()=>{let e=()=>t(window.innerWidth||1440);return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),e}function vn(){requestAnimationFrame(()=>{document.querySelector(`textarea[aria-label="Message"]`)?.focus()})}function yn(e){return e instanceof Element&&e.closest(`[role="dialog"], [role="menu"], [role="listbox"], [aria-modal="true"]`)!==null}function bn(){let e=p(je),t=p(Ae),n=d(Ae),r=d(je),i=ee(),a=re(),s=Pe(),l=Me(),u=se(),f=Ot(),m=_n(),ve=(0,C.useId)(),[g,Se]=(0,C.useState)(hn),[Ce,Te]=(0,C.useState)(``),[_,v]=(0,C.useState)({open:!1}),[Ne,Fe]=(0,C.useState)(!1),[Ie,Le]=(0,C.useState)(null),[ze,Be]=(0,C.useState)(0),[b,He]=(0,C.useState)({open:!1,reason:``}),[We,x]=(0,C.useState)(null),[S,w]=(0,C.useState)(null),[T,E]=(0,C.useState)(!1),[Ke,Je]=(0,C.useState)(0),D=(0,C.useRef)(null),Ye=(0,C.useRef)(null),Ze=qt(),O=(0,C.useMemo)(()=>e.data?.seats??[],[e.data]),Qe=(0,C.useMemo)(()=>e.data?.projects??[],[e.data]),k=p(ye),$e=(0,C.useMemo)(()=>k.data?.workspaces??[],[k.data]),A=e.data?.dispatchEnabled??!0,j=bt(g,ze),N=Xe(j.session),P=(0,C.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]),F=(0,C.useCallback)(e=>{Se(e);try{e?localStorage.setItem(mn,e):localStorage.removeItem(mn)}catch{}},[]);(0,C.useEffect)(()=>{g&&t.data&&!t.data.some(e=>e.id===g)&&!j.session&&F(null)},[g,t.data,j.session,F]),(0,C.useEffect)(()=>at(),[]);let nt=(0,C.useRef)(g);(0,C.useEffect)(()=>{_e(g),nt.current!==g&&(nt.current=g,de())},[g]);let I=j.session?.turnCount??null;(0,C.useEffect)(()=>{l&&g&&I!==null&&(typeof document>`u`||document.visibilityState!==`hidden`)&&Et(g,I)},[l,g,I]);let L=(0,C.useCallback)((e,t)=>i.hasHold?t():new Promise((n,r)=>{D.current={run:()=>{t().then(n,r)},cancel:()=>n(null)},He({open:!0,reason:e})}),[i.hasHold]),R=(0,C.useCallback)(e=>{e instanceof Oe||a.show(gn(e),`danger`)},[a]),z=(0,C.useCallback)((e={})=>{Le(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??he(n);v({open:!0,projectPath:n,seat:i})},[j.session]),rt=(0,C.useCallback)(async e=>{await L(`Starting a chat spawns an agent process for this project.`,async()=>{Fe(!0),Le(null);try{let t=await xe(e);ge(t.projectPath,{seatId:t.seatId,model:t.model}),Re(t.id,t),v({open:!1}),F(t.id),a.show(`Started “${t.title}”`,`success`)}catch(e){Le(gn(e))}finally{Fe(!1)}})},[L,F,a]),it=(0,C.useCallback)(async e=>{let t=g;return t?await L(`Sending a message runs the agent against this project.`,async()=>{Ue(t,`running`);try{let n=await Ee(t,e);return Re(t,n.session,n.turnId),!0}catch(e){return Ue(t,`idle`),R(e),!1}})===!0:!1},[g,L,R]),ot=(0,C.useCallback)((e=g)=>{e&&L(`Stopping the running turn.`,async()=>{try{await we(e)}catch(e){R(e)}})},[g,L,R]),st=(0,C.useCallback)(async(e,t)=>await L(`Renaming a chat.`,async()=>{try{let n=await De(e,t);return Re(e,n),!0}catch(e){return R(e),!1}})===!0,[L,R]),ct=(0,C.useCallback)(async e=>await L(`Deleting a chat removes its transcript from disk.`,async()=>{try{return await ke(e),Ve(e),o(e),e===g&&F(null),a.show(`Chat deleted.`,`neutral`),!0}catch(e){return R(e),!1}})===!0,[L,R,F,a,g]),lt=(0,C.useCallback)((e,t,n)=>{L(n,async()=>{try{await be(e,t)}catch(e){R(e)}})},[L,R]),ut=(0,C.useCallback)(e=>{let t=j.session;t&&(z({projectPath:t.projectPath,seat:e}),a.show(`Chats are bound to one seat — starting a new chat on the same project.`,`neutral`))},[j.session,z,a]),dt=(0,C.useCallback)(e=>{let t=P.find(t=>t.id===e)??null;t&&w(t)},[P]),ft=(0,C.useCallback)(e=>{e!==g&&F(e),x(e)},[g,F]),pt=(0,C.useCallback)(e=>{F(e),window.matchMedia?.(`(max-width: 760px)`)?.matches===!0&&h(!0)},[F]),mt=(0,C.useCallback)(()=>h(!s.sidebarCollapsed),[s.sidebarCollapsed]),ht=u.state.open&&(u.state.active===`terminal`||u.state.splitWith===`terminal`),gt=(0,C.useCallback)(()=>{ht?ce(`terminal`):ue({})},[ht]),B=(0,C.useCallback)(()=>ue({newTab:!0}),[]),V=(0,C.useRef)(0),_t=sn.useLoaded();(0,C.useEffect)(()=>{let e=s.command;if(e&&e.nonce!==V.current&&(e.name!==`new-chat`||_t)){switch(V.current=e.nonce,e.name){case`open-session`:e.sessionId&&F(e.sessionId);break;case`focus-composer`:vn();break;case`new-chat`:{let{seatById:t,firstRunnableModel:n}=_t,r=e.seatId?t(O,e.seatId):void 0,i=he(e.projectPath??null),a=r?i?.seatId===r.id?i.model:n(r)?.id:void 0;z({...e.projectPath===void 0?{}:{projectPath:e.projectPath},...r&&a?{seat:{seatId:r.id,model:a}}:{}});break}}me()}},[s.command,z,O,F,_t]);let H=new Map([[`chat.sidebar`,mt],[`chat.find`,()=>et()],[`chat.turn-prev`,()=>tt(-1)],[`chat.turn-next`,()=>tt(1)],[`dock.toggle`,le],[`dock.terminal`,gt],[`dock.terminal-new`,B],[`dock.preview`,()=>ce(`preview`)],[`dock.diff`,()=>ce(`diff`)]]);y(`chat.sidebar`,H.get(`chat.sidebar`)),y(`chat.find`,H.get(`chat.find`)),y(`chat.turn-prev`,H.get(`chat.turn-prev`)),y(`chat.turn-next`,H.get(`chat.turn-next`)),y(`dock.toggle`,H.get(`dock.toggle`)),y(`dock.terminal`,H.get(`dock.terminal`)),y(`dock.terminal-new`,H.get(`dock.terminal-new`)),y(`dock.preview`,H.get(`dock.preview`)),y(`dock.diff`,H.get(`dock.diff`));let vt=(0,C.useRef)(H);vt.current=H,(0,C.useEffect)(()=>{if(!l)return;let e=e=>{if(e.defaultPrevented||yn(e.target))return;let t=ie(e,[`chat`]);if(!t||t.scope!==`chat`||t.id===`chat.find`||t.id===`chat.turn-prev`||t.id===`chat.turn-next`)return;let n=vt.current.get(t.id);n&&(e.preventDefault(),n())};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[l]);let yt=e.data?!e.data.dispatchEnabled:!1,U=s.sidebarCollapsed,W=fe(m),xt=u.state.open&&u.state.tabs.length>0,St=xt&&W===`column`,Ct=U?0:q.sidebar.min,G=St?Math.max(oe.minWidth,Math.min(ae(u.state.width,m),Ke>0?Ke-480-Ct:1/0)):0;(0,C.useEffect)(()=>{let e=Ye.current;if(!e)return;let t=()=>{Je(e.clientWidth),Ut({containerWidth:Math.max(0,e.clientWidth-G),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,G]);let wt={"--verse-sidebar-width":`${Ze.effective.sidebar}px`,"--verse-dock-width":`${G}px`},K=on.useLoaded(),Tt=(0,C.useMemo)(()=>K?K.otherRunningChats(P,f.activity,g):cn,[K,P,f.activity,g]),Dt=(0,C.useMemo)(()=>K?K.lastTurnFiles(j.events,N.roots):ln,[K,N.roots,j.events]),kt={setPinned:(e,t)=>lt(e,{pinned:t},t?`Pinning a chat.`:`Unpinning a chat.`),setArchived:(e,t)=>lt(e,{archived:t},t?`Archiving a chat.`:`Unarchiving a chat.`),rename:st,handoff:ft,requestDelete:dt,dispatchEnabled:A};return(0,M.jsxs)(`div`,{ref:Ye,className:$.chat,style:wt,"data-sidebar":U?`collapsed`:`open`,"data-dock":St?`open`:`closed`,children:[(0,M.jsx)(C.Suspense,{fallback:(0,M.jsx)(fn,{}),children:(0,M.jsx)(an,{sessions:P,sessionsStatus:t.status,sessionsError:t.error?.message??null,projects:Qe,seats:O,selectedId:g,query:Ce,onQuery:Te,onSelect:pt,onNew:()=>z(),onRetry:()=>{n(),r()},onCollapse:()=>h(!0),onDisconnect:()=>{c()},activity:f.activity,meta:f.meta,localSeen:f.localSeen,actions:kt})}),U?null:(0,M.jsx)(Xt,{side:`sidebar`,label:`Resize chat list`,className:$.resize}),(0,M.jsx)(`button`,{type:`button`,className:$.scrim,"aria-label":`Close chat list`,tabIndex:-1,onClick:()=>h(!0)}),(0,M.jsxs)(`div`,{className:$.main,children:[e.status===`error`&&!e.data?(0,M.jsxs)(`div`,{role:`alert`,className:$.banner,children:[(0,M.jsx)(`span`,{children:e.error?.message??`Could not load Verse.`}),(0,M.jsx)(`button`,{type:`button`,onClick:r,children:`Retry`})]}):yt?(0,M.jsxs)(`div`,{role:`status`,className:$.bannerWarn,children:[`Read-only: this server was started without dispatch. Run `,(0,M.jsx)(`code`,{children:`ashlr verse`}),` to send messages.`]}):null,(0,M.jsx)(C.Suspense,{fallback:(0,M.jsx)(pn,{}),children:(0,M.jsx)(nn,{view:j,seats:O,projects:Qe,dispatchEnabled:A,locked:!i.hasHold,hasAnySessions:P.length>0,onSend:it,onStop:()=>ot(),onRename:e=>g?st(g,e):Promise.resolve(!1),onRequestDelete:()=>{g&&dt(g)},onSeatChange:ut,onNew:()=>z(),onRetry:()=>Be(e=>e+1),sidebarCollapsed:U,onToggleSidebar:()=>h(!U),onOpenSession:F,handoffOpen:We!==null&&We===g,onHandoffOpenChange:e=>x(e?g:null),otherRunning:Tt})})]}),xt?(0,M.jsx)(C.Suspense,{fallback:null,children:(0,M.jsx)(Qt,{presentation:W,windowWidth:m,columnWidth:G,session:j.session,seats:O,events:j.events,roots:N.roots,rootsData:N.data,rootsError:N.error,turnFiles:Dt,otherRunning:Tt,dispatchEnabled:A,onOpenSession:F,onHandoff:e=>x(e),onOpenAccounts:()=>pe(`apps`),onSendToChat:e=>{(!g||!qe(g,e))&&a.show(`Open a chat to send this to it.`,`neutral`)},onAddToMessage:e=>{(!g||!qe(g,e))&&a.show(`Open a chat to add this to its message.`,`neutral`)}})}):null,_.open?(0,M.jsx)(C.Suspense,{fallback:null,children:(0,M.jsx)($t,{open:!0,onClose:()=>v({open:!1}),projects:Qe,seats:O,workspaces:$e,initialProjectPath:_.projectPath??null,initialSeat:_.seat??null,busy:Ne,error:Ie,onCreate:rt,runMutation:L})}):null,(0,M.jsx)(te,{open:S!==null,onClose:()=>{T||w(null)},titleId:ve,title:`Delete this chat?`,description:S?`“${S.title||`Untitled chat`}” and its transcript are removed from this machine. This cannot be undone.`:void 0,children:(0,M.jsxs)(`div`,{className:$.dialogActions,children:[(0,M.jsx)(Ge,{variant:`ghost`,onClick:()=>w(null),disabled:T,children:`Keep`}),(0,M.jsx)(Ge,{variant:`danger`,busy:T,onClick:async()=>{let e=S;if(e){E(!0);try{await ct(e.id)}finally{E(!1),w(null)}}},children:`Delete`})]})}),(0,M.jsx)(ne,{open:b.open,reason:b.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:()=>{He({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{bn as ChatSection,O as a,Xe as c,gn as describeChatError,$e as i,E as l,St as n,j as o,dn as preloadChatSurface,xt as r,Qe as s,Zt as t,T as u};
|
|
3
|
-
//# sourceMappingURL=ChatSection-B9cdRKUh.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{ct as r,h as i,m as a,rt as o}from"./global-DVgMguLr.js";import{t as s}from"./RefreshIndicator-CnhEovMZ.js";import{t as c}from"./Swimlane-BR40WVcj.js";import{n as l,t as u}from"./BurnDown-4P1LDoCL.js";import{t as d}from"./AreaTrend-gUVXkfhf.js";import{s as f}from"./command-catalog-s3W6Z96D.js";import{n as p}from"./viewport-ZB86jdES.js";import"./verse-queries-BjQoOTwv.js";import{i as m,r as h}from"./section-visibility-CSrsTcwK.js";import{i as g}from"./useActivity-Cg_9-7nt.js";import{C as _,_ as v,a as y,l as b,m as x}from"./icons-DWb24OA6.js";import{_ as S,g as C,h as w,v as T}from"./VerseConsoleApp-bjARLPwN.js";import{t as E}from"./Segmented-B_8c_83S.js";import{t as D}from"./Tag-DEEbDz7T.js";import{n as O}from"./budget-queries-Dacv1VYP.js";import{t as k}from"./Button-0-nNbv1h.js";import{t as A}from"./BudgetControl-P5lMxHvQ.js";import{i as j}from"./format-BNYWGJat.js";import{t as ee}from"./use-ticker-hryPXnyp.js";import{a as te,i as ne,n as re,o as M,r as N,s as P,t as F,u as I}from"./surface-data-ZtCegYMQ.js";import{t as L}from"./Sheet-CVjk-cLI.js";import{n as ie,r as R,t as ae}from"./actions-Bszsdpms.js";import{a as oe,i as z,n as B,r as V,t as se}from"./Surface-CiYOdNKQ.js";import{n as ce}from"./LeaderCard-BuSDeATv.js";import{c as le,i as ue}from"./live-model-Dm6ITHvX.js";var H=n(e(),1),U={off:0,propose:1,autonomous:2},W={off:`Off`,propose:`Propose`,autonomous:`Autonomous`},de={off:`Off`,propose:`Propose`,autonomous:`Auto`},fe=[`off`,`propose`,`autonomous`];function pe(e,t){let n=U[e.switch],r=U[t];return r===n?`same`:r<n?`lower`:r<=U[e.maxSwitchWithoutGrant]?`raise`:`raise-needs-grant`}function me(e){return fe.map(t=>{let n=U[t]>Math.max(U[e.switch],U[e.maxSwitchWithoutGrant]);return{value:t,label:W[t],short:de[t],needsGrant:n,ariaLabel:n?`${W[t]} (needs a new grant — Touch ID)`:W[t]}})}var G=864e5,K=36e5;function he(e){if(!Number.isFinite(e)||e<=0)return`0m`;if(e>=3*G)return`${Math.floor(e/G)}d`;if(e>=G){let t=Math.floor(e/G),n=Math.floor((e-t*G)/K);return n?`${t}d ${n}h`:`${t}d`}return e>=K?`${Math.floor(e/K)}h`:`${Math.max(1,Math.floor(e/6e4))}m`}var q={none:`No grant`,active:`Active`,paused:`Paused, re-approve`,expired:`Expired, renew`,revoked:`Revoked, new grant`,invalid:`Grant invalid`};function ge(e,t){if(!e)return{label:`Grant unknown`,tone:`unknown`,detail:`The authority service did not answer, so the grant state is unknown.`,action:null};let n=e.grant;switch(n.state){case`active`:{let e=n.expiresAt?Date.parse(n.expiresAt):NaN;if(!Number.isFinite(e))return{label:`Active`,tone:`success`,detail:`A grant is active; its expiry could not be read.`,action:null};let r=e-t,i=r<G?`danger`:r<3*G?`warning`:`success`;return{label:he(r),tone:i,detail:`Grant active until ${new Date(e).toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`})}${r<3*G?` — renew soon`:``}.`,action:r<3*G?`grant`:null}}case`paused`:return{label:q.paused,tone:`warning`,detail:n.reason??`The grant is paused until you re-approve it.`,action:`re-approve`};case`expired`:return{label:q.expired,tone:`danger`,detail:n.reason??`The grant expired; autonomy is dark until a new one is signed.`,action:`grant`};case`revoked`:return{label:q.revoked,tone:`danger`,detail:n.reason??`The grant was revoked; a new one needs Touch ID.`,action:`grant`};case`invalid`:return{label:q.invalid,tone:`danger`,detail:n.reason??`The installed grant failed verification.`,action:`grant`};default:return{label:q.none,tone:`neutral`,detail:`No standing grant is installed; autonomy can only propose.`,action:`grant`}}}function _e(e){return e?e.kill?{key:`mode`,text:`Stopped`,tone:`danger`}:e.grant.state===`paused`?{key:`mode`,text:`Paused, re-approve`,tone:`warning`}:{key:`mode`,text:W[e.effectiveSwitch],tone:e.effectiveSwitch===`autonomous`?`success`:`neutral`}:{key:`mode`,text:`Autonomy unknown`,tone:`unknown`}}function ve(e){let t=[_e(e.authority)],n=e.building!==null||e.mergedToday!==null||e.revertsToday!==null;if(e.darkSince&&!(e.building&&e.building>0)){let n=new Date(e.darkSince);t.push({key:`dark`,text:`fleet dark since ${n.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})}`,tone:`neutral`})}else n?(e.building!==null&&t.push({key:`building`,text:`${e.building} building`}),e.mergedToday!==null&&t.push({key:`merged`,text:`${e.mergedToday} merged today`}),e.revertsToday!==null&&t.push({key:`reverts`,text:`${e.revertsToday} revert${e.revertsToday===1?``:`s`}`,tone:e.revertsToday>0?`warning`:void 0})):t.push({key:`fleet`,text:`fleet status unknown`,tone:`unknown`});return e.reserve&&t.push({key:`reserve`,text:`${e.reserve.label} ${Math.round(e.reserve.percent)}% reserved for you`}),t}function ye(e,t){let n=e.kind;return n===`new`?`grant`:n===`reapprove`?`re-approve`:t}function be(e){if(typeof e!=`object`||!e)return null;let t=e.result?.stop;if(typeof t!=`object`||!t)return null;let n=t,r=typeof n.liveExecutionLeases==`number`&&Number.isFinite(n.liveExecutionLeases)?Math.max(0,Math.round(n.liveExecutionLeases)):null,i=[];n.quiesced===!0||r===0?i.push(`Stopped. No agent is still running.`):r===null?i.push(`Stopped. Agents started before Stop may still be finishing; no new work starts.`):i.push(`Stopped. ${r} agent${r===1?``:`s`} started before Stop ${r===1?`is`:`are`} still finishing; no new work starts.`),typeof n.mergesRevoked==`number`&&n.mergesRevoked>0&&i.push(`${n.mergesRevoked} armed merge${n.mergesRevoked===1?` was`:`s were`} revoked.`);let a=Array.isArray(n.mergeRevokeFailures)?n.mergeRevokeFailures.length:0;return a>0&&i.push(`${a} armed merge${a===1?``:`s`} could not be revoked; Stop still blocks ${a===1?`it`:`them`}.`),i.join(` `)}var J=t(),xe=864e5;function Se(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}):`—`}function Ce(e){let t=Date.parse(e.issuedAt),n=Date.parse(e.expiresAt);return Number.isFinite(t)&&Number.isFinite(n)?Math.round((n-t)/xe):null}function we(e){let t=e.criteria,n=[`${e.repos.length} repo${e.repos.length===1?``:`s`}`,`${e.maxRisk} risk`,`≤ ${e.maxFiles} files / ${e.maxLines} lines`,`≤ ${e.maxMergesPerRepoPerDay} merges/repo/day`],r=[`${t.minMerges} merges`,`${t.minHours} h`,t.minPostMergeGreenPct?`≥ ${t.minPostMergeGreenPct}% green`:null,`≤ ${t.maxRevertRatePct}% reverts`].filter(Boolean);return`${n.join(` · `)} — advances after ${r.join(`, `)}`}function Te({draft:e}){let t=e.payload,n=Ce(t);return(0,J.jsxs)(`div`,{className:R.scope,children:[(0,J.jsxs)(`section`,{className:R.scopeBlock,"aria-label":`Expiry`,children:[(0,J.jsx)(z,{children:`Expiry`}),(0,J.jsxs)(`p`,{className:R.scopeLead,children:[n===null?`—`:`${n} days`,`, until `,Se(t.expiresAt)]}),(0,J.jsxs)(`p`,{className:R.scopeMeta,children:[`Signed by key `,(0,J.jsx)(`span`,{className:R.mono,children:t.keyId}),` · sequence `,t.grantSeq,` · bound to this Mac`]})]}),(0,J.jsxs)(`section`,{className:R.scopeBlock,"aria-label":`Repositories`,children:[(0,J.jsxs)(z,{children:[`Repositories (`,t.repos.length,`)`]}),(0,J.jsxs)(`table`,{className:R.scopeTable,children:[(0,J.jsx)(`thead`,{children:(0,J.jsxs)(`tr`,{children:[(0,J.jsx)(`th`,{scope:`col`,children:`Repo`}),(0,J.jsx)(`th`,{scope:`col`,children:`Up to`}),(0,J.jsx)(`th`,{scope:`col`,children:`Checks`}),(0,J.jsx)(`th`,{scope:`col`,children:`Risk`}),(0,J.jsx)(`th`,{scope:`col`,className:R.num,children:`Merges/day`})]})}),(0,J.jsx)(`tbody`,{children:t.repos.map(e=>(0,J.jsxs)(`tr`,{children:[(0,J.jsx)(`td`,{className:R.mono,children:e.nameWithOwner}),(0,J.jsx)(`td`,{children:e.stage===`merge`?`Merge`:`Propose`}),(0,J.jsx)(`td`,{children:e.enforcement===`server`?`GitHub`:`Local only`}),(0,J.jsx)(`td`,{children:e.maxRisk}),(0,J.jsx)(`td`,{className:R.num,children:e.maxMergesPerDay})]},e.nameWithOwner))})]}),(0,J.jsxs)(`p`,{className:R.scopeMeta,children:[`Every merge ≤ `,t.merge.maxFiles,` files / `,t.merge.maxLines,` lines · ashlr-hub itself: `,t.merge.selfRepo===`propose-only`?`propose only`:`merge outside authority code`]})]}),(0,J.jsxs)(`section`,{className:R.scopeBlock,"aria-label":`Spend`,children:[(0,J.jsx)(z,{children:`Spend`}),(0,J.jsxs)(`p`,{className:R.scopeLead,children:[`Up to `,t.spend.maxMode===`all-in`?`All-in`:t.spend.maxMode===`balanced`?`Balanced`:`Reserve`,` · metered APIs $`,t.spend.meteredUsdPerDay,`/day`]}),(0,J.jsx)(`ul`,{className:R.scopeList,children:Object.entries(t.spend.seats).map(([e,t])=>(0,J.jsxs)(`li`,{children:[(0,J.jsx)(`span`,{className:R.mono,children:e}),t.enabled?`: keeps ${t.reserveFloorPercent}% for you`:`: not used by autonomy`,t.enabled&&t.maxSessionWindowPercent!==void 0?`, never above ${t.maxSessionWindowPercent}% of its 5-hour window`:``,t.enabled?` · ${t.roles.join(`, `)}`:``]},e))})]}),(0,J.jsxs)(`section`,{className:R.scopeBlock,"aria-label":`Engines and Leader`,children:[(0,J.jsx)(z,{children:`Engines and Leader`}),(0,J.jsx)(`p`,{className:R.scopeLead,children:t.engines.join(`, `)||`none`}),(0,J.jsxs)(`p`,{className:R.scopeMeta,children:[`Leader classes `,t.leader.classes.length?t.leader.classes.join(` + `):`none (proposes only)`,` · class-B veto window `,t.leader.vetoMinutes,` min · goal conductor `,t.conductorGoals?`on`:`off`]})]}),(0,J.jsxs)(`section`,{className:R.scopeBlock,"aria-label":`Rollout ladder`,children:[(0,J.jsxs)(z,{children:[`Rollout ladder (`,t.rollout.stages.length,` stages, advances by itself)`]}),(0,J.jsx)(`ol`,{className:R.ladder,children:t.rollout.stages.map(e=>(0,J.jsxs)(`li`,{children:[(0,J.jsx)(`span`,{className:R.ladderId,children:e.id}),(0,J.jsx)(`span`,{children:we(e)})]},e.id))}),(0,J.jsx)(`p`,{className:R.scopeMeta,children:`Any sandbox violation or reserve breach drops it back one stage. It can never climb past the last stage.`})]}),(0,J.jsxs)(`p`,{className:R.scopeMeta,children:[`Draft digest `,(0,J.jsxs)(`span`,{className:R.mono,children:[e.digest.slice(0,16),`…`]})]})]})}function Ee({open:e,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}){let s=(0,H.useId)();return e?(0,J.jsx)(De,{titleId:s,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}):null}function De({titleId:e,intent:t,then:n,busy:r,why:i,onApprove:o,onClose:s}){let c=a(F,{freshMs:0}),l=c.data?.value??null,u=c.data?.reason??null;return(0,J.jsx)(L,{open:!0,onClose:s,titleId:e,width:600,title:t===`re-approve`?`Re-approve the standing grant`:`Approve a standing grant`,description:i,footer:(0,J.jsxs)(`div`,{className:R.sheetFooter,children:[(0,J.jsxs)(`p`,{className:R.sheetFootnote,children:[`Touch ID appears on this Mac. Lowering authority — Off, Stop, Revoke — never needs it.`,n?` After approval the switch moves to ${W[n]}.`:``]}),(0,J.jsxs)(`span`,{className:R.sheetButtons,children:[(0,J.jsx)(k,{variant:`ghost`,onClick:s,children:`Cancel`}),(0,J.jsx)(k,{variant:`primary`,icon:(0,J.jsx)(x,{}),disabled:!l,busy:r,onClick:()=>l&&o(l),children:`Approve with Touch ID`})]})]}),children:c.status===`loading`&&!c.data?(0,J.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Preparing the grant draft…`}):l?(0,J.jsx)(Te,{draft:l}):(0,J.jsx)(B,{tone:`unknown`,children:u??`The grant draft could not be read, so nothing can be approved from here.`})})}var Oe={"all-in":`All-in`,balanced:`Balanced`,reserve:`Reserve`};function ke(){let e=f(`fleet.stop`)?.guard?.confirm;return{title:e?.title??`Stop the fleet?`,body:e?.body??`Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.`,confirmLabel:e?.confirmLabel??`Stop fleet`,destructive:!0}}var Ae={title:`Resume the fleet?`,body:`Autonomy picks up at the switch position on its next tick. Stopping again is one click.`,confirmLabel:`Resume fleet`,destructive:!1};function je({tone:e}){return(0,J.jsx)(`span`,{className:R.dot,"data-tone":e,"aria-hidden":`true`})}function Me({read:e,loading:t,budgetMode:n,actions:r,compact:i,now:a}){let o=e?.value??null,[s,c]=(0,H.useState)(null),[l,u]=(0,H.useState)(null),[d,f]=(0,H.useState)(!1),p=!o,m=ge(o,a);function h(e){if(!o)return;let t=pe(o,e);if(t!==`same`){if(t===`raise-needs-grant`){let t=o.grant.state===`paused`;c({intent:t?`re-approve`:`grant`,then:e,why:t?`${o.grant.reason??`The grant is paused.`} ${W[e]} needs it re-approved.`:`${W[e]} is beyond what the installed grant allows, so it needs a new grant.`});return}r.act(()=>P({action:`switch`,to:e}),`Switch autonomy to ${W[e]}`)}}function g(e){if(!s)return;let{then:t}=s,n=ye(e,s.intent);r.act(()=>P({action:n,draftDigest:e.digest}),n===`re-approve`?`Re-approve the standing grant`:`Sign a new standing grant`,{onDone:e=>{c(null),t&&e&&U[t]<=U[e.maxSwitchWithoutGrant]&&t!==e.switch&&r.act(()=>P({action:`switch`,to:t}),`Switch autonomy to ${W[t]}`)}})}let y=me(o||{switch:`off`,maxSwitchWithoutGrant:`off`}),b=o?.kill??!1,S=p||r.busy||r.readOnly,C=(0,J.jsxs)(`div`,{className:R.switchWrap,title:p?e?.reason??`Reading autonomy state…`:void 0,children:[i?null:(0,J.jsx)(`span`,{className:R.barLabel,"aria-hidden":`true`,children:`Autonomy`}),(0,J.jsx)(E,{size:`sm`,"aria-label":`Autonomy`,value:o?.switch??`off`,onChange:h,options:y.map(e=>({value:e.value,label:(0,J.jsxs)(`span`,{className:R.switchOption,children:[i?e.short:e.label,e.needsGrant?(0,J.jsx)(x,{className:R.touchMark,width:12,height:12,"aria-hidden":`true`}):null]}),ariaLabel:e.ariaLabel,disabled:S}))})]}),w=()=>r.act(()=>P({action:`stop`}),`Stop the fleet`,{confirm:ke(),onDone:e=>u(be(e))}),T=()=>r.act(()=>P({action:`clear-stop`}),`Resume the fleet`,{confirm:Ae,onDone:()=>u(null)}),D=b?i?(0,J.jsx)(k,{variant:`subtle`,size:`sm`,icon:(0,J.jsx)(v,{}),iconOnly:!0,"aria-label":`Resume the fleet`,disabled:S,onClick:T}):(0,J.jsx)(k,{variant:`subtle`,size:`sm`,icon:(0,J.jsx)(v,{}),disabled:S,onClick:T,children:`Resume`}):i?(0,J.jsx)(k,{variant:`danger`,size:`sm`,icon:(0,J.jsx)(_,{}),iconOnly:!0,"aria-label":`Stop the fleet`,disabled:S,onClick:w}):(0,J.jsx)(k,{variant:`danger`,size:`sm`,icon:(0,J.jsx)(_,{}),disabled:S,onClick:w,children:`Stop`});return(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`div`,{className:R.bar,role:`toolbar`,"aria-label":`Autonomy controls`,"data-loading":t||void 0,children:[C,i?null:(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(Ne,{mode:n,onOpen:()=>f(!0)}),(0,J.jsx)(Pe,{chip:m,onOpen:e=>c({intent:e,then:null,why:m.detail})})]}),(0,J.jsx)(`span`,{className:R.barSpacer}),D]}),b&&l?(0,J.jsx)(`p`,{className:R.muted,role:`status`,children:l}):null,i?(0,J.jsxs)(`div`,{className:R.barSecondary,children:[(0,J.jsx)(Ne,{mode:n,onOpen:()=>f(!0)}),(0,J.jsx)(Pe,{chip:m,onOpen:e=>c({intent:e,then:null,why:m.detail})})]}):null,(0,J.jsx)(Ee,{open:s!==null,intent:s?.intent??`grant`,then:s?.then??null,why:s?.why??``,busy:r.busy,onApprove:g,onClose:()=>c(null)}),(0,J.jsx)(Fe,{open:d,onClose:()=>f(!1),status:o})]})}function Ne({mode:e,onOpen:t}){return(0,J.jsxs)(`button`,{type:`button`,className:R.pill,"aria-haspopup":`dialog`,onClick:t,children:[(0,J.jsx)(`span`,{className:R.pillLabel,children:`Budget`}),(0,J.jsx)(`span`,{children:e?Oe[e]:`—`}),(0,J.jsx)(y,{width:14,height:14,"aria-hidden":`true`})]})}function Pe({chip:e,onOpen:t}){let n=(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(je,{tone:e.tone}),(0,J.jsx)(`span`,{className:R.pillLabel,children:`Grant`}),(0,J.jsx)(`span`,{children:e.label})]});if(!e.action)return(0,J.jsx)(`span`,{className:R.chip,"data-tone":e.tone,title:e.detail,"aria-label":`Grant: ${e.label}. ${e.detail}`,role:`status`,children:n});let r=e.action;return(0,J.jsx)(`button`,{type:`button`,className:R.chip,"data-tone":e.tone,title:e.detail,"aria-haspopup":`dialog`,onClick:()=>t(r),"aria-label":`Grant: ${e.label}. ${e.detail}`,children:n})}function Fe({open:e,onClose:t,status:n}){let r=n?.grant.state===`active`?n.grant.maxMode:null;return(0,J.jsx)(L,{open:e,onClose:t,titleId:`command-budget-sheet`,width:560,title:`Budget`,description:r?`Your grant allows up to ${Oe[r]}. Autonomy never spends past it, whatever is selected here — moving toward Reserve is always instant.`:`No active grant: autonomy only proposes. The budget still decides which seats it would use.`,children:e?(0,J.jsx)(A,{maxMode:r}):null})}function Ie(e,t){if(!e.resetsAt)return null;let n=Date.parse(e.resetsAt);return Number.isFinite(n)?n-t:null}function Le(e,t,n){let r=t.id;if(e===`claude`){if(r===`five_hour`)return`session`;if(r===`seven_day`)return`weekly`;if(r.startsWith(`seven_day_`))return`model`}if(e===`grok`)return`weekly`;let i=Ie(t,n);if(e===`codex`){if(r.endsWith(`_secondary`))return`weekly`;if(r.endsWith(`_primary`))return i!==null&&i>189e5?`weekly`:`session`}return i!==null&&i<=189e5?`session`:`weekly`}var Re=864e5,ze=36e5;function Y(e,t,n,r=0){let i=e.length-r,a=i-n;if(a<0||n<=0)return null;let o=0;for(let n=a;n<i;n++){let r=t(e[n]);if(r===null||!Number.isFinite(r))return null;o+=r}return o}function Be(e,t,n){return e.slice(Math.max(0,e.length-n)).map(t)}function X(e){let t=e.filter(e=>e!==null&&Number.isFinite(e));return t.length?t.reduce((e,t)=>e+t,0)/t.length:null}function Ve(e){let t=e.meteredCostUsd;return typeof t==`number`&&Number.isFinite(t)&&t>=0?t:null}function He(e){if(!e)return null;let t=new Map(e.seatInfo.map(e=>[e.seatId,e])),n=[];for(let r of e.headroom){let e=t.get(r.seatId);if(!e||e.free)continue;let i=r.bindingWindow===`session`?r.sessionUsedPercent:r.bindingWindow===`weekly`?r.weeklyUsedPercent:null;n.push(`${e.label} ${i===null||!Number.isFinite(i)?`—`:`${Math.round(i)}%`}`)}return n.length?`${n.join(` · `)} of window used`:null}var Ue=e=>e>0?`+${e}`:String(e),Z=e=>`${e>0?`+`:``}${e.toFixed(1)}`,We=e=>`${e>0?`+`:e<0?`−`:``}$${Math.abs(e).toFixed(2)}`;function Ge(e){if(e===null||!Number.isFinite(e)||e<0)return`—`;let t=Math.round(e/6e4);if(t<60)return`${t}m`;let n=Math.floor(t/60);if(n<48)return t%60?`${n}h ${t%60}m`:`${n}h`;let r=Math.floor(n/24);return n%24?`${r}d ${n%24}h`:`${r}d`}function Ke(e){if(!e||e.repos.length===0)return[];let t=Math.max(...e.repos.map(e=>e.greenTrend.length));return Array.from({length:t},(n,r)=>X(e.repos.map(e=>e.greenTrend[r-(t-e.greenTrend.length)]??null)))}function qe({fleet:e,history:t,learning:n,policy:r,budget:i}){let a=t?.days??[],o=e=>e.merges.realized,s=Ve,c=e?.summary.merged7d??Y(a,o,7),l=Y(a,o,7,7),u=Y(a,o,7),d=u!==null&&l!==null?u-l:null,f=e?.summary.postMergeGreenPct7d??null,p=Ke(e),m=p.length>=14?X(p.slice(-7)):null,h=p.length>=14?X(p.slice(-14,-7)):null,g=m!==null&&h!==null?m-h:null,_=Y(a,s,7),v=Y(a,s,7,7),y=r?r.spend.meteredUsdPerDay:null,b=_===null?`—`:`$${_.toFixed(2)}${y===null?``:` / $${(y*7).toFixed(0)}`}`,x=a.some(e=>Ve(e)!==null),S=y===null?null:y===0?`metered APIs off ($0 cap)`:`cap $${y}/day`,C=He(i),w=[S,x?null:`metered split not reported yet`,C?`subscriptions: ${C}`:`subscriptions are window usage, not dollars — see seat capacity`].filter(Boolean).join(` · `),T=n?.active??null,E=(T?.experimentId?n?.experiments.find(e=>e.id===T.experimentId)??null:null)?.lift??null;return[{id:`merged`,label:`Merged · 7d`,value:c===null?`—`:String(c),delta:d===null?null:{value:d,unit:Math.abs(d)===1?`merge`:`merges`,versus:`vs prior 7d`,goodWhenPositive:!0,format:Ue},trend:a.length?Be(a,o,14):void 0,trendLabel:`Merges per day, last 14 days`,caption:e?.summary.mergedToday==null?`fleet merges on default branches`:`${e.summary.mergedToday} today`},{id:`green`,label:`Post-merge green`,value:f===null?`—`:`${Math.round(f)}%`,delta:g===null?null:{value:g,unit:`pts`,versus:`vs prior 7d`,goodWhenPositive:!0,format:Z},trend:p.length?p:void 0,trendLabel:`Post-merge green percent per day`,caption:f===null?`no completed post-merge watch yet`:`CI + suite 2 h after each merge`},{id:`cycle`,label:`Cycle time`,value:Ge(e?.summary.cycleTimeP50Ms7d??null),delta:null,trend:void 0,trendLabel:`Cycle time`,caption:`median, proposal → merge, 7d`},{id:`spend`,label:`Metered spend · 7d`,value:b,delta:_!==null&&v!==null?{value:_-v,versus:`vs prior 7d`,goodWhenPositive:!1,format:We}:null,trend:x?Be(a,s,14):void 0,trendLabel:`Metered (per-token API) spend per day`,caption:w},{id:`lift`,label:`Lift`,value:E?`${Z(E.mean)} pts`:`—`,delta:null,trend:void 0,trendLabel:`Harness lift`,caption:T?`harness ${T.id} vs baseline${E?` (95% ${Z(E.ciLow)} to ${Z(E.ciHigh)})`:``}`:`no harness adopted — defaults in force`}]}var Je=(e,t)=>e!==null&&Date.parse(e)>t;function Ye({lastLookedAt:e,fleet:t,leader:n,activity:r}){if(!e)return[];let i=Date.parse(e);if(!Number.isFinite(i))return[];let a=[],o=(t?.runs??[]).filter(e=>Je(e.endedAt,i)),s=e=>o.filter(t=>t.outcome===e).length,c=s(`merged`),l=s(`reverted`),u=s(`failed`)+s(`refused`);c&&a.push({id:`merged`,text:`${c} merged`,tone:`success`}),l&&a.push({id:`reverted`,text:`${l} reverted`,tone:`danger`}),u&&a.push({id:`failed`,text:`${u} refused or failed`,tone:`warning`});let d=(n?.timeline??[]).filter(e=>Date.parse(e.at)>i&&e.status===`ok`).length;d&&a.push({id:`memos`,text:`${d} new memo${d===1?``:`s`}`,tone:`info`});let f=(r?.needsYou??[]).filter(e=>Date.parse(e.since)>i).length;return f&&a.push({id:`needs`,text:`${f} new for you`,tone:`warning`}),a}var Xe={high:0,warn:1,info:2};function Ze(e){return[...e].sort((e,t)=>Xe[e.severity]-Xe[t.severity]||Date.parse(t.since)-Date.parse(e.since))}function Qe(e){return e?Object.entries(e.sources).filter(([,e])=>e!==`ok`).map(([e])=>e):[]}function $e(e,t){if(!t)return{...e};let n=Date.parse(t.sampledAt);if(!Number.isFinite(n))return{...e};let r={...e};for(let e of t.headroom){let t=e.bindingWindow===`session`?e.sessionUsedPercent:e.bindingWindow===`weekly`?e.weeklyUsedPercent:null;if(t===null||!Number.isFinite(t))continue;let i=r[e.seatId]??[];if(i.length&&i[i.length-1].t>=n)continue;let a=i.length&&t+20<i[i.length-1].used?[]:i;r[e.seatId]=[...a,{t:n,used:t}].slice(-240)}return r}var et={session:5*ze,weekly:7*Re};function tt(e,t){if(!t||e.bindingWindow===null)return null;let n=100-t.reservePercent,r=t.maxSessionWindowPercent??100,i,a;e.bindingWindow===`weekly`||e.weeklyUsedPercent===null&&n<r?(i=n,a=`Reserved for you`):(i=r,a=`5-hour ceiling`);let o=100-i;return o>0?{value:o,label:a}:null}function nt(e){let t=e===`session`?{weekday:`short`,hour:`numeric`,minute:`2-digit`}:{weekday:`short`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`};return e=>{let n=new Date(e);return Number.isNaN(n.getTime())?``:n.toLocaleString(`en-US`,t)}}function rt(e,t,n,r){if(!e?.capacity||n===null||t===`local`)return null;for(let i of e.capacity.windows){let e=typeof i.resetDescription==`string`?i.resetDescription.trim():``;if(e.length!==0&&Le(t,{id:i.id,usedPercent:i.usedPercent,resetsAt:i.resetsAt,resetDescription:i.resetDescription,limitReached:i.limitReached},r)===n)return e}return null}function it(e){return`resets ${e.replace(/^resets\s+/i,``)}`}function at(e,t,n){if(!e)return[];let r=new Map(e.seatInfo.map(e=>[e.seatId,e])),i=new Map((n??[]).map(e=>[e.id,e])),a=Date.parse(e.sampledAt),o=Number.isFinite(a)?a:Date.now();return e.headroom.map(n=>{let a=r.get(n.seatId),s=a?.engine??`local`,c=n.resetAt?Date.parse(n.resetAt):NaN,l=n.bindingWindow?et[n.bindingWindow]:null,u=Number.isFinite(c)&&l?c-l:null,d=t[n.seatId]??[];return{seatId:n.seatId,label:a?.label??n.seatId,engine:s,window:n.bindingWindow,points:d.filter(e=>u===null||e.t>=u).map(e=>({t:e.t,remaining:Math.max(0,100-e.used)})),start:u,resetAt:Number.isFinite(c)?c:null,resetText:rt(i.get(n.seatId),s,n.bindingWindow,o),reservePercent:e.effective[n.seatId]?.reservePercent??0,line:tt(n,e.effective[n.seatId]),enabled:e.effective[n.seatId]?.enabled??!1,free:a?.free??!1,eligible:n.eligibleForAutonomy,reason:n.reasons[0]??null}}).sort((e,t)=>Number(e.free)-Number(t.free)||e.label.localeCompare(t.label))}function ot(e){if(!e)return null;let t=e.seatInfo.find(e=>e.engine===`claude`);if(!t)return null;let n=e.effective[t.seatId];return n?{label:`Claude`,percent:n.reservePercent}:null}function st({kpis:e}){return(0,J.jsx)(`div`,{className:R.kpis,role:`group`,"aria-label":`Key numbers`,children:e.map(e=>(0,J.jsx)(l,{label:e.label,value:e.value,delta:e.delta,trend:e.trend,trendLabel:e.trendLabel,caption:e.caption},e.id))})}var ct={high:`Urgent`,warn:`Soon`,info:`FYI`},lt={approvals:`approvals`,authority:`authority`,fleet:`fleet`,leader:`Leader`,chats:`chats`,accounts:`accounts`};function ut(e,t){if(t.confirm)return{...t.confirm,destructive:t.destructive};if(t.kind===`approve`||t.kind===`reject`||t.kind===`veto`)return{title:`${t.kind===`approve`?`Approve`:t.kind===`reject`?`Reject`:`Veto`}?`,body:e.title,confirmLabel:t.label,destructive:t.destructive}}function dt(e){let t=e.target;switch(t.kind){case`url`:return/^https:\/\//.test(t.url)?{label:`Open`,href:t.url}:null;case`section`:return{label:`Show`,onOpen:()=>C(t.section,t.anchor)};case`session`:return{label:`Open chat`,onOpen:()=>S(t.sessionId)};case`approval`:case`seat`:return{label:`Open`,onOpen:()=>T(e.id)};default:return null}}function ft(e){let t=e.subject;return[t.repo,t.pr?`#${t.pr}`:null,t.seatId,j(e.since)].filter(Boolean).join(` · `)}function pt({item:e,actions:t}){let n=dt(e),r=e.actions.filter(e=>e.request!==null);return(0,J.jsxs)(`li`,{className:R.needsRow,"data-severity":e.severity,id:w(e.id),children:[(0,J.jsx)(`span`,{className:R.sevDot,"data-severity":e.severity,"aria-hidden":`true`}),(0,J.jsxs)(`div`,{className:R.needsText,children:[(0,J.jsxs)(`span`,{className:R.needsTitle,children:[(0,J.jsxs)(`span`,{className:`visually-hidden`,children:[ct[e.severity],`: `]}),e.title]}),e.detail?(0,J.jsx)(`span`,{className:R.needsDetail,children:e.detail}):null,(0,J.jsx)(`span`,{className:R.needsMeta,children:ft(e)})]}),(0,J.jsxs)(`div`,{className:R.needsActions,children:[r.map(n=>(0,J.jsx)(k,{size:`sm`,variant:n.destructive?`danger`:n.kind===`approve`?`primary`:`subtle`,disabled:t.busy||t.readOnly,onClick:()=>t.act(()=>I(n.request.path,n.request.body),`${n.label}: ${e.title}`,{confirm:ut(e,n)}),children:n.label},n.kind)),n?n.href?(0,J.jsxs)(`a`,{className:R.linkButton,href:n.href,target:`_blank`,rel:`noopener noreferrer`,children:[n.label,(0,J.jsx)(b,{width:12,height:12,"aria-hidden":`true`}),(0,J.jsx)(`span`,{className:`visually-hidden`,children:` (opens in a new tab)`})]}):(0,J.jsx)(`button`,{type:`button`,className:R.linkButton,onClick:n.onOpen,children:n.label}):null]})]})}function mt(e){return e.status===`unavailable`?{activity:null,loading:!1,reason:`The Needs-you inbox is not in this build yet, so this card has no source.`,stale:!1}:e.data?{activity:e.data,loading:!1,reason:null,stale:e.status===`stale`}:{activity:null,loading:!0,reason:null,stale:!1}}function ht({state:e,actions:t,fleetLine:n}){let{activity:r,loading:i,reason:a,stale:o}=mt(e),s=r?Ze(r.needsYou):[],c=Qe(r),l=s.slice(0,5),u=r?r.needsYou.length:null;return(0,J.jsx)(se,{title:u===null?`Needs you`:`Needs you (${u})`,caption:u===null||u===0?void 0:`Most urgent first`,tone:u?`attention`:void 0,actions:(0,J.jsxs)(`button`,{type:`button`,className:R.linkButton,onClick:()=>T(),"aria-keyshortcuts":`Meta+J`,children:[`Open all `,(0,J.jsx)(`kbd`,{className:R.kbd,children:`⌘J`})]}),children:i?(0,J.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Reading the inbox…`}):r?l.length===0?c.length||o?(0,J.jsx)(B,{tone:`unknown`,children:c.length?`Nothing to show, but ${c.map(e=>lt[e]??e).join(`, `)} ${c.length===1?`is`:`are`} not answering — this is not an all-clear.`:`Nothing to show, but the last refresh failed — this is not an all-clear.`}):(0,J.jsxs)(`div`,{className:R.allClear,role:`status`,children:[(0,J.jsx)(`span`,{className:R.allClearTitle,children:`All clear`}),(0,J.jsx)(`span`,{className:R.allClearBody,children:n})]}):(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`ul`,{className:R.needsList,children:l.map(e=>(0,J.jsx)(pt,{item:e,actions:t},e.id))}),s.length>l.length?(0,J.jsxs)(`button`,{type:`button`,className:R.moreLink,onClick:()=>T(),children:[s.length-l.length,` more in the drawer`]}):null,c.length?(0,J.jsxs)(`p`,{className:R.muted,children:[c.map(e=>lt[e]??e).join(`, `),` not answering — the list may be incomplete.`]}):null,o?(0,J.jsx)(`p`,{className:R.muted,children:`The last refresh failed; showing the previous list.`}):null]}):(0,J.jsxs)(B,{tone:`unknown`,children:[a??`The Needs-you inbox did not answer.`,` Nothing is shown rather than a false all-clear.`]})})}var gt={session:`5-hour`,weekly:`weekly`};function _t(){return(0,J.jsx)(`svg`,{width:`1.6em`,height:`0.8em`,viewBox:`0 0 24 12`,fill:`none`,stroke:`currentColor`,strokeWidth:1.6,strokeLinecap:`round`,focusable:`false`,"aria-hidden":`true`,children:(0,J.jsx)(`path`,{d:`M6 2.5a3.5 3.5 0 1 0 0 7c2.5 0 3.5-2 6-3.5s3.5-3.5 6-3.5a3.5 3.5 0 1 1 0 7c-2.5 0-3.5-2-6-3.5S8.5 2.5 6 2.5Z`})})}function vt({burn:e,now:t,width:n}){if(e.free)return(0,J.jsxs)(`section`,{className:R.freeSeat,"aria-label":`${e.label}: free local seat`,children:[(0,J.jsxs)(`span`,{className:R.freeHead,children:[(0,J.jsx)(D,{engine:e.engine}),(0,J.jsx)(`span`,{className:R.freeTitle,children:e.label})]}),(0,J.jsx)(`span`,{className:R.freeValue,children:(0,J.jsx)(_t,{})}),(0,J.jsxs)(`span`,{className:R.freeBody,children:[`Local — free, no provider window. `,e.eligible?`Takes autonomous work.`:e.reason??``]})]});let r=`${e.label}${e.window?` · ${gt[e.window]}`:``}`,i=e.enabled?e.eligible?`Autonomy may use it now`:e.reason??`Held back from autonomy`:`Not used by autonomy`,a=e=>`${Math.round(e)}%`,o=[...e.points].reverse().find(e=>e.remaining!==null)?.remaining??null,s=(0,J.jsxs)(`section`,{className:R.freeSeat,"aria-label":r,children:[(0,J.jsxs)(`span`,{className:R.freeHead,children:[(0,J.jsx)(D,{engine:e.engine}),(0,J.jsx)(`span`,{className:R.freeTitle,children:e.label})]}),(0,J.jsx)(B,{tone:`unknown`,children:`No window reading — unknown usage is never treated as headroom.`})]});if(e.window===null)return s;if(e.resetAt===null||e.start===null){if(o===null)return s;let t=e.resetText?it(e.resetText):`reset time not reported`;return(0,J.jsx)(d,{title:r,description:`${a(o)} left · ${t} · ${i}`,caveat:`${e.resetText?`The provider reports this reset only in words`:`No reset time was reported for this window`}, so nothing is projected to a reset.${e.points.length<2?` Readings since Verse opened — the line fills in as it watches this seat.`:``}`,series:[{id:`remaining`,label:`Remaining`,points:e.points.map(e=>({x:e.t,y:e.remaining}))}],threshold:e.line??void 0,height:160,width:n,formatX:nt(e.window),formatY:a,ariaLabel:`${r}: ${a(o)} left, ${t}. ${i}.`})}return(0,J.jsx)(u,{title:r,description:i,caveat:e.points.length<2?`Readings since Verse opened — the line fills in as it watches this seat.`:void 0,status:e.points.length===0?{kind:`empty`,message:`No reading yet in this window.`}:void 0,points:e.points,capacity:100,start:e.start,resetAt:e.resetAt,now:t,reserve:e.line??void 0,height:160,width:n,formatValue:e=>`${Math.round(e)}%`,formatTime:nt(e.window)})}function yt({burns:e,now:t,compact:n}){return e.length===0?(0,J.jsx)(B,{tone:`unknown`,children:`Seat capacity is not available — the budget route did not answer.`}):(0,J.jsx)(`div`,{className:n?R.burnStrip:R.burnGrid,role:`group`,"aria-label":`Capacity per seat`,children:e.map(e=>(0,J.jsx)(`div`,{className:R.burnItem,children:(0,J.jsx)(vt,{burn:e,now:t,width:n?300:void 0})},e.seatId))})}function bt(e){let t=ve(e);return(0,J.jsx)(`p`,{className:R.verdict,"data-testid":`verdict`,children:t.map((e,t)=>(0,J.jsxs)(`span`,{className:R.verdictPart,"data-tone":e.tone,children:[t>0?(0,J.jsx)(`span`,{className:R.verdictSep,"aria-hidden":`true`,children:` · `}):null,e.text]},e.key))})}var Q=`ashlr.verse.command.lastLooked.v1`;function xt(){try{let e=window.localStorage.getItem(Q);return e&&Number.isFinite(Date.parse(e))?e:null}catch{return null}}function St(e){try{window.localStorage.setItem(Q,e)}catch{}}function Ct(){let e=m(),[t,n]=(0,H.useState)(null),r=(0,H.useRef)(!1);return(0,H.useEffect)(()=>{e&&!r.current&&(n(xt()),St(new Date().toISOString())),r.current=e},[e]),t}function wt({lastLookedAt:e,items:t}){if(!e)return null;let n=new Date(e),r=n.toDateString()===new Date().toDateString()?n.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`}):n.toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`,minute:`2-digit`});return(0,J.jsxs)(`div`,{className:R.since,role:`group`,"aria-label":`Since you looked at ${r}`,children:[(0,J.jsxs)(`span`,{className:R.sinceLead,children:[`Since `,r]}),t.length===0?(0,J.jsx)(`span`,{className:R.sinceEmpty,children:`nothing new`}):t.map(e=>(0,J.jsx)(`span`,{className:R.sinceChip,"data-tone":e.tone,children:e.text},e.id))]})}var Tt=36e5,Et=1e4,Dt=3e4,Ot=3e5,$={};function kt(){let{compact:e}=p(),t=a(re),n=a(ne),l=g(),u=a(te),d=a(M,{freshMs:6e4}),f=a(N,{freshMs:6e4}),m=a(O,{freshMs:15e3}),_={authority:i(re),fleet:i(ne),leader:i(te),learning:i(M),history:i(N),budget:i(O)};h(()=>{_.authority(),_.fleet()},Et),h(()=>{_.leader(),_.budget()},Dt),h(()=>{_.history(),_.learning()},Ot);let v=ee(3e4),y=ie(),b=Ct(),x=(0,H.useSyncExternalStore)((0,H.useCallback)(e=>r(`verse-bootstrap`,e),[]),()=>o(`verse-bootstrap`),()=>o(`verse-bootstrap`)).data?.seats??null,[S,C]=(0,H.useState)($),w=m.data??null;(0,H.useEffect)(()=>{w&&($=$e($,w),C($))},[w]);let T=t.data?.value??null,E=n.data?.value??null,D=f.data?.value??null,k=E?.state===`dark`?E.lastActivityAt??D?.darkSince??null:D?.darkSince??null,A=(0,H.useMemo)(()=>qe({fleet:E,history:D,learning:d.data?.value??null,policy:T?.policy??null,budget:w}),[E,D,d.data,T,w]),j=(0,H.useMemo)(()=>at(w,S,x),[w,S,x]),P=Ye({lastLookedAt:b,fleet:E,leader:u.data?.value??null,activity:l.data}),F=e?6:12,I=v-F*Tt,L=(0,H.useMemo)(()=>E?ue(E.runs,I,v):[],[E,I,v]),z=n.data?E?E.state===`dark`&&L.length===0?{kind:`dark`,since:k??E.generatedAt,detail:E.stateReason??void 0}:L.length===0?{kind:`empty`,message:`No runs in the last ${F} hours.`}:{kind:`ready`}:{kind:`unknown`,reason:n.data.reason??`the live fleet view did not answer.`}:{kind:`loading`},B=E?E.state===`dark`?`Fleet dark${k?` since ${new Date(k).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})}`:``}.`:`Fleet ${E.state}: ${E.summary.building??`—`} building, ${E.summary.queued??`—`} queued.`:`Fleet status unknown.`,se=[t,n].some(e=>e.status===`refreshing`);return(0,J.jsxs)(oe,{title:`Command`,actions:se?(0,J.jsx)(s,{}):null,lead:(0,J.jsxs)(`div`,{className:R.lead,children:[(0,J.jsx)(Me,{read:t.data,loading:t.status===`loading`,budgetMode:w?.mode??null,actions:y,compact:e,now:v}),(0,J.jsx)(ae,{actions:y}),(0,J.jsx)(bt,{authority:T,building:E?.summary.building??null,mergedToday:E?.summary.mergedToday??null,revertsToday:E?.summary.revertsToday??null,reserve:ot(w),darkSince:k}),(0,J.jsx)(wt,{lastLookedAt:b,items:P})]}),children:[(0,J.jsx)(V,{span:5,children:(0,J.jsx)(ht,{state:l,actions:y,fleetLine:B})}),(0,J.jsx)(V,{span:7,children:(0,J.jsx)(ce,{read:u.data,loading:u.status===`loading`,actions:y})}),(0,J.jsx)(V,{span:12,children:(0,J.jsx)(st,{kpis:A})}),(0,J.jsx)(V,{span:12,children:(0,J.jsx)(yt,{burns:j,now:v,compact:e})}),(0,J.jsx)(V,{span:12,children:(0,J.jsx)(c,{title:`Last ${F} hours`,description:`Fleet lanes; bars coloured by status, outlines are queued or parked`,status:z,lanes:L,from:I,to:v,now:v,toneOf:le})}),y.dialogs]})}export{Et as COMMAND_FAST_POLL_MS,Ot as COMMAND_HISTORY_POLL_MS,Dt as COMMAND_SLOW_POLL_MS,kt as CommandSection};
|
|
2
|
-
//# sourceMappingURL=CommandSection-BC0uXim_.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CommandSection-BC0uXim_.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/authority-model.ts","../../../../../../src/web-ui/routes/verse/command/GrantSheet.tsx","../../../../../../src/web-ui/routes/verse/command/AutonomyBar.tsx","../../../../../../src/core/routing/headroom.ts","../../../../../../src/web-ui/routes/verse/command/command-model.ts","../../../../../../src/web-ui/routes/verse/command/KpiRow.tsx","../../../../../../src/web-ui/routes/verse/command/NeedsYouCard.tsx","../../../../../../src/web-ui/routes/verse/command/SeatBurnDowns.tsx","../../../../../../src/web-ui/routes/verse/command/VerdictLine.tsx","../../../../../../src/web-ui/routes/verse/sections/CommandSection.tsx"],"sourcesContent":["/**\n * routes/verse/command/authority-model.ts — the pure decisions behind the\n * Command top bar (unit C7; SPEC-310B §0 I1 + §6, SPEC-310C §5).\n *\n * I1 is the whole design: ONLY a grant signed under Touch ID raises\n * authority; LOWERING is instant and needs no auth. So every click on the\n * switch is classified before anything is sent:\n *\n * lower → POST at once (Off is always one click away);\n * raise → POST at once, but only up to `maxSwitchWithoutGrant`\n * — the installed grant already allows it;\n * raise-needs-grant→ nothing is sent; the Touch ID sheet opens with the\n * draft grant's full scope and expiry. The server is\n * still the authority (409 `grant-required` on a stale\n * page) — this only keeps the page from asking for\n * something it knows will be refused.\n *\n * Framework-free; tested directly.\n */\nimport type { AuthorityGrantDraft, AuthorityStatusV1, AutonomySwitch, GrantState } from '../../../../core/authority/types.js';\n\nexport const SWITCH_RANK: Readonly<Record<AutonomySwitch, number>> = { off: 0, propose: 1, autonomous: 2 };\n\nexport const SWITCH_LABEL: Readonly<Record<AutonomySwitch, string>> = {\n off: 'Off',\n propose: 'Propose',\n autonomous: 'Autonomous',\n};\n\n/** Short labels for the 375 px bar (same order, same meaning). */\nexport const SWITCH_SHORT: Readonly<Record<AutonomySwitch, string>> = {\n off: 'Off',\n propose: 'Propose',\n autonomous: 'Auto',\n};\n\nexport const SWITCH_ORDER: readonly AutonomySwitch[] = ['off', 'propose', 'autonomous'];\n\nexport type SwitchChange = 'same' | 'lower' | 'raise' | 'raise-needs-grant';\n\n/** What a click on `to` means, given the status the page last read. */\nexport function classifySwitch(status: Pick<AuthorityStatusV1, 'switch' | 'maxSwitchWithoutGrant'>, to: AutonomySwitch): SwitchChange {\n const from = SWITCH_RANK[status.switch];\n const target = SWITCH_RANK[to];\n if (target === from) return 'same';\n if (target < from) return 'lower';\n return target <= SWITCH_RANK[status.maxSwitchWithoutGrant] ? 'raise' : 'raise-needs-grant';\n}\n\nexport interface SwitchOption {\n value: AutonomySwitch;\n label: string;\n short: string;\n /** Selecting it opens the Touch ID sheet instead of switching. */\n needsGrant: boolean;\n /** Spoken name, carrying the grant requirement in words. */\n ariaLabel: string;\n}\n\nexport function switchOptions(status: Pick<AuthorityStatusV1, 'switch' | 'maxSwitchWithoutGrant'>): SwitchOption[] {\n return SWITCH_ORDER.map((value) => {\n const needsGrant = SWITCH_RANK[value] > Math.max(SWITCH_RANK[status.switch], SWITCH_RANK[status.maxSwitchWithoutGrant]);\n return {\n value,\n label: SWITCH_LABEL[value],\n short: SWITCH_SHORT[value],\n needsGrant,\n ariaLabel: needsGrant ? `${SWITCH_LABEL[value]} (needs a new grant — Touch ID)` : SWITCH_LABEL[value],\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Grant chip\n// ---------------------------------------------------------------------------\n\nexport type ChipTone = 'neutral' | 'success' | 'warning' | 'danger' | 'unknown';\n\nexport interface GrantChip {\n label: string;\n tone: ChipTone;\n /** Longer sentence for the tooltip / accessible description. */\n detail: string;\n /** Clicking the chip opens the Touch ID sheet for this action; null = informational. */\n action: 'grant' | 're-approve' | null;\n}\n\nconst DAY = 86_400_000;\nconst HOUR = 3_600_000;\n\n/** \"23d\", \"2d 4h\", \"5h\", \"40m\" — time left, coarse on purpose (it is a chip). */\nexport function timeLeft(ms: number): string {\n if (!Number.isFinite(ms) || ms <= 0) return '0m';\n if (ms >= 3 * DAY) return `${Math.floor(ms / DAY)}d`;\n if (ms >= DAY) {\n const d = Math.floor(ms / DAY);\n const h = Math.floor((ms - d * DAY) / HOUR);\n return h ? `${d}d ${h}h` : `${d}d`;\n }\n if (ms >= HOUR) return `${Math.floor(ms / HOUR)}h`;\n return `${Math.max(1, Math.floor(ms / 60_000))}m`;\n}\n\nconst STATE_WORDS: Record<GrantState, string> = {\n none: 'No grant',\n active: 'Active',\n paused: 'Paused, re-approve',\n expired: 'Expired, renew',\n revoked: 'Revoked, new grant',\n invalid: 'Grant invalid',\n};\n\nexport function grantChip(status: AuthorityStatusV1 | null, now: number): GrantChip {\n if (!status) return { label: 'Grant unknown', tone: 'unknown', detail: 'The authority service did not answer, so the grant state is unknown.', action: null };\n const g = status.grant;\n switch (g.state) {\n case 'active': {\n const expires = g.expiresAt ? Date.parse(g.expiresAt) : NaN;\n if (!Number.isFinite(expires)) return { label: 'Active', tone: 'success', detail: 'A grant is active; its expiry could not be read.', action: null };\n const left = expires - now;\n const tone: ChipTone = left < DAY ? 'danger' : left < 3 * DAY ? 'warning' : 'success';\n return {\n label: timeLeft(left),\n tone,\n detail: `Grant active until ${new Date(expires).toLocaleString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' })}${left < 3 * DAY ? ' — renew soon' : ''}.`,\n action: left < 3 * DAY ? 'grant' : null,\n };\n }\n case 'paused':\n return { label: STATE_WORDS.paused, tone: 'warning', detail: g.reason ?? 'The grant is paused until you re-approve it.', action: 're-approve' };\n case 'expired':\n return { label: STATE_WORDS.expired, tone: 'danger', detail: g.reason ?? 'The grant expired; autonomy is dark until a new one is signed.', action: 'grant' };\n case 'revoked':\n return { label: STATE_WORDS.revoked, tone: 'danger', detail: g.reason ?? 'The grant was revoked; a new one needs Touch ID.', action: 'grant' };\n case 'invalid':\n return { label: STATE_WORDS.invalid, tone: 'danger', detail: g.reason ?? 'The installed grant failed verification.', action: 'grant' };\n case 'none':\n default:\n return { label: STATE_WORDS.none, tone: 'neutral', detail: 'No standing grant is installed; autonomy can only propose.', action: 'grant' };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Verdict line\n// ---------------------------------------------------------------------------\n\nexport interface VerdictInputs {\n authority: AuthorityStatusV1 | null;\n /** FleetLiveSummary fields, null = unknown. */\n building: number | null;\n mergedToday: number | null;\n revertsToday: number | null;\n /** \"Claude\" and the percent reserved for Mason on that seat; null = unknown / no such seat. */\n reserve: { label: string; percent: number } | null;\n /** The fleet has done nothing since this ISO time (designed dark state). */\n darkSince: string | null;\n}\n\nexport interface VerdictPart {\n key: string;\n text: string;\n tone?: ChipTone;\n}\n\n/** The mode word first: what autonomy is doing right now, in one word. */\nexport function modeWord(authority: AuthorityStatusV1 | null): VerdictPart {\n if (!authority) return { key: 'mode', text: 'Autonomy unknown', tone: 'unknown' };\n if (authority.kill) return { key: 'mode', text: 'Stopped', tone: 'danger' };\n if (authority.grant.state === 'paused') return { key: 'mode', text: 'Paused, re-approve', tone: 'warning' };\n return { key: 'mode', text: SWITCH_LABEL[authority.effectiveSwitch], tone: authority.effectiveSwitch === 'autonomous' ? 'success' : 'neutral' };\n}\n\n/**\n * \"Autonomous · 5 building · 7 merged today · 0 reverts · Claude 46%\n * reserved for you\". A number that is unknown is LEFT OUT rather than shown\n * as 0 (the line would otherwise claim \"0 reverts\" it never counted); when\n * the whole fleet read is missing the line says so instead.\n */\nexport function verdictParts(v: VerdictInputs): VerdictPart[] {\n const parts: VerdictPart[] = [modeWord(v.authority)];\n const anyFleet = v.building !== null || v.mergedToday !== null || v.revertsToday !== null;\n if (v.darkSince && !(v.building && v.building > 0)) {\n const since = new Date(v.darkSince);\n parts.push({ key: 'dark', text: `fleet dark since ${since.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}`, tone: 'neutral' });\n } else if (!anyFleet) {\n parts.push({ key: 'fleet', text: 'fleet status unknown', tone: 'unknown' });\n } else {\n if (v.building !== null) parts.push({ key: 'building', text: `${v.building} building` });\n if (v.mergedToday !== null) parts.push({ key: 'merged', text: `${v.mergedToday} merged today` });\n if (v.revertsToday !== null) parts.push({ key: 'reverts', text: `${v.revertsToday} revert${v.revertsToday === 1 ? '' : 's'}`, tone: v.revertsToday > 0 ? 'warning' : undefined });\n }\n if (v.reserve) parts.push({ key: 'reserve', text: `${v.reserve.label} ${Math.round(v.reserve.percent)}% reserved for you` });\n return parts;\n}\n\n/**\n * Which POST signs a draft: the DRAFT's own `kind` decides (B-U1: GET\n * /api/verse/authority/draft answers with `kind`, and POST refuses a digest\n * whose kind does not match the action). The clicked intent is only the\n * fallback for a server that sends no kind — a grant that is no longer\n * continuable is drafted as a NEW one, and signing it must say so.\n */\nexport function actionForDraft(draft: AuthorityGrantDraft, fallback: 'grant' | 're-approve'): 'grant' | 're-approve' {\n const kind = (draft as AuthorityGrantDraft & { kind?: unknown }).kind;\n if (kind === 'new') return 'grant';\n if (kind === 'reapprove') return 're-approve';\n return fallback;\n}\n\n/**\n * What Stop actually did, in one sentence (B-U6 → C: the Stop UI shows the\n * drain result). The POST answers with the status plus `result.stop`\n * (authority/clamp.ts StopResult). Stop from Verse never waits, so agents\n * admitted before it may still be finishing; that is said with the count,\n * never as \"stopped\" alone. Unknown leases are counted as live upstream\n * (fail closed). Null when the response carries no stop result.\n */\nexport function stopOutcomeSentence(response: unknown): string | null {\n if (response === null || typeof response !== 'object') return null;\n const stop = (response as { result?: { stop?: unknown } }).result?.stop;\n if (stop === null || typeof stop !== 'object') return null;\n const r = stop as { quiesced?: unknown; liveExecutionLeases?: unknown; mergesRevoked?: unknown; mergeRevokeFailures?: unknown };\n const live = typeof r.liveExecutionLeases === 'number' && Number.isFinite(r.liveExecutionLeases) ? Math.max(0, Math.round(r.liveExecutionLeases)) : null;\n const parts: string[] = [];\n if (r.quiesced === true || live === 0) parts.push('Stopped. No agent is still running.');\n else if (live !== null) parts.push(`Stopped. ${live} agent${live === 1 ? '' : 's'} started before Stop ${live === 1 ? 'is' : 'are'} still finishing; no new work starts.`);\n else parts.push('Stopped. Agents started before Stop may still be finishing; no new work starts.');\n if (typeof r.mergesRevoked === 'number' && r.mergesRevoked > 0) {\n parts.push(`${r.mergesRevoked} armed merge${r.mergesRevoked === 1 ? ' was' : 's were'} revoked.`);\n }\n const failed = Array.isArray(r.mergeRevokeFailures) ? r.mergeRevokeFailures.length : 0;\n if (failed > 0) parts.push(`${failed} armed merge${failed === 1 ? '' : 's'} could not be revoked; Stop still blocks ${failed === 1 ? 'it' : 'them'}.`);\n return parts.join(' ');\n}\n","/**\n * routes/verse/command/GrantSheet.tsx — the Touch ID sheet (SPEC-310B §6:\n * \"Raising it past the grant opens the Touch ID sheet, which shows scope and\n * expiry\"; unit C7).\n *\n * It shows EXACTLY what the custody helper will sign — the server's draft\n * StandingGrantV1 and its digest — before anything is sent: repos and how\n * far each may go, merge caps, spend (mode ceiling, metered dollars, every\n * seat's reserve floor), engines, the Leader's classes and veto window, the\n * rollout ladder with each rung's exit criteria, and the expiry. Approving\n * echoes the draft's digest back, so the server signs what Mason read, not\n * whatever it would draft a second later. The Touch ID prompt itself is the\n * helper's, on this Mac; this page never sees a key.\n *\n * All copy is plain text; the draft is server data but rendered as text only.\n */\nimport { useId } from 'react';\nimport type { AuthorityGrantDraft, RolloutStage, StandingGrantV1 } from '../../../../core/authority/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { IconLock } from '../../../components/primitives/icons.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { authorityDraftQuery, type OptionalRead } from './surface-data.js';\nimport { SWITCH_LABEL } from './authority-model.js';\nimport { CardNote, MicroLabel } from './Surface.js';\nimport type { AutonomySwitch } from '../../../../core/authority/types.js';\nimport styles from './command.module.css';\n\nexport type GrantIntent = 'grant' | 're-approve';\n\nexport interface GrantSheetProps {\n open: boolean;\n intent: GrantIntent;\n /** The switch position the operator asked for (applied after the grant, if it allows it). */\n then: AutonomySwitch | null;\n busy: boolean;\n /** Why the sheet opened, in one sentence (\"Autonomous needs a new grant.\"). */\n why: string;\n onApprove: (draft: AuthorityGrantDraft) => void;\n onClose: () => void;\n}\n\nconst DAY = 86_400_000;\n\nfunction fmtDate(iso: string): string {\n const t = Date.parse(iso);\n return Number.isFinite(t) ? new Date(t).toLocaleString('en-US', { weekday: 'short', month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' }) : '—';\n}\n\nexport function grantDays(g: Pick<StandingGrantV1, 'issuedAt' | 'expiresAt'>): number | null {\n const a = Date.parse(g.issuedAt);\n const b = Date.parse(g.expiresAt);\n return Number.isFinite(a) && Number.isFinite(b) ? Math.round((b - a) / DAY) : null;\n}\n\nfunction stageLine(s: RolloutStage): string {\n const c = s.criteria;\n const parts = [\n `${s.repos.length} repo${s.repos.length === 1 ? '' : 's'}`,\n `${s.maxRisk} risk`,\n `≤ ${s.maxFiles} files / ${s.maxLines} lines`,\n `≤ ${s.maxMergesPerRepoPerDay} merges/repo/day`,\n ];\n const exit = [`${c.minMerges} merges`, `${c.minHours} h`, c.minPostMergeGreenPct ? `≥ ${c.minPostMergeGreenPct}% green` : null, `≤ ${c.maxRevertRatePct}% reverts`].filter(Boolean);\n return `${parts.join(' · ')} — advances after ${exit.join(', ')}`;\n}\n\nexport function DraftScope({ draft }: { draft: AuthorityGrantDraft }) {\n const g = draft.payload;\n const days = grantDays(g);\n return (\n <div className={styles.scope}>\n <section className={styles.scopeBlock} aria-label=\"Expiry\">\n <MicroLabel>Expiry</MicroLabel>\n <p className={styles.scopeLead}>\n {days !== null ? `${days} days` : '—'}, until {fmtDate(g.expiresAt)}\n </p>\n <p className={styles.scopeMeta}>\n Signed by key <span className={styles.mono}>{g.keyId}</span> · sequence {g.grantSeq} · bound to this Mac\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Repositories\">\n <MicroLabel>Repositories ({g.repos.length})</MicroLabel>\n <table className={styles.scopeTable}>\n <thead>\n <tr>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Up to</th>\n <th scope=\"col\">Checks</th>\n <th scope=\"col\">Risk</th>\n <th scope=\"col\" className={styles.num}>Merges/day</th>\n </tr>\n </thead>\n <tbody>\n {g.repos.map((r) => (\n <tr key={r.nameWithOwner}>\n <td className={styles.mono}>{r.nameWithOwner}</td>\n <td>{r.stage === 'merge' ? 'Merge' : 'Propose'}</td>\n <td>{r.enforcement === 'server' ? 'GitHub' : 'Local only'}</td>\n <td>{r.maxRisk}</td>\n <td className={styles.num}>{r.maxMergesPerDay}</td>\n </tr>\n ))}\n </tbody>\n </table>\n <p className={styles.scopeMeta}>\n Every merge ≤ {g.merge.maxFiles} files / {g.merge.maxLines} lines · ashlr-hub itself: {g.merge.selfRepo === 'propose-only' ? 'propose only' : 'merge outside authority code'}\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Spend\">\n <MicroLabel>Spend</MicroLabel>\n <p className={styles.scopeLead}>\n Up to {g.spend.maxMode === 'all-in' ? 'All-in' : g.spend.maxMode === 'balanced' ? 'Balanced' : 'Reserve'} · metered APIs ${g.spend.meteredUsdPerDay}/day\n </p>\n <ul className={styles.scopeList}>\n {Object.entries(g.spend.seats).map(([seatId, seat]) => (\n <li key={seatId}>\n <span className={styles.mono}>{seatId}</span>\n {seat.enabled ? `: keeps ${seat.reserveFloorPercent}% for you` : ': not used by autonomy'}\n {seat.enabled && seat.maxSessionWindowPercent !== undefined ? `, never above ${seat.maxSessionWindowPercent}% of its 5-hour window` : ''}\n {seat.enabled ? ` · ${seat.roles.join(', ')}` : ''}\n </li>\n ))}\n </ul>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Engines and Leader\">\n <MicroLabel>Engines and Leader</MicroLabel>\n <p className={styles.scopeLead}>{g.engines.join(', ') || 'none'}</p>\n <p className={styles.scopeMeta}>\n Leader classes {g.leader.classes.length ? g.leader.classes.join(' + ') : 'none (proposes only)'} · class-B veto window {g.leader.vetoMinutes} min ·\n goal conductor {g.conductorGoals ? 'on' : 'off'}\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Rollout ladder\">\n <MicroLabel>Rollout ladder ({g.rollout.stages.length} stages, advances by itself)</MicroLabel>\n <ol className={styles.ladder}>\n {g.rollout.stages.map((s) => (\n <li key={s.id}>\n <span className={styles.ladderId}>{s.id}</span>\n <span>{stageLine(s)}</span>\n </li>\n ))}\n </ol>\n <p className={styles.scopeMeta}>Any sandbox violation or reserve breach drops it back one stage. It can never climb past the last stage.</p>\n </section>\n\n <p className={styles.scopeMeta}>\n Draft digest <span className={styles.mono}>{draft.digest.slice(0, 16)}…</span>\n </p>\n </div>\n );\n}\n\nexport function GrantSheet({ open, intent, then, busy, why, onApprove, onClose }: GrantSheetProps) {\n const titleId = useId();\n // Only read the draft while the sheet is open: drafting is cheap on the\n // server, but a draft read while the sheet is closed would be stale by the\n // time anyone approved it.\n return open ? <GrantSheetBody titleId={titleId} intent={intent} then={then} busy={busy} why={why} onApprove={onApprove} onClose={onClose} /> : null;\n}\n\nfunction GrantSheetBody({ titleId, intent, then, busy, why, onApprove, onClose }: Omit<GrantSheetProps, 'open'> & { titleId: string }) {\n const read = useQuery(authorityDraftQuery, { freshMs: 0 });\n const draft = (read.data as OptionalRead<AuthorityGrantDraft> | undefined)?.value ?? null;\n const reason = read.data?.reason ?? null;\n return (\n <Sheet\n open\n onClose={onClose}\n titleId={titleId}\n width={600}\n title={intent === 're-approve' ? 'Re-approve the standing grant' : 'Approve a standing grant'}\n description={why}\n footer={\n <div className={styles.sheetFooter}>\n <p className={styles.sheetFootnote}>\n Touch ID appears on this Mac. Lowering authority — Off, Stop, Revoke — never needs it.\n {then ? ` After approval the switch moves to ${SWITCH_LABEL[then]}.` : ''}\n </p>\n <span className={styles.sheetButtons}>\n <Button variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button variant=\"primary\" icon={<IconLock />} disabled={!draft} busy={busy} onClick={() => draft && onApprove(draft)}>\n Approve with Touch ID\n </Button>\n </span>\n </div>\n }\n >\n {read.status === 'loading' && !read.data ? (\n <p className={styles.muted} aria-busy=\"true\">Preparing the grant draft…</p>\n ) : draft ? (\n <DraftScope draft={draft} />\n ) : (\n <CardNote tone=\"unknown\">{reason ?? 'The grant draft could not be read, so nothing can be approved from here.'}</CardNote>\n )}\n </Sheet>\n );\n}\n","/**\n * routes/verse/command/AutonomyBar.tsx — Command's top bar (SPEC-310B §6,\n * SPEC-310C §5; unit C7):\n *\n * Autonomy [Off | Propose | Autonomous] Budget · Balanced ▾ Grant 23d ■ Stop\n *\n * - Lowering the switch is instant (no confirm, no Touch ID — I1).\n * - Raising within what the installed grant allows is instant too.\n * - Raising PAST the grant opens the Touch ID sheet with the draft's full\n * scope and expiry; the switch then moves once the grant is signed.\n * - The Budget pill opens A9's BudgetControl, with the grant's mode\n * ceiling stated above it (autonomy never spends past it whatever the\n * control shows — the server clamps; see CROSS-UNIT REQUEST to C6).\n * - The grant chip reads \"23d\", or \"Paused, re-approve\" and opens the sheet.\n * - Stop asks for confirmation (the catalog's `fleet.stop` guard copy),\n * then writes KILL; while stopped it becomes Resume.\n *\n * At 375 px the bar is just [Autonomy][■] (SPEC-310C §5); the budget pill\n * and grant chip move under the verdict line (rendered by CommandSection).\n */\nimport { useState, type ReactNode } from 'react';\nimport type { AuthorityGrantDraft, AuthorityStatusV1, AutonomySwitch } from '../../../../core/authority/types.js';\nimport type { BudgetMode } from '../../../../core/routing/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { IconChevronDown, IconLock, IconPlay, IconStop } from '../../../components/primitives/icons.js';\nimport { BudgetControl } from '../budget/BudgetControl.js';\nimport { findCommand } from '../shell/command-catalog.js';\nimport { actionForDraft, SWITCH_LABEL, SWITCH_RANK, classifySwitch, grantChip, stopOutcomeSentence, switchOptions, type ChipTone } from './authority-model.js';\nimport { GrantSheet, type GrantIntent } from './GrantSheet.js';\nimport { postAuthority, type OptionalRead } from './surface-data.js';\nimport type { ConfirmSpec, SurfaceActions } from './actions.js';\nimport styles from './command.module.css';\n\nconst MODE_WORD: Record<BudgetMode, string> = { 'all-in': 'All-in', balanced: 'Balanced', reserve: 'Reserve' };\n\n/** The catalog's Stop copy, so ⌘K \"Stop the fleet…\" and this button confirm with the same words. */\nexport function stopConfirm(): ConfirmSpec {\n const guard = findCommand('fleet.stop')?.guard?.confirm;\n return {\n title: guard?.title ?? 'Stop the fleet?',\n body: guard?.body ?? 'Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.',\n confirmLabel: guard?.confirmLabel ?? 'Stop fleet',\n destructive: true,\n };\n}\n\nconst RESUME_CONFIRM: ConfirmSpec = {\n title: 'Resume the fleet?',\n body: 'Autonomy picks up at the switch position on its next tick. Stopping again is one click.',\n confirmLabel: 'Resume fleet',\n destructive: false,\n};\n\nexport function ChipDot({ tone }: { tone: ChipTone }) {\n return <span className={styles.dot} data-tone={tone} aria-hidden=\"true\" />;\n}\n\nexport interface AutonomyBarProps {\n read: OptionalRead<AuthorityStatusV1> | undefined;\n loading: boolean;\n budgetMode: BudgetMode | null;\n actions: SurfaceActions;\n compact: boolean;\n now: number;\n}\n\nexport function AutonomyBar({ read, loading, budgetMode, actions, compact, now }: AutonomyBarProps) {\n const status = read?.value ?? null;\n const [sheet, setSheet] = useState<{ intent: GrantIntent; then: AutonomySwitch | null; why: string } | null>(null);\n /** What the last Stop did (drain count, merges revoked) — shown while stopped. */\n const [stopNote, setStopNote] = useState<string | null>(null);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const unavailable = !status;\n const chip = grantChip(status, now);\n\n function onSwitch(to: AutonomySwitch): void {\n if (!status) return;\n const change = classifySwitch(status, to);\n if (change === 'same') return;\n if (change === 'raise-needs-grant') {\n const paused = status.grant.state === 'paused';\n setSheet({\n intent: paused ? 're-approve' : 'grant',\n then: to,\n why: paused\n ? `${status.grant.reason ?? 'The grant is paused.'} ${SWITCH_LABEL[to]} needs it re-approved.`\n : `${SWITCH_LABEL[to]} is beyond what the installed grant allows, so it needs a new grant.`,\n });\n return;\n }\n // Lower, or raise within the grant: straight to the server, no dialog.\n actions.act(() => postAuthority({ action: 'switch', to }), `Switch autonomy to ${SWITCH_LABEL[to]}`);\n }\n\n function approve(draft: AuthorityGrantDraft): void {\n if (!sheet) return;\n const { then } = sheet;\n // The DRAFT decides grant vs re-approve (B-U1: GET …/draft answers with\n // `kind`, and POST refuses a digest whose kind does not match the action).\n // The sheet's intent is only what the operator clicked; a grant that is no\n // longer continuable is drafted as a new one, and signing it must say so.\n const intent = actionForDraft(draft, sheet.intent);\n actions.act(\n () => postAuthority({ action: intent, draftDigest: draft.digest }),\n intent === 're-approve' ? 'Re-approve the standing grant' : 'Sign a new standing grant',\n {\n onDone: (next) => {\n setSheet(null);\n // Apply the requested position only if the NEW grant allows it.\n if (then && next && SWITCH_RANK[then] <= SWITCH_RANK[next.maxSwitchWithoutGrant] && then !== next.switch) {\n actions.act(() => postAuthority({ action: 'switch', to: then }), `Switch autonomy to ${SWITCH_LABEL[then]}`);\n }\n },\n },\n );\n }\n\n const options = status ? switchOptions(status) : switchOptions({ switch: 'off', maxSwitchWithoutGrant: 'off' });\n const stopped = status?.kill ?? false;\n const disabled = unavailable || actions.busy || actions.readOnly;\n\n const switchControl = (\n <div className={styles.switchWrap} title={unavailable ? (read?.reason ?? 'Reading autonomy state…') : undefined}>\n {!compact ? <span className={styles.barLabel} aria-hidden=\"true\">Autonomy</span> : null}\n <Segmented<AutonomySwitch>\n size=\"sm\"\n aria-label=\"Autonomy\"\n value={status?.switch ?? 'off'}\n onChange={onSwitch}\n options={options.map((o) => ({\n value: o.value,\n label: (\n <span className={styles.switchOption}>\n {compact ? o.short : o.label}\n {o.needsGrant ? <IconLock className={styles.touchMark} width={12} height={12} aria-hidden=\"true\" /> : null}\n </span>\n ),\n ariaLabel: o.ariaLabel,\n disabled,\n }))}\n />\n </div>\n );\n\n const onStop = () => actions.act(() => postAuthority({ action: 'stop' }), 'Stop the fleet', {\n confirm: stopConfirm(),\n onDone: (next) => setStopNote(stopOutcomeSentence(next)),\n });\n const onResume = () => actions.act(() => postAuthority({ action: 'clear-stop' }), 'Resume the fleet', {\n confirm: RESUME_CONFIRM,\n onDone: () => setStopNote(null),\n });\n const stopButton = stopped\n ? compact\n ? <Button variant=\"subtle\" size=\"sm\" icon={<IconPlay />} iconOnly aria-label=\"Resume the fleet\" disabled={disabled} onClick={onResume} />\n : <Button variant=\"subtle\" size=\"sm\" icon={<IconPlay />} disabled={disabled} onClick={onResume}>Resume</Button>\n : compact\n ? <Button variant=\"danger\" size=\"sm\" icon={<IconStop />} iconOnly aria-label=\"Stop the fleet\" disabled={disabled} onClick={onStop} />\n : <Button variant=\"danger\" size=\"sm\" icon={<IconStop />} disabled={disabled} onClick={onStop}>Stop</Button>;\n\n return (\n <>\n <div className={styles.bar} role=\"toolbar\" aria-label=\"Autonomy controls\" data-loading={loading || undefined}>\n {switchControl}\n {!compact ? (\n <>\n <BudgetPill mode={budgetMode} onOpen={() => setBudgetOpen(true)} />\n <GrantChip chip={chip} onOpen={(intent) => setSheet({ intent, then: null, why: chip.detail })} />\n </>\n ) : null}\n <span className={styles.barSpacer} />\n {stopButton}\n </div>\n {stopped && stopNote ? <p className={styles.muted} role=\"status\">{stopNote}</p> : null}\n {compact ? (\n <div className={styles.barSecondary}>\n <BudgetPill mode={budgetMode} onOpen={() => setBudgetOpen(true)} />\n <GrantChip chip={chip} onOpen={(intent) => setSheet({ intent, then: null, why: chip.detail })} />\n </div>\n ) : null}\n <GrantSheet\n open={sheet !== null}\n intent={sheet?.intent ?? 'grant'}\n then={sheet?.then ?? null}\n why={sheet?.why ?? ''}\n busy={actions.busy}\n onApprove={approve}\n onClose={() => setSheet(null)}\n />\n <BudgetSheet open={budgetOpen} onClose={() => setBudgetOpen(false)} status={status} />\n </>\n );\n}\n\nexport function BudgetPill({ mode, onOpen }: { mode: BudgetMode | null; onOpen: () => void }) {\n return (\n <button type=\"button\" className={styles.pill} aria-haspopup=\"dialog\" onClick={onOpen}>\n <span className={styles.pillLabel}>Budget</span>\n <span>{mode ? MODE_WORD[mode] : '—'}</span>\n <IconChevronDown width={14} height={14} aria-hidden=\"true\" />\n </button>\n );\n}\n\nexport function GrantChip({ chip, onOpen }: { chip: ReturnType<typeof grantChip>; onOpen: (intent: GrantIntent) => void }) {\n const body: ReactNode = (\n <>\n <ChipDot tone={chip.tone} />\n <span className={styles.pillLabel}>Grant</span>\n <span>{chip.label}</span>\n </>\n );\n if (!chip.action) {\n return (\n <span className={styles.chip} data-tone={chip.tone} title={chip.detail} aria-label={`Grant: ${chip.label}. ${chip.detail}`} role=\"status\">\n {body}\n </span>\n );\n }\n const intent = chip.action;\n return (\n <button type=\"button\" className={styles.chip} data-tone={chip.tone} title={chip.detail} aria-haspopup=\"dialog\" onClick={() => onOpen(intent)} aria-label={`Grant: ${chip.label}. ${chip.detail}`}>\n {body}\n </button>\n );\n}\n\nfunction BudgetSheet({ open, onClose, status }: { open: boolean; onClose: () => void; status: AuthorityStatusV1 | null }) {\n const max = status?.grant.state === 'active' ? status.grant.maxMode : null;\n return (\n <Sheet\n open={open}\n onClose={onClose}\n titleId=\"command-budget-sheet\"\n width={560}\n title=\"Budget\"\n description={\n max\n ? `Your grant allows up to ${MODE_WORD[max]}. Autonomy never spends past it, whatever is selected here — moving toward Reserve is always instant.`\n : 'No active grant: autonomy only proposes. The budget still decides which seats it would use.'\n }\n >\n {/* The grant's ceiling disables the modes above it (A9 control, C7 request). */}\n {open ? <BudgetControl maxMode={max} /> : null}\n </Sheet>\n );\n}\n","/**\n * Live headroom per seat — how much of each seat autonomy may still use under\n * its budget policy (V3.10 unit A9).\n *\n * INPUT is a `SeatCapacity`: the public Verse seat projection (the same\n * windows `GET /api/verse/accounts` serves — Claude `five_hour`/`seven_day`,\n * Codex `codex_<bucket>_{primary,secondary}`, Grok's billing period) reduced to\n * what budgeting needs. OUTPUT is the contract's `SeatHeadroom`, plus the\n * reopening time the router needs for `SeatExclusion.nextEligibleAt`.\n *\n * HONESTY RULES (docs/VERSE-TELEMETRY-V2.md, and Mason's decision):\n * - Unknown usage is NOT headroom. A paid seat with no reading, a reported\n * account window with a null percent, or a reading older than\n * `readingMaxAgeMs` is ineligible for autonomy. This is the fix for the old\n * Claude fail-open, where \"no signal\" was treated as \"go ahead\".\n * - A spent PER-MODEL window is not a spent account. Claude's\n * `seven_day_fable` can read 100% while `five_hour` reads 15%; only the\n * account-wide windows bind (seats.ts `seatUsability` has the same rule).\n * - Claude publishes no machine-readable reset. Its reset is quoted in the\n * provider's own words and never turned into a timestamp or a countdown.\n * - Codex credits are paid overage. Autonomy never spends them, so a spent\n * Codex window blocks autonomy even when a balance exists.\n *\n * WINDOW SEMANTICS\n * - `reservePercent` keeps that share of the LONG (weekly / billing-period)\n * window for Mason: autonomy stops at `100 − reserve` used. A seat that\n * reports only a short window applies the reserve to that one.\n * - `maxSessionWindowPercent` is the ceiling on the SHORT (5-hour) window, so\n * a live interactive session is never starved (\"never touch Claude while\n * its 5-hour window is above 70%\").\n * - The binding window is whichever of the two leaves autonomy LESS room.\n *\n * BROWSER-SAFE and PURE: type-only imports, no clock reads (callers pass\n * `nowMs`), no I/O.\n */\nimport type { VerseSeat, VerseSeatCapacity } from '../verse/types.js';\nimport type { BudgetEngine } from './policy.js';\nimport type { SeatBudgetPolicy, SeatHeadroom } from './types.js';\n\n/** A reading older than this is too stale to spend against (the collector polls every 30 s when active). */\nexport const HEADROOM_READING_MAX_AGE_MS = 15 * 60_000;\n\n/**\n * A window whose reset is further away than this cannot be a 5-hour window,\n * whatever its id says. Codex's `primary` bucket is USUALLY the 5-hour window,\n * but on 2026-09-24 both accounts reported a `primary` resetting ~42 h out —\n * so the reset distance, when known, overrides the id.\n */\nexport const SESSION_WINDOW_MAX_MS = 5 * 60 * 60_000 + 15 * 60_000;\n\nexport type SeatWindowClass = 'session' | 'weekly' | 'model';\n\nexport interface CapacityWindow {\n id: string;\n /** Provider percent; null = NO SIGNAL (not zero). */\n usedPercent: number | null;\n /** Machine reset; always null for Claude. */\n resetsAt: string | null;\n /** The provider's own reset wording (Claude), verbatim. */\n resetDescription: string | null;\n /** Provider explicitly flagged the limit (a denial, not a measurement). */\n limitReached: boolean;\n}\n\n/** What the budget layer needs to know about one seat. JSON-safe; persisted in the capacity snapshot. */\nexport interface SeatCapacity {\n seatId: string;\n engine: BudgetEngine;\n label: string;\n /** True for local runtime seats: $0 and no provider window. */\n free: boolean;\n windows: CapacityWindow[];\n /** The account reports no usable login. */\n signedOut: boolean;\n /** Can a turn reach this seat at all? Null when unknown. */\n reachable: boolean | null;\n /** Default model's context window in tokens; null when unknown. */\n contextWindow: number | null;\n /** When the windows were read; null when never. */\n observedAt: string | null;\n /** Today's metered spend in USD; null when unknown or not metered. */\n spentTodayUsd: number | null;\n}\n\n/** `SeatHeadroom` plus the facts the router needs but the wire shape does not carry. */\nexport interface SeatAssessment {\n headroom: SeatHeadroom;\n /** When the blocking condition is expected to lift; null when unknown / never / not blocked. */\n reopensAt: string | null;\n /** True when usage is known to be spent (limit flagged or ≥ 100%) on an account window. */\n exhausted: boolean;\n /** True when usage evidence is missing, partial or stale. */\n unknownUsage: boolean;\n /** The sentences naming each spent account window (a subset of `headroom.reasons`). */\n spentReasons: string[];\n}\n\nexport interface AssessOptions {\n nowMs: number;\n readingMaxAgeMs?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Projection from the public seat shape\n// ---------------------------------------------------------------------------\n\n/**\n * Reduce a public `VerseSeat` to a `SeatCapacity`. `liveCapacity`, when given,\n * replaces the seat's own (possibly cached) capacity — the caller re-reads\n * telemetry per request exactly as verse-api's `liveSeats` does.\n */\nexport function capacityFromSeat(seat: VerseSeat, liveCapacity?: VerseSeatCapacity | null): SeatCapacity {\n const free = seat.engine === 'local';\n const capacity = liveCapacity === undefined ? seat.capacity ?? null : liveCapacity;\n const windows: CapacityWindow[] = free || !capacity ? [] : capacity.windows.map((w) => ({\n id: w.id,\n usedPercent: typeof w.usedPercent === 'number' && Number.isFinite(w.usedPercent)\n ? Math.max(0, Math.min(100, w.usedPercent))\n : null,\n resetsAt: w.resetsAt,\n resetDescription: w.resetDescription,\n limitReached: w.limitReached === true,\n }));\n const signedOut = !free && capacity?.usability === 'signed-out';\n return {\n seatId: seat.id,\n engine: seat.engine,\n label: seat.label,\n free,\n windows,\n signedOut,\n // A local seat is only listed when the runtime answered discovery. A\n // native seat is reachable unless signed out; \"no reading\" is a usage\n // question, not a reachability one.\n reachable: free ? true : signedOut ? false : null,\n contextWindow: typeof seat.contextWindow === 'number' && seat.contextWindow > 0 ? seat.contextWindow : null,\n observedAt: free ? null : capacity?.observedAt ?? seat.health.observedAt ?? null,\n spentTodayUsd: null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Window classification\n// ---------------------------------------------------------------------------\n\nfunction resetDistanceMs(window: CapacityWindow, nowMs: number): number | null {\n if (!window.resetsAt) return null;\n const at = Date.parse(window.resetsAt);\n return Number.isFinite(at) ? at - nowMs : null;\n}\n\n/** Which role a window plays for budgeting. Per-model windows never bind. */\nexport function classifyWindow(engine: BudgetEngine, window: CapacityWindow, nowMs: number): SeatWindowClass {\n const id = window.id;\n if (engine === 'claude') {\n if (id === 'five_hour') return 'session';\n if (id === 'seven_day') return 'weekly';\n if (id.startsWith('seven_day_')) return 'model';\n }\n if (engine === 'grok') return 'weekly';\n const distance = resetDistanceMs(window, nowMs);\n if (engine === 'codex') {\n if (id.endsWith('_secondary')) return 'weekly';\n if (id.endsWith('_primary')) return distance !== null && distance > SESSION_WINDOW_MAX_MS ? 'weekly' : 'session';\n }\n // Unknown id: only a reset we can SEE inside five hours makes it short.\n return distance !== null && distance <= SESSION_WINDOW_MAX_MS ? 'session' : 'weekly';\n}\n\n/** Human name for a window, for reasons. */\nexport function windowName(engine: BudgetEngine, window: CapacityWindow, cls: SeatWindowClass): string {\n if (cls === 'session') return '5-hour window';\n if (cls === 'model') {\n const model = window.id.startsWith('seven_day_') ? window.id.slice('seven_day_'.length) : window.id;\n return `${model.charAt(0).toUpperCase()}${model.slice(1)}-only weekly window`;\n }\n if (engine === 'grok' || window.id.endsWith('_monthly')) {\n return window.id.endsWith('_monthly') ? 'monthly billing window' : window.id.endsWith('_weekly') ? 'weekly window' : 'billing-period window';\n }\n return 'weekly window';\n}\n\nfunction resetPhrase(window: CapacityWindow): string {\n if (window.resetsAt) return ` (resets ${window.resetsAt})`;\n // Claude: the provider's own words, verbatim — never a synthesized time.\n if (window.resetDescription) return ` (resets ${window.resetDescription})`;\n return '';\n}\n\nfunction isSpent(window: CapacityWindow): boolean {\n return window.limitReached || (window.usedPercent !== null && window.usedPercent >= 100);\n}\n\nfunction pct(value: number): string {\n return `${Math.round(value)}%`;\n}\n\nfunction formatAge(ms: number): string {\n const minutes = Math.round(ms / 60_000);\n if (minutes < 120) return `${minutes} min`;\n const hours = Math.round(minutes / 60);\n return hours < 48 ? `${hours} h` : `${Math.round(hours / 24)} days`;\n}\n\n// ---------------------------------------------------------------------------\n// Assessment\n// ---------------------------------------------------------------------------\n\ninterface ClassedWindow {\n window: CapacityWindow;\n cls: SeatWindowClass;\n}\n\n/** The highest reading among `rows`, with its window; null when none carried a percent. */\nfunction peak(rows: ClassedWindow[]): ClassedWindow | null {\n let best: ClassedWindow | null = null;\n for (const row of rows) {\n if (row.window.usedPercent === null) continue;\n if (best === null || row.window.usedPercent > best.window.usedPercent!) best = row;\n }\n return best;\n}\n\n/** Earliest machine-readable reset among `rows`; null when none is known. */\nfunction earliestReset(rows: ClassedWindow[]): string | null {\n const times = rows.flatMap((row) => (row.window.resetsAt && Number.isFinite(Date.parse(row.window.resetsAt))\n ? [row.window.resetsAt] : []));\n times.sort((a, b) => Date.parse(a) - Date.parse(b));\n return times[0] ?? null;\n}\n\n/** Full assessment of one seat for AUTONOMOUS use under `policy`. Pure. */\nexport function assessSeat(capacity: SeatCapacity, policy: SeatBudgetPolicy, opts: AssessOptions): SeatAssessment {\n const { nowMs } = opts;\n const maxAge = opts.readingMaxAgeMs ?? HEADROOM_READING_MAX_AGE_MS;\n const reasons: string[] = [];\n\n // ── Local: free, windowless, bounded only by reachability ──────────────\n if (capacity.free) {\n const reachable = capacity.reachable !== false;\n if (!policy.enabled) reasons.push('Autonomy is switched off for this seat.');\n if (!reachable) reasons.push('The local model runtime is not reachable.');\n const eligible = policy.enabled && reachable;\n if (eligible) reasons.push('Local model — free, with no usage window to protect.');\n return {\n headroom: {\n seatId: capacity.seatId,\n sessionUsedPercent: null,\n weeklyUsedPercent: null,\n bindingWindow: null,\n // No window binds a local seat; \"all of it\" is the honest number while\n // the runtime answers, and unknown while it does not.\n autonomyHeadroomPercent: reachable ? 100 : null,\n resetAt: null,\n eligibleForAutonomy: eligible,\n reasons,\n },\n reopensAt: null,\n exhausted: false,\n unknownUsage: false,\n spentReasons: [],\n };\n }\n\n // ── Paid seat ──────────────────────────────────────────────────────────\n const classed: ClassedWindow[] = capacity.windows.map((window) => ({\n window,\n cls: classifyWindow(capacity.engine, window, nowMs),\n }));\n const account = classed.filter((row) => row.cls !== 'model');\n const sessionRows = account.filter((row) => row.cls === 'session');\n const weeklyRows = account.filter((row) => row.cls === 'weekly');\n const sessionPeak = peak(sessionRows);\n const weeklyPeak = peak(weeklyRows);\n const sessionUsed = sessionPeak?.window.usedPercent ?? null;\n const weeklyUsed = weeklyPeak?.window.usedPercent ?? null;\n\n // Evidence quality.\n const observedMs = capacity.observedAt ? Date.parse(capacity.observedAt) : NaN;\n const ageMs = Number.isFinite(observedMs) ? nowMs - observedMs : null;\n const stale = ageMs === null || ageMs > maxAge;\n const hasReading = sessionUsed !== null || weeklyUsed !== null;\n const nullWindow = account.find((row) => row.window.usedPercent === null && !row.window.limitReached);\n\n // Ceilings. The reserve protects the LONG window; with no long window it\n // protects the short one. The session ceiling protects a live session.\n const reserveCeiling = 100 - policy.reservePercent;\n const sessionCeiling = policy.maxSessionWindowPercent ?? 100;\n // With no long window the short one carries BOTH limits; say which one bit.\n const sessionLimitIsReserve = weeklyRows.length === 0 && reserveCeiling < sessionCeiling;\n const sessionLimit = sessionLimitIsReserve ? reserveCeiling : sessionCeiling;\n let weeklyRoom: number | null = null;\n let sessionRoom: number | null = null;\n if (weeklyUsed !== null) weeklyRoom = reserveCeiling - weeklyUsed;\n if (sessionUsed !== null) sessionRoom = sessionLimit - sessionUsed;\n let bindingWindow: SeatHeadroom['bindingWindow'] = null;\n let room: number | null = null;\n if (weeklyRoom !== null && (sessionRoom === null || weeklyRoom <= sessionRoom)) {\n bindingWindow = 'weekly';\n room = weeklyRoom;\n } else if (sessionRoom !== null) {\n bindingWindow = 'session';\n room = sessionRoom;\n }\n const bindingRow = bindingWindow === 'weekly' ? weeklyPeak : bindingWindow === 'session' ? sessionPeak : null;\n\n // Blockers, most fundamental first. Every one gets a plain sentence.\n let reopensAt: string | null = null;\n const spentRows = account.filter((row) => isSpent(row.window));\n const exhausted = spentRows.length > 0;\n const unknownUsage = !hasReading || stale || nullWindow !== undefined;\n\n if (!policy.enabled) reasons.push('Autonomy is switched off for this seat.');\n if (capacity.signedOut) reasons.push('Signed out — reconnect this account before anything can run on it.');\n\n const spentReasons: string[] = [];\n if (exhausted) {\n for (const row of spentRows) {\n const used = row.window.limitReached ? 'limit reached' : `${pct(row.window.usedPercent!)} used`;\n spentReasons.push(`The ${windowName(capacity.engine, row.window, row.cls)} is spent — ${used}${resetPhrase(row.window)}.`);\n }\n reasons.push(...spentReasons);\n reopensAt = earliestReset(spentRows);\n }\n\n if (!hasReading) {\n reasons.push(account.length === 0\n ? 'No usage reading for this seat — unknown usage is not headroom, so autonomy stays off it.'\n : 'Its usage windows carried no percentage — unknown usage is not headroom, so autonomy stays off it.');\n } else if (stale) {\n reasons.push(ageMs === null\n ? 'The usage reading has no timestamp — too uncertain to spend against.'\n : `The usage reading is ${formatAge(ageMs)} old — too stale to spend against (limit ${formatAge(maxAge)}).`);\n } else if (nullWindow) {\n reasons.push(`The ${windowName(capacity.engine, nullWindow.window, nullWindow.cls)} carried no percentage — `\n + 'unknown usage is not headroom.');\n }\n\n const usdCap = policy.dailyUsdCap;\n let overUsd = false;\n if (usdCap !== undefined) {\n if (capacity.spentTodayUsd === null) {\n overUsd = true;\n reasons.push(`A $${usdCap.toFixed(2)} daily cap is set but today's spend on this seat is unknown.`);\n } else if (capacity.spentTodayUsd >= usdCap) {\n overUsd = true;\n reasons.push(`Spent $${capacity.spentTodayUsd.toFixed(2)} of its $${usdCap.toFixed(2)} daily cap.`);\n }\n }\n\n // Ceiling reasons only matter when the reading itself is trustworthy.\n const ceilingBlocked = !exhausted && !unknownUsage && room !== null && room <= 0;\n if (ceilingBlocked && bindingRow) {\n const name = windowName(capacity.engine, bindingRow.window, bindingRow.cls);\n const used = pct(bindingRow.window.usedPercent!);\n if (bindingWindow === 'session' && !sessionLimitIsReserve) {\n reasons.push(`The ${name} is ${used} used; autonomy stops at ${pct(sessionLimit)} `\n + `to protect your live session${resetPhrase(bindingRow.window)}.`);\n } else {\n reasons.push(`The ${name} is ${used} used; ${pct(policy.reservePercent)} is kept for you, so autonomy `\n + `stops at ${pct(reserveCeiling)}${resetPhrase(bindingRow.window)}.`);\n }\n reopensAt = bindingRow.window.resetsAt;\n }\n\n // Model-scoped windows are facts worth showing, never blockers.\n for (const row of classed) {\n if (row.cls === 'model' && isSpent(row.window)) {\n reasons.push(`The ${windowName(capacity.engine, row.window, row.cls)} is spent — it limits that model only, not the account.`);\n }\n }\n\n const eligible = policy.enabled && !capacity.signedOut && !exhausted && !unknownUsage && !overUsd\n && room !== null && room > 0;\n if (eligible && bindingRow) {\n const name = windowName(capacity.engine, bindingRow.window, bindingRow.cls);\n const kept = bindingWindow === 'weekly' || sessionLimitIsReserve\n ? policy.reservePercent > 0 ? ` (${pct(policy.reservePercent)} kept for you)` : ''\n : sessionLimit < 100 ? ` (autonomy stops at ${pct(sessionLimit)} to protect your live session)` : '';\n reasons.unshift(`${pct(room!)} of the ${name} is left for autonomy${kept}.`);\n }\n\n return {\n headroom: {\n seatId: capacity.seatId,\n sessionUsedPercent: sessionUsed,\n weeklyUsedPercent: weeklyUsed,\n bindingWindow,\n autonomyHeadroomPercent: room === null ? null : Math.max(0, Math.round(room)),\n resetAt: bindingRow?.window.resetsAt ?? null,\n eligibleForAutonomy: eligible,\n reasons,\n },\n // A seat that is merely switched off, signed out, or unknown has no\n // known reopening — only a window reset is a date we can name.\n reopensAt: !policy.enabled || capacity.signedOut || unknownUsage || overUsd ? null : reopensAt,\n exhausted,\n unknownUsage,\n spentReasons,\n };\n}\n\n/** The contract's `SeatHeadroom` for one seat. */\nexport function computeHeadroom(capacity: SeatCapacity, policy: SeatBudgetPolicy, opts: AssessOptions): SeatHeadroom {\n return assessSeat(capacity, policy, opts).headroom;\n}\n","/**\n * routes/verse/command/command-model.ts — the pure numbers behind Command's\n * KPI row, \"Since you looked\" strip, seat burn-downs and the Needs-you card\n * (unit C7; SPEC-310B §6, SPEC-310C §5).\n *\n * Honesty (docs/VERSE-TELEMETRY-V2.md): a KPI whose source did not answer\n * is \"—\", and a delta is computed only when BOTH windows are fully known — a\n * week with one unreadable day has no honest \"vs prior 7d\". Framework-free;\n * tested directly.\n */\nimport type { FleetLiveSnapshotV1, FleetLiveRun } from '../../../../core/fleet/fleet-types.js';\nimport type { LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport type { LearningStateV1 } from '../../../../core/learn/harness-types.js';\nimport type { NeedsYouItem, NeedsYouSeverity, VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { FleetHistoryDay, FleetHistoryResponse } from '../../../../core/verse/fleet-history-types.js';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport type { VerseSeat } from '../../../../core/verse/types.js';\nimport { classifyWindow } from '../../../../core/routing/headroom.js';\nimport type { EffectivePolicy } from '../../../../core/authority/types.js';\nimport type { StatTileDelta } from '../../../components/charts/StatTile.js';\n\nconst DAY = 86_400_000;\nconst HOUR = 3_600_000;\n\n// ---------------------------------------------------------------------------\n// Windows over the daily history\n// ---------------------------------------------------------------------------\n\n/** Sum of `pick` over days [end-len, end); null if any day in the window is unknown or missing. */\nexport function windowSum(days: readonly FleetHistoryDay[], pick: (d: FleetHistoryDay) => number | null, len: number, endOffset = 0): number | null {\n const end = days.length - endOffset;\n const start = end - len;\n if (start < 0 || len <= 0) return null;\n let total = 0;\n for (let i = start; i < end; i++) {\n const v = pick(days[i]!);\n if (v === null || !Number.isFinite(v)) return null;\n total += v;\n }\n return total;\n}\n\n/** The last `len` values of `pick`, oldest first (nulls kept — the sparkline breaks there). */\nexport function lastValues(days: readonly FleetHistoryDay[], pick: (d: FleetHistoryDay) => number | null, len: number): (number | null)[] {\n return days.slice(Math.max(0, days.length - len)).map(pick);\n}\n\nfunction mean(values: readonly (number | null)[]): number | null {\n const known = values.filter((v): v is number => v !== null && Number.isFinite(v));\n return known.length ? known.reduce((a, b) => a + b, 0) / known.length : null;\n}\n\n// ---------------------------------------------------------------------------\n// KPI row\n// ---------------------------------------------------------------------------\n\nexport interface Kpi {\n id: 'merged' | 'green' | 'cycle' | 'spend' | 'lift';\n label: string;\n /** Display string; \"—\" when unknown. */\n value: string;\n delta: StatTileDelta | null;\n trend: (number | null)[] | undefined;\n trendLabel: string;\n caption: string;\n}\n\nexport interface KpiInputs {\n fleet: FleetLiveSnapshotV1 | null;\n history: FleetHistoryResponse | null;\n learning: LearningStateV1 | null;\n policy: EffectivePolicy | null;\n /**\n * The live budget view, for subscription usage as PERCENT of each paid\n * seat's binding window. Optional so a caller without it still renders the\n * metered figure honestly; the caption then points at the seat burn-downs.\n */\n budget?: BudgetView | null;\n}\n\n/**\n * The per-token (metered API) part of a day's spend, when the server splits\n * it out. WHY not `estCostUsd`: that field prices EVERY run's tokens from a\n * static table — Claude/Codex/Grok subscription CLI runs included — so\n * showing it as \"spend vs the metered cap\" reported subscription work as a\n * budget breach (review 3.10 c10; the default grant's cap is $0/day).\n * Subscriptions are not billed per token: their cost is window usage, shown\n * as percent. fleet-history reports `meteredCostUsd` per day (per-token API\n * engines only — core/verse/fleet-history.ts `runBilling`); a server that\n * predates it leaves the figure unknown — \"—\", never the mixed estimate.\n */\nexport function meteredCost(d: FleetHistoryDay): number | null {\n const v = (d as FleetHistoryDay & { meteredCostUsd?: number | null }).meteredCostUsd;\n return typeof v === 'number' && Number.isFinite(v) && v >= 0 ? v : null;\n}\n\n/** \"Claude 54% · Grok 31% of window used\" — paid seats' binding-window usage, never dollars. */\nexport function subscriptionUsage(view: BudgetView | null | undefined): string | null {\n if (!view) return null;\n const info = new Map(view.seatInfo.map((s) => [s.seatId, s]));\n const parts: string[] = [];\n for (const h of view.headroom) {\n const seat = info.get(h.seatId);\n if (!seat || seat.free) continue;\n const used = h.bindingWindow === 'session' ? h.sessionUsedPercent : h.bindingWindow === 'weekly' ? h.weeklyUsedPercent : null;\n parts.push(`${seat.label} ${used === null || !Number.isFinite(used) ? '—' : `${Math.round(used)}%`}`);\n }\n return parts.length ? `${parts.join(' · ')} of window used` : null;\n}\n\nconst signedInt = (v: number) => (v > 0 ? `+${v}` : String(v));\nconst signedPts = (v: number) => `${v > 0 ? '+' : ''}${v.toFixed(1)}`;\nconst signedUsd = (v: number) => `${v > 0 ? '+' : v < 0 ? '−' : ''}$${Math.abs(v).toFixed(2)}`;\n\n/** \"2h 14m\", \"38m\", \"3d 2h\". */\nexport function formatSpan(ms: number | null): string {\n if (ms === null || !Number.isFinite(ms) || ms < 0) return '—';\n const m = Math.round(ms / 60_000);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 48) return m % 60 ? `${h}h ${m % 60}m` : `${h}h`;\n const d = Math.floor(h / 24);\n return h % 24 ? `${d}d ${h % 24}h` : `${d}d`;\n}\n\n/** Mean daily post-merge green % across repos, per day (oldest first, 14 days). */\nexport function greenTrend(fleet: FleetLiveSnapshotV1 | null): (number | null)[] {\n if (!fleet || fleet.repos.length === 0) return [];\n const len = Math.max(...fleet.repos.map((r) => r.greenTrend.length));\n return Array.from({ length: len }, (_, i) => mean(fleet.repos.map((r) => r.greenTrend[i - (len - r.greenTrend.length)] ?? null)));\n}\n\nexport function buildKpis({ fleet, history, learning, policy, budget }: KpiInputs): Kpi[] {\n const days = history?.days ?? [];\n const merges = (d: FleetHistoryDay) => d.merges.realized;\n const spend = meteredCost;\n\n // Merged · 7d — the live summary when the daemon answers, else the history window.\n const merged7 = fleet?.summary.merged7d ?? windowSum(days, merges, 7);\n const mergedPrior = windowSum(days, merges, 7, 7);\n const mergedNow = windowSum(days, merges, 7);\n const mergedDelta = mergedNow !== null && mergedPrior !== null ? mergedNow - mergedPrior : null;\n\n // Post-merge green — the 7-day figure plus the 14-day repo trend.\n const green = fleet?.summary.postMergeGreenPct7d ?? null;\n const gTrend = greenTrend(fleet);\n const gNow = gTrend.length >= 14 ? mean(gTrend.slice(-7)) : null;\n const gPrior = gTrend.length >= 14 ? mean(gTrend.slice(-14, -7)) : null;\n const greenDelta = gNow !== null && gPrior !== null ? gNow - gPrior : null;\n\n // Metered spend vs cap — per-token API spend ONLY (see meteredCost);\n // subscriptions go in the caption as percent of their window.\n const spend7 = windowSum(days, spend, 7);\n const spendPrior = windowSum(days, spend, 7, 7);\n const capPerDay = policy ? policy.spend.meteredUsdPerDay : null;\n const spendValue = spend7 === null ? '—' : `$${spend7.toFixed(2)}${capPerDay !== null ? ` / $${(capPerDay * 7).toFixed(0)}` : ''}`;\n const meteredKnown = days.some((d) => meteredCost(d) !== null);\n const capWords = capPerDay === null ? null : capPerDay === 0 ? 'metered APIs off ($0 cap)' : `cap $${capPerDay}/day`;\n const subs = subscriptionUsage(budget);\n const spendCaption = [\n capWords,\n meteredKnown ? null : 'metered split not reported yet',\n subs ? `subscriptions: ${subs}` : 'subscriptions are window usage, not dollars — see seat capacity',\n ]\n .filter(Boolean)\n .join(' · ');\n\n // Lift — the active harness's own experiment (null = baseline in force).\n const active = learning?.active ?? null;\n const activeExp = active?.experimentId ? learning?.experiments.find((e) => e.id === active.experimentId) ?? null : null;\n const lift = activeExp?.lift ?? null;\n\n return [\n {\n id: 'merged',\n label: 'Merged · 7d',\n value: merged7 === null ? '—' : String(merged7),\n delta: mergedDelta === null ? null : { value: mergedDelta, unit: Math.abs(mergedDelta) === 1 ? 'merge' : 'merges', versus: 'vs prior 7d', goodWhenPositive: true, format: signedInt },\n trend: days.length ? lastValues(days, merges, 14) : undefined,\n trendLabel: 'Merges per day, last 14 days',\n caption: fleet?.summary.mergedToday != null ? `${fleet.summary.mergedToday} today` : 'fleet merges on default branches',\n },\n {\n id: 'green',\n label: 'Post-merge green',\n value: green === null ? '—' : `${Math.round(green)}%`,\n delta: greenDelta === null ? null : { value: greenDelta, unit: 'pts', versus: 'vs prior 7d', goodWhenPositive: true, format: signedPts },\n trend: gTrend.length ? gTrend : undefined,\n trendLabel: 'Post-merge green percent per day',\n caption: green === null ? 'no completed post-merge watch yet' : 'CI + suite 2 h after each merge',\n },\n {\n id: 'cycle',\n label: 'Cycle time',\n value: formatSpan(fleet?.summary.cycleTimeP50Ms7d ?? null),\n delta: null,\n trend: undefined,\n trendLabel: 'Cycle time',\n caption: 'median, proposal → merge, 7d',\n },\n {\n id: 'spend',\n label: 'Metered spend · 7d',\n value: spendValue,\n delta: spend7 !== null && spendPrior !== null ? { value: spend7 - spendPrior, versus: 'vs prior 7d', goodWhenPositive: false, format: signedUsd } : null,\n trend: meteredKnown ? lastValues(days, spend, 14) : undefined,\n trendLabel: 'Metered (per-token API) spend per day',\n caption: spendCaption,\n },\n {\n id: 'lift',\n label: 'Lift',\n value: lift ? `${signedPts(lift.mean)} pts` : '—',\n delta: null,\n trend: undefined,\n trendLabel: 'Harness lift',\n caption: active ? `harness ${active.id} vs baseline${lift ? ` (95% ${signedPts(lift.ciLow)} to ${signedPts(lift.ciHigh)})` : ''}` : 'no harness adopted — defaults in force',\n },\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Since you looked\n// ---------------------------------------------------------------------------\n\nexport interface SinceItem {\n id: string;\n text: string;\n tone: 'success' | 'danger' | 'warning' | 'neutral' | 'info';\n}\n\nexport interface SinceInputs {\n /** ISO of the previous visit; null = first visit (nothing is \"new\"). */\n lastLookedAt: string | null;\n fleet: FleetLiveSnapshotV1 | null;\n leader: LeaderStateV1 | null;\n activity: VerseActivityResponse | null;\n}\n\nconst after = (iso: string | null, t: number) => iso !== null && Date.parse(iso) > t;\n\n/** What changed since the operator last opened Command, newest kinds first. */\nexport function sinceYouLooked({ lastLookedAt, fleet, leader, activity }: SinceInputs): SinceItem[] {\n if (!lastLookedAt) return [];\n const t = Date.parse(lastLookedAt);\n if (!Number.isFinite(t)) return [];\n const out: SinceItem[] = [];\n const ended = (fleet?.runs ?? []).filter((r) => after(r.endedAt, t));\n const count = (o: FleetLiveRun['outcome']) => ended.filter((r) => r.outcome === o).length;\n const merged = count('merged');\n const reverted = count('reverted');\n const failed = count('failed') + count('refused');\n if (merged) out.push({ id: 'merged', text: `${merged} merged`, tone: 'success' });\n if (reverted) out.push({ id: 'reverted', text: `${reverted} reverted`, tone: 'danger' });\n if (failed) out.push({ id: 'failed', text: `${failed} refused or failed`, tone: 'warning' });\n const memos = (leader?.timeline ?? []).filter((m) => Date.parse(m.at) > t && m.status === 'ok').length;\n if (memos) out.push({ id: 'memos', text: `${memos} new memo${memos === 1 ? '' : 's'}`, tone: 'info' });\n const fresh = (activity?.needsYou ?? []).filter((i) => Date.parse(i.since) > t).length;\n if (fresh) out.push({ id: 'needs', text: `${fresh} new for you`, tone: 'warning' });\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Needs you (Command card)\n// ---------------------------------------------------------------------------\n\nconst SEVERITY_RANK: Record<NeedsYouSeverity, number> = { high: 0, warn: 1, info: 2 };\n\n/** Most severe first, then newest. Pure — the drawer (C1) owns the full list. */\nexport function rankNeedsYou(items: readonly NeedsYouItem[]): NeedsYouItem[] {\n return [...items].sort((a, b) => SEVERITY_RANK[a.severity] - SEVERITY_RANK[b.severity] || Date.parse(b.since) - Date.parse(a.since));\n}\n\n/** Sources that did not answer — the card must not say \"All clear\" while any is listed. */\nexport function silentSources(activity: VerseActivityResponse | null): string[] {\n if (!activity) return [];\n return Object.entries(activity.sources).filter(([, state]) => state !== 'ok').map(([source]) => source);\n}\n\n// ---------------------------------------------------------------------------\n// Seat burn-downs\n// ---------------------------------------------------------------------------\n\nexport interface SeatReading {\n t: number;\n /** Percent of the binding window used, 0–100. */\n used: number;\n}\n\n/**\n * The readings the page has seen per seat. WHY client-side: the budget route\n * serves ONE reading per seat (its current headroom); no window history is\n * persisted server-side yet (CROSS-UNIT REQUEST to A9/C6). So the burn-down\n * starts with what this viewer has observed since Verse opened, says so, and\n * never draws a guessed history. Memory only, bounded.\n */\nexport const SEAT_READINGS_MAX = 240;\n\nexport function recordReading(history: Readonly<Record<string, SeatReading[]>>, view: BudgetView | null): Record<string, SeatReading[]> {\n if (!view) return { ...history };\n const t = Date.parse(view.sampledAt);\n if (!Number.isFinite(t)) return { ...history };\n const next: Record<string, SeatReading[]> = { ...history };\n for (const h of view.headroom) {\n const used = h.bindingWindow === 'session' ? h.sessionUsedPercent : h.bindingWindow === 'weekly' ? h.weeklyUsedPercent : null;\n if (used === null || !Number.isFinite(used)) continue;\n const prev = next[h.seatId] ?? [];\n if (prev.length && prev[prev.length - 1]!.t >= t) continue;\n // A reset (used dropped sharply) starts a new window — drop the old one.\n const fresh = prev.length && used + 20 < prev[prev.length - 1]!.used ? [] : prev;\n next[h.seatId] = [...fresh, { t, used }].slice(-SEAT_READINGS_MAX);\n }\n return next;\n}\n\nexport interface SeatBurn {\n seatId: string;\n label: string;\n engine: 'claude' | 'codex' | 'grok' | 'local';\n window: 'session' | 'weekly' | null;\n /** Remaining percent readings (100 − used). */\n points: { t: number; remaining: number | null }[];\n start: number | null;\n resetAt: number | null;\n /**\n * The provider's own reset wording for the binding window, verbatim\n * (\"Sep 25 at 7pm (America/New_York)\"), when the seat roster carries it.\n * Claude publishes ONLY this — never a machine instant — so a Claude card\n * has readings but `resetAt === null`; the card shows the words and draws\n * the readings with no projected reset point (never a synthesized one).\n */\n resetText: string | null;\n reservePercent: number;\n /**\n * The line autonomy stops at IN THE WINDOW THIS CHART DRAWS, as remaining\n * percent (see `bindingLine`); null when that window has no limit.\n */\n line: { value: number; label: string } | null;\n enabled: boolean;\n free: boolean;\n eligible: boolean;\n reason: string | null;\n}\n\nconst WINDOW_MS = { session: 5 * HOUR, weekly: 7 * DAY } as const;\n\n/**\n * The stop line for the binding window, mirroring core/routing/headroom.ts\n * exactly (review 3.10 d2). The reserve protects the LONG (weekly) window;\n * the 5-hour window is capped by `maxSessionWindowPercent` — except when the\n * seat has no weekly window at all, where the short one carries both limits\n * and the tighter one wins. Drawing the weekly reserve on a 5-hour chart put\n * Mason's balanced cutoff at 60% used instead of 70% and made the verdict say\n * \"autonomy has stopped\" while the server still had the seat eligible.\n *\n * `weeklyUsedPercent === null` stands in for \"no weekly window\": a weekly\n * window whose reading is unknown makes the seat ineligible server-side\n * anyway (unknown usage is never headroom), and the card shows that reason.\n */\nexport function bindingLine(\n h: { bindingWindow: 'session' | 'weekly' | null; weeklyUsedPercent: number | null },\n policy: { reservePercent: number; maxSessionWindowPercent?: number } | undefined,\n): { value: number; label: string } | null {\n if (!policy || h.bindingWindow === null) return null;\n const reserveCeiling = 100 - policy.reservePercent;\n const sessionCeiling = policy.maxSessionWindowPercent ?? 100;\n let ceiling: number;\n let label: string;\n if (h.bindingWindow === 'weekly') {\n ceiling = reserveCeiling;\n label = 'Reserved for you';\n } else if (h.weeklyUsedPercent === null && reserveCeiling < sessionCeiling) {\n ceiling = reserveCeiling;\n label = 'Reserved for you';\n } else {\n ceiling = sessionCeiling;\n label = '5-hour ceiling';\n }\n const value = 100 - ceiling;\n return value > 0 ? { value, label } : null;\n}\n\n/**\n * Axis/verdict time format per window (review 3.10 c17). A weekly window\n * starts exactly seven days before it resets, so weekday + time alone printed\n * \"Sat 10:27 AM … Resets Sat 10:27 AM\"; the weekly form carries the date.\n */\nexport function burnTimeFormat(window: 'session' | 'weekly' | null): (ms: number) => string {\n const opts: Intl.DateTimeFormatOptions =\n window === 'session'\n ? { weekday: 'short', hour: 'numeric', minute: '2-digit' }\n : { weekday: 'short', month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' };\n return (ms) => {\n const d = new Date(ms);\n return Number.isNaN(d.getTime()) ? '' : d.toLocaleString('en-US', opts);\n };\n}\n\n/**\n * The provider's reset wording for the seat window that plays `binding`'s\n * role. WHY the seat roster and not the budget route: `SeatHeadroom` (the\n * frozen budget wire shape) carries only a machine `resetAt`, which is\n * structurally null for Claude — the provider's sentence lives on the seat's\n * capacity windows. The window is picked with the SAME classifier the server\n * used to choose the binding window (core/routing/headroom.ts), so the words\n * belong to the window the chart draws, not to a per-model window beside it.\n */\nexport function bindingResetText(\n seat: Pick<VerseSeat, 'capacity'> | undefined,\n engine: SeatBurn['engine'],\n binding: 'session' | 'weekly' | null,\n nowMs: number,\n): string | null {\n if (!seat?.capacity || binding === null || engine === 'local') return null;\n for (const w of seat.capacity.windows) {\n const text = typeof w.resetDescription === 'string' ? w.resetDescription.trim() : '';\n if (text.length === 0) continue;\n if (classifyWindow(engine, { id: w.id, usedPercent: w.usedPercent, resetsAt: w.resetsAt, resetDescription: w.resetDescription, limitReached: w.limitReached }, nowMs) === binding) return text;\n }\n return null;\n}\n\n/**\n * \"resets Sep 25 at 7pm (America/New_York)\" from the provider's words. The\n * collector strips the leading \"resets\" (claude-account-usage.ts) but other\n * paths keep it; either way the sentence itself is shown verbatim.\n */\nexport function resetWords(text: string): string {\n return `resets ${text.replace(/^resets\\s+/i, '')}`;\n}\n\n/**\n * One burn-down per seat, paid seats first (they are the ones that run out).\n * `seats` (the live roster, optional) supplies the provider's reset wording\n * for seats that publish no machine reset time (see `bindingResetText`).\n */\nexport function seatBurns(\n view: BudgetView | null,\n history: Readonly<Record<string, SeatReading[]>>,\n seats?: readonly VerseSeat[] | null,\n): SeatBurn[] {\n if (!view) return [];\n const info = new Map(view.seatInfo.map((s) => [s.seatId, s]));\n const roster = new Map((seats ?? []).map((s) => [s.id, s]));\n const sampled = Date.parse(view.sampledAt);\n const nowMs = Number.isFinite(sampled) ? sampled : Date.now();\n return view.headroom\n .map((h): SeatBurn => {\n const i = info.get(h.seatId);\n const engine = i?.engine ?? 'local';\n const resetAt = h.resetAt ? Date.parse(h.resetAt) : NaN;\n const windowMs = h.bindingWindow ? WINDOW_MS[h.bindingWindow] : null;\n const start = Number.isFinite(resetAt) && windowMs ? resetAt - windowMs : null;\n const readings = history[h.seatId] ?? [];\n return {\n seatId: h.seatId,\n label: i?.label ?? h.seatId,\n engine,\n window: h.bindingWindow,\n points: readings.filter((r) => start === null || r.t >= start).map((r) => ({ t: r.t, remaining: Math.max(0, 100 - r.used) })),\n start,\n resetAt: Number.isFinite(resetAt) ? resetAt : null,\n resetText: bindingResetText(roster.get(h.seatId), engine, h.bindingWindow, nowMs),\n reservePercent: view.effective[h.seatId]?.reservePercent ?? 0,\n line: bindingLine(h, view.effective[h.seatId]),\n enabled: view.effective[h.seatId]?.enabled ?? false,\n free: i?.free ?? false,\n eligible: h.eligibleForAutonomy,\n reason: h.reasons[0] ?? null,\n };\n })\n .sort((a, b) => Number(a.free) - Number(b.free) || a.label.localeCompare(b.label));\n}\n\n/** \"Claude 40% reserved for you\" — the first enabled Claude seat's reserve, from the live budget. */\nexport function claudeReserve(view: BudgetView | null): { label: string; percent: number } | null {\n if (!view) return null;\n const seat = view.seatInfo.find((s) => s.engine === 'claude');\n if (!seat) return null;\n const policy = view.effective[seat.seatId];\n return policy ? { label: 'Claude', percent: policy.reservePercent } : null;\n}\n","/**\n * routes/verse/command/KpiRow.tsx — five StatTiles (SPEC-310B §6: merged in\n * 7 days, post-merge green %, cycle time, spend vs cap, lift), each with a\n * \"vs prior 7d\" delta when both weeks are fully known. Five across at 1440,\n * two per row at 375.\n */\nimport { StatTile } from '../../../components/charts/StatTile.js';\nimport type { Kpi } from './command-model.js';\nimport styles from './command.module.css';\n\nexport function KpiRow({ kpis }: { kpis: Kpi[] }) {\n return (\n <div className={styles.kpis} role=\"group\" aria-label=\"Key numbers\">\n {kpis.map((k) => (\n <StatTile key={k.id} label={k.label} value={k.value} delta={k.delta} trend={k.trend} trendLabel={k.trendLabel} caption={k.caption} />\n ))}\n </div>\n );\n}\n","/**\n * routes/verse/command/NeedsYouCard.tsx — Command's \"Needs you\" card (span 5\n * at 1440, FIRST at 375; SPEC-310C §5). The five most urgent items from the\n * one inbox (owner-lane PRs, class-C asks, veto windows, holds, grant\n * renewal, reconnects — R1 producers via C1's activity route), each with its\n * own actions. The full, keyboard-triaged list is the ⌘J drawer (C1); this\n * card is the glance and the one-click path.\n *\n * Honesty: when any producer did not answer, the card never says \"All\n * clear\" — it names the silent sources instead (\"fleet not answering\").\n * Every approve / reject / veto confirms first (NeedsYouAction contract),\n * then asks for the token; items render their text as plain text only.\n */\nimport type { NeedsYouAction, NeedsYouItem, VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconExternalLink } from '../../../components/primitives/icons.js';\nimport { formatAge } from '../autonomy/format.js';\nimport { rankNeedsYou, silentSources } from './command-model.js';\nimport { anchorId, goToSection, openChat, openNeedsYou } from './nav.js';\nimport { postNeedsYouAction } from './surface-data.js';\nimport type { ActivityState } from '../shell/useActivity.js';\nimport { Card, CardNote } from './Surface.js';\nimport type { ConfirmSpec, SurfaceActions } from './actions.js';\nimport styles from './command.module.css';\n\nexport const NEEDS_YOU_CARD_LIMIT = 5;\n\nconst SEVERITY_WORD = { high: 'Urgent', warn: 'Soon', info: 'FYI' } as const;\nconst SOURCE_WORD: Record<string, string> = {\n approvals: 'approvals',\n authority: 'authority',\n fleet: 'fleet',\n leader: 'Leader',\n chats: 'chats',\n accounts: 'accounts',\n};\n\n/** Generic confirmation for the kinds the drawer always confirms (approve / reject / veto). */\nexport function confirmFor(item: NeedsYouItem, action: NeedsYouAction): ConfirmSpec | undefined {\n if (action.confirm) return { ...action.confirm, destructive: action.destructive };\n if (action.kind === 'approve' || action.kind === 'reject' || action.kind === 'veto') {\n const verb = action.kind === 'approve' ? 'Approve' : action.kind === 'reject' ? 'Reject' : 'Veto';\n return { title: `${verb}?`, body: item.title, confirmLabel: action.label, destructive: action.destructive };\n }\n return undefined;\n}\n\nfunction targetLink(item: NeedsYouItem): { label: string; onOpen?: () => void; href?: string } | null {\n const t = item.target;\n switch (t.kind) {\n case 'url':\n return /^https:\\/\\//.test(t.url) ? { label: 'Open', href: t.url } : null;\n case 'section':\n return { label: 'Show', onOpen: () => goToSection(t.section, t.anchor) };\n case 'session':\n return { label: 'Open chat', onOpen: () => openChat(t.sessionId) };\n case 'approval':\n case 'seat':\n return { label: 'Open', onOpen: () => openNeedsYou(item.id) };\n default:\n return null;\n }\n}\n\nfunction meta(item: NeedsYouItem): string {\n const s = item.subject;\n return [s.repo, s.pr ? `#${s.pr}` : null, s.seatId, formatAge(item.since)].filter(Boolean).join(' · ');\n}\n\nexport function NeedsYouRow({ item, actions }: { item: NeedsYouItem; actions: SurfaceActions }) {\n const link = targetLink(item);\n const runnable = item.actions.filter((a) => a.request !== null);\n return (\n <li className={styles.needsRow} data-severity={item.severity} id={anchorId(item.id)}>\n <span className={styles.sevDot} data-severity={item.severity} aria-hidden=\"true\" />\n <div className={styles.needsText}>\n <span className={styles.needsTitle}>\n <span className=\"visually-hidden\">{SEVERITY_WORD[item.severity]}: </span>\n {item.title}\n </span>\n {item.detail ? <span className={styles.needsDetail}>{item.detail}</span> : null}\n <span className={styles.needsMeta}>{meta(item)}</span>\n </div>\n <div className={styles.needsActions}>\n {runnable.map((action) => (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.destructive ? 'danger' : action.kind === 'approve' ? 'primary' : 'subtle'}\n disabled={actions.busy || actions.readOnly}\n onClick={() =>\n actions.act(() => postNeedsYouAction(action.request!.path, action.request!.body), `${action.label}: ${item.title}`, {\n confirm: confirmFor(item, action),\n })\n }\n >\n {action.label}\n </Button>\n ))}\n {link ? (\n link.href ? (\n <a className={styles.linkButton} href={link.href} target=\"_blank\" rel=\"noopener noreferrer\">\n {link.label}\n <IconExternalLink width={12} height={12} aria-hidden=\"true\" />\n <span className=\"visually-hidden\"> (opens in a new tab)</span>\n </a>\n ) : (\n <button type=\"button\" className={styles.linkButton} onClick={link.onOpen}>\n {link.label}\n </button>\n )\n ) : null}\n </div>\n </li>\n );\n}\n\n/** C1's activity store in the surfaces' OptionalRead words. */\nexport function activityRead(state: ActivityState): { activity: VerseActivityResponse | null; loading: boolean; reason: string | null; stale: boolean } {\n if (state.status === 'unavailable') {\n return { activity: null, loading: false, reason: 'The Needs-you inbox is not in this build yet, so this card has no source.', stale: false };\n }\n if (!state.data) return { activity: null, loading: true, reason: null, stale: false };\n return { activity: state.data, loading: false, reason: null, stale: state.status === 'stale' };\n}\n\nexport function NeedsYouCard({ state, actions, fleetLine }: { state: ActivityState; actions: SurfaceActions; fleetLine: string }) {\n const { activity, loading, reason, stale } = activityRead(state);\n const items = activity ? rankNeedsYou(activity.needsYou) : [];\n const silent = silentSources(activity);\n const shown = items.slice(0, NEEDS_YOU_CARD_LIMIT);\n const count = activity ? activity.needsYou.length : null;\n return (\n <Card\n title={count === null ? 'Needs you' : `Needs you (${count})`}\n caption={count === null ? undefined : count === 0 ? undefined : 'Most urgent first'}\n tone={count ? 'attention' : undefined}\n actions={\n <button type=\"button\" className={styles.linkButton} onClick={() => openNeedsYou()} aria-keyshortcuts=\"Meta+J\">\n Open all <kbd className={styles.kbd}>⌘J</kbd>\n </button>\n }\n >\n {loading ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the inbox…</p>\n ) : !activity ? (\n <CardNote tone=\"unknown\">{reason ?? 'The Needs-you inbox did not answer.'} Nothing is shown rather than a false all-clear.</CardNote>\n ) : shown.length === 0 ? (\n silent.length || stale ? (\n <CardNote tone=\"unknown\">\n {silent.length\n ? `Nothing to show, but ${silent.map((s) => SOURCE_WORD[s] ?? s).join(', ')} ${silent.length === 1 ? 'is' : 'are'} not answering — this is not an all-clear.`\n : 'Nothing to show, but the last refresh failed — this is not an all-clear.'}\n </CardNote>\n ) : (\n <div className={styles.allClear} role=\"status\">\n <span className={styles.allClearTitle}>All clear</span>\n <span className={styles.allClearBody}>{fleetLine}</span>\n </div>\n )\n ) : (\n <>\n <ul className={styles.needsList}>\n {shown.map((item) => (\n <NeedsYouRow key={item.id} item={item} actions={actions} />\n ))}\n </ul>\n {items.length > shown.length ? (\n <button type=\"button\" className={styles.moreLink} onClick={() => openNeedsYou()}>\n {items.length - shown.length} more in the drawer\n </button>\n ) : null}\n {silent.length ? (\n <p className={styles.muted}>{silent.map((s) => SOURCE_WORD[s] ?? s).join(', ')} not answering — the list may be incomplete.</p>\n ) : null}\n {stale ? <p className={styles.muted}>The last refresh failed; showing the previous list.</p> : null}\n </>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/command/SeatBurnDowns.tsx — one burn-down per seat (span 3\n * each at 1440; a snap-scrolling strip at 375): remaining capacity in the\n * binding window, the line autonomy stops at in THAT window (the weekly\n * reserve, or the 5-hour ceiling), the projection and the reset\n * (SPEC-310B §6 \"BurnDown per seat: reserve band, ceiling, projected\n * exhaustion, reset time\").\n *\n * The readings are the ones this viewer has seen since Verse opened (the\n * budget route serves one reading per seat — see command-model.ts), and the\n * card says so. A local seat has no window: it gets a quiet \"free\" tile, not\n * an empty chart.\n */\nimport { AreaTrend } from '../../../components/charts/AreaTrend.js';\nimport { BurnDown } from '../../../components/charts/BurnDown.js';\nimport { EngineMarker } from '../../../components/primitives/Tag.js';\nimport { burnTimeFormat, resetWords, type SeatBurn } from './command-model.js';\nimport { CardNote } from './Surface.js';\nimport styles from './command.module.css';\n\nconst WINDOW_WORD = { session: '5-hour', weekly: 'weekly' } as const;\n\n/**\n * '∞' as SVG, not text (review 3.10 c18): U+221E is outside the Ashlr Sans\n * Latin subset, so the text glyph made Command fetch the 230 KB full face.\n * Decorative — the sentence beside it says \"free\".\n */\nfunction InfinityMark() {\n return (\n <svg width=\"1.6em\" height=\"0.8em\" viewBox=\"0 0 24 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.6} strokeLinecap=\"round\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M6 2.5a3.5 3.5 0 1 0 0 7c2.5 0 3.5-2 6-3.5s3.5-3.5 6-3.5a3.5 3.5 0 1 1 0 7c-2.5 0-3.5-2-6-3.5S8.5 2.5 6 2.5Z\" />\n </svg>\n );\n}\n\nexport function SeatBurnCard({ burn, now, width }: { burn: SeatBurn; now: number; width?: number }) {\n if (burn.free) {\n return (\n <section className={styles.freeSeat} aria-label={`${burn.label}: free local seat`}>\n <span className={styles.freeHead}>\n <EngineMarker engine={burn.engine} />\n <span className={styles.freeTitle}>{burn.label}</span>\n </span>\n <span className={styles.freeValue}>\n <InfinityMark />\n </span>\n <span className={styles.freeBody}>Local — free, no provider window. {burn.eligible ? 'Takes autonomous work.' : burn.reason ?? ''}</span>\n </section>\n );\n }\n const title = `${burn.label}${burn.window ? ` · ${WINDOW_WORD[burn.window]}` : ''}`;\n const eligibility = burn.enabled ? (burn.eligible ? 'Autonomy may use it now' : burn.reason ?? 'Held back from autonomy') : 'Not used by autonomy';\n const pct = (v: number) => `${Math.round(v)}%`;\n const latest = [...burn.points].reverse().find((p) => p.remaining !== null)?.remaining ?? null;\n const noReading = (\n <section className={styles.freeSeat} aria-label={title}>\n <span className={styles.freeHead}>\n <EngineMarker engine={burn.engine} />\n <span className={styles.freeTitle}>{burn.label}</span>\n </span>\n <CardNote tone=\"unknown\">No window reading — unknown usage is never treated as headroom.</CardNote>\n </section>\n );\n if (burn.window === null) return noReading;\n if (burn.resetAt === null || burn.start === null) {\n if (latest === null) return noReading;\n // A window WITH readings but no machine reset time — Claude's normal case\n // (it publishes only a sentence). This used to fall into \"No window\n // reading\", hiding real readings on the seat that matters most. Draw the\n // readings, write the provider's own reset words, and draw NO reset point\n // or projection: a burn-down to an instant nobody published would be a\n // guess (core/verse/types.ts: never synthesize a countdown from words).\n const reset = burn.resetText ? resetWords(burn.resetText) : 'reset time not reported';\n return (\n <AreaTrend\n title={title}\n description={`${pct(latest)} left · ${reset} · ${eligibility}`}\n caveat={`${burn.resetText ? 'The provider reports this reset only in words' : 'No reset time was reported for this window'}, so nothing is projected to a reset.${burn.points.length < 2 ? ' Readings since Verse opened — the line fills in as it watches this seat.' : ''}`}\n series={[{ id: 'remaining', label: 'Remaining', points: burn.points.map((p) => ({ x: p.t, y: p.remaining })) }]}\n threshold={burn.line ?? undefined}\n height={160}\n width={width}\n formatX={burnTimeFormat(burn.window)}\n formatY={pct}\n ariaLabel={`${title}: ${pct(latest)} left, ${reset}. ${eligibility}.`}\n />\n );\n }\n return (\n <BurnDown\n title={title}\n description={eligibility}\n caveat={burn.points.length < 2 ? 'Readings since Verse opened — the line fills in as it watches this seat.' : undefined}\n status={burn.points.length === 0 ? { kind: 'empty', message: 'No reading yet in this window.' } : undefined}\n points={burn.points}\n capacity={100}\n start={burn.start}\n resetAt={burn.resetAt}\n now={now}\n // The binding window's own stop line (command-model.ts bindingLine), so\n // the verdict under the chart agrees with the server's eligibility.\n reserve={burn.line ?? undefined}\n height={160}\n width={width}\n formatValue={(v) => `${Math.round(v)}%`}\n formatTime={burnTimeFormat(burn.window)}\n />\n );\n}\n\nexport function SeatBurnDowns({ burns, now, compact }: { burns: SeatBurn[]; now: number; compact: boolean }) {\n if (burns.length === 0) {\n return <CardNote tone=\"unknown\">Seat capacity is not available — the budget route did not answer.</CardNote>;\n }\n return (\n <div className={compact ? styles.burnStrip : styles.burnGrid} role=\"group\" aria-label=\"Capacity per seat\">\n {burns.map((b) => (\n <div key={b.seatId} className={styles.burnItem}>\n <SeatBurnCard burn={b} now={now} width={compact ? 300 : undefined} />\n </div>\n ))}\n </div>\n );\n}\n","/**\n * routes/verse/command/VerdictLine.tsx — the one sentence under the top bar\n * (17/24, weight 500): \"Autonomous · 5 building · 7 merged today · 0 reverts\n * · Claude 46% reserved for you\", then the \"Since you looked\" strip.\n *\n * The strip compares against the operator's previous visit to Command,\n * remembered per viewer in localStorage (a convenience: if storage is\n * blocked the strip simply stays hidden — nothing depends on it).\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { useSectionVisible } from '../shell/section-visibility.js';\nimport { verdictParts, type VerdictInputs } from './authority-model.js';\nimport type { SinceItem } from './command-model.js';\nimport styles from './command.module.css';\n\nexport function VerdictLine(props: VerdictInputs) {\n const parts = verdictParts(props);\n return (\n <p className={styles.verdict} data-testid=\"verdict\">\n {parts.map((p, i) => (\n <span key={p.key} className={styles.verdictPart} data-tone={p.tone}>\n {i > 0 ? <span className={styles.verdictSep} aria-hidden=\"true\"> · </span> : null}\n {p.text}\n </span>\n ))}\n </p>\n );\n}\n\nexport const LAST_LOOKED_KEY = 'ashlr.verse.command.lastLooked.v1';\n\nfunction readStored(): string | null {\n try {\n const v = window.localStorage.getItem(LAST_LOOKED_KEY);\n return v && Number.isFinite(Date.parse(v)) ? v : null;\n } catch {\n return null;\n }\n}\n\nfunction writeStored(value: string): void {\n try {\n window.localStorage.setItem(LAST_LOOKED_KEY, value);\n } catch {\n /* private window / blocked storage: the strip just stays hidden */\n }\n}\n\n/**\n * The previous visit's time. Each time Command comes into view (mount, or\n * back from another surface in the keep-alive shell), what was stored\n * becomes \"last looked\" and now is stored for next time.\n */\nexport function useLastLooked(): string | null {\n const visible = useSectionVisible();\n const [previous, setPrevious] = useState<string | null>(null);\n const wasVisible = useRef(false);\n useEffect(() => {\n if (visible && !wasVisible.current) {\n setPrevious(readStored());\n writeStored(new Date().toISOString());\n }\n wasVisible.current = visible;\n }, [visible]);\n return previous;\n}\n\nexport function SinceStrip({ lastLookedAt, items }: { lastLookedAt: string | null; items: SinceItem[] }) {\n if (!lastLookedAt) return null;\n const when = new Date(lastLookedAt);\n const sameDay = when.toDateString() === new Date().toDateString();\n const label = sameDay\n ? when.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })\n : when.toLocaleString('en-US', { weekday: 'short', hour: 'numeric', minute: '2-digit' });\n return (\n <div className={styles.since} role=\"group\" aria-label={`Since you looked at ${label}`}>\n <span className={styles.sinceLead}>Since {label}</span>\n {items.length === 0 ? (\n <span className={styles.sinceEmpty}>nothing new</span>\n ) : (\n items.map((item) => (\n <span key={item.id} className={styles.sinceChip} data-tone={item.tone}>\n {item.text}\n </span>\n ))\n )}\n </div>\n );\n}\n","/**\n * routes/verse/sections/CommandSection.tsx — ⌘1 Command, the home surface\n * (SPEC-310B §6, SPEC-310C §5; unit C7). Lazy-mounted by the shell; takes no\n * props (named export, like every section).\n *\n * It answers, top to bottom, in the order the questions arrive:\n * 1. What is autonomy allowed to do, and how do I stop it? (top bar)\n * 2. Is the company producing? (verdict line)\n * 3. What changed since I last looked? (\"Since\" strip)\n * 4. What needs me, and what is the Leader doing? (Needs you 5 | Leader 7)\n * — Needs you reads the shell's shared activity store (C1 useActivity).\n * 5. Is it working? (5 KPI tiles)\n * 6. Will it run out? (burn-down per seat, 3 each)\n * 7. What ran? (12 h swimlane)\n * At 375 px: Needs you, Leader, KPIs two per row, burn-downs in a snap\n * strip, then a 6 h swimlane — the DOM order below IS that order.\n *\n * Every source is optional (surface-data.ts): a Track B module that has not\n * landed is one card's designed \"not in this build\" state, never a blank\n * surface. Polling runs only while Command is the visible surface\n * (usePollWhileVisible), at ≥ 2 s per the performance budget.\n */\nimport { useCallback, useEffect, useMemo, useState, useSyncExternalStore } from 'react';\nimport { Swimlane } from '../../../components/charts/Swimlane.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { getQuerySnapshot, subscribeQuery } from '../../../data/cache.js';\nimport type { VerseBootstrap } from '../../../data/api-types.js';\nimport { VERSE_BOOTSTRAP_KEY } from '../verse-queries.js';\nimport { budgetQuery } from '../budget/budget-queries.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { ActionStatus, useSurfaceActions } from '../command/actions.js';\nimport { AutonomyBar } from '../command/AutonomyBar.js';\nimport { buildKpis, claudeReserve, recordReading, seatBurns, sinceYouLooked, type SeatReading } from '../command/command-model.js';\nimport { KpiRow } from '../command/KpiRow.js';\nimport { LeaderCard } from '../command/LeaderCard.js';\nimport { NeedsYouCard } from '../command/NeedsYouCard.js';\nimport { SeatBurnDowns } from '../command/SeatBurnDowns.js';\nimport { Cell, Surface } from '../command/Surface.js';\nimport { SinceStrip, VerdictLine, useLastLooked } from '../command/VerdictLine.js';\nimport { useActivity } from '../shell/useActivity.js';\nimport {\n authorityQuery,\n fleetHistoryQuery,\n fleetLiveQuery,\n leaderQuery,\n learningQuery,\n} from '../command/surface-data.js';\nimport { laneRows, runTone } from '../fleet/live-model.js';\nimport styles from '../command/command.module.css';\n\nconst HOUR = 3_600_000;\n\n/** Fast reads: the switch, the fleet and the inbox move while nobody clicks. */\nexport const COMMAND_FAST_POLL_MS = 10_000;\n/** Slow reads: the Leader, budgets (the collector samples every 30 s). */\nexport const COMMAND_SLOW_POLL_MS = 30_000;\n/** History and learning change daily. */\nexport const COMMAND_HISTORY_POLL_MS = 300_000;\n\n// Seat readings observed since the page opened (module scope: they survive\n// the keep-alive shell unmounting Command; see command-model recordReading).\nlet seatReadings: Record<string, SeatReading[]> = {};\n\nexport function CommandSection() {\n const { compact } = useViewport();\n const authority = useQuery(authorityQuery);\n const fleet = useQuery(fleetLiveQuery);\n // The shell's ONE activity poll (C1) — never a second loop from here.\n const activity = useActivity();\n const leader = useQuery(leaderQuery);\n const learning = useQuery(learningQuery, { freshMs: 60_000 });\n const history = useQuery(fleetHistoryQuery, { freshMs: 60_000 });\n const budget = useQuery(budgetQuery, { freshMs: 15_000 });\n\n const refetch = {\n authority: useRefetch(authorityQuery),\n fleet: useRefetch(fleetLiveQuery),\n leader: useRefetch(leaderQuery),\n learning: useRefetch(learningQuery),\n history: useRefetch(fleetHistoryQuery),\n budget: useRefetch(budgetQuery),\n };\n usePollWhileVisible(() => {\n refetch.authority();\n refetch.fleet();\n }, COMMAND_FAST_POLL_MS);\n usePollWhileVisible(() => {\n refetch.leader();\n refetch.budget();\n }, COMMAND_SLOW_POLL_MS);\n usePollWhileVisible(() => {\n refetch.history();\n refetch.learning();\n }, COMMAND_HISTORY_POLL_MS);\n\n // A 30 s clock is enough for the chip and the swimlane's \"now\"; the\n // countdown rings keep their own 1 s ticker.\n const now = useNow(30_000);\n const actions = useSurfaceActions();\n const lastLooked = useLastLooked();\n\n // The seat roster, for Claude's reset WORDS (the budget route carries only\n // machine reset instants, which Claude never publishes — command-model\n // bindingResetText). Read from the cache WITHOUT fetching: the console\n // loads bootstrap at startup and the chat surfaces keep it live, and a\n // bootstrap read here would cost ~384 ms of server event loop per poll\n // (useSeatsRefresh.ts). No roster → the card says \"reset time not reported\".\n const roster = useSyncExternalStore(\n useCallback((listener: () => void) => subscribeQuery(VERSE_BOOTSTRAP_KEY, listener), []),\n () => getQuerySnapshot<VerseBootstrap>(VERSE_BOOTSTRAP_KEY),\n () => getQuerySnapshot<VerseBootstrap>(VERSE_BOOTSTRAP_KEY),\n );\n const seats = roster.data?.seats ?? null;\n\n const [readings, setReadings] = useState(seatReadings);\n const view = budget.data ?? null;\n useEffect(() => {\n if (!view) return;\n seatReadings = recordReading(seatReadings, view);\n setReadings(seatReadings);\n }, [view]);\n\n const auth = authority.data?.value ?? null;\n const live = fleet.data?.value ?? null;\n const hist = history.data?.value ?? null;\n const darkSince = live?.state === 'dark' ? live.lastActivityAt ?? hist?.darkSince ?? null : hist?.darkSince ?? null;\n\n const kpis = useMemo(\n // `budget` puts each paid seat's window usage (percent, never dollars) in\n // the metered-spend caption (review 3.10 c10).\n () => buildKpis({ fleet: live, history: hist, learning: learning.data?.value ?? null, policy: auth?.policy ?? null, budget: view }),\n [live, hist, learning.data, auth, view],\n );\n const burns = useMemo(() => seatBurns(view, readings, seats), [view, readings, seats]);\n const since = sinceYouLooked({ lastLookedAt: lastLooked, fleet: live, leader: leader.data?.value ?? null, activity: activity.data });\n\n const windowH = compact ? 6 : 12;\n const from = now - windowH * HOUR;\n const lanes = useMemo(() => (live ? laneRows(live.runs, from, now) : []), [live, from, now]);\n const runsStatus: ChartStatus = !fleet.data\n ? { kind: 'loading' }\n : !live\n ? { kind: 'unknown', reason: fleet.data.reason ?? 'the live fleet view did not answer.' }\n : live.state === 'dark' && lanes.length === 0\n ? { kind: 'dark', since: darkSince ?? live.generatedAt, detail: live.stateReason ?? undefined }\n : lanes.length === 0\n ? { kind: 'empty', message: `No runs in the last ${windowH} hours.` }\n : { kind: 'ready' };\n\n const fleetLine = live\n ? live.state === 'dark'\n ? `Fleet dark${darkSince ? ` since ${new Date(darkSince).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}` : ''}.`\n : `Fleet ${live.state}: ${live.summary.building ?? '—'} building, ${live.summary.queued ?? '—'} queued.`\n : 'Fleet status unknown.';\n\n const refreshing = [authority, fleet].some((q) => q.status === 'refreshing');\n\n return (\n <Surface\n title=\"Command\"\n actions={refreshing ? <RefreshIndicator /> : null}\n lead={\n <div className={styles.lead}>\n <AutonomyBar read={authority.data} loading={authority.status === 'loading'} budgetMode={view?.mode ?? null} actions={actions} compact={compact} now={now} />\n <ActionStatus actions={actions} />\n <VerdictLine\n authority={auth}\n building={live?.summary.building ?? null}\n mergedToday={live?.summary.mergedToday ?? null}\n revertsToday={live?.summary.revertsToday ?? null}\n reserve={claudeReserve(view)}\n darkSince={darkSince}\n />\n <SinceStrip lastLookedAt={lastLooked} items={since} />\n </div>\n }\n >\n <Cell span={5}>\n <NeedsYouCard state={activity} actions={actions} fleetLine={fleetLine} />\n </Cell>\n <Cell span={7}>\n <LeaderCard read={leader.data} loading={leader.status === 'loading'} actions={actions} />\n </Cell>\n <Cell span={12}>\n <KpiRow kpis={kpis} />\n </Cell>\n <Cell span={12}>\n <SeatBurnDowns burns={burns} now={now} compact={compact} />\n </Cell>\n <Cell span={12}>\n <Swimlane\n title={`Last ${windowH} hours`}\n description=\"Fleet lanes; bars coloured by status, outlines are queued or parked\"\n status={runsStatus}\n lanes={lanes}\n from={from}\n to={now}\n now={now}\n toneOf={runTone}\n />\n </Cell>\n {actions.dialogs}\n </Surface>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._composer_q25id_5{padding:0 var(--space-6) var(--space-4);background:var(--bg-surface);flex-shrink:0}._box_q25id_10{width:100%;max-width:var(--measure-read);border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--bg-input);transition:border-color var(--duration-fast) var(--ease-standard);margin:0 auto;position:relative}._box_q25id_10:has(>._textarea_q25id_22:focus){border-color:var(--accent-500);box-shadow:0 0 0 1px var(--accent-500)}._boxListening_q25id_29{border-color:var(--status-running-solid)}._textarea_q25id_22{width:100%;min-height:calc(var(--control-h) + var(--space-2));resize:none;max-height:40vh;padding:var(--space-3) var(--space-3) var(--space-1);color:var(--text-primary);font-size:var(--text-base-size);line-height:var(--text-base-line-relaxed);background:0 0;border:0;display:block}._textarea_q25id_22::placeholder{color:var(--text-tertiary)}._textarea_q25id_22:focus-visible{box-shadow:none;outline:none}._textarea_q25id_22:disabled{color:var(--text-secondary);cursor:not-allowed}._row_q25id_48{align-items:center;gap:var(--space-1);padding:var(--space-1) var(--space-2) var(--space-2) var(--space-2);display:flex}._seatField_q25id_56{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}._seatFieldCompact_q25id_57{flex-direction:row;align-items:center;max-width:320px}._fieldLabel_q25id_58{font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);color:var(--text-primary)}._seatSelect_q25id_59{width:100%;min-height:var(--control-h);max-width:100%;padding:0 var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-size:var(--text-sm-size);text-overflow:ellipsis}._seatSelect_q25id_59:hover:not(:disabled){border-color:var(--border-strong)}._seatSelect_q25id_59:disabled{opacity:.6;cursor:not-allowed}._seatFieldCompact_q25id_57 ._seatSelect_q25id_59{min-height:var(--control-h-sm);font-size:var(--text-xs-size);background:0 0;border-color:#0000}._dictationWrap_q25id_80{align-items:center;display:inline-flex;position:relative}._dictation_q25id_80{width:var(--control-h-sm);height:var(--control-h-sm);border-radius:var(--radius-xs);color:var(--text-tertiary);transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);justify-content:center;align-items:center;display:inline-flex;position:relative}._dictation_q25id_80:hover:not(:disabled){background:var(--bg-hover);color:var(--text-primary)}._dictation_q25id_80:active:not(:disabled){background:var(--bg-active)}._dictation_q25id_80:disabled{opacity:.45;cursor:not-allowed}._dictationLive_q25id_95{color:var(--status-running-fg);background:var(--status-running-bg)}._dictationPulse_q25id_96{border-radius:var(--radius-sm);border:1px solid var(--status-running-solid);pointer-events:none;animation:1.4s ease-out infinite _verse-ring_q25id_1;position:absolute;inset:-2px}._dictationError_q25id_110{margin-left:var(--space-2);font-size:var(--text-xs-size);color:var(--status-danger-fg)}._send_q25id_113,._stop_q25id_114{align-items:center;gap:var(--space-2);min-height:var(--control-h-sm);padding:0 var(--space-3);border-radius:var(--radius-sm);font-size:var(--text-xs-size);font-weight:var(--font-weight-medium);transition:background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);border:1px solid #0000;display:inline-flex}._send_q25id_113{background:var(--accent-600);color:var(--accent-contrast)}._send_q25id_113:hover:not(:disabled){background:var(--accent-700)}._send_q25id_113:active:not(:disabled){background:var(--accent-700);border-color:var(--accent-700)}._send_q25id_113:disabled{opacity:.4;cursor:not-allowed}._stop_q25id_114{border-color:var(--border-default);color:var(--text-primary)}._stop_q25id_114:hover{border-color:var(--status-danger-solid);color:var(--status-danger-fg)}._stop_q25id_114:active{background:var(--status-danger-bg)}._stopIcon_q25id_133{background:currentColor;border-radius:1px;width:8px;height:8px}._help_q25id_136{max-width:var(--measure-read);margin:var(--space-2) auto 0;min-height:var(--text-2xs-line);font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);line-height:1.4}._helpQuiet_q25id_144{min-height:0;margin-top:0}._help_q25id_136 kbd{font-family:var(--font-mono);font-size:var(--text-2xs-size,11px);border:1px solid var(--border-subtle);border-radius:var(--radius-xs);color:var(--text-secondary);padding:0 3px}._helpError_q25id_153{color:var(--status-danger-fg)}@keyframes _verse-ring_q25id_1{0%{opacity:.9;transform:scale(.94)}to{opacity:0;transform:scale(1.35)}}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._dictationPulse_q25id_96{animation:none}}:root[data-motion=reduce] ._dictationPulse_q25id_96{animation:none}@media (max-width:900px){._composer_q25id_5{padding:0 var(--space-4) var(--space-3)}}@media (max-width:640px){._row_q25id_48{flex-wrap:wrap}._textarea_q25id_22{font-size:16px}}._cost_q25id_180{max-width:var(--measure-read);margin:var(--space-2) auto 0;padding-left:var(--space-3);border-left:2px solid var(--status-warning-solid);color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed)}._cost_q25id_180[data-tone=danger]{border-left-color:var(--status-danger-solid)}._costFigure_q25id_192{font-family:var(--font-display);font-variant-numeric:tabular-nums;font-weight:var(--font-weight-medium);color:var(--text-primary)}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var e={composer:`_composer_q25id_5`,box:`_box_q25id_10`,textarea:`_textarea_q25id_22`,boxListening:`_boxListening_q25id_29`,row:`_row_q25id_48`,seatField:`_seatField_q25id_56`,seatFieldCompact:`_seatFieldCompact_q25id_57`,fieldLabel:`_fieldLabel_q25id_58`,seatSelect:`_seatSelect_q25id_59`,dictationWrap:`_dictationWrap_q25id_80`,dictation:`_dictation_q25id_80`,dictationLive:`_dictationLive_q25id_95`,dictationPulse:`_dictationPulse_q25id_96`,"verse-ring":`_verse-ring_q25id_1`,dictationError:`_dictationError_q25id_110`,send:`_send_q25id_113`,stop:`_stop_q25id_114`,stopIcon:`_stopIcon_q25id_133`,help:`_help_q25id_136`,helpQuiet:`_helpQuiet_q25id_144`,helpError:`_helpError_q25id_153`,cost:`_cost_q25id_180`,costFigure:`_costFigure_q25id_192`};export{e as t};
|
|
2
|
-
//# sourceMappingURL=Composer.module-DJMdrqNt.js.map
|