@ashlr/hub 3.11.3 → 3.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +44 -18
- package/dist/authority-surface.json +74 -59
- package/dist/build-identity.json +2 -2
- package/dist/cli/authority.d.ts +39 -0
- package/dist/cli/authority.js +222 -55
- package/dist/cli/authority.js.map +1 -1
- package/dist/cli/help.js +1 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/verse.d.ts +3 -0
- package/dist/cli/verse.js +10 -0
- package/dist/cli/verse.js.map +1 -1
- package/dist/core/authority/trust-roots.js +7 -1
- package/dist/core/authority/trust-roots.js.map +1 -1
- package/dist/core/authority/types.d.ts +2 -2
- package/dist/core/cloud/cloud-api.js +1 -1
- package/dist/core/cloud/cloud-api.js.map +1 -1
- package/dist/core/cloud/delivery-contract.d.ts +1 -1
- package/dist/core/cloud/delivery-contract.js +25 -15
- package/dist/core/cloud/delivery-contract.js.map +1 -1
- package/dist/core/cloud/store.js +6 -0
- package/dist/core/cloud/store.js.map +1 -1
- package/dist/core/cloud/tracker.d.ts +2 -0
- package/dist/core/cloud/tracker.js +140 -37
- package/dist/core/cloud/tracker.js.map +1 -1
- package/dist/core/cloud/types.d.ts +9 -1
- package/dist/core/cloud/types.js.map +1 -1
- package/dist/core/comms/dispatch.d.ts +5 -0
- package/dist/core/comms/dispatch.js +12 -1
- package/dist/core/comms/dispatch.js.map +1 -1
- package/dist/core/comms/requests.d.ts +27 -1
- package/dist/core/comms/requests.js +50 -1
- package/dist/core/comms/requests.js.map +1 -1
- package/dist/core/daemon/loop.d.ts +14 -0
- package/dist/core/daemon/loop.js +35 -0
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/fabric/claude-usage.js +23 -1
- package/dist/core/fabric/claude-usage.js.map +1 -1
- package/dist/core/fleet/dispatch-router.d.ts +7 -0
- package/dist/core/fleet/dispatch-router.js +4 -1
- package/dist/core/fleet/dispatch-router.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +5 -1
- package/dist/core/fleet/tick-hooks-live.js +10 -1
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/local-runtime/llama/config.d.ts +14 -0
- package/dist/core/local-runtime/llama/config.js +20 -2
- package/dist/core/local-runtime/llama/config.js.map +1 -1
- package/dist/core/local-runtime/llama/process.d.ts +19 -0
- package/dist/core/local-runtime/llama/process.js +67 -17
- package/dist/core/local-runtime/llama/process.js.map +1 -1
- package/dist/core/local-runtime/llama/supervisor.js +14 -3
- package/dist/core/local-runtime/llama/supervisor.js.map +1 -1
- package/dist/core/observability/rollup.d.ts +12 -0
- package/dist/core/observability/rollup.js +37 -2
- package/dist/core/observability/rollup.js.map +1 -1
- package/dist/core/observability/usage-source.js +49 -1
- package/dist/core/observability/usage-source.js.map +1 -1
- package/dist/core/resources/connection-monitor.js +47 -4
- package/dist/core/resources/connection-monitor.js.map +1 -1
- package/dist/core/resources/engineering-mission-store.d.ts +1 -1
- package/dist/core/routing/headroom.js +7 -2
- package/dist/core/routing/headroom.js.map +1 -1
- package/dist/core/routing/router.d.ts +48 -0
- package/dist/core/routing/router.js +129 -13
- package/dist/core/routing/router.js.map +1 -1
- package/dist/core/run/best-of-n.d.ts +7 -0
- package/dist/core/run/best-of-n.js +3 -0
- package/dist/core/run/best-of-n.js.map +1 -1
- package/dist/core/run/harness-dispatch.d.ts +147 -0
- package/dist/core/run/harness-dispatch.js +234 -0
- package/dist/core/run/harness-dispatch.js.map +1 -0
- package/dist/core/run/orchestrator.js +3 -0
- package/dist/core/run/orchestrator.js.map +1 -1
- package/dist/core/run/provider-client.d.ts +8 -0
- package/dist/core/run/provider-client.js +4 -0
- package/dist/core/run/provider-client.js.map +1 -1
- package/dist/core/run/sandboxed-engine.d.ts +8 -0
- package/dist/core/run/sandboxed-engine.js +60 -7
- package/dist/core/run/sandboxed-engine.js.map +1 -1
- package/dist/core/types.d.ts +14 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +188 -6
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +187 -5
- package/dist/core/universe/firm-demo.d.ts +1 -1
- package/dist/core/universe/firm-graph.d.ts +2 -2
- package/dist/core/util/scrub.js +16 -3
- package/dist/core/util/scrub.js.map +1 -1
- package/dist/core/verse/accounts.d.ts +9 -1
- package/dist/core/verse/accounts.js +52 -11
- package/dist/core/verse/accounts.js.map +1 -1
- package/dist/core/verse/apps-api.d.ts +12 -0
- package/dist/core/verse/apps-api.js +22 -4
- package/dist/core/verse/apps-api.js.map +1 -1
- package/dist/core/verse/apps.js +22 -12
- package/dist/core/verse/apps.js.map +1 -1
- package/dist/core/verse/local-models.js +3 -7
- package/dist/core/verse/local-models.js.map +1 -1
- package/dist/core/verse/model-display-name.d.ts +34 -0
- package/dist/core/verse/model-display-name.js +125 -0
- package/dist/core/verse/model-display-name.js.map +1 -0
- package/dist/core/verse/seats.d.ts +11 -2
- package/dist/core/verse/seats.js +42 -18
- package/dist/core/verse/seats.js.map +1 -1
- package/dist/core/verse/transient-events.d.ts +21 -0
- package/dist/core/verse/transient-events.js +12 -0
- package/dist/core/verse/transient-events.js.map +1 -0
- package/dist/core/verse/types.d.ts +6 -13
- package/dist/core/verse/types.js +5 -36
- package/dist/core/verse/types.js.map +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-B4-39f2S.js +2 -0
- package/dist/core/web/public/next/assets/{ActionMenu-FxXeRbPx.js.map → ActionMenu-B4-39f2S.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js.map +1 -0
- package/dist/core/web/public/next/assets/App-E2zCDRxm.js +7 -0
- package/dist/core/web/public/next/assets/App-E2zCDRxm.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +2 -0
- package/dist/core/web/public/next/assets/{AreaTrend-CDxrQU4b.js.map → AreaTrend-BFimExYn.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-DuQkHGD_.js.map → AutonomySection-B46igJKR.js.map} +1 -1
- package/dist/core/web/public/next/assets/BranchBar-BRkrEQGs.js +2 -0
- package/dist/core/web/public/next/assets/{BranchBar-CLsvOcyK.js.map → BranchBar-BRkrEQGs.js.map} +1 -1
- package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +2 -0
- package/dist/core/web/public/next/assets/{BudgetControl-TL3FeZ1D.js.map → BudgetControl-T_RjPrw9.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Button-HHXgoXGr.js → Button-BhO-WKPp.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-HHXgoXGr.js.map → Button-BhO-WKPp.js.map} +1 -1
- package/dist/core/web/public/next/assets/CapacityStrip-CkFz5vq2.js +2 -0
- package/dist/core/web/public/next/assets/{CapacityStrip-qReu0RaF.js.map → CapacityStrip-CkFz5vq2.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useChartWidth-BW6SwYIK.css → ChartFrame-BVuBe6RP.css} +1 -1
- package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-Bd91iStN.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-Bd91iStN.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +2 -0
- package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +2 -0
- package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-Bv4hdK2T.js +2 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-DLrLKM0c.js.map → ConfirmDialog-Bv4hdK2T.js.map} +1 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-CH1Ix8Eh.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-CH1Ix8Eh.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-BSsIFNqD.js +2 -0
- package/dist/core/web/public/next/assets/{Dialog-BS9Dxi3G.js.map → Dialog-BSsIFNqD.js.map} +1 -1
- package/dist/core/web/public/next/assets/DiffPane-BpNuJmth.js +2 -0
- package/dist/core/web/public/next/assets/{DiffPane-TOmUf3b2.js.map → DiffPane-BpNuJmth.js.map} +1 -1
- package/dist/core/web/public/next/assets/DiffViewer-CJarUvs0.js +2 -0
- package/dist/core/web/public/next/assets/{DiffViewer-BpH56302.js.map → DiffViewer-CJarUvs0.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js.map +1 -0
- package/dist/core/web/public/next/assets/{EmptyState-BqR5YAmf.js → EmptyState-DPrd2aak.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-BqR5YAmf.js.map → EmptyState-DPrd2aak.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-dhvDTwAZ.js → Epistemic-D7MxSmED.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-dhvDTwAZ.js.map → Epistemic-D7MxSmED.js.map} +1 -1
- package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +3 -0
- package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +2 -0
- package/dist/core/web/public/next/assets/{Funnel-D2u7Wlzc.js.map → Funnel-BeNQZWv2.js.map} +1 -1
- package/dist/core/web/public/next/assets/GearTray-CIPtzeIx.js +2 -0
- package/dist/core/web/public/next/assets/{GearTray-Cb2npoxM.js.map → GearTray-CIPtzeIx.js.map} +1 -1
- package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +2 -0
- package/dist/core/web/public/next/assets/{GrowthSection-C5aDPs8B.js.map → GrowthSection-iiQg6wvK.js.map} +1 -1
- package/dist/core/web/public/next/assets/HandoffDialog-DrQ6ofuy.js +2 -0
- package/dist/core/web/public/next/assets/{HandoffDialog-BF3AYg-X.js.map → HandoffDialog-DrQ6ofuy.js.map} +1 -1
- package/dist/core/web/public/next/assets/Input-C0MQxEM6.js +2 -0
- package/dist/core/web/public/next/assets/{Input-B5dmGLZx.js.map → Input-C0MQxEM6.js.map} +1 -1
- package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +2 -0
- package/dist/core/web/public/next/assets/{MatrixHeatmap-BgEUs2Eu.js.map → MatrixHeatmap-DZvZeWXL.js.map} +1 -1
- package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-DZkiOuoq.js.map → McpSection-BRuCcTjT.js.map} +1 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-bRvD5nSc.js +3 -0
- package/dist/core/web/public/next/assets/{MessageMarkdown-BauY8ZTY.js.map → MessageMarkdown-bRvD5nSc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DLBNLfsn.js → MessageMarkdownRenderer-FjjkPKA2.js} +4 -4
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DLBNLfsn.js.map → MessageMarkdownRenderer-FjjkPKA2.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-DNeocJnD.js → Meter-CFNLpwA-.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-DNeocJnD.js.map → Meter-CFNLpwA-.js.map} +1 -1
- package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +2 -0
- package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-T7gv3a9r.js +2 -0
- package/dist/core/web/public/next/assets/{MutationTokenDialog-mxrw0Yvy.js.map → MutationTokenDialog-T7gv3a9r.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +2 -0
- package/dist/core/web/public/next/assets/{NeedsYouDrawer-CO-Balfp.js.map → NeedsYouDrawer-lYN4G_aM.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +2 -0
- package/dist/core/web/public/next/assets/{NeedsYouList-CzDZbzRD.js.map → NeedsYouList-BgH8ezqf.js.map} +1 -1
- package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +3 -0
- package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-HUNQGQuU.css +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +2 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +2 -0
- package/dist/core/web/public/next/assets/{PreviewPane-BS-CleCd.js.map → PreviewPane-BPBbcROb.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ProviderLogo-C5mBg8i0.js → ProviderLogo-CT2cSfkg.js} +2 -2
- package/dist/core/web/public/next/assets/{ProviderLogo-C5mBg8i0.js.map → ProviderLogo-CT2cSfkg.js.map} +1 -1
- package/dist/core/web/public/next/assets/RailStatus-Vgl0GYtd.js +2 -0
- package/dist/core/web/public/next/assets/{RailStatus-cPRyOmrk.js.map → RailStatus-Vgl0GYtd.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-CMwSCiz5.js → RefreshIndicator-CSyqpY_q.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-CMwSCiz5.js.map → RefreshIndicator-CSyqpY_q.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BFi1opsC.js → ResourcePoolConsoleApp-BX2nkdmZ.js} +4 -4
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BFi1opsC.js.map → ResourcePoolConsoleApp-BX2nkdmZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +2 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaC7YVzR.js +2 -0
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-DYtwc2ja.js.map → RouteErrorBoundary-BaC7YVzR.js.map} +1 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-D5PDHJPE.js +2 -0
- package/dist/core/web/public/next/assets/{RunInCloudAction-BEGEEM8O.js.map → RunInCloudAction-D5PDHJPE.js.map} +1 -1
- package/dist/core/web/public/next/assets/SeatSelector-Cg75LInq.js +3 -0
- package/dist/core/web/public/next/assets/{SeatSelector-CYHRR7Wp.js.map → SeatSelector-Cg75LInq.js.map} +1 -1
- package/dist/core/web/public/next/assets/Segmented-CametjLt.js +2 -0
- package/dist/core/web/public/next/assets/{Segmented-BE53BenI.js.map → Segmented-CametjLt.js.map} +1 -1
- package/dist/core/web/public/next/assets/Select-De52fghU.js +2 -0
- package/dist/core/web/public/next/assets/{Select-BwSGkHCS.js.map → Select-De52fghU.js.map} +1 -1
- package/dist/core/web/public/next/assets/SessionGate-CzlcNq3O.js +2 -0
- package/dist/core/web/public/next/assets/{SessionGate-e0dFJm9d.js.map → SessionGate-CzlcNq3O.js.map} +1 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-Bk_Owa7u.js +2 -0
- package/dist/core/web/public/next/assets/{SessionInsightChip-CxlSyueJ.js.map → SessionInsightChip-Bk_Owa7u.js.map} +1 -1
- package/dist/core/web/public/next/assets/SessionSearch-C6C8DHN8.js +2 -0
- package/dist/core/web/public/next/assets/{SessionSearch-_yp7S2TP.js.map → SessionSearch-C6C8DHN8.js.map} +1 -1
- package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-CJhK9Dqv.js +2 -0
- package/dist/core/web/public/next/assets/{Sheet-DVP2Mgy6.js.map → Sheet-CJhK9Dqv.js.map} +1 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-DDW-i9Fc.js +2 -0
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-BcIcoClX.js.map → ShortcutsOverlay-DDW-i9Fc.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-Bwd9HfXl.js +2 -0
- package/dist/core/web/public/next/assets/{Slider-BypUWjpH.js.map → Slider-Bwd9HfXl.js.map} +1 -1
- package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +1 -0
- package/dist/core/web/public/next/assets/{StatusBadge-HCZp416_.js → StatusBadge-DHKRtttH.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-HCZp416_.js.map → StatusBadge-DHKRtttH.js.map} +1 -1
- package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +2 -0
- package/dist/core/web/public/next/assets/{StepBand-Duz1PUes.js.map → StepBand-DQykLkk_.js.map} +1 -1
- package/dist/core/web/public/next/assets/Surface-D--LXgQm.js +2 -0
- package/dist/core/web/public/next/assets/Surface-D--LXgQm.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-e1z6GdZt.css +1 -0
- package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +2 -0
- package/dist/core/web/public/next/assets/{Swimlane-DGcIcnNA.js.map → Swimlane-BzH6OCee.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Switch-iveI-8NY.js → Switch-PMixU6b0.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-iveI-8NY.js.map → Switch-PMixU6b0.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-DH15CUJp.js → Tag-fordBsrJ.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-DH15CUJp.js.map → Tag-fordBsrJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/TerminalPane-BSnGdUuF.js +7 -0
- package/dist/core/web/public/next/assets/TerminalPane-BSnGdUuF.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-C8yQ0AaR.js.map → UniverseConsoleApp-DtXFhAhw.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-_nPURPqe.js → UniverseView-sWm3pnTW.js} +3 -3
- package/dist/core/web/public/next/assets/{UniverseView-_nPURPqe.js.map → UniverseView-sWm3pnTW.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +10 -0
- package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-BmIf9avl.css +1 -0
- package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +2 -0
- package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-DlwnfqwJ.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-DlwnfqwJ.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-BFuPezSo.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-BFuPezSo.js.map +1 -0
- package/dist/core/web/public/next/assets/binding-left-DZpq5sLf.js +2 -0
- package/dist/core/web/public/next/assets/binding-left-DZpq5sLf.js.map +1 -0
- package/dist/core/web/public/next/assets/{budget-queries-V3wcJVK_.js → budget-queries-DsAjH8ac.js} +2 -2
- package/dist/core/web/public/next/assets/{budget-queries-V3wcJVK_.js.map → budget-queries-DsAjH8ac.js.map} +1 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-Dn1cNOhz.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-Dn1cNOhz.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +2 -0
- package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +1 -0
- package/dist/core/web/public/next/assets/clipboard-DkZdqlxf.js +2 -0
- package/dist/core/web/public/next/assets/clipboard-DkZdqlxf.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-D-HXms6q.css +1 -0
- package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +2 -0
- package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-QAhpExlz.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-QAhpExlz.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud.module-DOP-N4Ch.js +2 -0
- package/dist/core/web/public/next/assets/cloud.module-DOP-N4Ch.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +1 -0
- package/dist/core/web/public/next/assets/context-model-Co4wh3SM.js +2 -0
- package/dist/core/web/public/next/assets/context-model-Co4wh3SM.js.map +1 -0
- package/dist/core/web/public/next/assets/context-model-DV1zCfAm.js +3 -0
- package/dist/core/web/public/next/assets/context-model-DV1zCfAm.js.map +1 -0
- package/dist/core/web/public/next/assets/{context-queries-CrPcHWTz.js → context-queries-CktFQqSS.js} +2 -2
- package/dist/core/web/public/next/assets/{context-queries-CrPcHWTz.js.map → context-queries-CktFQqSS.js.map} +1 -1
- package/dist/core/web/public/next/assets/{control-queries-CmgBgKV7.js → control-queries-DAvlh_YM.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-CmgBgKV7.js.map → control-queries-DAvlh_YM.js.map} +1 -1
- package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-BFuBbqJl.js +2 -0
- package/dist/core/web/public/next/assets/{dock-icons-CUh8dOxJ.js.map → dock-icons-BFuBbqJl.js.map} +1 -1
- package/dist/core/web/public/next/assets/fleet-model-Dfd5JyLR.js +2 -0
- package/dist/core/web/public/next/assets/fleet-model-Dfd5JyLR.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-RtMTd5rR.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-RtMTd5rR.js.map +1 -0
- package/dist/core/web/public/next/assets/{focus-trap-HtcoXeEq.js → focus-trap-BdrbWfC4.js} +2 -2
- package/dist/core/web/public/next/assets/{focus-trap-HtcoXeEq.js.map → focus-trap-BdrbWfC4.js.map} +1 -1
- package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +2 -0
- package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +1 -0
- package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js → git-model-_BnI_Ogh.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js.map → git-model-_BnI_Ogh.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-CNNGMril.js +2 -0
- package/dist/core/web/public/next/assets/{global-oEl9Qj8u.js.map → global-CNNGMril.js.map} +1 -1
- package/dist/core/web/public/next/assets/{guarded-runners-LHLXmXIk.js → guarded-runners-DPh2d32e.js} +2 -2
- package/dist/core/web/public/next/assets/{guarded-runners-LHLXmXIk.js.map → guarded-runners-DPh2d32e.js.map} +1 -1
- package/dist/core/web/public/next/assets/icons-0haWy6nh.js +2 -0
- package/dist/core/web/public/next/assets/icons-0haWy6nh.js.map +1 -0
- package/dist/core/web/public/next/assets/{index-BVxOlseC.js → index-QesfXBsb.js} +3 -3
- package/dist/core/web/public/next/assets/{index-BVxOlseC.js.map → index-QesfXBsb.js.map} +1 -1
- package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js +2 -0
- package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +1 -0
- package/dist/core/web/public/next/assets/local-model-C9xNi9fN.js +2 -0
- package/dist/core/web/public/next/assets/local-model-C9xNi9fN.js.map +1 -0
- package/dist/core/web/public/next/assets/mind.module-BrK2nFOL.js +2 -0
- package/dist/core/web/public/next/assets/{mind.module-gTGAuJt1.js.map → mind.module-BrK2nFOL.js.map} +1 -1
- package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-C5S7okTW.js.map → mutations-DTCtKCn_.js.map} +1 -1
- package/dist/core/web/public/next/assets/nav-KmGX0CVz.js +2 -0
- package/dist/core/web/public/next/assets/{nav-NVtnuG7A.js.map → nav-KmGX0CVz.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-DGm3qL1b.js → overnight-queries-mlO0xzsr.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-DGm3qL1b.js.map → overnight-queries-mlO0xzsr.js.map} +1 -1
- package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +1 -0
- package/dist/core/web/public/next/assets/{queries-CYisSAAB.js → queries-CyBE8nsW.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-CYisSAAB.js.map → queries-CyBE8nsW.js.map} +1 -1
- package/dist/core/web/public/next/assets/reasoning-pref-CaoA4_Vl.js +2 -0
- package/dist/core/web/public/next/assets/{reasoning-pref-BUcFF_5G.js.map → reasoning-pref-CaoA4_Vl.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reveal-anchor-D-tV8xau.js → reveal-anchor-BP1VqnPU.js} +2 -2
- package/dist/core/web/public/next/assets/{reveal-anchor-D-tV8xau.js.map → reveal-anchor-BP1VqnPU.js.map} +1 -1
- package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +2 -0
- package/dist/core/web/public/next/assets/{seat-subscription-B-f9ViU2.js.map → seat-subscription-C5Tvr0WQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-DQ-FyBHW.js → sidebar-model-B5Qk95k_.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-DQ-FyBHW.js.map → sidebar-model-B5Qk95k_.js.map} +1 -1
- package/dist/core/web/public/next/assets/slots-DHKQDoE6.js +3 -0
- package/dist/core/web/public/next/assets/{slots-BhP8b8tf.js.map → slots-DHKQDoE6.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-data-CchClvHo.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-CchClvHo.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +1 -0
- package/dist/core/web/public/next/assets/{tasks-model-BKDNqmmt.js → tasks-model-D6WFVULI.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-BKDNqmmt.js.map → tasks-model-D6WFVULI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-D2xe-aM1.js → terminal-icons-BvCvuXk2.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-D2xe-aM1.js.map → terminal-icons-BvCvuXk2.js.map} +1 -1
- package/dist/core/web/public/next/assets/transient-events-nTLhMBND.js +2 -0
- package/dist/core/web/public/next/assets/transient-events-nTLhMBND.js.map +1 -0
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -1
- package/dist/core/web/public/next/assets/{usage-queries-BZuAANlI.js → usage-queries-D1SU1t7r.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-BZuAANlI.js.map → usage-queries-D1SU1t7r.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-Cf4MeNBa.js → use-guarded-action-BZmBv7CJ.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-Cf4MeNBa.js.map → use-guarded-action-BZmBv7CJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-D9yi49my.js → use-ticker-CkJ4-0wU.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-D9yi49my.js.map → use-ticker-CkJ4-0wU.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-token-gate-DqrSXdX6.js → use-token-gate-CYcfk_GS.js} +2 -2
- package/dist/core/web/public/next/assets/{use-token-gate-DqrSXdX6.js.map → use-token-gate-CYcfk_GS.js.map} +1 -1
- package/dist/core/web/public/next/assets/useOnboarding-CujRS6PK.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-CujRS6PK.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-BEaQdkZs.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-BEaQdkZs.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BQ0J6Xhx.js +2 -0
- package/dist/core/web/public/next/assets/{useVerseTranscript-CDYrrWOO.js.map → useVerseTranscript-BQ0J6Xhx.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-icons-DndgEgKS.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-DndgEgKS.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-MMySehjj.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-store-DNVRuiJL.js +2 -0
- package/dist/core/web/public/next/assets/verse-store-DNVRuiJL.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-CNEH_-be.js +3 -0
- package/dist/core/web/public/next/assets/{warmup-HG5vYbsN.js.map → warmup-CNEH_-be.js.map} +1 -1
- package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +2 -0
- package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +1 -0
- package/dist/core/web/public/next/assets/{workspace-model-CbhdPhei.js → workspace-model-Dukb2wwv.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-CbhdPhei.js.map → workspace-model-Dukb2wwv.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/docs/README.md +2 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-FxXeRbPx.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-D_eS4472.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-D_eS4472.js.map +0 -1
- package/dist/core/web/public/next/assets/App-Cj4zKbG3.js +0 -7
- package/dist/core/web/public/next/assets/App-Cj4zKbG3.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-CDxrQU4b.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-DuQkHGD_.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-CLsvOcyK.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-TL3FeZ1D.js +0 -2
- package/dist/core/web/public/next/assets/BurnDown-sFXkUGdB.js +0 -2
- package/dist/core/web/public/next/assets/BurnDown-sFXkUGdB.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-qReu0RaF.js +0 -2
- package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-DJbiT1wi.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-DJbiT1wi.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js +0 -2
- package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js +0 -2
- package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-DLrLKM0c.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-BS9Dxi3G.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-TOmUf3b2.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-BpH56302.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js +0 -3
- package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-D2u7Wlzc.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-Cb2npoxM.js +0 -2
- package/dist/core/web/public/next/assets/GrowthSection-C5aDPs8B.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-BF3AYg-X.js +0 -2
- package/dist/core/web/public/next/assets/Input-B5dmGLZx.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-BgEUs2Eu.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-DZkiOuoq.js +0 -2
- package/dist/core/web/public/next/assets/MessageMarkdown-BauY8ZTY.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-mxrw0Yvy.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouDrawer-CO-Balfp.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-CzDZbzRD.js +0 -2
- package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js +0 -3
- package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js +0 -2
- package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-DSpPj8UE.css +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-BS-CleCd.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-cPRyOmrk.js +0 -2
- package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js +0 -2
- package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DYtwc2ja.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-BEGEEM8O.js +0 -2
- package/dist/core/web/public/next/assets/SeatSelector-CYHRR7Wp.js +0 -3
- package/dist/core/web/public/next/assets/Segmented-BE53BenI.js +0 -2
- package/dist/core/web/public/next/assets/Select-BwSGkHCS.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-e0dFJm9d.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-CxlSyueJ.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-_yp7S2TP.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-DVP2Mgy6.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-BcIcoClX.js +0 -2
- package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-BypUWjpH.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-Duz1PUes.js +0 -2
- package/dist/core/web/public/next/assets/Surface-B75lVfzm.js +0 -2
- package/dist/core/web/public/next/assets/Surface-B75lVfzm.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-DMca0gAe.css +0 -1
- package/dist/core/web/public/next/assets/Swimlane-DGcIcnNA.js +0 -2
- package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js +0 -7
- package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-C8yQ0AaR.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js +0 -10
- package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +0 -1
- package/dist/core/web/public/next/assets/actions-tWevL9HV.js +0 -2
- package/dist/core/web/public/next/assets/actions-tWevL9HV.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-BDbmQ3e3.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-BDbmQ3e3.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-CfAjuKMv.js +0 -2
- package/dist/core/web/public/next/assets/charts-CfAjuKMv.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-uSX6xVYN.css +0 -1
- package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud.module-ascz58c3.js +0 -2
- package/dist/core/web/public/next/assets/cloud.module-ascz58c3.js.map +0 -1
- package/dist/core/web/public/next/assets/command-bus-xYZoK9nQ.js +0 -2
- package/dist/core/web/public/next/assets/command-bus-xYZoK9nQ.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-keys-su0g1h9o.js +0 -2
- package/dist/core/web/public/next/assets/composer-keys-su0g1h9o.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js +0 -2
- package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-CIBmSugV.js +0 -2
- package/dist/core/web/public/next/assets/context-model-CIBmSugV.js.map +0 -1
- package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +0 -2
- package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-CUh8dOxJ.js +0 -2
- package/dist/core/web/public/next/assets/dock-store-B2vlxqPu.js +0 -2
- package/dist/core/web/public/next/assets/dock-store-B2vlxqPu.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-model-7i-FbzKI.js +0 -2
- package/dist/core/web/public/next/assets/fleet-model-7i-FbzKI.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js.map +0 -1
- package/dist/core/web/public/next/assets/format-BkWdOQDL.js +0 -2
- package/dist/core/web/public/next/assets/format-BkWdOQDL.js.map +0 -1
- package/dist/core/web/public/next/assets/global-oEl9Qj8u.js +0 -2
- package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js.map +0 -1
- package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js +0 -2
- package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-DEQa2rTx.js +0 -2
- package/dist/core/web/public/next/assets/icons-DEQa2rTx.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-bmsJgnYD.js +0 -2
- package/dist/core/web/public/next/assets/live-model-bmsJgnYD.js.map +0 -1
- package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +0 -2
- package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +0 -1
- package/dist/core/web/public/next/assets/mind.module-gTGAuJt1.js +0 -2
- package/dist/core/web/public/next/assets/mutations-C5S7okTW.js +0 -2
- package/dist/core/web/public/next/assets/nav-NVtnuG7A.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-DyCKYSBG.js +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-BUcFF_5G.js +0 -2
- package/dist/core/web/public/next/assets/seat-subscription-B-f9ViU2.js +0 -2
- package/dist/core/web/public/next/assets/section-visibility-Yctxu-if.js +0 -2
- package/dist/core/web/public/next/assets/section-visibility-Yctxu-if.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-BhP8b8tf.js +0 -3
- package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js.map +0 -1
- package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js +0 -2
- package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-DgFy-Ph4.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-DgFy-Ph4.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-CDYrrWOO.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js +0 -3
- package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js +0 -3
- package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js.map +0 -1
- package/dist/core/web/public/next/assets/viewport-nTubFCwf.js +0 -2
- package/dist/core/web/public/next/assets/viewport-nTubFCwf.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-HG5vYbsN.js +0 -3
- package/dist/core/web/public/next/assets/workbench-types-DzN-5trg.js +0 -2
- package/dist/core/web/public/next/assets/workbench-types-DzN-5trg.js.map +0 -1
- /package/dist/core/web/public/next/assets/{BurnDown-BuLMsJMx.css → StatTile-BuLMsJMx.css} +0 -0
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{D as r,F as i,K as a,U as o,c as s,i as c,l,m as u,o as d,p as f}from"./global-oEl9Qj8u.js";import{t as p}from"./Dialog-BS9Dxi3G.js";import{t as m}from"./MutationTokenDialog-mxrw0Yvy.js";import{s as h,v as g}from"./workbench-types-DzN-5trg.js";import{s as _}from"./dock-store-B2vlxqPu.js";import{C as v}from"./verse-ui-store-62DxpVHS.js";import{r as y}from"./section-visibility-Yctxu-if.js";import{N as b,r as x,x as S}from"./VerseConsoleApp-DTjDpGCd.js";import{a as C,i as ee,n as w,o as T}from"./CapacityStrip-qReu0RaF.js";import{a as E,i as te,r as D}from"./useSeatsRefresh-DgFy-Ph4.js";import{f as ne,t as O}from"./capacity-strip-model-BDbmQ3e3.js";import{t as k}from"./Button-HHXgoXGr.js";import{a as re,g as ie,h as A,i as j,m as M,n as ae,o as N}from"./icons-DEQa2rTx.js";import{n as oe,t as P}from"./use-token-gate-DqrSXdX6.js";import{o as se}from"./slots-BhP8b8tf.js";import{t as F}from"./Switch-iveI-8NY.js";import{t as ce}from"./BudgetControl-TL3FeZ1D.js";import{t as I}from"./Select-BwSGkHCS.js";import{t as L}from"./Input-B5dmGLZx.js";import{t as R}from"./Sheet-DVP2Mgy6.js";import{a as le,c as z,d as B,f as ue,i as de,l as V,m as H,n as U,o as fe,p as pe,r as W,s as G,t as me,u as he}from"./apps-model-CDFvmsQV.js";var K=n(e(),1),q=t();function ge({tone:e,label:t}){return(0,q.jsxs)(`span`,{className:T.health,"data-tone":e,children:[(0,q.jsx)(`span`,{className:T.healthDot,"aria-hidden":`true`}),t]})}function J({id:e,name:t,monogram:n,engine:r,description:i,version:a,health:o,detail:s,aside:c,children:l}){return(0,q.jsxs)(`li`,{className:T.row,"data-app":e,children:[(0,q.jsx)(C,{monogram:n,engine:r}),(0,q.jsxs)(`div`,{className:T.rowMain,children:[(0,q.jsxs)(`div`,{className:T.rowHead,children:[(0,q.jsx)(`span`,{id:`${e}-name`,className:T.rowName,children:t}),a?(0,q.jsx)(`span`,{className:T.rowVersion,children:a}):null,(0,q.jsx)(ge,{tone:o.tone,label:o.label})]}),(0,q.jsx)(`p`,{className:T.rowDesc,children:i}),s?(0,q.jsx)(`p`,{className:T.rowDetail,children:s}):null,l]}),c?(0,q.jsx)(`div`,{className:T.rowAside,children:c}):null]})}function Y({id:e,title:t,caveat:n,action:r,children:i,headingRef:a}){let o=`apps-group-${e}`;return(0,q.jsxs)(`section`,{className:T.group,"aria-labelledby":o,"data-group":e,children:[(0,q.jsxs)(`div`,{className:T.groupHead,children:[(0,q.jsx)(`h3`,{id:o,ref:a,tabIndex:-1,className:T.groupTitle,children:t}),r]}),n?(0,q.jsx)(`p`,{className:T.caveat,children:n}):null,(0,q.jsx)(`div`,{className:T.card,children:i})]})}var _e=1200;async function ve(e){try{if(typeof navigator<`u`&&navigator.clipboard&&typeof navigator.clipboard.writeText==`function`)return await navigator.clipboard.writeText(e),!0}catch{}if(typeof document>`u`)return!1;let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n=!1;try{n=typeof document.execCommand==`function`&&document.execCommand(`copy`)}catch{n=!1}return t.remove(),n}function X({text:e,label:t,what:n}){let[r,i]=(0,K.useState)(`idle`),a=(0,K.useRef)(null);(0,K.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]);let o=async()=>{let t=await ve(e);i(t?`copied`:`failed`),a.current&&clearTimeout(a.current),a.current=setTimeout(()=>i(`idle`),_e)};return(0,q.jsxs)(`span`,{className:T.pillWrap,children:[(0,q.jsxs)(`button`,{type:`button`,className:T.pill,"data-state":r,onClick:()=>void o(),"aria-label":`Copy ${n}: ${e}`,title:`Copy: ${e}`,children:[(0,q.jsx)(`code`,{className:T.pillText,children:t??e}),(0,q.jsx)(`span`,{className:T.pillIcon,"aria-hidden":`true`,children:r===`copied`?(0,q.jsx)(ae,{size:14}):(0,q.jsx)(N,{size:14})})]}),(0,q.jsx)(`span`,{className:T.visuallyHidden,role:`status`,"aria-live":`polite`,children:r===`copied`?`Copied`:r===`failed`?`Copy failed — select the command and copy it yourself`:``})]})}var Z=ne;function ye(e){return e.slotLanded??se(`terminal-pane`)?e.terminalAvailable===!0?e.activeSessionId===null?{available:!1,reason:`Open a chat first — its terminal hosts the agent.`}:{available:!0,reason:null}:{available:!1,reason:e.terminalReason??`The Verse terminal needs the desktop app.`}:{available:!1,reason:`This build has no Verse terminal yet.`}}function be(e,t){t.via===`native`&&t.model===null?_({newTab:!0,appId:e}):_({newTab:!0,appId:e,via:`ollama`,...t.model===null?{}:{model:t.model}}),v(`chat`)}var xe=`No accounts connected yet. Sign in to Claude Code, Codex or Grok in a terminal, or start Ollama for local models — they show up here within a minute.`;function Se({seats:e,health:t,budget:n,loading:r,reconnecting:i,onReconnect:a,now:o}){let[s,c]=(0,K.useState)(null),[l,u]=(0,K.useState)(!1),[d,f]=(0,K.useState)(null),[h,g]=(0,K.useState)(null),_=oe(),v=(0,K.useId)(),y=(0,K.useId)(),b=(0,K.useRef)(null),x=t!==null,S=async e=>{f(e.seatId),g(null);try{await _.run(`Check ${e.label} again (status commands only — nothing is spent)`,()=>E())&&g({tone:`neutral`,text:`Checked ${e.label} again.`})}catch(e){g({tone:`danger`,text:P(e)})}finally{f(null)}};return(0,q.jsxs)(Y,{id:`accounts`,title:`Accounts`,caveat:`Which accounts you can use now, which are spent and when they reset, and how much autonomy leaves for you.`,children:[r?(0,q.jsx)(`p`,{className:T.loadingLine,"aria-busy":`true`,children:`Reading accounts…`}):(0,q.jsx)(w,{seats:e,health:t,budget:n,labelledBy:`apps-group-accounts`,emptyText:xe,accounts:{healthRead:x,checkingSeatId:d,...o===void 0?{}:{now:o}},renderActions:e=>me(e,O(e,{healthRead:x,...o===void 0?{}:{now:o}})).map(t=>(0,q.jsx)(k,{size:`sm`,variant:t.primary&&t.kind!==`edit-budget`?`primary`:`ghost`,busy:t.kind===`reconnect`&&i===e.seatId||t.kind===`check-again`&&d===e.seatId,"aria-label":`${t.label}: ${e.label}`,onClick:()=>{t.kind===`reconnect`?a(e):t.kind===`check-again`?S(e):t.kind===`fix`?c(e):u(!0)},children:t.label},t.kind))}),(0,q.jsx)(`p`,{className:h?T.accountsNote:T.visuallyHidden,"data-tone":h?.tone,role:`status`,"aria-live":`polite`,children:h?.text??``}),s!==null&&s.connection?.fixCommand?(0,q.jsx)(p,{open:!0,onClose:()=>c(null),titleId:v,title:`Fix ${s.label}`,description:s.connection.word,initialFocusRef:b,children:(0,q.jsxs)(`div`,{className:T.dialogBody,children:[s.connection.reasons.map(e=>(0,q.jsx)(`p`,{children:e},e)),(0,q.jsxs)(`div`,{className:T.commandBlock,children:[(0,q.jsx)(`span`,{className:T.commandLabel,children:`Run this in a terminal`}),(0,q.jsx)(X,{text:Z(s.connection.fixCommand),what:`the fix for ${s.label}`})]}),(0,q.jsx)(`p`,{children:`Verse shows the command and never runs it for you: it changes which CLI this seat is pinned to.`}),(0,q.jsx)(`div`,{className:T.dialogActions,children:(0,q.jsx)(k,{ref:b,variant:`subtle`,onClick:()=>c(null),children:`Done`})})]})}):null,(0,q.jsx)(R,{open:l,onClose:()=>u(!1),titleId:y,title:`Budget`,description:`How much of each seat autonomy may use, and how much is kept for you.`,width:560,children:l?(0,q.jsx)(ce,{}):null}),(0,q.jsx)(m,{open:_.dialog.open,reason:_.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:_.dialog.onClose,onUnlocked:_.dialog.onUnlocked})]})}var Ce=`verse-apps`,we=`verse-terminal-status`;async function Te(e,t){try{return{available:!0,data:await s(e,t)}}catch(e){if(e instanceof d&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return e instanceof d&&e.status===404?{available:!1,reason:`This server is older than Apps & Accounts, so desktop, terminal and local rows are not available.`}:{available:!1,reason:e instanceof d?`The apps check answered HTTP ${e.status}.`:`The apps check could not be reached.`}}}var Q={key:Ce,fetch:e=>Te(h,e)},Ee={key:we,fetch:e=>Te(g,e)};async function De(e,t){let n=r();if(!n)throw new x;let a=await l(e,t,n);return i(),a}async function Oe(){let e=await De(`${h}/refresh`,{});return await a(Ce,D(()=>Promise.resolve({available:!0,data:e}),()=>Q.fetch()),!0),e}async function ke(e,t){let n=await De(`${h}/${encodeURIComponent(e)}/toggle`,{enabled:t,confirm:!0});return a(Ce,()=>Q.fetch(),!0),n}function Ae(e,t){return De(`${h}/${encodeURIComponent(e)}/launch`,{root:t.root,...t.via?{via:t.via}:{},...t.model?{model:t.model}:{}})}function je({row:e,enable:t,busy:n,error:r,onCancel:i,onConfirm:a}){let o=(0,K.useId)(),s=(0,K.useRef)(null);if(e===null||e.toggle===null)return null;let c=t?e.toggle.command:e.toggle.restoreCommand,l=t?e.toggle.restoreCommand:e.toggle.command,u=t?`Turn on “${e.description}”?`:`Restore ${e.name}?`;return(0,q.jsx)(p,{open:!0,onClose:i,titleId:o,title:u,initialFocusRef:s,description:t?`This changes ${e.name}’s own settings until you restore it.`:`This puts ${e.name} back on its own defaults.`,children:(0,q.jsxs)(`div`,{className:T.dialogBody,children:[e.detail?(0,q.jsx)(`p`,{children:e.detail}):null,t&&e.id===`claude-desktop`?(0,q.jsx)(`p`,{children:`Recommended: leave this off. Claude Desktop would run local models instead of its own, and Verse’s local seats already use Ollama.`}):null,(0,q.jsxs)(`div`,{className:T.commandBlock,children:[(0,q.jsx)(`span`,{className:T.commandLabel,children:`Runs`}),(0,q.jsx)(X,{text:Z(c),what:`the command this runs`})]}),(0,q.jsxs)(`div`,{className:T.commandBlock,children:[(0,q.jsx)(`span`,{className:T.commandLabel,children:t?`Undo later with`:`Turn back on with`}),(0,q.jsx)(X,{text:Z(l),what:t?`the restore command`:`the command that turns it on`})]}),(0,q.jsx)(`p`,{children:`It opens in a Terminal window so you can answer its prompts. Verse does not answer them for you, and nothing changes until you do.`}),r?(0,q.jsx)(`p`,{className:T.error,role:`alert`,children:r}):null,(0,q.jsxs)(`div`,{className:T.dialogActions,children:[(0,q.jsx)(k,{ref:s,variant:`subtle`,onClick:i,children:`Cancel`}),(0,q.jsx)(k,{variant:t?`danger`:`primary`,busy:n,onClick:a,children:t?`Open in Terminal`:`Restore in Terminal`})]})]})})}function Me({row:e,projects:t,models:n,inVerse:r,busy:i,error:a,onCancel:o,onLaunch:s}){let c=(0,K.useId)(),l=(0,K.useRef)(null),[u,d]=(0,K.useState)(`native`),[f,m]=(0,K.useState)(``),[h,g]=(0,K.useState)(t[0]?.path??``);(0,K.useEffect)(()=>{d(`native`),m(``),g(t[0]?.path??``)},[e?.id]);let _={via:u,model:u===`ollama`&&f!==``?f:null},v=(0,K.useMemo)(()=>e?W(e,_):null,[e,_.via,_.model]);if(e===null)return null;let y=W(e,{via:`native`,model:null}),b=e.ollamaLaunch,x=`${c}-via`,S=h!==``;return(0,q.jsx)(p,{open:!0,onClose:o,titleId:c,title:`Launch ${e.name}`,description:`Nothing starts until you choose where.`,initialFocusRef:l,children:(0,q.jsxs)(`div`,{className:T.dialogBody,children:[(0,q.jsxs)(`fieldset`,{className:T.fieldset,children:[(0,q.jsx)(`legend`,{className:T.legend,children:`Run`}),y?(0,q.jsxs)(`label`,{className:T.radio,children:[(0,q.jsx)(`input`,{ref:l,type:`radio`,name:x,checked:u===`native`,onChange:()=>d(`native`)}),(0,q.jsx)(`code`,{className:T.inlineCode,children:Z(y)}),(0,q.jsx)(`span`,{className:T.hint,children:`its own command`})]}):null,b?(0,q.jsxs)(`label`,{className:T.radio,children:[(0,q.jsx)(`input`,{type:`radio`,name:x,checked:u===`ollama`,onChange:()=>d(`ollama`)}),(0,q.jsx)(`code`,{className:T.inlineCode,children:Z(b)}),(0,q.jsx)(`span`,{className:T.hint,children:`through Ollama`})]}):null]}),u===`ollama`?n.length>0?(0,q.jsxs)(I,{label:`Local model`,value:f,onChange:e=>m(e.target.value),children:[(0,q.jsx)(`option`,{value:``,children:`Ollama’s default`}),n.map(e=>(0,q.jsx)(`option`,{value:e,children:e},e))]}):(0,q.jsx)(`p`,{className:T.hint,children:`No local models are known to Verse, so Ollama will ask which to use.`}):null,(0,q.jsxs)(I,{label:`Folder (Terminal.app)`,value:h,onChange:e=>g(e.target.value),hint:t.length===0?`No chat folders or enrolled projects yet.`:`A Verse tab opens in the chat you have open.`,disabled:t.length===0,children:[t.length===0?(0,q.jsx)(`option`,{value:``,children:`—`}):null,t.map(e=>(0,q.jsx)(`option`,{value:e.path,children:e.name},e.path))]}),v?(0,q.jsxs)(`div`,{className:T.commandBlock,children:[(0,q.jsx)(`span`,{className:T.commandLabel,children:`Command`}),(0,q.jsx)(X,{text:Z(v),what:`the ${e.name} launch command`})]}):null,u===`ollama`&&r.available?(0,q.jsx)(`p`,{className:T.hint,children:`In a Verse tab this runs exactly the command above — Verse builds it from what is installed, never from this page.`}):null,!r.available&&r.reason?(0,q.jsxs)(`p`,{className:T.hint,children:[`Verse terminal: `,r.reason]}):null,a?(0,q.jsx)(`p`,{className:T.error,role:`alert`,children:a}):null,(0,q.jsxs)(`div`,{className:T.dialogActions,children:[(0,q.jsx)(k,{variant:`ghost`,onClick:o,children:`Cancel`}),(0,q.jsx)(k,{variant:r.available?`subtle`:`primary`,busy:i,disabled:!S||v===null,onClick:()=>v&&s({choice:_,target:`terminal-app`,root:h,command:v}),children:`Open in Terminal.app`}),r.available?(0,q.jsx)(k,{variant:`primary`,disabled:v===null,onClick:()=>v&&s({choice:_,target:`verse`,root:null,command:v}),children:`Open in Verse terminal`}):null]})]})})}var $={section:`_section_mum7s_11`,body:`_body_mum7s_19`,panel:`_panel_mum7s_29`,panelHead:`_panelHead_mum7s_35`,panelTitle:`_panelTitle_mum7s_43`,panelNote:`_panelNote_mum7s_51`,muted:`_muted_mum7s_52`,alert:`_alert_mum7s_61`,alertTitle:`_alertTitle_mum7s_72`,seatList:`_seatList_mum7s_78`,rowList:`_rowList_mum7s_79`,seatRow:`_seatRow_mum7s_85`,healthRow:`_healthRow_mum7s_86`,seatHead:`_seatHead_mum7s_94`,seatLabel:`_seatLabel_mum7s_101`,engineTag:`_engineTag_mum7s_106`,code:`_code_mum7s_107`,count:`_count_mum7s_118`,disclosure:`_disclosure_mum7s_124`,commandLine:`_commandLine_mum7s_134`,envList:`_envList_mum7s_143`,envItem:`_envItem_mum7s_152`,warnList:`_warnList_mum7s_161`,digest:`_digest_mum7s_171`,actions:`_actions_mum7s_178`};function Ne({server:e,heading:t}){let n=e.env===null?[]:Object.keys(e.env);return(0,q.jsxs)(`div`,{className:$.disclosure,children:[t===void 0?null:(0,q.jsx)(`p`,{className:$.alertTitle,children:t}),(0,q.jsxs)(`p`,{className:$.commandLine,children:[e.command,e.args.length>0?` ${e.args.join(` `)}`:``]}),n.length===0?(0,q.jsx)(`p`,{className:$.muted,children:`No environment variables are passed to this server.`}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`p`,{className:$.muted,children:[n.length,` environment variable`,n.length===1?``:`s`,` passed to this server. Values are never displayed.`]}),(0,q.jsx)(`ul`,{className:$.envList,children:n.map(e=>(0,q.jsxs)(`li`,{className:$.envItem,children:[e,`=<set>`]},e))})]}),(0,q.jsxs)(`p`,{className:$.code,children:[`configured in `,e.sourceRef]})]})}var Pe=`verse-mcp-snapshot`,Fe=`verse-mcp-cli-health`;function Ie(e,t){return t instanceof d?t.status===404?`This server does not expose ${e}, so this panel has no source.`:`${e} answered HTTP ${t.status}.`:`${e} could not be reached.`}function Le(e){return async t=>{try{return{raw:await s(e,t),available:!0,reason:null}}catch(t){if(t instanceof d&&t.status===401||t instanceof DOMException&&t.name===`AbortError`)throw t;return{raw:null,available:!1,reason:Ie(e,t)}}}}var Re={key:Pe,fetch:Le(`/api/verse/mcp`)},ze={key:Fe,fetch:Le(`/api/verse/mcp/cli-health`)},Be=class extends Error{constructor(){super(`Unlock actions with the mutation token before changing MCP configuration.`),this.name=`McpLockedError`}};async function Ve(e,t){let n=r();if(!n)throw new Be;let a=await l(e,t,n);return i(),a}function He(e,t){return Ve(`/api/verse/mcp/proposal`,{target:e,server:t})}async function Ue(e,t,n){let r=await Ve(`/api/verse/mcp/apply`,{target:e,server:t,digest:n,confirm:!0});return o(Pe),r}function We({row:e}){let[t,n]=(0,K.useState)(!1),r=(0,K.useId)(),i=e.servers.length>0;return(0,q.jsxs)(J,{id:`mcp-${e.seatId}`,name:e.label,monogram:e.monogram,engine:e.engine,description:e.sentence,health:{tone:i?`success`:`off`,label:e.loads},aside:i?(0,q.jsx)(k,{variant:`ghost`,size:`sm`,"aria-expanded":t,"aria-controls":r,icon:t?(0,q.jsx)(j,{size:14}):(0,q.jsx)(re,{size:14}),onClick:()=>n(e=>!e),children:t?`Hide servers`:`Show servers`}):null,children:[(0,q.jsx)(`span`,{className:T.reasonCode,children:e.reason}),i&&t?(0,q.jsx)(`div`,{id:r,className:T.servers,children:e.servers.map(e=>(0,q.jsx)(Ne,{server:e,heading:e.name},e.name))}):null]})}function Ge(e){if(typeof e!=`object`||!e)return null;let t=e,n=B(t.server),r=t.target;return!n||typeof t.digest!=`string`||!r?null:{server:n,targetRef:typeof r.ref==`string`?r.ref:``,targetLabel:typeof r.label==`string`?r.label:``,action:t.action===`replace`?`replace`:`add`,replaces:B(t.replaces),warnings:Array.isArray(t.warnings)?t.warnings.filter(e=>typeof e==`string`):[],note:typeof t.note==`string`?t.note:``,digest:t.digest}}function Ke(e){return e instanceof d?e.detail??`The server refused (HTTP ${e.status}).`:e instanceof Error&&e.name===`VerseMutationLockedError`?`Unlock actions with the mutation token first.`:`The request could not be completed.`}function qe({open:e,snapshot:t,run:n,onClose:r,onAdded:i}){let a=(0,K.useId)(),o=G(t),[s,c]=(0,K.useState)(`hub`),[l,u]=(0,K.useState)(``),[d,f]=(0,K.useState)(``),[p,m]=(0,K.useState)(``),[h,g]=(0,K.useState)(``),[_,v]=(0,K.useState)(null),[y,b]=(0,K.useState)(!1),[x,S]=(0,K.useState)(null),C=()=>{S(null),v(null),b(!1)},ee=async e=>{e.preventDefault(),v(null);let t=z(h);if(!t.ok){v(t.error);return}let r={name:l.trim(),command:d.trim(),args:V(p),...Object.keys(t.env).length>0?{env:t.env}:{}};b(!0);try{let e=await n(`Review an MCP server before adding it`,()=>He(s,r));if(e===null)return;let t=Ge(e);t?S({input:r,target:s,value:t}):v(`The server answered with something that is not a proposal.`)}catch(e){v(Ke(e))}finally{b(!1)}},w=async()=>{if(x){b(!0),v(null);try{if(await n(`Add an MCP server`,()=>Ue(x.target,x.input,x.value.digest))===null)return;i(`${x.value.action===`replace`?`Replaced`:`Added`} ${x.value.server.name} in ${x.value.targetRef}.`),u(``),f(``),m(``),g(``),C(),r()}catch(e){v(Ke(e))}finally{b(!1)}}},E=o.find(e=>e.id===s);return(0,q.jsx)(R,{open:e,onClose:()=>{C(),r()},titleId:a,title:x?`Review before adding`:`Add an MCP server`,description:`An MCP server is a program that runs with the agent’s permissions. Nothing is written until you confirm what you read.`,width:520,children:x===null?(0,q.jsxs)(`form`,{className:T.dialogBody,onSubmit:e=>void ee(e),children:[(0,q.jsx)(I,{label:`Add to`,value:s,onChange:e=>c(e.target.value),hint:E?.disabledReason??(s===`hub`?`The hub’s own registry.`:`A Verse chat on a Claude seat still loads none; Claude Code in a terminal does.`),children:o.map(e=>(0,q.jsx)(`option`,{value:e.id,disabled:e.disabledReason!==null,children:e.label},e.id))}),(0,q.jsx)(L,{label:`Name`,value:l,onChange:e=>u(e.target.value),required:!0,placeholder:`filesystem`,autoComplete:`off`}),(0,q.jsx)(L,{label:`Command`,value:d,onChange:e=>f(e.target.value),required:!0,placeholder:`/opt/homebrew/bin/npx`,autoComplete:`off`,hint:`An absolute path is safest; a bare name is looked up on PATH when the server starts.`}),(0,q.jsx)(L,{label:`Arguments`,value:p,onChange:e=>m(e.target.value),placeholder:`-y @modelcontextprotocol/server-filesystem "~/code"`,autoComplete:`off`}),(0,q.jsxs)(`label`,{className:T.fieldLabel,children:[`Environment `,(0,q.jsx)(`span`,{className:T.hint,children:`One KEY=value per line. Values are sent once and never shown again.`}),(0,q.jsx)(`textarea`,{className:T.textarea,value:h,onChange:e=>g(e.target.value),spellCheck:!1,autoComplete:`off`})]}),_?(0,q.jsx)(`p`,{className:T.error,role:`alert`,children:_}):null,(0,q.jsxs)(`div`,{className:T.dialogActions,children:[(0,q.jsx)(k,{type:`button`,variant:`ghost`,onClick:r,children:`Cancel`}),(0,q.jsx)(k,{type:`submit`,variant:`primary`,busy:y,disabled:l.trim()===``||d.trim()===``||E?.disabledReason!=null,children:`Review`})]})]}):(0,q.jsxs)(`div`,{className:T.dialogBody,children:[(0,q.jsxs)(`p`,{children:[x.value.action===`replace`?`Replaces`:`Adds`,` `,(0,q.jsx)(`strong`,{children:x.value.server.name}),` in`,` `,(0,q.jsx)(`code`,{className:T.inlineCode,children:x.value.targetRef}),x.value.targetLabel?` (${x.value.targetLabel})`:``,`.`]}),(0,q.jsx)(Ne,{server:x.value.server,heading:`This will run`}),x.value.replaces?(0,q.jsx)(Ne,{server:x.value.replaces,heading:`Replacing`}):null,x.value.warnings.length>0?(0,q.jsx)(`ul`,{className:T.warnings,children:x.value.warnings.map(e=>(0,q.jsx)(`li`,{children:e},e))}):null,x.value.note?(0,q.jsx)(`p`,{className:T.hint,children:x.value.note}):null,_?(0,q.jsx)(`p`,{className:T.error,role:`alert`,children:_}):null,(0,q.jsxs)(`div`,{className:T.dialogActions,children:[(0,q.jsx)(k,{variant:`ghost`,onClick:()=>S(null),children:`Back`}),(0,q.jsx)(k,{variant:`primary`,busy:y,onClick:()=>void w(),children:x.value.action===`replace`?`Replace server`:`Add server`})]})]})})}function Je({snapshot:e,cliHealth:t,unavailable:n,loading:r,run:i,onAdded:a,headingRef:o}){let[s,c]=(0,K.useState)(!1),l=e?fe(e):[];return(0,q.jsxs)(Y,{id:`mcp-servers`,title:`MCP servers`,headingRef:o,action:(0,q.jsx)(k,{variant:`subtle`,size:`sm`,icon:(0,q.jsx)(A,{size:14}),onClick:()=>c(!0),"aria-haspopup":`dialog`,children:`Add server`}),caveat:(0,q.jsxs)(q.Fragment,{children:[`Claude and local seats load no MCP servers: Verse starts them with`,` `,(0,q.jsx)(`code`,{children:`--strict-mcp-config`}),` and an empty `,(0,q.jsx)(`code`,{children:`--mcp-config`}),`. Codex and Grok seats load their own account’s config — and an `,(0,q.jsx)(`code`,{children:`ashlr__`}),` write through one is refused on a folder that is not enrolled.`]}),children:[e!==null&&e.notes.length>0?(0,q.jsxs)(`div`,{className:T.loadingLine,role:`note`,children:[(0,q.jsx)(`strong`,{children:`Configured, but unused.`}),` `,e.notes.join(` `),` `,e.machine.note]}):null,t!==null&&t.driftDetected?(0,q.jsxs)(`div`,{className:T.loadingLine,role:`alert`,children:[(0,q.jsx)(`strong`,{children:`CLI version drift.`}),` `,t.notes.join(` `),` `,t.accounts.filter(e=>e.versionState===`drift`).map(e=>`${e.label}: ${e.version??`unread`}, pinned ${e.pinnedVersion??`—`}.`).join(` `)]}):null,e===null?(0,q.jsx)(`p`,{className:T.loadingLine,"aria-busy":r||void 0,children:r?`Reading each seat’s configuration…`:n??`No per-seat reading is available.`}):(0,q.jsx)(`ul`,{className:T.rows,children:l.map(e=>(0,q.jsx)(We,{row:e},e.seatId))}),e?.scope?(0,q.jsxs)(`p`,{className:T.scopeLine,children:[`Scope: `,H(he,e.scope.reason,`Locus did not report a usable scope.`),e.scope.tenantRef?` (${e.scope.tenantRef})`:``]}):null,(0,q.jsx)(qe,{open:s,snapshot:e,run:i,onClose:()=>c(!1),onAdded:a})]})}function Ye(e){return{tone:U(e.health.state),label:e.health.label}}function Xe({group:e,onToggle:t,onRestore:n}){return(0,q.jsx)(Y,{id:e.id,title:e.title,caveat:e.caveat,children:(0,q.jsx)(`ul`,{className:T.rows,children:e.apps.map(e=>{let r=e.actions.find(e=>e.kind===`restore`)??null;return(0,q.jsx)(J,{id:`app-${e.id}`,name:e.name,monogram:e.monogram,engine:e.engine,description:e.description,health:Ye(e),detail:e.toggle===null?e.detail:null,aside:e.toggle===null?null:(0,q.jsxs)(q.Fragment,{children:[r?(0,q.jsx)(k,{variant:`ghost`,size:`sm`,onClick:()=>n(e),disabled:r.disabledReason!==null,title:Z(r.command??[]),children:r.label}):null,(0,q.jsx)(F,{checked:e.toggle.enabled,onChange:n=>t(e,n),"aria-label":`${e.description}: ${e.toggle.enabled?`on`:`off`}`,"aria-describedby":`app-${e.id}-name`})]})},e.id)})})})}function Ze({group:e,quickLaunchReason:t,onQuickLaunch:n,onLaunchOptions:r}){return(0,q.jsx)(Y,{id:e.id,title:e.title,caveat:e.caveat,children:(0,q.jsx)(`ul`,{className:T.rows,children:e.apps.map(e=>{let i=e.actions.find(e=>e.kind===`launch`)??null,a=i?.disabledReason??t;return(0,q.jsx)(J,{id:`app-${e.id}`,name:e.name,monogram:e.monogram,engine:e.engine,description:e.description,version:e.version,health:Ye(e),detail:e.detail,aside:(0,q.jsxs)(q.Fragment,{children:[e.copy&&e.installed?(0,q.jsx)(X,{text:e.copy.text,label:e.copy.label,what:`the ${e.name} command`}):null,e.ollamaLaunch?(0,q.jsx)(X,{text:Z(e.ollamaLaunch),what:`the Ollama launch command for ${e.name}`}):null,i?i.disabledReason===null?(0,q.jsxs)(`span`,{className:T.split,children:[(0,q.jsx)(k,{variant:`subtle`,size:`sm`,icon:(0,q.jsx)(M,{size:14}),disabled:a!==null,title:a??void 0,onClick:()=>n(e),"aria-label":`Launch ${e.name}`,children:`Launch`}),(0,q.jsx)(k,{variant:`subtle`,size:`sm`,iconOnly:!0,icon:(0,q.jsx)(j,{size:14}),"aria-label":`Launch options for ${e.name}`,title:`Launch options for ${e.name}`,"aria-haspopup":`dialog`,onClick:()=>r(e)})]}):(0,q.jsx)(`span`,{className:T.disabledNote,children:i.disabledReason}):null]})},e.id)})})})}function Qe({group:e}){return(0,q.jsx)(Y,{id:e.id,title:e.title,caveat:e.caveat,children:(0,q.jsx)(`ul`,{className:T.rows,children:e.apps.map(e=>(0,q.jsx)(J,{id:`app-${e.id}`,name:e.name,monogram:e.monogram,engine:e.engine,description:e.description,version:e.version,health:Ye(e),detail:e.detail},e.id))})})}var $e=6e4;function et(e,t){let n=Date.parse(e);if(!Number.isFinite(n))return`not checked`;let r=Math.max(0,Math.round((t-n)/6e4));return r<1?`checked just now`:r<120?`checked ${r} min ago`:`checked ${Math.round(r/60)} h ago`}function tt({focusGroup:e}={}){let t=f(Q),n=u(Q);y(n,$e);let r=f(Ee),i=f(Re),a=f(ze),o=u(Re),s=f(S),l=ee(),d=b(),p=oe(),[h,g]=(0,K.useState)(null),[_,v]=(0,K.useState)(!1),[x,C]=(0,K.useState)(null),[w,D]=(0,K.useState)(null),[ne,O]=(0,K.useState)(!1),[re,A]=(0,K.useState)(null),[j,M]=(0,K.useState)(null),[ae,N]=(0,K.useState)(!1),[se,F]=(0,K.useState)(null),[ce,I]=(0,K.useState)(()=>Date.now());y(()=>I(Date.now()),3e4);let L=(0,K.useRef)(null);(0,K.useEffect)(()=>{if(e!==`mcp-servers`)return;let t=L.current;t&&(typeof t.scrollIntoView==`function`&&t.scrollIntoView({block:`start`}),t.focus({preventScroll:!0}))},[e]);let R=s.data,z=de(R),B=le(l.seats),V=ye({terminalAvailable:r.data?.available?r.data.data.available:!r.data&&null,terminalReason:r.data?.available?r.data.data.reason:null,activeSessionId:d.activeSessionId}),H=t.data?.available?t.data.data:null,U=e=>H?.groups.find(t=>t.id===e)??null,fe=i.data?.available?pe(i.data.raw):null,W=a.data?.available?ue(a.data.raw):null,G=(0,K.useCallback)((e,t=`neutral`)=>g({text:e,tone:t}),[]),me=async()=>{v(!0);try{await p.run(`Check every app and seat again`,async()=>(await Promise.all([Oe(),E().catch(()=>null)]),o(),!0))&&(I(Date.now()),G(`Checked again.`))}catch(e){G(P(e),`danger`)}finally{v(!1)}},he=async e=>{C(e.seatId);try{await p.run(`Open the sign-in for ${e.label} in Terminal`,async()=>(await te(e.seatId),!0))&&G(`Opened the sign-in for ${e.label} in Terminal. Finish it there; this page picks it up.`)}catch(e){G(P(e),`danger`)}finally{C(null)}},ge=async()=>{if(w){O(!0),A(null);try{let e=await p.run(`${w.enable?`Switch on`:`Restore`} ${w.row.name}`,()=>ke(w.row.id,w.enable));e&&(G(`Opened “${e.command.join(` `)}” in Terminal. Answer its prompts there.`),D(null))}catch(e){A(P(e))}finally{O(!1)}}},J=async(e,t)=>{if(t.target===`verse`){be(e.id,t.choice),M(null);return}if(t.root!==null){N(!0),F(null);try{await p.run(`Launch ${e.name} in Terminal`,()=>Ae(e.id,{root:t.root,via:t.choice.via,model:t.choice.model}))&&(G(`Opened ${e.name} in Terminal.`),M(null))}catch(e){let t=P(e);j?F(t):G(t,`danger`)}finally{N(!1)}}},Y=V.available||z.length>0?null:`Open a chat or enrol a project first.`,_e=e=>{let t={via:`native`,model:null},n=e.actions.find(e=>e.kind===`launch`)?.command??null;n&&J(e,{choice:t,target:V.available?`verse`:`terminal-app`,root:z[0]?.path??null,command:n})},ve=t.data===void 0&&(t.status===`loading`||t.status===`idle`);return(0,q.jsxs)(`section`,{className:T.section,"aria-label":`Apps & Accounts`,children:[(0,q.jsx)(`div`,{className:T.scroll,children:(0,q.jsxs)(`div`,{className:T.page,children:[(0,q.jsxs)(`header`,{className:T.header,children:[(0,q.jsxs)(`div`,{className:T.headerText,children:[(0,q.jsx)(`h2`,{className:T.title,children:`Apps & Accounts`}),(0,q.jsx)(`p`,{className:T.lede,children:`Everything Verse can run with on this Mac, and whether it is ready.`})]}),(0,q.jsxs)(`div`,{className:T.headerMeta,children:[H?(0,q.jsxs)(`span`,{children:[et(H.checkedAt,ce),H.pathSource===`fallback`?` · PATH from known folders (your login shell did not answer)`:``]}):null,(0,q.jsx)(k,{variant:`ghost`,size:`sm`,icon:(0,q.jsx)(ie,{size:14}),busy:_,onClick:()=>void me(),children:`Check again`})]})]}),(0,q.jsx)(`p`,{className:h?T.banner:T.visuallyHidden,"data-tone":h?.tone,role:`status`,"aria-live":`polite`,children:h?.text??``}),(0,q.jsx)(Se,{seats:l.seats,health:l.health,budget:l.budget,loading:l.loading,reconnecting:x,onReconnect:e=>void he(e)}),t.data&&!t.data.available?(0,q.jsx)(`p`,{className:T.banner,children:t.data.reason}):ve?(0,q.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Checking apps`,children:[(0,q.jsx)(c,{width:`30%`}),(0,q.jsx)(c,{width:`80%`}),(0,q.jsx)(c,{width:`70%`})]}):(0,q.jsxs)(q.Fragment,{children:[U(`desktop`)?(0,q.jsx)(Xe,{group:U(`desktop`),onToggle:(e,t)=>{A(null),D({row:e,enable:t})},onRestore:e=>{A(null),D({row:e,enable:!1})}}):null,U(`terminal-agents`)?(0,q.jsx)(Ze,{group:U(`terminal-agents`),quickLaunchReason:Y,onQuickLaunch:_e,onLaunchOptions:e=>{F(null),M(e)}}):null,U(`local-models`)?(0,q.jsx)(Qe,{group:U(`local-models`)}):null]}),(0,q.jsx)(Je,{snapshot:fe,cliHealth:W,unavailable:i.data&&!i.data.available?i.data.reason:null,loading:i.data===void 0,run:p.run,onAdded:e=>{G(e),o()},headingRef:L})]})}),(0,q.jsx)(je,{row:w?.row??null,enable:w?.enable??!1,busy:ne,error:re,onCancel:()=>D(null),onConfirm:()=>void ge()}),(0,q.jsx)(Me,{row:j,projects:z,models:B,inVerse:V,busy:ae,error:se,onCancel:()=>M(null),onLaunch:e=>{j&&J(j,e)}}),(0,q.jsx)(m,{open:p.dialog.open,reason:p.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:p.dialog.onClose,onUnlocked:p.dialog.onUnlocked})]})}export{$e as APPS_POLL_MS,tt as AppsSection};
|
|
2
|
-
//# sourceMappingURL=AppsSection-Ddu_RCQE.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AppsSection-Ddu_RCQE.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/apps/AppRow.tsx","../../../../../../src/web-ui/routes/verse/apps/CopyPill.tsx","../../../../../../src/web-ui/routes/verse/apps/launch.ts","../../../../../../src/web-ui/routes/verse/apps/AccountsGroup.tsx","../../../../../../src/web-ui/routes/verse/apps/apps-queries.ts","../../../../../../src/web-ui/routes/verse/apps/DesktopToggleDialog.tsx","../../../../../../src/web-ui/routes/verse/apps/LaunchDialog.tsx","../../../../../../src/web-ui/routes/verse/mcp/mcp.module.css","../../../../../../src/web-ui/routes/verse/mcp/McpServerDisclosure.tsx","../../../../../../src/web-ui/routes/verse/mcp/mcp-queries.ts","../../../../../../src/web-ui/routes/verse/apps/McpGroup.tsx","../../../../../../src/web-ui/routes/verse/apps/ServedGroups.tsx","../../../../../../src/web-ui/routes/verse/sections/AppsSection.tsx"],"sourcesContent":["/**\n * routes/verse/apps/AppRow.tsx — one row, the Ollama-style shape every group\n * shares (SPEC-310C §4): a 32px monogram tile, the name (and version), a\n * one-line description, a health dot WITH a word, and on the right a copy\n * pill, a toggle or an action. At the compact width the right side wraps\n * under the description (container query in Apps.module.css).\n */\nimport type { ReactNode } from 'react';\nimport type { VerseEngine } from '../../../data/api-types.js';\nimport type { HealthTone } from '../health/health-model.js';\nimport { MonogramTile } from './MonogramTile.js';\nimport styles from './Apps.module.css';\n\nexport function HealthWord({ tone, label }: { tone: HealthTone | 'off'; label: string }) {\n return (\n <span className={styles.health} data-tone={tone}>\n <span className={styles.healthDot} aria-hidden=\"true\" />\n {label}\n </span>\n );\n}\n\nexport interface AppRowProps {\n /** DOM id prefix; the row's name gets `${id}-name` so controls can reference it. */\n id: string;\n name: string;\n monogram: string;\n engine: VerseEngine | null;\n description: string;\n version?: string | null;\n health: { tone: HealthTone | 'off'; label: string };\n detail?: ReactNode;\n aside?: ReactNode;\n children?: ReactNode;\n}\n\nexport function AppRow({ id, name, monogram, engine, description, version, health, detail, aside, children }: AppRowProps) {\n return (\n <li className={styles.row} data-app={id}>\n <MonogramTile monogram={monogram} engine={engine} />\n <div className={styles.rowMain}>\n <div className={styles.rowHead}>\n <span id={`${id}-name`} className={styles.rowName}>{name}</span>\n {version ? <span className={styles.rowVersion}>{version}</span> : null}\n <HealthWord tone={health.tone} label={health.label} />\n </div>\n <p className={styles.rowDesc}>{description}</p>\n {detail ? <p className={styles.rowDetail}>{detail}</p> : null}\n {children}\n </div>\n {aside ? <div className={styles.rowAside}>{aside}</div> : null}\n </li>\n );\n}\n\n/** A labelled group: micro-label title, an optional standing caveat, and a card of rows. */\nexport function AppGroup({\n id,\n title,\n caveat,\n action,\n children,\n headingRef,\n}: {\n id: string;\n title: string;\n caveat?: ReactNode;\n action?: ReactNode;\n children: ReactNode;\n headingRef?: React.Ref<HTMLHeadingElement>;\n}) {\n const headingId = `apps-group-${id}`;\n return (\n <section className={styles.group} aria-labelledby={headingId} data-group={id}>\n <div className={styles.groupHead}>\n <h3 id={headingId} ref={headingRef} tabIndex={-1} className={styles.groupTitle}>{title}</h3>\n {action}\n </div>\n {caveat ? <p className={styles.caveat}>{caveat}</p> : null}\n <div className={styles.card}>{children}</div>\n </section>\n );\n}\n","/**\n * routes/verse/apps/CopyPill.tsx — a command you can read and copy in one\n * click (SPEC-310C §4: \"a copy pill, ⧉ turns into ✓ for 1.2s\").\n *\n * The command is shown IN FULL in mono on the code background — the operator\n * reads what they are about to paste. The button's accessible name says what\n * it copies; the confirmation is announced through a polite live region, not\n * only drawn, so a screen-reader user hears \"Copied\" too.\n *\n * Clipboard: the async API where the page is allowed it (a secure context,\n * which the desktop webview and localhost are), else a hidden-textarea copy.\n * A copy that fails says so instead of showing a check.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { IconCheck, IconCopy } from '../../../components/primitives/icons.js';\nimport styles from './Apps.module.css';\n\n/** SPEC-310C §4. */\nexport const COPY_CONFIRM_MS = 1_200;\n\nexport async function copyText(text: string): Promise<boolean> {\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // fall through to the textarea path\n }\n if (typeof document === 'undefined') return false;\n const area = document.createElement('textarea');\n area.value = text;\n area.setAttribute('readonly', '');\n area.style.position = 'fixed';\n area.style.opacity = '0';\n document.body.appendChild(area);\n area.select();\n let ok = false;\n try {\n ok = typeof document.execCommand === 'function' && document.execCommand('copy');\n } catch {\n ok = false;\n }\n area.remove();\n return ok;\n}\n\nexport function CopyPill({ text, label, what }: { text: string; label?: string; /** \"the Codex launch command\" */ what: string }) {\n const [state, setState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => () => { if (timer.current) clearTimeout(timer.current); }, []);\n\n const onCopy = async () => {\n const ok = await copyText(text);\n setState(ok ? 'copied' : 'failed');\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setState('idle'), COPY_CONFIRM_MS);\n };\n\n return (\n <span className={styles.pillWrap}>\n <button\n type=\"button\"\n className={styles.pill}\n data-state={state}\n onClick={() => void onCopy()}\n aria-label={`Copy ${what}: ${text}`}\n title={`Copy: ${text}`}\n >\n <code className={styles.pillText}>{label ?? text}</code>\n <span className={styles.pillIcon} aria-hidden=\"true\">\n {state === 'copied' ? <IconCheck size={14} /> : <IconCopy size={14} />}\n </span>\n </button>\n <span className={styles.visuallyHidden} role=\"status\" aria-live=\"polite\">\n {state === 'copied' ? 'Copied' : state === 'failed' ? 'Copy failed — select the command and copy it yourself' : ''}\n </span>\n </span>\n );\n}\n","/**\n * routes/verse/apps/launch.ts — where a [Launch ▸] goes.\n *\n * Two homes for the agent's terminal:\n * - INSIDE Verse: a tab in the chat dock's Terminal (C4's pane, C2's dock),\n * in the folder of the chat you have open. Needs the desktop app (the\n * sidecar's Bun PTY — GET /api/verse/terminal says `available`), the\n * Terminal pane to have landed in this build, and an open chat to host it.\n * - Terminal.app: POST /api/verse/apps/:id/launch, in the folder you chose.\n * Works from a plain browser too (macOS).\n *\n * In-Verse launch rides the dock's own one-shot request (dock-store.ts\n * `requestTerminal`): `{ appId }`, plus `{ via, model }` for an Ollama launch\n * (the contract fields on VerseTerminalCreateRequest). The server resolves\n * the command itself — the catalog's own argv, or `ollama launch <id>\n * [--model <tag>]` through the same `resolveAppLaunch` Apps' Terminal.app\n * launch uses, which refuses an agent that is not installed, an Ollama that\n * does not list it, or a tag it does not have — and RUNS it in the new tab.\n * Nothing typed comes from the page; the dialog shows that exact command\n * before the click. (Until 3.10.1 a model launch was only pasted, because\n * the request had no model field.)\n */\nimport { shellCommandText } from '../health/health-model.js';\nimport { requestTerminal } from '../dock/dock-store.js';\nimport { isSlotAvailable } from '../shell/slots.js';\nimport { setVerseSection } from '../verse-ui-store.js';\nimport type { LaunchChoice } from './apps-model.js';\n\n/** An argv as the operator would type it (the same quoting the health banner uses). */\nexport const commandText = shellCommandText;\n\nexport interface InVerseAvailability {\n available: boolean;\n /** Why not, in operator language; null when available. */\n reason: string | null;\n}\n\nexport function inVerseAvailability(input: {\n terminalAvailable: boolean | null;\n terminalReason: string | null;\n activeSessionId: string | null;\n slotLanded?: boolean;\n}): InVerseAvailability {\n const landed = input.slotLanded ?? isSlotAvailable('terminal-pane');\n if (!landed) return { available: false, reason: 'This build has no Verse terminal yet.' };\n if (input.terminalAvailable !== true) {\n return { available: false, reason: input.terminalReason ?? 'The Verse terminal needs the desktop app.' };\n }\n if (input.activeSessionId === null) return { available: false, reason: 'Open a chat first — its terminal hosts the agent.' };\n return { available: true, reason: null };\n}\n\n/** Open the agent in a new dock terminal tab and bring Chat forward. */\nexport function launchInVerse(appId: string, choice: LaunchChoice): void {\n if (choice.via === 'native' && choice.model === null) {\n requestTerminal({ newTab: true, appId });\n } else {\n // A model is an Ollama tag: it only ever launches through Ollama.\n requestTerminal({ newTab: true, appId, via: 'ollama', ...(choice.model !== null ? { model: choice.model } : {}) });\n }\n // The request waits in the dock store until Chat serves it (ChatSection\n // clears requests only on a chat SWITCH, not on its first mount).\n setVerseSection('chat');\n}\n","/**\n * routes/verse/apps/AccountsGroup.tsx — ACCOUNTS: every seat's plan,\n * connection (A2), 5-hour and weekly windows with their resets, and how much\n * is \"Reserved for you\" (A9) — the shared CapacityStrip in its accounts mode —\n * plus the one thing each seat needs from you.\n *\n * Every row leads with a status an operator can read at a glance —\n * \"Connected · usable now\", \"Spent · resets Fri 11:46 PM\" (and \"usable again\n * in 7h 12m\"), \"Signed out · reconnect to use it\", \"Checking…\" — says when it\n * was last checked, and usable accounts come first.\n *\n * Reconnect the provider's own sign-in, opened in Terminal by the health\n * route (Verse never sees a credential);\n * Check again a zero-cost health sweep (status commands only), for a seat\n * that is spent, unread or unavailable — run here, behind the\n * mutation-token gate, with the row reading \"Checking…\";\n * Fix the command A2 says fixes it (a CLI re-pin), shown to copy —\n * never run for you;\n * Edit budget A9's BudgetControl in a sheet.\n */\nimport { useId, useRef, useState } from 'react';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport type { SeatHealthReport } from '../../../../core/verse/health-types.js';\nimport type { VerseSeat } from '../../../data/api-types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { BudgetControl } from '../budget/BudgetControl.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { refreshSeatHealth } from '../health/health-queries.js';\nimport { CapacityStrip } from '../usage/CapacityStrip.js';\nimport { accountStatus, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { accountActions } from './apps-model.js';\nimport { AppGroup } from './AppRow.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText } from './launch.js';\nimport styles from './Apps.module.css';\n\nexport const ACCOUNTS_EMPTY_TEXT =\n 'No accounts connected yet. Sign in to Claude Code, Codex or Grok in a terminal, or start Ollama for local models — they show up here within a minute.';\n\nexport function AccountsGroup({\n seats,\n health,\n budget,\n loading,\n reconnecting,\n onReconnect,\n now,\n}: {\n seats: readonly VerseSeat[];\n health: readonly SeatHealthReport[] | null;\n budget: BudgetView | null;\n loading: boolean;\n /** Seat whose sign-in window is being opened. */\n reconnecting: string | null;\n onReconnect: (row: CapacityRow) => void;\n /** Injected clock for tests. */\n now?: number;\n}) {\n const [fixing, setFixing] = useState<CapacityRow | null>(null);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const [checking, setChecking] = useState<string | null>(null);\n const [note, setNote] = useState<{ tone: 'neutral' | 'danger'; text: string } | null>(null);\n const gate = useTokenGate();\n const fixTitle = useId();\n const sheetTitle = useId();\n const closeRef = useRef<HTMLButtonElement>(null);\n const healthRead = health !== null;\n\n const checkAgain = async (row: CapacityRow) => {\n setChecking(row.seatId);\n setNote(null);\n try {\n const done = await gate.run(`Check ${row.label} again (status commands only — nothing is spent)`, () => refreshSeatHealth());\n if (done) setNote({ tone: 'neutral', text: `Checked ${row.label} again.` });\n } catch (err) {\n setNote({ tone: 'danger', text: describeContextError(err) });\n } finally {\n setChecking(null);\n }\n };\n\n return (\n <AppGroup\n id=\"accounts\"\n title=\"Accounts\"\n caveat=\"Which accounts you can use now, which are spent and when they reset, and how much autonomy leaves for you.\"\n >\n {loading ? (\n <p className={styles.loadingLine} aria-busy=\"true\">Reading accounts…</p>\n ) : (\n <CapacityStrip\n seats={seats}\n health={health}\n budget={budget}\n labelledBy=\"apps-group-accounts\"\n emptyText={ACCOUNTS_EMPTY_TEXT}\n accounts={{ healthRead, checkingSeatId: checking, ...(now !== undefined ? { now } : {}) }}\n renderActions={(row) =>\n // Actions come from the SETTLED status, so \"Check again\" stays in\n // place (busy) while its own check runs instead of vanishing.\n accountActions(row, accountStatus(row, { healthRead, ...(now !== undefined ? { now } : {}) })).map((action) => (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.primary && action.kind !== 'edit-budget' ? 'primary' : 'ghost'}\n busy={(action.kind === 'reconnect' && reconnecting === row.seatId) || (action.kind === 'check-again' && checking === row.seatId)}\n aria-label={`${action.label}: ${row.label}`}\n onClick={() => {\n if (action.kind === 'reconnect') onReconnect(row);\n else if (action.kind === 'check-again') void checkAgain(row);\n else if (action.kind === 'fix') setFixing(row);\n else setBudgetOpen(true);\n }}\n >\n {action.label}\n </Button>\n ))\n }\n />\n )}\n\n <p className={note ? styles.accountsNote : styles.visuallyHidden} data-tone={note?.tone} role=\"status\" aria-live=\"polite\">\n {note?.text ?? ''}\n </p>\n\n {fixing !== null && fixing.connection?.fixCommand ? (\n <Dialog\n open\n onClose={() => setFixing(null)}\n titleId={fixTitle}\n title={`Fix ${fixing.label}`}\n description={fixing.connection.word}\n initialFocusRef={closeRef}\n >\n <div className={styles.dialogBody}>\n {fixing.connection.reasons.map((reason) => <p key={reason}>{reason}</p>)}\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Run this in a terminal</span>\n <CopyPill text={commandText(fixing.connection.fixCommand)} what={`the fix for ${fixing.label}`} />\n </div>\n <p>Verse shows the command and never runs it for you: it changes which CLI this seat is pinned to.</p>\n <div className={styles.dialogActions}>\n <Button ref={closeRef} variant=\"subtle\" onClick={() => setFixing(null)}>Done</Button>\n </div>\n </div>\n </Dialog>\n ) : null}\n\n <Sheet\n open={budgetOpen}\n onClose={() => setBudgetOpen(false)}\n titleId={sheetTitle}\n title=\"Budget\"\n description=\"How much of each seat autonomy may use, and how much is kept for you.\"\n width={560}\n >\n {budgetOpen ? <BudgetControl /> : null}\n </Sheet>\n\n <MutationTokenDialog\n open={gate.dialog.open}\n reason={gate.dialog.reason}\n tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={gate.dialog.onClose}\n onUnlocked={gate.dialog.onUnlocked}\n />\n </AppGroup>\n );\n}\n","/**\n * routes/verse/apps/apps-queries.ts — the reads and writes behind Apps &\n * Accounts (server: core/verse/apps-api.ts; C4's terminal for availability).\n *\n * Reads are OPTIONAL (the Usage/MCP convention): a server without the route\n * answers 404, which means \"this group has no source here\", not \"Verse is\n * broken\" — the page still renders Accounts and MCP from their own routes.\n * A 401 still propagates: an expired read session is the whole surface's\n * problem, not one group's.\n *\n * Writes pull the held mutation token and touch the hold on success. Nothing\n * here spends: refresh re-runs status commands, and toggle/launch open a\n * visible Terminal window that the operator drives.\n */\nimport type { VerseAppsResponse, VerseTerminalListResponse } from '../../../../core/verse/workbench-types.js';\nimport { VERSE_APPS_PATH, VERSE_TERMINAL_PATH } from '../../../../core/verse/workbench-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { refetchQuery } from '../../../data/cache.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { oneShotFetcher } from '../health/health-queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const APPS_KEY = 'verse-apps';\nexport const TERMINAL_STATUS_KEY = 'verse-terminal-status';\n\nexport type OptionalResult<T> =\n | { available: true; data: T }\n | { available: false; reason: string };\n\nasync function optional<T>(path: string, signal?: AbortSignal): Promise<OptionalResult<T>> {\n try {\n return { available: true, data: await apiGet<T>(path, signal) };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n if (err instanceof ApiError && err.status === 404) {\n return { available: false, reason: 'This server is older than Apps & Accounts, so desktop, terminal and local rows are not available.' };\n }\n return { available: false, reason: err instanceof ApiError ? `The apps check answered HTTP ${err.status}.` : 'The apps check could not be reached.' };\n }\n}\n\n/** GET /api/verse/apps — cached on the server; cheap to read. */\nexport const appsQuery: QueryDef<OptionalResult<VerseAppsResponse>> = {\n key: APPS_KEY,\n fetch: (signal) => optional<VerseAppsResponse>(VERSE_APPS_PATH, signal),\n};\n\n/**\n * GET /api/verse/terminal (C4). Only `available` matters here: whether a\n * Launch can open INSIDE Verse (the desktop app's Bun PTY) or has to go to\n * Terminal.app. Absent route = not available.\n */\nexport const terminalStatusQuery: QueryDef<OptionalResult<VerseTerminalListResponse>> = {\n key: TERMINAL_STATUS_KEY,\n fetch: (signal) => optional<VerseTerminalListResponse>(VERSE_TERMINAL_PATH, signal),\n};\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/** Re-ask the login shell for PATH and re-probe every row; every reader sees the result. */\nexport async function refreshApps(): Promise<VerseAppsResponse> {\n const body = await post<VerseAppsResponse>(`${VERSE_APPS_PATH}/refresh`, {});\n await refetchQuery(\n APPS_KEY,\n oneShotFetcher(() => Promise.resolve({ available: true as const, data: body }), () => appsQuery.fetch()),\n true,\n );\n return body;\n}\n\nexport interface AppActionResponse {\n ok: true;\n opened: 'terminal-app';\n /** The command as the operator would type it. */\n command: string[];\n}\n\n/**\n * Flip a desktop switch. `confirm: true` is sent ONLY from the confirmation\n * dialog, after the operator saw both commands; the server refuses anything\n * else.\n */\nexport async function toggleDesktopApp(appId: string, enabled: boolean): Promise<AppActionResponse> {\n const result = await post<AppActionResponse>(`${VERSE_APPS_PATH}/${encodeURIComponent(appId)}/toggle`, { enabled, confirm: true });\n void refetchQuery(APPS_KEY, () => appsQuery.fetch(), true);\n return result;\n}\n\nexport interface LaunchInTerminalAppRequest {\n root: string;\n via?: 'native' | 'ollama';\n model?: string | null;\n}\n\n/** Open the agent in a Terminal.app window, in `root`. */\nexport function launchInTerminalApp(appId: string, request: LaunchInTerminalAppRequest): Promise<AppActionResponse> {\n return post<AppActionResponse>(`${VERSE_APPS_PATH}/${encodeURIComponent(appId)}/launch`, {\n root: request.root,\n ...(request.via ? { via: request.via } : {}),\n ...(request.model ? { model: request.model } : {}),\n });\n}\n","/**\n * routes/verse/apps/DesktopToggleDialog.tsx — the confirmation in front of a\n * desktop switch (SPEC-310C §4: \"Turning either on needs a confirmation that\n * shows the command and --restore\").\n *\n * These switches change ANOTHER app's settings (Claude Desktop, Hermes\n * Desktop), so the dialog shows exactly what will run and exactly how to undo\n * it, and says where it runs: a Terminal window, where the tool's own prompts\n * are answered by the operator — Verse never answers them. Turning Claude\n * Desktop ON carries the recommendation against it (SPEC-310C §0.5).\n */\nimport { useId, useRef } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { commandText } from './launch.js';\nimport { CopyPill } from './CopyPill.js';\nimport styles from './Apps.module.css';\n\nexport function DesktopToggleDialog({\n row,\n enable,\n busy,\n error,\n onCancel,\n onConfirm,\n}: {\n row: VerseAppRow | null;\n /** The direction asked for: true = switch on, false = restore. */\n enable: boolean;\n busy: boolean;\n error: string | null;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n const titleId = useId();\n const cancelRef = useRef<HTMLButtonElement>(null);\n if (row === null || row.toggle === null) return null;\n const run = enable ? row.toggle.command : row.toggle.restoreCommand;\n const undo = enable ? row.toggle.restoreCommand : row.toggle.command;\n const title = enable ? `Turn on “${row.description}”?` : `Restore ${row.name}?`;\n return (\n <Dialog\n open\n onClose={onCancel}\n titleId={titleId}\n title={title}\n initialFocusRef={cancelRef}\n description={enable ? `This changes ${row.name}’s own settings until you restore it.` : `This puts ${row.name} back on its own defaults.`}\n >\n <div className={styles.dialogBody}>\n {row.detail ? <p>{row.detail}</p> : null}\n {enable && row.id === 'claude-desktop' ? (\n <p>\n Recommended: leave this off. Claude Desktop would run local models instead of its own, and Verse’s local\n seats already use Ollama.\n </p>\n ) : null}\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Runs</span>\n <CopyPill text={commandText(run)} what=\"the command this runs\" />\n </div>\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>{enable ? 'Undo later with' : 'Turn back on with'}</span>\n <CopyPill text={commandText(undo)} what={enable ? 'the restore command' : 'the command that turns it on'} />\n </div>\n <p>\n It opens in a Terminal window so you can answer its prompts. Verse does not answer them for you, and nothing\n changes until you do.\n </p>\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button ref={cancelRef} variant=\"subtle\" onClick={onCancel}>Cancel</Button>\n <Button variant={enable ? 'danger' : 'primary'} busy={busy} onClick={onConfirm}>\n {enable ? 'Open in Terminal' : 'Restore in Terminal'}\n </Button>\n </div>\n </div>\n </Dialog>\n );\n}\n","/**\n * routes/verse/apps/LaunchDialog.tsx — the options behind [Launch ▾]: which\n * folder, the agent's own command or `ollama launch <id>`, which local model,\n * and where (a Verse terminal tab, or Terminal.app).\n *\n * The exact command is always on screen before anything opens. The plain\n * [Launch] button beside it skips this dialog with the defaults (the agent's\n * own command, your current chat or most recent project).\n */\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { launchCommand, type LaunchChoice, type LaunchProject, type LaunchVia } from './apps-model.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText, type InVerseAvailability } from './launch.js';\nimport styles from './Apps.module.css';\n\nexport type LaunchTarget = 'verse' | 'terminal-app';\n\nexport interface LaunchRequest {\n choice: LaunchChoice;\n target: LaunchTarget;\n /** Terminal.app only; a Verse tab opens in the open chat's folder. */\n root: string | null;\n command: string[];\n}\n\nexport function LaunchDialog({\n row,\n projects,\n models,\n inVerse,\n busy,\n error,\n onCancel,\n onLaunch,\n}: {\n row: VerseAppRow | null;\n projects: readonly LaunchProject[];\n /** Ollama tags the local seats run. */\n models: readonly string[];\n inVerse: InVerseAvailability;\n busy: boolean;\n error: string | null;\n onCancel: () => void;\n onLaunch: (request: LaunchRequest) => void;\n}) {\n const titleId = useId();\n const firstRef = useRef<HTMLInputElement>(null);\n const [via, setVia] = useState<LaunchVia>('native');\n const [model, setModel] = useState<string>('');\n const [root, setRoot] = useState<string>(projects[0]?.path ?? '');\n\n // A new row opens with fresh defaults.\n useEffect(() => {\n setVia('native');\n setModel('');\n setRoot(projects[0]?.path ?? '');\n // eslint-disable-next-line react-hooks/exhaustive-deps -- reset per opened row only\n }, [row?.id]);\n\n const choice: LaunchChoice = { via, model: via === 'ollama' && model !== '' ? model : null };\n const command = useMemo(() => (row ? launchCommand(row, choice) : null), [row, choice.via, choice.model]); // eslint-disable-line react-hooks/exhaustive-deps\n if (row === null) return null;\n const nativeCommand = launchCommand(row, { via: 'native', model: null });\n const ollamaCommand = row.ollamaLaunch;\n const radioName = `${titleId}-via`;\n const canTerminalApp = root !== '';\n\n return (\n <Dialog\n open\n onClose={onCancel}\n titleId={titleId}\n title={`Launch ${row.name}`}\n description=\"Nothing starts until you choose where.\"\n initialFocusRef={firstRef}\n >\n <div className={styles.dialogBody}>\n <fieldset className={styles.fieldset}>\n <legend className={styles.legend}>Run</legend>\n {nativeCommand ? (\n <label className={styles.radio}>\n <input ref={firstRef} type=\"radio\" name={radioName} checked={via === 'native'} onChange={() => setVia('native')} />\n <code className={styles.inlineCode}>{commandText(nativeCommand)}</code>\n <span className={styles.hint}>its own command</span>\n </label>\n ) : null}\n {ollamaCommand ? (\n <label className={styles.radio}>\n <input type=\"radio\" name={radioName} checked={via === 'ollama'} onChange={() => setVia('ollama')} />\n <code className={styles.inlineCode}>{commandText(ollamaCommand)}</code>\n <span className={styles.hint}>through Ollama</span>\n </label>\n ) : null}\n </fieldset>\n\n {via === 'ollama' ? (\n models.length > 0 ? (\n <Select label=\"Local model\" value={model} onChange={(e) => setModel(e.target.value)}>\n <option value=\"\">Ollama’s default</option>\n {models.map((m) => <option key={m} value={m}>{m}</option>)}\n </Select>\n ) : (\n <p className={styles.hint}>No local models are known to Verse, so Ollama will ask which to use.</p>\n )\n ) : null}\n\n <Select\n label=\"Folder (Terminal.app)\"\n value={root}\n onChange={(e) => setRoot(e.target.value)}\n hint={projects.length === 0 ? 'No chat folders or enrolled projects yet.' : 'A Verse tab opens in the chat you have open.'}\n disabled={projects.length === 0}\n >\n {projects.length === 0 ? <option value=\"\">—</option> : null}\n {projects.map((p) => <option key={p.path} value={p.path}>{p.name}</option>)}\n </Select>\n\n {command ? (\n <div className={styles.commandBlock}>\n <span className={styles.commandLabel}>Command</span>\n <CopyPill text={commandText(command)} what={`the ${row.name} launch command`} />\n </div>\n ) : null}\n\n {via === 'ollama' && inVerse.available ? (\n <p className={styles.hint}>In a Verse tab this runs exactly the command above — Verse builds it from what is installed, never from this page.</p>\n ) : null}\n {!inVerse.available && inVerse.reason ? <p className={styles.hint}>Verse terminal: {inVerse.reason}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n\n <div className={styles.dialogActions}>\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button\n variant={inVerse.available ? 'subtle' : 'primary'}\n busy={busy}\n disabled={!canTerminalApp || command === null}\n onClick={() => command && onLaunch({ choice, target: 'terminal-app', root, command })}\n >\n Open in Terminal.app\n </Button>\n {inVerse.available ? (\n <Button\n variant=\"primary\"\n disabled={command === null}\n onClick={() => command && onLaunch({ choice, target: 'verse', root: null, command })}\n >\n Open in Verse terminal\n </Button>\n ) : null}\n </div>\n </div>\n </Dialog>\n );\n}\n","/**\n * routes/verse/mcp/mcp.module.css — MCP + CLI management styling.\n *\n * Follows docs/VERSE-DESIGN-V2.md, same as usage.module.css: monochrome\n * ground, 1px hairlines and whitespace for separation (no shadows, no nested\n * rounded boxes), display face for headings, mono for anything the operator\n * has to read character-by-character — which here is the whole point, because\n * the command line is the thing being disclosed.\n */\n\n.section {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: var(--space-5);\n display: flex;\n flex-direction: column;\n gap: var(--space-6);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n}\n\n.panelHead {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding-bottom: var(--space-2);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.panelTitle {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.panelNote,\n.muted {\n margin: 0;\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n line-height: 1.5;\n}\n\n/* A fact that changes what the operator should do. Never colour alone: it\n carries a word (\"Version drift\") as well as the rule. */\n.alert {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-warning, var(--border-strong));\n border-left-width: 3px;\n border-radius: var(--radius-sm);\n background: var(--bg-subtle);\n}\n\n.alertTitle {\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n}\n\n.seatList,\n.rowList {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.seatRow,\n.healthRow {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) 0;\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.seatHead {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n flex-wrap: wrap;\n}\n\n.seatLabel {\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.engineTag,\n.code {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-tertiary, var(--text-secondary));\n}\n\n/* The machine-readable code is shown BESIDE the sentence, never as it. */\n.code {\n letter-spacing: 0;\n}\n\n.count {\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n\n/* The disclosure: everything the operator must read before confirming. */\n.disclosure {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n background: var(--bg-subtle);\n}\n\n.commandLine {\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n word-break: break-all;\n white-space: pre-wrap;\n margin: 0;\n}\n\n.envList {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.envItem {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n padding: 2px var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n}\n\n.warnList {\n margin: 0;\n padding-left: var(--space-4);\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n}\n\n.digest {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-tertiary, var(--text-secondary));\n word-break: break-all;\n}\n\n.actions {\n display: flex;\n gap: var(--space-2);\n align-items: center;\n flex-wrap: wrap;\n}\n","/**\n * routes/verse/mcp/McpServerDisclosure.tsx — what an MCP server IS, rendered\n * so it has to be read.\n *\n * Used in two places and identical in both: listing a server a seat already\n * loads, and previewing one that is about to be written. That sameness is the\n * point — the operator reads the same card either way, so \"what will run\" is\n * never presented differently from \"what runs\".\n *\n * Three rules this component enforces at the render layer:\n *\n * 1. The COMMAND and ARGS are shown in full, in mono, wrapped rather than\n * truncated. A command with an ellipsis in the middle is exactly the\n * one worth reading.\n * 2. Environment variables are listed BY KEY, with the value shown as the\n * literal `<set>` that `redactEnv` produced. The count is stated, so a\n * server handing over six credentials cannot look like one handing over\n * none.\n * 3. The source is a home-relative ref, never an absolute path.\n */\nimport type { ReactNode } from 'react';\nimport type { McpServer } from './mcp-contract.js';\nimport styles from './mcp.module.css';\n\nexport function McpServerDisclosure({\n server,\n heading,\n}: {\n server: McpServer;\n heading?: string;\n}): ReactNode {\n const envKeys = server.env === null ? [] : Object.keys(server.env);\n\n return (\n <div className={styles.disclosure}>\n {heading === undefined ? null : <p className={styles.alertTitle}>{heading}</p>}\n\n <p className={styles.commandLine}>\n {server.command}\n {server.args.length > 0 ? ` ${server.args.join(' ')}` : ''}\n </p>\n\n {envKeys.length === 0 ? (\n <p className={styles.muted}>No environment variables are passed to this server.</p>\n ) : (\n <>\n <p className={styles.muted}>\n {envKeys.length} environment variable{envKeys.length === 1 ? '' : 's'} passed to this\n server. Values are never displayed.\n </p>\n <ul className={styles.envList}>\n {envKeys.map((key) => (\n <li key={key} className={styles.envItem}>\n {key}=<set>\n </li>\n ))}\n </ul>\n </>\n )}\n\n <p className={styles.code}>configured in {server.sourceRef}</p>\n </div>\n );\n}\n","/**\n * routes/verse/mcp/mcp-queries.ts — the reads and writes behind the MCP panel.\n *\n * Reads use the non-throwing `optionalGet` shape the Usage section\n * established: a server without these routes answers 404, and a 404 means\n * \"this panel is degraded\", not \"Verse is broken\". 401 still propagates,\n * because an expired read session is an unauthorized state for the whole\n * surface, not a degraded one.\n *\n * Writes pull the held mutation token from auth-store and touch the hold on\n * success, exactly like `autonomy/control-queries.ts`. There is one addition\n * this surface needs that the others do not: `applyMcpServer` CANNOT be\n * called without a digest that `proposeMcpServer` returned, because the\n * server refuses without it. That is deliberate and it is why there is no\n * single `installMcpServer()` helper here — a one-call install is exactly the\n * shape docs/VERSE-WORKSPACES.md §3 rules out, and it should be impossible to\n * write by accident at this layer too.\n */\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\n\nexport const MCP_SNAPSHOT_KEY = 'verse-mcp-snapshot';\nexport const MCP_CLI_HEALTH_KEY = 'verse-mcp-cli-health';\n\n/** A read that is allowed to be absent. `raw` is null when it was. */\nexport interface OptionalRead {\n raw: unknown;\n available: boolean;\n reason: string | null;\n}\n\nfunction describeFailure(path: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return `This server does not expose ${path}, so this panel has no source.`;\n }\n return `${path} answered HTTP ${err.status}.`;\n }\n return `${path} could not be reached.`;\n}\n\nfunction optionalGet(path: string): (signal?: AbortSignal) => Promise<OptionalRead> {\n return async (signal) => {\n try {\n const raw = await apiGet<unknown>(path, signal);\n return { raw, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { raw: null, available: false, reason: describeFailure(path, err) };\n }\n };\n}\n\n/** GET /api/verse/mcp — which servers each seat would load. */\nexport const mcpSnapshotQuery: QueryDef<OptionalRead> = {\n key: MCP_SNAPSHOT_KEY,\n fetch: optionalGet('/api/verse/mcp'),\n};\n\n/** GET /api/verse/mcp/cli-health — auth, plan and version drift per account. */\nexport const mcpCliHealthQuery: QueryDef<OptionalRead> = {\n key: MCP_CLI_HEALTH_KEY,\n fetch: optionalGet('/api/verse/mcp/cli-health'),\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nexport class McpLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token before changing MCP configuration.');\n this.name = 'McpLockedError';\n }\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new McpLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/** The spec an operator typed. Env VALUES are real here and only here. */\nexport interface McpServerInput {\n name: string;\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/**\n * POST /api/verse/mcp/proposal — validate and disclose. Writes nothing.\n *\n * The response carries the digest `applyMcpServer` demands back. A refusal is\n * a 409 with a full body, which `apiPost` surfaces as an ApiError whose\n * detail carries the `note`.\n */\nexport function proposeMcpServer(target: string, server: McpServerInput): Promise<unknown> {\n return post<unknown>('/api/verse/mcp/proposal', { target, server });\n}\n\n/**\n * POST /api/verse/mcp/apply — perform the write the digest confirms.\n *\n * `digest` is not optional and has no default. It must come from a proposal\n * the operator actually saw.\n */\nexport async function applyMcpServer(\n target: string,\n server: McpServerInput,\n digest: string,\n): Promise<unknown> {\n const result = await post<unknown>('/api/verse/mcp/apply', {\n target,\n server,\n digest,\n confirm: true,\n });\n invalidate(MCP_SNAPSHOT_KEY);\n return result;\n}\n\n/**\n * POST /api/verse/mcp/cli-probe — read the installed CLI versions.\n *\n * A POST because it launches the provider CLIs. Nothing about it is a read.\n */\nexport async function probeCliVersions(): Promise<unknown> {\n const result = await post<unknown>('/api/verse/mcp/cli-probe', {});\n invalidate(MCP_CLI_HEALTH_KEY);\n return result;\n}\n","/**\n * routes/verse/apps/McpGroup.tsx — MCP SERVERS, folded in from the old MCP\n * section (SPEC-310C §4): what each seat would ACTUALLY load, the standing\n * caveat that Claude and local seats load none, and an Add that goes through\n * the two-step, digest-bound write the server already enforces\n * (propose → read the disclosure → apply).\n *\n * The rules the old section refused to soften are kept:\n * - \"configured, but unused\" is said first when it is true;\n * - a CLI version drift is an alert quoting the pinned version;\n * - the unenrolled-folder footgun for Codex/Grok seats is stated;\n * - an env VALUE is never displayed (the disclosure forces '<set>').\n */\nimport { useId, useState, type FormEvent } from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconChevronDown, IconChevronRight, IconPlus } from '../../../components/primitives/icons.js';\nimport { Input } from '../../../components/primitives/Input.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { ApiError } from '../../../data/client.js';\nimport { SCOPE_REASON_COPY, narrowServer, reasonSentence, type CliHealthSnapshot, type McpServer, type McpSnapshot } from '../mcp/mcp-contract.js';\nimport { McpServerDisclosure } from '../mcp/McpServerDisclosure.js';\nimport { applyMcpServer, proposeMcpServer, type McpServerInput } from '../mcp/mcp-queries.js';\nimport { mcpSeatRows, mcpTargets, parseEnvLines, splitArgs, type McpSeatRow } from './apps-model.js';\nimport { AppGroup, AppRow } from './AppRow.js';\nimport styles from './Apps.module.css';\n\n/** The token gate the page owns: runs `action` once unlocked; null when dismissed. */\nexport type GatedRun = <T>(reason: string, action: () => Promise<T>) => Promise<T | null>;\n\nfunction SeatRow({ row }: { row: McpSeatRow }) {\n const [open, setOpen] = useState(false);\n const listId = useId();\n const has = row.servers.length > 0;\n return (\n <AppRow\n id={`mcp-${row.seatId}`}\n name={row.label}\n monogram={row.monogram}\n engine={row.engine}\n description={row.sentence}\n health={{ tone: has ? 'success' : 'off', label: row.loads }}\n aside={\n has ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-expanded={open}\n aria-controls={listId}\n icon={open ? <IconChevronDown size={14} /> : <IconChevronRight size={14} />}\n onClick={() => setOpen((v) => !v)}\n >\n {open ? 'Hide servers' : 'Show servers'}\n </Button>\n ) : null\n }\n >\n <span className={styles.reasonCode}>{row.reason}</span>\n {has && open ? (\n <div id={listId} className={styles.servers}>\n {row.servers.map((server) => <McpServerDisclosure key={server.name} server={server} heading={server.name} />)}\n </div>\n ) : null}\n </AppRow>\n );\n}\n\ninterface Proposal {\n server: McpServer;\n targetRef: string;\n targetLabel: string;\n action: 'add' | 'replace';\n replaces: McpServer | null;\n warnings: string[];\n note: string;\n digest: string;\n}\n\nfunction narrowProposal(raw: unknown): Proposal | null {\n if (raw === null || typeof raw !== 'object') return null;\n const r = raw as Record<string, unknown>;\n const server = narrowServer(r['server']);\n const target = r['target'] as Record<string, unknown> | undefined;\n if (!server || typeof r['digest'] !== 'string' || !target) return null;\n return {\n server,\n targetRef: typeof target['ref'] === 'string' ? target['ref'] : '',\n targetLabel: typeof target['label'] === 'string' ? target['label'] : '',\n action: r['action'] === 'replace' ? 'replace' : 'add',\n replaces: narrowServer(r['replaces']),\n warnings: Array.isArray(r['warnings']) ? r['warnings'].filter((w): w is string => typeof w === 'string') : [],\n note: typeof r['note'] === 'string' ? r['note'] : '',\n digest: r['digest'],\n };\n}\n\nfunction describe(err: unknown): string {\n if (err instanceof ApiError) return err.detail ?? `The server refused (HTTP ${err.status}).`;\n if (err instanceof Error && err.name === 'VerseMutationLockedError') return 'Unlock actions with the mutation token first.';\n return 'The request could not be completed.';\n}\n\nfunction AddServerSheet({ open, snapshot, run, onClose, onAdded }: {\n open: boolean;\n snapshot: McpSnapshot | null;\n run: GatedRun;\n onClose: () => void;\n onAdded: (message: string) => void;\n}) {\n const titleId = useId();\n const targets = mcpTargets(snapshot);\n const [target, setTarget] = useState('hub');\n const [name, setName] = useState('');\n const [command, setCommand] = useState('');\n const [args, setArgs] = useState('');\n const [env, setEnv] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [proposal, setProposal] = useState<{ input: McpServerInput; target: string; value: Proposal } | null>(null);\n\n const reset = () => {\n setProposal(null);\n setError(null);\n setBusy(false);\n };\n\n const review = async (event: FormEvent) => {\n event.preventDefault();\n setError(null);\n const parsedEnv = parseEnvLines(env);\n if (!parsedEnv.ok) {\n setError(parsedEnv.error);\n return;\n }\n const input: McpServerInput = {\n name: name.trim(),\n command: command.trim(),\n args: splitArgs(args),\n ...(Object.keys(parsedEnv.env).length > 0 ? { env: parsedEnv.env } : {}),\n };\n setBusy(true);\n try {\n const raw = await run('Review an MCP server before adding it', () => proposeMcpServer(target, input));\n if (raw === null) return;\n const value = narrowProposal(raw);\n if (!value) setError('The server answered with something that is not a proposal.');\n else setProposal({ input, target, value });\n } catch (err) {\n setError(describe(err));\n } finally {\n setBusy(false);\n }\n };\n\n const apply = async () => {\n if (!proposal) return;\n setBusy(true);\n setError(null);\n try {\n const done = await run('Add an MCP server', () => applyMcpServer(proposal.target, proposal.input, proposal.value.digest));\n if (done === null) return;\n onAdded(`${proposal.value.action === 'replace' ? 'Replaced' : 'Added'} ${proposal.value.server.name} in ${proposal.value.targetRef}.`);\n setName('');\n setCommand('');\n setArgs('');\n setEnv('');\n reset();\n onClose();\n } catch (err) {\n setError(describe(err));\n } finally {\n setBusy(false);\n }\n };\n\n const chosen = targets.find((t) => t.id === target);\n return (\n <Sheet\n open={open}\n onClose={() => { reset(); onClose(); }}\n titleId={titleId}\n title={proposal ? 'Review before adding' : 'Add an MCP server'}\n description=\"An MCP server is a program that runs with the agent’s permissions. Nothing is written until you confirm what you read.\"\n width={520}\n >\n {proposal === null ? (\n <form className={styles.dialogBody} onSubmit={(e) => void review(e)}>\n <Select label=\"Add to\" value={target} onChange={(e) => setTarget(e.target.value)}\n hint={chosen?.disabledReason ?? (target === 'hub' ? 'The hub’s own registry.' : 'A Verse chat on a Claude seat still loads none; Claude Code in a terminal does.')}>\n {targets.map((t) => <option key={t.id} value={t.id} disabled={t.disabledReason !== null}>{t.label}</option>)}\n </Select>\n <Input label=\"Name\" value={name} onChange={(e) => setName(e.target.value)} required placeholder=\"filesystem\" autoComplete=\"off\" />\n <Input label=\"Command\" value={command} onChange={(e) => setCommand(e.target.value)} required placeholder=\"/opt/homebrew/bin/npx\" autoComplete=\"off\"\n hint=\"An absolute path is safest; a bare name is looked up on PATH when the server starts.\" />\n <Input label=\"Arguments\" value={args} onChange={(e) => setArgs(e.target.value)} placeholder='-y @modelcontextprotocol/server-filesystem \"~/code\"' autoComplete=\"off\" />\n <label className={styles.fieldLabel}>\n Environment <span className={styles.hint}>One KEY=value per line. Values are sent once and never shown again.</span>\n <textarea className={styles.textarea} value={env} onChange={(e) => setEnv(e.target.value)} spellCheck={false} autoComplete=\"off\" />\n </label>\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>Cancel</Button>\n <Button type=\"submit\" variant=\"primary\" busy={busy} disabled={name.trim() === '' || command.trim() === '' || chosen?.disabledReason != null}>\n Review\n </Button>\n </div>\n </form>\n ) : (\n <div className={styles.dialogBody}>\n <p>\n {proposal.value.action === 'replace' ? 'Replaces' : 'Adds'} <strong>{proposal.value.server.name}</strong> in{' '}\n <code className={styles.inlineCode}>{proposal.value.targetRef}</code>\n {proposal.value.targetLabel ? ` (${proposal.value.targetLabel})` : ''}.\n </p>\n <McpServerDisclosure server={proposal.value.server} heading=\"This will run\" />\n {proposal.value.replaces ? <McpServerDisclosure server={proposal.value.replaces} heading=\"Replacing\" /> : null}\n {proposal.value.warnings.length > 0 ? (\n <ul className={styles.warnings}>{proposal.value.warnings.map((w) => <li key={w}>{w}</li>)}</ul>\n ) : null}\n {proposal.value.note ? <p className={styles.hint}>{proposal.value.note}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n <div className={styles.dialogActions}>\n <Button variant=\"ghost\" onClick={() => setProposal(null)}>Back</Button>\n <Button variant=\"primary\" busy={busy} onClick={() => void apply()}>\n {proposal.value.action === 'replace' ? 'Replace server' : 'Add server'}\n </Button>\n </div>\n </div>\n )}\n </Sheet>\n );\n}\n\nexport function McpGroup({\n snapshot,\n cliHealth,\n unavailable,\n loading,\n run,\n onAdded,\n headingRef,\n}: {\n snapshot: McpSnapshot | null;\n cliHealth: CliHealthSnapshot | null;\n /** Why the per-seat read is missing; null when it arrived (or is loading). */\n unavailable: string | null;\n loading: boolean;\n run: GatedRun;\n onAdded: (message: string) => void;\n headingRef?: React.Ref<HTMLHeadingElement>;\n}) {\n const [adding, setAdding] = useState(false);\n const rows = snapshot ? mcpSeatRows(snapshot) : [];\n return (\n <AppGroup\n id=\"mcp-servers\"\n title=\"MCP servers\"\n headingRef={headingRef}\n action={\n <Button variant=\"subtle\" size=\"sm\" icon={<IconPlus size={14} />} onClick={() => setAdding(true)} aria-haspopup=\"dialog\">\n Add server\n </Button>\n }\n caveat={\n <>\n Claude and local seats load no MCP servers: Verse starts them with{' '}\n <code>--strict-mcp-config</code> and an empty <code>--mcp-config</code>. Codex and Grok seats load their own\n account’s config — and an <code>ashlr__</code> write through one is refused on a folder that is not enrolled.\n </>\n }\n >\n {snapshot !== null && snapshot.notes.length > 0 ? (\n <div className={styles.loadingLine} role=\"note\">\n <strong>Configured, but unused.</strong> {snapshot.notes.join(' ')} {snapshot.machine.note}\n </div>\n ) : null}\n {cliHealth !== null && cliHealth.driftDetected ? (\n <div className={styles.loadingLine} role=\"alert\">\n <strong>CLI version drift.</strong> {cliHealth.notes.join(' ')}{' '}\n {cliHealth.accounts.filter((a) => a.versionState === 'drift').map((a) => `${a.label}: ${a.version ?? 'unread'}, pinned ${a.pinnedVersion ?? '—'}.`).join(' ')}\n </div>\n ) : null}\n {snapshot === null ? (\n <p className={styles.loadingLine} aria-busy={loading || undefined}>\n {loading ? 'Reading each seat’s configuration…' : (unavailable ?? 'No per-seat reading is available.')}\n </p>\n ) : (\n <ul className={styles.rows}>\n {rows.map((row) => <SeatRow key={row.seatId} row={row} />)}\n </ul>\n )}\n {snapshot?.scope ? (\n <p className={styles.scopeLine}>\n Scope: {reasonSentence(SCOPE_REASON_COPY, snapshot.scope.reason, 'Locus did not report a usable scope.')}\n {snapshot.scope.tenantRef ? ` (${snapshot.scope.tenantRef})` : ''}\n </p>\n ) : null}\n <AddServerSheet open={adding} snapshot={snapshot} run={run} onClose={() => setAdding(false)} onAdded={onAdded} />\n </AppGroup>\n );\n}\n","/**\n * routes/verse/apps/ServedGroups.tsx — the three groups GET /api/verse/apps\n * serves: DESKTOP (Ollama's switches for other apps), TERMINAL AGENTS and\n * LOCAL MODELS. Rendering only; every decision about a word or an enabled\n * control was made by the server or apps-model.ts.\n */\nimport type { VerseAppGroup, VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconChevronDown, IconPlay } from '../../../components/primitives/icons.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { appHealthTone } from './apps-model.js';\nimport { AppGroup, AppRow } from './AppRow.js';\nimport { CopyPill } from './CopyPill.js';\nimport { commandText } from './launch.js';\nimport styles from './Apps.module.css';\n\nfunction rowHealth(row: VerseAppRow) {\n return { tone: appHealthTone(row.health.state), label: row.health.label };\n}\n\nexport function DesktopGroup({\n group,\n onToggle,\n onRestore,\n}: {\n group: VerseAppGroup;\n /** Opens the confirmation; never flips anything by itself. */\n onToggle: (row: VerseAppRow, enable: boolean) => void;\n onRestore: (row: VerseAppRow) => void;\n}) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => {\n const restore = row.actions.find((a) => a.kind === 'restore') ?? null;\n return (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n health={rowHealth(row)}\n detail={row.toggle === null ? row.detail : null}\n aside={\n row.toggle === null ? null : (\n <>\n {restore ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onRestore(row)} disabled={restore.disabledReason !== null} title={commandText(restore.command ?? [])}>\n {restore.label}\n </Button>\n ) : null}\n <Switch\n checked={row.toggle.enabled}\n onChange={(next) => onToggle(row, next)}\n aria-label={`${row.description}: ${row.toggle.enabled ? 'on' : 'off'}`}\n aria-describedby={`app-${row.id}-name`}\n />\n </>\n )\n }\n />\n );\n })}\n </ul>\n </AppGroup>\n );\n}\n\nexport function AgentsGroup({\n group,\n quickLaunchReason,\n onQuickLaunch,\n onLaunchOptions,\n}: {\n group: VerseAppGroup;\n /** Why the one-click Launch cannot run anywhere right now (no folder and no Verse tab), or null. */\n quickLaunchReason: string | null;\n onQuickLaunch: (row: VerseAppRow) => void;\n onLaunchOptions: (row: VerseAppRow) => void;\n}) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => {\n const launch = row.actions.find((a) => a.kind === 'launch') ?? null;\n const disabled = launch?.disabledReason ?? quickLaunchReason;\n return (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n version={row.version}\n health={rowHealth(row)}\n detail={row.detail}\n aside={\n <>\n {row.copy && row.installed ? <CopyPill text={row.copy.text} label={row.copy.label} what={`the ${row.name} command`} /> : null}\n {row.ollamaLaunch ? (\n <CopyPill text={commandText(row.ollamaLaunch)} what={`the Ollama launch command for ${row.name}`} />\n ) : null}\n {launch ? (\n launch.disabledReason !== null ? (\n <span className={styles.disabledNote}>{launch.disabledReason}</span>\n ) : (\n <span className={styles.split}>\n <Button\n variant=\"subtle\"\n size=\"sm\"\n icon={<IconPlay size={14} />}\n disabled={disabled !== null}\n title={disabled ?? undefined}\n onClick={() => onQuickLaunch(row)}\n aria-label={`Launch ${row.name}`}\n >\n Launch\n </Button>\n <Button\n variant=\"subtle\"\n size=\"sm\"\n iconOnly\n icon={<IconChevronDown size={14} />}\n aria-label={`Launch options for ${row.name}`}\n title={`Launch options for ${row.name}`}\n aria-haspopup=\"dialog\"\n onClick={() => onLaunchOptions(row)}\n />\n </span>\n )\n ) : null}\n </>\n }\n />\n );\n })}\n </ul>\n </AppGroup>\n );\n}\n\nexport function LocalModelsGroup({ group }: { group: VerseAppGroup }) {\n return (\n <AppGroup id={group.id} title={group.title} caveat={group.caveat}>\n <ul className={styles.rows}>\n {group.apps.map((row) => (\n <AppRow\n key={row.id}\n id={`app-${row.id}`}\n name={row.name}\n monogram={row.monogram}\n engine={row.engine}\n description={row.description}\n version={row.version}\n health={rowHealth(row)}\n detail={row.detail}\n />\n ))}\n </ul>\n </AppGroup>\n );\n}\n","/**\n * routes/verse/sections/AppsSection.tsx — Apps & Accounts (unit C6,\n * SPEC-310C §4; the gear tray's \"Apps & Accounts\", and where MCP now lives).\n *\n * One page that answers \"what can I run with on this Mac, and is it ready\":\n *\n * ACCOUNTS each seat's plan, connection, 5-hour and weekly windows\n * with resets, \"Reserved for you N%\", and Reconnect / Fix /\n * Edit budget — the shared CapacityStrip;\n * DESKTOP Ollama's switches for Claude Desktop and Hermes Desktop,\n * shown OFF with Restore (SPEC-310C §0.5);\n * TERMINAL AGENTS installed version or \"not installed\", the agent's own\n * command, `ollama launch <id>` only where the installed\n * Ollama lists it, and [Launch ▾];\n * LOCAL MODELS Ollama (models, end-to-end tok/s), llama-server, LM Studio;\n * MCP SERVERS what each seat would load, and Add (propose → disclose → apply).\n *\n * Takes no props, per the shell contract (C1 mounts `sections/*Section.tsx`).\n * `focusGroup` is only for the legacy MCP entry point, which lands on the MCP\n * group of this same page.\n *\n * Polls only while visible (usePollWhileVisible): apps every 60 s (the server\n * caches and re-probes in the background), seats 30 s, health 30 s, budget\n * 60 s. Every mutation goes through the mutation-token gate; nothing on this\n * page spends — the actions open visible Terminal windows or write a config\n * the operator just read.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { VerseAppRow } from '../../../../core/verse/workbench-types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconRefresh } from '../../../components/primitives/icons.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport type { VerseBootstrap } from '../../../data/api-types.js';\nimport { AccountsGroup } from '../apps/AccountsGroup.js';\nimport { launchProjects, localModelTags, type LaunchChoice } from '../apps/apps-model.js';\nimport { appsQuery, launchInTerminalApp, refreshApps, terminalStatusQuery, toggleDesktopApp } from '../apps/apps-queries.js';\nimport { DesktopToggleDialog } from '../apps/DesktopToggleDialog.js';\nimport { inVerseAvailability, launchInVerse } from '../apps/launch.js';\nimport { LaunchDialog, type LaunchRequest } from '../apps/LaunchDialog.js';\nimport { McpGroup } from '../apps/McpGroup.js';\nimport { AgentsGroup, DesktopGroup, LocalModelsGroup } from '../apps/ServedGroups.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { reconnectSeat, refreshSeatHealth } from '../health/health-queries.js';\nimport { projectCliHealth, projectMcpSnapshot } from '../mcp/mcp-contract.js';\nimport { mcpCliHealthQuery, mcpSnapshotQuery } from '../mcp/mcp-queries.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport type { CapacityRow } from '../usage/capacity-strip-model.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport styles from '../apps/Apps.module.css';\n\n/** The server re-probes in the background after 60 s; reading faster only re-reads its cache. */\nexport const APPS_POLL_MS = 60_000;\n\nfunction checkedAgo(iso: string, now: number): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return 'not checked';\n const minutes = Math.max(0, Math.round((now - t) / 60_000));\n if (minutes < 1) return 'checked just now';\n if (minutes < 120) return `checked ${minutes} min ago`;\n return `checked ${Math.round(minutes / 60)} h ago`;\n}\n\nexport function AppsSection({ focusGroup }: { focusGroup?: 'mcp-servers' } = {}) {\n const apps = useQuery(appsQuery);\n const refetchApps = useRefetch(appsQuery);\n usePollWhileVisible(refetchApps, APPS_POLL_MS);\n const terminal = useQuery(terminalStatusQuery);\n const mcp = useQuery(mcpSnapshotQuery);\n const cli = useQuery(mcpCliHealthQuery);\n const refetchMcp = useRefetch(mcpSnapshotQuery);\n const bootstrap = useQuery(verseBootstrapQuery);\n const capacity = useCapacityData();\n const ui = useVerseUi();\n const gate = useTokenGate();\n\n const [status, setStatus] = useState<{ tone: 'neutral' | 'danger'; text: string } | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n const [reconnecting, setReconnecting] = useState<string | null>(null);\n const [toggle, setToggle] = useState<{ row: VerseAppRow; enable: boolean } | null>(null);\n const [toggleBusy, setToggleBusy] = useState(false);\n const [toggleError, setToggleError] = useState<string | null>(null);\n const [launchRow, setLaunchRow] = useState<VerseAppRow | null>(null);\n const [launchBusy, setLaunchBusy] = useState(false);\n const [launchError, setLaunchError] = useState<string | null>(null);\n const [nowMs, setNowMs] = useState(() => Date.now());\n usePollWhileVisible(() => setNowMs(Date.now()), 30_000);\n\n const mcpHeading = useRef<HTMLHeadingElement>(null);\n useEffect(() => {\n if (focusGroup !== 'mcp-servers') return;\n const el = mcpHeading.current;\n if (!el) return;\n if (typeof el.scrollIntoView === 'function') el.scrollIntoView({ block: 'start' });\n el.focus({ preventScroll: true });\n }, [focusGroup]);\n\n const data = bootstrap.data as VerseBootstrap | undefined;\n const projects = launchProjects(data);\n const models = localModelTags(capacity.seats);\n const inVerse = inVerseAvailability({\n terminalAvailable: terminal.data?.available ? terminal.data.data.available : terminal.data ? false : null,\n terminalReason: terminal.data?.available ? terminal.data.data.reason : null,\n activeSessionId: ui.activeSessionId,\n });\n\n const served = apps.data?.available ? apps.data.data : null;\n const group = (id: 'desktop' | 'terminal-agents' | 'local-models') => served?.groups.find((g) => g.id === id) ?? null;\n const snapshot = mcp.data?.available ? projectMcpSnapshot(mcp.data.raw) : null;\n const cliHealth = cli.data?.available ? projectCliHealth(cli.data.raw) : null;\n\n const say = useCallback((text: string, tone: 'neutral' | 'danger' = 'neutral') => setStatus({ text, tone }), []);\n\n const onRefresh = async () => {\n setRefreshing(true);\n try {\n const done = await gate.run('Check every app and seat again', async () => {\n await Promise.all([refreshApps(), refreshSeatHealth().catch(() => null)]);\n refetchMcp();\n return true;\n });\n if (done) {\n setNowMs(Date.now());\n say('Checked again.');\n }\n } catch (err) {\n say(describeContextError(err), 'danger');\n } finally {\n setRefreshing(false);\n }\n };\n\n const onReconnect = async (row: CapacityRow) => {\n setReconnecting(row.seatId);\n try {\n const done = await gate.run(`Open the sign-in for ${row.label} in Terminal`, async () => {\n await reconnectSeat(row.seatId);\n return true;\n });\n if (done) say(`Opened the sign-in for ${row.label} in Terminal. Finish it there; this page picks it up.`);\n } catch (err) {\n say(describeContextError(err), 'danger');\n } finally {\n setReconnecting(null);\n }\n };\n\n const onConfirmToggle = async () => {\n if (!toggle) return;\n setToggleBusy(true);\n setToggleError(null);\n try {\n const result = await gate.run(`${toggle.enable ? 'Switch on' : 'Restore'} ${toggle.row.name}`, () => toggleDesktopApp(toggle.row.id, toggle.enable));\n if (result) {\n say(`Opened “${result.command.join(' ')}” in Terminal. Answer its prompts there.`);\n setToggle(null);\n }\n } catch (err) {\n setToggleError(describeContextError(err));\n } finally {\n setToggleBusy(false);\n }\n };\n\n const launch = async (row: VerseAppRow, request: LaunchRequest) => {\n if (request.target === 'verse') {\n launchInVerse(row.id, request.choice);\n setLaunchRow(null);\n return;\n }\n if (request.root === null) return;\n setLaunchBusy(true);\n setLaunchError(null);\n try {\n const result = await gate.run(`Launch ${row.name} in Terminal`, () =>\n launchInTerminalApp(row.id, { root: request.root!, via: request.choice.via, model: request.choice.model }));\n if (result) {\n say(`Opened ${row.name} in Terminal.`);\n setLaunchRow(null);\n }\n } catch (err) {\n const message = describeContextError(err);\n if (launchRow) setLaunchError(message);\n else say(message, 'danger');\n } finally {\n setLaunchBusy(false);\n }\n };\n\n const quickLaunchReason = inVerse.available || projects.length > 0 ? null : 'Open a chat or enrol a project first.';\n const onQuickLaunch = (row: VerseAppRow) => {\n const choice: LaunchChoice = { via: 'native', model: null };\n const command = row.actions.find((a) => a.kind === 'launch')?.command ?? null;\n if (!command) return;\n void launch(row, { choice, target: inVerse.available ? 'verse' : 'terminal-app', root: projects[0]?.path ?? null, command });\n };\n\n const servedLoading = apps.data === undefined && (apps.status === 'loading' || apps.status === 'idle');\n\n return (\n <section className={styles.section} aria-label=\"Apps & Accounts\">\n <div className={styles.scroll}>\n <div className={styles.page}>\n <header className={styles.header}>\n <div className={styles.headerText}>\n <h2 className={styles.title}>Apps & Accounts</h2>\n <p className={styles.lede}>Everything Verse can run with on this Mac, and whether it is ready.</p>\n </div>\n <div className={styles.headerMeta}>\n {served ? (\n <span>\n {checkedAgo(served.checkedAt, nowMs)}\n {served.pathSource === 'fallback' ? ' · PATH from known folders (your login shell did not answer)' : ''}\n </span>\n ) : null}\n <Button variant=\"ghost\" size=\"sm\" icon={<IconRefresh size={14} />} busy={refreshing} onClick={() => void onRefresh()}>\n Check again\n </Button>\n </div>\n </header>\n\n <p className={status ? styles.banner : styles.visuallyHidden} data-tone={status?.tone} role=\"status\" aria-live=\"polite\">\n {status?.text ?? ''}\n </p>\n\n <AccountsGroup\n seats={capacity.seats}\n health={capacity.health}\n budget={capacity.budget}\n loading={capacity.loading}\n reconnecting={reconnecting}\n onReconnect={(row) => void onReconnect(row)}\n />\n\n {apps.data && !apps.data.available ? (\n <p className={styles.banner}>{apps.data.reason}</p>\n ) : servedLoading ? (\n <div aria-busy=\"true\" aria-label=\"Checking apps\">\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"80%\" />\n <SkeletonLine width=\"70%\" />\n </div>\n ) : (\n <>\n {group('desktop') ? (\n <DesktopGroup\n group={group('desktop')!}\n onToggle={(row, enable) => { setToggleError(null); setToggle({ row, enable }); }}\n onRestore={(row) => { setToggleError(null); setToggle({ row, enable: false }); }}\n />\n ) : null}\n {group('terminal-agents') ? (\n <AgentsGroup\n group={group('terminal-agents')!}\n quickLaunchReason={quickLaunchReason}\n onQuickLaunch={onQuickLaunch}\n onLaunchOptions={(row) => { setLaunchError(null); setLaunchRow(row); }}\n />\n ) : null}\n {group('local-models') ? <LocalModelsGroup group={group('local-models')!} /> : null}\n </>\n )}\n\n <McpGroup\n snapshot={snapshot}\n cliHealth={cliHealth}\n unavailable={mcp.data && !mcp.data.available ? mcp.data.reason : null}\n loading={mcp.data === undefined}\n run={gate.run}\n onAdded={(text) => { say(text); refetchMcp(); }}\n headingRef={mcpHeading}\n />\n </div>\n </div>\n\n <DesktopToggleDialog\n row={toggle?.row ?? null}\n enable={toggle?.enable ?? false}\n busy={toggleBusy}\n error={toggleError}\n onCancel={() => setToggle(null)}\n onConfirm={() => void onConfirmToggle()}\n />\n <LaunchDialog\n row={launchRow}\n projects={projects}\n models={models}\n inVerse={inVerse}\n busy={launchBusy}\n error={launchError}\n onCancel={() => setLaunchRow(null)}\n onLaunch={(request) => { if (launchRow) void launch(launchRow, request); }}\n />\n <MutationTokenDialog\n open={gate.dialog.open}\n reason={gate.dialog.reason}\n tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={gate.dialog.onClose}\n onUnlocked={gate.dialog.onUnlocked}\n />\n </section>\n );\n}\n"],"mappings":"iyCAaA,SAAgB,GAAW,CAAE,OAAM,SAAsD,CACvF,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,OAAQ,YAAW,EAA3C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,UAAW,cAAY,MAAQ,CAAA,EACtD,CACG,GAEV,CAgBA,SAAgB,EAAO,CAAE,KAAI,OAAM,WAAU,SAAQ,cAAa,UAAS,SAAQ,SAAQ,QAAO,YAAyB,CACzH,OACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAW,EAAO,IAAK,WAAU,EAArC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAwB,WAAkB,QAAS,CAAA,GACnD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAG,EAAG,OAAQ,UAAW,EAAO,QAAU,SAAA,CAAW,CAAA,EAC9D,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,CAAc,CAAA,EAAI,MAClE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,KAAM,EAAO,KAAM,MAAO,EAAO,KAAQ,CAAA,CAClD,KACL,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,QAAU,SAAA,CAAe,CAAA,EAC7C,GAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAAY,SAAA,CAAU,CAAA,EAAI,KACxD,CACE,IACJ,GAAQ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAW,SAAA,CAAW,CAAA,EAAI,IACxD,GAER,CAGA,SAAgB,EAAS,CACvB,KACA,QACA,SACA,SACA,WACA,cAQC,CACD,IAAM,EAAY,cAAc,IAChC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,MAAO,kBAAiB,EAAW,aAAY,EAA1E,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAW,IAAK,EAAY,SAAU,GAAI,UAAW,EAAO,WAAa,SAAA,CAAU,CAAA,EAC1F,CACE,IACJ,GAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,OAAS,SAAA,CAAU,CAAA,EAAI,MACtD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAO,UAAc,CAAA,CACrC,GAEb,CChEA,IAAa,GAAkB,KAE/B,eAAsB,GAAS,EAAgC,CAC7D,GAAI,CACF,GAAI,OAAO,UAAc,KAAe,UAAU,WAAa,OAAO,UAAU,UAAU,WAAc,WAEtG,OADA,MAAM,UAAU,UAAU,UAAU,CAAI,EACjC,EAEX,MAAQ,CAER,CACA,GAAI,OAAO,SAAa,IAAa,MAAO,GAC5C,IAAM,EAAO,SAAS,cAAc,UAAU,EAC9C,EAAK,MAAQ,EACb,EAAK,aAAa,WAAY,EAAE,EAChC,EAAK,MAAM,SAAW,QACtB,EAAK,MAAM,QAAU,IACrB,SAAS,KAAK,YAAY,CAAI,EAC9B,EAAK,OAAO,EACZ,IAAI,EAAK,GACT,GAAI,CACF,EAAK,OAAO,SAAS,aAAgB,YAAc,SAAS,YAAY,MAAM,CAChF,MAAQ,CACN,EAAK,EACP,CAEA,OADA,EAAK,OAAO,EACL,CACT,CAEA,SAAgB,EAAS,CAAE,OAAM,QAAO,QAA0F,CAChI,GAAM,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAuC,MAAM,EACjE,GAAA,EAAQ,EAAA,OAAA,CAA6C,IAAI,GAC/D,EAAA,EAAA,UAAA,SAAsB,CAAM,EAAM,SAAS,aAAa,EAAM,OAAO,CAAG,EAAG,CAAC,CAAC,EAE7E,IAAM,EAAS,SAAY,CACzB,IAAM,EAAK,MAAM,GAAS,CAAI,EAC9B,EAAS,EAAK,SAAW,QAAQ,EAC7B,EAAM,SAAS,aAAa,EAAM,OAAO,EAC7C,EAAM,QAAU,eAAiB,EAAS,MAAM,EAAG,EAAe,CACpE,EAEA,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAxB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAO,KAClB,aAAY,EACZ,YAAe,KAAK,EAAO,EAC3B,aAAY,QAAQ,EAAK,IAAI,IAC7B,MAAO,SAAS,IANlB,SAAA,EAQE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAW,SAAA,GAAS,CAAW,CAAA,GACvD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,cAAY,OAC3C,SAAA,IAAU,UAAW,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,KAAM,EAAK,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAK,CAAA,CACjE,CAAA,CACA,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,eAAgB,KAAK,SAAS,YAAU,SAC7D,SAAA,IAAU,SAAW,SAAW,IAAU,SAAW,wDAA0D,EAC5G,CAAA,CACF,GAEV,CClDA,IAAa,EAAc,GAQ3B,SAAgB,GAAoB,EAKZ,CAOtB,OANe,EAAM,YAAc,GAAgB,eAAe,EAE9D,EAAM,oBAAsB,GAG5B,EAAM,kBAAoB,KAAa,CAAE,UAAW,GAAO,OAAQ,mDAAoD,EACpH,CAAE,UAAW,GAAM,OAAQ,IAAK,EAH9B,CAAE,UAAW,GAAO,OAAQ,EAAM,gBAAkB,2CAA4C,EAFrF,CAAE,UAAW,GAAO,OAAQ,uCAAwC,CAM1F,CAGA,SAAgB,GAAc,EAAe,EAA4B,CACnE,EAAO,MAAQ,UAAY,EAAO,QAAU,KAC9C,EAAgB,CAAE,OAAQ,GAAM,OAAM,CAAC,EAGvC,EAAgB,CAAE,OAAQ,GAAM,QAAO,IAAK,SAAU,GAAI,EAAO,QAAU,KAAiC,CAAC,EAA3B,CAAE,MAAO,EAAO,KAAM,CAAQ,CAAC,EAInH,EAAgB,MAAM,CACxB,CCxBA,IAAa,GACX,wJAEF,SAAgB,GAAc,CAC5B,QACA,SACA,SACA,UACA,eACA,cACA,OAWC,CACD,GAAM,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAA6B,IAAI,EACvD,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAK,EAC5C,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAwB,IAAI,EACtD,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAA8D,IAAI,EACpF,EAAO,GAAa,EACpB,GAAA,EAAW,EAAA,MAAA,CAAM,EACjB,GAAA,EAAa,EAAA,MAAA,CAAM,EACnB,GAAA,EAAW,EAAA,OAAA,CAA0B,IAAI,EACzC,EAAa,IAAW,KAExB,EAAa,KAAO,IAAqB,CAC7C,EAAY,EAAI,MAAM,EACtB,EAAQ,IAAI,EACZ,GAAI,CAEE,MADe,EAAK,IAAI,SAAS,EAAI,MAAM,sDAAyD,EAAkB,CAAC,GACjH,EAAQ,CAAE,KAAM,UAAW,KAAM,WAAW,EAAI,MAAM,QAAS,CAAC,CAC5E,OAAS,EAAK,CACZ,EAAQ,CAAE,KAAM,SAAU,KAAM,EAAqB,CAAG,CAAE,CAAC,CAC7D,QAAU,CACR,EAAY,IAAI,CAClB,CACF,EAEA,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,GAAG,WACH,MAAM,WACN,OAAO,6GAHT,SAAA,CAKG,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAa,YAAU,OAAO,SAAA,mBAAoB,CAAA,GAEvE,EAAA,EAAA,IAAA,CAAC,EAAD,CACS,QACC,SACA,SACR,WAAW,sBACX,UAAW,GACX,SAAU,CAAE,aAAY,eAAgB,EAAU,GAAI,IAAQ,IAAA,GAAsB,CAAC,EAAX,CAAE,KAAI,CAAQ,EACxF,cAAgB,GAGd,GAAe,EAAK,EAAc,EAAK,CAAE,aAAY,GAAI,IAAQ,IAAA,GAAsB,CAAC,EAAX,CAAE,KAAI,CAAQ,CAAC,CAAC,CAAC,CAAC,IAAK,IAClG,EAAA,EAAA,IAAA,CAAC,EAAD,CAEE,KAAK,KACL,QAAS,EAAO,SAAW,EAAO,OAAS,cAAgB,UAAY,QACvE,KAAO,EAAO,OAAS,aAAe,IAAiB,EAAI,QAAY,EAAO,OAAS,eAAiB,IAAa,EAAI,OACzH,aAAY,GAAG,EAAO,MAAM,IAAI,EAAI,QACpC,YAAe,CACT,EAAO,OAAS,YAAa,EAAY,CAAG,EACvC,EAAO,OAAS,cAAe,EAAgB,CAAG,EAClD,EAAO,OAAS,MAAO,EAAU,CAAG,EACxC,EAAc,EAAI,CACzB,EAEC,SAAA,EAAO,KACF,EAbD,EAAO,IAaN,CACT,CAEJ,CAAA,GAGH,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,EAAO,aAAe,EAAO,eAAgB,YAAW,GAAM,KAAM,KAAK,SAAS,YAAU,SAC9G,SAAA,GAAM,MAAQ,EACd,CAAA,EAEF,IAAW,MAAQ,EAAO,YAAY,YACrC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAA,GACA,YAAe,EAAU,IAAI,EAC7B,QAAS,EACT,MAAO,OAAO,EAAO,QACrB,YAAa,EAAO,WAAW,KAC/B,gBAAiB,EAEjB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,CACG,EAAO,WAAW,QAAQ,IAAK,IAAW,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAiB,CAAU,EAAnB,CAAmB,CAAC,GACvE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAc,SAAA,wBAA4B,CAAA,GAClE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAY,EAAO,WAAW,UAAU,EAAG,KAAM,eAAe,EAAO,OAAU,CAAA,CAC9F,KACL,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,iGAAkG,CAAA,GACrG,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cACrB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,IAAK,EAAU,QAAQ,SAAS,YAAe,EAAU,IAAI,EAAG,SAAA,MAAY,CAAA,CACjF,CAAA,CACF,GACC,CAAA,EACN,MAEJ,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EACN,YAAe,EAAc,EAAK,EAClC,QAAS,EACT,MAAM,SACN,YAAY,wEACZ,MAAO,IAEN,SAAA,GAAa,EAAA,EAAA,IAAA,CAAC,GAAD,CAAgB,CAAA,EAAI,IAC7B,CAAA,GAEP,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAAK,OAAO,KAClB,OAAQ,EAAK,OAAO,OACpB,WAAW,iBACX,UAAU,yCACV,QAAS,EAAK,OAAO,QACrB,WAAY,EAAK,OAAO,UACzB,CAAA,CACO,GAEd,CCrJA,IAAa,GAAW,aACX,GAAsB,wBAMnC,eAAe,GAAY,EAAc,EAAkD,CACzF,GAAI,CACF,MAAO,CAAE,UAAW,GAAM,KAAM,MAAM,EAAU,EAAM,CAAM,CAAE,CAChE,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EAIpE,OAHI,aAAe,GAAY,EAAI,SAAW,IACrC,CAAE,UAAW,GAAO,OAAQ,mGAAoG,EAElI,CAAE,UAAW,GAAO,OAAQ,aAAe,EAAW,gCAAgC,EAAI,OAAO,GAAK,sCAAuC,CACtJ,CACF,CAGA,IAAa,EAAyD,CACpE,IAAK,GACL,MAAQ,GAAW,GAA4B,EAAiB,CAAM,CACxE,EAOa,GAA2E,CACtF,IAAK,GACL,MAAQ,GAAW,GAAoC,EAAqB,CAAM,CACpF,EAEA,eAAe,GAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAGA,eAAsB,IAA0C,CAC9D,IAAM,EAAO,MAAM,GAAwB,GAAG,EAAgB,UAAW,CAAC,CAAC,EAM3E,OALA,MAAM,EACJ,GACA,MAAqB,QAAQ,QAAQ,CAAE,UAAW,GAAe,KAAM,CAAK,CAAC,MAAS,EAAU,MAAM,CAAC,EACvG,EACF,EACO,CACT,CAcA,eAAsB,GAAiB,EAAe,EAA8C,CAClG,IAAM,EAAS,MAAM,GAAwB,GAAG,EAAgB,GAAG,mBAAmB,CAAK,EAAE,SAAU,CAAE,UAAS,QAAS,EAAK,CAAC,EAEjI,OADA,EAAkB,OAAgB,EAAU,MAAM,EAAG,EAAI,EAClD,CACT,CASA,SAAgB,GAAoB,EAAe,EAAiE,CAClH,OAAO,GAAwB,GAAG,EAAgB,GAAG,mBAAmB,CAAK,EAAE,SAAU,CACvF,KAAM,EAAQ,KACd,GAAI,EAAQ,IAAM,CAAE,IAAK,EAAQ,GAAI,EAAI,CAAC,EAC1C,GAAI,EAAQ,MAAQ,CAAE,MAAO,EAAQ,KAAM,EAAI,CAAC,CAClD,CAAC,CACH,CC1FA,SAAgB,GAAoB,CAClC,MACA,SACA,OACA,QACA,WACA,aASC,CACD,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAY,EAAA,OAAA,CAA0B,IAAI,EAChD,GAAI,IAAQ,MAAQ,EAAI,SAAW,KAAM,OAAO,KAChD,IAAM,EAAM,EAAS,EAAI,OAAO,QAAU,EAAI,OAAO,eAC/C,EAAO,EAAS,EAAI,OAAO,eAAiB,EAAI,OAAO,QACvD,EAAQ,EAAS,YAAY,EAAI,YAAY,IAAM,WAAW,EAAI,KAAK,GAC7E,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAA,GACA,QAAS,EACA,UACF,QACP,gBAAiB,EACjB,YAAa,EAAS,gBAAgB,EAAI,KAAK,uCAAyC,aAAa,EAAI,KAAK,4BAE9G,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,CACG,EAAI,QAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAI,MAAU,CAAA,EAAI,KACnC,GAAU,EAAI,KAAO,kBACpB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,oIAGA,CAAA,EACD,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAc,SAAA,MAAU,CAAA,GAChD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAY,CAAG,EAAG,KAAK,uBAAyB,CAAA,CAC7D,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAe,SAAA,EAAS,kBAAoB,mBAA0B,CAAA,GAC9F,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAY,CAAI,EAAG,KAAM,EAAS,sBAAwB,8BAAiC,CAAA,CACxG,KACL,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,oIAGA,CAAA,EACF,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MAChE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,IAAK,EAAW,QAAQ,SAAS,QAAS,EAAU,SAAA,QAAc,CAAA,GAC1E,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,EAAS,SAAW,UAAiB,OAAM,QAAS,EAClE,SAAA,EAAS,mBAAqB,qBACzB,CAAA,CACL,GACF,GACC,CAAA,CAEZ,CCnDA,SAAgB,GAAa,CAC3B,MACA,WACA,SACA,UACA,OACA,QACA,WACA,YAWC,CACD,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAW,EAAA,OAAA,CAAyB,IAAI,EACxC,CAAC,EAAK,IAAA,EAAU,EAAA,SAAA,CAAoB,QAAQ,EAC5C,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAiB,EAAE,EACvC,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAiB,EAAS,EAAE,EAAE,MAAQ,EAAE,GAGhE,EAAA,EAAA,UAAA,KAAgB,CACd,EAAO,QAAQ,EACf,EAAS,EAAE,EACX,EAAQ,EAAS,EAAE,EAAE,MAAQ,EAAE,CAEjC,EAAG,CAAC,GAAK,EAAE,CAAC,EAEZ,IAAM,EAAuB,CAAE,MAAK,MAAO,IAAQ,UAAY,IAAU,GAAK,EAAQ,IAAK,EACrF,GAAA,EAAU,EAAA,QAAA,KAAe,EAAM,EAAc,EAAK,CAAM,EAAI,KAAO,CAAC,EAAK,EAAO,IAAK,EAAO,KAAK,CAAC,EACxG,GAAI,IAAQ,KAAM,OAAO,KACzB,IAAM,EAAgB,EAAc,EAAK,CAAE,IAAK,SAAU,MAAO,IAAK,CAAC,EACjE,EAAgB,EAAI,aACpB,EAAY,GAAG,EAAQ,MACvB,EAAiB,IAAS,GAEhC,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAA,GACA,QAAS,EACA,UACT,MAAO,UAAU,EAAI,OACrB,YAAY,yCACZ,gBAAiB,EAEjB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,WAAD,CAAU,UAAW,EAAO,SAA5B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,OAAQ,SAAA,KAAW,CAAA,EAC5C,GACC,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,MAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,IAAK,EAAU,KAAK,QAAQ,KAAM,EAAW,QAAS,IAAQ,SAAU,aAAgB,EAAO,QAAQ,CAAI,CAAA,GAClH,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAY,CAAa,CAAQ,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,SAAA,iBAAqB,CAAA,CAC9C,CACL,CAAA,EAAA,KACH,GACC,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,MAAzB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,QAAQ,KAAM,EAAW,QAAS,IAAQ,SAAU,aAAgB,EAAO,QAAQ,CAAI,CAAA,GACnG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAY,CAAa,CAAQ,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,SAAA,gBAAoB,CAAA,CAC7C,CACL,CAAA,EAAA,IACI,IAET,IAAQ,SACP,EAAO,OAAS,GACd,EAAA,EAAA,KAAA,CAAC,EAAD,CAAQ,MAAM,cAAc,MAAO,EAAO,SAAW,GAAM,EAAS,EAAE,OAAO,KAAK,EAAlF,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,kBAAwB,CAAA,EACxC,EAAO,IAAK,IAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAgB,MAAO,EAAI,SAAA,CAAU,EAAxB,CAAwB,CAAC,CACnD,CAER,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,SAAA,sEAAuE,CAAA,EAElG,MAEJ,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,MAAM,wBACN,MAAO,EACP,SAAW,GAAM,EAAQ,EAAE,OAAO,KAAK,EACvC,KAAM,EAAS,SAAW,EAAI,4CAA8C,+CAC5E,SAAU,EAAS,SAAW,EALhC,SAAA,CAOG,EAAS,SAAW,GAAI,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,GAAS,CAAA,EAAI,KACtD,EAAS,IAAK,IAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAqB,MAAO,EAAE,KAAO,SAAA,EAAE,IAAa,EAAvC,EAAE,IAAqC,CAAC,CACpE,IAEP,GACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAc,SAAA,SAAa,CAAA,GACnD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAY,CAAO,EAAG,KAAM,OAAO,EAAI,KAAK,gBAAmB,CAAA,CAC5E,CACH,CAAA,EAAA,KAEH,IAAQ,UAAY,EAAQ,WAC3B,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,SAAA,oHAAqH,CAAA,EAC9I,KACH,CAAC,EAAQ,WAAa,EAAQ,QAAS,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAArB,SAAA,CAA2B,mBAAiB,EAAQ,MAAU,CAAI,CAAA,EAAA,KACzG,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MAEhE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,QAAS,EAAU,SAAA,QAAc,CAAA,GACzD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAQ,UAAY,SAAW,UAClC,OACN,SAAU,CAAC,GAAkB,IAAY,KACzC,YAAe,GAAW,EAAS,CAAE,SAAQ,OAAQ,eAAgB,OAAM,SAAQ,CAAC,EACrF,SAAA,sBAEO,CAAA,EACP,EAAQ,WACP,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,UACR,SAAU,IAAY,KACtB,YAAe,GAAW,EAAS,CAAE,SAAQ,OAAQ,QAAS,KAAM,KAAM,SAAQ,CAAC,EACpF,SAAA,wBAEO,CAAA,EACN,IACD,GACF,GACC,CAAA,CAEZ,suBErIA,SAAgB,GAAoB,CAClC,SACA,WAIY,CACZ,IAAM,EAAU,EAAO,MAAQ,KAAO,CAAC,EAAI,OAAO,KAAK,EAAO,GAAG,EAEjE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,CACG,IAAY,IAAA,GAAY,MAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,WAAa,SAAA,CAAW,CAAA,GAE7E,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAArB,SAAA,CACG,EAAO,QACP,EAAO,KAAK,OAAS,EAAI,IAAI,EAAO,KAAK,KAAK,GAAG,IAAM,EACvD,IAEF,EAAQ,SAAW,GAClB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,SAAA,qDAAsD,CAAA,GAElF,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAArB,SAAA,CACG,EAAQ,OAAO,wBAAsB,EAAQ,SAAW,EAAI,GAAK,IAAI,qDAErE,CACH,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,QACnB,SAAA,EAAQ,IAAK,IACZ,EAAA,EAAA,KAAA,CAAC,KAAD,CAAc,UAAW,EAAO,QAAhC,SAAA,CACG,EAAI,QACH,CAFK,EAAA,CAEL,CACL,CACC,CAAA,CACJ,CAAA,CAAA,GAGJ,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAArB,SAAA,CAA2B,iBAAe,EAAO,SAAa,GAC3D,GAET,CCxCA,IAAa,GAAmB,qBACnB,GAAqB,uBASlC,SAAS,GAAgB,EAAc,EAAsB,CAO3D,OANI,aAAe,EACb,EAAI,SAAW,IACV,+BAA+B,EAAK,gCAEtC,GAAG,EAAK,iBAAiB,EAAI,OAAO,GAEtC,GAAG,EAAK,uBACjB,CAEA,SAAS,GAAY,EAA+D,CAClF,OAAO,KAAO,IAAW,CACvB,GAAI,CAEF,MAAO,CAAE,IAAA,MADS,EAAgB,EAAM,CAAM,EAChC,UAAW,GAAM,OAAQ,IAAK,CAC9C,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EACpE,MAAO,CAAE,IAAK,KAAM,UAAW,GAAO,OAAQ,GAAgB,EAAM,CAAG,CAAE,CAC3E,CACF,CACF,CAGA,IAAa,GAA2C,CACtD,IAAK,GACL,MAAO,GAAY,gBAAgB,CACrC,EAGa,GAA4C,CACvD,IAAK,GACL,MAAO,GAAY,2BAA2B,CAChD,EAMa,GAAb,cAAoC,KAAM,CACxC,aAAc,CACZ,MAAM,2EAA2E,EACjF,KAAK,KAAO,gBACd,CACF,EAEA,eAAe,GAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,GACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAiBA,SAAgB,GAAiB,EAAgB,EAA0C,CACzF,OAAO,GAAc,0BAA2B,CAAE,SAAQ,QAAO,CAAC,CACpE,CAQA,eAAsB,GACpB,EACA,EACA,EACkB,CAClB,IAAM,EAAS,MAAM,GAAc,uBAAwB,CACzD,SACA,SACA,SACA,QAAS,EACX,CAAC,EAED,OADA,EAAW,EAAgB,EACpB,CACT,CC/FA,SAAS,GAAQ,CAAE,OAA4B,CAC7C,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,GAAA,EAAS,EAAA,MAAA,CAAM,EACf,EAAM,EAAI,QAAQ,OAAS,EACjC,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,GAAI,OAAO,EAAI,SACf,KAAM,EAAI,MACV,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,YAAa,EAAI,SACjB,OAAQ,CAAE,KAAM,EAAM,UAAY,MAAO,MAAO,EAAI,KAAM,EAC1D,MACE,GACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,QACR,KAAK,KACL,gBAAe,EACf,gBAAe,EACf,KAAM,GAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,KAAM,EAAK,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,KAAM,EAAK,CAAA,EAC1E,YAAe,EAAS,GAAM,CAAC,CAAC,EAE/B,SAAA,EAAO,eAAiB,cACnB,CAAA,EACN,KAnBR,SAAA,EAsBE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAI,MAAa,CAAA,EACrD,GAAO,GACN,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,GAAI,EAAQ,UAAW,EAAO,QAChC,SAAA,EAAI,QAAQ,IAAK,IAAW,EAAA,EAAA,IAAA,CAAC,GAAD,CAA+C,SAAQ,QAAS,EAAO,IAAO,EAApD,EAAO,IAA6C,CAAC,CACzG,CAAA,EACH,IACE,GAEZ,CAaA,SAAS,GAAe,EAA+B,CACrD,GAAoB,OAAO,GAAQ,WAA/B,EAAyC,OAAO,KACpD,IAAM,EAAI,EACJ,EAAS,EAAa,EAAE,MAAS,EACjC,EAAS,EAAE,OAEjB,MADI,CAAC,GAAU,OAAO,EAAE,QAAc,UAAY,CAAC,EAAe,KAC3D,CACL,SACA,UAAW,OAAO,EAAO,KAAW,SAAW,EAAO,IAAS,GAC/D,YAAa,OAAO,EAAO,OAAa,SAAW,EAAO,MAAW,GACrE,OAAQ,EAAE,SAAc,UAAY,UAAY,MAChD,SAAU,EAAa,EAAE,QAAW,EACpC,SAAU,MAAM,QAAQ,EAAE,QAAW,EAAI,EAAE,SAAY,OAAQ,GAAmB,OAAO,GAAM,QAAQ,EAAI,CAAC,EAC5G,KAAM,OAAO,EAAE,MAAY,SAAW,EAAE,KAAU,GAClD,OAAQ,EAAE,MACZ,CACF,CAEA,SAAS,GAAS,EAAsB,CAGtC,OAFI,aAAe,EAAiB,EAAI,QAAU,4BAA4B,EAAI,OAAO,IACrF,aAAe,OAAS,EAAI,OAAS,2BAAmC,gDACrE,qCACT,CAEA,SAAS,GAAe,CAAE,OAAM,WAAU,MAAK,UAAS,WAMrD,CACD,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,EAAU,EAAW,CAAQ,EAC7B,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,KAAK,EACpC,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAE,EAC7B,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAS,EAAE,EACnC,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAE,EAC7B,CAAC,EAAK,IAAA,EAAU,EAAA,SAAA,CAAS,EAAE,EAC3B,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAwB,IAAI,EAChD,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAA4E,IAAI,EAE1G,MAAc,CAClB,EAAY,IAAI,EAChB,EAAS,IAAI,EACb,EAAQ,EAAK,CACf,EAEM,GAAS,KAAO,IAAqB,CACzC,EAAM,eAAe,EACrB,EAAS,IAAI,EACb,IAAM,EAAY,EAAc,CAAG,EACnC,GAAI,CAAC,EAAU,GAAI,CACjB,EAAS,EAAU,KAAK,EACxB,MACF,CACA,IAAM,EAAwB,CAC5B,KAAM,EAAK,KAAK,EAChB,QAAS,EAAQ,KAAK,EACtB,KAAM,EAAU,CAAI,EACpB,GAAI,OAAO,KAAK,EAAU,GAAG,CAAC,CAAC,OAAS,EAAI,CAAE,IAAK,EAAU,GAAI,EAAI,CAAC,CACxE,EACA,EAAQ,EAAI,EACZ,GAAI,CACF,IAAM,EAAM,MAAM,EAAI,4CAA+C,GAAiB,EAAQ,CAAK,CAAC,EACpG,GAAI,IAAQ,KAAM,OAClB,IAAM,EAAQ,GAAe,CAAG,EAC3B,EACA,EAAY,CAAE,QAAO,SAAQ,OAAM,CAAC,EAD7B,EAAS,4DAA4D,CAEnF,OAAS,EAAK,CACZ,EAAS,GAAS,CAAG,CAAC,CACxB,QAAU,CACR,EAAQ,EAAK,CACf,CACF,EAEM,EAAQ,SAAY,CACnB,KAEL,CADA,EAAQ,EAAI,EACZ,EAAS,IAAI,EACb,GAAI,CAEF,GAAI,MADe,EAAI,wBAA2B,GAAe,EAAS,OAAQ,EAAS,MAAO,EAAS,MAAM,MAAM,CAAC,IAC3G,KAAM,OACnB,EAAQ,GAAG,EAAS,MAAM,SAAW,UAAY,WAAa,QAAQ,GAAG,EAAS,MAAM,OAAO,KAAK,MAAM,EAAS,MAAM,UAAU,EAAE,EACrI,EAAQ,EAAE,EACV,EAAW,EAAE,EACb,EAAQ,EAAE,EACV,EAAO,EAAE,EACT,EAAM,EACN,EAAQ,CACV,OAAS,EAAK,CACZ,EAAS,GAAS,CAAG,CAAC,CACxB,QAAU,CACR,EAAQ,EAAK,CACf,CAfa,CAgBf,EAEM,EAAS,EAAQ,KAAM,GAAM,EAAE,KAAO,CAAM,EAClD,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACQ,OACN,YAAe,CAAE,EAAM,EAAG,EAAQ,CAAG,EAC5B,UACT,MAAO,EAAW,uBAAyB,oBAC3C,YAAY,yHACZ,MAAO,IAEN,SAAA,IAAa,MACZ,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAY,SAAW,GAAM,KAAK,GAAO,CAAC,EAAlE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAM,SAAS,MAAO,EAAQ,SAAW,GAAM,EAAU,EAAE,OAAO,KAAK,EAC7E,KAAM,GAAQ,iBAAmB,IAAW,MAAQ,0BAA4B,mFAC/E,SAAA,EAAQ,IAAK,IAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAmB,MAAO,EAAE,GAAI,SAAU,EAAE,iBAAmB,KAAO,SAAA,EAAE,KAAc,EAAzE,EAAE,EAAuE,CAAC,CACrG,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAM,OAAO,MAAO,EAAM,SAAW,GAAM,EAAQ,EAAE,OAAO,KAAK,EAAG,SAAA,GAAS,YAAY,aAAa,aAAa,KAAO,CAAA,GACjI,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAM,UAAU,MAAO,EAAS,SAAW,GAAM,EAAW,EAAE,OAAO,KAAK,EAAG,SAAA,GAAS,YAAY,wBAAwB,aAAa,MAC5I,KAAK,sFAAwF,CAAA,GAC/F,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAM,YAAY,MAAO,EAAM,SAAW,GAAM,EAAQ,EAAE,OAAO,KAAK,EAAG,YAAY,sDAAsD,aAAa,KAAO,CAAA,GACtK,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAO,WAAzB,SAAA,CAAqC,gBACvB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,SAAA,qEAAyE,CAAA,GACnH,EAAA,EAAA,IAAA,CAAC,WAAD,CAAU,UAAW,EAAO,SAAU,MAAO,EAAK,SAAW,GAAM,EAAO,EAAE,OAAO,KAAK,EAAG,WAAY,GAAO,aAAa,KAAO,CAAA,CAC7H,IACN,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MAChE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,SAAS,QAAQ,QAAQ,QAAS,EAAS,SAAA,QAAc,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAK,SAAS,QAAQ,UAAgB,OAAM,SAAU,EAAK,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAM,IAAM,GAAQ,gBAAkB,KAAM,SAAA,QAErI,CAAA,CACL,GACD,CAEN,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,CACG,EAAS,MAAM,SAAW,UAAY,WAAa,OAAO,KAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAS,MAAM,OAAO,IAAa,CAAA,EAAC,MAAI,KAC7G,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAa,SAAA,EAAS,MAAM,SAAgB,CAAA,EACnE,EAAS,MAAM,YAAc,KAAK,EAAS,MAAM,YAAY,GAAK,GAAG,GACrE,CAAA,CAAA,GACH,EAAA,EAAA,IAAA,CAAC,GAAD,CAAqB,OAAQ,EAAS,MAAM,OAAQ,QAAQ,eAAiB,CAAA,EAC5E,EAAS,MAAM,UAAW,EAAA,EAAA,IAAA,CAAC,GAAD,CAAqB,OAAQ,EAAS,MAAM,SAAU,QAAQ,WAAa,CAAA,EAAI,KACzG,EAAS,MAAM,SAAS,OAAS,GAChC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,SAAW,SAAA,EAAS,MAAM,SAAS,IAAK,IAAM,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAa,CAAM,EAAV,CAAU,CAAC,CAAM,CAAA,EAC5F,KACH,EAAS,MAAM,MAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAO,SAAA,EAAS,MAAM,IAAQ,CAAA,EAAI,KAC7E,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MAChE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,YAAe,EAAY,IAAI,EAAG,SAAA,MAAY,CAAA,GACtE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,UAAgB,OAAM,YAAe,KAAK,EAAM,EAC7D,SAAA,EAAS,MAAM,SAAW,UAAY,iBAAmB,YACpD,CAAA,CACL,GACF,GAEF,CAAA,CAEX,CAEA,SAAgB,GAAS,CACvB,WACA,YACA,cACA,UACA,MACA,UACA,cAUC,CACD,GAAM,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,EAAK,EACpC,EAAO,EAAW,GAAY,CAAQ,EAAI,CAAC,EACjD,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,GAAG,cACH,MAAM,cACM,aACZ,QACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,SAAS,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAK,CAAA,EAAG,YAAe,EAAU,EAAI,EAAG,gBAAc,SAAS,SAAA,YAEhH,CAAA,EAEV,QACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CAAE,qEACmE,KACnE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,qBAAyB,CAAA,EAAC,kBAAc,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,cAAkB,CAAA,EAAC,oEAC7C,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,SAAa,CAAA,EAAC,iEAC9C,CAAA,CAAA,EAdN,SAAA,CAiBG,IAAa,MAAQ,EAAS,MAAM,OAAS,GAC5C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAa,KAAK,OAAzC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,yBAA+B,CAAA,EAAC,IAAE,EAAS,MAAM,KAAK,GAAG,EAAE,IAAE,EAAS,QAAQ,IACnF,CACH,CAAA,EAAA,KACH,IAAc,MAAQ,EAAU,eAC/B,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAa,KAAK,QAAzC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,oBAA0B,CAAA,EAAC,IAAE,EAAU,MAAM,KAAK,GAAG,EAAG,IAC/D,EAAU,SAAS,OAAQ,GAAM,EAAE,eAAiB,OAAO,CAAC,CAAC,IAAK,GAAM,GAAG,EAAE,MAAM,IAAI,EAAE,SAAW,SAAS,WAAW,EAAE,eAAiB,IAAI,EAAE,CAAC,CAAC,KAAK,GAAG,CACzJ,CACH,CAAA,EAAA,KACH,IAAa,MACZ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAa,YAAW,GAAW,IAAA,GACrD,SAAA,EAAU,qCAAwC,GAAe,mCACjE,CAAA,GAEH,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAK,IAAK,IAAQ,EAAA,EAAA,IAAA,CAAC,GAAD,CAA+B,KAAM,EAAvB,EAAI,MAAmB,CAAC,CACvD,CAAA,EAEL,GAAU,OACT,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,UAArB,SAAA,CAAgC,UACtB,EAAe,GAAmB,EAAS,MAAM,OAAQ,sCAAsC,EACtG,EAAS,MAAM,UAAY,KAAK,EAAS,MAAM,UAAU,GAAK,EAC9D,CACD,CAAA,EAAA,MACJ,EAAA,EAAA,IAAA,CAAC,GAAD,CAAgB,KAAM,EAAkB,WAAe,MAAK,YAAe,EAAU,EAAK,EAAY,SAAU,CAAA,CACxG,GAEd,CC5RA,SAAS,GAAU,EAAkB,CACnC,MAAO,CAAE,KAAM,EAAc,EAAI,OAAO,KAAK,EAAG,MAAO,EAAI,OAAO,KAAM,CAC1E,CAEA,SAAgB,GAAa,CAC3B,QACA,WACA,aAMC,CACD,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,GAAI,EAAM,GAAI,MAAO,EAAM,MAAO,OAAQ,EAAM,OACxD,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAM,KAAK,IAAK,GAAQ,CACvB,IAAM,EAAU,EAAI,QAAQ,KAAM,GAAM,EAAE,OAAS,SAAS,GAAK,KACjE,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAEE,GAAI,OAAO,EAAI,KACf,KAAM,EAAI,KACV,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,YAAa,EAAI,YACjB,OAAQ,GAAU,CAAG,EACrB,OAAQ,EAAI,SAAW,KAAO,EAAI,OAAS,KAC3C,MACE,EAAI,SAAW,KAAO,MACpB,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,YAAe,EAAU,CAAG,EAAG,SAAU,EAAQ,iBAAmB,KAAM,MAAO,EAAY,EAAQ,SAAW,CAAC,CAAC,EACjJ,SAAA,EAAQ,KACH,CAAA,EACN,MACJ,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAI,OAAO,QACpB,SAAW,GAAS,EAAS,EAAK,CAAI,EACtC,aAAY,GAAG,EAAI,YAAY,IAAI,EAAI,OAAO,QAAU,KAAO,QAC/D,mBAAkB,OAAO,EAAI,GAAG,MACjC,CAAA,CACD,CAAA,CAAA,CAGP,EAzBM,EAAI,EAyBV,CAEL,CAAC,CACC,CAAA,CACI,CAAA,CAEd,CAEA,SAAgB,GAAY,CAC1B,QACA,oBACA,gBACA,mBAOC,CACD,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,GAAI,EAAM,GAAI,MAAO,EAAM,MAAO,OAAQ,EAAM,OACxD,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAM,KAAK,IAAK,GAAQ,CACvB,IAAM,EAAS,EAAI,QAAQ,KAAM,GAAM,EAAE,OAAS,QAAQ,GAAK,KACzD,EAAW,GAAQ,gBAAkB,EAC3C,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAEE,GAAI,OAAO,EAAI,KACf,KAAM,EAAI,KACV,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,YAAa,EAAI,YACjB,QAAS,EAAI,QACb,OAAQ,GAAU,CAAG,EACrB,OAAQ,EAAI,OACZ,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,EAAI,MAAQ,EAAI,WAAY,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAI,KAAK,KAAM,MAAO,EAAI,KAAK,MAAO,KAAM,OAAO,EAAI,KAAK,SAAY,CAAA,EAAI,KACxH,EAAI,cACH,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAY,EAAI,YAAY,EAAG,KAAM,iCAAiC,EAAI,MAAS,CAAA,EACjG,KACH,EACC,EAAO,iBAAmB,MAGxB,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,SACR,KAAK,KACL,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,KAAM,EAAK,CAAA,EAC3B,SAAU,IAAa,KACvB,MAAO,GAAY,IAAA,GACnB,YAAe,EAAc,CAAG,EAChC,aAAY,UAAU,EAAI,OAC3B,SAAA,QAEO,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,SACR,KAAK,KACL,SAAA,GACA,MAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,KAAM,EAAK,CAAA,EAClC,aAAY,sBAAsB,EAAI,OACtC,MAAO,sBAAsB,EAAI,OACjC,gBAAc,SACd,YAAe,EAAgB,CAAG,CACnC,CAAA,CACG,CAEN,CAAA,GA1BA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,aAAe,SAAA,EAAO,cAAqB,CAAA,EA0BnE,IACJ,CAAA,CAAA,CAEL,EA9CM,EAAI,EA8CV,CAEL,CAAC,CACC,CAAA,CACI,CAAA,CAEd,CAEA,SAAgB,GAAiB,CAAE,SAAmC,CACpE,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,GAAI,EAAM,GAAI,MAAO,EAAM,MAAO,OAAQ,EAAM,OACxD,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,KACnB,SAAA,EAAM,KAAK,IAAK,IACf,EAAA,EAAA,IAAA,CAAC,EAAD,CAEE,GAAI,OAAO,EAAI,KACf,KAAM,EAAI,KACV,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,YAAa,EAAI,YACjB,QAAS,EAAI,QACb,OAAQ,GAAU,CAAG,EACrB,OAAQ,EAAI,MACb,EATM,EAAI,EASV,CACF,CACC,CAAA,CACI,CAAA,CAEd,CC7GA,IAAa,GAAe,IAE5B,SAAS,GAAW,EAAa,EAAqB,CACpD,IAAM,EAAI,KAAK,MAAM,CAAG,EACxB,GAAI,CAAC,OAAO,SAAS,CAAC,EAAG,MAAO,cAChC,IAAM,EAAU,KAAK,IAAI,EAAG,KAAK,OAAO,EAAM,GAAK,GAAM,CAAC,EAG1D,OAFI,EAAU,EAAU,mBACpB,EAAU,IAAY,WAAW,EAAQ,UACtC,WAAW,KAAK,MAAM,EAAU,EAAE,EAAE,OAC7C,CAEA,SAAgB,GAAY,CAAE,cAA+C,CAAC,EAAG,CAC/E,IAAM,EAAO,EAAS,CAAS,EACzB,EAAc,EAAW,CAAS,EACxC,EAAoB,EAAa,EAAY,EAC7C,IAAM,EAAW,EAAS,EAAmB,EACvC,EAAM,EAAS,EAAgB,EAC/B,EAAM,EAAS,EAAiB,EAChC,EAAa,EAAW,EAAgB,EACxC,EAAY,EAAS,CAAmB,EACxC,EAAW,GAAgB,EAC3B,EAAK,EAAW,EAChB,EAAO,GAAa,EAEpB,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAA8D,IAAI,EACxF,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAK,EAC5C,CAAC,EAAc,IAAA,EAAmB,EAAA,SAAA,CAAwB,IAAI,EAC9D,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAuD,IAAI,EACjF,CAAC,GAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAK,EAC5C,CAAC,GAAa,IAAA,EAAkB,EAAA,SAAA,CAAwB,IAAI,EAC5D,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAA6B,IAAI,EAC7D,CAAC,GAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAK,EAC5C,CAAC,GAAa,IAAA,EAAkB,EAAA,SAAA,CAAwB,IAAI,EAC5D,CAAC,GAAO,IAAA,EAAY,EAAA,SAAA,KAAe,KAAK,IAAI,CAAC,EACnD,MAA0B,EAAS,KAAK,IAAI,CAAC,EAAG,GAAM,EAEtD,IAAM,GAAA,EAAa,EAAA,OAAA,CAA2B,IAAI,GAClD,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,IAAe,cAAe,OAClC,IAAM,EAAK,EAAW,QACjB,IACD,OAAO,EAAG,gBAAmB,YAAY,EAAG,eAAe,CAAE,MAAO,OAAQ,CAAC,EACjF,EAAG,MAAM,CAAE,cAAe,EAAK,CAAC,EAClC,EAAG,CAAC,CAAU,CAAC,EAEf,IAAM,EAAO,EAAU,KACjB,EAAW,GAAe,CAAI,EAC9B,EAAS,GAAe,EAAS,KAAK,EACtC,EAAU,GAAoB,CAClC,kBAAmB,EAAS,MAAM,UAAY,EAAS,KAAK,KAAK,UAAY,GAAS,MAAe,KACrG,eAAgB,EAAS,MAAM,UAAY,EAAS,KAAK,KAAK,OAAS,KACvE,gBAAiB,EAAG,eACtB,CAAC,EAEK,EAAS,EAAK,MAAM,UAAY,EAAK,KAAK,KAAO,KACjD,EAAS,GAAuD,GAAQ,OAAO,KAAM,GAAM,EAAE,KAAO,CAAE,GAAK,KAC3G,GAAW,EAAI,MAAM,UAAY,GAAmB,EAAI,KAAK,GAAG,EAAI,KACpE,EAAY,EAAI,MAAM,UAAY,GAAiB,EAAI,KAAK,GAAG,EAAI,KAEnE,GAAA,EAAM,EAAA,YAAA,EAAa,EAAc,EAA6B,YAAc,EAAU,CAAE,OAAM,MAAK,CAAC,EAAG,CAAC,CAAC,EAEzG,GAAY,SAAY,CAC5B,EAAc,EAAI,EAClB,GAAI,CAME,MALe,EAAK,IAAI,iCAAkC,UAC5D,MAAM,QAAQ,IAAI,CAAC,GAAY,EAAG,EAAkB,CAAC,CAAC,UAAY,IAAI,CAAC,CAAC,EACxE,EAAW,EACJ,GACR,IAEC,EAAS,KAAK,IAAI,CAAC,EACnB,EAAI,gBAAgB,EAExB,OAAS,EAAK,CACZ,EAAI,EAAqB,CAAG,EAAG,QAAQ,CACzC,QAAU,CACR,EAAc,EAAK,CACrB,CACF,EAEM,GAAc,KAAO,IAAqB,CAC9C,EAAgB,EAAI,MAAM,EAC1B,GAAI,CAKE,MAJe,EAAK,IAAI,wBAAwB,EAAI,MAAM,cAAe,UAC3E,MAAM,GAAc,EAAI,MAAM,EACvB,GACR,GACS,EAAI,0BAA0B,EAAI,MAAM,sDAAsD,CAC1G,OAAS,EAAK,CACZ,EAAI,EAAqB,CAAG,EAAG,QAAQ,CACzC,QAAU,CACR,EAAgB,IAAI,CACtB,CACF,EAEM,GAAkB,SAAY,CAC7B,KAEL,CADA,EAAc,EAAI,EAClB,EAAe,IAAI,EACnB,GAAI,CACF,IAAM,EAAS,MAAM,EAAK,IAAI,GAAG,EAAO,OAAS,YAAc,UAAU,GAAG,EAAO,IAAI,WAAc,GAAiB,EAAO,IAAI,GAAI,EAAO,MAAM,CAAC,EAC/I,IACF,EAAI,WAAW,EAAO,QAAQ,KAAK,GAAG,EAAE,yCAAyC,EACjF,EAAU,IAAI,EAElB,OAAS,EAAK,CACZ,EAAe,EAAqB,CAAG,CAAC,CAC1C,QAAU,CACR,EAAc,EAAK,CACrB,CAXmB,CAYrB,EAEM,EAAS,MAAO,EAAkB,IAA2B,CACjE,GAAI,EAAQ,SAAW,QAAS,CAC9B,GAAc,EAAI,GAAI,EAAQ,MAAM,EACpC,EAAa,IAAI,EACjB,MACF,CACI,KAAQ,OAAS,KAErB,CADA,EAAc,EAAI,EAClB,EAAe,IAAI,EACnB,GAAI,CAGE,MAFiB,EAAK,IAAI,UAAU,EAAI,KAAK,kBAC/C,GAAoB,EAAI,GAAI,CAAE,KAAM,EAAQ,KAAO,IAAK,EAAQ,OAAO,IAAK,MAAO,EAAQ,OAAO,KAAM,CAAC,CAAC,IAE1G,EAAI,UAAU,EAAI,KAAK,cAAc,EACrC,EAAa,IAAI,EAErB,OAAS,EAAK,CACZ,IAAM,EAAU,EAAqB,CAAG,EACpC,EAAW,EAAe,CAAO,EAChC,EAAI,EAAS,QAAQ,CAC5B,QAAU,CACR,EAAc,EAAK,CACrB,CAdmB,CAerB,EAEM,EAAoB,EAAQ,WAAa,EAAS,OAAS,EAAI,KAAO,wCACtE,GAAiB,GAAqB,CAC1C,IAAM,EAAuB,CAAE,IAAK,SAAU,MAAO,IAAK,EACpD,EAAU,EAAI,QAAQ,KAAM,GAAM,EAAE,OAAS,QAAQ,CAAC,EAAE,SAAW,KACpE,GACL,EAAY,EAAK,CAAE,SAAQ,OAAQ,EAAQ,UAAY,QAAU,eAAgB,KAAM,EAAS,EAAE,EAAE,MAAQ,KAAM,SAAQ,CAAC,CAC7H,EAEM,GAAgB,EAAK,OAAS,IAAA,KAAc,EAAK,SAAW,WAAa,EAAK,SAAW,QAE/F,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,QAAS,aAAW,kBAA/C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OACrB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,OAA1B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,MAAO,SAAA,iBAAuB,CAAA,GACpD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,SAAA,qEAAsE,CAAA,CAC9F,CACL,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WAAvB,SAAA,CACG,GACC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CACG,GAAW,EAAO,UAAW,EAAK,EAClC,EAAO,aAAe,WAAa,+DAAiE,EACjG,CAAA,CAAA,EACJ,MACJ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAK,CAAA,EAAG,KAAM,EAAY,YAAe,KAAK,GAAU,EAAG,SAAA,aAE9G,CAAA,CACL,CACC,CAAA,CAAA,KAER,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAS,EAAO,OAAS,EAAO,eAAgB,YAAW,GAAQ,KAAM,KAAK,SAAS,YAAU,SAC5G,SAAA,GAAQ,MAAQ,EAChB,CAAA,GAEH,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,MAAO,EAAS,MAChB,OAAQ,EAAS,OACjB,OAAQ,EAAS,OACjB,QAAS,EAAS,QACJ,eACd,YAAc,GAAQ,KAAK,GAAY,CAAG,CAC3C,CAAA,EAEA,EAAK,MAAQ,CAAC,EAAK,KAAK,WACvB,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,OAAS,SAAA,EAAK,KAAK,MAAU,CAAA,EAChD,IACF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,YAAU,OAAO,aAAW,gBAAjC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,MAAM,KAAO,CAAA,CACxB,CAEL,CAAA,GAAA,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,EAAM,SAAS,GACd,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,MAAO,EAAM,SAAS,EACtB,UAAW,EAAK,IAAW,CAAE,EAAe,IAAI,EAAG,EAAU,CAAE,MAAK,QAAO,CAAC,CAAG,EAC/E,UAAY,GAAQ,CAAE,EAAe,IAAI,EAAG,EAAU,CAAE,MAAK,OAAQ,EAAM,CAAC,CAAG,CAChF,CAAA,EACC,KACH,EAAM,iBAAiB,GACtB,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,MAAO,EAAM,iBAAiB,EACX,oBACJ,iBACf,gBAAkB,GAAQ,CAAE,EAAe,IAAI,EAAG,EAAa,CAAG,CAAG,CACtE,CAAA,EACC,KACH,EAAM,cAAc,GAAI,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,MAAO,EAAM,cAAc,CAAK,CAAA,EAAI,IAC/E,CAAA,CAAA,GAGJ,EAAA,EAAA,IAAA,CAAC,GAAD,CACY,YACC,YACX,YAAa,EAAI,MAAQ,CAAC,EAAI,KAAK,UAAY,EAAI,KAAK,OAAS,KACjE,QAAS,EAAI,OAAS,IAAA,GACtB,IAAK,EAAK,IACV,QAAU,GAAS,CAAE,EAAI,CAAI,EAAG,EAAW,CAAG,EAC9C,WAAY,CACb,CAAA,CACE,GACF,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,IAAK,GAAQ,KAAO,KACpB,OAAQ,GAAQ,QAAU,GAC1B,KAAM,GACN,MAAO,GACP,aAAgB,EAAU,IAAI,EAC9B,cAAiB,KAAK,GAAgB,CACvC,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,IAAK,EACK,WACF,SACC,UACT,KAAM,GACN,MAAO,GACP,aAAgB,EAAa,IAAI,EACjC,SAAW,GAAY,CAAM,GAAW,EAAY,EAAW,CAAO,CAAG,CAC1E,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAAK,OAAO,KAClB,OAAQ,EAAK,OAAO,OACpB,WAAW,iBACX,UAAU,yCACV,QAAS,EAAK,OAAO,QACrB,WAAY,EAAK,OAAO,UACzB,CAAA,CACM,GAEb"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{C as r,D as i,E as a,I as ee,L as te,P as o,R as ne,T as re,_ as ie,c as s,d as ae,f as oe,g as se,i as c,k as l,l as ce,m as le,n as ue,p as de,r as fe,s as pe,t as me,u as he,w as ge}from"./useChartWidth-owwodNVz.js";import{_ as _e}from"./colors-BZ3a9wFf.js";import{l as ve,o as u,t as ye}from"./format-DKrNjdwD.js";var d=n(e(),1),f=t(),p=12,be=26,m=12,xe=6.6,Se=120,h=14;function g({title:e,description:t,caveat:n,status:g,series:_,stacked:v=!1,height:y=200,width:Ce,formatX:b,formatY:x,threshold:S,yDomain:we,ariaLabel:Te}){let C=b??u,w=x??ye,T=(0,d.useRef)(null),E=me(T,Ce),D=he(),[O,k]=(0,d.useState)(null),A=(0,d.useId)(),j=_.map((e,t)=>e.color??_e(t)),M=(0,d.useMemo)(()=>{let e=_.flatMap(e=>e.points.map(e=>e.x)),t=ne(e),n=Array.from(new Set(e.filter(t))).sort((e,t)=>e-t),r=_.map(e=>new Map(e.points.map(e=>[e.x,e.y])));return n.map(e=>{let t=r.map(t=>t.has(e)?t.get(e):null);return{x:e,values:t,total:t.some(e=>e===null)?null:t.reduce((e,t)=>e+(t??0),0)}})},[_]),Ee=M.some(e=>e.values.some(e=>e!==null)),De=g??(Ee?{kind:`ready`}:{kind:`empty`}),N=v?M.map(e=>e.total).filter(e=>e!==null):M.flatMap(e=>e.values).filter(e=>e!==null),P=x?l(x):null,F=we??(P!==null&&(e=>N.every(t=>t>=e[0]&&t<=e[1]))([0,P])?[0,P]:null),I=le(Math.min(0,F?.[0]??0,...N),Math.max(0,F?.[1]??0,...N,S?.value??0),{count:4,integer:N.length>0&&oe(N),format:x}),L=I.ticks,R=L[0],Oe=L[L.length-1],z=te(I.labels,28,64,D),B=y-p-be,V=i(R,Oe,p+B,p),H=!v&&_.length<=4?Math.max(0,..._.map(e=>e.label.length))*xe*D+6:0,U=_.flatMap((e,t)=>{for(let n=M.length-1;n>=0;n--){let r=M[n].values[t];if(r!=null)return[{key:e.id,y:V(r)}]}return[]}),W=H>0&&H<=Se&&E>=420?se(U,h*D,p,p+B):null,G=W!==null&&U.length>0,ke=m+(G?H:0),K=Math.max(40,E-z-ke),q=M.length?M[0].x:0,J=M.length?M[M.length-1].x:1,Y=r(M.map(e=>e.x)),[Ae,je]=Y&&J>q?ie(q,J,ae):[q,J],X=i(Ae,je,z,z+K),Me=(()=>{if(v){let e=M.map(()=>0);return _.map((t,n)=>{let r=M.map((t,r)=>{if(t.total===null)return{x:t.x,y:null,base:null};let i=e[r];return e[r]=i+(t.values[n]??0),{x:t.x,y:e[r],base:i}});return o(r.map(e=>({x:e.x,y:e.y}))).map(e=>({top:e.map(e=>({x:X(e.x),y:V(e.y)})),bottom:e.map(e=>{let t=r.find(t=>t.x===e.x);return{x:X(e.x),y:V(t.base??0)}})}))})}return _.map((e,t)=>o(M.map(e=>({x:e.x,y:e.values[t]??null}))).map(e=>({top:e.map(e=>({x:X(e.x),y:V(e.y)})),bottom:e.map(e=>({x:X(e.x),y:V(Math.max(R,0))}))})))})(),Z=ee(M.length,Math.max(2,Math.floor(K/84))),Ne=Y?ve(q,J,b,Z.map(e=>M[e].x)):[C],Pe=re(Z.map((e,t)=>{let n=X(M[e].x),r=t===0,i=t===Z.length-1;return{key:String(e),x:n,anchor:M.length===1?`middle`:r&&n<=z+.5?`start`:i&&n>=z+K-.5?`end`:`middle`,priority:i?3:r?2:1,required:r||i,variants:Ne.map(t=>t(M[e].x))}}),{min:z,max:z+K,charPx:ge(D)});function Fe(e){let t=T.current;if(!t||M.length===0)return null;let n=e-t.getBoundingClientRect().left,r=0,i=1/0;return M.forEach((e,t)=>{let a=Math.abs(X(e.x)-n);a<i&&(i=a,r=t)}),r}function Ie(e){if(M.length===0)return;let t=O??M.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?M.length-1:null;n!==null&&(e.preventDefault(),k(Math.max(0,Math.min(M.length-1,n))))}let Q=O===null?void 0:M[O],$=[...M].reverse().find(e=>e.values.some(e=>e!==null)),Le=Te??(M.length?`${e}: ${M.length} points from ${C(q)} to ${C(J)}.`+($?` Latest ${C($.x)}: ${_.map((e,t)=>`${e.label} ${$.values[t]===null?`no data`:w($.values[t])}`).join(`, `)}.`:``):`${e}: no data.`),Re=[{key:`x`,label:`When`,render:e=>C(e.x)},..._.map((e,t)=>({key:e.id,label:e.label,numeric:!0,render:e=>e.values[t]===null?`—`:w(e.values[t])})),...v&&_.length>1?[{key:`__total`,label:`Total`,numeric:!0,render:e=>e.total===null?`—`:w(e.total)}]:[]];return(0,f.jsx)(ue,{title:e,description:t,caveat:n,status:De,table:(0,f.jsx)(ce,{caption:e,columns:Re,rows:M,rowKey:e=>String(e.x)}),footer:(0,f.jsx)(fe,{items:_.map((e,t)=>({label:e.label,color:j[t],kind:v?`swatch`:`line`}))}),children:(0,f.jsxs)(`div`,{ref:T,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read values.`,"aria-describedby":A,onFocus:()=>k(e=>e??(M.length?M.length-1:null)),onBlur:()=>k(null),onKeyDown:Ie,children:[(0,f.jsxs)(`svg`,{className:s.svg,width:E,height:y,viewBox:`0 0 ${E} ${y}`,role:`img`,"aria-label":Le,onPointerMove:e=>k(Fe(e.clientX)),onPointerLeave:()=>k(null),children:[L.map((e,t)=>(0,f.jsxs)(`g`,{children:[(0,f.jsx)(`line`,{className:s.grid,x1:z,x2:z+K,y1:V(e),y2:V(e)}),(0,f.jsx)(`text`,{className:s.tick,x:z-6,y:V(e),dy:`0.32em`,textAnchor:`end`,children:I.labels[t]})]},e)),(0,f.jsx)(`line`,{className:s.axis,x1:z,x2:z+K,y1:V(Math.max(R,0)),y2:V(Math.max(R,0))}),Pe.map(e=>(0,f.jsx)(`text`,{"data-axis-label":e.key,className:s.tick,x:e.x,y:y-8,textAnchor:e.anchor,children:e.text},e.key)),Me.map((e,t)=>(0,f.jsxs)(`g`,{"data-series":_[t].id,children:[e.map((e,n)=>(0,f.jsx)(`path`,{d:de(e.top,e.bottom),fill:j[t],className:v?void 0:s.wash,opacity:v?.85:void 0,stroke:v?`var(--chart-surface)`:void 0,strokeWidth:v?2:void 0},`a${n}`)),v?null:e.map((e,n)=>e.top.length===1?(0,f.jsx)(`circle`,{cx:e.top[0].x,cy:e.top[0].y,r:3,fill:j[t]},`p${n}`):(0,f.jsx)(`path`,{d:a(e.top),stroke:j[t],className:s.line},`l${n}`)),G&&e.length?(()=>{let n=e[e.length-1].top,r=n[n.length-1];return(0,f.jsx)(`text`,{"data-end-label":_[t].id,className:s.label,x:r.x+6,y:W.get(_[t].id)??r.y,dy:`0.32em`,children:_[t].label})})():null]},_[t].id)),S?(0,f.jsxs)(`g`,{children:[(0,f.jsx)(`line`,{className:s.reference,x1:z,x2:z+K,y1:V(S.value),y2:V(S.value)}),(0,f.jsxs)(`text`,{className:s.tick,x:z+K,y:V(S.value)-4,textAnchor:`end`,children:[S.label,` · `,w(S.value)]})]}):null,Q?(0,f.jsxs)(`g`,{children:[(0,f.jsx)(`line`,{className:s.crosshair,x1:X(Q.x),x2:X(Q.x),y1:p,y2:p+B}),_.map((e,t)=>{let n=v?Q.total===null?null:Q.values.slice(0,t+1).reduce((e,t)=>e+(t??0),0):Q.values[t];return n==null?null:(0,f.jsx)(`circle`,{className:s.marker,cx:X(Q.x),cy:V(n),r:4,fill:j[t]},e.id)})]}):null]}),(0,f.jsx)(`span`,{id:A,className:s.srOnly,"aria-live":`polite`,children:Q?`${C(Q.x)}: ${_.map((e,t)=>`${e.label} ${Q.values[t]===null?`no data`:w(Q.values[t])}`).join(`, `)}`:``}),Q?(0,f.jsx)(c,{left:pe(X(Q.x),E),top:p,title:C(Q.x),rows:[..._.map((e,t)=>({key:e.id,label:e.label,value:Q.values[t]===null?null:w(Q.values[t]),color:j[t]})),...v&&_.length>1?[{key:`__t`,label:`Total`,value:Q.total===null?null:w(Q.total)}]:[]]}):null]})})}export{g as t};
|
|
2
|
-
//# sourceMappingURL=AreaTrend-CDxrQU4b.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{t as r}from"./Dialog-BS9Dxi3G.js";import{t as i}from"./MutationTokenDialog-mxrw0Yvy.js";import{n as a}from"./viewport-nTubFCwf.js";import{a as o}from"./command-bus-xYZoK9nQ.js";import{i as s,r as c}from"./section-visibility-Yctxu-if.js";import{C as l,S as u,_ as d,a as f,b as p,c as m,d as h,f as g,g as _,h as v,i as y,m as b,o as x,p as S,r as C,s as w,u as T,w as E,x as D}from"./git-model-bk_RXh3y.js";import{t as O}from"./Button-HHXgoXGr.js";import{i as k}from"./icons-DEQa2rTx.js";import{n as A}from"./use-token-gate-DqrSXdX6.js";var j=n(e(),1),M={bar:`_bar_1j44k_8`,rows:`_rows_1j44k_15`,row:`_row_1j44k_15`,ident:`_ident_1j44k_39`,glyph:`_glyph_1j44k_47`,repo:`_repo_1j44k_48`,branch:`_branch_1j44k_57`,drift:`_drift_1j44k_66`,stat:`_stat_1j44k_72`,add:`_add_1j44k_90`,del:`_del_1j44k_91`,checking:`_checking_1j44k_93`,conflicts:`_conflicts_1j44k_94`,spacer:`_spacer_1j44k_101`,split:`_split_1j44k_105`,primary:`_primary_1j44k_113`,menuButton:`_menuButton_1j44k_114`,visuallyHidden:`_visuallyHidden_1j44k_148`,primaryLabel:`_primaryLabel_1j44k_162`,spinner:`_spinner_1j44k_163`,"branch-spin":`_branch-spin_1j44k_1`,menu:`_menu_1j44k_114`,"menu-in":`_menu-in_1j44k_1`,menuItem:`_menuItem_1j44k_204`,menuLabel:`_menuLabel_1j44k_224`,menuReason:`_menuReason_1j44k_225`,more:`_more_1j44k_233`,notice:`_notice_1j44k_248`},N=t();function P({primary:e,items:t,onSelect:n,menuLabel:r,disabled:i=!1}){let[a,o]=(0,j.useState)(!1),[s,c]=(0,j.useState)(-1),l=(0,j.useId)(),u=(0,j.useId)(),d=(0,j.useRef)(null),f=(0,j.useRef)(null),p=(0,j.useRef)([]),m=t.map((e,t)=>e.disabledReason===null?t:-1).filter(e=>e>=0),h=(0,j.useCallback)(e=>{o(!1),c(-1),e&&d.current?.focus()},[]),g=e=>{o(!0),c(m.length===0?-1:e===`first`?m[0]:m[m.length-1])};(0,j.useEffect)(()=>{a&&(s>=0?p.current[s]?.focus():f.current?.focus())},[a,s]),(0,j.useEffect)(()=>{if(!a)return;let e=e=>{let t=e.target;f.current?.contains(t)||d.current?.contains(t)||h(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[a,h]);let _=e=>{if(m.length===0)return;let t=m.indexOf(s),n=t===-1?e===1?0:m.length-1:(t+e+m.length)%m.length;c(m[n])},v=e=>{e.key===`ArrowDown`?(e.preventDefault(),g(`first`)):e.key===`ArrowUp`&&(e.preventDefault(),g(`last`))},y=e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),_(1);break;case`ArrowUp`:e.preventDefault(),_(-1);break;case`Home`:e.preventDefault(),m.length&&c(m[0]);break;case`End`:e.preventDefault(),m.length&&c(m[m.length-1]);break;case`Escape`:e.preventDefault(),e.stopPropagation(),h(!0);break;case`Tab`:h(!1)}},b=e=>{e.disabledReason===null&&(h(!0),n(e.id))};return(0,N.jsxs)(`div`,{className:M.split,"data-open":a?`true`:`false`,children:[e?(0,N.jsxs)(`button`,{type:`button`,className:M.primary,"data-tone":e.tone??`primary`,onClick:e.onClick,disabled:i||e.busy,"aria-busy":e.busy||void 0,"aria-describedby":u,title:e.disclosure,children:[e.busy?(0,N.jsx)(`span`,{className:M.spinner,"aria-hidden":`true`}):null,(0,N.jsx)(`span`,{className:M.primaryLabel,children:e.label})]}):null,(0,N.jsx)(`span`,{id:u,className:M.visuallyHidden,children:e?.disclosure??``}),(0,N.jsx)(`button`,{ref:d,type:`button`,className:M.menuButton,"data-alone":e?`false`:`true`,"aria-haspopup":`menu`,"aria-expanded":a,"aria-controls":a?l:void 0,"aria-label":r,title:r,disabled:i,onClick:()=>a?h(!1):g(`first`),onKeyDown:v,children:(0,N.jsx)(k,{width:14,height:14,"aria-hidden":`true`})}),a?(0,N.jsx)(`div`,{ref:f,id:l,role:`menu`,"aria-label":r,className:M.menu,tabIndex:-1,onKeyDown:y,children:t.map((e,t)=>(0,N.jsxs)(`button`,{ref:e=>{p.current[t]=e},type:`button`,role:`menuitem`,className:M.menuItem,tabIndex:t===s?0:-1,"aria-disabled":e.disabledReason!==null||void 0,onClick:()=>b(e),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),b(e))},children:[(0,N.jsx)(`span`,{className:M.menuLabel,children:e.label}),e.disabledReason?(0,N.jsx)(`span`,{className:M.menuReason,children:e.disabledReason}):null]},e.id))}):null]})}var F={form:`_form_1pzii_5`,facts:`_facts_1pzii_11`,fact:`_fact_1pzii_11`,factWord:`_factWord_1pzii_34`,ref:`_ref_1pzii_45`,label:`_label_1pzii_55`,optional:`_optional_1pzii_62`,input:`_input_1pzii_68`,textarea:`_textarea_1pzii_69`,mono:`_mono_1pzii_85`,row:`_row_1pzii_87`,field:`_field_1pzii_93`,check:`_check_1pzii_100`,hint:`_hint_1pzii_111`,error:`_error_1pzii_126`,actions:`_actions_1pzii_137`};function I(e){e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),e.currentTarget.requestSubmit())}function L({children:e}){return(0,N.jsx)(`ul`,{className:F.facts,children:e})}function R({tone:e=`neutral`,children:t}){return(0,N.jsxs)(`li`,{className:F.fact,"data-tone":e,children:[e===`warning`?(0,N.jsx)(`span`,{className:F.factWord,children:`Note`}):null,(0,N.jsx)(`span`,{children:t})]})}function z({error:e}){return e?(0,N.jsx)(`p`,{role:`alert`,className:F.error,children:e}):null}function B({name:e}){return(0,N.jsx)(`code`,{className:F.ref,children:e??`HEAD`})}function V({open:e,status:t,onClose:n,onSubmit:i,error:a,busy:o}){let s=(0,j.useId)(),c=(0,j.useId)(),[l,u]=(0,j.useState)(``),d=(0,j.useRef)(null);return(0,j.useEffect)(()=>{e&&u(``)},[e]),(0,N.jsx)(r,{open:e,onClose:n,titleId:s,title:`Commit changes`,initialFocusRef:d,children:(0,N.jsxs)(`form`,{className:F.form,onSubmit:e=>{e.preventDefault(),l.trim()&&!o&&i(l.trim())},onKeyDown:I,children:[(0,N.jsx)(L,{children:(0,N.jsxs)(R,{children:[m(t.dirty),` changed `,t.dirty===1?`file`:`files`,` in `,(0,N.jsx)(`strong`,{children:t.name}),` on `,(0,N.jsx)(B,{name:t.branch}),`, untracked files included.`]})}),(0,N.jsx)(`label`,{className:F.label,htmlFor:c,children:`Message`}),(0,N.jsx)(`textarea`,{id:c,ref:d,className:F.textarea,rows:4,value:l,onChange:e=>u(e.target.value),placeholder:`What changed, and why`,maxLength:1e4,required:!0}),(0,N.jsxs)(`p`,{className:F.hint,children:[`Git hooks in this repository run as usual. `,(0,N.jsx)(`kbd`,{children:`⌘`}),(0,N.jsx)(`kbd`,{children:`Enter`}),` commits.`]}),(0,N.jsx)(z,{error:a}),(0,N.jsxs)(`div`,{className:F.actions,children:[(0,N.jsx)(O,{variant:`ghost`,onClick:n,children:`Cancel`}),(0,N.jsx)(O,{type:`submit`,variant:`primary`,busy:o,disabled:!l.trim(),children:`Commit`})]})]})})}function H({open:e,status:t,onClose:n,onSubmit:i,error:a,busy:o,draft:s}){let c=(0,j.useId)(),l=(0,j.useId)(),u=(0,j.useId)(),d=(0,j.useId)(),[f,p]=(0,j.useState)(``),[h,g]=(0,j.useState)(``),[_,v]=(0,j.useState)(``),[b,x]=(0,j.useState)(s),S=(0,j.useRef)(null);(0,j.useEffect)(()=>{e&&(p(y(t)),g(``),v(t.base??``),x(s))},[e]);let C=t.upstream===null||t.ahead>0;return(0,N.jsx)(r,{open:e,onClose:n,titleId:c,title:b?`Create draft pull request`:`Create pull request`,initialFocusRef:S,children:(0,N.jsxs)(`form`,{className:F.form,onSubmit:e=>{e.preventDefault(),f.trim()&&_.trim()&&!o&&i({title:f.trim(),body:h,base:_.trim(),draft:b})},onKeyDown:I,children:[(0,N.jsxs)(L,{children:[C?(0,N.jsxs)(R,{children:[`Pushes `,(0,N.jsx)(B,{name:t.branch}),` to `,t.upstream??`origin`,` first`,t.upstream&&t.ahead>0?` (${m(t.ahead)} ${t.ahead===1?`commit`:`commits`})`:``,`.`]}):null,(0,N.jsxs)(R,{children:[`Then opens a PR from `,(0,N.jsx)(B,{name:t.branch}),` into `,(0,N.jsx)(B,{name:_.trim()||null}),`:`,` `,m(t.diffstat.files),` `,t.diffstat.files===1?`file`:`files`,`, `,w(t.diffstat.additions,t.diffstat.deletions),`.`]}),t.dirty>0?(0,N.jsxs)(R,{tone:`warning`,children:[m(t.dirty),` uncommitted `,t.dirty===1?`change is`:`changes are`,` not in the PR. Commit first to include `,t.dirty===1?`it`:`them`,`.`]}):null]}),(0,N.jsx)(`label`,{className:F.label,htmlFor:l,children:`Title`}),(0,N.jsx)(`input`,{id:l,ref:S,className:F.input,value:f,onChange:e=>p(e.target.value),maxLength:256,required:!0}),(0,N.jsxs)(`label`,{className:F.label,htmlFor:u,children:[`Description `,(0,N.jsx)(`span`,{className:F.optional,children:`optional`})]}),(0,N.jsx)(`textarea`,{id:u,className:F.textarea,rows:4,value:h,onChange:e=>g(e.target.value),maxLength:6e4}),(0,N.jsxs)(`div`,{className:F.row,children:[(0,N.jsxs)(`div`,{className:F.field,children:[(0,N.jsx)(`label`,{className:F.label,htmlFor:d,children:`Base branch`}),(0,N.jsx)(`input`,{id:d,className:`${F.input} ${F.mono}`,value:_,onChange:e=>v(e.target.value),spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,required:!0})]}),(0,N.jsxs)(`label`,{className:F.check,children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:b,onChange:e=>x(e.target.checked)}),`Draft`]})]}),(0,N.jsx)(z,{error:a}),(0,N.jsxs)(`div`,{className:F.actions,children:[(0,N.jsx)(O,{variant:`ghost`,onClick:n,children:`Cancel`}),(0,N.jsx)(O,{type:`submit`,variant:`primary`,busy:o,disabled:!f.trim()||!_.trim(),children:b?`Create draft PR`:`Create PR`})]})]})})}function U({open:e,pin:t,live:n,onClose:i,onSubmit:a,error:o,busy:s}){let c=(0,j.useId)(),l=(0,j.useRef)(null),u=S(t),d=g(t,n)??(u.verified?null:`This head has not passed every check GitHub needs to merge it.`);return(0,N.jsx)(r,{open:e,onClose:i,titleId:c,title:`Merge #${t.number}?`,description:t.title,initialFocusRef:l,children:(0,N.jsxs)(`form`,{className:F.form,onSubmit:e=>{e.preventDefault(),!s&&d===null&&a()},onKeyDown:I,children:[(0,N.jsxs)(L,{children:[(0,N.jsxs)(R,{children:[`Squash-merges `,(0,N.jsx)(B,{name:t.headRef||null}),` into `,(0,N.jsx)(B,{name:t.baseRef||null}),` on GitHub.`]}),(0,N.jsxs)(R,{tone:u.verified?`neutral`:`warning`,children:[`Head `,(0,N.jsx)(`code`,{className:F.ref,children:u.sha}),`, `,u.detail]}),(0,N.jsx)(R,{children:`Only this head merges: GitHub re-checks it first, so if a commit landed after it, nothing merges. Admin overrides are never used.`}),d===null?null:(0,N.jsx)(R,{tone:`warning`,children:d})]}),(0,N.jsx)(z,{error:o}),(0,N.jsxs)(`div`,{className:F.actions,children:[(0,N.jsx)(O,{variant:`ghost`,onClick:i,children:`Cancel`}),(0,N.jsxs)(O,{ref:l,type:`submit`,variant:`primary`,busy:s,disabled:d!==null,children:[`Merge #`,t.number]})]})]})})}var W={chip:`_chip_1sdua_5`,glyph:`_glyph_1sdua_26`,state:`_state_1sdua_30`,checks:`_checks_1sdua_33`,number:`_number_1sdua_37`,title:`_title_1sdua_43`,pulse:`_pulse_1sdua_65`,"pr-pulse":`_pr-pulse_1sdua_1`};function G({pr:e,counts:t=null,showTitle:n=!0}){let r=v(e,t);return(0,N.jsxs)(`a`,{className:W.chip,"data-tone":r.tone,href:e.url,target:`_blank`,rel:`noopener noreferrer`,"aria-label":`${r.label}. Opens on GitHub.`,title:`${r.label}. Opens on GitHub.`,children:[(0,N.jsx)(K,{tone:r.tone,state:e.state}),(0,N.jsx)(`span`,{className:W.number,children:r.number}),n&&e.title?(0,N.jsx)(`span`,{className:W.title,children:e.title}):null,(0,N.jsxs)(`span`,{className:W.state,children:[r.state,e.state===`merged`?` ✓`:``]}),r.checks?(0,N.jsx)(`span`,{className:W.checks,children:r.checks}):null]})}function K({tone:e,state:t}){let n={width:12,height:12,viewBox:`0 0 16 16`,"aria-hidden":!0,className:W.glyph};return t===`merged`?(0,N.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,children:[(0,N.jsx)(`circle`,{cx:`4`,cy:`3.5`,r:`1.8`}),(0,N.jsx)(`circle`,{cx:`4`,cy:`12.5`,r:`1.8`}),(0,N.jsx)(`circle`,{cx:`12`,cy:`8`,r:`1.8`}),(0,N.jsx)(`path`,{d:`M4 5.3v5.4M5.2 4.6c1.4 2.2 3.2 3.4 5 3.4`})]}):t===`closed`?(0,N.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,children:[(0,N.jsx)(`circle`,{cx:`4`,cy:`3.5`,r:`1.8`}),(0,N.jsx)(`circle`,{cx:`4`,cy:`12.5`,r:`1.8`}),(0,N.jsx)(`path`,{d:`M4 5.3v5.4M10 3l4 4M14 3l-4 4`})]}):e===`running`?(0,N.jsx)(`span`,{className:W.pulse,"aria-hidden":`true`}):e===`danger`?(0,N.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,children:[(0,N.jsx)(`circle`,{cx:`8`,cy:`8`,r:`6`}),(0,N.jsx)(`path`,{d:`M5.8 5.8l4.4 4.4M10.2 5.8l-4.4 4.4`})]}):e===`success`?(0,N.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,N.jsx)(`circle`,{cx:`8`,cy:`8`,r:`6`}),(0,N.jsx)(`path`,{d:`M5.2 8.2l2 2 3.6-4`})]}):(0,N.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,strokeDasharray:t===`draft`?`2 2`:void 0,children:[(0,N.jsx)(`circle`,{cx:`4`,cy:`3.5`,r:`1.8`}),(0,N.jsx)(`circle`,{cx:`4`,cy:`12.5`,r:`1.8`}),(0,N.jsx)(`circle`,{cx:`12`,cy:`12.5`,r:`1.8`}),(0,N.jsx)(`path`,{d:`M4 5.3v5.4M12 10.7V6.5c0-1.4-.8-2.2-2.2-2.2H7.5`})]})}var q=1e4,J=2500;function ee(e,t={}){let n=t.fetchStatus??p,r=t.enabled??!0,i=s(),a=e.join(`\0`),o=(0,j.useMemo)(()=>a===``?[]:a.split(`\0`),[a]),[l,u]=(0,j.useState)({}),[d,f]=(0,j.useState)(new Set),[m,h]=(0,j.useState)(null),g=(0,j.useRef)(new Set),_=(0,j.useRef)(null),v=(0,j.useRef)(null),y=(0,j.useRef)(!0),b=(0,j.useCallback)(()=>{_.current?.abort();let e=new AbortController;_.current=e;let t=o.filter(e=>!g.current.has(e));if(t.length===0){f(new Set(o));return}Promise.all(t.map(async t=>{try{return{root:t,status:await n(t,e.signal),err:null}}catch(e){return{root:t,status:null,err:e}}})).then(t=>{if(!y.current||e.signal.aborted)return;let n=null,r=!1,i={},a=[];for(let e of t)e.status?(i[e.root]=e.status,e.status.prLookup===`pending`&&(r=!0)):D(e.err)?(g.current.add(e.root),a.push(e.root)):(console.warn(`[verse] git status failed`,e.err),n=`Could not read git status.`);u(e=>{let t={...e,...i};for(let e of a)delete t[e];return t}),f(new Set(o)),h(n),r&&v.current===null&&(v.current=setTimeout(()=>{v.current=null,y.current&&x.current()},J))})},[o,n]),x=(0,j.useRef)(b);x.current=b,(0,j.useEffect)(()=>{g.current=new Set,u({}),f(new Set),h(null)},[a]);let S=(0,j.useRef)(i);S.current=i,(0,j.useEffect)(()=>{r&&S.current&&b()},[b,r]),c(b,q,{enabled:r}),(0,j.useEffect)(()=>(y.current=!0,()=>{y.current=!1,_.current?.abort(),v.current!==null&&clearTimeout(v.current)}),[]);let C=(0,j.useCallback)((e,t)=>{u(n=>({...n,[e]:{...t,root:e}}))},[]);return{statuses:(0,j.useMemo)(()=>o.map(e=>l[e]).filter(e=>e!==void 0),[o,l]),loading:o.some(e=>!d.has(e)),error:m,refresh:b,replace:C}}var te=6e3;function Y({roots:e,onOpenDiff:t,statusOptions:n}){let{statuses:r,loading:s,replace:c}=ee(e,n),{compact:p}=a(),m=A(),[_,v]=(0,j.useState)(!1),[y,x]=(0,j.useState)(null),[S,w]=(0,j.useState)(null),[D,O]=(0,j.useState)(null),[k,P]=(0,j.useState)(null),[F,I]=(0,j.useState)(null),L=(0,j.useId)();(0,j.useEffect)(()=>{if(k?.tone!==`ok`)return;let e=setTimeout(()=>P(null),te);return()=>clearTimeout(e)},[k]);let R=C(r).filter(T),z=e=>r.find(t=>t.root===e)??null,B=(0,j.useCallback)(async(e,t,n,r,i)=>{w(e),O(null),P(null);try{let i=await m.run(t,n);if(i===null)return;c(e,i.status),x(null),P({text:r(i.status),tone:`ok`})}catch(e){console.warn(`[verse] git action failed`,e);let t=f(e);i?O(t):P({text:t,tone:`error`})}finally{w(null)}},[m,c]),W=e=>B(e.root,`Push ${e.branch??`this branch`} to ${e.upstream??`origin`}.`,()=>E(e.root),e=>`Pushed ${e.branch??`the branch`} to ${e.upstream??`origin`}.`,!1),G=e=>t(e),K=e=>{let t=b(e);t&&(O(null),x({kind:`merge`,root:e.root,pin:t}))},q=e=>{switch(e.suggested){case`commit`:O(null),x({kind:`commit`,root:e.root});break;case`push`:W(e);break;case`create-pr`:O(null),x({kind:`pr`,root:e.root,draft:!1});break;case`merge`:K(e);break;case`view-pr`:e.pr&&window.open(e.pr.url,`_blank`,`noopener,noreferrer`)}},J=(e,t)=>{switch(t){case`draft-pr`:O(null),x({kind:`pr`,root:e.root,draft:!0});break;case`commit`:O(null),x({kind:`commit`,root:e.root});break;case`push`:W(e);break;case`open-github`:e.pr&&window.open(e.pr.url,`_blank`,`noopener,noreferrer`);break;case`copy-branch`:e.branch&&navigator.clipboard?.writeText(e.branch).then(()=>P({text:`Copied ${e.branch}.`,tone:`ok`}),()=>P({text:`Could not copy the branch name.`,tone:`error`}));break;case`review`:G({root:e.root,scope:e.dirty>0&&e.diffstat.files===0?`working`:`branch`})}},Y=e=>{if(O(null),e===`create-pr`){let e=R.find(e=>e.suggested===`create-pr`)??R.find(e=>h(e).find(e=>e.id===`draft-pr`)?.disabledReason===null);if(e){P(null),x({kind:`pr`,root:e.root,draft:!1});return}let t=R.length>0?h(R[0]).find(e=>e.id===`draft-pr`)?.disabledReason:null;P({text:t?`Can't open a pull request: ${t}.`:`No branch in this chat has changes to open a pull request from.`,tone:`error`});return}let t=R.find(e=>e.suggested===`merge`&&e.pr!==null);if(t){P(null),K(t);return}let n=R.find(e=>e.pr!==null&&(e.pr.state===`open`||e.pr.state===`draft`));P({text:n?.pr?`#${n.pr.number} isn't ready to merge yet — its checks haven't passed or it isn't mergeable.`:`No pull request in this chat is ready to merge.`,tone:`error`})},X=e=>{s?I(e):Y(e)};o(`git.create-pr`,()=>X(`create-pr`)),o(`git.merge-pr`,()=>X(`merge`));let Z=(0,j.useRef)(Y);if(Z.current=Y,(0,j.useEffect)(()=>{F===null||s||(I(null),Z.current(F))},[F,s]),R.length===0&&!k)return null;let Q=_?R:R.slice(0,1),re=R.length-Q.length,$=y?z(y.root):null;return(0,N.jsxs)(`section`,{className:M.bar,"aria-label":`Branches`,"data-compact":p?`true`:`false`,children:[(0,N.jsx)(`ul`,{id:L,className:M.rows,children:Q.map(e=>(0,N.jsx)(ne,{status:e,compact:p,busy:S===e.root,onPrimary:()=>q(e),onMenu:t=>J(e,t),onOpenDiff:()=>G({root:e.root,scope:`branch`})},e.gitRoot??e.root))}),R.length>1?(0,N.jsx)(`button`,{type:`button`,className:M.more,"aria-expanded":_,"aria-controls":L,onClick:()=>v(e=>!e),children:_?`Show fewer`:`Show ${re} more`}):null,(0,N.jsx)(`p`,{className:M.notice,role:k?.tone===`error`?`alert`:`status`,"aria-live":k?.tone===`error`?`assertive`:`polite`,"data-tone":k?.tone??`ok`,children:k?.text??``}),$&&y?.kind===`commit`?(0,N.jsx)(V,{open:!0,status:$,busy:S===y.root,error:D,onClose:()=>x(null),onSubmit:e=>void B(y.root,`Commit ${$.dirty} changed files on ${$.branch??`this branch`}.`,()=>d({root:y.root,message:e}),e=>`Committed on ${e.branch??`the branch`}.`,!0)}):null,$&&y?.kind===`pr`?(0,N.jsx)(H,{open:!0,draft:y.draft,status:$,busy:S===y.root,error:D,onClose:()=>x(null),onSubmit:e=>void B(y.root,`Push ${$.branch??`this branch`} and open a pull request into ${e.base}.`,async()=>{let t=await l({root:y.root,title:e.title,base:e.base,...e.body.trim()?{body:e.body}:{},...e.draft?{draft:!0}:{}});return{status:{...t.status,pr:t.pr??t.status.pr}}},e=>e.pr?`Opened #${e.pr.number}.`:`Opened the pull request.`,!0)}):null,y?.kind===`merge`?(0,N.jsx)(U,{open:!0,pin:y.pin,live:$,busy:S===y.root,error:D,onClose:()=>x(null),onSubmit:()=>{let{pin:e}=y;e.headSha!==null&&g(e,z(y.root))===null&&B(y.root,`Squash-merge #${e.number} (head ${e.headSha.slice(0,7)}) into ${e.baseRef}.`,async()=>{let t=await u({root:y.root,number:e.number,headSha:e.headSha});return{status:{...t.status,pr:t.pr??t.status.pr}}},()=>`Merged #${e.number} into ${e.baseRef}.`,!0)}}):null,(0,N.jsx)(i,{...m.dialog,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`})]})}function ne({status:e,compact:t,busy:n,onPrimary:r,onMenu:i,onOpenDiff:a}){let o=_(e),s=h(e),c=e.diffstat.files>0,l=e.pr===null&&e.prLookup===`pending`&&e.branch!==null&&e.suggested===`none`;return(0,N.jsxs)(`li`,{className:M.row,"aria-label":`${e.name}, ${e.branch?`branch ${e.branch}`:`detached HEAD`}`,children:[(0,N.jsxs)(`span`,{className:M.ident,children:[(0,N.jsx)(X,{}),(0,N.jsx)(`span`,{className:M.repo,title:e.gitRoot??e.root,children:e.name}),(0,N.jsx)(`span`,{className:M.branch,title:e.branch??void 0,children:e.branch??`detached HEAD`}),e.behind>0?(0,N.jsxs)(`span`,{className:M.drift,children:[e.behind,` behind`]}):null]}),c?(0,N.jsxs)(`button`,{type:`button`,className:M.stat,onClick:a,"aria-label":`${x(e.diffstat.files,e.diffstat.additions,e.diffstat.deletions)}. Open the branch diff.`,title:`Open the branch diff`,children:[(0,N.jsxs)(`span`,{className:M.add,children:[`+`,m(e.diffstat.additions)]}),(0,N.jsxs)(`span`,{className:M.del,children:[`−`,m(e.diffstat.deletions)]})]}):null,e.pr?(0,N.jsx)(G,{pr:e.pr,counts:e.prCheckCounts??null,showTitle:!t}):null,l?(0,N.jsx)(`span`,{className:M.checking,children:`Checking GitHub…`}):null,(e.conflicts??0)>0?(0,N.jsxs)(`span`,{className:M.conflicts,children:[e.conflicts,` conflicted`]}):null,(0,N.jsx)(`span`,{className:M.spacer}),(0,N.jsx)(P,{primary:o?{label:o.label,disclosure:o.disclosure,onClick:r,busy:n,tone:o.action===`view-pr`?`subtle`:`primary`}:null,items:s,onSelect:i,menuLabel:`More git actions for ${e.name}`,disabled:n})]})}function X(){return(0,N.jsxs)(`svg`,{className:M.glyph,width:`14`,height:`14`,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,"aria-hidden":`true`,children:[(0,N.jsx)(`circle`,{cx:`4.5`,cy:`3.5`,r:`1.7`}),(0,N.jsx)(`circle`,{cx:`4.5`,cy:`12.5`,r:`1.7`}),(0,N.jsx)(`circle`,{cx:`11.5`,cy:`5`,r:`1.7`}),(0,N.jsx)(`path`,{d:`M4.5 5.2v5.6M11.5 6.7c0 3-3.5 2.7-6.3 4.6`})]})}export{Y as BranchBar};
|
|
2
|
-
//# sourceMappingURL=BranchBar-CLsvOcyK.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,o as n,s as r}from"./index-BVxOlseC.js";import{m as i,p as a}from"./global-oEl9Qj8u.js";import{t as o}from"./MutationTokenDialog-mxrw0Yvy.js";import{t as s}from"./Segmented-BE53BenI.js";import{g as c,v as l}from"./format-BkWdOQDL.js";import{t as u}from"./Tag-DH15CUJp.js";import{n as d,r as f,t as p}from"./budget-queries-V3wcJVK_.js";import{_ as m,b as h,g,s as _,v,x as y,y as b}from"./capacity-strip-model-BDbmQ3e3.js";import{n as x,t as S}from"./use-token-gate-DqrSXdX6.js";import{t as C}from"./Slider-BypUWjpH.js";import{t as w}from"./Switch-iveI-8NY.js";var T=r(e(),1),E={panel:`_panel_18a87_5`,header:`_header_18a87_14`,title:`_title_18a87_20`,summary:`_summary_18a87_26`,age:`_age_18a87_32`,mode:`_mode_18a87_38`,modeText:`_modeText_18a87_44`,preview:`_preview_18a87_51`,previewLead:`_previewLead_18a87_62`,previewWhy:`_previewWhy_18a87_63`,error:`_error_18a87_69`,loading:`_loading_18a87_74`,empty:`_empty_18a87_75`,seats:`_seats_18a87_81`,seat:`_seat_18a87_81`,seatHead:`_seatHead_18a87_98`,marker:`_marker_18a87_105`,seatName:`_seatName_18a87_111`,status:`_status_18a87_119`,free:`_free_18a87_131`,toggle:`_toggle_18a87_135`,bars:`_bars_18a87_137`,bar:`_bar_18a87_137`,barLabel:`_barLabel_18a87_149`,bindingMark:`_bindingMark_18a87_157`,barValue:`_barValue_18a87_161`,unknown:`_unknown_18a87_166`,track:`_track_18a87_172`,used:`_used_18a87_179`,room:`_room_18a87_180`,reserveBand:`_reserveBand_18a87_181`,ceiling:`_ceiling_18a87_203`,trackUnknown:`_trackUnknown_18a87_211`,controls:`_controls_18a87_218`,freeLine:`_freeLine_18a87_224`,why:`_why_18a87_225`,more:`_more_18a87_230`,footnote:`_footnote_18a87_240`},D=n({BUDGET_COMMIT_DELAY_MS:()=>450,BUDGET_POLL_MS:()=>k,BudgetControl:()=>P,BudgetControlView:()=>N}),O=t(),k=6e4;function A({bar:e}){let t=e.usedPercent,n=b(e.ceilingPercent);if(t===null)return(0,O.jsxs)(`div`,{className:E.bar,"data-binding":e.binding||void 0,children:[(0,O.jsx)(`span`,{className:E.barLabel,children:e.label}),(0,O.jsx)(`div`,{className:E.trackUnknown,role:`img`,"aria-label":e.description}),(0,O.jsx)(`span`,{className:`${E.barValue} ${E.unknown}`,children:`no reading`})]});let r=b(t),i=r>=n;return(0,O.jsxs)(`div`,{className:E.bar,"data-binding":e.binding||void 0,children:[(0,O.jsxs)(`span`,{className:E.barLabel,children:[e.label,e.binding?(0,O.jsx)(`span`,{className:E.bindingMark,title:`This window limits autonomy right now`,children:`binding`}):null]}),(0,O.jsxs)(`div`,{className:E.track,role:`img`,"aria-label":e.description,children:[n<100?(0,O.jsx)(`div`,{className:E.reserveBand,style:{left:`${n}%`,width:`${100-n}%`}}):null,i?null:(0,O.jsx)(`div`,{className:E.room,style:{left:`${r}%`,width:`${n-r}%`}}),(0,O.jsx)(`div`,{className:E.used,"data-over":i||void 0,style:{width:`${r}%`}}),n<100?(0,O.jsx)(`div`,{className:E.ceiling,style:{left:`${n}%`}}):null]}),(0,O.jsxs)(`span`,{className:E.barValue,children:[c(t),` used`,n<100?` · stops at ${n}%`:``]})]})}function j(e,t){let[n,r]=(0,T.useState)(e),i=(0,T.useRef)(!1),a=(0,T.useRef)(null),o=(0,T.useRef)(t);return o.current=t,(0,T.useEffect)(()=>{i.current||r(e)},[e]),(0,T.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]),[n,(0,T.useCallback)(e=>{r(e),i.current=!0,a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{i.current=!1,a.current=null,o.current(e)},450)},[])]}function M({row:e,saving:t,readOnly:n,onSeat:r}){let i=(0,T.useId)(),a=e.policy.reservePercent,o=e.policy.maxSessionWindowPercent??100,[s,c]=j(a,t=>{t!==a&&r(e.seatId,{reservePercent:t})}),[l,d]=j(o,t=>{t!==o&&r(e.seatId,{maxSessionWindowPercent:t>=100?null:t})}),f=n||t;return(0,O.jsxs)(`li`,{className:E.seat,"aria-labelledby":i,"data-status":e.status,"aria-busy":t||void 0,children:[(0,O.jsxs)(`div`,{className:E.seatHead,children:[(0,O.jsx)(u,{engine:e.engine,className:E.marker}),(0,O.jsx)(`span`,{id:i,className:E.seatName,title:e.label,children:e.label}),(0,O.jsx)(`span`,{className:E.status,"data-status":e.status,children:m[e.status]}),e.free?(0,O.jsx)(`span`,{className:E.free,children:`free`}):null,(0,O.jsx)(w,{className:E.toggle,checked:e.policy.enabled,disabled:f,"aria-label":`Autonomy on ${e.label}`,label:`Autonomy`,onChange:t=>r(e.seatId,{enabled:t})})]}),e.bars.length>0?(0,O.jsx)(`div`,{className:E.bars,children:e.bars.map(e=>(0,O.jsx)(A,{bar:e},e.kind))}):e.free?(0,O.jsx)(`p`,{className:E.freeLine,children:`No usage window — local models cost nothing and are never held back for you.`}):null,!e.free&&e.policy.enabled?(0,O.jsxs)(`div`,{className:E.controls,children:[(0,O.jsx)(C,{label:`Kept for you`,min:0,max:100,step:5,value:s,disabled:f,valueLabel:`${s}%`,valueText:`${s} percent of the ${e.engine===`grok`?`billing period`:`weekly window`} kept for you`,onChange:e=>c(b(Number(e.currentTarget.value)))}),e.hasSessionCeiling?(0,O.jsx)(C,{label:`5-hour ceiling`,min:10,max:100,step:5,value:l,disabled:f,valueLabel:l>=100?`none`:`${l}%`,valueText:l>=100?`no 5-hour ceiling`:`autonomy stops at ${l} percent of the 5-hour window`,onChange:e=>d(b(Number(e.currentTarget.value),10,100))}):null]}):null,(0,O.jsx)(`p`,{className:E.why,children:e.why}),e.more.length>0?(0,O.jsxs)(`details`,{className:E.more,children:[(0,O.jsx)(`summary`,{children:e.more.length===1?`1 more note`:`${e.more.length} more notes`}),(0,O.jsx)(`ul`,{children:e.more.map(e=>(0,O.jsx)(`li`,{children:e},e))})]}):null]})}function N({view:e,preview:t,nowMs:n,pending:r,error:i,readOnly:a=!1,maxMode:o=null,onMode:c,onSeat:u}){let d=(0,T.useId)(),f=[..._(e).values()],p=v(f),m=g.find(t=>t.value===e.mode)??null,b=m??g[1],x=typeof e.readingMaxAgeMs==`number`&&Number.isFinite(e.readingMaxAgeMs)?e.readingMaxAgeMs:null,S=o?g.find(e=>e.value===o)?.label??o:null,C=h(e.mode,o),w=t?.seatId?f.find(e=>e.seatId===t.seatId):null;return(0,O.jsxs)(`section`,{className:E.panel,"aria-labelledby":d,children:[(0,O.jsxs)(`header`,{className:E.header,children:[(0,O.jsx)(`h2`,{id:d,className:E.title,children:`Budget`}),(0,O.jsx)(`p`,{className:E.summary,children:p.sentence}),(0,O.jsx)(`span`,{className:E.age,children:Number.isFinite(Date.parse(e.sampledAt))?`Readings ${y(e.sampledAt,n)}`:`Reading time not reported`})]}),(0,O.jsxs)(`div`,{className:E.mode,children:[(0,O.jsx)(s,{"aria-label":`Budget mode`,options:g.map(e=>({value:e.value,label:e.label,...h(e.value,o)?{ariaLabel:`${e.label} — above your grant`}:{},disabled:a||r!==null||h(e.value,o)})),value:e.mode,onChange:t=>{t!==e.mode&&!h(t,o)&&c(t)}}),(0,O.jsx)(`p`,{className:E.modeText,children:m?b.description:`The server did not say which mode is on.`}),S?(0,O.jsx)(`p`,{className:E.modeText,"data-ceiling":``,children:C?`Your grant allows up to ${S}, so autonomy spends as ${S} until this moves down.`:`Your grant allows up to ${S}; modes above it are off. Re-approve the grant to raise it.`}):null]}),t?(0,O.jsxs)(`p`,{className:E.preview,"aria-live":`polite`,children:[(0,O.jsx)(`span`,{className:E.previewLead,children:`Next medium task →`}),` `,(0,O.jsx)(`strong`,{children:w?.label??t.seatId??`nowhere right now`}),(0,O.jsx)(`span`,{className:E.previewWhy,children:typeof t.why==`string`?l(t.why,n):null})]}):null,i?(0,O.jsx)(`p`,{className:E.error,role:`alert`,children:i}):null,f.length===0?(0,O.jsx)(`p`,{className:E.empty,children:`No seats yet — connect an account or start Ollama, and they appear here.`}):(0,O.jsx)(`ul`,{className:E.seats,children:f.map(e=>(0,O.jsx)(M,{row:e,saving:r===e.seatId||r===`mode`,readOnly:a,onSeat:u},e.seatId))}),(0,O.jsxs)(`p`,{className:E.footnote,children:[`Reserves apply to autonomous work only — your own chats can always use a seat. Unknown usage is never treated as headroom: a seat with no reading, or one `,x===null?`whose reading is stale`:`older than ${Math.round(x/6e4)} minutes`,`, is held back.`]})]})}function P({maxMode:e=null}={}){let t=a(d,{freshMs:0}),n=a(p,{freshMs:0}),r=i(d),s=i(p),c=x(),[l,u]=(0,T.useState)(null),[m,h]=(0,T.useState)(null),[g,_]=(0,T.useState)(null),[v,y]=(0,T.useState)(()=>Date.now());(0,T.useEffect)(()=>{let e=()=>{(typeof document>`u`||document.visibilityState!==`hidden`)&&(r(),s(),y(Date.now()))},t=window.setInterval(e,k);return document.addEventListener(`visibilitychange`,e),()=>{window.clearInterval(t),document.removeEventListener(`visibilitychange`,e)}},[r,s]);let b=t.data,C=l&&(!b||!(Date.parse(l.sampledAt)<Date.parse(b.sampledAt)))?l:b,w=(0,T.useCallback)(async(e,t,n)=>{h(e),_(null);try{let e=await c.run(t,()=>f(n));e&&u(e)}catch(e){_(S(e))}finally{h(null),y(Date.now())}},[c]);return C?(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(N,{view:C,preview:n.data??null,nowMs:v,pending:m,error:g,maxMode:e,onMode:e=>void w(`mode`,`Switch the budget to ${e}`,{mode:e}),onSeat:(e,t)=>void w(e,`Change the budget for ${e}`,{seatId:e,policy:t})}),(0,O.jsx)(o,{open:c.dialog.open,reason:c.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:c.dialog.onClose,onUnlocked:c.dialog.onUnlocked})]}):(0,O.jsx)(`section`,{className:E.panel,"aria-label":`Budget`,children:t.status===`error`?(0,O.jsxs)(`p`,{className:E.error,role:`alert`,children:[`Budget unavailable: `,t.error?.message??`the request failed.`]}):(0,O.jsx)(`p`,{className:E.loading,children:`Reading seat usage…`})})}export{D as n,P as t};
|
|
2
|
-
//# sourceMappingURL=BudgetControl-TL3FeZ1D.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{D as r,E as i,L as a,P as o,S as s,T as ee,_ as c,c as l,d as te,j as ne,l as re,m as u,n as ie,p as ae,r as oe,t as se,u as d,w as ce}from"./useChartWidth-owwodNVz.js";import{c as f,v as p}from"./colors-BZ3a9wFf.js";import{i as m,l as le,t as h}from"./format-DKrNjdwD.js";import{n as g}from"./Swimlane-DGcIcnNA.js";var _={tile:`_tile_lsnkj_1`,label:`_label_lsnkj_15`,value:`_value_lsnkj_25`,trend:`_trend_lsnkj_36`,meta:`_meta_lsnkj_41`,delta:`_delta_lsnkj_48`,deltaGood:`_deltaGood_lsnkj_54`,deltaBad:`_deltaBad_lsnkj_58`,deltaNeutral:`_deltaNeutral_lsnkj_62`,caption:`_caption_lsnkj_66`},v=t();function y(e){return[e.format?e.format(e.value):m(e.value),e.unit,e.versus].filter(e=>e!==void 0&&e!==``).join(` `)}function b({label:e,value:t,caption:n,delta:r,trend:i,trendLabel:a,describeTrend:o}){let s=r==null||r.goodWhenPositive===void 0||r.value===0?_.deltaNeutral:r.value>0===r.goodWhenPositive?_.deltaGood:_.deltaBad;return(0,v.jsxs)(`div`,{className:_.tile,"data-stat-tile":``,children:[(0,v.jsx)(`span`,{className:_.label,children:e}),(0,v.jsx)(`span`,{className:_.value,children:t}),i?(0,v.jsx)(`span`,{className:_.trend,children:(0,v.jsx)(g,{points:i,width:112,height:24,area:!0,ariaLabel:a??`${e} trend`,describe:o})}):null,r||n?(0,v.jsxs)(`div`,{className:_.meta,children:[r?(0,v.jsx)(`span`,{className:`${_.delta} ${s}`,children:y(r)}):null,n?(0,v.jsx)(`span`,{className:_.caption,children:n}):null]}):null]})}var ue=n(e(),1),x=16,de=26,fe=14;function S(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`,minute:`2-digit`})}function C(e){let t=Math.max(0,Math.round(e/6e4));if(t<60)return`${t}m`;let n=Math.floor(t/60);return n<48?t%60?`${n}h ${t%60}m`:`${n}h`:`${Math.round(n/24)}d`}function pe(e,t,n,r,i){let a=t!==null&&Number.isFinite(t)?t:null;if(e.from&&e.from.remaining<=0)return{text:a===null?`Used up — reset time unknown.`:`Used up — resets ${r(a)}.`,severity:`danger`};if(e.from&&i!==void 0&&e.reserveAt!==null&&e.reserveAt<=e.from.t){let e=a===null?`until it resets (reset time unknown)`:`until ${r(a)}`;return{text:`Inside ${i.toLowerCase()} — autonomy has stopped using this window ${e}.`,severity:`warn`}}return a===null?{text:`Reset time unknown — not projecting this window.`,severity:`unknown`}:e.slopePerMs===null?{text:`Not enough readings to project this window yet.`,severity:`unknown`}:e.exhaustAt===null?e.reserveAt===null?{text:`At this pace: about ${n(e.remainingAtReset??0)} left at reset.`,severity:`ok`}:{text:`At this pace: ${i??`reserve`} reached ${r(e.reserveAt)}, ${C(a-e.reserveAt)} before reset.`,severity:`warn`}:{text:`At this pace: runs out ${r(e.exhaustAt)}, ${C(a-e.exhaustAt)} before reset.`,severity:`danger`}}function w({title:e,description:t,caveat:n,status:m,points:g,capacity:_,start:y,resetAt:b,now:C,reserve:w,height:T=200,width:me,formatValue:E,formatTime:D,ariaLabel:he}){let O=E??h,k=D??S,A=(0,ue.useRef)(null),j=se(A,me),M=d(),N=g.filter(e=>s(e.t)).sort((e,t)=>e.t-t.t),ge=N.some(e=>e.remaining!==null),P=m??(N.length===0?{kind:`empty`,message:`No readings in this window yet.`}:ge?{kind:`ready`}:{kind:`unknown`}),F=s(b),I=F?b:null,L=ne(N,I,{reserve:w?.value??null}),R=pe(L,I,O,k,w?.label),z=N.flatMap(e=>e.remaining!==null&&Number.isFinite(e.remaining)?[e.remaining]:[]),B=u(0,Math.max(_,...z,1),{count:4,integer:Number.isInteger(_)&&z.every(e=>Number.isInteger(e)),format:E}),V=B.ticks,_e=V[V.length-1],H=a(B.labels,28,56,M),U=Math.max(40,j-H-fe),W=T-x-de,ve=N.length?N[N.length-1].t:C,G=I??Math.max(C,ve),ye=s(y)?y:N[0]?.t??G,[K,q]=c(ye,G,te,`end`),J=r(K,q,H,H+U),Y=r(0,_e,x+W,x),X=e=>Math.min(q,Math.max(K,e)),Z=le(K,q,D??S,[K,q]),be=ee([{key:`start`,x:H,anchor:`start`,priority:2,variants:Z.map(e=>e(K))},F?{key:`reset`,x:H+U,anchor:`end`,priority:3,variants:Z.map(e=>`Resets ${e(q)}`)}:{key:`end`,x:H+U,anchor:`end`,priority:3,variants:Z.map(e=>e(q))}],{min:H,max:H+U,charPx:ce(M)}),xe=o(N.map(e=>({x:X(e.t),y:e.remaining}))).map(e=>e.map(e=>({x:J(e.x),y:Y(Math.max(0,e.y))}))),Q=``;if(I!==null&&L.from&&L.slopePerMs!==null){let e=L.exhaustAt??I,t=L.exhaustAt===null?L.remainingAtReset??L.from.remaining:0;e>L.from.t&&(Q=i([{x:J(X(L.from.t)),y:Y(L.from.remaining)},{x:J(X(e)),y:Y(Math.max(0,t))}]))}let $=R.severity===`danger`?p(`danger`):R.severity===`warn`?p(`warning`):`var(--text-tertiary)`,Se=he??`${e}: ${L.from?`${O(L.from.remaining)} of ${O(_)} left at ${k(L.from.t)}`:`no readings`}; ${I===null?`reset time unknown`:`resets ${k(I)}`}. ${R.text}`,Ce=[{key:`t`,label:`When`,render:e=>k(e.t)},{key:`r`,label:`Remaining`,numeric:!0,render:e=>e.remaining===null?`—`:O(e.remaining)}],we=[{label:`Remaining`,color:f,kind:`line`},...F?[{label:`Even pace`,color:`var(--text-tertiary)`,kind:`line`}]:[],...Q?[{label:`Projection`,color:$,kind:`line`}]:[]];return(0,v.jsx)(ie,{title:e,description:t,caveat:n,status:P,table:(0,v.jsx)(re,{caption:e,columns:Ce,rows:N,rowKey:e=>String(e.t)}),footer:(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`p`,{className:l.note,"data-severity":R.severity,role:`status`,children:R.text}),(0,v.jsx)(oe,{items:we})]}),children:(0,v.jsx)(`div`,{ref:A,className:l.plotWrap,children:(0,v.jsxs)(`svg`,{className:l.svg,width:j,height:T,viewBox:`0 0 ${j} ${T}`,role:`img`,"aria-label":Se,children:[V.map((e,t)=>(0,v.jsxs)(`g`,{children:[(0,v.jsx)(`line`,{className:l.grid,x1:H,x2:H+U,y1:Y(e),y2:Y(e)}),(0,v.jsx)(`text`,{className:l.tick,x:H-6,y:Y(e),dy:`0.32em`,textAnchor:`end`,children:B.labels[t]})]},e)),(0,v.jsx)(`line`,{className:l.axis,x1:H,x2:H+U,y1:Y(0),y2:Y(0)}),be.map(e=>(0,v.jsx)(`text`,{"data-axis-label":e.key,className:l.tick,x:e.x,y:T-8,textAnchor:e.anchor,children:e.text},e.key)),F?(0,v.jsx)(`path`,{"data-role":`pace`,className:l.reference,d:i([{x:J(K),y:Y(_)},{x:J(q),y:Y(0)}])}):null,w?(0,v.jsxs)(`g`,{"data-role":`reserve`,children:[(0,v.jsx)(`line`,{className:l.reference,x1:H,x2:H+U,y1:Y(w.value),y2:Y(w.value)}),(0,v.jsxs)(`text`,{"data-role":`reserve-label`,className:`${l.tick} ${l.halo}`,x:H+4,y:Y(w.value)-5,textAnchor:`start`,children:[w.label,` · `,O(w.value)]})]}):null,C>K&&C<q?(0,v.jsx)(`line`,{className:l.crosshair,x1:J(C),x2:J(C),y1:x,y2:x+W}):null,xe.map((e,t)=>(0,v.jsxs)(`g`,{"data-role":`remaining`,children:[(0,v.jsx)(`path`,{className:l.wash,fill:f,d:ae(e,e.map(e=>({x:e.x,y:Y(0)})))}),(0,v.jsx)(`path`,{className:l.line,stroke:f,d:i(e)})]},t)),Q?(0,v.jsx)(`path`,{"data-role":`projection`,className:l.projection,stroke:$,d:Q}):null,L.from?(0,v.jsx)(`circle`,{className:l.marker,cx:J(X(L.from.t)),cy:Y(L.from.remaining),r:4,fill:f}):null]})})})}export{b as n,w as t};
|
|
2
|
-
//# sourceMappingURL=BurnDown-sFXkUGdB.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BurnDown-sFXkUGdB.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/StatTile.module.css","../../../../../../src/web-ui/components/charts/StatTile.tsx","../../../../../../src/web-ui/components/charts/BurnDown.tsx"],"sourcesContent":[".tile {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n padding: var(--card-pad, var(--space-4));\n border-radius: var(--radius-lg);\n border: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n /* Dark: a 4% white top hairline lifts the KPI row off the canvas; light:\n the token is transparent and this draws nothing. */\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n}\n\n/* KPI number: Plex 600, 24/32, tabular numerals (SPEC-310C §6). */\n.value {\n font-family: var(--font-ui);\n font-size: var(--text-2xl-size);\n line-height: var(--text-2xl-line);\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n overflow-wrap: anywhere;\n}\n\n/* The sparkline sits directly under the number it explains. */\n.trend {\n display: block;\n line-height: 0;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--space-1) var(--space-2);\n}\n\n.delta {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n}\n\n.deltaGood {\n color: var(--status-success-fg);\n}\n\n.deltaBad {\n color: var(--status-danger-fg);\n}\n\n.deltaNeutral {\n color: var(--text-tertiary);\n}\n\n.caption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n","/**\n * components/charts/StatTile.tsx — value + delta + optional sparkline, the\n * figure contract from marks-and-anatomy.md. Use for a single current value\n * (a one-bar bar chart is never the answer — this is). `value` takes a\n * ReactNode (not just a string) so callers can wrap a sourceQuality-bearing\n * field in <Epistemic/> and pass that straight through.\n *\n * V3.10 (SPEC-310C §6 \"StatTile: sparkline goes under the number; deltas show\n * units\"): the 72×24 sparkline used to float top-right, disconnected from the\n * number it explains; it now sits directly under it. A delta reads as a\n * sentence fragment with its unit and its comparison — \"+5 merges vs prior\n * 7d\", never a bare \"-1\". In dark the tile gets the 4% top hairline\n * (`--hairline-lift`, transparent in light) so a KPI row lifts off the canvas.\n */\nimport type { ReactNode } from 'react';\nimport { formatSignedCompact } from './format.js';\nimport { Sparkline } from './Sparkline.js';\nimport styles from './StatTile.module.css';\n\nexport interface StatTileDelta {\n /** Signed raw value, e.g. +12 or -3. */\n value: number;\n /** Whether a positive delta reads as good (green) or bad (red). Omit for\n * a neutral, non-judgmental delta (e.g. \"goals in flight\" — more isn't\n * inherently good or bad). */\n goodWhenPositive?: boolean;\n /** vs which period, e.g. \"vs prior 7d\". */\n versus?: string;\n /** Unit after the number: \"merges\", \"pts\", \"min\". Plural is the caller's call. */\n unit?: string;\n /** Formats the SIGNED value (default: \"+12\" / \"-3\"). Use for percent points, durations, dollars. */\n format?: (signed: number) => string;\n}\n\n/** \"+5 merges vs prior 7d\" — the whole delta as one readable phrase. */\nexport function deltaText(delta: StatTileDelta): string {\n const n = delta.format ? delta.format(delta.value) : formatSignedCompact(delta.value);\n return [n, delta.unit, delta.versus].filter((part) => part !== undefined && part !== '').join(' ');\n}\n\nexport function StatTile({\n label,\n value,\n caption,\n delta,\n trend,\n trendLabel,\n describeTrend,\n}: {\n label: string;\n value: ReactNode;\n caption?: ReactNode;\n delta?: StatTileDelta | null;\n trend?: (number | null)[];\n trendLabel?: string;\n /** Spoken summary formatter for the sparkline (first → latest, range). */\n describeTrend?: (v: number) => string;\n}) {\n const deltaTone =\n delta == null || delta.goodWhenPositive === undefined\n ? styles.deltaNeutral\n : delta.value === 0\n ? styles.deltaNeutral\n : (delta.value > 0) === delta.goodWhenPositive\n ? styles.deltaGood\n : styles.deltaBad;\n\n return (\n <div className={styles.tile} data-stat-tile=\"\">\n <span className={styles.label}>{label}</span>\n <span className={styles.value}>{value}</span>\n {trend ? (\n <span className={styles.trend}>\n <Sparkline points={trend} width={112} height={24} area ariaLabel={trendLabel ?? `${label} trend`} describe={describeTrend} />\n </span>\n ) : null}\n {delta || caption ? (\n <div className={styles.meta}>\n {delta ? <span className={`${styles.delta} ${deltaTone}`}>{deltaText(delta)}</span> : null}\n {caption ? <span className={styles.caption}>{caption}</span> : null}\n </div>\n ) : null}\n </div>\n );\n}\n","/**\n * components/charts/BurnDown.tsx — a quota window burning down to its reset:\n * remaining capacity over time (solid line + wash), the even-pace reference\n * from full at window start to empty at reset (thin dashed), a projection\n * from the recent slope (dashed), an optional reserve line (the headroom kept\n * for interactive use) and the reset marker.\n *\n * The verdict is written in words under the plot — \"At this pace: reserve\n * reached 14:20, 3h 40m before reset\" — so the chart's point never depends on\n * reading slopes. With fewer than two readings it says it cannot project,\n * rather than drawing a guess — and with no plausible reset (0 / NaN /\n * pre-2000) it draws neither pace nor projection and says the reset is\n * unknown, rather than projecting to an invented one.\n */\nimport { useRef } from 'react';\nimport { CHART_SEQUENTIAL, toneColor } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport {\n MIN_TIME_SPAN_MS,\n areaPath,\n axisTicks,\n ensureSpan,\n isPlausibleTime,\n labelCharPx,\n layoutAxisLabels,\n linePath,\n linearScale,\n projectBurnDown,\n splitRuns,\n tickGutter,\n type BurnPoint,\n} from './chart-math.js';\nimport { formatCompact, timeLabelLadder } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.js';\nimport plot from './plot.module.css';\n\nexport interface BurnDownProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n points: BurnPoint[];\n /** Full capacity of the window (e.g. 100 for percent). */\n capacity: number;\n /** Window start and reset, epoch ms. */\n start: number;\n resetAt: number;\n now: number;\n /** Capacity to keep in reserve (same units as `remaining`). */\n reserve?: { value: number; label: string };\n height?: number;\n width?: number;\n formatValue?: (v: number) => string;\n formatTime?: (ms: number) => string;\n ariaLabel?: string;\n}\n\nconst PAD_T = 16;\nconst PAD_B = 26;\nconst PAD_R = 14;\n\nfunction defaultFormatTime(ms: number): string {\n const d = new Date(ms);\n return Number.isNaN(d.getTime()) ? '' : d.toLocaleString('en-US', { weekday: 'short', hour: 'numeric', minute: '2-digit' });\n}\n\nexport function formatLead(ms: number): string {\n const m = Math.max(0, Math.round(ms / 60_000));\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 48) return m % 60 ? `${h}h ${m % 60}m` : `${h}h`;\n return `${Math.round(h / 24)}d`;\n}\n\n/**\n * The verdict in words. `resetAt` null (or non-finite) is an UNKNOWN reset:\n * what the window has already crossed is still said, but nothing is\n * projected — \"about 40% left at reset\" needs a reset (V3.10.1 review: an\n * epoch-0 reset printed a green verdict for a seat burning 10%/h, and a NaN\n * one printed \"about NaN% left at reset\").\n */\nexport function burnVerdict(\n projection: ReturnType<typeof projectBurnDown>,\n resetAt: number | null,\n formatValue: (v: number) => string,\n formatTime: (ms: number) => string,\n reserveLabel?: string,\n): { text: string; severity: 'ok' | 'warn' | 'danger' | 'unknown' } {\n const reset = resetAt !== null && Number.isFinite(resetAt) ? resetAt : null;\n // Already past a line: say where it IS, not a \"projection\" to a moment\n // that has passed (a used-up seat is not \"running out at 3:02\").\n if (projection.from && projection.from.remaining <= 0) {\n return { text: reset === null ? 'Used up — reset time unknown.' : `Used up — resets ${formatTime(reset)}.`, severity: 'danger' };\n }\n if (projection.from && reserveLabel !== undefined && projection.reserveAt !== null && projection.reserveAt <= projection.from.t) {\n const until = reset === null ? 'until it resets (reset time unknown)' : `until ${formatTime(reset)}`;\n return { text: `Inside ${reserveLabel.toLowerCase()} — autonomy has stopped using this window ${until}.`, severity: 'warn' };\n }\n if (reset === null) return { text: 'Reset time unknown — not projecting this window.', severity: 'unknown' };\n if (projection.slopePerMs === null) return { text: 'Not enough readings to project this window yet.', severity: 'unknown' };\n if (projection.exhaustAt !== null) {\n return {\n text: `At this pace: runs out ${formatTime(projection.exhaustAt)}, ${formatLead(reset - projection.exhaustAt)} before reset.`,\n severity: 'danger',\n };\n }\n if (projection.reserveAt !== null) {\n return {\n text: `At this pace: ${reserveLabel ?? 'reserve'} reached ${formatTime(projection.reserveAt)}, ${formatLead(reset - projection.reserveAt)} before reset.`,\n severity: 'warn',\n };\n }\n return {\n text: `At this pace: about ${formatValue(projection.remainingAtReset ?? 0)} left at reset.`,\n severity: 'ok',\n };\n}\n\nexport function BurnDown({\n title,\n description,\n caveat,\n status,\n points,\n capacity,\n start,\n resetAt,\n now,\n reserve,\n height = 200,\n width: fixedWidth,\n formatValue: formatValueProp,\n formatTime: formatTimeProp,\n ariaLabel,\n}: BurnDownProps) {\n const formatValue = formatValueProp ?? formatCompact;\n const formatTime = formatTimeProp ?? defaultFormatTime;\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n // A reading stamped 0 / NaN / pre-2000 is a null timestamp that leaked\n // through: it is not on this window's time axis, and it would drag both\n // the axis and the projection's slope back to 1970.\n const sorted = points.filter((p) => isPlausibleTime(p.t)).sort((a, b) => a.t - b.t);\n const anyKnown = sorted.some((p) => p.remaining !== null);\n const resolvedStatus: ChartStatus = status ?? (sorted.length === 0 ? { kind: 'empty', message: 'No readings in this window yet.' } : anyKnown ? { kind: 'ready' } : { kind: 'unknown' });\n\n // A reset of 0 / NaN / pre-2000 is a null that leaked through (an epoch-0\n // machine reset parses as a finite 0). It is UNKNOWN, not a moment: the\n // axis ends at the latest reading or now with no \"Resets\" on it, no even\n // pace or projection is drawn toward it, and the verdict says the reset is\n // unknown instead of inventing one (V3.10.1 review).\n const resetKnown = isPlausibleTime(resetAt);\n const reset = resetKnown ? resetAt : null;\n const projection = projectBurnDown(sorted, reset, { reserve: reserve?.value ?? null });\n const verdict = burnVerdict(projection, reset, formatValue, formatTime, reserve?.label);\n\n // Always 0 → capacity (100 for percent seats), so sibling cards share one\n // scale; widened only if a reading overshoots, never clipped.\n const known = sorted.flatMap((p) => (p.remaining !== null && Number.isFinite(p.remaining) ? [p.remaining] : []));\n const yAxis = axisTicks(0, Math.max(capacity, ...known, 1), {\n count: 4,\n integer: Number.isInteger(capacity) && known.every((v) => Number.isInteger(v)),\n format: formatValueProp,\n });\n const ticks = yAxis.ticks;\n const top = ticks[ticks.length - 1]!;\n const padL = tickGutter(yAxis.labels, 28, 56, textScale);\n const plotW = Math.max(40, width - padL - PAD_R);\n const plotH = height - PAD_T - PAD_B;\n // The window runs start → reset. An implausible bound (0 / NaN) falls back\n // to the readings; a degenerate one widens to MIN_TIME_SPAN_MS, keeping the\n // right edge where it is.\n const lastT = sorted.length ? sorted[sorted.length - 1]!.t : now;\n const rawEnd = reset ?? Math.max(now, lastT);\n const rawStart = isPlausibleTime(start) ? start : sorted[0]?.t ?? rawEnd;\n const [x0, xEnd] = ensureSpan(rawStart, rawEnd, MIN_TIME_SPAN_MS, 'end');\n const xs = linearScale(x0, xEnd, padL, padL + plotW);\n const ys = linearScale(0, top, PAD_T + plotH, PAD_T);\n const clampX = (t: number) => Math.min(xEnd, Math.max(x0, t));\n\n // x labels: the reset marker outranks the window start. Both walk the same\n // detail ladder (the caller's format → \"Fri 11:46 PM\" → \"Sep 18\"; clock\n // time only inside one day) until they fit side by side; if even the\n // shortest pair collides, the start is dropped rather than overprinted.\n // Widths are budgeted at the operator's Display size. With no known reset\n // the right edge is only the latest reading / now, and says just its time.\n const ladder = timeLabelLadder(x0, xEnd, formatTimeProp ?? defaultFormatTime, [x0, xEnd]);\n const xLabels = layoutAxisLabels(\n [\n { key: 'start', x: padL, anchor: 'start', priority: 2, variants: ladder.map((f) => f(x0)) },\n resetKnown\n ? { key: 'reset', x: padL + plotW, anchor: 'end', priority: 3, variants: ladder.map((f) => `Resets ${f(xEnd)}`) }\n : { key: 'end', x: padL + plotW, anchor: 'end', priority: 3, variants: ladder.map((f) => f(xEnd)) },\n ],\n { min: padL, max: padL + plotW, charPx: labelCharPx(textScale) },\n );\n\n const runs = splitRuns(sorted.map((p) => ({ x: clampX(p.t), y: p.remaining })))\n .map((run) => run.map((p) => ({ x: xs(p.x), y: ys(Math.max(0, p.y)) })));\n\n let projectionPath = '';\n if (reset !== null && projection.from && projection.slopePerMs !== null) {\n const endT = projection.exhaustAt ?? reset;\n const endR = projection.exhaustAt !== null ? 0 : projection.remainingAtReset ?? projection.from.remaining;\n if (endT > projection.from.t) {\n projectionPath = linePath([\n { x: xs(clampX(projection.from.t)), y: ys(projection.from.remaining) },\n { x: xs(clampX(endT)), y: ys(Math.max(0, endR)) },\n ]);\n }\n }\n const projectionColor = verdict.severity === 'danger' ? toneColor('danger') : verdict.severity === 'warn' ? toneColor('warning') : 'var(--text-tertiary)';\n\n const summary = ariaLabel ?? `${title}: ${projection.from ? `${formatValue(projection.from.remaining)} of ${formatValue(capacity)} left at ${formatTime(projection.from.t)}` : 'no readings'}; ${reset === null ? 'reset time unknown' : `resets ${formatTime(reset)}`}. ${verdict.text}`;\n\n const columns: TableColumn<BurnPoint>[] = [\n { key: 't', label: 'When', render: (p) => formatTime(p.t) },\n { key: 'r', label: 'Remaining', numeric: true, render: (p) => (p.remaining === null ? '—' : formatValue(p.remaining)) },\n ];\n\n const legendItems = [\n { label: 'Remaining', color: CHART_SEQUENTIAL, kind: 'line' as const },\n // Even pace runs from full at the window's start to empty AT RESET: with\n // no reset there is no pace to draw.\n ...(resetKnown ? [{ label: 'Even pace', color: 'var(--text-tertiary)', kind: 'line' as const }] : []),\n ...(projectionPath ? [{ label: 'Projection', color: projectionColor, kind: 'line' as const }] : []),\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={sorted} rowKey={(p) => String(p.t)} />}\n footer={\n <>\n <p className={plot.note} data-severity={verdict.severity} role=\"status\">{verdict.text}</p>\n <ChartLegend items={legendItems} />\n </>\n }\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 {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 <line className={plot.axis} x1={padL} x2={padL + plotW} y1={ys(0)} y2={ys(0)} />\n {xLabels.map((l) => (\n <text key={l.key} data-axis-label={l.key} className={plot.tick} x={l.x} y={height - 8} textAnchor={l.anchor}>{l.text}</text>\n ))}\n\n {resetKnown ? (\n <path data-role=\"pace\" className={plot.reference} d={linePath([{ x: xs(x0), y: ys(capacity) }, { x: xs(xEnd), y: ys(0) }])} />\n ) : null}\n {reserve ? (\n <g data-role=\"reserve\">\n <line className={plot.reference} x1={padL} x2={padL + plotW} y1={ys(reserve.value)} y2={ys(reserve.value)} />\n {/* Above-left of the line, over a surface halo (SPEC-310C §6): the\n window's start is the one place the remaining line is always\n high, and the projection only ever runs to the right, so the\n label never sits on the data. */}\n <text data-role=\"reserve-label\" className={`${plot.tick} ${plot.halo}`} x={padL + 4} y={ys(reserve.value) - 5} textAnchor=\"start\">\n {reserve.label} · {formatValue(reserve.value)}\n </text>\n </g>\n ) : null}\n {now > x0 && now < xEnd ? (\n <line className={plot.crosshair} x1={xs(now)} x2={xs(now)} y1={PAD_T} y2={PAD_T + plotH} />\n ) : null}\n {runs.map((run, i) => (\n <g key={i} data-role=\"remaining\">\n <path className={plot.wash} fill={CHART_SEQUENTIAL} d={areaPath(run, run.map((p) => ({ x: p.x, y: ys(0) })))} />\n <path className={plot.line} stroke={CHART_SEQUENTIAL} d={linePath(run)} />\n </g>\n ))}\n {projectionPath ? (\n <path data-role=\"projection\" className={plot.projection} stroke={projectionColor} d={projectionPath} />\n ) : null}\n {projection.from ? (\n <circle className={plot.marker} cx={xs(clampX(projection.from.t))} cy={ys(projection.from.remaining)} r={4} fill={CHART_SEQUENTIAL} />\n ) : null}\n </svg>\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{m as r,p as i}from"./global-oEl9Qj8u.js";import{t as a}from"./ProviderLogo-C5mBg8i0.js";import{i as o,r as s}from"./section-visibility-Yctxu-if.js";import{x as c}from"./VerseConsoleApp-DTjDpGCd.js";import{g as l}from"./format-BkWdOQDL.js";import{r as u}from"./Tag-DH15CUJp.js";import{n as d}from"./budget-queries-V3wcJVK_.js";import{n as f,t as p}from"./useSeatsRefresh-DgFy-Ph4.js";import{a as m,l as h,n as g,o as _,r as v,t as y}from"./capacity-strip-model-BDbmQ3e3.js";var b=n(e(),1),x={section:`_section_1vcn6_8`,scroll:`_scroll_1vcn6_16`,page:`_page_1vcn6_34`,header:`_header_1vcn6_43`,headerText:`_headerText_1vcn6_50`,title:`_title_1vcn6_56`,lede:`_lede_1vcn6_65`,headerMeta:`_headerMeta_1vcn6_71`,banner:`_banner_1vcn6_80`,accountsNote:`_accountsNote_1vcn6_96`,group:`_group_1vcn6_108`,groupHead:`_groupHead_1vcn6_114`,groupTitle:`_groupTitle_1vcn6_121`,caveat:`_caveat_1vcn6_138`,inlineCode:`_inlineCode_1vcn6_145`,card:`_card_1vcn6_154`,rows:`_rows_1vcn6_162`,row:`_row_1vcn6_162`,rowMain:`_rowMain_1vcn6_180`,rowHead:`_rowHead_1vcn6_187`,rowName:`_rowName_1vcn6_194`,rowVersion:`_rowVersion_1vcn6_200`,rowDesc:`_rowDesc_1vcn6_205`,rowDetail:`_rowDetail_1vcn6_206`,rowAside:`_rowAside_1vcn6_217`,health:`_health_1vcn6_228`,healthDot:`_healthDot_1vcn6_237`,loadingLine:`_loadingLine_1vcn6_263`,tile:`_tile_1vcn6_273`,pillWrap:`_pillWrap_1vcn6_314`,pill:`_pill_1vcn6_314`,pillText:`_pillText_1vcn6_348`,pillIcon:`_pillIcon_1vcn6_356`,visuallyHidden:`_visuallyHidden_1vcn6_367`,split:`_split_1vcn6_381`,disabledNote:`_disabledNote_1vcn6_394`,dialogBody:`_dialogBody_1vcn6_404`,commandBlock:`_commandBlock_1vcn6_415`,commandLabel:`_commandLabel_1vcn6_420`,dialogActions:`_dialogActions_1vcn6_428`,fieldset:`_fieldset_1vcn6_435`,legend:`_legend_1vcn6_443`,radio:`_radio_1vcn6_450`,error:`_error_1vcn6_460`,textarea:`_textarea_1vcn6_466`,fieldLabel:`_fieldLabel_1vcn6_483`,hint:`_hint_1vcn6_491`,warnings:`_warnings_1vcn6_495`,servers:`_servers_1vcn6_505`,reasonCode:`_reasonCode_1vcn6_511`,scopeLine:`_scopeLine_1vcn6_517`},S=t();function C({monogram:e,engine:t,size:n=`md`}){let r=t===null?void 0:{"--tile-hue":u(t)};return(0,S.jsx)(`span`,{className:x.tile,"data-size":n,"data-engine":t??void 0,style:r,"aria-hidden":`true`,children:t===null?e.slice(0,2):(0,S.jsx)(a,{engine:t,size:n===`sm`?14:18})})}var w={strip:`_strip_o9cqi_7`,visuallyHidden:`_visuallyHidden_o9cqi_15`,headline:`_headline_o9cqi_27`,empty:`_empty_o9cqi_35`,rows:`_rows_o9cqi_42`,row:`_row_o9cqi_42`,main:`_main_o9cqi_67`,head:`_head_o9cqi_27`,nameWrap:`_nameWrap_o9cqi_82`,nameButton:`_nameButton_o9cqi_83`,name:`_name_o9cqi_82`,plan:`_plan_o9cqi_121`,word:`_word_o9cqi_131`,dot:`_dot_o9cqi_140`,status:`_status_o9cqi_163`,statusLabel:`_statusLabel_o9cqi_176`,statusDetail:`_statusDetail_o9cqi_195`,stamp:`_stamp_o9cqi_199`,usableAgain:`_usableAgain_o9cqi_206`,summary:`_summary_o9cqi_211`,meta:`_meta_o9cqi_212`,autonomy:`_autonomy_o9cqi_222`,bars:`_bars_o9cqi_232`,bar:`_bar_o9cqi_232`,barLabel:`_barLabel_o9cqi_251`,track:`_track_o9cqi_262`,trackUnknown:`_trackUnknown_o9cqi_270`,used:`_used_o9cqi_276`,reserve:`_reserve_o9cqi_287`,ceiling:`_ceiling_o9cqi_297`,value:`_value_o9cqi_306`,reset:`_reset_o9cqi_319`,actions:`_actions_o9cqi_326`},T=90,E=3e4;function D(e){return Math.max(0,Math.min(100,Math.round(e)))}function O({row:e,w:t,reservePercent:n,compact:r}){let i=h(e,t,t.binding?n:null),a=t.binding&&n!==null&&n>0?100-D(n):null,o,s;if(t.limitReached)o=(0,S.jsx)(`span`,{className:w.track,role:`img`,"aria-label":i,children:(0,S.jsx)(`span`,{className:w.used,"data-level":`limit`,style:{width:`100%`}})}),s=(0,S.jsx)(`span`,{className:w.value,"data-level":`limit`,children:`limit reached`});else if(t.usedPercent===null)o=(0,S.jsx)(`span`,{className:w.trackUnknown,role:`img`,"aria-label":i}),s=(0,S.jsx)(`span`,{className:w.value,"data-level":`unknown`,children:`no reading`});else{let e=D(t.usedPercent),n=e>=T?`tight`:`ok`;o=(0,S.jsxs)(`span`,{className:w.track,role:`img`,"aria-label":i,children:[a===null?null:(0,S.jsx)(`span`,{className:w.reserve,style:{left:`${a}%`,width:`${100-a}%`}}),(0,S.jsx)(`span`,{className:w.used,"data-level":n,style:{width:`${e}%`}}),a===null?null:(0,S.jsx)(`span`,{className:w.ceiling,style:{left:`${a}%`}})]}),s=(0,S.jsx)(`span`,{className:w.value,"data-level":n,children:l(t.usedPercent)})}return(0,S.jsxs)(`div`,{className:w.bar,"data-binding":t.binding||void 0,"data-compact":r||void 0,children:[(0,S.jsx)(`span`,{className:w.barLabel,title:t.label,children:t.label.replace(/ window$/,``)}),o,s,!r&&t.resetText!==null?(0,S.jsx)(`span`,{className:w.reset,title:t.resetText,children:t.resetText}):null]})}function k({row:e,onSelect:t,selected:n}){let r=(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`span`,{className:w.name,children:e.label}),e.plan===null?null:(0,S.jsx)(`span`,{className:w.plan,children:e.plan})]});return t?(0,S.jsx)(`button`,{type:`button`,className:w.nameButton,"aria-pressed":n,onClick:()=>t(e.seatId),children:r}):(0,S.jsx)(`span`,{className:w.nameWrap,children:r})}function A({status:e}){return(0,S.jsxs)(`span`,{className:w.status,"data-tone":e.tone,"data-status":e.kind,children:[(0,S.jsx)(`span`,{className:w.dot,"aria-hidden":`true`}),(0,S.jsx)(`span`,{className:w.statusLabel,children:e.label}),e.detail===null?null:(0,S.jsx)(`span`,{className:w.statusDetail,children:`· ${e.detail}`})]})}function j({status:e}){return e.usableAgain===null&&e.checked===null?null:(0,S.jsxs)(`p`,{className:w.stamp,children:[e.usableAgain===null?null:(0,S.jsx)(`span`,{className:w.usableAgain,children:e.usableAgain}),e.usableAgain!==null&&e.checked!==null?` · `:null,e.checked===null?null:(0,S.jsx)(`span`,{title:e.checkedTitle??void 0,children:e.checked})]})}function M({row:e,compact:t,renderActions:n,onSelectSeat:r,selected:i,status:a}){let o=m(e.cls),s=e.windows.find(e=>e.binding)??null,c=t?s?[s]:[]:e.windows,l=n?n(e):null,u=e.reserve;return(0,S.jsxs)(`li`,{className:w.row,"data-capacity":e.cls,"data-compact":t||void 0,"data-status":a?.kind,children:[(0,S.jsx)(C,{monogram:e.monogram,engine:e.engine,size:`sm`}),(0,S.jsxs)(`div`,{className:w.main,children:[(0,S.jsxs)(`div`,{className:w.head,children:[(0,S.jsx)(k,{row:e,onSelect:r,selected:i}),a===null?(0,S.jsxs)(`span`,{className:w.word,"data-tone":o,children:[(0,S.jsx)(`span`,{className:w.dot,"aria-hidden":`true`}),e.word]}):(0,S.jsx)(A,{status:a}),e.connection!==null&&e.connection.connection!==`connected`&&e.connection.connection!==`unknown`&&!(a?.coversConnection??!1)&&a?.kind!==`signed-out`?(0,S.jsxs)(`span`,{className:w.word,"data-tone":e.connection.tone,children:[(0,S.jsx)(`span`,{className:w.dot,"aria-hidden":`true`}),e.connection.word]}):null]}),!t||c.length===0?(0,S.jsx)(`p`,{className:w.summary,children:e.summary}):null,a!==null&&!t?(0,S.jsx)(j,{status:a}):null,c.length>0?(0,S.jsx)(`div`,{className:w.bars,children:c.map(n=>(0,S.jsx)(O,{row:e,w:n,reservePercent:u?.percent??null,compact:t},n.id))}):null,!t&&(u!==null||e.credits!==null)?(0,S.jsxs)(`p`,{className:w.meta,children:[u===null?null:(0,S.jsxs)(`span`,{title:u.why,children:[u.label,u.autonomy===`off`?null:(0,S.jsxs)(S.Fragment,{children:[` · Autonomy: `,(0,S.jsx)(`span`,{className:w.autonomy,"data-status":u.autonomy,children:u.autonomyWord})]})]}),u!==null&&e.credits!==null?` · `:null,e.credits===null?null:(0,S.jsx)(`span`,{children:e.credits})]}):null]}),l?(0,S.jsx)(`div`,{className:w.actions,children:l}):null]})}function N({seats:e,health:t,budget:n,local:r,seatIds:i,density:a=`full`,headline:o,title:c=`Seat capacity`,labelledBy:l,renderActions:u,onSelectSeat:d,selectedSeatId:f=null,emptyText:p=`No seats yet. Connect an account or start Ollama — an empty roster, not seats at zero.`,accounts:m}){let h=(0,b.useId)(),[x,C]=(0,b.useState)(()=>Date.now());s(()=>C(Date.now()),E,{enabled:m!==void 0&&m.now===void 0});let T=m?.now??x,D=m?.healthRead??!1,O=m!==void 0,k=O?T:void 0,A=(0,b.useMemo)(()=>g(e,{health:t??null,budget:n??null,...r?{local:r}:{},...i?{seatIds:i}:{},...k===void 0?{}:{now:k}}),[e,t,n,r,i,k]),j=(0,b.useMemo)(()=>O?_(A,{healthRead:D,now:T}):A,[A,O,D,T]),N=a===`compact`,P=o??!N;return(0,S.jsxs)(l?`div`:`section`,{className:w.strip,"aria-labelledby":l?void 0:h,"data-density":a,children:[l?null:(0,S.jsx)(`h3`,{id:h,className:w.visuallyHidden,children:c}),P&&j.length>0?(0,S.jsx)(`p`,{className:w.headline,children:v(j)}):null,j.length===0?(0,S.jsx)(`p`,{className:w.empty,children:p}):(0,S.jsx)(`ul`,{className:w.rows,"aria-label":l?void 0:c,"aria-labelledby":l,children:j.map(e=>(0,S.jsx)(M,{row:e,compact:N,renderActions:u,onSelectSeat:d,selected:f===e.seatId,status:m?y(e,{healthRead:D,now:T,checking:m.checkingSeatId===e.seatId}):null},e.seatId))})]})}var P=6e4;function F(e={}){let t=o(),n=e.withBudget??!0,a=e.withHealth??!0,l=i(c);p(t);let u=f(t&&a),m=i(d),h=r(d);s(h,P,{enabled:n});let g=l.data;return{seats:g?.seats??[],health:a?u.data?.seats??null:null,budget:n?m.data??null:null,loading:g===void 0&&(l.status===`loading`||l.status===`idle`)}}function I({seats:e,...t}){let n=F();return e===void 0&&n.loading?(0,S.jsx)(`p`,{className:w.empty,"aria-busy":`true`,children:`Reading seats…`}):(0,S.jsx)(N,{...t,seats:e??n.seats,health:n.health,budget:n.budget})}export{C as a,F as i,N as n,x as o,I as r,E as t};
|
|
2
|
-
//# sourceMappingURL=CapacityStrip-qReu0RaF.js.map
|