@ashlr/hub 3.11.0 → 3.11.3
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 +104 -0
- package/dist/authority-surface.json +12 -7
- package/dist/build-identity.json +2 -2
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +5 -4
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +4 -3
- package/dist/core/universe/campaign.js +9 -1
- package/dist/core/universe/campaign.js.map +1 -1
- package/dist/core/universe/runner.d.ts +3 -0
- package/dist/core/universe/runner.js +7 -3
- package/dist/core/universe/runner.js.map +1 -1
- package/dist/core/verse/compaction-point.d.ts +55 -0
- package/dist/core/verse/compaction-point.js +75 -0
- package/dist/core/verse/compaction-point.js.map +1 -0
- package/dist/core/verse/context-math.d.ts +1 -38
- package/dist/core/verse/context-math.js +5 -59
- package/dist/core/verse/context-math.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-CQvNJvHY.js → ActionMenu-FxXeRbPx.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-CQvNJvHY.js.map → ActionMenu-FxXeRbPx.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-D_eS4472.js +2 -0
- package/dist/core/web/public/next/assets/{Advanced-DEM93sKI.js.map → Advanced-D_eS4472.js.map} +1 -1
- package/dist/core/web/public/next/assets/App-Cj4zKbG3.js +7 -0
- package/dist/core/web/public/next/assets/{App-CimXmK0L.js.map → App-Cj4zKbG3.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js +2 -0
- package/dist/core/web/public/next/assets/{AppsSection-D6U-dSj6.js.map → AppsSection-Ddu_RCQE.js.map} +1 -1
- package/dist/core/web/public/next/assets/{AreaTrend-LD9lCPkT.js → AreaTrend-CDxrQU4b.js} +2 -2
- package/dist/core/web/public/next/assets/{AreaTrend-LD9lCPkT.js.map → AreaTrend-CDxrQU4b.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-DuQkHGD_.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-3V9pUyxm.js.map → AutonomySection-DuQkHGD_.js.map} +1 -1
- package/dist/core/web/public/next/assets/BranchBar-CLsvOcyK.js +2 -0
- package/dist/core/web/public/next/assets/{BranchBar-U8UdpfEB.js.map → BranchBar-CLsvOcyK.js.map} +1 -1
- package/dist/core/web/public/next/assets/{BudgetControl-DOTlMSmW.js → BudgetControl-TL3FeZ1D.js} +2 -2
- package/dist/core/web/public/next/assets/{BudgetControl-DOTlMSmW.js.map → BudgetControl-TL3FeZ1D.js.map} +1 -1
- package/dist/core/web/public/next/assets/{BurnDown-x4PWH9JF.js → BurnDown-sFXkUGdB.js} +2 -2
- package/dist/core/web/public/next/assets/{BurnDown-x4PWH9JF.js.map → BurnDown-sFXkUGdB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Button-DYv_KKxr.js → Button-HHXgoXGr.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-DYv_KKxr.js.map → Button-HHXgoXGr.js.map} +1 -1
- package/dist/core/web/public/next/assets/CapacityStrip-qReu0RaF.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-qReu0RaF.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js.map +1 -0
- package/dist/core/web/public/next/assets/{CloudBudgetForm-DJeJvBEu.js → CloudBudgetForm-DJbiT1wi.js} +2 -2
- package/dist/core/web/public/next/assets/{CloudBudgetForm-DJeJvBEu.js.map → CloudBudgetForm-DJbiT1wi.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js +2 -0
- package/dist/core/web/public/next/assets/{CommandPalette-FiD4N8XD.js.map → CommandPalette-zYLFZRnj.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js +2 -0
- package/dist/core/web/public/next/assets/{CommandSection-DN8KwH-X.js.map → CommandSection-rIeMK5Ch.js.map} +1 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-DLrLKM0c.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-DLrLKM0c.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-Dx15x0Ho.css +1 -0
- package/dist/core/web/public/next/assets/Dialog-BS9Dxi3G.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-BS9Dxi3G.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-tQ8kFulD.css +1 -0
- package/dist/core/web/public/next/assets/{DiffPane-DLJ3gGGK.js → DiffPane-TOmUf3b2.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffPane-DLJ3gGGK.js.map → DiffPane-TOmUf3b2.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-B7NWPjIO.js → DiffViewer-BpH56302.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-B7NWPjIO.js.map → DiffViewer-BpH56302.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js +2 -0
- package/dist/core/web/public/next/assets/{DockHost-DvR-hPhZ.js.map → DockHost-DzkzR-HD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EmptyState-DhNgDDrF.js → EmptyState-BqR5YAmf.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DhNgDDrF.js.map → EmptyState-BqR5YAmf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-uARPnx9x.js → Epistemic-dhvDTwAZ.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-uARPnx9x.js.map → Epistemic-dhvDTwAZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js +3 -0
- package/dist/core/web/public/next/assets/{FleetSection-D_zRBCub.js.map → FleetSection-ViAb549H.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Funnel-CL8uHONq.js → Funnel-D2u7Wlzc.js} +2 -2
- package/dist/core/web/public/next/assets/{Funnel-CL8uHONq.js.map → Funnel-D2u7Wlzc.js.map} +1 -1
- package/dist/core/web/public/next/assets/GearTray-Cb2npoxM.js +2 -0
- package/dist/core/web/public/next/assets/{GearTray-C7k4l_BW.js.map → GearTray-Cb2npoxM.js.map} +1 -1
- package/dist/core/web/public/next/assets/{GrowthSection-DwdNSGj8.js → GrowthSection-C5aDPs8B.js} +2 -2
- package/dist/core/web/public/next/assets/{GrowthSection-DwdNSGj8.js.map → GrowthSection-C5aDPs8B.js.map} +1 -1
- package/dist/core/web/public/next/assets/HandoffDialog-BF3AYg-X.js +2 -0
- package/dist/core/web/public/next/assets/{HandoffDialog-FPVOqOMN.js.map → HandoffDialog-BF3AYg-X.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Input-B9-VLcHS.js → Input-B5dmGLZx.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-B9-VLcHS.js.map → Input-B5dmGLZx.js.map} +1 -1
- package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js +2 -0
- package/dist/core/web/public/next/assets/{LeaderCard-4R0BhDzT.js.map → LeaderCard-DZrmjDbI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MatrixHeatmap-DiuushcS.js → MatrixHeatmap-BgEUs2Eu.js} +2 -2
- package/dist/core/web/public/next/assets/{MatrixHeatmap-DiuushcS.js.map → MatrixHeatmap-BgEUs2Eu.js.map} +1 -1
- package/dist/core/web/public/next/assets/McpSection-DZkiOuoq.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-CJ__OJKl.js.map → McpSection-DZkiOuoq.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdown-qWKyJvAQ.js → MessageMarkdown-BauY8ZTY.js} +3 -3
- package/dist/core/web/public/next/assets/{MessageMarkdown-qWKyJvAQ.js.map → MessageMarkdown-BauY8ZTY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-x05TrsrW.js → MessageMarkdownRenderer-DLBNLfsn.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-x05TrsrW.js.map → MessageMarkdownRenderer-DLBNLfsn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-D-hncpkO.js → Meter-DNeocJnD.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-D-hncpkO.js.map → Meter-DNeocJnD.js.map} +1 -1
- package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js +2 -0
- package/dist/core/web/public/next/assets/{MindSection-BjXHkQPS.js.map → MindSection-BvJXFjyX.js.map} +1 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-CrfJ0PdD.css +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-mxrw0Yvy.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-mxrw0Yvy.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-CO-Balfp.js +2 -0
- package/dist/core/web/public/next/assets/{NeedsYouDrawer-rSd1ZHAR.js.map → NeedsYouDrawer-CO-Balfp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{NeedsYouList-CG-nB1tr.js → NeedsYouList-CzDZbzRD.js} +2 -2
- package/dist/core/web/public/next/assets/{NeedsYouList-CG-nB1tr.js.map → NeedsYouList-CzDZbzRD.js.map} +1 -1
- package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js +3 -0
- package/dist/core/web/public/next/assets/{NewChatDialog-BeDQ1eW3.js.map → NewChatDialog-B8eJjlFf.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js +2 -0
- package/dist/core/web/public/next/assets/{OnboardingFlow-CkTZtt-m.js.map → OnboardingFlow-Cij6KWat.js.map} +1 -1
- package/dist/core/web/public/next/assets/PreviewPane-BS-CleCd.js +2 -0
- package/dist/core/web/public/next/assets/{PreviewPane-kzbbSK4u.js.map → PreviewPane-BS-CleCd.js.map} +1 -1
- package/dist/core/web/public/next/assets/ProviderLogo-C5mBg8i0.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-C5mBg8i0.js.map +1 -0
- package/dist/core/web/public/next/assets/{RailStatus-D-t2gPae.js → RailStatus-cPRyOmrk.js} +2 -2
- package/dist/core/web/public/next/assets/{RailStatus-D-t2gPae.js.map → RailStatus-cPRyOmrk.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-BLnr9IOM.js → RefreshIndicator-CMwSCiz5.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-BLnr9IOM.js.map → RefreshIndicator-CMwSCiz5.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BeG0gBif.js → ResourcePoolConsoleApp-BFi1opsC.js} +5 -5
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BeG0gBif.js.map → ResourcePoolConsoleApp-BFi1opsC.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CM_8pJs6.css → ResourcePoolConsoleApp-BX9JLkT4.css} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-uZEqC2EM.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js +2 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DYtwc2ja.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DYtwc2ja.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DdxhTdZ6.css +1 -0
- package/dist/core/web/public/next/assets/{RunInCloudAction-C3LBp7C4.js → RunInCloudAction-BEGEEM8O.js} +2 -2
- package/dist/core/web/public/next/assets/{RunInCloudAction-C3LBp7C4.js.map → RunInCloudAction-BEGEEM8O.js.map} +1 -1
- package/dist/core/web/public/next/assets/SeatSelector-CYHRR7Wp.js +3 -0
- package/dist/core/web/public/next/assets/{SeatSelector-DpvvbjNm.js.map → SeatSelector-CYHRR7Wp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-BL40udoO.js → Segmented-BE53BenI.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-BL40udoO.js.map → Segmented-BE53BenI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-FWLnAw_j.js → Select-BwSGkHCS.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-FWLnAw_j.js.map → Select-BwSGkHCS.js.map} +1 -1
- package/dist/core/web/public/next/assets/SessionGate-DvMpXNpJ.css +1 -0
- package/dist/core/web/public/next/assets/SessionGate-e0dFJm9d.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-e0dFJm9d.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-CxlSyueJ.js +2 -0
- package/dist/core/web/public/next/assets/{SessionInsightChip-CWye87Ju.js.map → SessionInsightChip-CxlSyueJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionSearch-YvCHFUuN.js → SessionSearch-_yp7S2TP.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionSearch-YvCHFUuN.js.map → SessionSearch-_yp7S2TP.js.map} +1 -1
- package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-DVP2Mgy6.js +2 -0
- package/dist/core/web/public/next/assets/{Sheet-DZKcQXQg.js.map → Sheet-DVP2Mgy6.js.map} +1 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-BcIcoClX.js +2 -0
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-BpDimdPq.js.map → ShortcutsOverlay-BcIcoClX.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js +3 -0
- package/dist/core/web/public/next/assets/{Sidebar-BoBzBEFX.js.map → Sidebar-DjQOqPbm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Slider-DUMo9HDD.js → Slider-BypUWjpH.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-DUMo9HDD.js.map → Slider-BypUWjpH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StatusBadge-BwnBNFQr.js → StatusBadge-HCZp416_.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-BwnBNFQr.js.map → StatusBadge-HCZp416_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StepBand-PDXMIlRk.js → StepBand-Duz1PUes.js} +2 -2
- package/dist/core/web/public/next/assets/{StepBand-PDXMIlRk.js.map → StepBand-Duz1PUes.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Surface-B3TZVoER.js → Surface-B75lVfzm.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-B3TZVoER.js.map → Surface-B75lVfzm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Swimlane-DR4OgON_.js → Swimlane-DGcIcnNA.js} +2 -2
- package/dist/core/web/public/next/assets/{Swimlane-DR4OgON_.js.map → Swimlane-DGcIcnNA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Switch-CcR5Llk5.js → Switch-iveI-8NY.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-CcR5Llk5.js.map → Switch-iveI-8NY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-_-K1h7Hk.js → Tag-DH15CUJp.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-_-K1h7Hk.js.map → Tag-DH15CUJp.js.map} +1 -1
- package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js +7 -0
- package/dist/core/web/public/next/assets/{TerminalPane-_1aH4ndN.js.map → TerminalPane-MQT-veKZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-C8yQ0AaR.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-BUsq-inZ.js.map → UniverseConsoleApp-C8yQ0AaR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-Dh7A-hLD.css → UniverseConsoleApp-DfuT-wFw.css} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-Dogy_dsB.js → UniverseView-_nPURPqe.js} +4 -4
- package/dist/core/web/public/next/assets/{UniverseView-Dogy_dsB.js.map → UniverseView-_nPURPqe.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js +2 -0
- package/dist/core/web/public/next/assets/{UsageSection-DiX_dTyo.js.map → UsageSection-CqxRGJ40.js.map} +1 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js +10 -0
- package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-Dwri2jFJ.css +1 -0
- package/dist/core/web/public/next/assets/actions-tWevL9HV.js +2 -0
- package/dist/core/web/public/next/assets/{actions-s2lfm_5k.js.map → actions-tWevL9HV.js.map} +1 -1
- package/dist/core/web/public/next/assets/budget-queries-V3wcJVK_.js +2 -0
- package/dist/core/web/public/next/assets/{budget-queries-wUshcovN.js.map → budget-queries-V3wcJVK_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{capacity-strip-model-Bj_9ztzs.js → capacity-strip-model-BDbmQ3e3.js} +2 -2
- package/dist/core/web/public/next/assets/{capacity-strip-model-Bj_9ztzs.js.map → capacity-strip-model-BDbmQ3e3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{charts-CMSgAUKn.js → charts-CfAjuKMv.js} +2 -2
- package/dist/core/web/public/next/assets/{charts-CMSgAUKn.js.map → charts-CfAjuKMv.js.map} +1 -1
- package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js +2 -0
- package/dist/core/web/public/next/assets/{cloud-queries-CnV1yaNG.js.map → cloud-queries-Br_r0UAz.js.map} +1 -1
- package/dist/core/web/public/next/assets/{cloud.module-CiwatLj3.js → cloud.module-ascz58c3.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud.module-CiwatLj3.js.map → cloud.module-ascz58c3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{command-bus-DqimKCUY.js → command-bus-xYZoK9nQ.js} +2 -2
- package/dist/core/web/public/next/assets/{command-bus-DqimKCUY.js.map → command-bus-xYZoK9nQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js.map +1 -0
- package/dist/core/web/public/next/assets/compaction-point-VL9oegWS.js +2 -0
- package/dist/core/web/public/next/assets/compaction-point-VL9oegWS.js.map +1 -0
- package/dist/core/web/public/next/assets/{composer-keys-DBRymxQn.js → composer-keys-su0g1h9o.js} +2 -2
- package/dist/core/web/public/next/assets/{composer-keys-DBRymxQn.js.map → composer-keys-su0g1h9o.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js +2 -0
- package/dist/core/web/public/next/assets/{context-model-Dwd49-dp.js.map → context-model-BC-HOmPo.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-model-CIBmSugV.js +2 -0
- package/dist/core/web/public/next/assets/{context-model-MT17V86_.js.map → context-model-CIBmSugV.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-queries-CrPcHWTz.js +2 -0
- package/dist/core/web/public/next/assets/{context-queries-xVKIeynP.js.map → context-queries-CrPcHWTz.js.map} +1 -1
- package/dist/core/web/public/next/assets/control-queries-CmgBgKV7.js +2 -0
- package/dist/core/web/public/next/assets/{control-queries-DOZR-D8G.js.map → control-queries-CmgBgKV7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{dock-icons-8EtARwUm.js → dock-icons-CUh8dOxJ.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-icons-8EtARwUm.js.map → dock-icons-CUh8dOxJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{dock-store-BA1cHOYA.js → dock-store-B2vlxqPu.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-store-BA1cHOYA.js.map → dock-store-B2vlxqPu.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-model-CNe8Wh-s.js → fleet-model-7i-FbzKI.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-model-CNe8Wh-s.js.map → fleet-model-7i-FbzKI.js.map} +1 -1
- package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js +2 -0
- package/dist/core/web/public/next/assets/{fleet-queries-BSdRlUwJ.js.map → fleet-queries-DzGoqq8X.js.map} +1 -1
- package/dist/core/web/public/next/assets/focus-trap-HtcoXeEq.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-HtcoXeEq.js.map +1 -0
- package/dist/core/web/public/next/assets/{format-B8DAVcn2.js → format-BkWdOQDL.js} +2 -2
- package/dist/core/web/public/next/assets/{format-B8DAVcn2.js.map → format-BkWdOQDL.js.map} +1 -1
- package/dist/core/web/public/next/assets/git-model-bk_RXh3y.js +5 -0
- package/dist/core/web/public/next/assets/{git-model-CivuBY_D.js.map → git-model-bk_RXh3y.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-BlI2BYa1.css +1 -0
- package/dist/core/web/public/next/assets/global-oEl9Qj8u.js +2 -0
- package/dist/core/web/public/next/assets/global-oEl9Qj8u.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-LHLXmXIk.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-LHLXmXIk.js.map +1 -0
- package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js +2 -0
- package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-DEQa2rTx.js +2 -0
- package/dist/core/web/public/next/assets/icons-DEQa2rTx.js.map +1 -0
- package/dist/core/web/public/next/assets/{index-oAAq8XJa.js → index-BVxOlseC.js} +3 -3
- package/dist/core/web/public/next/assets/{index-oAAq8XJa.js.map → index-BVxOlseC.js.map} +1 -1
- package/dist/core/web/public/next/assets/{live-model-DCw_IFRI.js → live-model-bmsJgnYD.js} +2 -2
- package/dist/core/web/public/next/assets/{live-model-DCw_IFRI.js.map → live-model-bmsJgnYD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{mind.module-vnuJcwvD.js → mind.module-gTGAuJt1.js} +2 -2
- package/dist/core/web/public/next/assets/{mind.module-vnuJcwvD.js.map → mind.module-gTGAuJt1.js.map} +1 -1
- package/dist/core/web/public/next/assets/mutations-C5S7okTW.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-Dpsql5t7.js.map → mutations-C5S7okTW.js.map} +1 -1
- package/dist/core/web/public/next/assets/nav-NVtnuG7A.js +2 -0
- package/dist/core/web/public/next/assets/nav-NVtnuG7A.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-DGm3qL1b.js +2 -0
- package/dist/core/web/public/next/assets/{overnight-queries-X-44Gsw5.js.map → overnight-queries-DGm3qL1b.js.map} +1 -1
- package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-DyCKYSBG.js +1 -0
- package/dist/core/web/public/next/assets/{queries-BA4rNGD-.js → queries-CYisSAAB.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-BA4rNGD-.js.map → queries-CYisSAAB.js.map} +1 -1
- package/dist/core/web/public/next/assets/reasoning-pref-BUcFF_5G.js +2 -0
- package/dist/core/web/public/next/assets/{reasoning-pref-B9-DJUXP.js.map → reasoning-pref-BUcFF_5G.js.map} +1 -1
- package/dist/core/web/public/next/assets/reveal-anchor-D-tV8xau.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-D-tV8xau.js.map +1 -0
- package/dist/core/web/public/next/assets/seat-subscription-B-f9ViU2.js +2 -0
- package/dist/core/web/public/next/assets/{seat-subscription-CH6fW4fJ.js.map → seat-subscription-B-f9ViU2.js.map} +1 -1
- package/dist/core/web/public/next/assets/{section-visibility-qFqc_d4Z.js → section-visibility-Yctxu-if.js} +2 -2
- package/dist/core/web/public/next/assets/{section-visibility-qFqc_d4Z.js.map → section-visibility-Yctxu-if.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-M1GaQU5l.js → sidebar-model-DQ-FyBHW.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-M1GaQU5l.js.map → sidebar-model-DQ-FyBHW.js.map} +1 -1
- package/dist/core/web/public/next/assets/slots-BhP8b8tf.js +3 -0
- package/dist/core/web/public/next/assets/{slots-Ds9ZIqUL.js.map → slots-BhP8b8tf.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js +2 -0
- package/dist/core/web/public/next/assets/{surface-data-J52iIGMD.js.map → surface-data-DTI7LjvH.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js +2 -0
- package/dist/core/web/public/next/assets/{surface-prefetch-CgZ-LEJK.js.map → surface-prefetch-CdUEBFrl.js.map} +1 -1
- package/dist/core/web/public/next/assets/{tasks-model-ent8f0jZ.js → tasks-model-BKDNqmmt.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-ent8f0jZ.js.map → tasks-model-BKDNqmmt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-DJTK7QpR.js → terminal-icons-D2xe-aM1.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-DJTK7QpR.js.map → terminal-icons-D2xe-aM1.js.map} +1 -1
- package/dist/core/web/public/next/assets/{usage-queries-Bn8ccqyN.js → usage-queries-BZuAANlI.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-Bn8ccqyN.js.map → usage-queries-BZuAANlI.js.map} +1 -1
- package/dist/core/web/public/next/assets/use-guarded-action-Cf4MeNBa.js +2 -0
- package/dist/core/web/public/next/assets/{use-guarded-action-C2HlSzkz.js.map → use-guarded-action-Cf4MeNBa.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-BNc1H4ZC.js → use-ticker-D9yi49my.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-BNc1H4ZC.js.map → use-ticker-D9yi49my.js.map} +1 -1
- package/dist/core/web/public/next/assets/use-token-gate-DqrSXdX6.js +2 -0
- package/dist/core/web/public/next/assets/{use-token-gate-B3IJL6bf.js.map → use-token-gate-DqrSXdX6.js.map} +1 -1
- package/dist/core/web/public/next/assets/useChartWidth-BW6SwYIK.css +1 -0
- package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js +2 -0
- package/dist/core/web/public/next/assets/{useChartWidth-lZ9PrQn0.js.map → useChartWidth-owwodNVz.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useSeatsRefresh-CG4jczeL.js → useSeatsRefresh-DgFy-Ph4.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-CG4jczeL.js.map → useSeatsRefresh-DgFy-Ph4.js.map} +1 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-CDYrrWOO.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-CDYrrWOO.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js +3 -0
- package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js +3 -0
- package/dist/core/web/public/next/assets/{verse-ui-store-zafyzXKD.js.map → verse-ui-store-62DxpVHS.js.map} +1 -1
- package/dist/core/web/public/next/assets/{viewport-BEqGUoTA.js → viewport-nTubFCwf.js} +2 -2
- package/dist/core/web/public/next/assets/{viewport-BEqGUoTA.js.map → viewport-nTubFCwf.js.map} +1 -1
- package/dist/core/web/public/next/assets/warmup-HG5vYbsN.js +3 -0
- package/dist/core/web/public/next/assets/{warmup-BR6pxAKs.js.map → warmup-HG5vYbsN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{workspace-model-D_tWD5Wt.js → workspace-model-CbhdPhei.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-D_tWD5Wt.js.map → workspace-model-CbhdPhei.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 +5 -2
- package/dist/cli/activation.d.ts +0 -41
- package/dist/cli/activation.js +0 -485
- package/dist/cli/activation.js.map +0 -1
- package/dist/core/fleet/generated-repair-resolution.d.ts +0 -36
- package/dist/core/fleet/generated-repair-resolution.js +0 -245
- package/dist/core/fleet/generated-repair-resolution.js.map +0 -1
- package/dist/core/local-runtime/llama/port.d.ts +0 -17
- package/dist/core/local-runtime/llama/port.js +0 -47
- package/dist/core/local-runtime/llama/port.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-host.d.ts +0 -54
- package/dist/core/local-runtime/llama/proxy-host.js +0 -159
- package/dist/core/local-runtime/llama/proxy-host.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-process.d.ts +0 -148
- package/dist/core/local-runtime/llama/proxy-process.js +0 -250
- package/dist/core/local-runtime/llama/proxy-process.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-record.d.ts +0 -40
- package/dist/core/local-runtime/llama/proxy-record.js +0 -133
- package/dist/core/local-runtime/llama/proxy-record.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-supervisor.d.ts +0 -118
- package/dist/core/local-runtime/llama/proxy-supervisor.js +0 -511
- package/dist/core/local-runtime/llama/proxy-supervisor.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-DEM93sKI.js +0 -2
- package/dist/core/web/public/next/assets/App-CimXmK0L.js +0 -7
- package/dist/core/web/public/next/assets/AppsSection-D6U-dSj6.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-3V9pUyxm.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-U8UdpfEB.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-C667yQe8.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-C667yQe8.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-CCcIPpOq.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-CCcIPpOq.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-FiD4N8XD.js +0 -2
- package/dist/core/web/public/next/assets/CommandSection-DN8KwH-X.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-DvR-hPhZ.js +0 -2
- package/dist/core/web/public/next/assets/FleetSection-D_zRBCub.js +0 -3
- package/dist/core/web/public/next/assets/GearTray-C7k4l_BW.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-FPVOqOMN.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-4R0BhDzT.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-CJ__OJKl.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-BjXHkQPS.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Cum_DqQZ.css +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-SkRxqV_I.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-SkRxqV_I.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-rSd1ZHAR.js +0 -2
- package/dist/core/web/public/next/assets/NewChatDialog-BeDQ1eW3.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-CkTZtt-m.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-kzbbSK4u.js +0 -2
- package/dist/core/web/public/next/assets/ResourcesChrome-B3Z3O98t.css +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-BzV6bkIa.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-BzV6bkIa.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-o4ILHdep.js +0 -2
- package/dist/core/web/public/next/assets/ResourcesDrawer-o4ILHdep.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-6RMd_aZg.css +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-C5SxA2Dg.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-C5SxA2Dg.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-DpvvbjNm.js +0 -3
- package/dist/core/web/public/next/assets/SessionInsightChip-CWye87Ju.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-Dr18upeE.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-Dr18upeE.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-DZKcQXQg.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-BpDimdPq.js +0 -2
- package/dist/core/web/public/next/assets/Sidebar-BoBzBEFX.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-_1aH4ndN.js +0 -7
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BUsq-inZ.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-DiX_dTyo.js +0 -2
- package/dist/core/web/public/next/assets/VerseConsoleApp-WVeyJnW7.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-WVeyJnW7.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +0 -1
- package/dist/core/web/public/next/assets/Workspace-BbxZHwQd.js +0 -10
- package/dist/core/web/public/next/assets/Workspace-BbxZHwQd.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-s2lfm_5k.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-wUshcovN.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-CnV1yaNG.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-BdtDH93o.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-BdtDH93o.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-Dwd49-dp.js +0 -2
- package/dist/core/web/public/next/assets/context-model-MT17V86_.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-xVKIeynP.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-DOZR-D8G.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-UKS-mXhr.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-UKS-mXhr.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-BSdRlUwJ.js +0 -2
- package/dist/core/web/public/next/assets/git-model-CivuBY_D.js +0 -5
- package/dist/core/web/public/next/assets/global-Di2PUgj4.js +0 -2
- package/dist/core/web/public/next/assets/global-Di2PUgj4.js.map +0 -1
- package/dist/core/web/public/next/assets/global-_tOCFt9y.css +0 -1
- package/dist/core/web/public/next/assets/guarded-action-CvOHcqyH.js +0 -2
- package/dist/core/web/public/next/assets/guarded-action-CvOHcqyH.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-B_yuAgdN.js +0 -2
- package/dist/core/web/public/next/assets/icons-B_yuAgdN.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-Dpsql5t7.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-X-44Gsw5.js +0 -2
- package/dist/core/web/public/next/assets/primitives-BDIcUvob.js +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-B9-DJUXP.js +0 -2
- package/dist/core/web/public/next/assets/seat-subscription-CH6fW4fJ.js +0 -2
- package/dist/core/web/public/next/assets/slots-Ds9ZIqUL.js +0 -3
- package/dist/core/web/public/next/assets/surface-data-J52iIGMD.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-CgZ-LEJK.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-C2HlSzkz.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-B3IJL6bf.js +0 -2
- package/dist/core/web/public/next/assets/useActivity-Bk3XgXjL.js +0 -2
- package/dist/core/web/public/next/assets/useActivity-Bk3XgXjL.js.map +0 -1
- package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +0 -1
- package/dist/core/web/public/next/assets/useChartWidth-lZ9PrQn0.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-D7NZQFAR.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-D7NZQFAR.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-queries-DvIJcn6Z.js +0 -2
- package/dist/core/web/public/next/assets/verse-queries-DvIJcn6Z.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-store-DjBWj04q.js +0 -3
- package/dist/core/web/public/next/assets/verse-store-DjBWj04q.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-ui-store-zafyzXKD.js +0 -3
- package/dist/core/web/public/next/assets/warmup-BR6pxAKs.js +0 -3
package/dist/core/web/public/next/assets/{EmptyState-DhNgDDrF.js.map → EmptyState-BqR5YAmf.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState-
|
|
1
|
+
{"version":3,"file":"EmptyState-BqR5YAmf.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/EmptyState.module.css","../../../../../../src/web-ui/components/primitives/EmptyState.tsx"],"sourcesContent":["/**\n * The designed dead-end. DESIGN-V2 §1.2 allows no cards and no nested boxes,\n * and §5 asks an empty state to read as \"a single quiet line, one action\" —\n * so this is NOT a dashed box on a filled ground. It was one, which meant\n * every empty panel grew a second border inside the panel's own hairline and\n * announced the absence of data louder than the data would have been.\n *\n * What carries it instead: a 2px left rule (the same device the transcript\n * uses for a user turn, a blockquote and a failed tool call), left-aligned\n * text on the surface it already sits on, and one action. Tone moves the rule\n * and the glyph only — never a fill, never a border box.\n */\n.empty {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-6) 0 var(--space-6) var(--space-4);\n border-left: 2px solid var(--border-strong);\n text-align: left;\n}\n\n.compact {\n padding: var(--space-4) 0 var(--space-4) var(--space-3);\n gap: var(--space-1);\n}\n\n.icon {\n display: inline-flex;\n color: var(--text-tertiary);\n}\n\n.title {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-medium);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.body {\n max-width: 52ch;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n.action {\n margin-top: var(--space-1);\n}\n\n/* Tone is carried by the rule and the glyph. The text stays neutral so the\n state never reads as a filled alert banner (§1.1: one accent per screen,\n colour only where it carries meaning). */\n.error {\n border-left-color: var(--status-danger-solid);\n}\n.error .icon {\n color: var(--status-danger-fg);\n}\n\n.unauthorized {\n border-left-color: var(--status-warning-solid);\n}\n.unauthorized .icon {\n color: var(--status-warning-fg);\n}\n","/**\n * components/primitives/EmptyState.tsx — the designed state for \"there is\n * genuinely nothing here\" (design doc §1.6: honest states).\n *\n * It takes a TITLE and a BODY because an empty surface has to say what it\n * means — \"No enrolled repositories\" is a fact, \"the daemon will do nothing\n * until you enroll one\" is the consequence the operator needs. `tone=\"error\"`\n * and `tone=\"unauthorized\"` cover the other two dead ends so no view has to\n * invent its own.\n */\nimport type { ReactNode } from 'react';\nimport styles from './EmptyState.module.css';\n\nexport interface EmptyStateProps {\n title: ReactNode;\n /** What it means / what to do about it. */\n body?: ReactNode;\n /** 16px glyph from ./icons.tsx. */\n icon?: ReactNode;\n /** A single action — usually the thing that resolves the emptiness. */\n action?: ReactNode;\n tone?: 'neutral' | 'error' | 'unauthorized';\n /** Tighter padding for a panel rather than a whole view. */\n compact?: boolean;\n className?: string;\n}\n\nexport function EmptyState({\n title,\n body,\n icon,\n action,\n tone = 'neutral',\n compact = false,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={`${styles.empty} ${styles[tone]} ${compact ? styles.compact : ''} ${className ?? ''}`}\n role={tone === 'error' ? 'alert' : undefined}\n >\n {icon ? <span className={styles.icon}>{icon}</span> : null}\n <p className={styles.title}>{title}</p>\n {body ? <p className={styles.body}>{body}</p> : null}\n {action ? <div className={styles.action}>{action}</div> : null}\n </div>\n );\n}\n"],"mappings":"sQC2BA,SAAgB,EAAW,CACzB,QACA,OACA,OACA,SACA,OAAO,UACP,UAAU,GACV,aACkB,CAClB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,GAAM,GAAG,EAAU,EAAO,QAAU,GAAG,GAAG,GAAa,KAC5F,KAAM,IAAS,QAAU,QAAU,IAAA,GAFrC,SAAA,CAIG,GAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAO,SAAA,CAAW,CAAA,EAAI,MACtD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAQ,SAAA,CAAS,CAAA,EACrC,GAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAO,SAAA,CAAQ,CAAA,EAAI,KAC/C,GAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAS,SAAA,CAAY,CAAA,EAAI,IACvD,GAET"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=Epistemic-
|
|
1
|
+
import{n as e}from"./index-BVxOlseC.js";var t={unknown:`_unknown_4gf0c_1`,dot:`_dot_4gf0c_11`,badge:`_badge_4gf0c_19`},n=e();function r(e){return!e||e.sourceState===`healthy`&&e.complete!==!1}function i({quality:e,children:i,renderControl:a,label:o}){if(r(e))return(0,n.jsxs)(n.Fragment,{children:[i,a?.()]});let s=e?.reason;return(0,n.jsxs)(`span`,{className:t.unknown,title:s?`Unavailable: ${s}`:`Source data unavailable`,children:[(0,n.jsx)(`span`,{className:t.dot,"aria-hidden":`true`}),`unknown`,o?(0,n.jsxs)(`span`,{className:`visually-hidden`,children:[` (`,o,`)`]}):null]})}function a({quality:e,label:i}){return r(e)?null:(0,n.jsxs)(`span`,{className:t.badge,title:e?.reason??`Source data unavailable`,children:[i?`${i}: `:``,`unknown`]})}export{a as n,r,i as t};
|
|
2
|
+
//# sourceMappingURL=Epistemic-dhvDTwAZ.js.map
|
package/dist/core/web/public/next/assets/{Epistemic-uARPnx9x.js.map → Epistemic-dhvDTwAZ.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Epistemic-
|
|
1
|
+
{"version":3,"file":"Epistemic-dhvDTwAZ.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Epistemic.module.css","../../../../../../src/web-ui/components/primitives/Epistemic.tsx"],"sourcesContent":[".unknown {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n color: var(--status-unknown-fg);\n font-size: var(--text-sm-size);\n font-style: italic;\n cursor: help;\n}\n\n.dot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-unknown-solid);\n flex-shrink: 0;\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n padding: 1px var(--space-2);\n border-radius: var(--radius-xs);\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-size: var(--text-xs-size);\n font-style: italic;\n cursor: help;\n}\n","/**\n * components/primitives/Epistemic.tsx — the one thing the old UI got right,\n * promoted to a first-class primitive (foundation brief, item 7).\n *\n * When a piece of data's `sourceQuality.sourceState` is 'degraded' or\n * 'unknown'/'missing', this component displays \"unknown\" (never a stale or\n * guessed value dressed up as current) AND withholds any control built on\n * top of it (`renderControl` simply never runs). Every future view should\n * wrap sourceQuality-bearing fields in this rather than reinventing the\n * check — that is the whole point of making it a primitive instead of a\n * convention someone has to remember.\n *\n * Reference (old, correct behavior this replaces): app.js:311-314, :336-347.\n */\nimport type { ReactNode } from 'react';\nimport type { SourceQuality } from '../../data/api-types.js';\nimport styles from './Epistemic.module.css';\n\nexport function isKnown(quality: SourceQuality | undefined): boolean {\n if (!quality) return true; // absent quality metadata => field predates the pattern; trust it.\n return quality.sourceState === 'healthy' && quality.complete !== false;\n}\n\nexport interface EpistemicProps {\n quality: SourceQuality | undefined;\n /** Rendered when the value is known-good. */\n children: ReactNode;\n /**\n * A control (button, toggle, link) whose action depends on this data\n * being trustworthy — e.g. \"restart daemon\" next to daemon.running.\n * Omitted entirely (not disabled — omitted) when the source is degraded,\n * so an operator never sees an actionable-looking control wired to a\n * guess.\n */\n renderControl?: () => ReactNode;\n /** Optional label used in the \"unknown\" state, e.g. \"daemon status\". */\n label?: string;\n}\n\nexport function Epistemic({ quality, children, renderControl, label }: EpistemicProps): ReactNode {\n if (isKnown(quality)) {\n return (\n <>\n {children}\n {renderControl?.()}\n </>\n );\n }\n\n const reason = quality?.reason;\n return (\n <span className={styles.unknown} title={reason ? `Unavailable: ${reason}` : 'Source data unavailable'}>\n <span className={styles.dot} aria-hidden=\"true\" />\n unknown\n {label ? <span className=\"visually-hidden\"> ({label})</span> : null}\n </span>\n );\n}\n\n/** Small inline badge form, for table cells / dense rows. */\nexport function EpistemicBadge({ quality, label }: { quality: SourceQuality | undefined; label?: string }): ReactNode {\n if (isKnown(quality)) return null;\n return (\n <span className={styles.badge} title={quality?.reason ?? 'Source data unavailable'}>\n {label ? `${label}: ` : ''}unknown\n </span>\n );\n}\n"],"mappings":"6HCkBA,SAAgB,EAAQ,EAA6C,CAEnE,MADA,CAAK,GACE,EAAQ,cAAgB,WAAa,EAAQ,WAAa,EACnE,CAkBA,SAAgB,EAAU,CAAE,UAAS,WAAU,gBAAe,SAAoC,CAChG,GAAI,EAAQ,CAAO,EACjB,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,EACA,IAAgB,CACjB,CAAA,CAAA,EAIN,IAAM,EAAS,GAAS,OACxB,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,MAAO,EAAS,gBAAgB,IAAW,0BAA5E,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,cAAY,MAAQ,CAAA,EAAC,UAEjD,GAAQ,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,kBAAhB,SAAA,CAAkC,KAAG,EAAM,GAAO,CAAI,CAAA,EAAA,IAC3D,GAEV,CAGA,SAAgB,EAAe,CAAE,UAAS,SAA4E,CAEpH,OADI,EAAQ,CAAO,EAAU,MAE3B,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,MAAO,GAAS,QAAU,0BAAzD,SAAA,CACG,EAAQ,GAAG,EAAM,IAAM,GAAG,SACvB,GAEV"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Advanced-D_eS4472.js","assets/index-BVxOlseC.js","assets/global-oEl9Qj8u.js","assets/global-BlI2BYa1.css","assets/Epistemic-dhvDTwAZ.js","assets/Epistemic-OaGnEJkn.css","assets/StatusBadge-HCZp416_.js","assets/StatusBadge-BVi0IBb9.css","assets/MutationTokenDialog-mxrw0Yvy.js","assets/Dialog-BS9Dxi3G.js","assets/focus-trap-HtcoXeEq.js","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/ConfirmDialog-DLrLKM0c.js","assets/ConfirmDialog-Dx15x0Ho.css","assets/RefreshIndicator-CMwSCiz5.js","assets/RefreshIndicator-CVv22U_j.css","assets/VerseConsoleApp-DTjDpGCd.js","assets/RouteErrorBoundary-DYtwc2ja.js","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/command-catalog-Bb_PxC5w.js","assets/workbench-types-DzN-5trg.js","assets/guarded-action-OzqcPjmh.js","assets/preloaded-Cwf9rsnZ.js","assets/viewport-nTubFCwf.js","assets/verse-ui-store-62DxpVHS.js","assets/dock-store-B2vlxqPu.js","assets/composer-keys-su0g1h9o.js","assets/command-bus-xYZoK9nQ.js","assets/section-visibility-Yctxu-if.js","assets/icon-base-DvM1eI5V.js","assets/VerseConsoleApp-Cxqr-3qc.css","assets/Segmented-BE53BenI.js","assets/Segmented-BnjHbKzH.css","assets/format-BkWdOQDL.js","assets/format-DKrNjdwD.js","assets/verse-model-DyCwZF-M.js","assets/compaction-point-VL9oegWS.js","assets/workspace-model-CbhdPhei.js","assets/Meter-DNeocJnD.js","assets/Meter-CYt9KpM0.css","assets/Select-BwSGkHCS.js","assets/icons-DEQa2rTx.js","assets/Select-DSu5ghId.css","assets/control-queries-CmgBgKV7.js","assets/mutations-C5S7okTW.js","assets/use-ticker-D9yi49my.js","assets/fleet-model-7i-FbzKI.js","assets/fleet-queries-DzGoqq8X.js","assets/overnight-queries-DGm3qL1b.js","assets/use-guarded-action-Cf4MeNBa.js","assets/Advanced-Bywv_iYR.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a as e,n as t,s as n,t as r}from"./index-BVxOlseC.js";import{m as i,p as a}from"./global-oEl9Qj8u.js";import{t as o}from"./RefreshIndicator-CMwSCiz5.js";import{n as s,t as c}from"./Swimlane-DGcIcnNA.js";import{n as l,t as u}from"./Funnel-D2u7Wlzc.js";import{n as d}from"./viewport-nTubFCwf.js";import{r as f}from"./section-visibility-Yctxu-if.js";import{l as p}from"./format-BkWdOQDL.js";import{t as m}from"./Tag-DH15CUJp.js";import{n as ee,t as h}from"./budget-queries-V3wcJVK_.js";import{t as g}from"./Button-HHXgoXGr.js";import{a as te}from"./icons-DEQa2rTx.js";import{f as _,t as v}from"./cloud.module-ascz58c3.js";import{n as y,t as b}from"./cloud-queries-Br_r0UAz.js";import{t as ne}from"./use-ticker-D9yi49my.js";import{a as re,r as x}from"./overnight-queries-DGm3qL1b.js";import{t as S}from"./nav-NVtnuG7A.js";import{c as C,i as w}from"./surface-data-DTI7LjvH.js";import{n as T,t as ie}from"./actions-tWevL9HV.js";import{r as ae}from"./dark-since-DOMvtB_G.js";import{a as oe,i as E,n as D,r as O,t as k}from"./Surface-B75lVfzm.js";import{a as se,c as ce,d as A,f as le,g as ue,h as de,i as fe,l as pe,m as me,n as he,o as ge,p as j,r as M,s as N,t as P,u as F}from"./live-model-bmsJgnYD.js";var I=n(e(),1),L=t();function _e({classes:e={}}){let t=a(y,{freshMs:15e3}),n=i(y);f(n,b);let r=t.data?.value??null;if(!r)return null;let o=_(r.tasks),s=`Claude Code cloud sessions Verse launched that have not delivered a PR yet. ${r.budget.sessionsToday} of ${r.budget.budget.maxSessionsPerDay} sessions used today.`;return(0,L.jsxs)(`li`,{className:`${e.lane??``} ${v.laneChip}`,"data-active":o>0||void 0,title:s,"aria-label":`Cloud: ${o} running`,children:[(0,L.jsx)(`span`,{className:e.name,children:`Cloud`}),(0,L.jsx)(`span`,{className:e.sep,"aria-hidden":`true`,children:` · `}),(0,L.jsxs)(`span`,{className:e.slots,children:[o,` running`]})]})}var R={stack:`_stack_j599h_5`,muted:`_muted_j599h_11`,link:`_link_j599h_18`,disclosure:`_disclosure_j599h_34`,num:`_num_j599h_39`,lanes:`_lanes_j599h_45`,lane:`_lane_j599h_45`,laneName:`_laneName_j599h_72`,laneSlots:`_laneSlots_j599h_77`,laneSep:`_laneSep_j599h_83`,laneStrip:`_laneStrip_j599h_88`,laneNotes:`_laneNotes_j599h_94`,laneNoteLanes:`_laneNoteLanes_j599h_107`,decision:`_decision_j599h_113`,decisionLead:`_decisionLead_j599h_119`,mode:`_mode_j599h_129`,decisionWhy:`_decisionWhy_j599h_142`,candidates:`_candidates_j599h_149`,exclusions:`_exclusions_j599h_150`,excluded:`_excluded_j599h_170`,excludedWhy:`_excludedWhy_j599h_175`,excludedWhen:`_excludedWhen_j599h_179`,overnight:`_overnight_j599h_184`,overnightLead:`_overnightLead_j599h_190`,facts:`_facts_j599h_196`,discarded:`_discarded_j599h_219`,discardTitle:`_discardTitle_j599h_234`,discardWhy:`_discardWhy_j599h_238`,tableWrap:`_tableWrap_j599h_243`,table:`_table_j599h_243`,repoName:`_repoName_j599h_276`,actionCell:`_actionCell_j599h_283`,stage:`_stage_j599h_287`,stageNote:`_stageNote_j599h_309`,green:`_green_j599h_314`,greenValue:`_greenValue_j599h_320`,holds:`_holds_j599h_325`,hold:`_hold_j599h_325`,repoCards:`_repoCards_j599h_347`,repoCard:`_repoCard_j599h_347`,repoCardHead:`_repoCardHead_j599h_365`,advanced:`_advanced_j599h_373`,chevron:`_chevron_j599h_399`,disclosureNote:`_disclosureNote_j599h_407`},z=36e5;function B(e,t,n){if(!e)return{kind:`loading`};let r=e.value;return r?r.state===`dark`&&!n?ae(r):n?{kind:`ready`}:{kind:`empty`,message:t}:{kind:`unknown`,reason:e.reason??`the live fleet view did not answer.`}}function ve({lane:e}){let t=fe(e);return(0,L.jsxs)(`li`,{className:R.lane,"data-off":e.slots===0||void 0,title:ge(e)??void 0,children:[(0,L.jsx)(m,{engine:P[e.lane]}),(0,L.jsx)(`span`,{className:R.laneName,children:t.name}),(0,L.jsx)(`span`,{className:R.laneSep,"aria-hidden":`true`,children:` · `}),(0,L.jsx)(`span`,{className:R.laneSlots,children:t.slots})]})}function ye({live:e}){if(!e||e.lanes.length===0)return null;let t=se(e.lanes);return(0,L.jsxs)(`div`,{className:R.laneStrip,children:[(0,L.jsxs)(`ul`,{className:R.lanes,"aria-label":`Lanes: busy of slots`,children:[e.lanes.map(e=>(0,L.jsx)(ve,{lane:e},e.lane)),(0,L.jsx)(_e,{classes:{lane:R.lane,name:R.laneName,sep:R.laneSep,slots:R.laneSlots}})]}),t.length>0?(0,L.jsx)(`ul`,{className:R.laneNotes,"aria-label":`Why lanes are limited`,children:t.map(e=>(0,L.jsxs)(`li`,{children:[e.all?null:(0,L.jsxs)(`span`,{className:R.laneNoteLanes,children:[e.lanes.map(e=>he[e]).join(`, `),`: `]}),le(e.reason)]},e.lanes.join(`,`)))}):null]})}function be({read:e,now:t,hours:n}){let r=e?.value??null,i=t-n*z,a=r?N(r.runs,i,t,{includeParked:!1}):[];return(0,L.jsx)(c,{title:`Live fleet`,description:`Lanes × slots, last ${n} h · bars coloured by phase or outcome · outlines are queued`,status:B(e,`Nothing ran in the last ${n} hours.`,a.length>0),lanes:a,from:i,to:t,now:t,toneOf:A})}function V({read:e}){let t=(e?.value??null)?.funnel??null,n=M(t),r=F(t),i=t?`${new Date(t.from).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})} – ${new Date(t.to).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})}`:void 0;return(0,L.jsxs)(`div`,{className:R.stack,children:[(0,L.jsx)(u,{title:`Gate funnel`,description:i?`Proposals through G0–G7, ${i}`:`Proposals through the merge gates G0–G7`,status:B(e,`No proposal reached the gates in this window.`,n.length>0),stages:n}),(0,L.jsx)(l,{title:`Refusals by gate`,description:r.total?`${r.total} refusals · top reasons keep their colour`:`Why proposals stopped`,status:B(e,`Nothing was refused in this window.`,r.total>0),categories:r.categories,segments:r.segments,values:r.values,height:180})]})}function H(e,t){let n=e?.seatInfo.find(e=>e.seatId===t);return{label:n?.label??t,engine:n?.engine??null}}function U({decision:e,view:t,now:n}){let r=e.seatId?H(t,e.seatId):null;return(0,L.jsxs)(`div`,{className:R.decision,children:[(0,L.jsxs)(`p`,{className:R.decisionLead,children:[r?(0,L.jsxs)(L.Fragment,{children:[r.engine?(0,L.jsx)(m,{engine:r.engine}):null,(0,L.jsx)(`strong`,{children:r.label})]}):(0,L.jsx)(`strong`,{children:`No seat`}),(0,L.jsx)(`span`,{className:R.mode,children:e.mode})]}),(0,L.jsx)(`p`,{className:R.decisionWhy,children:j(e)}),e.candidates.length>1?(0,L.jsxs)(`div`,{children:[(0,L.jsx)(E,{children:`Then`}),(0,L.jsx)(`ol`,{className:R.candidates,children:e.candidates.slice(+!!e.seatId).map(e=>(0,L.jsx)(`li`,{children:H(t,e).label},e))})]}):null,e.exclusions.length?(0,L.jsxs)(`div`,{children:[(0,L.jsx)(E,{children:`Held back`}),(0,L.jsx)(`ul`,{className:R.exclusions,"aria-label":`Held back seats`,children:e.exclusions.map(e=>(0,L.jsxs)(`li`,{children:[(0,L.jsx)(`span`,{className:R.excluded,children:H(t,e.seatId).label}),(0,L.jsx)(`span`,{className:R.excludedWhy,children:ue(e)}),(0,L.jsxs)(`span`,{className:R.excludedWhen,children:[`eligible again: `,me(de(e),n)]})]},e.seatId))})]}):null]})}function xe({read:e,preview:t,view:n,now:r}){let i=ce(e?.value??null);return(0,L.jsx)(k,{title:`Why this seat`,caption:i?`Latest dispatch: ${i.run.title} (${p(i.run.phaseStartedAt??i.run.startedAt)})`:t?`The next medium autonomous task would go to…`:void 0,children:i?(0,L.jsx)(U,{decision:i.decision,view:n,now:r}):t?(0,L.jsx)(U,{decision:t,view:n,now:r}):(0,L.jsx)(D,{tone:`unknown`,children:`No routing decision to show — nothing was dispatched, and the router preview did not answer.`})})}function Se({read:e,now:t}){let n=e?.value??null,r=n?pe(n.runs,t):{lanes:[],from:t-z,to:t+2*z,unknownRelease:0};return(0,L.jsx)(c,{title:`Parked`,description:`Waiting for a seat to free up — each bar ends when it should`,caveat:r.unknownRelease?`${r.unknownRelease} item${r.unknownRelease===1?` has`:`s have`} no known release time; ${r.unknownRelease===1?`it runs`:`they run`} to the right edge.`:void 0,status:B(e,`Nothing is parked.`,r.lanes.length>0),lanes:r.lanes,from:r.from,to:r.to,now:t,toneOf:A,formatTick:e=>new Date(e).toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`})})}function Ce({read:e,onOpenAdvanced:t}){let n=e?.value??null,r=n?.run??null;return(0,L.jsx)(k,{title:`Overnight`,caption:n?n.armed?`Armed`:`Not armed`:void 0,actions:(0,L.jsx)(`button`,{type:`button`,className:R.link,onClick:t,children:`Arm or stop in Advanced`}),children:e?n?!n.armed&&!r?(0,L.jsx)(D,{children:`Nothing armed. The fleet runs on its normal schedule; arm an unattended run from Advanced when you walk away.`}):(0,L.jsxs)(`div`,{className:R.overnight,children:[r?.stopRule?(0,L.jsx)(`p`,{className:R.overnightLead,children:re(r.stopRule)}):null,(0,L.jsxs)(`dl`,{className:R.facts,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Started`}),(0,L.jsx)(`dd`,{children:r?.startedAt?p(r.startedAt):`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Iterations`}),(0,L.jsx)(`dd`,{children:r?.iterationsDone??`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Merged`}),(0,L.jsx)(`dd`,{children:r?r.merged.length:`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Discarded`}),(0,L.jsx)(`dd`,{children:r?r.discarded.length:`—`})]})]}),r?.activity?(0,L.jsxs)(`p`,{className:R.muted,children:[`Now: `,r.activity]}):null,r&&r.discarded.length?(0,L.jsx)(`ul`,{className:R.discarded,"aria-label":`Discarded work`,children:r.discarded.slice(0,3).map(e=>(0,L.jsxs)(`li`,{children:[(0,L.jsx)(`span`,{className:R.discardTitle,children:e.title}),(0,L.jsx)(`span`,{className:R.discardWhy,children:e.reason})]},e.id))}):null]}):(0,L.jsx)(D,{tone:`unknown`,children:e.reason??`The overnight lane did not answer.`}):(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Reading the overnight lane…`})})}var W={quarantine:`Quarantined`,"owner-hold":`On hold (you)`,"leader-pause":`Paused by Leader`,cooldown:`Cooling down`};function we(e,t){let n=e.until?Date.parse(e.until):NaN,r=Number.isFinite(n)?Math.max(0,n-t):null,i=r===null?`until resumed`:r<36e5?`${Math.ceil(r/6e4)}m left`:`${Math.round(r/36e5)}h left`;return`${W[e.kind]} · ${i}`}function G(e){return e.includes(`/`)?e.split(`/`)[1]:e}function K({row:e}){return e.stage===null?(0,L.jsx)(`span`,{className:R.stage,"data-stage":`none`,children:`Not in grant`}):(0,L.jsxs)(`span`,{className:R.stage,"data-stage":e.stage,children:[e.stage===`merge`?`Merge`:`Propose`,e.enforcement===`local`?(0,L.jsx)(`span`,{className:R.stageNote,children:` · local checks`}):null]})}function q({row:e,actions:t}){let n=t.busy||t.readOnly;return e.holds.length?(0,L.jsx)(g,{size:`sm`,variant:`subtle`,disabled:n,"aria-label":`Resume ${e.repo}`,onClick:()=>t.act(()=>C({action:`resume-repo`,repo:e.repo}),`Resume ${e.repo}`,{confirm:{title:`Resume ${G(e.repo)}?`,body:`Clears ${e.holds.map(e=>W[e.kind].toLowerCase()).join(` and `)}. New fleet work can start there on the next tick.`,confirmLabel:`Resume`}}),children:`Resume`}):e.stage===null?null:(0,L.jsx)(g,{size:`sm`,variant:`ghost`,disabled:n,"aria-label":`Pause ${e.repo}`,onClick:()=>t.act(()=>C({action:`pause-repo`,repo:e.repo,reason:`Paused by Mason from the Fleet surface`}),`Pause ${e.repo}`,{confirm:{title:`Pause ${G(e.repo)}?`,body:`No new fleet work starts there until you resume it. Runs already in flight finish and are watched as usual.`,confirmLabel:`Pause repo`,destructive:!0}}),children:`Pause`})}function J({row:e}){return(0,L.jsxs)(`span`,{className:R.green,children:[(0,L.jsx)(`span`,{className:R.greenValue,children:e.greenPct7d===null?`—`:`${Math.round(e.greenPct7d)}%`}),(0,L.jsx)(s,{points:e.greenTrend,width:64,height:18,ariaLabel:`${e.repo} post-merge green, 14 days`,describe:e=>`${Math.round(e)}%`})]})}function Y({row:e,now:t}){return e.holds.length?(0,L.jsx)(`span`,{className:R.holds,children:e.holds.map(e=>(0,L.jsx)(`span`,{className:R.hold,"data-kind":e.kind,title:e.reason,children:we(e,t)},e.kind))}):(0,L.jsx)(`span`,{className:R.muted,children:`—`})}function X(e){if(e===void 0)return null;if(e===null)return`Fleet mirrors: unknown — the enrollment registry could not be read.`;if(e.count===0)return`Fleet mirrors: none yet — the fleet clones a repo the first time it works on it.`;let t=e.repos.slice(0,6).join(`, `),n=e.repos.length>6?` and ${e.repos.length-6} more`:``;return`Fleet mirrors: ${e.count} working ${e.count===1?`copy`:`copies`}${t?` (${t}${n})`:``} — the fleet's own clones of the repos above, not repos of their own.`}var Z=e=>e.mergesToday===null?`—`:`${e.mergesToday}${e.maxMergesPerDay===null?``:` / ${e.maxMergesPerDay}`}`;function Te({read:e,actions:t,now:n,compact:r}){let i=e?.value??null,a=i?.repos??[];return(0,L.jsxs)(k,{title:`Repositories`,caption:i?`${a.length} enrolled · stage is what the grant and rollout allow right now`:void 0,children:[e?i?a.length===0?(0,L.jsx)(D,{children:`No repositories are enrolled.`}):r?(0,L.jsx)(`ul`,{className:R.repoCards,children:a.map(e=>(0,L.jsxs)(`li`,{className:R.repoCard,id:S(`repo-${e.repo}`),children:[(0,L.jsxs)(`div`,{className:R.repoCardHead,children:[(0,L.jsx)(`span`,{className:R.repoName,children:e.repo}),(0,L.jsx)(q,{row:e,actions:t})]}),(0,L.jsxs)(`dl`,{className:R.facts,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Stage`}),(0,L.jsx)(`dd`,{children:(0,L.jsx)(K,{row:e})})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Last merge`}),(0,L.jsx)(`dd`,{children:e.lastMergeAt?p(e.lastMergeAt):`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Today`}),(0,L.jsx)(`dd`,{children:Z(e)})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Green 7d`}),(0,L.jsx)(`dd`,{children:(0,L.jsx)(J,{row:e})})]})]}),(0,L.jsx)(Y,{row:e,now:n})]},e.repo))}):(0,L.jsx)(`div`,{className:R.tableWrap,children:(0,L.jsxs)(`table`,{className:R.table,children:[(0,L.jsx)(`caption`,{className:`visually-hidden`,children:`Enrolled repositories`}),(0,L.jsx)(`thead`,{children:(0,L.jsxs)(`tr`,{children:[(0,L.jsx)(`th`,{scope:`col`,children:`Repository`}),(0,L.jsx)(`th`,{scope:`col`,children:`Stage`}),(0,L.jsx)(`th`,{scope:`col`,children:`Last merge`}),(0,L.jsx)(`th`,{scope:`col`,className:R.num,children:`Today`}),(0,L.jsx)(`th`,{scope:`col`,children:`Post-merge green · 14d`}),(0,L.jsx)(`th`,{scope:`col`,className:R.num,children:`Open PRs`}),(0,L.jsx)(`th`,{scope:`col`,children:`Holds`}),(0,L.jsx)(`th`,{scope:`col`,children:(0,L.jsx)(`span`,{className:`visually-hidden`,children:`Action`})})]})}),(0,L.jsx)(`tbody`,{children:a.map(e=>(0,L.jsxs)(`tr`,{id:S(`repo-${e.repo}`),"data-held":e.holds.length>0||void 0,children:[(0,L.jsx)(`th`,{scope:`row`,className:R.repoName,children:e.repo}),(0,L.jsx)(`td`,{children:(0,L.jsx)(K,{row:e})}),(0,L.jsx)(`td`,{children:e.lastMergeAt?p(e.lastMergeAt):`—`}),(0,L.jsx)(`td`,{className:R.num,children:Z(e)}),(0,L.jsx)(`td`,{children:(0,L.jsx)(J,{row:e})}),(0,L.jsx)(`td`,{className:R.num,children:e.openFleetPrs??`—`}),(0,L.jsx)(`td`,{children:(0,L.jsx)(Y,{row:e,now:n})}),(0,L.jsx)(`td`,{className:R.actionCell,children:(0,L.jsx)(q,{row:e,actions:t})})]},e.repo))})]})}):(0,L.jsx)(D,{tone:`unknown`,children:e.reason??`The live fleet view did not answer.`}):(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Reading repositories…`}),i&&X(i.mirrors)?(0,L.jsx)(`p`,{className:R.muted,children:X(i.mirrors)}):null]})}var Q=5e3,$=3e4,Ee=(0,I.lazy)(()=>r(()=>import(`./Advanced-D_eS4472.js`).then(e=>e.t).then(e=>({default:()=>(0,L.jsx)(e.FleetAdvanced,{embedded:!0})})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51])));function De(){let{compact:e}=d(),t=a(w),n=a(x),r=a(ee,{freshMs:15e3}),s=a(h,{freshMs:15e3}),c=i(w),l=i(x),u=i(h);f(c,Q),f(()=>{l(),u()},$);let p=ne(15e3),m=T(),[g,_]=(0,I.useState)(!1),v=(0,I.useId)(),y=t.data?.value??null;function b(){_(!0),requestAnimationFrame(()=>document.getElementById(v)?.scrollIntoView?.({block:`start`,behavior:`smooth`}))}return(0,L.jsxs)(oe,{title:`Fleet`,actions:t.status===`refreshing`?(0,L.jsx)(o,{}):null,lead:(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(ie,{actions:m}),(0,L.jsx)(ye,{live:y})]}),children:[(0,L.jsx)(O,{span:12,children:(0,L.jsx)(be,{read:t.data,now:p,hours:e?6:12})}),(0,L.jsx)(O,{span:7,children:(0,L.jsx)(V,{read:t.data})}),(0,L.jsx)(O,{span:5,children:(0,L.jsx)(xe,{read:t.data,preview:s.data??null,view:r.data??null,now:p})}),(0,L.jsx)(O,{span:7,children:(0,L.jsx)(Se,{read:t.data,now:p})}),(0,L.jsx)(O,{span:5,children:(0,L.jsx)(Ce,{read:n.data,onOpenAdvanced:b})}),(0,L.jsx)(O,{span:12,children:(0,L.jsx)(Te,{read:t.data,actions:m,now:p,compact:e})}),(0,L.jsx)(O,{span:12,children:(0,L.jsxs)(`div`,{className:R.advanced,children:[(0,L.jsxs)(`button`,{type:`button`,className:R.disclosure,"aria-expanded":g,"aria-controls":v,onClick:()=>_(e=>!e),children:[(0,L.jsx)(te,{className:R.chevron,width:14,height:14,"aria-hidden":`true`}),`Advanced`,(0,L.jsx)(`span`,{className:R.disclosureNote,children:`daemon, overnight, local runtime, caps, scope, activity, safety, goals`})]}),(0,L.jsx)(`div`,{id:v,hidden:!g,children:g?(0,L.jsx)(I.Suspense,{fallback:(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Loading the advanced panels…`}),children:(0,L.jsx)(Ee,{})}):null})]})}),m.dialogs]})}export{Q as FLEET_POLL_MS,$ as FLEET_SLOW_POLL_MS,De as FleetSection};
|
|
3
|
+
//# sourceMappingURL=FleetSection-ViAb549H.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/cloud/CloudLaneChip.tsx","../../../../../../src/web-ui/routes/verse/fleet/FleetCards.tsx","../../../../../../src/web-ui/routes/verse/fleet/RepoTable.tsx","../../../../../../src/web-ui/routes/verse/sections/FleetSection.tsx"],"sourcesContent":["/**\n * routes/verse/cloud/CloudLaneChip.tsx — \"Cloud · N running\" at the end of\n * Fleet's lanes row (3.11 unit C3; mounted by fleet/FleetCards.tsx\n * LanesStrip). Styled by the lanes row's own classes, which it passes in,\n * so it reads as one more lane.\n *\n * N counts tasks queued, launching or running — sessions Verse started that\n * have not delivered a PR yet. A server without the cloud lane renders no\n * chip at all: the lanes row is not the place to say \"not in this build\".\n */\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { inFlightCount } from './cloud-model.js';\nimport { CLOUD_POLL_MS, cloudQuery } from './cloud-queries.js';\nimport styles from './cloud.module.css';\n\nexport interface CloudLaneChipClasses {\n lane?: string;\n name?: string;\n sep?: string;\n slots?: string;\n}\n\nexport function CloudLaneChip({ classes = {} }: { classes?: CloudLaneChipClasses }) {\n const read = useQuery(cloudQuery, { freshMs: 15_000 });\n const refetch = useRefetch(cloudQuery);\n usePollWhileVisible(refetch, CLOUD_POLL_MS);\n const overview = read.data?.value ?? null;\n if (!overview) return null;\n const running = inFlightCount(overview.tasks);\n const title = `Claude Code cloud sessions Verse launched that have not delivered a PR yet. ${overview.budget.sessionsToday} of ${overview.budget.budget.maxSessionsPerDay} sessions used today.`;\n return (\n <li className={`${classes.lane ?? ''} ${styles.laneChip}`} data-active={running > 0 || undefined} title={title} aria-label={`Cloud: ${running} running`}>\n <span className={classes.name}>Cloud</span>\n <span className={classes.sep} aria-hidden=\"true\">\n {' · '}\n </span>\n <span className={classes.slots}>{running} running</span>\n </li>\n );\n}\n","/**\n * routes/verse/fleet/FleetCards.tsx — the Fleet surface's cards (SPEC-310B §6,\n * SPEC-310C §5; unit C7): lanes, the live swimlane, the gate funnel with its\n * refusal reasons, \"why this seat\", the parked Gantt and Overnight.\n *\n * Every card takes an OptionalRead and draws the designed state for each way\n * a source can be missing (not landed, unrecognised, dark) — never empty axes.\n */\nimport type { FleetLaneState, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { SeatDecision } from '../../../../core/routing/types.js';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport { BarStack } from '../../../components/charts/BarStack.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { Funnel } from '../../../components/charts/Funnel.js';\nimport { Swimlane } from '../../../components/charts/Swimlane.js';\nimport { EngineMarker } from '../../../components/primitives/Tag.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { OptionalFleetRead } from '../autonomy/fleet-contract.js';\nimport type { OvernightStatus } from '../autonomy/overnight-contract.js';\nimport { describeStopRule } from '../autonomy/overnight-model.js';\nimport { CloudLaneChip } from '../cloud/CloudLaneChip.js';\nimport { Card, CardNote, MicroLabel } from '../command/Surface.js';\nimport type { OptionalRead } from '../command/surface-data.js';\nimport { fleetDarkStatus } from './dark-since.js';\nimport { LANE_ENGINE, LANE_LABEL, funnelStages, laneChipText, laneNotes, laneReason, laneRows, latestDecision, parkedGantt, refusalStack, runTone } from './live-model.js';\nimport { asSentence, decisionSummary, describeEligibleAgain, eligibleAgain, heldBackText } from './why-seat-model.js';\nimport styles from './fleet.module.css';\n\nconst HOUR = 3_600_000;\n\n/**\n * The shared \"is there a fleet to draw at all\" decision for every chart card.\n * Dark reads THE dark-since instant (`fleetDarkStatus`), as the viewer's local\n * day — the same day Command's verdict line names — and no day at all when\n * the server does not know one.\n */\nexport function fleetStatus(read: OptionalRead<FleetLiveSnapshotV1> | undefined, empty: string, hasData: boolean): ChartStatus {\n if (!read) return { kind: 'loading' };\n const live = read.value;\n if (!live) return { kind: 'unknown', reason: read.reason ?? 'the live fleet view did not answer.' };\n if (live.state === 'dark' && !hasData) return fleetDarkStatus(live);\n return hasData ? { kind: 'ready' } : { kind: 'empty', message: empty };\n}\n\n// ---------------------------------------------------------------------------\n// Lanes strip + live swimlane\n// ---------------------------------------------------------------------------\n\n/** \"Local · off\" — the chip is the lane and its slots; its why is one line below the strip (and its title). */\nfunction LaneChip({ lane }: { lane: FleetLaneState }) {\n const text = laneChipText(lane);\n return (\n <li className={styles.lane} data-off={lane.slots === 0 || undefined} title={laneReason(lane) ?? undefined}>\n <EngineMarker engine={LANE_ENGINE[lane.lane]} />\n <span className={styles.laneName}>{text.name}</span>\n <span className={styles.laneSep} aria-hidden=\"true\">\n {' · '}\n </span>\n <span className={styles.laneSlots}>{text.slots}</span>\n </li>\n );\n}\n\nexport function LanesStrip({ live }: { live: FleetLiveSnapshotV1 | null }) {\n if (!live || live.lanes.length === 0) return null;\n const notes = laneNotes(live.lanes);\n return (\n <div className={styles.laneStrip}>\n <ul className={styles.lanes} aria-label=\"Lanes: busy of slots\">\n {live.lanes.map((l) => (\n <LaneChip key={l.lane} lane={l} />\n ))}\n <CloudLaneChip classes={{ lane: styles.lane, name: styles.laneName, sep: styles.laneSep, slots: styles.laneSlots }} />\n </ul>\n {notes.length > 0 ? (\n <ul className={styles.laneNotes} aria-label=\"Why lanes are limited\">\n {notes.map((n) => (\n <li key={n.lanes.join(',')}>\n {n.all ? null : <span className={styles.laneNoteLanes}>{n.lanes.map((l) => LANE_LABEL[l]).join(', ')}: </span>}\n {asSentence(n.reason)}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport function LiveSwimlane({ read, now, hours }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; now: number; hours: number }) {\n const live = read?.value ?? null;\n const from = now - hours * HOUR;\n const lanes = live ? laneRows(live.runs, from, now, { includeParked: false }) : [];\n return (\n <Swimlane\n title=\"Live fleet\"\n description={`Lanes × slots, last ${hours} h · bars coloured by phase or outcome · outlines are queued`}\n status={fleetStatus(read, `Nothing ran in the last ${hours} hours.`, lanes.length > 0)}\n lanes={lanes}\n from={from}\n to={now}\n now={now}\n toneOf={runTone}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Gate funnel + refusal reasons\n// ---------------------------------------------------------------------------\n\nexport function GateFunnelCards({ read }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined }) {\n const live = read?.value ?? null;\n const funnel = live?.funnel ?? null;\n const stages = funnelStages(funnel);\n const refusals = refusalStack(funnel);\n const window = funnel ? `${new Date(funnel.from).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} – ${new Date(funnel.to).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}` : undefined;\n return (\n <div className={styles.stack}>\n <Funnel\n title=\"Gate funnel\"\n description={window ? `Proposals through G0–G7, ${window}` : 'Proposals through the merge gates G0–G7'}\n status={fleetStatus(read, 'No proposal reached the gates in this window.', stages.length > 0)}\n stages={stages}\n />\n <BarStack\n title=\"Refusals by gate\"\n description={refusals.total ? `${refusals.total} refusals · top reasons keep their colour` : 'Why proposals stopped'}\n status={fleetStatus(read, 'Nothing was refused in this window.', refusals.total > 0)}\n categories={refusals.categories}\n segments={refusals.segments}\n values={refusals.values}\n height={180}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Why this seat\n// ---------------------------------------------------------------------------\n\nfunction seatLabel(view: BudgetView | null, seatId: string): { label: string; engine: 'claude' | 'codex' | 'grok' | 'local' | null } {\n const info = view?.seatInfo.find((s) => s.seatId === seatId);\n return { label: info?.label ?? seatId, engine: info?.engine ?? null };\n}\n\nexport function DecisionView({ decision, view, now }: { decision: SeatDecision; view: BudgetView | null; now?: number }) {\n const chosen = decision.seatId ? seatLabel(view, decision.seatId) : null;\n return (\n <div className={styles.decision}>\n <p className={styles.decisionLead}>\n {chosen ? (\n <>\n {chosen.engine ? <EngineMarker engine={chosen.engine} /> : null}\n <strong>{chosen.label}</strong>\n </>\n ) : (\n <strong>No seat</strong>\n )}\n <span className={styles.mode}>{decision.mode}</span>\n </p>\n <p className={styles.decisionWhy}>{decisionSummary(decision)}</p>\n {decision.candidates.length > 1 ? (\n <div>\n <MicroLabel>Then</MicroLabel>\n <ol className={styles.candidates}>\n {decision.candidates.slice(decision.seatId ? 1 : 0).map((id) => (\n <li key={id}>{seatLabel(view, id).label}</li>\n ))}\n </ol>\n </div>\n ) : null}\n {decision.exclusions.length ? (\n <div>\n <MicroLabel>Held back</MicroLabel>\n <ul className={styles.exclusions} aria-label=\"Held back seats\">\n {decision.exclusions.map((x) => (\n <li key={x.seatId}>\n <span className={styles.excluded}>{seatLabel(view, x.seatId).label}</span>\n <span className={styles.excludedWhy}>{heldBackText(x)}</span>\n <span className={styles.excludedWhen}>eligible again: {describeEligibleAgain(eligibleAgain(x), now)}</span>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function WhySeatCard({ read, preview, view, now }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; preview: SeatDecision | null; view: BudgetView | null; now?: number }) {\n const latest = latestDecision(read?.value ?? null);\n return (\n <Card\n title=\"Why this seat\"\n caption={latest ? `Latest dispatch: ${latest.run.title} (${formatRelative(latest.run.phaseStartedAt ?? latest.run.startedAt)})` : preview ? 'The next medium autonomous task would go to…' : undefined}\n >\n {latest ? (\n <DecisionView decision={latest.decision} view={view} now={now} />\n ) : preview ? (\n <DecisionView decision={preview} view={view} now={now} />\n ) : (\n <CardNote tone=\"unknown\">No routing decision to show — nothing was dispatched, and the router preview did not answer.</CardNote>\n )}\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Parked Gantt\n// ---------------------------------------------------------------------------\n\nexport function ParkedCard({ read, now }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; now: number }) {\n const live = read?.value ?? null;\n const gantt = live ? parkedGantt(live.runs, now) : { lanes: [], from: now - HOUR, to: now + 2 * HOUR, unknownRelease: 0 };\n return (\n <Swimlane\n title=\"Parked\"\n description=\"Waiting for a seat to free up — each bar ends when it should\"\n caveat={gantt.unknownRelease ? `${gantt.unknownRelease} item${gantt.unknownRelease === 1 ? ' has' : 's have'} no known release time; ${gantt.unknownRelease === 1 ? 'it runs' : 'they run'} to the right edge.` : undefined}\n status={fleetStatus(read, 'Nothing is parked.', gantt.lanes.length > 0)}\n lanes={gantt.lanes}\n from={gantt.from}\n to={gantt.to}\n now={now}\n toneOf={runTone}\n formatTick={(ms) => new Date(ms).toLocaleString('en-US', { weekday: 'short', hour: 'numeric' })}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Overnight\n// ---------------------------------------------------------------------------\n\nexport function OvernightCard({ read, onOpenAdvanced }: { read: OptionalFleetRead<OvernightStatus> | undefined; onOpenAdvanced: () => void }) {\n const status = read?.value ?? null;\n const run = status?.run ?? null;\n return (\n <Card\n title=\"Overnight\"\n caption={status ? (status.armed ? 'Armed' : 'Not armed') : undefined}\n actions={\n <button type=\"button\" className={styles.link} onClick={onOpenAdvanced}>\n Arm or stop in Advanced\n </button>\n }\n >\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the overnight lane…</p>\n ) : !status ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The overnight lane did not answer.'}</CardNote>\n ) : !status.armed && !run ? (\n <CardNote>Nothing armed. The fleet runs on its normal schedule; arm an unattended run from Advanced when you walk away.</CardNote>\n ) : (\n <div className={styles.overnight}>\n {run?.stopRule ? <p className={styles.overnightLead}>{describeStopRule(run.stopRule)}</p> : null}\n <dl className={styles.facts}>\n <div>\n <dt>Started</dt>\n <dd>{run?.startedAt ? formatRelative(run.startedAt) : '—'}</dd>\n </div>\n <div>\n <dt>Iterations</dt>\n <dd>{run?.iterationsDone ?? '—'}</dd>\n </div>\n <div>\n <dt>Merged</dt>\n <dd>{run ? run.merged.length : '—'}</dd>\n </div>\n <div>\n <dt>Discarded</dt>\n <dd>{run ? run.discarded.length : '—'}</dd>\n </div>\n </dl>\n {run?.activity ? <p className={styles.muted}>Now: {run.activity}</p> : null}\n {run && run.discarded.length ? (\n <ul className={styles.discarded} aria-label=\"Discarded work\">\n {run.discarded.slice(0, 3).map((d) => (\n <li key={d.id}>\n <span className={styles.discardTitle}>{d.title}</span>\n <span className={styles.discardWhy}>{d.reason}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/fleet/RepoTable.tsx — one row per enrolled repo (SPEC-310C §5\n * Fleet \"Repo table: stage, last merge, green% sparkline, holds,\n * pause/resume\"; unit C7).\n *\n * Pause sets an owner-hold as Mason; Resume clears every active hold (or the\n * one a Needs-you item names). Both confirm first — a pause stops new work\n * in a repo, a resume can lift a quarantine early — then take the token.\n * At 375 px the table becomes one card per repo (a 7-column table does not\n * fit a phone, and a horizontal scroll hides the action).\n */\nimport type { FleetLiveSnapshotV1, FleetMirrorSummary, FleetRepoRow, RepoHold } from '../../../../core/fleet/fleet-types.js';\nimport { Sparkline } from '../../../components/charts/Sparkline.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { anchorId } from '../command/nav.js';\nimport { Card, CardNote } from '../command/Surface.js';\nimport { postFleetLive, type OptionalRead } from '../command/surface-data.js';\nimport styles from './fleet.module.css';\n\nconst HOLD_WORD: Record<RepoHold['kind'], string> = {\n quarantine: 'Quarantined',\n 'owner-hold': 'On hold (you)',\n 'leader-pause': 'Paused by Leader',\n cooldown: 'Cooling down',\n};\n\nexport function holdText(hold: RepoHold, now: number): string {\n const until = hold.until ? Date.parse(hold.until) : NaN;\n const left = Number.isFinite(until) ? Math.max(0, until - now) : null;\n const tail = left === null ? 'until resumed' : left < 3_600_000 ? `${Math.ceil(left / 60_000)}m left` : `${Math.round(left / 3_600_000)}h left`;\n return `${HOLD_WORD[hold.kind]} · ${tail}`;\n}\n\nfunction shortRepo(repo: string): string {\n return repo.includes('/') ? repo.split('/')[1]! : repo;\n}\n\nfunction StageBadge({ row }: { row: FleetRepoRow }) {\n if (row.stage === null) return <span className={styles.stage} data-stage=\"none\">Not in grant</span>;\n return (\n <span className={styles.stage} data-stage={row.stage}>\n {row.stage === 'merge' ? 'Merge' : 'Propose'}\n {row.enforcement === 'local' ? <span className={styles.stageNote}> · local checks</span> : null}\n </span>\n );\n}\n\nfunction RepoAction({ row, actions }: { row: FleetRepoRow; actions: SurfaceActions }) {\n const disabled = actions.busy || actions.readOnly;\n if (row.holds.length) {\n return (\n <Button\n size=\"sm\"\n variant=\"subtle\"\n disabled={disabled}\n aria-label={`Resume ${row.repo}`}\n onClick={() =>\n actions.act(() => postFleetLive({ action: 'resume-repo', repo: row.repo }), `Resume ${row.repo}`, {\n confirm: {\n title: `Resume ${shortRepo(row.repo)}?`,\n body: `Clears ${row.holds.map((h) => HOLD_WORD[h.kind].toLowerCase()).join(' and ')}. New fleet work can start there on the next tick.`,\n confirmLabel: 'Resume',\n },\n })\n }\n >\n Resume\n </Button>\n );\n }\n if (row.stage === null) return null;\n return (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={disabled}\n aria-label={`Pause ${row.repo}`}\n onClick={() =>\n actions.act(() => postFleetLive({ action: 'pause-repo', repo: row.repo, reason: 'Paused by Mason from the Fleet surface' }), `Pause ${row.repo}`, {\n confirm: {\n title: `Pause ${shortRepo(row.repo)}?`,\n body: 'No new fleet work starts there until you resume it. Runs already in flight finish and are watched as usual.',\n confirmLabel: 'Pause repo',\n destructive: true,\n },\n })\n }\n >\n Pause\n </Button>\n );\n}\n\nfunction GreenCell({ row }: { row: FleetRepoRow }) {\n return (\n <span className={styles.green}>\n <span className={styles.greenValue}>{row.greenPct7d === null ? '—' : `${Math.round(row.greenPct7d)}%`}</span>\n <Sparkline points={row.greenTrend} width={64} height={18} ariaLabel={`${row.repo} post-merge green, 14 days`} describe={(v) => `${Math.round(v)}%`} />\n </span>\n );\n}\n\nfunction Holds({ row, now }: { row: FleetRepoRow; now: number }) {\n if (!row.holds.length) return <span className={styles.muted}>—</span>;\n return (\n <span className={styles.holds}>\n {row.holds.map((h) => (\n <span key={h.kind} className={styles.hold} data-kind={h.kind} title={h.reason}>\n {holdText(h, now)}\n </span>\n ))}\n </span>\n );\n}\n\n/**\n * The fleet's own mirror clones, apart from the repo rows. WHY separate: a\n * mirror is the fleet's working copy of a repo already listed above, so\n * counting it as a row double-counts the repo (and its pause would not pause\n * the real one). `undefined` = an older server that does not report mirrors\n * (say nothing); `null` = the enrollment registry could not be read (say so —\n * unknown is never \"none\").\n */\nexport function mirrorsText(mirrors: FleetMirrorSummary | null | undefined): string | null {\n if (mirrors === undefined) return null;\n if (mirrors === null) return 'Fleet mirrors: unknown — the enrollment registry could not be read.';\n if (mirrors.count === 0) return 'Fleet mirrors: none yet — the fleet clones a repo the first time it works on it.';\n const shown = mirrors.repos.slice(0, 6).join(', ');\n const more = mirrors.repos.length > 6 ? ` and ${mirrors.repos.length - 6} more` : '';\n return `Fleet mirrors: ${mirrors.count} working ${mirrors.count === 1 ? 'copy' : 'copies'}${shown ? ` (${shown}${more})` : ''} — the fleet's own clones of the repos above, not repos of their own.`;\n}\n\nconst today = (row: FleetRepoRow) => (row.mergesToday === null ? '—' : `${row.mergesToday}${row.maxMergesPerDay !== null ? ` / ${row.maxMergesPerDay}` : ''}`);\n\nexport function RepoTable({ read, actions, now, compact }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; actions: SurfaceActions; now: number; compact: boolean }) {\n const live = read?.value ?? null;\n const rows = live?.repos ?? [];\n return (\n <Card title=\"Repositories\" caption={live ? `${rows.length} enrolled · stage is what the grant and rollout allow right now` : undefined}>\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading repositories…</p>\n ) : !live ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The live fleet view did not answer.'}</CardNote>\n ) : rows.length === 0 ? (\n <CardNote>No repositories are enrolled.</CardNote>\n ) : compact ? (\n <ul className={styles.repoCards}>\n {rows.map((row) => (\n <li key={row.repo} className={styles.repoCard} id={anchorId(`repo-${row.repo}`)}>\n <div className={styles.repoCardHead}>\n <span className={styles.repoName}>{row.repo}</span>\n <RepoAction row={row} actions={actions} />\n </div>\n <dl className={styles.facts}>\n <div><dt>Stage</dt><dd><StageBadge row={row} /></dd></div>\n <div><dt>Last merge</dt><dd>{row.lastMergeAt ? formatRelative(row.lastMergeAt) : '—'}</dd></div>\n <div><dt>Today</dt><dd>{today(row)}</dd></div>\n <div><dt>Green 7d</dt><dd><GreenCell row={row} /></dd></div>\n </dl>\n <Holds row={row} now={now} />\n </li>\n ))}\n </ul>\n ) : (\n <div className={styles.tableWrap}>\n <table className={styles.table}>\n <caption className=\"visually-hidden\">Enrolled repositories</caption>\n <thead>\n <tr>\n <th scope=\"col\">Repository</th>\n <th scope=\"col\">Stage</th>\n <th scope=\"col\">Last merge</th>\n <th scope=\"col\" className={styles.num}>Today</th>\n <th scope=\"col\">Post-merge green · 14d</th>\n <th scope=\"col\" className={styles.num}>Open PRs</th>\n <th scope=\"col\">Holds</th>\n <th scope=\"col\"><span className=\"visually-hidden\">Action</span></th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.repo} id={anchorId(`repo-${row.repo}`)} data-held={row.holds.length > 0 || undefined}>\n <th scope=\"row\" className={styles.repoName}>{row.repo}</th>\n <td><StageBadge row={row} /></td>\n <td>{row.lastMergeAt ? formatRelative(row.lastMergeAt) : '—'}</td>\n <td className={styles.num}>{today(row)}</td>\n <td><GreenCell row={row} /></td>\n <td className={styles.num}>{row.openFleetPrs ?? '—'}</td>\n <td><Holds row={row} now={now} /></td>\n <td className={styles.actionCell}><RepoAction row={row} actions={actions} /></td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {live && mirrorsText(live.mirrors) ? <p className={styles.muted}>{mirrorsText(live.mirrors)}</p> : null}\n </Card>\n );\n}\n","/**\n * routes/verse/sections/FleetSection.tsx — ⌘2 Fleet (SPEC-310B §6,\n * SPEC-310C §5; unit C7). What is running where, why that seat, what is\n * waiting, and per-repo control.\n *\n * Live swimlane by lane × phase (12)\n * Gate funnel + refusal reasons (7) | Why this seat (5)\n * Parked Gantt (7) | Overnight (5)\n * Repo table: stage, last merge, green% sparkline, holds, pause/resume (12)\n * ▸ Advanced — the eleven legacy Autonomy panels, fetched only when opened\n *\n * At 375 px: one column in that order; the repo table becomes cards.\n * The live view polls every 5 s while Fleet is the visible surface.\n */\nimport { Suspense, lazy, useId, useState } from 'react';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { IconChevronRight } from '../../../components/primitives/icons.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { overnightQuery } from '../autonomy/overnight-queries.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { budgetPreviewQuery, budgetQuery } from '../budget/budget-queries.js';\nimport { ActionStatus, useSurfaceActions } from '../command/actions.js';\nimport { Cell, Surface } from '../command/Surface.js';\nimport { fleetLiveQuery } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { GateFunnelCards, LanesStrip, LiveSwimlane, OvernightCard, ParkedCard, WhySeatCard } from '../fleet/FleetCards.js';\nimport { RepoTable } from '../fleet/RepoTable.js';\nimport styles from '../fleet/fleet.module.css';\n\nexport const FLEET_POLL_MS = 5_000;\nexport const FLEET_SLOW_POLL_MS = 30_000;\n\n// The legacy cockpit is ~74 KB of panels: its own chunk, loaded on open.\nconst FleetAdvanced = lazy(() => import('../fleet/Advanced.js').then((m) => ({ default: () => <m.FleetAdvanced embedded /> })));\n\nexport function FleetSection() {\n const { compact } = useViewport();\n const fleet = useQuery(fleetLiveQuery);\n const overnight = useQuery(overnightQuery);\n const budget = useQuery(budgetQuery, { freshMs: 15_000 });\n const preview = useQuery(budgetPreviewQuery, { freshMs: 15_000 });\n const refetchFleet = useRefetch(fleetLiveQuery);\n const refetchOvernight = useRefetch(overnightQuery);\n const refetchPreview = useRefetch(budgetPreviewQuery);\n usePollWhileVisible(refetchFleet, FLEET_POLL_MS);\n usePollWhileVisible(() => {\n refetchOvernight();\n refetchPreview();\n }, FLEET_SLOW_POLL_MS);\n\n const now = useNow(15_000);\n const actions = useSurfaceActions();\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const advancedId = useId();\n const live = fleet.data?.value ?? null;\n\n function openAdvanced(): void {\n setAdvancedOpen(true);\n requestAnimationFrame(() => document.getElementById(advancedId)?.scrollIntoView?.({ block: 'start', behavior: 'smooth' }));\n }\n\n return (\n <Surface\n title=\"Fleet\"\n actions={fleet.status === 'refreshing' ? <RefreshIndicator /> : null}\n lead={\n <>\n <ActionStatus actions={actions} />\n <LanesStrip live={live} />\n </>\n }\n >\n <Cell span={12}>\n <LiveSwimlane read={fleet.data} now={now} hours={compact ? 6 : 12} />\n </Cell>\n <Cell span={7}>\n <GateFunnelCards read={fleet.data} />\n </Cell>\n <Cell span={5}>\n <WhySeatCard read={fleet.data} preview={preview.data ?? null} view={budget.data ?? null} now={now} />\n </Cell>\n <Cell span={7}>\n <ParkedCard read={fleet.data} now={now} />\n </Cell>\n <Cell span={5}>\n <OvernightCard read={overnight.data} onOpenAdvanced={openAdvanced} />\n </Cell>\n <Cell span={12}>\n <RepoTable read={fleet.data} actions={actions} now={now} compact={compact} />\n </Cell>\n <Cell span={12}>\n <div className={styles.advanced}>\n <button\n type=\"button\"\n className={styles.disclosure}\n aria-expanded={advancedOpen}\n aria-controls={advancedId}\n onClick={() => setAdvancedOpen((o) => !o)}\n >\n <IconChevronRight className={styles.chevron} width={14} height={14} aria-hidden=\"true\" />\n Advanced\n <span className={styles.disclosureNote}>daemon, overnight, local runtime, caps, scope, activity, safety, goals</span>\n </button>\n <div id={advancedId} hidden={!advancedOpen}>\n {advancedOpen ? (\n <Suspense fallback={<p className={styles.muted} aria-busy=\"true\">Loading the advanced panels…</p>}>\n <FleetAdvanced />\n </Suspense>\n ) : null}\n </div>\n </div>\n </Cell>\n {actions.dialogs}\n </Surface>\n );\n}\n"],"file":"FleetSection-D_zRBCub.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/cloud/CloudLaneChip.tsx","../../../../../../src/web-ui/routes/verse/fleet/FleetCards.tsx","../../../../../../src/web-ui/routes/verse/fleet/RepoTable.tsx","../../../../../../src/web-ui/routes/verse/sections/FleetSection.tsx"],"sourcesContent":["/**\n * routes/verse/cloud/CloudLaneChip.tsx — \"Cloud · N running\" at the end of\n * Fleet's lanes row (3.11 unit C3; mounted by fleet/FleetCards.tsx\n * LanesStrip). Styled by the lanes row's own classes, which it passes in,\n * so it reads as one more lane.\n *\n * N counts tasks queued, launching or running — sessions Verse started that\n * have not delivered a PR yet. A server without the cloud lane renders no\n * chip at all: the lanes row is not the place to say \"not in this build\".\n */\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { inFlightCount } from './cloud-model.js';\nimport { CLOUD_POLL_MS, cloudQuery } from './cloud-queries.js';\nimport styles from './cloud.module.css';\n\nexport interface CloudLaneChipClasses {\n lane?: string;\n name?: string;\n sep?: string;\n slots?: string;\n}\n\nexport function CloudLaneChip({ classes = {} }: { classes?: CloudLaneChipClasses }) {\n const read = useQuery(cloudQuery, { freshMs: 15_000 });\n const refetch = useRefetch(cloudQuery);\n usePollWhileVisible(refetch, CLOUD_POLL_MS);\n const overview = read.data?.value ?? null;\n if (!overview) return null;\n const running = inFlightCount(overview.tasks);\n const title = `Claude Code cloud sessions Verse launched that have not delivered a PR yet. ${overview.budget.sessionsToday} of ${overview.budget.budget.maxSessionsPerDay} sessions used today.`;\n return (\n <li className={`${classes.lane ?? ''} ${styles.laneChip}`} data-active={running > 0 || undefined} title={title} aria-label={`Cloud: ${running} running`}>\n <span className={classes.name}>Cloud</span>\n <span className={classes.sep} aria-hidden=\"true\">\n {' · '}\n </span>\n <span className={classes.slots}>{running} running</span>\n </li>\n );\n}\n","/**\n * routes/verse/fleet/FleetCards.tsx — the Fleet surface's cards (SPEC-310B §6,\n * SPEC-310C §5; unit C7): lanes, the live swimlane, the gate funnel with its\n * refusal reasons, \"why this seat\", the parked Gantt and Overnight.\n *\n * Every card takes an OptionalRead and draws the designed state for each way\n * a source can be missing (not landed, unrecognised, dark) — never empty axes.\n */\nimport type { FleetLaneState, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { SeatDecision } from '../../../../core/routing/types.js';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport { BarStack } from '../../../components/charts/BarStack.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { Funnel } from '../../../components/charts/Funnel.js';\nimport { Swimlane } from '../../../components/charts/Swimlane.js';\nimport { EngineMarker } from '../../../components/primitives/Tag.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { OptionalFleetRead } from '../autonomy/fleet-contract.js';\nimport type { OvernightStatus } from '../autonomy/overnight-contract.js';\nimport { describeStopRule } from '../autonomy/overnight-model.js';\nimport { CloudLaneChip } from '../cloud/CloudLaneChip.js';\nimport { Card, CardNote, MicroLabel } from '../command/Surface.js';\nimport type { OptionalRead } from '../command/surface-data.js';\nimport { fleetDarkStatus } from './dark-since.js';\nimport { LANE_ENGINE, LANE_LABEL, funnelStages, laneChipText, laneNotes, laneReason, laneRows, latestDecision, parkedGantt, refusalStack, runTone } from './live-model.js';\nimport { asSentence, decisionSummary, describeEligibleAgain, eligibleAgain, heldBackText } from './why-seat-model.js';\nimport styles from './fleet.module.css';\n\nconst HOUR = 3_600_000;\n\n/**\n * The shared \"is there a fleet to draw at all\" decision for every chart card.\n * Dark reads THE dark-since instant (`fleetDarkStatus`), as the viewer's local\n * day — the same day Command's verdict line names — and no day at all when\n * the server does not know one.\n */\nexport function fleetStatus(read: OptionalRead<FleetLiveSnapshotV1> | undefined, empty: string, hasData: boolean): ChartStatus {\n if (!read) return { kind: 'loading' };\n const live = read.value;\n if (!live) return { kind: 'unknown', reason: read.reason ?? 'the live fleet view did not answer.' };\n if (live.state === 'dark' && !hasData) return fleetDarkStatus(live);\n return hasData ? { kind: 'ready' } : { kind: 'empty', message: empty };\n}\n\n// ---------------------------------------------------------------------------\n// Lanes strip + live swimlane\n// ---------------------------------------------------------------------------\n\n/** \"Local · off\" — the chip is the lane and its slots; its why is one line below the strip (and its title). */\nfunction LaneChip({ lane }: { lane: FleetLaneState }) {\n const text = laneChipText(lane);\n return (\n <li className={styles.lane} data-off={lane.slots === 0 || undefined} title={laneReason(lane) ?? undefined}>\n <EngineMarker engine={LANE_ENGINE[lane.lane]} />\n <span className={styles.laneName}>{text.name}</span>\n <span className={styles.laneSep} aria-hidden=\"true\">\n {' · '}\n </span>\n <span className={styles.laneSlots}>{text.slots}</span>\n </li>\n );\n}\n\nexport function LanesStrip({ live }: { live: FleetLiveSnapshotV1 | null }) {\n if (!live || live.lanes.length === 0) return null;\n const notes = laneNotes(live.lanes);\n return (\n <div className={styles.laneStrip}>\n <ul className={styles.lanes} aria-label=\"Lanes: busy of slots\">\n {live.lanes.map((l) => (\n <LaneChip key={l.lane} lane={l} />\n ))}\n <CloudLaneChip classes={{ lane: styles.lane, name: styles.laneName, sep: styles.laneSep, slots: styles.laneSlots }} />\n </ul>\n {notes.length > 0 ? (\n <ul className={styles.laneNotes} aria-label=\"Why lanes are limited\">\n {notes.map((n) => (\n <li key={n.lanes.join(',')}>\n {n.all ? null : <span className={styles.laneNoteLanes}>{n.lanes.map((l) => LANE_LABEL[l]).join(', ')}: </span>}\n {asSentence(n.reason)}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport function LiveSwimlane({ read, now, hours }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; now: number; hours: number }) {\n const live = read?.value ?? null;\n const from = now - hours * HOUR;\n const lanes = live ? laneRows(live.runs, from, now, { includeParked: false }) : [];\n return (\n <Swimlane\n title=\"Live fleet\"\n description={`Lanes × slots, last ${hours} h · bars coloured by phase or outcome · outlines are queued`}\n status={fleetStatus(read, `Nothing ran in the last ${hours} hours.`, lanes.length > 0)}\n lanes={lanes}\n from={from}\n to={now}\n now={now}\n toneOf={runTone}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Gate funnel + refusal reasons\n// ---------------------------------------------------------------------------\n\nexport function GateFunnelCards({ read }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined }) {\n const live = read?.value ?? null;\n const funnel = live?.funnel ?? null;\n const stages = funnelStages(funnel);\n const refusals = refusalStack(funnel);\n const window = funnel ? `${new Date(funnel.from).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} – ${new Date(funnel.to).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}` : undefined;\n return (\n <div className={styles.stack}>\n <Funnel\n title=\"Gate funnel\"\n description={window ? `Proposals through G0–G7, ${window}` : 'Proposals through the merge gates G0–G7'}\n status={fleetStatus(read, 'No proposal reached the gates in this window.', stages.length > 0)}\n stages={stages}\n />\n <BarStack\n title=\"Refusals by gate\"\n description={refusals.total ? `${refusals.total} refusals · top reasons keep their colour` : 'Why proposals stopped'}\n status={fleetStatus(read, 'Nothing was refused in this window.', refusals.total > 0)}\n categories={refusals.categories}\n segments={refusals.segments}\n values={refusals.values}\n height={180}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Why this seat\n// ---------------------------------------------------------------------------\n\nfunction seatLabel(view: BudgetView | null, seatId: string): { label: string; engine: 'claude' | 'codex' | 'grok' | 'local' | null } {\n const info = view?.seatInfo.find((s) => s.seatId === seatId);\n return { label: info?.label ?? seatId, engine: info?.engine ?? null };\n}\n\nexport function DecisionView({ decision, view, now }: { decision: SeatDecision; view: BudgetView | null; now?: number }) {\n const chosen = decision.seatId ? seatLabel(view, decision.seatId) : null;\n return (\n <div className={styles.decision}>\n <p className={styles.decisionLead}>\n {chosen ? (\n <>\n {chosen.engine ? <EngineMarker engine={chosen.engine} /> : null}\n <strong>{chosen.label}</strong>\n </>\n ) : (\n <strong>No seat</strong>\n )}\n <span className={styles.mode}>{decision.mode}</span>\n </p>\n <p className={styles.decisionWhy}>{decisionSummary(decision)}</p>\n {decision.candidates.length > 1 ? (\n <div>\n <MicroLabel>Then</MicroLabel>\n <ol className={styles.candidates}>\n {decision.candidates.slice(decision.seatId ? 1 : 0).map((id) => (\n <li key={id}>{seatLabel(view, id).label}</li>\n ))}\n </ol>\n </div>\n ) : null}\n {decision.exclusions.length ? (\n <div>\n <MicroLabel>Held back</MicroLabel>\n <ul className={styles.exclusions} aria-label=\"Held back seats\">\n {decision.exclusions.map((x) => (\n <li key={x.seatId}>\n <span className={styles.excluded}>{seatLabel(view, x.seatId).label}</span>\n <span className={styles.excludedWhy}>{heldBackText(x)}</span>\n <span className={styles.excludedWhen}>eligible again: {describeEligibleAgain(eligibleAgain(x), now)}</span>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function WhySeatCard({ read, preview, view, now }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; preview: SeatDecision | null; view: BudgetView | null; now?: number }) {\n const latest = latestDecision(read?.value ?? null);\n return (\n <Card\n title=\"Why this seat\"\n caption={latest ? `Latest dispatch: ${latest.run.title} (${formatRelative(latest.run.phaseStartedAt ?? latest.run.startedAt)})` : preview ? 'The next medium autonomous task would go to…' : undefined}\n >\n {latest ? (\n <DecisionView decision={latest.decision} view={view} now={now} />\n ) : preview ? (\n <DecisionView decision={preview} view={view} now={now} />\n ) : (\n <CardNote tone=\"unknown\">No routing decision to show — nothing was dispatched, and the router preview did not answer.</CardNote>\n )}\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Parked Gantt\n// ---------------------------------------------------------------------------\n\nexport function ParkedCard({ read, now }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; now: number }) {\n const live = read?.value ?? null;\n const gantt = live ? parkedGantt(live.runs, now) : { lanes: [], from: now - HOUR, to: now + 2 * HOUR, unknownRelease: 0 };\n return (\n <Swimlane\n title=\"Parked\"\n description=\"Waiting for a seat to free up — each bar ends when it should\"\n caveat={gantt.unknownRelease ? `${gantt.unknownRelease} item${gantt.unknownRelease === 1 ? ' has' : 's have'} no known release time; ${gantt.unknownRelease === 1 ? 'it runs' : 'they run'} to the right edge.` : undefined}\n status={fleetStatus(read, 'Nothing is parked.', gantt.lanes.length > 0)}\n lanes={gantt.lanes}\n from={gantt.from}\n to={gantt.to}\n now={now}\n toneOf={runTone}\n formatTick={(ms) => new Date(ms).toLocaleString('en-US', { weekday: 'short', hour: 'numeric' })}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Overnight\n// ---------------------------------------------------------------------------\n\nexport function OvernightCard({ read, onOpenAdvanced }: { read: OptionalFleetRead<OvernightStatus> | undefined; onOpenAdvanced: () => void }) {\n const status = read?.value ?? null;\n const run = status?.run ?? null;\n return (\n <Card\n title=\"Overnight\"\n caption={status ? (status.armed ? 'Armed' : 'Not armed') : undefined}\n actions={\n <button type=\"button\" className={styles.link} onClick={onOpenAdvanced}>\n Arm or stop in Advanced\n </button>\n }\n >\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the overnight lane…</p>\n ) : !status ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The overnight lane did not answer.'}</CardNote>\n ) : !status.armed && !run ? (\n <CardNote>Nothing armed. The fleet runs on its normal schedule; arm an unattended run from Advanced when you walk away.</CardNote>\n ) : (\n <div className={styles.overnight}>\n {run?.stopRule ? <p className={styles.overnightLead}>{describeStopRule(run.stopRule)}</p> : null}\n <dl className={styles.facts}>\n <div>\n <dt>Started</dt>\n <dd>{run?.startedAt ? formatRelative(run.startedAt) : '—'}</dd>\n </div>\n <div>\n <dt>Iterations</dt>\n <dd>{run?.iterationsDone ?? '—'}</dd>\n </div>\n <div>\n <dt>Merged</dt>\n <dd>{run ? run.merged.length : '—'}</dd>\n </div>\n <div>\n <dt>Discarded</dt>\n <dd>{run ? run.discarded.length : '—'}</dd>\n </div>\n </dl>\n {run?.activity ? <p className={styles.muted}>Now: {run.activity}</p> : null}\n {run && run.discarded.length ? (\n <ul className={styles.discarded} aria-label=\"Discarded work\">\n {run.discarded.slice(0, 3).map((d) => (\n <li key={d.id}>\n <span className={styles.discardTitle}>{d.title}</span>\n <span className={styles.discardWhy}>{d.reason}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/fleet/RepoTable.tsx — one row per enrolled repo (SPEC-310C §5\n * Fleet \"Repo table: stage, last merge, green% sparkline, holds,\n * pause/resume\"; unit C7).\n *\n * Pause sets an owner-hold as Mason; Resume clears every active hold (or the\n * one a Needs-you item names). Both confirm first — a pause stops new work\n * in a repo, a resume can lift a quarantine early — then take the token.\n * At 375 px the table becomes one card per repo (a 7-column table does not\n * fit a phone, and a horizontal scroll hides the action).\n */\nimport type { FleetLiveSnapshotV1, FleetMirrorSummary, FleetRepoRow, RepoHold } from '../../../../core/fleet/fleet-types.js';\nimport { Sparkline } from '../../../components/charts/Sparkline.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { anchorId } from '../command/nav.js';\nimport { Card, CardNote } from '../command/Surface.js';\nimport { postFleetLive, type OptionalRead } from '../command/surface-data.js';\nimport styles from './fleet.module.css';\n\nconst HOLD_WORD: Record<RepoHold['kind'], string> = {\n quarantine: 'Quarantined',\n 'owner-hold': 'On hold (you)',\n 'leader-pause': 'Paused by Leader',\n cooldown: 'Cooling down',\n};\n\nexport function holdText(hold: RepoHold, now: number): string {\n const until = hold.until ? Date.parse(hold.until) : NaN;\n const left = Number.isFinite(until) ? Math.max(0, until - now) : null;\n const tail = left === null ? 'until resumed' : left < 3_600_000 ? `${Math.ceil(left / 60_000)}m left` : `${Math.round(left / 3_600_000)}h left`;\n return `${HOLD_WORD[hold.kind]} · ${tail}`;\n}\n\nfunction shortRepo(repo: string): string {\n return repo.includes('/') ? repo.split('/')[1]! : repo;\n}\n\nfunction StageBadge({ row }: { row: FleetRepoRow }) {\n if (row.stage === null) return <span className={styles.stage} data-stage=\"none\">Not in grant</span>;\n return (\n <span className={styles.stage} data-stage={row.stage}>\n {row.stage === 'merge' ? 'Merge' : 'Propose'}\n {row.enforcement === 'local' ? <span className={styles.stageNote}> · local checks</span> : null}\n </span>\n );\n}\n\nfunction RepoAction({ row, actions }: { row: FleetRepoRow; actions: SurfaceActions }) {\n const disabled = actions.busy || actions.readOnly;\n if (row.holds.length) {\n return (\n <Button\n size=\"sm\"\n variant=\"subtle\"\n disabled={disabled}\n aria-label={`Resume ${row.repo}`}\n onClick={() =>\n actions.act(() => postFleetLive({ action: 'resume-repo', repo: row.repo }), `Resume ${row.repo}`, {\n confirm: {\n title: `Resume ${shortRepo(row.repo)}?`,\n body: `Clears ${row.holds.map((h) => HOLD_WORD[h.kind].toLowerCase()).join(' and ')}. New fleet work can start there on the next tick.`,\n confirmLabel: 'Resume',\n },\n })\n }\n >\n Resume\n </Button>\n );\n }\n if (row.stage === null) return null;\n return (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={disabled}\n aria-label={`Pause ${row.repo}`}\n onClick={() =>\n actions.act(() => postFleetLive({ action: 'pause-repo', repo: row.repo, reason: 'Paused by Mason from the Fleet surface' }), `Pause ${row.repo}`, {\n confirm: {\n title: `Pause ${shortRepo(row.repo)}?`,\n body: 'No new fleet work starts there until you resume it. Runs already in flight finish and are watched as usual.',\n confirmLabel: 'Pause repo',\n destructive: true,\n },\n })\n }\n >\n Pause\n </Button>\n );\n}\n\nfunction GreenCell({ row }: { row: FleetRepoRow }) {\n return (\n <span className={styles.green}>\n <span className={styles.greenValue}>{row.greenPct7d === null ? '—' : `${Math.round(row.greenPct7d)}%`}</span>\n <Sparkline points={row.greenTrend} width={64} height={18} ariaLabel={`${row.repo} post-merge green, 14 days`} describe={(v) => `${Math.round(v)}%`} />\n </span>\n );\n}\n\nfunction Holds({ row, now }: { row: FleetRepoRow; now: number }) {\n if (!row.holds.length) return <span className={styles.muted}>—</span>;\n return (\n <span className={styles.holds}>\n {row.holds.map((h) => (\n <span key={h.kind} className={styles.hold} data-kind={h.kind} title={h.reason}>\n {holdText(h, now)}\n </span>\n ))}\n </span>\n );\n}\n\n/**\n * The fleet's own mirror clones, apart from the repo rows. WHY separate: a\n * mirror is the fleet's working copy of a repo already listed above, so\n * counting it as a row double-counts the repo (and its pause would not pause\n * the real one). `undefined` = an older server that does not report mirrors\n * (say nothing); `null` = the enrollment registry could not be read (say so —\n * unknown is never \"none\").\n */\nexport function mirrorsText(mirrors: FleetMirrorSummary | null | undefined): string | null {\n if (mirrors === undefined) return null;\n if (mirrors === null) return 'Fleet mirrors: unknown — the enrollment registry could not be read.';\n if (mirrors.count === 0) return 'Fleet mirrors: none yet — the fleet clones a repo the first time it works on it.';\n const shown = mirrors.repos.slice(0, 6).join(', ');\n const more = mirrors.repos.length > 6 ? ` and ${mirrors.repos.length - 6} more` : '';\n return `Fleet mirrors: ${mirrors.count} working ${mirrors.count === 1 ? 'copy' : 'copies'}${shown ? ` (${shown}${more})` : ''} — the fleet's own clones of the repos above, not repos of their own.`;\n}\n\nconst today = (row: FleetRepoRow) => (row.mergesToday === null ? '—' : `${row.mergesToday}${row.maxMergesPerDay !== null ? ` / ${row.maxMergesPerDay}` : ''}`);\n\nexport function RepoTable({ read, actions, now, compact }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; actions: SurfaceActions; now: number; compact: boolean }) {\n const live = read?.value ?? null;\n const rows = live?.repos ?? [];\n return (\n <Card title=\"Repositories\" caption={live ? `${rows.length} enrolled · stage is what the grant and rollout allow right now` : undefined}>\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading repositories…</p>\n ) : !live ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The live fleet view did not answer.'}</CardNote>\n ) : rows.length === 0 ? (\n <CardNote>No repositories are enrolled.</CardNote>\n ) : compact ? (\n <ul className={styles.repoCards}>\n {rows.map((row) => (\n <li key={row.repo} className={styles.repoCard} id={anchorId(`repo-${row.repo}`)}>\n <div className={styles.repoCardHead}>\n <span className={styles.repoName}>{row.repo}</span>\n <RepoAction row={row} actions={actions} />\n </div>\n <dl className={styles.facts}>\n <div><dt>Stage</dt><dd><StageBadge row={row} /></dd></div>\n <div><dt>Last merge</dt><dd>{row.lastMergeAt ? formatRelative(row.lastMergeAt) : '—'}</dd></div>\n <div><dt>Today</dt><dd>{today(row)}</dd></div>\n <div><dt>Green 7d</dt><dd><GreenCell row={row} /></dd></div>\n </dl>\n <Holds row={row} now={now} />\n </li>\n ))}\n </ul>\n ) : (\n <div className={styles.tableWrap}>\n <table className={styles.table}>\n <caption className=\"visually-hidden\">Enrolled repositories</caption>\n <thead>\n <tr>\n <th scope=\"col\">Repository</th>\n <th scope=\"col\">Stage</th>\n <th scope=\"col\">Last merge</th>\n <th scope=\"col\" className={styles.num}>Today</th>\n <th scope=\"col\">Post-merge green · 14d</th>\n <th scope=\"col\" className={styles.num}>Open PRs</th>\n <th scope=\"col\">Holds</th>\n <th scope=\"col\"><span className=\"visually-hidden\">Action</span></th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.repo} id={anchorId(`repo-${row.repo}`)} data-held={row.holds.length > 0 || undefined}>\n <th scope=\"row\" className={styles.repoName}>{row.repo}</th>\n <td><StageBadge row={row} /></td>\n <td>{row.lastMergeAt ? formatRelative(row.lastMergeAt) : '—'}</td>\n <td className={styles.num}>{today(row)}</td>\n <td><GreenCell row={row} /></td>\n <td className={styles.num}>{row.openFleetPrs ?? '—'}</td>\n <td><Holds row={row} now={now} /></td>\n <td className={styles.actionCell}><RepoAction row={row} actions={actions} /></td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {live && mirrorsText(live.mirrors) ? <p className={styles.muted}>{mirrorsText(live.mirrors)}</p> : null}\n </Card>\n );\n}\n","/**\n * routes/verse/sections/FleetSection.tsx — ⌘2 Fleet (SPEC-310B §6,\n * SPEC-310C §5; unit C7). What is running where, why that seat, what is\n * waiting, and per-repo control.\n *\n * Live swimlane by lane × phase (12)\n * Gate funnel + refusal reasons (7) | Why this seat (5)\n * Parked Gantt (7) | Overnight (5)\n * Repo table: stage, last merge, green% sparkline, holds, pause/resume (12)\n * ▸ Advanced — the eleven legacy Autonomy panels, fetched only when opened\n *\n * At 375 px: one column in that order; the repo table becomes cards.\n * The live view polls every 5 s while Fleet is the visible surface.\n */\nimport { Suspense, lazy, useId, useState } from 'react';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { IconChevronRight } from '../../../components/primitives/icons.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { overnightQuery } from '../autonomy/overnight-queries.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { budgetPreviewQuery, budgetQuery } from '../budget/budget-queries.js';\nimport { ActionStatus, useSurfaceActions } from '../command/actions.js';\nimport { Cell, Surface } from '../command/Surface.js';\nimport { fleetLiveQuery } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { GateFunnelCards, LanesStrip, LiveSwimlane, OvernightCard, ParkedCard, WhySeatCard } from '../fleet/FleetCards.js';\nimport { RepoTable } from '../fleet/RepoTable.js';\nimport styles from '../fleet/fleet.module.css';\n\nexport const FLEET_POLL_MS = 5_000;\nexport const FLEET_SLOW_POLL_MS = 30_000;\n\n// The legacy cockpit is ~74 KB of panels: its own chunk, loaded on open.\nconst FleetAdvanced = lazy(() => import('../fleet/Advanced.js').then((m) => ({ default: () => <m.FleetAdvanced embedded /> })));\n\nexport function FleetSection() {\n const { compact } = useViewport();\n const fleet = useQuery(fleetLiveQuery);\n const overnight = useQuery(overnightQuery);\n const budget = useQuery(budgetQuery, { freshMs: 15_000 });\n const preview = useQuery(budgetPreviewQuery, { freshMs: 15_000 });\n const refetchFleet = useRefetch(fleetLiveQuery);\n const refetchOvernight = useRefetch(overnightQuery);\n const refetchPreview = useRefetch(budgetPreviewQuery);\n usePollWhileVisible(refetchFleet, FLEET_POLL_MS);\n usePollWhileVisible(() => {\n refetchOvernight();\n refetchPreview();\n }, FLEET_SLOW_POLL_MS);\n\n const now = useNow(15_000);\n const actions = useSurfaceActions();\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const advancedId = useId();\n const live = fleet.data?.value ?? null;\n\n function openAdvanced(): void {\n setAdvancedOpen(true);\n requestAnimationFrame(() => document.getElementById(advancedId)?.scrollIntoView?.({ block: 'start', behavior: 'smooth' }));\n }\n\n return (\n <Surface\n title=\"Fleet\"\n actions={fleet.status === 'refreshing' ? <RefreshIndicator /> : null}\n lead={\n <>\n <ActionStatus actions={actions} />\n <LanesStrip live={live} />\n </>\n }\n >\n <Cell span={12}>\n <LiveSwimlane read={fleet.data} now={now} hours={compact ? 6 : 12} />\n </Cell>\n <Cell span={7}>\n <GateFunnelCards read={fleet.data} />\n </Cell>\n <Cell span={5}>\n <WhySeatCard read={fleet.data} preview={preview.data ?? null} view={budget.data ?? null} now={now} />\n </Cell>\n <Cell span={7}>\n <ParkedCard read={fleet.data} now={now} />\n </Cell>\n <Cell span={5}>\n <OvernightCard read={overnight.data} onOpenAdvanced={openAdvanced} />\n </Cell>\n <Cell span={12}>\n <RepoTable read={fleet.data} actions={actions} now={now} compact={compact} />\n </Cell>\n <Cell span={12}>\n <div className={styles.advanced}>\n <button\n type=\"button\"\n className={styles.disclosure}\n aria-expanded={advancedOpen}\n aria-controls={advancedId}\n onClick={() => setAdvancedOpen((o) => !o)}\n >\n <IconChevronRight className={styles.chevron} width={14} height={14} aria-hidden=\"true\" />\n Advanced\n <span className={styles.disclosureNote}>daemon, overnight, local runtime, caps, scope, activity, safety, goals</span>\n </button>\n <div id={advancedId} hidden={!advancedOpen}>\n {advancedOpen ? (\n <Suspense fallback={<p className={styles.muted} aria-busy=\"true\">Loading the advanced panels…</p>}>\n <FleetAdvanced />\n </Suspense>\n ) : null}\n </div>\n </div>\n </Cell>\n {actions.dialogs}\n </Surface>\n );\n}\n"],"file":"FleetSection-ViAb549H.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=Funnel-
|
|
1
|
+
import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{D as r,F as i,I as a,L as o,M as s,N as c,c as l,f as ee,i as u,l as d,m as f,n as te,o as ne,r as p,s as m,t as h,u as re,v as ie}from"./useChartWidth-owwodNVz.js";import{c as g,p as _}from"./colors-BZ3a9wFf.js";import{r as v,t as y}from"./format-DKrNjdwD.js";var b=n(e(),1),x=t(),S=14,C=26,w=8,T=24,E=2;function D({title:e,description:t,caveat:n,status:s,categories:ie,segments:g,values:D,normalize:O=!1,height:k=200,width:A,formatValue:j,ariaLabel:ae}){let M=j??y,N=(0,b.useRef)(null),P=h(N,A),F=re(),[I,L]=(0,b.useState)(null),oe=(0,b.useId)(),se=_((0,b.useId)()),R=g.map(e=>e.color),z=ie.map((e,t)=>{let n=D[t]??g.map(()=>null);return{label:e,values:n,stack:i(n)}}),B=z.some(e=>!e.stack.unknown),V=Math.max(0,...z.map(e=>e.stack.total)),ce=z.some(e=>e.stack.incomplete),le=s??(z.length===0||B&&V===0&&!ce?{kind:`empty`}:B?{kind:`ready`}:{kind:`unknown`}),ue=z.flatMap(e=>e.values.filter(e=>e!==null&&Number.isFinite(e))),H=O?{ticks:[0,.25,.5,.75,1],labels:[0,.25,.5,.75,1].map(e=>v(e))}:f(0,V,{count:4,integer:ee(ue),format:j}),U=H.ticks,de=U[U.length-1],W=o(H.labels,28,60,F),G=Math.max(40,P-W-w),K=k-S-C,q=z.length?G/z.length:G,J=Math.max(2,Math.min(T,q*.66)),Y=r(0,de,S+K,S),X=e=>W+q*e+(q-J)/2,fe=a(z.length,Math.max(2,Math.floor(G/(64*F)))),Z=e=>`${e.stack.incomplete&&!e.stack.unknown?`≥ `:``}${e.stack.unknown?`—`:M(e.stack.total)}`;function pe(e){if(z.length===0)return;let t=I??z.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?z.length-1:null;n!==null&&(e.preventDefault(),L(Math.max(0,Math.min(z.length-1,n))))}let Q=z.reduce((e,t)=>!t.stack.unknown&&(!e||t.stack.total>e.stack.total)?t:e,null),me=ae??`${e}: ${z.length} columns of ${g.map(e=>e.label).join(`, `)}.`+(Q?` Highest: ${Q.label} with ${Z(Q)}.`:``),he=[{key:`label`,label:`Category`,render:e=>e.label},...g.map((e,t)=>({key:e.id,label:e.label,numeric:!0,render:e=>e.values[t]===null||e.values[t]===void 0?`—`:M(e.values[t])})),{key:`__total`,label:`Total`,numeric:!0,render:Z}],$=I===null?void 0:z[I];return(0,x.jsx)(te,{title:e,description:t,caveat:n,status:le,table:(0,x.jsx)(d,{caption:e,columns:he,rows:z,rowKey:(e,t)=>`${t}:${e.label}`}),footer:(0,x.jsx)(p,{items:[...g.map((e,t)=>({label:e.label,color:R[t]})),...z.some(e=>e.stack.unknown)?[{label:`no data`,kind:`hatch`}]:[]]}),children:(0,x.jsxs)(`div`,{ref:N,className:`${l.plotWrap} ${l.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each column.`,"aria-describedby":oe,onFocus:()=>L(e=>e??(z.length?z.length-1:null)),onBlur:()=>L(null),onKeyDown:pe,children:[(0,x.jsxs)(`svg`,{className:l.svg,width:P,height:k,viewBox:`0 0 ${P} ${k}`,role:`img`,"aria-label":me,children:[(0,x.jsx)(`defs`,{children:(0,x.jsx)(ne,{id:se})}),U.map((e,t)=>(0,x.jsxs)(`g`,{children:[(0,x.jsx)(`line`,{className:l.grid,x1:W,x2:W+G,y1:Y(e),y2:Y(e)}),(0,x.jsx)(`text`,{className:l.tick,x:W-6,y:Y(e),dy:`0.32em`,textAnchor:`end`,children:H.labels[t]})]},e)),z.map((e,t)=>{let n=X(t),r=O&&e.stack.total||1;if(e.stack.unknown)return(0,x.jsx)(`rect`,{"data-unknown":`true`,className:l.unknownMark,fill:`url(#${se})`,x:n+.5,y:S+K-12.5,width:Math.max(1,J-1),height:12,rx:2},t);let i=e.stack.segments[e.stack.segments.length-1];return(0,x.jsxs)(`g`,{"data-column":t,opacity:I!==null&&I!==t?.55:1,children:[e.stack.segments.map(e=>{let t=Y(e.y1/r),a=Y(e.y0/r),o=e===i,s=Math.max(0,a-t-(o?0:E)),l=o?t:t+E;return o?(0,x.jsx)(`path`,{d:c(n,l,J,s),fill:R[e.index],"data-segment":g[e.index].id},e.index):(0,x.jsx)(`rect`,{x:n,y:l,width:J,height:s,fill:R[e.index],"data-segment":g[e.index].id},e.index)}),e.stack.incomplete?(0,x.jsx)(`rect`,{"data-incomplete":`true`,className:l.noData,x:n,y:Y(e.stack.total/r)-8,width:J,height:6,rx:2}):null]},t)}),(0,x.jsx)(`line`,{className:l.axis,x1:W,x2:W+G,y1:S+K,y2:S+K}),fe.map(e=>(0,x.jsx)(`text`,{className:l.tick,x:X(e)+J/2,y:k-8,textAnchor:`middle`,children:z[e].label},e)),z.map((e,t)=>(0,x.jsx)(`rect`,{className:l.hit,x:W+q*t,y:S,width:q,height:K,onPointerEnter:()=>L(t),onPointerLeave:()=>L(e=>e===t?null:e)},`hit${t}`))]}),(0,x.jsx)(`span`,{id:oe,className:l.srOnly,"aria-live":`polite`,children:$?`${$.label}: ${g.map((e,t)=>`${e.label} ${$.values[t]===null?`no data`:M($.values[t])}`).join(`, `)}; total ${Z($)}`:``}),$&&I!==null?(0,x.jsx)(u,{left:m(X(I)+J/2,P),top:$.stack.unknown?S+K-12:Y(O?1:$.stack.total),title:$.label,rows:[...g.map((e,t)=>({key:e.id,label:e.label,value:$.values[t]===null||$.values[t]===void 0?null:M($.values[t]),color:R[t]})),{key:`__t`,label:`Total`,value:$.stack.unknown?null:Z($)}]}):null]})})}var O=20,k=480;function A(e,t){return t===0?``:e.ofPrevious===null?`— of previous`:`${v(e.ofPrevious,+(e.ofPrevious<.1&&e.ofPrevious>0))} of previous`}function j({title:e,description:t,caveat:n,status:r,stages:i,width:a,color:o=g,formatValue:c=y,ariaLabel:ee}){let u=(0,b.useRef)(null),f=h(u,a),ne=ie(i.map(e=>e.value)),p=i.map((e,t)=>({...ne[t],stage:e})),m=i[0]?.value??null,re=r??(i.length===0||m===null?i.length===0?{kind:`empty`}:{kind:`unknown`,reason:`the first stage (${i[0].label}) is unknown`}:m===0?{kind:`empty`,message:`No ${i[0].label.toLowerCase()} in this window.`}:{kind:`ready`}),_=Math.max(0,...i.map(e=>e.value!==null&&Number.isFinite(e.value)?e.value:0)),S=f<k,C=S?0:Math.min(170,Math.round(f*.28)),w=S?150:180,T=Math.max(40,f-C-w),E=S?42:34,D=p.length*E+4,j=ee??`${e}: `+p.map((e,t)=>`${e.stage.label} ${e.value===null?`unknown`:c(e.value)}${t>0?` (${A(e,t)})`:``}`).join(`, `)+`.`;return(0,x.jsx)(te,{title:e,description:t,caveat:n,status:re,table:(0,x.jsx)(d,{caption:e,columns:[{key:`stage`,label:`Stage`,render:e=>e.stage.label},{key:`value`,label:`Count`,numeric:!0,render:e=>e.value===null?`—`:c(e.value)},{key:`prev`,label:`Of previous`,numeric:!0,render:e=>e.ofPrevious===null?`—`:v(e.ofPrevious,1)},{key:`first`,label:`Of first`,numeric:!0,render:e=>e.ofFirst===null?`—`:v(e.ofFirst,1)}],rows:p,rowKey:e=>e.stage.id}),children:(0,x.jsx)(`div`,{ref:u,className:l.plotWrap,children:(0,x.jsx)(`svg`,{className:l.svg,width:f,height:D,viewBox:`0 0 ${f} ${D}`,role:`img`,"aria-label":j,children:p.map((e,t)=>{let n=t*E+(S?18:7),r=e.value===null||!(e.value>0)||_<=0?0:Math.max(3,e.value/_*T),i=n+O/2;return(0,x.jsxs)(`g`,{"data-stage":e.stage.id,children:[(0,x.jsx)(`text`,{className:l.label,x:S?0:C-10,y:S?n-5:i,dy:S?void 0:`0.32em`,textAnchor:S?`start`:`end`,children:e.stage.label}),(0,x.jsx)(`rect`,{"data-role":`track`,className:l.trackEmpty,x:C,y:n,width:T,height:O,rx:4}),e.value===null?(0,x.jsx)(`rect`,{"data-unknown":`true`,className:l.noData,x:C,y:n,width:Math.min(T,48),height:O,rx:4}):r>0?(0,x.jsx)(`path`,{"data-role":`bar`,d:s(C,n,r,O),fill:o}):null,(0,x.jsxs)(`text`,{className:l.labelStrong,x:C+T+10,y:i,dy:`0.32em`,children:[e.value===null?`unknown`:c(e.value),t>0?(0,x.jsx)(`tspan`,{className:l.tick,dx:8,children:A(e,t)}):null]})]},e.stage.id)})})})})}export{D as n,j as t};
|
|
2
|
+
//# sourceMappingURL=Funnel-D2u7Wlzc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Funnel-CL8uHONq.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/BarStack.tsx","../../../../../../src/web-ui/components/charts/Funnel.tsx"],"sourcesContent":["/**\n * components/charts/BarStack.tsx — stacked columns over ordered categories\n * (usually days): e.g. runs per day split into done / failed / aborted.\n *\n * Marks follow the kit spec: columns ≤ 24 px, a 4 px rounded data end on the\n * top segment only, square on the baseline, a 2 px surface gap between\n * segments. `normalize` shows each column as 100% (composition, not volume).\n *\n * Honesty: a null segment is UNKNOWN. A column with every segment null draws\n * a dashed \"no data\" placeholder; a column with some nulls stacks what is\n * known and marks the total as a lower bound (hollow cap + \"≥\" in the\n * tooltip and table). Nothing unknown ever renders as a zero-height bar.\n *\n * V3.10: every segment names its colour. The old fallback — categorical slot\n * by INDEX — meant an engine chart silently painted Claude in whatever ink\n * slot 0 held; engine charts must pass engineColor(), status charts\n * toneColor(), identity charts seriesColor(slot) with a slot fixed per entity\n * (SPEC-310C §6). An all-unknown column is drawn with the unknown hatch.\n */\nimport { useId, useRef, useState, type KeyboardEvent } from 'react';\nimport { hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { allIntegers, axisTicks, linearScale, roundedTopBar, stackColumn, thinIndexes, tickGutter, type StackedColumn } from './chart-math.js';\nimport { formatCompact, formatPercent } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.js';\nimport plot from './plot.module.css';\n\nexport interface BarStackSegment {\n id: string;\n label: string;\n /**\n * Required (V3.10): seriesColor(fixedSlot) for identity, toneColor(...) for\n * status, engineColor(...) for engines. Never picked by index.\n */\n color: string;\n}\n\nexport interface BarStackProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n /** Category labels in display order (e.g. formatted days). */\n categories: string[];\n segments: BarStackSegment[];\n /** values[categoryIndex][segmentIndex]; null = unknown. */\n values: ReadonlyArray<ReadonlyArray<number | null>>;\n normalize?: boolean;\n height?: number;\n width?: number;\n formatValue?: (v: number) => string;\n ariaLabel?: string;\n}\n\nconst PAD_T = 14;\nconst PAD_B = 26;\nconst PAD_R = 8;\nconst BAR_MAX = 24;\nconst GAP = 2;\n\ninterface Row {\n label: string;\n values: ReadonlyArray<number | null>;\n stack: StackedColumn;\n}\n\nexport function BarStack({\n title,\n description,\n caveat,\n status,\n categories,\n segments,\n values,\n normalize = false,\n height = 200,\n width: fixedWidth,\n formatValue: formatValueProp,\n ariaLabel,\n}: BarStackProps) {\n const formatValue = formatValueProp ?? formatCompact;\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const colors = segments.map((s) => s.color);\n\n const rows: Row[] = categories.map((label, i) => {\n const vals = values[i] ?? segments.map(() => null);\n return { label, values: vals, stack: stackColumn(vals) };\n });\n const anyKnown = rows.some((r) => !r.stack.unknown);\n const maxTotal = Math.max(0, ...rows.map((r) => r.stack.total));\n const anyIncomplete = rows.some((r) => r.stack.incomplete);\n // A window of known zeros is a designed empty state, not empty axes.\n const resolvedStatus: ChartStatus = status ?? (\n rows.length === 0 || (anyKnown && maxTotal === 0 && !anyIncomplete)\n ? { kind: 'empty' }\n : anyKnown ? { kind: 'ready' } : { kind: 'unknown' }\n );\n\n // Counts (every known value whole) get whole-number ticks: a column of 1\n // run is scaled 0 / 1, never 0 / 0.3 / 0.5 / 0.8 / 1.\n const knownValues = rows.flatMap((r) => r.values.filter((v): v is number => v !== null && Number.isFinite(v)));\n const yAxis = normalize\n ? { ticks: [0, 0.25, 0.5, 0.75, 1], labels: [0, 0.25, 0.5, 0.75, 1].map((v) => formatPercent(v)) }\n : axisTicks(0, maxTotal, { count: 4, integer: allIntegers(knownValues), format: formatValueProp });\n const ticks = yAxis.ticks;\n const top = ticks[ticks.length - 1]!;\n const padL = tickGutter(yAxis.labels, 28, 60, textScale);\n const plotW = Math.max(40, width - padL - PAD_R);\n const plotH = height - PAD_T - PAD_B;\n const slot = rows.length ? plotW / rows.length : plotW;\n const barW = Math.max(2, Math.min(BAR_MAX, slot * 0.66));\n const ys = linearScale(0, top, PAD_T + plotH, PAD_T);\n const xOf = (i: number) => padL + slot * i + (slot - barW) / 2;\n // A category label gets 64 px at 12 px text, more at a larger Display size.\n const labelIdx = thinIndexes(rows.length, Math.max(2, Math.floor(plotW / (64 * textScale))));\n\n const fmtTotal = (r: Row) => `${r.stack.incomplete && !r.stack.unknown ? '≥ ' : ''}${r.stack.unknown ? '—' : formatValue(r.stack.total)}`;\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (rows.length === 0) return;\n const cur = active ?? rows.length - 1;\n const next = e.key === 'ArrowLeft' ? cur - 1 : e.key === 'ArrowRight' ? cur + 1 : e.key === 'Home' ? 0 : e.key === 'End' ? rows.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(rows.length - 1, next)));\n }\n\n const busiest = rows.reduce<Row | null>((best, r) => (!r.stack.unknown && (!best || r.stack.total > best.stack.total) ? r : best), null);\n const summary = ariaLabel ?? `${title}: ${rows.length} columns of ${segments.map((s) => s.label).join(', ')}.` +\n (busiest ? ` Highest: ${busiest.label} with ${fmtTotal(busiest)}.` : '');\n\n const columns: TableColumn<Row>[] = [\n { key: 'label', label: 'Category', render: (r) => r.label },\n ...segments.map((s, i) => ({\n key: s.id,\n label: s.label,\n numeric: true,\n render: (r: Row) => (r.values[i] === null || r.values[i] === undefined ? '—' : formatValue(r.values[i]!)),\n })),\n { key: '__total', label: 'Total', numeric: true, render: fmtTotal },\n ];\n\n const activeRow = active !== null ? rows[active] : undefined;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r, i) => `${i}:${r.label}`} />}\n footer={\n <ChartLegend\n items={[\n ...segments.map((s, i) => ({ label: s.label, color: colors[i] })),\n ...(rows.some((r) => r.stack.unknown) ? [{ label: 'no data', kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the left and right arrow keys to read each column.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (rows.length ? rows.length - 1 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t, i) => (\n <g key={t}>\n <line className={plot.grid} x1={padL} x2={padL + plotW} y1={ys(t)} y2={ys(t)} />\n <text className={plot.tick} x={padL - 6} y={ys(t)} dy=\"0.32em\" textAnchor=\"end\">{yAxis.labels[i]}</text>\n </g>\n ))}\n {rows.map((r, i) => {\n const x = xOf(i);\n const scaleTotal = normalize ? r.stack.total || 1 : 1;\n if (r.stack.unknown) {\n return (\n <rect\n key={i}\n data-unknown=\"true\"\n className={plot.unknownMark}\n fill={`url(#${hatchId})`}\n x={x + 0.5}\n y={PAD_T + plotH - 12.5}\n width={Math.max(1, barW - 1)}\n height={12}\n rx={2}\n />\n );\n }\n const last = r.stack.segments[r.stack.segments.length - 1];\n return (\n <g key={i} data-column={i} opacity={active !== null && active !== i ? 0.55 : 1}>\n {r.stack.segments.map((seg) => {\n const y1 = ys(seg.y1 / scaleTotal);\n const y0 = ys(seg.y0 / scaleTotal);\n const isTop = seg === last;\n // 2 px surface gap above every segment but the top one.\n const h = Math.max(0, y0 - y1 - (isTop ? 0 : GAP));\n const y = isTop ? y1 : y1 + GAP;\n return isTop ? (\n <path key={seg.index} d={roundedTopBar(x, y, barW, h)} fill={colors[seg.index]} data-segment={segments[seg.index]!.id} />\n ) : (\n <rect key={seg.index} x={x} y={y} width={barW} height={h} fill={colors[seg.index]} data-segment={segments[seg.index]!.id} />\n );\n })}\n {r.stack.incomplete ? (\n <rect data-incomplete=\"true\" className={plot.noData} x={x} y={ys(r.stack.total / scaleTotal) - 8} width={barW} height={6} rx={2} />\n ) : null}\n </g>\n );\n })}\n <line className={plot.axis} x1={padL} x2={padL + plotW} y1={PAD_T + plotH} y2={PAD_T + plotH} />\n {labelIdx.map((i) => (\n <text key={i} className={plot.tick} x={xOf(i) + barW / 2} y={height - 8} textAnchor=\"middle\">{rows[i]!.label}</text>\n ))}\n {rows.map((_, i) => (\n <rect\n key={`hit${i}`}\n className={plot.hit}\n x={padL + slot * i}\n y={PAD_T}\n width={slot}\n height={plotH}\n onPointerEnter={() => setActive(i)}\n onPointerLeave={() => setActive((a) => (a === i ? null : a))}\n />\n ))}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">\n {activeRow\n ? `${activeRow.label}: ${segments.map((s, i) => `${s.label} ${activeRow.values[i] === null ? 'no data' : formatValue(activeRow.values[i]!)}`).join(', ')}; total ${fmtTotal(activeRow)}`\n : ''}\n </span>\n {activeRow && active !== null ? (\n <ChartTooltip\n left={clampTooltipLeft(xOf(active) + barW / 2, width)}\n top={activeRow.stack.unknown ? PAD_T + plotH - 12 : ys(normalize ? 1 : activeRow.stack.total)}\n title={activeRow.label}\n rows={[\n ...segments.map((s, i) => ({\n key: s.id,\n label: s.label,\n value: activeRow.values[i] === null || activeRow.values[i] === undefined ? null : formatValue(activeRow.values[i]!),\n color: colors[i],\n })),\n { key: '__t', label: 'Total', value: activeRow.stack.unknown ? null : fmtTotal(activeRow) },\n ]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n","/**\n * components/charts/Funnel.tsx — an ordered pipeline (filed → verified →\n * passed → judged ship → merged). One series, so ONE hue for every bar (no\n * value ramp on stages); each bar's length is its share of the first stage,\n * and the step-to-step conversion is written out in words beside it. A zero\n * stage is an empty neutral track (never a full pale bar that reads 100%).\n *\n * Honesty: an unknown stage (null) draws a dashed placeholder and \"unknown\",\n * and the conversions on either side of it are \"—\", never a guessed rate.\n * Works at 375 px: below 480 px the stage label moves above its bar.\n */\nimport { useRef } from 'react';\nimport { CHART_SEQUENTIAL } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { funnelSteps, roundedRightBar, type FunnelStep } from './chart-math.js';\nimport { formatCompact, formatPercent } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\n\nexport interface FunnelStage {\n id: string;\n label: string;\n value: number | null;\n}\n\nexport interface FunnelProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n stages: FunnelStage[];\n width?: number;\n color?: string;\n formatValue?: (v: number) => string;\n ariaLabel?: string;\n}\n\nconst BAR_H = 20;\nconst NARROW = 480;\n\ninterface Row extends FunnelStep {\n stage: FunnelStage;\n}\n\nfunction conversionText(step: FunnelStep, index: number): string {\n if (index === 0) return '';\n return step.ofPrevious === null ? '— of previous' : `${formatPercent(step.ofPrevious, step.ofPrevious < 0.1 && step.ofPrevious > 0 ? 1 : 0)} of previous`;\n}\n\nexport function Funnel({\n title,\n description,\n caveat,\n status,\n stages,\n width: fixedWidth,\n color = CHART_SEQUENTIAL,\n formatValue = formatCompact,\n ariaLabel,\n}: FunnelProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const steps = funnelSteps(stages.map((s) => s.value));\n const rows: Row[] = stages.map((stage, i) => ({ ...steps[i]!, stage }));\n const first = stages[0]?.value ?? null;\n const resolvedStatus: ChartStatus = status ?? (\n stages.length === 0 || first === null\n ? (stages.length === 0 ? { kind: 'empty' } : { kind: 'unknown', reason: `the first stage (${stages[0]!.label}) is unknown` })\n : first === 0 ? { kind: 'empty', message: `No ${stages[0]!.label.toLowerCase()} in this window.` } : { kind: 'ready' }\n );\n\n // Bar length is a share of the widest stage — the first, in any real\n // funnel; the max only guards a later stage that out-counts it (it would\n // overflow the track). When that is 0 every bar is 0: an all-zero window\n // is a row of EMPTY tracks, never full bars that read as 100%.\n const scaleMax = Math.max(0, ...stages.map((s) => (s.value !== null && Number.isFinite(s.value) ? s.value : 0)));\n\n const narrow = width < NARROW;\n const labelW = narrow ? 0 : Math.min(170, Math.round(width * 0.28));\n const valueW = narrow ? 150 : 180;\n const plotW = Math.max(40, width - labelW - valueW);\n const rowH = narrow ? BAR_H + 22 : BAR_H + 14;\n const height = rows.length * rowH + 4;\n\n const summary = ariaLabel ?? `${title}: ` + rows\n .map((r, i) => `${r.stage.label} ${r.value === null ? 'unknown' : formatValue(r.value)}${i > 0 ? ` (${conversionText(r, i)})` : ''}`)\n .join(', ') + '.';\n\n const columns: TableColumn<Row>[] = [\n { key: 'stage', label: 'Stage', render: (r) => r.stage.label },\n { key: 'value', label: 'Count', numeric: true, render: (r) => (r.value === null ? '—' : formatValue(r.value)) },\n { key: 'prev', label: 'Of previous', numeric: true, render: (r) => (r.ofPrevious === null ? '—' : formatPercent(r.ofPrevious, 1)) },\n { key: 'first', label: 'Of first', numeric: true, render: (r) => (r.ofFirst === null ? '—' : formatPercent(r.ofFirst, 1)) },\n ];\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r) => r.stage.id} />}\n >\n <div ref={wrapRef} className={plot.plotWrap}>\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n {rows.map((r, i) => {\n const y = i * rowH + (narrow ? 18 : 7);\n const barW = r.value === null || !(r.value > 0) || scaleMax <= 0 ? 0 : Math.max(3, (r.value / scaleMax) * plotW);\n const textY = y + BAR_H / 2;\n return (\n <g key={r.stage.id} data-stage={r.stage.id}>\n <text className={plot.label} x={narrow ? 0 : labelW - 10} y={narrow ? y - 5 : textY} dy={narrow ? undefined : '0.32em'} textAnchor={narrow ? 'start' : 'end'}>\n {r.stage.label}\n </text>\n {/* The track is the neutral empty-meter gray (plot.module.css\n .trackEmpty), not the pale azure chart track: at 0 it must\n read as empty, and it must be SEEN — it is what every\n bar's length is a share of. */}\n <rect data-role=\"track\" className={plot.trackEmpty} x={labelW} y={y} width={plotW} height={BAR_H} rx={4} />\n {r.value === null ? (\n <rect data-unknown=\"true\" className={plot.noData} x={labelW} y={y} width={Math.min(plotW, 48)} height={BAR_H} rx={4} />\n ) : barW > 0 ? (\n <path data-role=\"bar\" d={roundedRightBar(labelW, y, barW, BAR_H)} fill={color} />\n ) : null}\n <text className={plot.labelStrong} x={labelW + plotW + 10} y={textY} dy=\"0.32em\">\n {r.value === null ? 'unknown' : formatValue(r.value)}\n {i > 0 ? <tspan className={plot.tick} dx={8}>{conversionText(r, i)}</tspan> : null}\n </text>\n </g>\n );\n })}\n </svg>\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Funnel-D2u7Wlzc.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/BarStack.tsx","../../../../../../src/web-ui/components/charts/Funnel.tsx"],"sourcesContent":["/**\n * components/charts/BarStack.tsx — stacked columns over ordered categories\n * (usually days): e.g. runs per day split into done / failed / aborted.\n *\n * Marks follow the kit spec: columns ≤ 24 px, a 4 px rounded data end on the\n * top segment only, square on the baseline, a 2 px surface gap between\n * segments. `normalize` shows each column as 100% (composition, not volume).\n *\n * Honesty: a null segment is UNKNOWN. A column with every segment null draws\n * a dashed \"no data\" placeholder; a column with some nulls stacks what is\n * known and marks the total as a lower bound (hollow cap + \"≥\" in the\n * tooltip and table). Nothing unknown ever renders as a zero-height bar.\n *\n * V3.10: every segment names its colour. The old fallback — categorical slot\n * by INDEX — meant an engine chart silently painted Claude in whatever ink\n * slot 0 held; engine charts must pass engineColor(), status charts\n * toneColor(), identity charts seriesColor(slot) with a slot fixed per entity\n * (SPEC-310C §6). An all-unknown column is drawn with the unknown hatch.\n */\nimport { useId, useRef, useState, type KeyboardEvent } from 'react';\nimport { hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { allIntegers, axisTicks, linearScale, roundedTopBar, stackColumn, thinIndexes, tickGutter, type StackedColumn } from './chart-math.js';\nimport { formatCompact, formatPercent } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.js';\nimport plot from './plot.module.css';\n\nexport interface BarStackSegment {\n id: string;\n label: string;\n /**\n * Required (V3.10): seriesColor(fixedSlot) for identity, toneColor(...) for\n * status, engineColor(...) for engines. Never picked by index.\n */\n color: string;\n}\n\nexport interface BarStackProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n /** Category labels in display order (e.g. formatted days). */\n categories: string[];\n segments: BarStackSegment[];\n /** values[categoryIndex][segmentIndex]; null = unknown. */\n values: ReadonlyArray<ReadonlyArray<number | null>>;\n normalize?: boolean;\n height?: number;\n width?: number;\n formatValue?: (v: number) => string;\n ariaLabel?: string;\n}\n\nconst PAD_T = 14;\nconst PAD_B = 26;\nconst PAD_R = 8;\nconst BAR_MAX = 24;\nconst GAP = 2;\n\ninterface Row {\n label: string;\n values: ReadonlyArray<number | null>;\n stack: StackedColumn;\n}\n\nexport function BarStack({\n title,\n description,\n caveat,\n status,\n categories,\n segments,\n values,\n normalize = false,\n height = 200,\n width: fixedWidth,\n formatValue: formatValueProp,\n ariaLabel,\n}: BarStackProps) {\n const formatValue = formatValueProp ?? formatCompact;\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const colors = segments.map((s) => s.color);\n\n const rows: Row[] = categories.map((label, i) => {\n const vals = values[i] ?? segments.map(() => null);\n return { label, values: vals, stack: stackColumn(vals) };\n });\n const anyKnown = rows.some((r) => !r.stack.unknown);\n const maxTotal = Math.max(0, ...rows.map((r) => r.stack.total));\n const anyIncomplete = rows.some((r) => r.stack.incomplete);\n // A window of known zeros is a designed empty state, not empty axes.\n const resolvedStatus: ChartStatus = status ?? (\n rows.length === 0 || (anyKnown && maxTotal === 0 && !anyIncomplete)\n ? { kind: 'empty' }\n : anyKnown ? { kind: 'ready' } : { kind: 'unknown' }\n );\n\n // Counts (every known value whole) get whole-number ticks: a column of 1\n // run is scaled 0 / 1, never 0 / 0.3 / 0.5 / 0.8 / 1.\n const knownValues = rows.flatMap((r) => r.values.filter((v): v is number => v !== null && Number.isFinite(v)));\n const yAxis = normalize\n ? { ticks: [0, 0.25, 0.5, 0.75, 1], labels: [0, 0.25, 0.5, 0.75, 1].map((v) => formatPercent(v)) }\n : axisTicks(0, maxTotal, { count: 4, integer: allIntegers(knownValues), format: formatValueProp });\n const ticks = yAxis.ticks;\n const top = ticks[ticks.length - 1]!;\n const padL = tickGutter(yAxis.labels, 28, 60, textScale);\n const plotW = Math.max(40, width - padL - PAD_R);\n const plotH = height - PAD_T - PAD_B;\n const slot = rows.length ? plotW / rows.length : plotW;\n const barW = Math.max(2, Math.min(BAR_MAX, slot * 0.66));\n const ys = linearScale(0, top, PAD_T + plotH, PAD_T);\n const xOf = (i: number) => padL + slot * i + (slot - barW) / 2;\n // A category label gets 64 px at 12 px text, more at a larger Display size.\n const labelIdx = thinIndexes(rows.length, Math.max(2, Math.floor(plotW / (64 * textScale))));\n\n const fmtTotal = (r: Row) => `${r.stack.incomplete && !r.stack.unknown ? '≥ ' : ''}${r.stack.unknown ? '—' : formatValue(r.stack.total)}`;\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (rows.length === 0) return;\n const cur = active ?? rows.length - 1;\n const next = e.key === 'ArrowLeft' ? cur - 1 : e.key === 'ArrowRight' ? cur + 1 : e.key === 'Home' ? 0 : e.key === 'End' ? rows.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(rows.length - 1, next)));\n }\n\n const busiest = rows.reduce<Row | null>((best, r) => (!r.stack.unknown && (!best || r.stack.total > best.stack.total) ? r : best), null);\n const summary = ariaLabel ?? `${title}: ${rows.length} columns of ${segments.map((s) => s.label).join(', ')}.` +\n (busiest ? ` Highest: ${busiest.label} with ${fmtTotal(busiest)}.` : '');\n\n const columns: TableColumn<Row>[] = [\n { key: 'label', label: 'Category', render: (r) => r.label },\n ...segments.map((s, i) => ({\n key: s.id,\n label: s.label,\n numeric: true,\n render: (r: Row) => (r.values[i] === null || r.values[i] === undefined ? '—' : formatValue(r.values[i]!)),\n })),\n { key: '__total', label: 'Total', numeric: true, render: fmtTotal },\n ];\n\n const activeRow = active !== null ? rows[active] : undefined;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r, i) => `${i}:${r.label}`} />}\n footer={\n <ChartLegend\n items={[\n ...segments.map((s, i) => ({ label: s.label, color: colors[i] })),\n ...(rows.some((r) => r.stack.unknown) ? [{ label: 'no data', kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the left and right arrow keys to read each column.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (rows.length ? rows.length - 1 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t, i) => (\n <g key={t}>\n <line className={plot.grid} x1={padL} x2={padL + plotW} y1={ys(t)} y2={ys(t)} />\n <text className={plot.tick} x={padL - 6} y={ys(t)} dy=\"0.32em\" textAnchor=\"end\">{yAxis.labels[i]}</text>\n </g>\n ))}\n {rows.map((r, i) => {\n const x = xOf(i);\n const scaleTotal = normalize ? r.stack.total || 1 : 1;\n if (r.stack.unknown) {\n return (\n <rect\n key={i}\n data-unknown=\"true\"\n className={plot.unknownMark}\n fill={`url(#${hatchId})`}\n x={x + 0.5}\n y={PAD_T + plotH - 12.5}\n width={Math.max(1, barW - 1)}\n height={12}\n rx={2}\n />\n );\n }\n const last = r.stack.segments[r.stack.segments.length - 1];\n return (\n <g key={i} data-column={i} opacity={active !== null && active !== i ? 0.55 : 1}>\n {r.stack.segments.map((seg) => {\n const y1 = ys(seg.y1 / scaleTotal);\n const y0 = ys(seg.y0 / scaleTotal);\n const isTop = seg === last;\n // 2 px surface gap above every segment but the top one.\n const h = Math.max(0, y0 - y1 - (isTop ? 0 : GAP));\n const y = isTop ? y1 : y1 + GAP;\n return isTop ? (\n <path key={seg.index} d={roundedTopBar(x, y, barW, h)} fill={colors[seg.index]} data-segment={segments[seg.index]!.id} />\n ) : (\n <rect key={seg.index} x={x} y={y} width={barW} height={h} fill={colors[seg.index]} data-segment={segments[seg.index]!.id} />\n );\n })}\n {r.stack.incomplete ? (\n <rect data-incomplete=\"true\" className={plot.noData} x={x} y={ys(r.stack.total / scaleTotal) - 8} width={barW} height={6} rx={2} />\n ) : null}\n </g>\n );\n })}\n <line className={plot.axis} x1={padL} x2={padL + plotW} y1={PAD_T + plotH} y2={PAD_T + plotH} />\n {labelIdx.map((i) => (\n <text key={i} className={plot.tick} x={xOf(i) + barW / 2} y={height - 8} textAnchor=\"middle\">{rows[i]!.label}</text>\n ))}\n {rows.map((_, i) => (\n <rect\n key={`hit${i}`}\n className={plot.hit}\n x={padL + slot * i}\n y={PAD_T}\n width={slot}\n height={plotH}\n onPointerEnter={() => setActive(i)}\n onPointerLeave={() => setActive((a) => (a === i ? null : a))}\n />\n ))}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">\n {activeRow\n ? `${activeRow.label}: ${segments.map((s, i) => `${s.label} ${activeRow.values[i] === null ? 'no data' : formatValue(activeRow.values[i]!)}`).join(', ')}; total ${fmtTotal(activeRow)}`\n : ''}\n </span>\n {activeRow && active !== null ? (\n <ChartTooltip\n left={clampTooltipLeft(xOf(active) + barW / 2, width)}\n top={activeRow.stack.unknown ? PAD_T + plotH - 12 : ys(normalize ? 1 : activeRow.stack.total)}\n title={activeRow.label}\n rows={[\n ...segments.map((s, i) => ({\n key: s.id,\n label: s.label,\n value: activeRow.values[i] === null || activeRow.values[i] === undefined ? null : formatValue(activeRow.values[i]!),\n color: colors[i],\n })),\n { key: '__t', label: 'Total', value: activeRow.stack.unknown ? null : fmtTotal(activeRow) },\n ]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n","/**\n * components/charts/Funnel.tsx — an ordered pipeline (filed → verified →\n * passed → judged ship → merged). One series, so ONE hue for every bar (no\n * value ramp on stages); each bar's length is its share of the first stage,\n * and the step-to-step conversion is written out in words beside it. A zero\n * stage is an empty neutral track (never a full pale bar that reads 100%).\n *\n * Honesty: an unknown stage (null) draws a dashed placeholder and \"unknown\",\n * and the conversions on either side of it are \"—\", never a guessed rate.\n * Works at 375 px: below 480 px the stage label moves above its bar.\n */\nimport { useRef } from 'react';\nimport { CHART_SEQUENTIAL } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { funnelSteps, roundedRightBar, type FunnelStep } from './chart-math.js';\nimport { formatCompact, formatPercent } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\n\nexport interface FunnelStage {\n id: string;\n label: string;\n value: number | null;\n}\n\nexport interface FunnelProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n stages: FunnelStage[];\n width?: number;\n color?: string;\n formatValue?: (v: number) => string;\n ariaLabel?: string;\n}\n\nconst BAR_H = 20;\nconst NARROW = 480;\n\ninterface Row extends FunnelStep {\n stage: FunnelStage;\n}\n\nfunction conversionText(step: FunnelStep, index: number): string {\n if (index === 0) return '';\n return step.ofPrevious === null ? '— of previous' : `${formatPercent(step.ofPrevious, step.ofPrevious < 0.1 && step.ofPrevious > 0 ? 1 : 0)} of previous`;\n}\n\nexport function Funnel({\n title,\n description,\n caveat,\n status,\n stages,\n width: fixedWidth,\n color = CHART_SEQUENTIAL,\n formatValue = formatCompact,\n ariaLabel,\n}: FunnelProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const steps = funnelSteps(stages.map((s) => s.value));\n const rows: Row[] = stages.map((stage, i) => ({ ...steps[i]!, stage }));\n const first = stages[0]?.value ?? null;\n const resolvedStatus: ChartStatus = status ?? (\n stages.length === 0 || first === null\n ? (stages.length === 0 ? { kind: 'empty' } : { kind: 'unknown', reason: `the first stage (${stages[0]!.label}) is unknown` })\n : first === 0 ? { kind: 'empty', message: `No ${stages[0]!.label.toLowerCase()} in this window.` } : { kind: 'ready' }\n );\n\n // Bar length is a share of the widest stage — the first, in any real\n // funnel; the max only guards a later stage that out-counts it (it would\n // overflow the track). When that is 0 every bar is 0: an all-zero window\n // is a row of EMPTY tracks, never full bars that read as 100%.\n const scaleMax = Math.max(0, ...stages.map((s) => (s.value !== null && Number.isFinite(s.value) ? s.value : 0)));\n\n const narrow = width < NARROW;\n const labelW = narrow ? 0 : Math.min(170, Math.round(width * 0.28));\n const valueW = narrow ? 150 : 180;\n const plotW = Math.max(40, width - labelW - valueW);\n const rowH = narrow ? BAR_H + 22 : BAR_H + 14;\n const height = rows.length * rowH + 4;\n\n const summary = ariaLabel ?? `${title}: ` + rows\n .map((r, i) => `${r.stage.label} ${r.value === null ? 'unknown' : formatValue(r.value)}${i > 0 ? ` (${conversionText(r, i)})` : ''}`)\n .join(', ') + '.';\n\n const columns: TableColumn<Row>[] = [\n { key: 'stage', label: 'Stage', render: (r) => r.stage.label },\n { key: 'value', label: 'Count', numeric: true, render: (r) => (r.value === null ? '—' : formatValue(r.value)) },\n { key: 'prev', label: 'Of previous', numeric: true, render: (r) => (r.ofPrevious === null ? '—' : formatPercent(r.ofPrevious, 1)) },\n { key: 'first', label: 'Of first', numeric: true, render: (r) => (r.ofFirst === null ? '—' : formatPercent(r.ofFirst, 1)) },\n ];\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r) => r.stage.id} />}\n >\n <div ref={wrapRef} className={plot.plotWrap}>\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n {rows.map((r, i) => {\n const y = i * rowH + (narrow ? 18 : 7);\n const barW = r.value === null || !(r.value > 0) || scaleMax <= 0 ? 0 : Math.max(3, (r.value / scaleMax) * plotW);\n const textY = y + BAR_H / 2;\n return (\n <g key={r.stage.id} data-stage={r.stage.id}>\n <text className={plot.label} x={narrow ? 0 : labelW - 10} y={narrow ? y - 5 : textY} dy={narrow ? undefined : '0.32em'} textAnchor={narrow ? 'start' : 'end'}>\n {r.stage.label}\n </text>\n {/* The track is the neutral empty-meter gray (plot.module.css\n .trackEmpty), not the pale azure chart track: at 0 it must\n read as empty, and it must be SEEN — it is what every\n bar's length is a share of. */}\n <rect data-role=\"track\" className={plot.trackEmpty} x={labelW} y={y} width={plotW} height={BAR_H} rx={4} />\n {r.value === null ? (\n <rect data-unknown=\"true\" className={plot.noData} x={labelW} y={y} width={Math.min(plotW, 48)} height={BAR_H} rx={4} />\n ) : barW > 0 ? (\n <path data-role=\"bar\" d={roundedRightBar(labelW, y, barW, BAR_H)} fill={color} />\n ) : null}\n <text className={plot.labelStrong} x={labelW + plotW + 10} y={textY} dy=\"0.32em\">\n {r.value === null ? 'unknown' : formatValue(r.value)}\n {i > 0 ? <tspan className={plot.tick} dx={8}>{conversionText(r, i)}</tspan> : null}\n </text>\n </g>\n );\n })}\n </svg>\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"uVAyDM,EAAQ,GACR,EAAQ,GACR,EAAQ,EACR,EAAU,GACV,EAAM,EAQZ,SAAgB,EAAS,CACvB,QACA,cACA,SACA,SACA,cACA,WACA,SACA,YAAY,GACZ,SAAS,IACT,MAAO,EACP,YAAa,EACb,cACgB,CAChB,IAAM,EAAc,GAAmB,EACjC,GAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,EAAQ,EAAc,EAAS,CAAU,EACzC,EAAY,GAAa,EACzB,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAwB,IAAI,EAClD,IAAA,EAAS,EAAA,MAAA,CAAM,EACf,GAAU,GAAA,EAAe,EAAA,MAAA,CAAM,CAAC,EAChC,EAAS,EAAS,IAAK,GAAM,EAAE,KAAK,EAEpC,EAAc,GAAW,KAAK,EAAO,IAAM,CAC/C,IAAM,EAAO,EAAO,IAAM,EAAS,QAAU,IAAI,EACjD,MAAO,CAAE,QAAO,OAAQ,EAAM,MAAO,EAAY,CAAI,CAAE,CACzD,CAAC,EACK,EAAW,EAAK,KAAM,GAAM,CAAC,EAAE,MAAM,OAAO,EAC5C,EAAW,KAAK,IAAI,EAAG,GAAG,EAAK,IAAK,GAAM,EAAE,MAAM,KAAK,CAAC,EACxD,GAAgB,EAAK,KAAM,GAAM,EAAE,MAAM,UAAU,EAEnD,GAA8B,IAClC,EAAK,SAAW,GAAM,GAAY,IAAa,GAAK,CAAC,GACjD,CAAE,KAAM,OAAQ,EAChB,EAAW,CAAE,KAAM,OAAQ,EAAI,CAAE,KAAM,SAAU,GAKjD,GAAc,EAAK,QAAS,GAAM,EAAE,OAAO,OAAQ,GAAmB,IAAM,MAAQ,OAAO,SAAS,CAAC,CAAC,CAAC,EACvG,EAAQ,EACV,CAAE,MAAO,CAAC,EAAG,IAAM,GAAK,IAAM,CAAC,EAAG,OAAQ,CAAC,EAAG,IAAM,GAAK,IAAM,CAAC,CAAC,CAAC,IAAK,GAAM,EAAc,CAAC,CAAC,CAAE,EAC/F,EAAU,EAAG,EAAU,CAAE,MAAO,EAAG,QAAS,GAAY,EAAW,EAAG,OAAQ,CAAgB,CAAC,EAC7F,EAAQ,EAAM,MACd,GAAM,EAAM,EAAM,OAAS,GAC3B,EAAO,EAAW,EAAM,OAAQ,GAAI,GAAI,CAAS,EACjD,EAAQ,KAAK,IAAI,GAAI,EAAQ,EAAO,CAAK,EACzC,EAAQ,EAAS,EAAQ,EACzB,EAAO,EAAK,OAAS,EAAQ,EAAK,OAAS,EAC3C,EAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAS,EAAO,GAAI,CAAC,EACjD,EAAK,EAAY,EAAG,GAAK,EAAQ,EAAO,CAAK,EAC7C,EAAO,GAAc,EAAO,EAAO,GAAK,EAAO,GAAQ,EAEvD,GAAW,EAAY,EAAK,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,GAAS,GAAK,EAAU,CAAC,CAAC,EAErF,EAAY,GAAW,GAAG,EAAE,MAAM,YAAc,CAAC,EAAE,MAAM,QAAU,KAAO,KAAK,EAAE,MAAM,QAAU,IAAM,EAAY,EAAE,MAAM,KAAK,IAEtI,SAAS,GAAM,EAAwC,CACrD,GAAI,EAAK,SAAW,EAAG,OACvB,IAAM,EAAM,GAAU,EAAK,OAAS,EAC9B,EAAO,EAAE,MAAQ,YAAc,EAAM,EAAI,EAAE,MAAQ,aAAe,EAAM,EAAI,EAAE,MAAQ,OAAS,EAAI,EAAE,MAAQ,MAAQ,EAAK,OAAS,EAAI,KACzI,IAAS,OACb,EAAE,eAAe,EACjB,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,OAAS,EAAG,CAAI,CAAC,CAAC,EACxD,CAEA,IAAM,EAAU,EAAK,QAAoB,EAAM,IAAO,CAAC,EAAE,MAAM,UAAY,CAAC,GAAQ,EAAE,MAAM,MAAQ,EAAK,MAAM,OAAS,EAAI,EAAO,IAAI,EACjI,GAAU,IAAa,GAAG,EAAM,IAAI,EAAK,OAAO,cAAc,EAAS,IAAK,GAAM,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,IACzG,EAAU,aAAa,EAAQ,MAAM,QAAQ,EAAS,CAAO,EAAE,GAAK,IAEjE,GAA8B,CAClC,CAAE,IAAK,QAAS,MAAO,WAAY,OAAS,GAAM,EAAE,KAAM,EAC1D,GAAG,EAAS,KAAK,EAAG,KAAO,CACzB,IAAK,EAAE,GACP,MAAO,EAAE,MACT,QAAS,GACT,OAAS,GAAY,EAAE,OAAO,KAAO,MAAQ,EAAE,OAAO,KAAO,IAAA,GAAY,IAAM,EAAY,EAAE,OAAO,EAAG,CACzG,EAAE,EACF,CAAE,IAAK,UAAW,MAAO,QAAS,QAAS,GAAM,OAAQ,CAAS,CACpE,EAEM,EAAY,IAAW,KAAsB,IAAA,GAAf,EAAK,GAEzC,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CACS,QACM,cACL,SACR,OAAQ,GACR,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,QAAS,EAAgB,WAAe,OAAM,QAAS,EAAG,IAAM,GAAG,EAAE,GAAG,EAAE,OAAU,CAAA,EACtG,QACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,CACL,GAAG,EAAS,KAAK,EAAG,KAAO,CAAE,MAAO,EAAE,MAAO,MAAO,EAAO,EAAG,EAAE,EAChE,GAAI,EAAK,KAAM,GAAM,EAAE,MAAM,OAAO,EAAI,CAAC,CAAE,MAAO,UAAW,KAAM,OAAiB,CAAC,EAAI,CAAC,CAC5F,CACD,CAAA,EAGH,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,IAAK,EACL,UAAW,GAAG,EAAK,SAAS,GAAG,EAAK,YACpC,SAAU,EACV,KAAK,QACL,aAAY,GAAG,EAAM,0DACrB,mBAAkB,GAClB,YAAe,EAAW,GAAM,IAAM,EAAK,OAAS,EAAK,OAAS,EAAI,KAAK,EAC3E,WAAc,EAAU,IAAI,EAC5B,UAAW,GATb,SAAA,EAWE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAK,IAAY,QAAe,SAAQ,QAAS,OAAO,EAAM,GAAG,IAAU,KAAK,MAAM,aAAY,GAAlH,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,GAAI,EAAU,CAAA,CACxB,CAAA,EACL,EAAM,KAAK,EAAG,KACb,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,GAAI,EAAM,GAAI,EAAO,EAAO,GAAI,EAAG,CAAC,EAAG,GAAI,EAAG,CAAC,CAAI,CAAA,GAC/E,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,EAAG,EAAO,EAAG,EAAG,EAAG,CAAC,EAAG,GAAG,SAAS,WAAW,MAAO,SAAA,EAAM,OAAO,EAAS,CAAA,CACtG,CAAA,EAHK,CAGL,CACJ,EACA,EAAK,KAAK,EAAG,IAAM,CAClB,IAAM,EAAI,EAAI,CAAC,EACT,EAAa,GAAY,EAAE,MAAM,OAAa,EACpD,GAAI,EAAE,MAAM,QACV,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAEE,eAAa,OACb,UAAW,EAAK,YAChB,KAAM,QAAQ,GAAQ,GACtB,EAAG,EAAI,GACP,EAAG,EAAQ,EAAQ,KACnB,MAAO,KAAK,IAAI,EAAG,EAAO,CAAC,EAC3B,OAAQ,GACR,GAAI,CACL,EATM,CASN,EAGL,IAAM,EAAO,EAAE,MAAM,SAAS,EAAE,MAAM,SAAS,OAAS,GACxD,OACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAW,cAAa,EAAG,QAAS,IAAW,MAAQ,IAAW,EAAI,IAAO,EAA7E,SAAA,CACG,EAAE,MAAM,SAAS,IAAK,GAAQ,CAC7B,IAAM,EAAK,EAAG,EAAI,GAAK,CAAU,EAC3B,EAAK,EAAG,EAAI,GAAK,CAAU,EAC3B,EAAQ,IAAQ,EAEhB,EAAI,KAAK,IAAI,EAAG,EAAK,GAAM,EAAQ,EAAI,EAAI,EAC3C,EAAI,EAAQ,EAAK,EAAK,EAC5B,OAAO,GACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAsB,EAAG,EAAc,EAAG,EAAG,EAAM,CAAC,EAAG,KAAM,EAAO,EAAI,OAAQ,eAAc,EAAS,EAAI,MAAM,CAAE,EAAK,EAA7G,EAAI,KAAyG,GAExH,EAAA,EAAA,IAAA,CAAC,OAAD,CAAyB,IAAM,IAAG,MAAO,EAAM,OAAQ,EAAG,KAAM,EAAO,EAAI,OAAQ,eAAc,EAAS,EAAI,MAAM,CAAE,EAAK,EAAhH,EAAI,KAA4G,CAE/H,CAAC,EACA,EAAE,MAAM,YACP,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,kBAAgB,OAAO,UAAW,EAAK,OAAW,IAAG,EAAG,EAAG,EAAE,MAAM,MAAQ,CAAU,EAAI,EAAG,MAAO,EAAM,OAAQ,EAAG,GAAI,CAAI,CAAA,EAChI,IACH,CAjBK,EAAA,CAiBL,CAEP,CAAC,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,GAAI,EAAM,GAAI,EAAO,EAAO,GAAI,EAAQ,EAAO,GAAI,EAAQ,CAAQ,CAAA,EAC9F,GAAS,IAAK,IACb,EAAA,EAAA,IAAA,CAAC,OAAD,CAAc,UAAW,EAAK,KAAM,EAAG,EAAI,CAAC,EAAI,EAAO,EAAG,EAAG,EAAS,EAAG,WAAW,SAAU,SAAA,EAAK,EAAE,CAAE,KAAY,EAAxG,CAAwG,CACpH,EACA,EAAK,KAAK,EAAG,KACZ,EAAA,EAAA,IAAA,CAAC,OAAD,CAEE,UAAW,EAAK,IAChB,EAAG,EAAO,EAAO,EACjB,EAAG,EACH,MAAO,EACP,OAAQ,EACR,mBAAsB,EAAU,CAAC,EACjC,mBAAsB,EAAW,GAAO,IAAM,EAAI,KAAO,CAAE,CAC5D,EARM,MAAM,GAQZ,CACF,CACE,KACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAQ,UAAW,EAAK,OAAQ,YAAU,SACjD,SAAA,EACG,GAAG,EAAU,MAAM,IAAI,EAAS,KAAK,EAAG,IAAM,GAAG,EAAE,MAAM,GAAG,EAAU,OAAO,KAAO,KAAO,UAAY,EAAY,EAAU,OAAO,EAAG,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,UAAU,EAAS,CAAS,IACnL,EACA,CAAA,EACL,GAAa,IAAW,MACvB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAAiB,EAAI,CAAM,EAAI,EAAO,EAAG,CAAK,EACpD,IAAK,EAAU,MAAM,QAAU,EAAQ,EAAQ,GAAK,EAAG,EAAY,EAAI,EAAU,MAAM,KAAK,EAC5F,MAAO,EAAU,MACjB,KAAM,CACJ,GAAG,EAAS,KAAK,EAAG,KAAO,CACzB,IAAK,EAAE,GACP,MAAO,EAAE,MACT,MAAO,EAAU,OAAO,KAAO,MAAQ,EAAU,OAAO,KAAO,IAAA,GAAY,KAAO,EAAY,EAAU,OAAO,EAAG,EAClH,MAAO,EAAO,EAChB,EAAE,EACF,CAAE,IAAK,MAAO,MAAO,QAAS,MAAO,EAAU,MAAM,QAAU,KAAO,EAAS,CAAS,CAAE,CAC5F,CACD,CAAA,EACC,IACD,GACK,CAAA,CAEhB,CCxOA,IAAM,EAAQ,GACR,EAAS,IAMf,SAAS,EAAe,EAAkB,EAAuB,CAE/D,OADI,IAAU,EAAU,GACjB,EAAK,aAAe,KAAO,gBAAkB,GAAG,EAAc,EAAK,WAAY,IAAK,WAAa,IAAO,EAAK,WAAa,EAAS,EAAE,aAC9I,CAEA,SAAgB,EAAO,CACrB,QACA,cACA,SACA,SACA,SACA,MAAO,EACP,QAAQ,EACR,cAAc,EACd,cACc,CACd,IAAM,GAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,EAAQ,EAAc,EAAS,CAAU,EACzC,GAAQ,GAAY,EAAO,IAAK,GAAM,EAAE,KAAK,CAAC,EAC9C,EAAc,EAAO,KAAK,EAAO,KAAO,CAAE,GAAG,GAAM,GAAK,OAAM,EAAE,EAChE,EAAQ,EAAO,EAAE,EAAE,OAAS,KAC5B,GAA8B,IAClC,EAAO,SAAW,GAAK,IAAU,KAC5B,EAAO,SAAW,EAAI,CAAE,KAAM,OAAQ,EAAI,CAAE,KAAM,UAAW,OAAQ,oBAAoB,EAAO,EAAE,CAAE,MAAM,aAAc,EACzH,IAAU,EAAI,CAAE,KAAM,QAAS,QAAS,MAAM,EAAO,EAAE,CAAE,MAAM,YAAY,EAAE,iBAAkB,EAAI,CAAE,KAAM,OAAQ,GAOnH,EAAW,KAAK,IAAI,EAAG,GAAG,EAAO,IAAK,GAAO,EAAE,QAAU,MAAQ,OAAO,SAAS,EAAE,KAAK,EAAI,EAAE,MAAQ,CAAE,CAAC,EAEzG,EAAS,EAAQ,EACjB,EAAS,EAAS,EAAI,KAAK,IAAI,IAAK,KAAK,MAAM,EAAQ,GAAI,CAAC,EAC5D,EAAS,EAAS,IAAM,IACxB,EAAQ,KAAK,IAAI,GAAI,EAAQ,EAAS,CAAM,EAC5C,EAAO,EAAS,GAAa,GAC7B,EAAS,EAAK,OAAS,EAAO,EAE9B,EAAU,IAAa,GAAG,EAAM,IAAM,EACzC,KAAK,EAAG,IAAM,GAAG,EAAE,MAAM,MAAM,GAAG,EAAE,QAAU,KAAO,UAAY,EAAY,EAAE,KAAK,IAAI,EAAI,EAAI,KAAK,EAAe,EAAG,CAAC,EAAE,GAAK,IAAI,CAAC,CACpI,KAAK,IAAI,EAAI,IAShB,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CACS,QACM,cACL,SACR,OAAQ,GACR,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,QAAS,EAAgB,QAAA,CAZ7C,CAAE,IAAK,QAAS,MAAO,QAAS,OAAS,GAAM,EAAE,MAAM,KAAM,EAC7D,CAAE,IAAK,QAAS,MAAO,QAAS,QAAS,GAAM,OAAS,GAAO,EAAE,QAAU,KAAO,IAAM,EAAY,EAAE,KAAK,CAAG,EAC9G,CAAE,IAAK,OAAQ,MAAO,cAAe,QAAS,GAAM,OAAS,GAAO,EAAE,aAAe,KAAO,IAAM,EAAc,EAAE,WAAY,CAAC,CAAG,EAClI,CAAE,IAAK,QAAS,MAAO,WAAY,QAAS,GAAM,OAAS,GAAO,EAAE,UAAY,KAAO,IAAM,EAAc,EAAE,QAAS,CAAC,CAAG,CAS7E,EAAe,OAAM,OAAS,GAAM,EAAE,MAAM,EAAK,CAAA,EAE5F,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,IAAK,EAAS,UAAW,EAAK,SACjC,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAK,IAAY,QAAe,SAAQ,QAAS,OAAO,EAAM,GAAG,IAAU,KAAK,MAAM,aAAY,EAC/G,SAAA,EAAK,KAAK,EAAG,IAAM,CAClB,IAAM,EAAI,EAAI,GAAQ,EAAS,GAAK,GAC9B,EAAO,EAAE,QAAU,MAAQ,EAAE,EAAE,MAAQ,IAAM,GAAY,EAAI,EAAI,KAAK,IAAI,EAAI,EAAE,MAAQ,EAAY,CAAK,EACzG,EAAQ,EAAI,EAAQ,EAC1B,OACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAoB,aAAY,EAAE,MAAM,GAAxC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,MAAO,EAAG,EAAS,EAAI,EAAS,GAAI,EAAG,EAAS,EAAI,EAAI,EAAO,GAAI,EAAS,IAAA,GAAY,SAAU,WAAY,EAAS,QAAU,MACpJ,SAAA,EAAE,MAAM,KACL,CAAA,GAKN,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,QAAQ,UAAW,EAAK,WAAY,EAAG,EAAW,IAAG,MAAO,EAAO,OAAQ,EAAO,GAAI,CAAI,CAAA,EACzG,EAAE,QAAU,MACX,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,eAAa,OAAO,UAAW,EAAK,OAAQ,EAAG,EAAW,IAAG,MAAO,KAAK,IAAI,EAAO,EAAE,EAAG,OAAQ,EAAO,GAAI,CAAI,CAAA,EACpH,EAAO,GACT,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,YAAU,MAAM,EAAG,EAAgB,EAAQ,EAAG,EAAM,CAAK,EAAG,KAAM,CAAQ,CAAA,EAC9E,MACJ,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAK,YAAa,EAAG,EAAS,EAAQ,GAAI,EAAG,EAAO,GAAG,SAAxE,SAAA,CACG,EAAE,QAAU,KAAO,UAAY,EAAY,EAAE,KAAK,EAClD,EAAI,GAAI,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAK,KAAM,GAAI,EAAI,SAAA,EAAe,EAAG,CAAC,CAAS,CAAA,EAAI,IAC1E,GACL,CAlBK,EAAA,EAAE,MAAM,EAkBb,CAEP,CAAC,CACE,CAAA,CACF,CAAA,CACK,CAAA,CAEhB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,i as t,n,s as r}from"./index-BVxOlseC.js";import{g as i}from"./global-oEl9Qj8u.js";import{a,c as o,s}from"./command-catalog-Bb_PxC5w.js";import{C as c,O as l,h as u}from"./verse-ui-store-62DxpVHS.js";import{A as d,D as f,N as p,j as m}from"./VerseConsoleApp-DTjDpGCd.js";import{u as h}from"./icons-DEQa2rTx.js";import"./verse-icons-F9VwX07_.js";var g=r(e(),1),_=r(t(),1),v={menu:`_menu_bwc3k_3`,pop:`_pop_bwc3k_1`,item:`_item_bwc3k_16`,icon:`_icon_bwc3k_33`,check:`_check_bwc3k_40`,label:`_label_bwc3k_49`,key:`_key_bwc3k_51`,separator:`_separator_bwc3k_57`,groupLabel:`_groupLabel_bwc3k_62`},y=n();function b(e){let t=s(e)?.keys[0];return t?o(t,a()):null}var x=[{value:`system`,label:`Match system`},{value:`light`,label:`Light`},{value:`dark`,label:`Dark`}];function S({open:e,anchorRef:t,onClose:n,compact:r}){let a=p(),o=i(),s=(0,g.useRef)(null),[S,C]=(0,g.useState)(0),[w,T]=(0,g.useState)(null),E=[{key:`settings`,role:`menuitem`,label:`Settings`,icon:(0,y.jsx)(d,{}),shortcut:b(`section.settings`),run:()=>c(`settings`)},{key:`apps`,role:`menuitem`,label:`Apps & Accounts`,icon:(0,y.jsx)(f,{}),run:()=>c(`apps`)},{key:`usage`,role:`menuitem`,label:`Usage`,icon:(0,y.jsx)(m,{}),run:()=>c(`usage`)},{key:`shortcuts`,role:`menuitem`,label:`Keyboard shortcuts`,icon:(0,y.jsx)(h,{}),shortcut:b(`shortcuts.open`),run:()=>u(`shortcuts`)},...r?[]:[{key:`rail`,role:`menuitemcheckbox`,label:`Show rail labels`,shortcut:b(`rail.toggle-labels`),checked:a.railExpanded,run:l,stay:!0}],...x.map(e=>({key:`theme-${e.value}`,role:`menuitemradio`,label:e.label,checked:o.theme===e.value,run:()=>o.set(e.value),stay:!0}))];(0,g.useLayoutEffect)(()=>{if(!e)return;let n=t.current?.getBoundingClientRect();n&&T(r?{left:8,bottom:Math.max(8,window.innerHeight-n.top+8)}:{left:n.right+8,bottom:Math.max(8,window.innerHeight-n.bottom)})},[e,t,r]);let[D,O]=(0,g.useState)(e);e!==D&&(O(e),e&&C(0));let k=(0,g.useRef)(n);k.current=n,(0,g.useEffect)(()=>{if(!e)return;function n(e){let n=e.target;s.current?.contains(n)||t.current?.contains(n)||k.current()}return document.addEventListener(`mousedown`,n),()=>document.removeEventListener(`mousedown`,n)},[e,t]);let A=w!==null;(0,g.useEffect)(()=>{e&&A&&s.current?.querySelector(`[data-index="${S}"]`)?.focus()},[S,e,A]);let j=(0,g.useRef)(!1);if((0,g.useEffect)(()=>{!e&&j.current&&(j.current=!1,t.current?.focus())},[e,t]),!e)return null;function M(e=!0){j.current=e,n()}function N(e){e.run(),e.stay||M(!1)}function P(e){let t=E.length;switch(e.key){case`ArrowDown`:e.preventDefault(),C(e=>(e+1)%t);break;case`ArrowUp`:e.preventDefault(),C(e=>(e-1+t)%t);break;case`Home`:e.preventDefault(),C(0);break;case`End`:e.preventDefault(),C(t-1);break;case`Escape`:e.preventDefault(),e.stopPropagation(),M();break;case`Tab`:M(!1)}}let F=E.findIndex(e=>e.key.startsWith(`theme-`));return(0,_.createPortal)((0,y.jsx)(`div`,{ref:s,role:`menu`,"aria-label":`Settings and more`,className:v.menu,"data-compact":r||void 0,style:w?{left:w.left,bottom:w.bottom}:{visibility:`hidden`},onKeyDown:P,children:E.map((e,t)=>(0,y.jsxs)(`div`,{role:`none`,children:[t===F?(0,y.jsx)(`div`,{role:`separator`,className:v.separator,children:(0,y.jsx)(`span`,{className:v.groupLabel,children:`Theme`})}):null,e.key===`rail`?(0,y.jsx)(`div`,{role:`separator`,className:v.separator}):null,(0,y.jsxs)(`button`,{type:`button`,role:e.role,"data-index":t,tabIndex:t===S?0:-1,"aria-checked":e.role===`menuitem`?void 0:e.checked===!0,className:v.item,onClick:()=>N(e),onMouseMove:()=>t!==S&&C(t),children:[(0,y.jsx)(`span`,{className:v.icon,"aria-hidden":`true`,children:e.role===`menuitem`?e.icon:e.checked?(0,y.jsx)(`span`,{className:v.check}):null}),(0,y.jsx)(`span`,{className:v.label,children:e.label}),e.shortcut?(0,y.jsx)(`kbd`,{className:v.key,children:e.shortcut}):null]})]},e.key))}),document.body)}export{S as GearTray};
|
|
2
|
+
//# sourceMappingURL=GearTray-Cb2npoxM.js.map
|