@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 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-client.ts","../../../../../../src/web-ui/routes/verse/dock/terminal/input-queue.ts","../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-stream.ts","../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-view.ts","../../../../../../src/web-ui/routes/verse/dock/terminal/TerminalPane.tsx"],"sourcesContent":["/**\n * dock/terminal/terminal-client.ts — the Terminal pane's HTTP calls (unit C4).\n *\n * Writes carry the held mutation token (auth-store), exactly like\n * verse-queries' writes; the stream is read with fetch() + the read-client\n * header rather than EventSource (see terminal-stream.ts for why).\n */\nimport type {\n VerseTerminalCreateRequest,\n VerseTerminalListResponse,\n VerseTerminalTab,\n} from '../../../../data/api-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../../data/auth-store.js';\nimport { apiGet, apiPost } from '../../../../data/client.js';\nimport { VERSE_TERMINAL_PATH } from '../../../../../core/verse/workbench-types.js';\n\n/** Raised when a write is attempted with no mutation token held. */\nexport class TerminalLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token to use the terminal.');\n this.name = 'TerminalLockedError';\n }\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new TerminalLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nfunction tabPath(id: string, action: 'input' | 'resize' | 'kill' | 'stream'): string {\n return `${VERSE_TERMINAL_PATH}/${encodeURIComponent(id)}/${action}`;\n}\n\nexport interface TerminalApi {\n list(signal?: AbortSignal): Promise<VerseTerminalListResponse>;\n create(req: VerseTerminalCreateRequest): Promise<VerseTerminalTab>;\n input(id: string, dataBase64: string): Promise<void>;\n resize(id: string, cols: number, rows: number): Promise<void>;\n kill(id: string): Promise<void>;\n openExternal(sessionId: string, root?: string): Promise<void>;\n}\n\nexport const terminalApi: TerminalApi = {\n list: (signal) => apiGet<VerseTerminalListResponse>(VERSE_TERMINAL_PATH, signal),\n create: async (req) => (await post<{ tab: VerseTerminalTab }>(VERSE_TERMINAL_PATH, req)).tab,\n input: (id, dataBase64) => post<void>(tabPath(id, 'input'), { dataBase64 }),\n resize: (id, cols, rows) => post<void>(tabPath(id, 'resize'), { cols, rows }),\n kill: async (id) => { await post<unknown>(tabPath(id, 'kill'), {}); },\n openExternal: async (sessionId, root) => {\n await post<unknown>(`${VERSE_TERMINAL_PATH}/open-external`, root === undefined ? { sessionId } : { sessionId, root });\n },\n};\n\nexport function terminalStreamPath(id: string, after: number): string {\n const cursor = Number.isSafeInteger(after) && after > 0 ? `?after=${after}` : '';\n return `${tabPath(id, 'stream')}${cursor}`;\n}\n\n// ---------------------------------------------------------------------------\n// Bytes\n// ---------------------------------------------------------------------------\n\n/** Standard base64 of bytes (btoa over a binary string, chunked to stay off the arg-count limit). */\nexport function bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(binary);\n}\n\nexport function base64ToBytes(b64: string): Uint8Array {\n const binary = atob(b64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n return out;\n}\n\n/**\n * The fence for \"Send selection to chat\": one backtick longer than the\n * longest run inside the text (at least three), so a selection that itself\n * contains a fenced block cannot close ours early.\n */\nexport function fenceSelection(text: string): string {\n const trimmed = text.replace(/\\s+$/, '');\n const longest = Math.max(0, ...Array.from(trimmed.matchAll(/`+/g), (m) => m[0].length));\n const fence = '`'.repeat(Math.max(3, longest + 1));\n return `${fence}\\n${trimmed}\\n${fence}`;\n}\n","/**\n * dock/terminal/input-queue.ts — keystrokes to the shell, in order (unit C4).\n *\n * Every keystroke is a POST. Two POSTs in flight at once may arrive in either\n * order, and a shell that receives `sl` for `ls` runs the wrong command. So\n * input is SINGLE-FLIGHT: while one request is out, everything typed after it\n * accumulates and goes as the next request — in order, and coalesced (a burst\n * of typing or a paste becomes one or a few requests, not hundreds). The\n * server takes at most 16 KB per request, so a long paste is sent in 16 KB\n * slices, one after another.\n */\nimport { VERSE_TERMINAL_INPUT_MAX_BYTES } from '../../../../../core/verse/workbench-types.js';\nimport { bytesToBase64 } from './terminal-client.js';\n\nexport interface InputQueue {\n /** Text as xterm reports it (a JS string — encoded as UTF-8). */\n pushText(text: string): void;\n /** xterm `onBinary` data: one char per byte (0–255). */\n pushBinary(binary: string): void;\n /** Resolves once everything pushed so far has been sent (or dropped on error). */\n idle(): Promise<void>;\n /** Stop sending; anything queued is dropped. */\n dispose(): void;\n}\n\nexport function createInputQueue(\n send: (dataBase64: string) => Promise<void>,\n opts: { maxBytes?: number; onError?: (err: unknown) => void } = {},\n): InputQueue {\n const maxBytes = opts.maxBytes ?? VERSE_TERMINAL_INPUT_MAX_BYTES;\n const encoder = new TextEncoder();\n let pending: Uint8Array[] = [];\n let pendingBytes = 0;\n let running: Promise<void> | null = null;\n let disposed = false;\n\n const take = (): Uint8Array => {\n const all = new Uint8Array(pendingBytes);\n let offset = 0;\n for (const chunk of pending) {\n all.set(chunk, offset);\n offset += chunk.length;\n }\n const head = all.subarray(0, Math.min(maxBytes, all.length));\n const rest = all.subarray(head.length);\n pending = rest.length > 0 ? [rest] : [];\n pendingBytes = rest.length;\n return head;\n };\n\n const pump = async (): Promise<void> => {\n while (!disposed && pendingBytes > 0) {\n const slice = take();\n try {\n await send(bytesToBase64(slice));\n } catch (err) {\n // A failed keystroke is not retried: replaying it later, after newer\n // input, is exactly the reordering this queue exists to prevent.\n pending = [];\n pendingBytes = 0;\n opts.onError?.(err);\n }\n }\n running = null;\n };\n\n const push = (bytes: Uint8Array): void => {\n if (disposed || bytes.length === 0) return;\n pending.push(bytes);\n pendingBytes += bytes.length;\n if (!running) running = pump();\n };\n\n return {\n pushText(text) {\n push(encoder.encode(text));\n },\n pushBinary(binary) {\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i) & 0xff;\n push(bytes);\n },\n idle() {\n return running ?? Promise.resolve();\n },\n dispose() {\n disposed = true;\n pending = [];\n pendingBytes = 0;\n },\n };\n}\n","/**\n * dock/terminal/terminal-stream.ts — one terminal tab's live output (unit C4).\n *\n * WHY fetch() AND NOT EventSource. The server's read boundary accepts the\n * per-tab client proof as a query parameter ONLY on the three EventSource\n * paths it knows (read-session.ts); everywhere else it must be the\n * `x-ashlr-read-client` header, which EventSource cannot send. fetch() can,\n * and a streamed body reads the same `text/event-stream` frames. It also\n * lets the pane keep exactly ONE connection open — the visible tab's — which\n * matters because a browser allows about six per origin and Verse already\n * holds two (the app events and the open chat).\n *\n * RESUME. Each (re)connect asks for `?after=<the last seq written>`; the\n * server replays only newer frames from its 256 KB scrollback. A dropped\n * connection reconnects with backoff; a 401 renews the read session once;\n * a 404 means the tab is gone (killed, idle-closed, server restarted).\n */\nimport type { VerseTerminalFrame } from '../../../../data/api-types.js';\nimport { getReadClientProof, renewReadSession } from '../../../../data/auth-store.js';\nimport { terminalStreamPath } from './terminal-client.js';\n\nexport type TerminalStreamState = 'connecting' | 'open' | 'reconnecting' | 'gone' | 'expired' | 'closed';\n\nexport interface TerminalStreamHandlers {\n onFrame: (frame: VerseTerminalFrame) => void;\n onState?: (state: TerminalStreamState) => void;\n}\n\nexport interface TerminalStreamDeps {\n fetch?: typeof fetch;\n renew?: () => Promise<boolean>;\n proof?: () => string;\n /** Backoff before reconnect attempt `n` (0-based). */\n backoffMs?: (attempt: number) => number;\n}\n\nexport interface TerminalStream {\n close(): void;\n}\n\nfunction defaultBackoff(attempt: number): number {\n return Math.min(250 * 2 ** attempt, 8_000);\n}\n\n/** Parse one SSE block (`event:` / `data:` lines) into a frame; null for comments and junk. */\nexport function parseTerminalSseBlock(block: string): VerseTerminalFrame | null {\n let data = '';\n for (const line of block.split('\\n')) {\n if (line.startsWith('data:')) data += line.slice(line.startsWith('data: ') ? 6 : 5);\n }\n if (!data) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n if (parsed === null || typeof parsed !== 'object') return null;\n const frame = parsed as Record<string, unknown>;\n if (frame['type'] === 'output' && typeof frame['seq'] === 'number' && typeof frame['dataBase64'] === 'string') {\n return { type: 'output', seq: frame['seq'], dataBase64: frame['dataBase64'] };\n }\n if (frame['type'] === 'title' && typeof frame['title'] === 'string') return { type: 'title', title: frame['title'] };\n if (frame['type'] === 'exit') {\n return {\n type: 'exit',\n code: typeof frame['code'] === 'number' ? frame['code'] : null,\n signal: typeof frame['signal'] === 'string' ? frame['signal'] : null,\n };\n }\n return null;\n}\n\n/**\n * Stream `tabId`'s frames, resuming after `after()` on every (re)connect.\n * Returns a handle whose close() aborts the request and stops reconnecting.\n */\nexport function openTerminalStream(\n tabId: string,\n after: () => number,\n handlers: TerminalStreamHandlers,\n deps: TerminalStreamDeps = {},\n): TerminalStream {\n const doFetch = deps.fetch ?? ((input: RequestInfo | URL, init?: RequestInit) => fetch(input, init));\n const renew = deps.renew ?? renewReadSession;\n const proof = deps.proof ?? getReadClientProof;\n const backoff = deps.backoffMs ?? defaultBackoff;\n let closed = false;\n let controller: AbortController | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempt = 0;\n let renewedOnce = false;\n\n const setState = (state: TerminalStreamState): void => {\n if (!closed || state === 'closed') handlers.onState?.(state);\n };\n\n const schedule = (): void => {\n if (closed) return;\n setState('reconnecting');\n timer = setTimeout(() => {\n timer = null;\n void connect();\n }, backoff(attempt++));\n };\n\n async function connect(): Promise<void> {\n if (closed) return;\n controller = new AbortController();\n let res: Response;\n try {\n res = await doFetch(terminalStreamPath(tabId, after()), {\n method: 'GET',\n credentials: 'same-origin',\n headers: { 'x-ashlr-read-client': proof(), Accept: 'text/event-stream' },\n signal: controller.signal,\n cache: 'no-store',\n });\n } catch {\n schedule();\n return;\n }\n if (closed) return;\n if (res.status === 404) {\n setState('gone');\n closed = true;\n return;\n }\n if (res.status === 401) {\n if (!renewedOnce && (await renew().catch(() => false))) {\n renewedOnce = true;\n void connect();\n return;\n }\n setState('expired');\n closed = true;\n return;\n }\n if (!res.ok || !res.body) {\n schedule();\n return;\n }\n renewedOnce = false;\n setState('open');\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n attempt = 0;\n buffer += decoder.decode(value, { stream: true });\n let idx: number;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n const frame = parseTerminalSseBlock(block);\n if (frame && !closed) handlers.onFrame(frame);\n }\n }\n } catch {\n /* aborted, or the connection dropped: reconnect below unless closed */\n }\n // The server ends the stream when the tab is removed; the next connect\n // then answers 404 and reports 'gone'.\n schedule();\n }\n\n setState('connecting');\n void connect();\n\n return {\n close() {\n if (closed) return;\n closed = true;\n if (timer) clearTimeout(timer);\n controller?.abort();\n handlers.onState?.('closed');\n },\n };\n}\n","/**\n * dock/terminal/terminal-view.ts — the one seam between the Terminal pane and\n * xterm.js (unit C4).\n *\n * LAZY. `@xterm/xterm` (≈ 345 KB minified) and its stylesheet load only when\n * a terminal is first shown, as their own chunk — never on the chat's\n * critical path (SPEC-310C budget: chat critical JS ≤ 350 KB). The pane talks\n * to a small `TerminalView` interface, so tests inject a fake (jsdom has no\n * layout or canvas for xterm) and the pane never imports xterm itself.\n *\n * THEME FROM TOKENS. xterm wants concrete colours; the design system forbids\n * raw hex in new UI files and wants every colour to follow the theme. So the\n * palette is declared as CSS custom properties on the pane\n * (TerminalPane.module.css, mapped to design tokens for both themes) and\n * resolved here at runtime — a probe element turns `var(--x)` into a computed\n * colour, a 1×1 canvas normalises any colour syntax to rgb — and re-resolved\n * when the theme changes.\n */\nimport type { ITheme, Terminal as XtermTerminal } from '@xterm/xterm';\n\nexport interface TerminalViewDisposable {\n dispose(): void;\n}\n\nexport interface TerminalView {\n readonly cols: number;\n readonly rows: number;\n open(host: HTMLElement): void;\n write(data: Uint8Array): void;\n reset(): void;\n focus(): void;\n /** Fit to the host; returns the new size (or null when the host has no size — hidden). */\n fit(): { cols: number; rows: number } | null;\n onData(cb: (data: string) => void): TerminalViewDisposable;\n onBinary(cb: (data: string) => void): TerminalViewDisposable;\n onSelectionChange(cb: () => void): TerminalViewDisposable;\n hasSelection(): boolean;\n getSelection(): string;\n /** Paste as if typed (bracketed when the program asked for it). Never adds Enter. */\n paste(text: string): void;\n /** True while the program in the terminal has bracketed paste on (shells at a prompt do). */\n bracketedPaste(): boolean;\n setTheme(theme: TerminalTheme): void;\n setScreenReaderMode(on: boolean): void;\n /** Return false from `filter` to let a key pass to the page (app shortcuts). */\n setKeyFilter(filter: (event: KeyboardEvent) => boolean): void;\n dispose(): void;\n}\n\nexport type TerminalTheme = ITheme;\n\nexport interface TerminalViewOptions {\n fontFamily: string;\n fontSize: number;\n theme: TerminalTheme;\n screenReaderMode: boolean;\n}\n\nexport type TerminalViewFactory = (opts: TerminalViewOptions) => Promise<TerminalView>;\n\n/** Scrollback kept by the VIEW (lines). The server keeps its own 256 KB for reattach. */\nconst VIEW_SCROLLBACK_LINES = 5_000;\n\nlet xtermModules: Promise<[typeof import('@xterm/xterm'), typeof import('@xterm/addon-fit')]> | null = null;\n\nfunction loadXtermModules() {\n if (!xtermModules) {\n xtermModules = Promise.all([\n import('@xterm/xterm'),\n import('@xterm/addon-fit'),\n import('@xterm/xterm/css/xterm.css'),\n ]).then(([xterm, fit]) => [xterm, fit] as [typeof import('@xterm/xterm'), typeof import('@xterm/addon-fit')]);\n // A failed chunk load must be retryable (the pane offers \"Try again\").\n xtermModules.catch(() => { xtermModules = null; });\n }\n return xtermModules;\n}\n\n/** The real xterm.js view. */\nexport const createXtermView: TerminalViewFactory = async (opts) => {\n const [{ Terminal }, { FitAddon }] = await loadXtermModules();\n const term: XtermTerminal = new Terminal({\n fontFamily: opts.fontFamily,\n fontSize: opts.fontSize,\n lineHeight: 1.2,\n cursorBlink: true,\n cursorStyle: 'bar',\n scrollback: VIEW_SCROLLBACK_LINES,\n theme: opts.theme,\n screenReaderMode: opts.screenReaderMode,\n // ⌥ as Meta: word motions (⌥←/⌥→ → ESC b / ESC f) work as in Terminal.app\n // with \"Use Option as Meta key\".\n macOptionIsMeta: true,\n // Keep dim ANSI text legible on our surfaces in both themes.\n minimumContrastRatio: 3,\n allowProposedApi: false,\n });\n const fit = new FitAddon();\n term.loadAddon(fit);\n let opened = false;\n\n return {\n get cols() { return term.cols; },\n get rows() { return term.rows; },\n open(host) {\n if (opened) return;\n opened = true;\n term.open(host);\n },\n write(data) { term.write(data); },\n reset() { term.reset(); },\n focus() { term.focus(); },\n fit() {\n const dims = fit.proposeDimensions();\n if (!dims || !Number.isFinite(dims.cols) || !Number.isFinite(dims.rows) || dims.cols < 2 || dims.rows < 2) return null;\n fit.fit();\n return { cols: term.cols, rows: term.rows };\n },\n onData: (cb) => term.onData(cb),\n onBinary: (cb) => term.onBinary(cb),\n onSelectionChange: (cb) => term.onSelectionChange(cb),\n hasSelection: () => term.hasSelection(),\n getSelection: () => term.getSelection(),\n paste(text) { term.paste(text); },\n bracketedPaste: () => term.modes.bracketedPasteMode,\n setTheme(theme) { term.options.theme = theme; },\n setScreenReaderMode(on) { term.options.screenReaderMode = on; },\n setKeyFilter(filter) { term.attachCustomKeyEventHandler(filter); },\n dispose() { term.dispose(); },\n };\n};\n\n// ---------------------------------------------------------------------------\n// Theme resolution\n// ---------------------------------------------------------------------------\n\n/** ITheme key → the custom property TerminalPane.module.css declares for it. */\nexport const TERMINAL_THEME_VARS: Readonly<Record<keyof Omit<ITheme, 'extendedAnsi'>, string>> = {\n foreground: '--term-fg',\n background: '--term-bg',\n cursor: '--term-cursor',\n cursorAccent: '--term-bg',\n selectionBackground: '--term-selection',\n selectionForeground: '--term-fg',\n selectionInactiveBackground: '--term-selection-inactive',\n scrollbarSliderBackground: '--term-scrollbar',\n scrollbarSliderHoverBackground: '--term-scrollbar-hover',\n scrollbarSliderActiveBackground: '--term-scrollbar-hover',\n overviewRulerBorder: '--term-bg',\n black: '--term-black',\n red: '--term-red',\n green: '--term-green',\n yellow: '--term-yellow',\n blue: '--term-blue',\n magenta: '--term-magenta',\n cyan: '--term-cyan',\n white: '--term-white',\n brightBlack: '--term-bright-black',\n brightRed: '--term-bright-red',\n brightGreen: '--term-bright-green',\n brightYellow: '--term-bright-yellow',\n brightBlue: '--term-bright-blue',\n brightMagenta: '--term-bright-magenta',\n brightCyan: '--term-bright-cyan',\n brightWhite: '--term-bright-white',\n};\n\nlet canvasCtx: CanvasRenderingContext2D | null | undefined;\n\n/**\n * Any CSS colour → `rgb(r, g, b)` / `rgba(…)`, by painting one pixel. Canvas\n * accepts every syntax the browser does (hsl, color-mix, oklch) and the pixel\n * is plain sRGB, which is what xterm parses. Falls back to the input.\n */\nexport function normalizeCssColor(value: string): string {\n if (typeof document === 'undefined') return value;\n if (canvasCtx === undefined) {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n canvasCtx = canvas.getContext('2d', { willReadFrequently: true });\n } catch {\n canvasCtx = null;\n }\n }\n const ctx = canvasCtx;\n if (!ctx) return value;\n try {\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === undefined) return value;\n return a === 255 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${(a! / 255).toFixed(3)})`;\n } catch {\n return value;\n }\n}\n\n/**\n * Read the pane's `--term-*` properties as concrete colours. A probe child\n * with `color: var(--x)` makes the browser resolve every var() and\n * color-mix() for us; unset properties are left out (xterm keeps its default).\n */\nexport function resolveTerminalTheme(host: HTMLElement): TerminalTheme {\n const probe = document.createElement('span');\n probe.style.display = 'none';\n host.appendChild(probe);\n const theme: Record<string, string> = {};\n try {\n for (const [key, prop] of Object.entries(TERMINAL_THEME_VARS)) {\n const declared = getComputedStyle(host).getPropertyValue(prop).trim();\n if (!declared) continue;\n probe.style.color = '';\n probe.style.color = `var(${prop})`;\n const computed = getComputedStyle(probe).color;\n if (computed) theme[key] = normalizeCssColor(computed);\n }\n } finally {\n probe.remove();\n }\n return theme as TerminalTheme;\n}\n\n/** The host's computed monospace family and size (so the display-size setting reaches the terminal). */\nexport function resolveTerminalFont(host: HTMLElement): { fontFamily: string; fontSize: number } {\n const style = getComputedStyle(host);\n const size = Number.parseFloat(style.fontSize);\n return {\n fontFamily: style.fontFamily || 'ui-monospace, Menlo, monospace',\n fontSize: Number.isFinite(size) && size >= 11 ? size : 13,\n };\n}\n\n/** Call `onChange` when the effective colour theme changes (explicit toggle or OS appearance). */\nexport function watchThemeChanges(onChange: () => void): () => void {\n if (typeof window === 'undefined') return () => {};\n const root = document.documentElement;\n const observer = typeof MutationObserver === 'function'\n ? new MutationObserver(() => onChange())\n : null;\n observer?.observe(root, { attributes: true, attributeFilter: ['data-theme', 'data-accent', 'class', 'style'] });\n const media = typeof window.matchMedia === 'function' ? window.matchMedia('(prefers-color-scheme: dark)') : null;\n const onMedia = () => onChange();\n media?.addEventListener?.('change', onMedia);\n return () => {\n observer?.disconnect();\n media?.removeEventListener?.('change', onMedia);\n };\n}\n","/**\n * dock/terminal/TerminalPane.tsx — the chat dock's Terminal (unit C4;\n * SPEC-310C §3). Rendered by C2's Dock through C0's `terminal-pane` slot, so\n * this file (and xterm with it) loads only when a terminal is first opened.\n *\n * WHAT IT IS\n * - One tab per shell, each a LOGIN shell the sidecar runs on a real PTY\n * (core/verse/terminal.ts), opened in one of this chat's roots. Tabs\n * live on the server: a page reload reattaches to them and replays their\n * scrollback. The tab title follows the shell's own OSC title.\n * - Header: the working directory, \"Send selection to chat\" (as a fenced\n * block), a screen-reader mode, and \"Open in Terminal.app\".\n * - Selecting text copies it (the ⌘C you would otherwise type next).\n * - Under Node (no PTY) the pane says the terminal needs the desktop app\n * and still offers Terminal.app.\n *\n * WIRING\n * - Output: ONE live stream, the visible tab's (terminal-stream.ts). A\n * background tab catches up from its last seq when shown again; the\n * list poll (every 3 s, only while visible) marks unseen output with a dot.\n * - Input: keystrokes go through a single-flight queue (input-queue.ts) so\n * they reach the shell in the order they were typed.\n * - Keys: xterm owns the keyboard while focused, EXCEPT the app's own\n * chords (⌘K, ⌘J, ⌘1–5, ⌃`, ⌃Tab …, from command-catalog.ts), which it\n * passes to the page. ⌃C, ⌃R, Esc and ⌥-word motions stay in the shell.\n * - Requests from the dock (`request`, one per nonce): focus or open a tab\n * at a root, force a new one (⌃⇧`), paste a command WITHOUT running it\n * (\"Run in terminal\"), launch an app or start a dev server (the server\n * types that command — built from its own catalog, never from the page).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport type { VerseTerminalFrame, VerseTerminalListResponse, VerseTerminalTab } from '../../../../data/api-types.js';\nimport { ApiError } from '../../../../data/client.js';\nimport { Button, IconButton } from '../../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../../components/primitives/EmptyState.js';\nimport { SkeletonLine } from '../../../../components/primitives/Skeleton.js';\nimport { IconExternalLink, IconPlus, IconSend, IconX } from '../../../../components/primitives/icons.js';\nimport { ActionMenu, anchorBelow, type MenuAnchor } from '../../chat/ActionMenu.js';\nimport { detectKeyPlatform, eventKeyName, findCommand, formatChord, matchCommand, type KeyPlatform } from '../../shell/command-catalog.js';\nimport { usePollWhileVisible, useSectionVisible } from '../../shell/section-visibility.js';\nimport type { VerseTerminalLaunchVia } from '../../../../../core/verse/workbench-types.js';\nimport type { TerminalPaneProps } from '../../shell/slots.js';\nimport type { TerminalRequest } from '../dock-store.js';\nimport { useViewport } from '../../shell/viewport.js';\nimport { projectName } from '../../verse-model.js';\nimport { createInputQueue, type InputQueue } from './input-queue.js';\nimport { base64ToBytes, fenceSelection, terminalApi, TerminalLockedError, type TerminalApi } from './terminal-client.js';\nimport { openTerminalStream, type TerminalStreamState } from './terminal-stream.js';\nimport {\n createXtermView,\n resolveTerminalFont,\n resolveTerminalTheme,\n watchThemeChanges,\n type TerminalView,\n type TerminalViewFactory,\n} from './terminal-view.js';\nimport { ChevronDownGlyph, ScreenReaderGlyph, TerminalGlyph } from './terminal-icons.js';\nimport chrome from '../pane-chrome.module.css';\nimport styles from './TerminalPane.module.css';\n\n// ---------------------------------------------------------------------------\n// Seams\n// ---------------------------------------------------------------------------\n\nexport interface TerminalPaneDeps {\n api: TerminalApi;\n createView: TerminalViewFactory;\n openStream: typeof openTerminalStream;\n platform: KeyPlatform;\n writeClipboard: (text: string) => Promise<void>;\n}\n\nconst DEFAULT_DEPS: TerminalPaneDeps = {\n api: terminalApi,\n createView: createXtermView,\n openStream: openTerminalStream,\n platform: detectKeyPlatform(),\n writeClipboard: async (text) => {\n await navigator.clipboard.writeText(text);\n },\n};\n\n/** How often the tab list is refreshed while the pane is on screen. */\nexport const TERMINAL_LIST_POLL_MS = 3_000;\nconst SCREEN_READER_PREF_KEY = 'ashlr.verse.terminal.screenReader';\n/** Requests already handled, across remounts (the dock keeps its last request around). */\nlet lastHandledNonce = 0;\n\n/** Test hygiene. */\nexport function resetTerminalPaneForTest(): void {\n lastHandledNonce = 0;\n}\n\nfunction readScreenReaderPref(): boolean {\n try {\n return localStorage.getItem(SCREEN_READER_PREF_KEY) === '1';\n } catch {\n return false;\n }\n}\n\nfunction writeScreenReaderPref(on: boolean): void {\n try {\n localStorage.setItem(SCREEN_READER_PREF_KEY, on ? '1' : '0');\n } catch {\n /* storage unavailable: the choice lasts for this page only */\n }\n}\n\n/**\n * Keys the PAGE handles even while the terminal has focus: a catalog command\n * whose chord uses ⌘ (macOS), or ⌃` / ⌃Tab. Everything else — ⌃C, ⌃R, Esc,\n * ⌥← — belongs to the shell. Off macOS `mod` is Ctrl, so only Ctrl+Shift\n * chords and ⌃` / ⌃Tab pass (Ctrl+K must still kill a line).\n */\nexport function keyPassesToPage(event: KeyboardEvent, platform: KeyPlatform): boolean {\n if (event.type !== 'keydown') return false;\n if (!matchCommand(event, ['chat', 'global'], platform)) return false;\n const key = eventKeyName(event);\n const shellChord = event.ctrlKey && (key === '`' || key === 'tab');\n if (platform === 'mac') return event.metaKey || shellChord;\n return shellChord || (event.ctrlKey && event.shiftKey);\n}\n\nfunction errorText(err: unknown, fallback: string): string {\n if (err instanceof TerminalLockedError) return err.message;\n if (err instanceof ApiError) {\n if (err.status === 401) return 'Unlock actions with the mutation token to use the terminal.';\n if (err.detail) return err.detail.endsWith('.') ? err.detail : `${err.detail}.`;\n }\n return fallback;\n}\n\ninterface ViewRecord {\n view: TerminalView;\n host: HTMLDivElement;\n lastSeq: number;\n queue: InputQueue;\n disposers: Array<{ dispose(): void }>;\n}\n\ntype Notice = { tone: 'error' | 'info'; text: string };\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TerminalPane({ sessionId, roots, request, onSendToChat, visible, deps: depsOverride }: TerminalPaneProps & { deps?: Partial<TerminalPaneDeps> }) {\n const deps = useMemo<TerminalPaneDeps>(() => ({ ...DEFAULT_DEPS, ...depsOverride }), [depsOverride]);\n const sectionVisible = useSectionVisible();\n const shown = visible && sectionVisible;\n const compact = useViewport().compact;\n\n const [list, setList] = useState<VerseTerminalListResponse | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [activeId, setActiveId] = useState<string | null>(null);\n const [notice, setNotice] = useState<Notice | null>(null);\n const [creating, setCreating] = useState(false);\n const [streamState, setStreamState] = useState<TerminalStreamState | null>(null);\n const [hasSelection, setHasSelection] = useState(false);\n const [copied, setCopied] = useState(false);\n const [screenReader, setScreenReader] = useState(readScreenReaderPref);\n const [viewFailed, setViewFailed] = useState(false);\n const [readyIds, setReadyIds] = useState<ReadonlySet<string>>(() => new Set());\n const [rootMenu, setRootMenu] = useState<{ anchor: MenuAnchor; from: HTMLElement } | null>(null);\n const [seen, setSeen] = useState<ReadonlyMap<string, string>>(() => new Map());\n\n const views = useRef(new Map<string, ViewRecord>());\n const hosts = useRef(new Map<string, HTMLDivElement>());\n const creatingViews = useRef(new Set<string>());\n const autoCreated = useRef(false);\n const pendingPaste = useRef<{ tabId: string; text: string } | null>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const tabRefs = useRef(new Map<string, HTMLButtonElement>());\n const resizeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const copyTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const selectionTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const mounted = useRef(true);\n /**\n * True while a shell the operator CLICKED for is opening (New terminal, the\n * folder menu). Any other open — the automatic first one, a dock request —\n * shows the pane opening instead of \"No terminal open\"; a click keeps the\n * empty state (and the focused, busy button) where it is.\n */\n const manualOpen = useRef(false);\n\n const allTabs = useMemo(() => list?.tabs ?? [], [list]);\n const exitedIds = useRef(new Set<string>());\n exitedIds.current = new Set(allTabs.filter((t) => t.exited).map((t) => t.id));\n const tabs = useMemo(() => allTabs.filter((t) => t.sessionId === sessionId), [allTabs, sessionId]);\n const active = tabs.find((t) => t.id === activeId) ?? null;\n const otherChats = allTabs.length - tabs.length;\n\n // -------------------------------------------------------------------------\n // The tab list\n // -------------------------------------------------------------------------\n\n const refresh = useCallback(async () => {\n try {\n const next = await deps.api.list();\n if (!mounted.current) return;\n setList(next);\n setLoadError(null);\n } catch (err) {\n if (!mounted.current) return;\n setLoadError(errorText(err, 'The terminal list could not be loaded.'));\n }\n }, [deps.api]);\n\n useEffect(() => {\n mounted.current = true;\n void refresh();\n return () => { mounted.current = false; };\n }, [refresh]);\n\n usePollWhileVisible(() => { void refresh(); }, TERMINAL_LIST_POLL_MS, { enabled: visible });\n\n // Keep the active tab valid: the first of this chat's tabs when it vanished.\n useEffect(() => {\n if (!list) return;\n if (activeId && tabs.some((t) => t.id === activeId)) return;\n setActiveId(tabs.at(-1)?.id ?? null);\n }, [list, tabs, activeId]);\n\n // Forget views of tabs that no longer exist (killed elsewhere, idle-closed).\n useEffect(() => {\n if (!list) return;\n const live = new Set(list.tabs.map((t) => t.id));\n for (const [id, rec] of views.current) {\n if (live.has(id)) continue;\n disposeRecord(rec);\n views.current.delete(id);\n setReadyIds((prev) => { const next = new Set(prev); next.delete(id); return next; });\n }\n }, [list]);\n\n // The active tab's output is seen as it arrives.\n useEffect(() => {\n if (!active || !shown) return;\n setSeen((prev) => (prev.get(active.id) === active.lastActivityAt ? prev : new Map(prev).set(active.id, active.lastActivityAt)));\n }, [active, shown]);\n\n // Dispose everything on unmount (the SERVER keeps the shells).\n useEffect(() => () => {\n for (const rec of views.current.values()) disposeRecord(rec);\n views.current.clear();\n for (const t of [resizeTimer, copyTimer, selectionTimer]) if (t.current) clearTimeout(t.current);\n }, []);\n\n function disposeRecord(rec: ViewRecord): void {\n rec.queue.dispose();\n for (const d of rec.disposers) {\n try { d.dispose(); } catch { /* already gone */ }\n }\n try { rec.view.dispose(); } catch { /* already gone */ }\n }\n\n // -------------------------------------------------------------------------\n // Creating, closing, restarting tabs\n // -------------------------------------------------------------------------\n\n const sizeHint = useCallback((): { cols: number; rows: number } => {\n for (const rec of views.current.values()) {\n if (rec.view.cols > 1 && rec.view.rows > 1) return { cols: rec.view.cols, rows: rec.view.rows };\n }\n return { cols: 80, rows: 24 };\n }, []);\n\n const createTab = useCallback(async (opts: { root?: string; appId?: string; via?: VerseTerminalLaunchVia; model?: string; devServerId?: string } = {}): Promise<VerseTerminalTab | null> => {\n setCreating(true);\n setNotice(null);\n try {\n const tab = await deps.api.create({\n sessionId,\n ...(opts.root ? { root: opts.root } : {}),\n ...(opts.appId ? { appId: opts.appId } : {}),\n // How the app launches (Ollama, a local model): only with an app — the server refuses them alone.\n ...(opts.appId && opts.via ? { via: opts.via } : {}),\n ...(opts.appId && opts.model ? { model: opts.model } : {}),\n ...(opts.devServerId ? { devServerId: opts.devServerId } : {}),\n ...sizeHint(),\n });\n if (!mounted.current) return tab;\n setList((prev) => (prev ? { ...prev, tabs: [...prev.tabs.filter((t) => t.id !== tab.id), tab] } : prev));\n setActiveId(tab.id);\n return tab;\n } catch (err) {\n if (mounted.current) setNotice({ tone: 'error', text: errorText(err, 'The terminal could not be opened.') });\n return null;\n } finally {\n if (mounted.current) setCreating(false);\n }\n }, [deps.api, sessionId, sizeHint]);\n\n const closeTab = useCallback(async (tab: VerseTerminalTab) => {\n try {\n await deps.api.kill(tab.id);\n } catch (err) {\n // Already gone on the server is as good as closed.\n if (!(err instanceof ApiError && err.status === 404)) {\n setNotice({ tone: 'error', text: errorText(err, 'The terminal could not be closed.') });\n return;\n }\n }\n const rec = views.current.get(tab.id);\n if (rec) {\n disposeRecord(rec);\n views.current.delete(tab.id);\n }\n setList((prev) => (prev ? { ...prev, tabs: prev.tabs.filter((t) => t.id !== tab.id) } : prev));\n if (activeId === tab.id) {\n const index = tabs.findIndex((t) => t.id === tab.id);\n const neighbour = tabs[index + 1] ?? tabs[index - 1] ?? null;\n setActiveId(neighbour?.id ?? null);\n }\n }, [activeId, deps.api, tabs]);\n\n const restartTab = useCallback(async (tab: VerseTerminalTab) => {\n const next = await createTab({ root: tab.root });\n if (next) await closeTab(tab);\n }, [closeTab, createTab]);\n\n // Another chat (the dock keeps this pane mounted across chats): its own\n // first look may open a shell again.\n const autoCreatedFor = useRef(sessionId);\n if (autoCreatedFor.current !== sessionId) {\n autoCreatedFor.current = sessionId;\n autoCreated.current = false;\n }\n\n // First look at an empty pane: open a shell in the chat's primary root.\n useEffect(() => {\n if (!list || !list.available || !shown || autoCreated.current || creating) return;\n if (request && request.nonce > lastHandledNonce) return; // the request decides\n autoCreated.current = true;\n if (tabs.length === 0) void createTab({});\n }, [list, shown, tabs.length, creating, createTab, request]);\n\n // -------------------------------------------------------------------------\n // Views (xterm) — one per tab, created when its panel mounts\n // -------------------------------------------------------------------------\n\n const attachView = useCallback(async (tabId: string, host: HTMLDivElement) => {\n if (views.current.has(tabId) || creatingViews.current.has(tabId)) return;\n creatingViews.current.add(tabId);\n try {\n const view = await deps.createView({ ...resolveTerminalFont(host), theme: resolveTerminalTheme(host), screenReaderMode: readScreenReaderPref() });\n if (!mounted.current || !hosts.current.has(tabId)) {\n view.dispose();\n return;\n }\n view.open(host);\n const queue = createInputQueue((b64) => deps.api.input(tabId, b64), {\n onError: (err) => {\n if (mounted.current) setNotice({ tone: 'error', text: errorText(err, 'That input did not reach the shell.') });\n },\n });\n const rec: ViewRecord = { view, host, lastSeq: 0, queue, disposers: [] };\n // Keystrokes into a shell that has exited go nowhere (the exit bar offers Restart).\n rec.disposers.push(view.onData((data) => { if (!exitedIds.current.has(tabId)) queue.pushText(data); }));\n rec.disposers.push(view.onBinary((data) => { if (!exitedIds.current.has(tabId)) queue.pushBinary(data); }));\n rec.disposers.push(view.onSelectionChange(() => {\n const selected = view.hasSelection();\n setHasSelection(selected);\n if (!selected) return;\n // Copy on select, once the drag settles.\n if (selectionTimer.current) clearTimeout(selectionTimer.current);\n selectionTimer.current = setTimeout(() => {\n const text = view.getSelection();\n if (!text) return;\n deps.writeClipboard(text).then(() => {\n if (!mounted.current) return;\n setCopied(true);\n if (copyTimer.current) clearTimeout(copyTimer.current);\n copyTimer.current = setTimeout(() => setCopied(false), 1_200);\n }, () => { /* clipboard refused (no user gesture): the selection still works with ⌘C */ });\n }, 150);\n }));\n view.setKeyFilter((event) => !keyPassesToPage(event, deps.platform));\n views.current.set(tabId, rec);\n setViewFailed(false);\n setReadyIds((prev) => new Set(prev).add(tabId));\n } catch (err) {\n console.error('[verse] terminal view failed to load', err);\n if (mounted.current) setViewFailed(true);\n } finally {\n creatingViews.current.delete(tabId);\n }\n }, [deps]);\n\n // One stable ref callback per tab: a fresh closure each render would make\n // React detach and re-attach the host on every render.\n const attachRef = useRef(attachView);\n attachRef.current = attachView;\n const hostRefs = useRef(new Map<string, (node: HTMLDivElement | null) => void>());\n const hostRef = (tabId: string) => {\n let ref = hostRefs.current.get(tabId);\n if (!ref) {\n ref = (node) => {\n if (node) {\n hosts.current.set(tabId, node);\n void attachRef.current(tabId, node);\n } else {\n hosts.current.delete(tabId);\n hostRefs.current.delete(tabId);\n }\n };\n hostRefs.current.set(tabId, ref);\n }\n return ref;\n };\n\n // Fit the visible view to its panel and tell the shell its size.\n const fitActive = useCallback(() => {\n if (!activeId) return;\n const rec = views.current.get(activeId);\n if (!rec) return;\n const before = { cols: rec.view.cols, rows: rec.view.rows };\n const size = rec.view.fit();\n if (!size || (size.cols === before.cols && size.rows === before.rows && active && active.cols === size.cols && active.rows === size.rows)) return;\n if (resizeTimer.current) clearTimeout(resizeTimer.current);\n const id = activeId;\n resizeTimer.current = setTimeout(() => {\n deps.api.resize(id, size.cols, size.rows).catch(() => { /* the next fit retries */ });\n }, 100);\n }, [active, activeId, deps.api]);\n\n useEffect(() => {\n if (!shown || !activeId || !readyIds.has(activeId)) return;\n fitActive();\n const body = bodyRef.current;\n if (!body || typeof ResizeObserver === 'undefined') return;\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(fitActive);\n });\n observer.observe(body);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [shown, activeId, readyIds, fitActive]);\n\n // Theme follows the app (explicit toggle or OS appearance).\n useEffect(() => watchThemeChanges(() => {\n for (const rec of views.current.values()) rec.view.setTheme(resolveTerminalTheme(rec.host));\n }), []);\n\n // -------------------------------------------------------------------------\n // The live stream (visible tab only)\n // -------------------------------------------------------------------------\n\n const applyPaste = useCallback((tabId: string) => {\n const pending = pendingPaste.current;\n if (!pending || pending.tabId !== tabId) return;\n const rec = views.current.get(tabId);\n if (!rec) return;\n pendingPaste.current = null;\n const text = pending.text.replace(/[\\r\\n]+$/, '');\n if (text.includes('\\n') && !rec.view.bracketedPaste()) {\n // Without bracketed paste a shell would RUN each line as it arrives.\n deps.writeClipboard(text).then(\n () => setNotice({ tone: 'info', text: 'That command has several lines, so it was copied instead: paste it with ⌘V.' }),\n () => setNotice({ tone: 'error', text: 'That command has several lines and could not be pasted safely.' }),\n );\n } else {\n rec.view.paste(text);\n }\n rec.view.focus();\n }, [deps]);\n\n useEffect(() => {\n if (!shown || !activeId || !readyIds.has(activeId)) {\n setStreamState(null);\n return;\n }\n const rec = views.current.get(activeId);\n if (!rec) return;\n const tabId = activeId;\n let firstOutput = true;\n const onFrame = (frame: VerseTerminalFrame) => {\n if (frame.type === 'output') {\n if (frame.seq <= rec.lastSeq) return;\n // A gap means the scrollback ring dropped frames this view never got:\n // start over from what the server still has rather than draw a torn screen.\n if (rec.lastSeq > 0 && frame.seq > rec.lastSeq + 1) rec.view.reset();\n rec.view.write(base64ToBytes(frame.dataBase64));\n rec.lastSeq = frame.seq;\n if (firstOutput) {\n firstOutput = false;\n if (pendingPaste.current?.tabId === tabId) setTimeout(() => applyPaste(tabId), 120);\n }\n return;\n }\n setList((prev) => {\n if (!prev) return prev;\n return {\n ...prev,\n tabs: prev.tabs.map((t) => {\n if (t.id !== tabId) return t;\n if (frame.type === 'title') return t.title === frame.title ? t : { ...t, title: frame.title };\n return { ...t, exited: { code: frame.code, signal: frame.signal, at: new Date().toISOString() } };\n }),\n };\n });\n };\n const stream = deps.openStream(tabId, () => rec.lastSeq, {\n onFrame,\n onState: (state) => {\n if (!mounted.current) return;\n setStreamState(state);\n if (state === 'gone') void refresh();\n },\n });\n // An existing tab that already has output can take a paste right away.\n if (pendingPaste.current?.tabId === tabId && rec.lastSeq > 0) setTimeout(() => applyPaste(tabId), 0);\n return () => stream.close();\n }, [shown, activeId, readyIds, deps, refresh, applyPaste]);\n\n // -------------------------------------------------------------------------\n // Requests from the dock\n // -------------------------------------------------------------------------\n\n const handleRequest = useCallback(async (req: TerminalRequest) => {\n const root = req.root ?? active?.root ?? roots[0];\n const wantsNew = req.newTab === true || Boolean(req.appId) || Boolean(req.devServerId);\n let target: VerseTerminalTab | null = null;\n if (!wantsNew) {\n target = (active && !active.exited && (!req.root || active.root === req.root) ? active : null)\n ?? tabs.find((t) => !t.exited && (!req.root || t.root === req.root)) ?? null;\n }\n if (target) {\n setActiveId(target.id);\n } else {\n target = await createTab({\n ...(root ? { root } : {}),\n ...(req.appId ? { appId: req.appId } : {}),\n ...(req.via ? { via: req.via } : {}),\n ...(req.model ? { model: req.model } : {}),\n ...(req.devServerId ? { devServerId: req.devServerId } : {}),\n });\n }\n if (!target) return;\n if (req.paste) {\n pendingPaste.current = { tabId: target.id, text: req.paste };\n const rec = views.current.get(target.id);\n if (rec && rec.lastSeq > 0) applyPaste(target.id);\n } else {\n views.current.get(target.id)?.view.focus();\n }\n }, [active, applyPaste, createTab, roots, tabs]);\n\n useEffect(() => {\n if (!request || !list || request.nonce <= lastHandledNonce) return;\n lastHandledNonce = request.nonce;\n autoCreated.current = true;\n if (!list.available) return;\n void handleRequest(request);\n }, [request, list, handleRequest]);\n\n // Focus the terminal when its tab becomes the visible one.\n useEffect(() => {\n if (!shown || !activeId || !readyIds.has(activeId)) return;\n views.current.get(activeId)?.view.focus();\n }, [shown, activeId, readyIds]);\n\n // -------------------------------------------------------------------------\n // Header actions\n // -------------------------------------------------------------------------\n\n const sendSelection = () => {\n if (!activeId) return;\n const text = views.current.get(activeId)?.view.getSelection() ?? '';\n if (!text.trim()) return;\n onSendToChat(fenceSelection(text));\n };\n\n const toggleScreenReader = () => {\n const next = !screenReader;\n setScreenReader(next);\n writeScreenReaderPref(next);\n for (const rec of views.current.values()) rec.view.setScreenReaderMode(next);\n };\n\n const openExternal = async () => {\n try {\n await deps.api.openExternal(sessionId, active?.root ?? roots[0]);\n setNotice({ tone: 'info', text: 'Opened in Terminal.' });\n } catch (err) {\n setNotice({ tone: 'error', text: errorText(err, 'Terminal could not be opened.') });\n }\n };\n\n const openByClick = (opts: { root?: string }) => {\n manualOpen.current = true;\n void createTab(opts).finally(() => { manualOpen.current = false; });\n };\n\n const onNewTabClick = () => {\n openByClick(active?.root ? { root: active.root } : {});\n };\n\n // Tabs: ←/→ move and activate, Home/End jump (WAI-ARIA tabs, automatic activation).\n const onTabKeyDown = (event: ReactKeyboardEvent<HTMLButtonElement>, index: number) => {\n let next = -1;\n if (event.key === 'ArrowRight') next = (index + 1) % tabs.length;\n else if (event.key === 'ArrowLeft') next = (index - 1 + tabs.length) % tabs.length;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = tabs.length - 1;\n if (next < 0) return;\n event.preventDefault();\n const tab = tabs[next]!;\n setActiveId(tab.id);\n tabRefs.current.get(tab.id)?.focus();\n };\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n if (!list) {\n if (loadError) {\n return (\n <div className={styles.pane}>\n <EmptyState compact tone=\"error\" title=\"Terminal is not reachable\" body={loadError}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={() => void refresh()}>Try again</Button>} />\n </div>\n );\n }\n return (\n <div className={styles.pane} aria-busy=\"true\">\n {/* The strip's row is held from the first frame so the chrome does not drop in under the dock's tabs. */}\n <div className={styles.strip} aria-hidden=\"true\" />\n <div className={styles.loading}>\n <SkeletonLine width=\"40%\" />\n <SkeletonLine width=\"70%\" />\n </div>\n </div>\n );\n }\n\n if (!list.available) {\n return (\n <div className={styles.pane}>\n <EmptyState\n compact\n icon={<TerminalGlyph size={20} />}\n title=\"Terminal needs the desktop app\"\n body=\"This Verse server has no built-in terminal. Open the project in Terminal instead, or use the Ashlr desktop app.\"\n action={deps.platform === 'mac' ? (\n <Button size=\"sm\" variant=\"subtle\" icon={<IconExternalLink />} onClick={() => void openExternal()}>Open in Terminal</Button>\n ) : undefined}\n />\n {notice ? <p className={styles.inlineNotice} role={notice.tone === 'error' ? 'alert' : 'status'}>{notice.text}</p> : null}\n </div>\n );\n }\n\n const canChooseRoot = roots.length > 1;\n const newTabChord = findCommand('dock.terminal-new')?.keys[0];\n const newTabKey = newTabChord ? formatChord(newTabChord, deps.platform) : null;\n // Before a chat's first shell is open — the automatic one on first sight,\n // or one a dock request asked for — the pane shows it opening instead of\n // flashing \"No terminal open\" for the moment the request takes.\n const opening = tabs.length === 0 && !viewFailed && (!autoCreated.current || (creating && !manualOpen.current));\n // The folder the header names: the visible tab's (or, for the render before\n // the active tab is chosen, the one that will be), or while the first shell\n // opens the chat's primary folder, where it opens — so the row does not\n // appear, or change, when the tab lands.\n const headerRoot = active?.root ?? tabs.at(-1)?.root ?? (opening ? roots[0] ?? null : null);\n\n return (\n <div className={styles.pane} data-compact={compact || undefined}>\n <div className={styles.strip}>\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Terminals\">\n {tabs.map((tab, index) => {\n const selected = tab.id === activeId;\n const unseen = !selected && (seen.get(tab.id) ?? tab.createdAt) < tab.lastActivityAt;\n return (\n <div key={tab.id} className={styles.tab} data-selected={selected || undefined} role=\"presentation\">\n <button\n ref={(node) => { if (node) tabRefs.current.set(tab.id, node); else tabRefs.current.delete(tab.id); }}\n type=\"button\"\n role=\"tab\"\n id={`terminal-tab-${tab.id}`}\n aria-selected={selected}\n aria-controls={`terminal-panel-${tab.id}`}\n tabIndex={selected ? 0 : -1}\n className={styles.tabButton}\n title={`${tab.title} — ${tab.root}`}\n onClick={() => setActiveId(tab.id)}\n onKeyDown={(event) => onTabKeyDown(event, index)}\n >\n <span className={styles.tabTitle}>{tab.title}</span>\n {tab.exited ? <span className={styles.tabExited}>exited</span> : null}\n {unseen && !tab.exited ? <span className={styles.unseen} aria-label=\"new output\" role=\"img\" /> : null}\n </button>\n <button type=\"button\" className={styles.tabClose} aria-label={`Close terminal ${tab.title}`}\n title=\"Close terminal\" onClick={() => void closeTab(tab)}>\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <div className={styles.stripActions}>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconPlus />} aria-label=\"New terminal tab\"\n title={newTabKey ? `New terminal tab (${newTabKey})` : 'New terminal tab'}\n busy={creating} onClick={onNewTabClick} />\n {canChooseRoot ? (\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ChevronDownGlyph />} aria-label=\"New terminal in…\" aria-haspopup=\"menu\"\n aria-expanded={rootMenu !== null} title=\"Choose the folder\"\n onClick={(event) => setRootMenu({ anchor: anchorBelow(event.currentTarget), from: event.currentTarget })} />\n ) : null}\n </div>\n </div>\n\n {headerRoot !== null ? (\n <div className={`${chrome.header} ${styles.header}`}>\n {/* The folder's NAME; the full path (a home or temp path) is the tooltip. */}\n <span className={`${chrome.title} ${styles.cwd}`} title={headerRoot}>{projectName(headerRoot)}</span>\n <span className={styles.headerStatus} role=\"status\" aria-live=\"polite\">\n {streamState === 'reconnecting' ? 'Reconnecting…' : streamState === 'expired' ? 'Session expired — reload to reconnect' : copied ? 'Copied' : ''}\n </span>\n <div className={chrome.actions}>\n <Button variant=\"ghost\" size=\"sm\" icon={<IconSend />} disabled={!hasSelection} aria-label=\"Send selection to chat\"\n title={hasSelection ? 'Send the selected text to the chat as a code block' : 'Select text in the terminal first'}\n onClick={sendSelection}>\n {compact ? null : 'Send to chat'}\n </Button>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ScreenReaderGlyph />} aria-label=\"Screen reader mode\" aria-pressed={screenReader}\n title={screenReader ? 'Screen reader mode is on' : 'Screen reader mode'} onClick={toggleScreenReader} />\n {deps.platform === 'mac' ? (\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconExternalLink />} aria-label=\"Open in Terminal.app\"\n title=\"Open this folder in Terminal.app\" onClick={() => void openExternal()} />\n ) : null}\n </div>\n </div>\n ) : null}\n\n {notice ? (\n <div className={styles.notice} data-tone={notice.tone} role={notice.tone === 'error' ? 'alert' : 'status'}>\n <span>{notice.text}</span>\n <button type=\"button\" className={styles.noticeClose} aria-label=\"Dismiss\" title=\"Dismiss\" onClick={() => setNotice(null)}>\n <IconX size={12} />\n </button>\n </div>\n ) : null}\n\n <div className={styles.body} ref={bodyRef}>\n {viewFailed ? (\n <EmptyState compact tone=\"error\" title=\"The terminal could not load\" body=\"The rest of the chat still works.\"\n action={<Button size=\"sm\" variant=\"subtle\" onClick={() => {\n setViewFailed(false);\n for (const [id, host] of hosts.current) void attachView(id, host);\n }}>Try again</Button>} />\n ) : null}\n {opening ? (\n <div className={styles.loading} role=\"status\" aria-label=\"Opening a shell\">\n <SkeletonLine width=\"30%\" />\n </div>\n ) : null}\n {tabs.length === 0 && !viewFailed && !opening ? (\n <EmptyState compact icon={<TerminalGlyph size={20} />} title=\"No terminal open\"\n body={`Click New terminal${newTabKey ? ` or press ${newTabKey}` : ''} to open a login shell in this chat's folder.${otherChats > 0 ? ` ${otherChats} ${otherChats === 1 ? 'terminal is' : 'terminals are'} open in other chats.` : ''}`}\n action={<Button size=\"sm\" variant=\"subtle\" icon={<IconPlus />} busy={creating} onClick={onNewTabClick}>New terminal</Button>} />\n ) : null}\n {tabs.map((tab) => {\n const selected = tab.id === activeId;\n return (\n <div\n key={tab.id}\n id={`terminal-panel-${tab.id}`}\n role=\"tabpanel\"\n aria-labelledby={`terminal-tab-${tab.id}`}\n className={styles.panel}\n hidden={!selected}\n >\n <div className={styles.viewport}>\n <div className={styles.host} ref={hostRef(tab.id)} data-testid={`terminal-host-${tab.id}`} />\n {!readyIds.has(tab.id) && !viewFailed ? (\n <div className={styles.viewLoading} aria-hidden=\"true\"><SkeletonLine width=\"30%\" /></div>\n ) : null}\n </div>\n {tab.exited ? (\n <div className={styles.exitBar} role=\"status\">\n <span>\n {tab.exited.signal && tab.exited.code === null\n ? `Shell ended (${tab.exited.signal}).`\n : `Shell exited${tab.exited.code === null ? '' : ` with code ${tab.exited.code}`}.`}\n </span>\n <Button size=\"sm\" variant=\"subtle\" onClick={() => void restartTab(tab)}>Restart</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => void closeTab(tab)}>Close</Button>\n </div>\n ) : null}\n </div>\n );\n })}\n </div>\n\n {rootMenu ? (\n <ActionMenu\n label=\"New terminal in\"\n anchor={rootMenu.anchor}\n returnFocus={rootMenu.from}\n onClose={() => setRootMenu(null)}\n items={roots.map((root) => ({\n id: root,\n label: projectName(root),\n description: root,\n onSelect: () => { openByClick({ root }); },\n }))}\n />\n ) : null}\n </div>\n );\n}\n"],"file":"TerminalPane-MQT-veKZ.js"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{A as r,H as i,c as a,d as o,g as s,m as c,p as l,q as u,t as d,w as f}from"./global-oEl9Qj8u.js";import{n as p,t as m}from"./UniverseView-_nPURPqe.js";import{SessionGate as h}from"./SessionGate-e0dFJm9d.js";var g=n(e(),1),_=Object.freeze({"campaign-execution":Object.freeze([`campaign-call-threw`]),"campaign-verification":Object.freeze([`campaign-evidence-changed`]),"delivery-execution":Object.freeze([`delivery-call-threw`]),"delivery-verification":Object.freeze([`delivery-evidence-changed`,`delivery-receipt-unverified`]),"settlement-publication":Object.freeze([`settlement-write-failed`])});function v(e){return typeof e==`string`&&/^[a-z0-9][a-z0-9_-]{0,63}$/.test(e)}function y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function b(e){return typeof e==`string`&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString()===(e.length===20?e.replace(`Z`,`.000Z`):e)}function x(e){return typeof e==`string`&&/^[a-z0-9][a-z0-9_:-]{0,191}$/.test(e)}function S(e,t){let n=()=>Error(`Controller evidence could not be validated.`);if(!v(t)||!y(e)||e.schemaVersion!==1||e.controllerId!==t||typeof e.sourceState!=`string`||![`healthy`,`missing`,`degraded`].includes(e.sourceState)||typeof e.status!=`string`||![`completed`,`incomplete`,`cancelled`,`timed-out`,`unavailable`,`draining`,`drained`].includes(e.status)||!(e.createdAt===null||b(e.createdAt))||!(e.deadlineAt===null||b(e.deadlineAt))||!b(e.observedAt)||!Array.isArray(e.reasons)||e.reasons.length>128||!e.reasons.every(x)||!Array.isArray(e.outcomes)||e.outcomes.length>64)throw n();let r=new Set,i=e.outcomes.map(e=>{if(!y(e)||typeof e.campaignId!=`string`||!v(e.campaignId)||r.has(e.campaignId)||typeof e.state!=`string`||![`pending`,`in-flight`,`completed`,`held`].includes(e.state)||typeof e.attempted!=`boolean`||!x(e.reasonCode))throw n();return r.add(e.campaignId),{campaignId:e.campaignId,state:e.state,attempted:e.attempted,reasonCode:e.reasonCode}}),a;if(e.topology!==void 0){if(!Array.isArray(e.topology)||e.topology.length>64||e.topology.length!==i.length)throw n();let t=new Set;a=e.topology.map(e=>{if(!y(e)||!v(e.campaignId)||!r.has(e.campaignId)||t.has(e.campaignId))throw n();t.add(e.campaignId);let i=t=>{if(!Array.isArray(t)||t.length>63||!t.every(t=>v(t)&&r.has(t)&&t!==e.campaignId)||new Set(t).size!==t.length)throw n();return[...t]},a=i(e.dependsOn),o=i(e.prerequisites);if(a.some(e=>!o.includes(e)))throw n();return{campaignId:e.campaignId,dependsOn:a,prerequisites:o}});let o=new Map(a.map(e=>[e.campaignId,e])),s=new Set;for(;s.size<a.length;){let e=a.find(e=>!s.has(e.campaignId)&&e.prerequisites.every(e=>s.has(e)));if(!e)throw n();s.add(e.campaignId)}for(let e of a){let t=new Set,r=[...e.dependsOn];for(;r.length;){let e=r.pop();t.has(e)||(t.add(e),r.push(...o.get(e).dependsOn))}if(e.prerequisites.some(e=>!t.has(e)))throw n()}}let o,s;if(e.diagnostics!==void 0){if(!Array.isArray(e.diagnostics)||e.diagnostics.length>i.length)throw n();let t=new Set;s=e.diagnostics.map(e=>{if(!y(e)||!v(e.campaignId)||!r.has(e.campaignId)||t.has(e.campaignId)||i.find(t=>t.campaignId===e.campaignId)?.state===`pending`||typeof e.phase!=`string`||!Object.hasOwn(_,e.phase)||typeof e.code!=`string`||!b(e.at))throw n();let a=e.phase;if(!_[a].includes(e.code))throw n();return t.add(e.campaignId),{campaignId:e.campaignId,phase:a,code:e.code,at:e.at}})}if(e.control!==void 0){let t=e.control;if(!y(t)||typeof t.mode!=`string`||![`open`,`drain`].includes(t.mode)||!Number.isInteger(t.sequence)||t.sequence<1||t.sequence>511||!b(t.requestedAt)||!(t.acknowledgedAt===null||b(t.acknowledgedAt)))throw n();o={mode:t.mode,sequence:t.sequence,requestedAt:t.requestedAt,acknowledgedAt:t.acknowledgedAt}}if(o?.mode===`open`&&o.acknowledgedAt!==null||e.status===`draining`&&(o?.mode!==`drain`||o.acknowledgedAt!==null)||e.status===`drained`&&(o?.mode!==`drain`||o.acknowledgedAt===null))throw n();return{schemaVersion:1,controllerId:t,sourceState:e.sourceState,status:e.status,createdAt:e.createdAt,deadlineAt:e.deadlineAt,observedAt:e.observedAt,reasons:[...e.reasons],outcomes:i,...a?{topology:a}:{},...o?{control:o}:{},...s?{diagnostics:s}:{}}}async function C(e,t){if(!v(e))throw Error(`Enter a valid controller ID.`);return S(await a(`/api/universe/controller-status?controllerId=${encodeURIComponent(e)}`,t),e)}function w(e,t,n){let r=t.trim().toLowerCase();return e.filter(e=>(n===`all`||e.state===n)&&(e.campaignId.toLowerCase().includes(r)||e.reasonCode.toLowerCase().includes(r)))}function T(e,t,n){let r=Number.isFinite(n)?Math.max(0,Math.floor(n)):0;if(t===null)return e.slice(0,r);let i=[],a=[];for(let n of e)(n.from===t||n.to===t?i:a).push(n);return[...i,...a].slice(0,r)}var E={topology:`_topology_1rqbo_1`,header:`_header_1rqbo_2`,snapshot:`_snapshot_1rqbo_5`,counts:`_counts_1rqbo_6`,finder:`_finder_1rqbo_10`,finderControls:`_finderControls_1rqbo_11`,searchLabel:`_searchLabel_1rqbo_13`,utilityButton:`_utilityButton_1rqbo_16`,finderMeta:`_finderMeta_1rqbo_19`,results:`_results_1rqbo_22`,result:`_result_1rqbo_22`,resultName:`_resultName_1rqbo_27`,resultState:`_resultState_1rqbo_28`,resultReason:`_resultReason_1rqbo_32`,pagination:`_pagination_1rqbo_33`,noResults:`_noResults_1rqbo_35`,selectionNote:`_selectionNote_1rqbo_36`,workspace:`_workspace_1rqbo_37`,board:`_board_1rqbo_38`,canvas:`_canvas_1rqbo_39`,edges:`_edges_1rqbo_40`,edge:`_edge_1rqbo_40`,selectedEdge:`_selectedEdge_1rqbo_41`,column:`_column_1rqbo_43`,node:`_node_1rqbo_44`,nodeName:`_nodeName_1rqbo_47`,nodeState:`_nodeState_1rqbo_48`,detail:`_detail_1rqbo_52`,detailState:`_detailState_1rqbo_55`,facts:`_facts_1rqbo_59`,relationships:`_relationships_1rqbo_63`,note:`_note_1rqbo_67`,legend:`_legend_1rqbo_67`,empty:`_empty_1rqbo_67`,notice:`_notice_1rqbo_69`,srOnly:`_srOnly_1rqbo_73`},D=t(),O=64,k=256,A=8,j={pending:`Pending`,"in-flight":`Unresolved intent`,completed:`Completed`,held:`Held`},M={pending:`No settled outcome is recorded. Pending does not mean ready to run.`,"in-flight":`A durable dispatch intent remains unresolved. This is not proof of a live worker.`,completed:`The controller recorded completion, including any required local delivery. This is not a production deployment claim.`,held:`Work remains held for the recorded reason. This view does not retry or release it.`};function N(e){let t=e.outcomes.slice(0,O),n=new Map(e.topology?.map(e=>[e.campaignId,e])),r=new Set(t.map(e=>e.campaignId)),i=new Map;if(e.topology)for(let e=0;e<t.length;e++)for(let e of t){let t=n.get(e.campaignId);i.has(e.campaignId)||!t||t.dependsOn.some(e=>!i.has(e))||i.set(e.campaignId,t.dependsOn.length?Math.max(...t.dependsOn.map(e=>i.get(e)))+1:0)}let a=[...new Set(i.values())].sort((e,t)=>e-t).map(e=>({label:`Dependency layer ${e+1}`,nodes:t.filter(t=>i.get(t.campaignId)===e)})),o=t.filter(e=>!i.has(e.campaignId));o.length&&a.push({label:e.topology?`Layer unavailable`:`Recorded campaigns`,nodes:o});let s=new Map;return a.forEach((e,t)=>e.nodes.forEach((e,n)=>s.set(e.campaignId,{x:24+t*244,y:56+n*108}))),{nodes:t,topology:n,columns:a,positions:s,edges:t.flatMap(e=>(n.get(e.campaignId)?.dependsOn??[]).filter(e=>r.has(e)).map(t=>({from:t,to:e.campaignId}))),width:Math.max(256,a.length*244+8),height:64+Math.max(1,...a.map(e=>e.nodes.length))*108}}function P({data:e}){let t=(0,g.useMemo)(()=>N(e),[e]),[n,r]=(0,g.useState)(t.nodes[0]?.campaignId??null),[i,a]=(0,g.useState)(``),[o,s]=(0,g.useState)(`all`),[c,l]=(0,g.useState)(0),u=(0,g.useRef)(null),d=(0,g.useRef)(new Map),f=t.nodes.find(e=>e.campaignId===n),p=(0,g.useMemo)(()=>w(t.nodes,i,o),[t.nodes,i,o]),m=i.trim().length>0||o!==`all`,h=Math.max(1,Math.ceil(p.length/A)),_=Math.min(c,h-1),v=p.slice(_*A,(_+1)*A),y=f&&m&&!p.some(e=>e.campaignId===f.campaignId),b=(0,g.useMemo)(()=>T(t.edges,f?.campaignId??null,k),[t.edges,f?.campaignId]),x=(0,g.useId)(),S=`${x}-detail`,C=f?t.topology.get(f.campaignId):void 0,P=C?.prerequisites.filter(e=>!C.dependsOn.includes(e))??[],F=new Map(e.outcomes.map(e=>[e.campaignId,e])),I=t=>e.outcomes.filter(e=>e.state===t).length;function L(e,n=!1){let r=u.current,i=t.positions.get(e);if(!r||!i)return;let a=Math.max(0,i.x+96-r.clientWidth/2),o=Math.max(0,i.y+40-r.clientHeight/2);typeof r.scrollTo==`function`?r.scrollTo({left:a,top:o,behavior:`auto`}):(r.scrollLeft=a,r.scrollTop=o),n&&d.current.get(e)?.focus({preventScroll:!0})}function R(e){r(e),L(e)}function z(e,n){return e.length?(0,D.jsx)(`ul`,{className:E.relationships,children:e.map(e=>(0,D.jsxs)(`li`,{children:[t.positions.has(e)?(0,D.jsx)(`button`,{type:`button`,onClick:()=>R(e),children:e}):(0,D.jsx)(`span`,{children:e}),(0,D.jsx)(`span`,{children:F.has(e)?j[F.get(e).state]:`Outcome unavailable`})]},e))}):(0,D.jsx)(`p`,{className:E.note,children:n})}return(0,D.jsxs)(`section`,{className:E.topology,"aria-label":`Controller mission topology`,children:[(0,D.jsxs)(`header`,{className:E.header,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`h3`,{children:`Mission topology`}),(0,D.jsx)(`p`,{children:`Follow the declared work graph. Select a campaign to inspect its recorded state and prerequisites.`})]}),(0,D.jsx)(`span`,{className:E.snapshot,children:`Recorded snapshot`})]}),(0,D.jsxs)(`dl`,{className:E.counts,"aria-label":`Recorded campaign counts`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Campaigns`}),(0,D.jsx)(`dd`,{children:e.outcomes.length})]}),[`completed`,`in-flight`,`held`,`pending`].map(e=>(0,D.jsxs)(`div`,{"data-state":e,children:[(0,D.jsx)(`dt`,{children:j[e]}),(0,D.jsx)(`dd`,{children:I(e)})]},e))]}),e.topology?null:(0,D.jsx)(`p`,{className:E.notice,children:`Dependency information is unavailable in this observation. Campaign placement does not imply independence or readiness.`}),e.outcomes.length>O?(0,D.jsxs)(`p`,{className:E.notice,children:[`Showing the first `,O,` of `,e.outcomes.length,` campaigns. Counts include all recorded outcomes; relationships outside this diagram remain in the selected campaign detail.`]}):null,t.nodes.length?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`section`,{className:E.finder,"aria-label":`Campaign navigator`,children:[(0,D.jsxs)(`div`,{className:E.finderControls,children:[(0,D.jsxs)(`label`,{className:E.searchLabel,htmlFor:`${x}-search`,children:[`Search campaigns`,(0,D.jsx)(`input`,{id:`${x}-search`,type:`search`,value:i,maxLength:192,placeholder:`Campaign ID or recorded reason`,"aria-describedby":`${x}-finder-hint`,onChange:e=>{a(e.target.value),l(0)}})]}),(0,D.jsxs)(`label`,{htmlFor:`${x}-state`,children:[`Recorded state`,(0,D.jsxs)(`select`,{id:`${x}-state`,value:o,onChange:e=>{s(e.target.value),l(0)},children:[(0,D.jsx)(`option`,{value:`all`,children:`All recorded states`}),[`pending`,`in-flight`,`completed`,`held`].map(e=>(0,D.jsx)(`option`,{value:e,children:j[e]},e))]})]}),(0,D.jsx)(`button`,{type:`button`,className:E.utilityButton,disabled:!f,onClick:()=>{f&&L(f.campaignId,!0)},children:`Locate selected`}),m?(0,D.jsx)(`button`,{type:`button`,className:E.utilityButton,onClick:()=>{a(``),s(`all`),l(0)},children:`Reset filters`}):null]}),(0,D.jsxs)(`div`,{className:E.finderMeta,children:[(0,D.jsxs)(`p`,{id:`${x}-finder-hint`,children:[`Search covers the `,t.nodes.length,` diagram campaigns. Filters narrow this index, not the graph or its dependency layers.`]}),(0,D.jsx)(`span`,{"aria-live":`polite`,"aria-atomic":`true`,children:m?`${p.length} matching campaign${p.length===1?``:`s`}`:`${t.nodes.length} campaigns in diagram`})]}),m?(0,D.jsxs)(D.Fragment,{children:[p.length?(0,D.jsx)(`ul`,{className:E.results,"aria-label":`Matching campaigns`,children:v.map(e=>(0,D.jsx)(`li`,{children:(0,D.jsxs)(`button`,{type:`button`,className:E.result,"aria-label":`Select campaign ${e.campaignId}`,"aria-describedby":`${x}-result-state-${e.campaignId} ${x}-result-reason-${e.campaignId}`,"aria-pressed":f?.campaignId===e.campaignId,"aria-controls":S,onClick:()=>R(e.campaignId),children:[(0,D.jsx)(`span`,{className:E.resultName,children:e.campaignId}),(0,D.jsx)(`span`,{id:`${x}-result-state-${e.campaignId}`,className:E.resultState,"data-state":e.state,children:j[e.state]}),(0,D.jsx)(`span`,{id:`${x}-result-reason-${e.campaignId}`,className:E.resultReason,children:e.reasonCode})]})},e.campaignId))}):(0,D.jsx)(`p`,{className:E.noResults,children:`No diagram campaigns match. Try another campaign ID or recorded reason, or reset filters.`}),h>1?(0,D.jsxs)(`nav`,{className:E.pagination,"aria-label":`Campaign result pages`,children:[(0,D.jsxs)(`span`,{children:[`Page `,_+1,` of `,h]}),(0,D.jsx)(`button`,{type:`button`,className:E.utilityButton,disabled:_===0,onClick:()=>l(_-1),children:`Previous results`}),(0,D.jsx)(`button`,{type:`button`,className:E.utilityButton,disabled:_+1===h,onClick:()=>l(_+1),children:`Next results`})]}):null]}):null]}),(0,D.jsxs)(`div`,{className:E.workspace,children:[(0,D.jsx)(`div`,{ref:u,className:E.board,role:`region`,"aria-label":`Campaign dependency diagram`,tabIndex:0,children:(0,D.jsxs)(`div`,{className:E.canvas,style:{width:t.width,height:t.height},children:[(0,D.jsx)(`svg`,{width:t.width,height:t.height,className:E.edges,"aria-hidden":`true`,children:b.map(e=>{let n=t.positions.get(e.from),r=t.positions.get(e.to),i=n.x+192,a=r.x,o=(i+a)/2;return(0,D.jsx)(`path`,{className:f&&(e.from===f.campaignId||e.to===f.campaignId)?E.selectedEdge:E.edge,d:`M ${i} ${n.y+40} C ${o} ${n.y+40}, ${o} ${r.y+40}, ${a} ${r.y+40}`},`${e.from}-${e.to}`)})}),t.columns.map((e,t)=>(0,D.jsx)(`span`,{className:E.column,style:{left:24+t*244},children:e.label},e.label)),t.nodes.map((e,n)=>{let r=t.positions.get(e.campaignId),i=t.topology.get(e.campaignId);return(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`button`,{type:`button`,className:E.node,"data-state":e.state,style:{left:r.x,top:r.y},ref:t=>{t?d.current.set(e.campaignId,t):d.current.delete(e.campaignId)},"aria-label":`Inspect campaign ${e.campaignId}: ${j[e.state]}`,"aria-pressed":f?.campaignId===e.campaignId,"aria-controls":S,"aria-describedby":`${x}-relations-${n}`,onClick:()=>R(e.campaignId),children:[(0,D.jsx)(`span`,{className:E.nodeName,children:e.campaignId}),(0,D.jsx)(`span`,{className:E.nodeState,children:j[e.state]})]}),(0,D.jsx)(`span`,{id:`${x}-relations-${n}`,className:E.srOnly,children:i?`Direct dependencies: ${i.dependsOn.join(`, `)||`none declared`}. Additional inherited delivery prerequisites: ${i.prerequisites.filter(e=>!i.dependsOn.includes(e)).join(`, `)||`none recorded`}.`:`Dependency information unavailable.`})]},e.campaignId)})]})}),(0,D.jsx)(`section`,{id:S,className:E.detail,"aria-label":`Selected campaign detail`,children:f?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`span`,{className:E.detailState,"data-state":f.state,children:j[f.state]}),(0,D.jsx)(`h4`,{children:f.campaignId}),y?(0,D.jsx)(`p`,{className:E.selectionNote,children:`The selected campaign is outside the current filters. Its recorded detail remains available.`}):null,(0,D.jsx)(`p`,{children:M[f.state]}),(0,D.jsxs)(`dl`,{className:E.facts,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Recorded reason`}),(0,D.jsx)(`dd`,{children:f.reasonCode})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Campaign-call intent`}),(0,D.jsx)(`dd`,{children:f.attempted?`Recorded`:`Not recorded`})]})]}),(0,D.jsx)(`p`,{className:E.note,children:`A call intent is not proof of worker execution, model requests or successful evaluation.`}),(0,D.jsx)(`h5`,{children:`Direct dependencies`}),C?z(C.dependsOn,`None declared for this campaign.`):(0,D.jsx)(`p`,{className:E.note,children:`Dependency information unavailable.`}),(0,D.jsx)(`h5`,{children:`Additional inherited delivery prerequisites`}),C?z(P,`None recorded beyond the direct dependencies.`):(0,D.jsx)(`p`,{className:E.note,children:`Delivery prerequisite information unavailable.`}),(0,D.jsx)(`p`,{className:E.note,children:`Inherited prerequisites are ancestor delivery gates, not additional declared dependency edges. A state badge alone does not verify the delivery receipt.`})]}):(0,D.jsx)(`p`,{className:E.note,children:n?`Selected campaign ${n} is no longer present in this diagram. No substitute has been selected. Choose another campaign to inspect its evidence.`:`Select a campaign to inspect its recorded evidence.`})})]}),(0,D.jsx)(`p`,{className:E.legend,children:`Lines show declared dependencies, from earlier to later layers. Layer placement does not change declared priority or establish execution readiness.`}),t.edges.length>k?(0,D.jsxs)(`p`,{className:E.note,children:[`Showing `,k,` of `,t.edges.length,` visible dependency lines. Every campaign’s complete relationships remain available in its detail and accessible description.`]}):null]}):(0,D.jsx)(`p`,{className:E.empty,children:`No campaign outcomes are available in this observation. Inspect a registered controller with recorded campaigns to see its mission topology.`})]})}function F({data:e}){return(0,D.jsx)(P,{data:e},e.controllerId)}var I=e=>e==null?`Not recorded`:String(e),L=e=>[...new Set(e)].sort().join(`, `)||`None recorded`,R={pending:`Pending`,held:`Held`,completed:`Completed`,"in-flight":`Unresolved intent`};function z(e,t){let n={clockWarning:!1,changes:[],changedCampaigns:0};if(!e)return{...n,kind:`baseline`,notice:`First accepted observation. Refresh this controller explicitly to compare recorded evidence.`};if(e.controllerId!==t.controllerId||e.createdAt!==t.createdAt)return{...n,kind:`incomparable`,notice:`Controller identity or registration timestamp changed. Registration continuity is not established; these observations are not compared.`};let r=[],i=(e,t,n,i,a)=>{n!==i&&r.push({key:e,label:t,before:n,after:i,...a?{campaignId:a}:{}})},a=[];(e.sourceState!==`healthy`||t.sourceState!==`healthy`)&&a.push(`One or both observations contain missing or degraded evidence. Absence from an observation does not establish deletion, completion or execution.`),t.createdAt===null&&a.push(`The registration timestamp is not recorded. Registration continuity is not established.`),e.deadlineAt!==t.deadlineAt&&a.push(`The recorded deadline changed. This difference does not establish registration continuity or renew execution authority.`),i(`controller:status`,`Recorded controller status`,e.status,t.status),i(`controller:health`,`Evidence health`,e.sourceState,t.sourceState),i(`controller:deadline`,`Recorded deadline`,I(e.deadlineAt),I(t.deadlineAt)),i(`controller:reasons`,`Evidence reasons`,L(e.reasons),L(t.reasons));for(let[n,r]of[[`mode`,`Admission mode`],[`sequence`,`Admission sequence`],[`requestedAt`,`Admission requested at`],[`acknowledgedAt`,`Admission acknowledged at`]])i(`control:${n}`,r,I(e.control?.[n]),I(t.control?.[n]));let o=new Map(e.outcomes.map(e=>[e.campaignId,e])),s=new Map(t.outcomes.map(e=>[e.campaignId,e])),c=[...s.keys(),...[...o.keys()].filter(e=>!s.has(e))];for(let e of c){let t=o.get(e),n=s.get(e);if(!t||!n){i(`campaign:${e}:presence`,`Campaign presence`,t?`Present`:`Not observed`,n?`Present`:`Not observed`,e);continue}i(`campaign:${e}:state`,`Recorded state`,R[t.state],R[n.state],e),i(`campaign:${e}:reason`,`Recorded reason`,t.reasonCode,n.reasonCode,e),i(`campaign:${e}:attempted`,`Campaign-call intent`,t.attempted?`Recorded`:`Not recorded`,n.attempted?`Recorded`:`Not recorded`,e)}if(i(`controller:campaign-order`,`Recorded campaign order`,e.outcomes.map(e=>e.campaignId).join(`, `)||`None recorded`,t.outcomes.map(e=>e.campaignId).join(`, `)||`None recorded`),i(`controller:topology`,`Dependency evidence`,e.topology?`Available`:`Unavailable`,t.topology?`Available`:`Unavailable`),e.topology&&t.topology){let n=new Map(e.topology.map(e=>[e.campaignId,e]));for(let e of t.topology){let t=n.get(e.campaignId);t&&(i(`campaign:${e.campaignId}:dependencies`,`Direct dependencies`,L(t.dependsOn),L(e.dependsOn),e.campaignId),i(`campaign:${e.campaignId}:prerequisites`,`Effective prerequisites`,L(t.prerequisites),L(e.prerequisites),e.campaignId))}}return{kind:`compared`,notice:a.join(` `)||null,clockWarning:Date.parse(t.observedAt)<=Date.parse(e.observedAt),changes:r,changedCampaigns:new Set(r.flatMap(e=>e.campaignId?[e.campaignId]:[])).size}}var B={changes:`_changes_qcw1f_1`,header:`_header_qcw1f_2`,labels:`_labels_qcw1f_4`,historical:`_historical_qcw1f_6`,description:`_description_qcw1f_7`,note:`_note_qcw1f_7`,footnote:`_footnote_qcw1f_7`,times:`_times_qcw1f_9`,warning:`_warning_qcw1f_12`,baseline:`_baseline_qcw1f_13`,counts:`_counts_qcw1f_14`,disclosure:`_disclosure_qcw1f_18`,rows:`_rows_qcw1f_22`,row:`_row_qcw1f_22`,field:`_field_qcw1f_24`,values:`_values_qcw1f_27`};function V({previous:e,current:t,historical:n,loading:r}){let i=(0,g.useMemo)(()=>z(e,t),[e,t]);return(0,D.jsxs)(`section`,{className:B.changes,"aria-label":`Changes between observations`,children:[(0,D.jsxs)(`header`,{className:B.header,children:[(0,D.jsx)(`h3`,{children:`Changes between observations`}),(0,D.jsxs)(`div`,{className:B.labels,children:[r?(0,D.jsx)(`span`,{children:`Refresh in progress`}):null,n?(0,D.jsx)(`span`,{className:B.historical,children:`Historical observations`}):null]})]}),(0,D.jsx)(`p`,{className:B.description,children:`Compare the last two accepted responses in this session. This is not an event log or a live activity view.`}),(0,D.jsxs)(`dl`,{className:B.times,"aria-label":`Compared observation times`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Previous observation`}),(0,D.jsx)(`dd`,{children:e?(0,D.jsx)(`time`,{dateTime:e.observedAt,children:e.observedAt}):`Not yet observed`})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Displayed observation`}),(0,D.jsx)(`dd`,{children:(0,D.jsx)(`time`,{dateTime:t.observedAt,children:t.observedAt})})]})]}),r?(0,D.jsx)(`p`,{className:B.note,children:`The accepted observations below remain unchanged while the refresh is pending.`}):null,n?(0,D.jsx)(`p`,{className:B.warning,children:`The latest refresh failed. This comparison uses retained observations, not current evidence.`}):null,i.notice?(0,D.jsx)(`p`,{className:i.kind===`baseline`?B.note:B.warning,children:i.notice}):null,i.clockWarning?(0,D.jsx)(`p`,{className:B.warning,children:`Observation timestamps are equal or move backward. Before and after follow response order, not a verified event timeline.`}):null,i.kind===`baseline`?(0,D.jsx)(`p`,{className:B.baseline,children:`Refresh this controller to compare two observations.`}):i.kind===`incomparable`?(0,D.jsx)(`p`,{className:B.baseline,children:`These observations cannot be compared as one controller registration.`}):i.changes.length===0?(0,D.jsx)(`p`,{className:B.baseline,children:`No compared evidence fields changed. Observation times are excluded; this does not prove that no work occurred.`}):(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`dl`,{className:B.counts,"aria-label":`Observation change counts`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Changed fields`}),(0,D.jsx)(`dd`,{children:i.changes.length})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Campaigns with displayed changes`}),(0,D.jsx)(`dd`,{children:i.changedCampaigns})]})]}),(0,D.jsxs)(`details`,{className:B.disclosure,children:[(0,D.jsxs)(`summary`,{children:[`Review `,i.changes.length,` changed field`,i.changes.length===1?``:`s`]}),(0,D.jsx)(`ul`,{className:B.rows,"aria-label":`Changed observation fields`,children:i.changes.map(e=>(0,D.jsxs)(`li`,{className:B.row,children:[(0,D.jsxs)(`div`,{className:B.field,children:[(0,D.jsx)(`h4`,{children:e.label}),e.campaignId?(0,D.jsx)(`span`,{children:e.campaignId}):null]}),(0,D.jsxs)(`dl`,{className:B.values,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Before`}),(0,D.jsx)(`dd`,{children:e.before})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`After`}),(0,D.jsx)(`dd`,{children:e.after})]})]})]},e.key))})]})]}),(0,D.jsx)(`p`,{className:B.footnote,children:`Differences describe returned evidence only. They do not establish worker execution, delivery verification or a production deployment.`})]})}var H={inspector:`_inspector_123iu_1`,header:`_header_123iu_2`,note:`_note_123iu_4`,empty:`_empty_123iu_4`,field:`_field_123iu_4`,control:`_control_123iu_4`,readOnly:`_readOnly_123iu_5`,form:`_form_123iu_6`,identity:`_identity_123iu_15`,warning:`_warning_123iu_18`,facts:`_facts_123iu_19`,sequence:`_sequence_123iu_24`,tableWrap:`_tableWrap_123iu_27`,reasons:`_reasons_123iu_32`};function U({value:e}){return e?(0,D.jsx)(`time`,{dateTime:e,children:e.replace(`T`,` `).replace(`Z`,` UTC`)}):(0,D.jsx)(D.Fragment,{children:`Not recorded`})}var W={"campaign-execution":`Campaign execution`,"campaign-verification":`Campaign verification`,"delivery-execution":`Local branch delivery`,"delivery-verification":`Delivery confirmation`,"settlement-publication":`Controller acknowledgement`};function G(){let[e,t]=(0,g.useState)(``),[n,r]=(0,g.useState)(null),[i,a]=(0,g.useState)({current:null,previous:null}),o=i.current,[s,c]=(0,g.useState)(!1),[l,u]=(0,g.useState)(null),[d,f]=(0,g.useState)(!1),p=(0,g.useRef)({sequence:0,abort:null});(0,g.useEffect)(()=>()=>{p.current.sequence+=1,p.current.abort?.abort()},[]);async function m(e){if(!v(e)){f(!0);return}f(!1),p.current.abort?.abort();let t=++p.current.sequence,n=new AbortController;p.current.abort=n,r(e),a(t=>t.current?.controllerId===e?t:{current:null,previous:null}),c(!0),u(null);try{let r=await C(e,n.signal);t===p.current.sequence&&a(t=>({current:r,previous:t.current?.controllerId===e?t.current:null}))}catch{t===p.current.sequence&&u(`Observation failed or returned invalid evidence. Check your connection and refresh this controller.`)}finally{t===p.current.sequence&&c(!1)}}return(0,D.jsxs)(`section`,{className:H.inspector,"aria-labelledby":`controller-inspector-title`,children:[(0,D.jsxs)(`header`,{className:H.header,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`h2`,{id:`controller-inspector-title`,children:`Controller inspector`}),(0,D.jsx)(`p`,{children:`Read the recorded progress of a named portfolio controller.`})]}),(0,D.jsx)(`span`,{className:H.readOnly,children:`Read-only`})]}),(0,D.jsxs)(`form`,{className:H.form,onSubmit:t=>{t.preventDefault(),m(e)},children:[(0,D.jsxs)(`div`,{className:H.field,children:[(0,D.jsx)(`label`,{htmlFor:`controller-id`,children:`Controller ID`}),(0,D.jsx)(`input`,{id:`controller-id`,value:e,onChange:e=>{t(e.target.value),f(!1)},maxLength:64,autoComplete:`off`,autoCapitalize:`none`,spellCheck:!1,"aria-invalid":d,"aria-describedby":`controller-id-help`}),(0,D.jsx)(`p`,{id:`controller-id-help`,children:`Use the ID from your controller manifest: lowercase letters, numbers, hyphens or underscores.`})]}),(0,D.jsx)(`button`,{type:`submit`,children:`Inspect controller`}),n?(0,D.jsx)(`button`,{type:`button`,disabled:s,onClick:()=>{m(n)},children:`Refresh controller`}):null]}),d?(0,D.jsx)(`p`,{role:`alert`,className:H.warning,children:`Enter 1–64 characters, starting with a lowercase letter or number.`}):null,n?(0,D.jsxs)(`div`,{"aria-busy":s,children:[(0,D.jsxs)(`h3`,{className:H.identity,children:[`Evidence for `,(0,D.jsx)(`code`,{children:n})]}),e===n?null:(0,D.jsxs)(`p`,{className:H.note,children:[`The form has changed. Evidence below still belongs to `,n,`; submit to inspect another ID.`]}),(0,D.jsx)(`p`,{role:`status`,className:H.note,children:s?`Reading ${n}…${o?` Previous observation remains below.`:``}`:l&&o?`Historical observation — refresh failed. This is not current evidence.`:o?`Recorded snapshot. Refresh explicitly to check for changes; this is not a live process view.`:`No verified observation is available.`}),l?(0,D.jsx)(`p`,{role:`alert`,className:H.warning,children:l}):null,o?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`dl`,{className:H.facts,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Evidence health`}),(0,D.jsx)(`dd`,{children:o.sourceState})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Recorded status`}),(0,D.jsx)(`dd`,{children:o.status})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Observed at`}),(0,D.jsx)(`dd`,{children:(0,D.jsx)(U,{value:o.observedAt})})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Created at`}),(0,D.jsx)(`dd`,{children:(0,D.jsx)(U,{value:o.createdAt})})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Original deadline`}),(0,D.jsx)(`dd`,{children:(0,D.jsx)(U,{value:o.deadlineAt})})]})]}),(0,D.jsx)(V,{previous:i.previous,current:o,historical:!!l,loading:s}),o.sourceState===`missing`?(0,D.jsx)(`p`,{className:H.warning,children:`No controller registration was found in this store. Check the ID and selected Universe store.`}):null,o.sourceState===`degraded`?(0,D.jsx)(`p`,{className:H.warning,children:`Evidence could not be fully verified. This observation does not repair locks, reconcile work or prove a controller is running.`}):null,o.control?(0,D.jsxs)(`section`,{className:H.control,"aria-label":`Recorded admission control`,children:[(0,D.jsx)(`h4`,{children:o.control.mode===`open`?`Admission reopened`:o.control.acknowledgedAt?`Drain acknowledged`:`Drain awaiting acknowledgement`}),(0,D.jsxs)(`ol`,{className:H.sequence,children:[(0,D.jsxs)(`li`,{children:[(0,D.jsx)(`strong`,{children:o.control.mode===`open`?`Resume recorded`:`Drain recorded`}),(0,D.jsxs)(`span`,{children:[`Sequence `,o.control.sequence]}),(0,D.jsx)(U,{value:o.control.requestedAt})]}),(0,D.jsxs)(`li`,{children:[(0,D.jsx)(`strong`,{children:o.control.mode===`open`?`Resume did not start work`:o.control.acknowledgedAt?`Acknowledgement recorded`:`Acknowledgement not recorded`}),o.control.mode===`drain`?(0,D.jsx)(U,{value:o.control.acknowledgedAt}):(0,D.jsx)(`span`,{children:`Resume does not start work.`})]})]}),(0,D.jsx)(`p`,{children:o.control.mode===`drain`?`Drain blocks new dispatch intents; already-admitted work can continue. An unresolved intent prevents acknowledgement; absence of a visible worker proves neither completion nor failure.`:`Execution requires a separate run invocation. Admission state does not renew the original deadline or establish a running controller.`})]}):(0,D.jsx)(`p`,{className:H.note,children:`No admission-control record. This does not establish process liveness.`}),(0,D.jsx)(F,{data:o},o.controllerId),o.outcomes.length?(0,D.jsx)(`div`,{className:H.tableWrap,role:`region`,"aria-label":`Recorded campaign outcomes`,tabIndex:0,children:(0,D.jsxs)(`table`,{children:[(0,D.jsx)(`caption`,{children:`Recorded campaign outcomes`}),(0,D.jsx)(`thead`,{children:(0,D.jsxs)(`tr`,{children:[(0,D.jsx)(`th`,{scope:`col`,children:`Campaign`}),(0,D.jsx)(`th`,{scope:`col`,children:`State`}),(0,D.jsx)(`th`,{scope:`col`,children:`Campaign attempted`}),(0,D.jsx)(`th`,{scope:`col`,children:`Reason`})]})}),(0,D.jsx)(`tbody`,{children:o.outcomes.map(e=>(0,D.jsxs)(`tr`,{children:[(0,D.jsx)(`th`,{scope:`row`,children:e.campaignId}),(0,D.jsx)(`td`,{children:e.state}),(0,D.jsx)(`td`,{children:e.attempted?`Yes`:`No`}),(0,D.jsx)(`td`,{children:e.reasonCode})]},e.campaignId))})]})}):(0,D.jsx)(`p`,{className:H.note,children:`No campaign outcomes available in this observation.`}),(0,D.jsx)(`p`,{className:H.note,children:`“In-flight” means an unresolved durable intent, not proof of a live worker. Campaign attempted records a call intent, not proof of worker execution or successful evaluation. A dispatch-not-started outcome remains held and does not authorize a retry.`}),o.diagnostics?.length?(0,D.jsxs)(`section`,{"aria-label":`Recorded handoff diagnostics`,children:[(0,D.jsx)(`h4`,{children:`Recorded handoff diagnostics`}),(0,D.jsx)(`p`,{className:H.note,children:`These are historical failure records, not live errors. Check the campaign outcome above for its current recorded state. A diagnostic never authorizes retrying a worker or publishing a branch.`}),(0,D.jsx)(`div`,{className:H.tableWrap,role:`region`,"aria-label":`Handoff diagnostic details`,tabIndex:0,children:(0,D.jsxs)(`table`,{children:[(0,D.jsx)(`caption`,{children:`Where the handoff stopped`}),(0,D.jsx)(`thead`,{children:(0,D.jsxs)(`tr`,{children:[(0,D.jsx)(`th`,{scope:`col`,children:`Campaign`}),(0,D.jsx)(`th`,{scope:`col`,children:`Stage`}),(0,D.jsx)(`th`,{scope:`col`,children:`Failure code`}),(0,D.jsx)(`th`,{scope:`col`,children:`Recorded at`})]})}),(0,D.jsx)(`tbody`,{children:o.diagnostics.map(e=>(0,D.jsxs)(`tr`,{children:[(0,D.jsx)(`th`,{scope:`row`,children:e.campaignId}),(0,D.jsx)(`td`,{children:W[e.phase]}),(0,D.jsx)(`td`,{children:e.code}),(0,D.jsx)(`td`,{children:(0,D.jsx)(U,{value:e.at})})]},e.campaignId))})]})}),(0,D.jsx)(`p`,{className:H.note,children:`Inspect the pinned campaign and delivery receipts before recovery. Completed outcomes can retain an earlier diagnostic; raw error text and private intent digests are omitted here.`})]}):null,o.reasons.length?(0,D.jsxs)(`details`,{className:H.reasons,children:[(0,D.jsxs)(`summary`,{children:[`Evidence reasons (`,o.reasons.length,`)`]}),(0,D.jsx)(`ul`,{children:o.reasons.map((e,t)=>(0,D.jsx)(`li`,{children:e},`${e}-${t}`))})]}):null]}):null]}):(0,D.jsx)(`p`,{className:H.empty,children:`Enter an ID to inspect this store. Nothing is queried until you submit.`})]})}var K={shell:`_shell_1077u_1`,scopeBar:`_scopeBar_1077u_2`,scope:`_scope_1077u_2`,brand:`_brand_1077u_4`,brandMark:`_brandMark_1077u_6`,workspace:`_workspace_1077u_7`,badge:`_badge_1077u_8`,store:`_store_1077u_9`,root:`_root_1077u_12`,actions:`_actions_1077u_13`,notice:`_notice_1077u_14`,main:`_main_1077u_16`,explanation:`_explanation_1077u_17`,checking:`_checking_1077u_20`},q={key:`universe-console-scope`,async fetch(){let e=await a(`/api/universe/console`);if(e?.schemaVersion!==1||e.mode!==`universe`||e.readOnly!==!0||typeof e.root!=`string`||!/^(?:\/|[a-zA-Z]:[\\/]|\\\\)/.test(e.root)||[...e.root].some(e=>e.charCodeAt(0)<32||e.charCodeAt(0)>=127&&e.charCodeAt(0)<=159))throw Error(`The server did not establish an explicit read-only Universe scope.`);return e}};function J(){let e=l(q),t=c(q),n=s();return(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(d,{}),(0,D.jsxs)(`div`,{className:K.shell,children:[(0,D.jsxs)(`header`,{className:K.scopeBar,children:[(0,D.jsxs)(`div`,{className:K.scope,children:[(0,D.jsxs)(`div`,{className:K.brand,children:[(0,D.jsxs)(`svg`,{className:K.brandMark,viewBox:`54 67 146 124`,"aria-hidden":`true`,focusable:`false`,children:[(0,D.jsx)(`path`,{fill:`currentColor`,d:`M106 76H123V115H100L113 154L99 179H72L59 156Z M130 76H147L194 156L181 179H154L140 154L153 115H130Z`}),(0,D.jsx)(`path`,{fill:`#2563EB`,d:`M110 121H143L133 152H120Z`})]}),(0,D.jsx)(`strong`,{children:`Ashlrverse`}),(0,D.jsx)(`span`,{className:K.workspace,children:`Experiments`})]}),(0,D.jsx)(`span`,{className:K.badge,children:`Read-only observation`}),e.data?(0,D.jsxs)(`details`,{className:K.store,children:[(0,D.jsx)(`summary`,{children:`Universe store`}),(0,D.jsx)(`code`,{"aria-label":`Universe store`,className:K.root,children:e.data.root})]}):null]}),(0,D.jsxs)(`div`,{className:K.actions,children:[(0,D.jsxs)(`button`,{type:`button`,onClick:n.cycle,children:[`Theme: `,n.theme]}),(0,D.jsx)(`button`,{type:`button`,onClick:()=>{f()},children:`Disconnect`})]})]}),(0,D.jsx)(`main`,{id:`main-content`,tabIndex:-1,className:K.main,children:e.status===`error`?(0,D.jsxs)(`section`,{role:`alert`,className:K.notice,children:[(0,D.jsx)(`h1`,{children:`Console scope unavailable`}),(0,D.jsxs)(`p`,{children:[e.error?.message,` No project data is shown until the scope can be checked.`]}),(0,D.jsx)(`button`,{type:`button`,onClick:t,children:`Retry scope check`})]}):e.data?(0,D.jsxs)(p.Provider,{value:e.data.root,children:[(0,D.jsx)(`p`,{className:K.explanation,children:`This console observes the selected Universe store. Run campaigns from your terminal; opening this page does not start work.`}),(0,D.jsx)(G,{},e.data.root),(0,D.jsx)(m,{})]}):(0,D.jsx)(`p`,{role:`status`,children:`Checking the selected Universe store…`})})]})]})}function Y(){let e=o();return(0,g.useEffect)(()=>{if(e!==`checking`)return;let t=!1;return u(q.key,q.fetch).then(()=>{t||r(i(q.key).status===`success`)}),()=>{t=!0}},[e]),e===`checking`?(0,D.jsx)(`p`,{className:K.checking,role:`status`,children:`Checking for an existing console session…`}):e===`unauthenticated`?(0,D.jsx)(h,{heading:`Connect to Ashlrverse`,command:`ashlr universe console --root /absolute/universe-store`}):(0,D.jsx)(J,{})}export{Y as UniverseConsoleApp};
|
|
2
|
-
//# sourceMappingURL=UniverseConsoleApp-C8yQ0AaR.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{h as r,i,m as a,o,p as s,r as c}from"./global-oEl9Qj8u.js";import{t as l}from"./Epistemic-dhvDTwAZ.js";import{n as u}from"./StatusBadge-HCZp416_.js";import{r as ee}from"./queries-CYisSAAB.js";import{l as d}from"./useChartWidth-owwodNVz.js";import{i as f,n as p,r as m,t as h}from"./charts-CfAjuKMv.js";import{_ as g}from"./colors-BZ3a9wFf.js";import{n as _,o as v,r as te,s as y,t as b}from"./format-DKrNjdwD.js";import{n as x}from"./BurnDown-sFXkUGdB.js";import{r as ne}from"./section-visibility-Yctxu-if.js";import{x as re}from"./VerseConsoleApp-DTjDpGCd.js";import{n as S}from"./verse-model-DyCwZF-M.js";import{r as C}from"./verse-store-b_Lek_c5.js";import{f as ie,g as w,m as T,p as E,v as ae,y as D}from"./format-BkWdOQDL.js";import{S as oe,d as se}from"./context-model-CIBmSugV.js";import{i as ce,n as le}from"./CapacityStrip-qReu0RaF.js";import{h as O,m as k,p as ue}from"./capacity-strip-model-BDbmQ3e3.js";import{v as A}from"./context-model-BC-HOmPo.js";import{c as de}from"./icons-DEQa2rTx.js";import{t as fe}from"./Meter-DNeocJnD.js";import{t as pe}from"./types-D5XOdyw8.js";import{d as me,l as j,t as M,v as N}from"./cloud.module-ascz58c3.js";import{n as P,s as he,t as ge}from"./cloud-queries-Br_r0UAz.js";import{f as _e}from"./fleet-model-7i-FbzKI.js";import{t as F}from"./calendar-day-BxBYHfX1.js";import{a as ve,c as ye,i as be,n as xe,o as Se,r as Ce,s as we,t as Te}from"./usage-queries-BZuAANlI.js";import{a as Ee,i as I,n as De,o as Oe,r as L,t as ke}from"./local-model-DFyjKX0b.js";import{n as Ae,t as je}from"./actions-tWevL9HV.js";import{t as R}from"./CloudBudgetForm-DJbiT1wi.js";var z=n(e(),1),B={claude:`var(--engine-claude, #c96442)`,codex:`var(--engine-codex, #10a37f)`,grok:`var(--engine-grok, #6b7280)`,local:`var(--engine-local, #7c5cff)`},Me={claude:`Claude publishes no local utilization signal, so there is no window percentage to read. Ashlr deliberately never throttles this seat on a guess.`,grok:`Grok is absent from the per-engine usage snapshot, so this fallback roster has no window data for it. Its real state comes from the per-account probe.`},Ne=`The only figure available is derived from the dispatch ledger against a configured cap, not from the subscription itself. It is shown under Dispatch limits.`,Pe=`Local models have no subscription and no quota window — only whether the runtime is up.`,Fe={"account-observation":`from this account’s observed windows`,"subscription-tracker":`from the subscription tracker`};function V(e){return{sourceState:`unknown`,complete:!1,reason:e}}function H(e){return e>=90?`danger`:e>=80?`warn`:`ok`}function U(e){return Number.isFinite(e)?Math.max(0,Math.min(100,e)):0}function Ie(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function Le(e,t,n){return{kind:`measured`,source:e,scope:t,windows:n}}function Re(e){return{kind:`unknown`,reason:Me[e]??`No subscription window reading is reported for this engine.`}}function ze(e){let{engine:t,seat:n,subscription:r,frontier:i,engineSeatCount:a=1}=e;if(t===`local`)return{kind:`not-applicable`,reason:Pe};let o=(n?.health.windows??[]).filter(e=>typeof e.usedPercent==`number`&&Number.isFinite(e.usedPercent));if(o.length>0)return Le(`account-observation`,`account`,o.map(e=>{let t=U(e.usedPercent),n=e.resetsAt?Date.parse(e.resetsAt):NaN;return{id:e.id,label:e.id,usedPct:t,resetsAt:Number.isNaN(n)?null:Math.round(n/1e3),tone:H(t)}}));if(r&&r.hasData&&r.windows.length>0)return Le(`subscription-tracker`,a>1?`engine`:`account`,r.windows.map((e,t)=>{let n=U(e.usedPercent);return{id:`${e.label}-${t}`,label:e.label,usedPct:n,resetsAt:Ie(e.resetsAt),tone:H(n)}}));if(r&&!r.hasData)return Re(t);if(i&&i.subscriptionWindow.state!==`unknown`){if(i.limit===void 0){let e=U(i.subscriptionWindow.usedPct);return Le(`subscription-tracker`,a>1?`engine`:`account`,[{id:i.subscriptionWindow.windowLabel??`window`,label:i.subscriptionWindow.windowLabel??`window`,usedPct:e,resetsAt:Ie(i.subscriptionWindow.resetsAt),tone:H(e)}])}return{kind:`unknown`,reason:Ne}}return Re(t)}function Be(e){if(!e)return null;let t=(e.byProvider??[]).map(e=>({provider:e.provider,tier:e.tier,tokens:e.tokens,costUsd:e.costUsd,sharePct:e.sharePct})),n=(e,n)=>t.filter(t=>t.tier===e).reduce((e,t)=>e+(t[n]||0),0);return{window:e.window,totalTokens:e.totalTokens,totalCostUsd:e.totalCostUsd,localSavingsUsd:e.localSavingsUsd,localTokens:n(`local`,`tokens`),cloudTokens:n(`cloud`,`tokens`),localCostUsd:n(`local`,`costUsd`),cloudCostUsd:n(`cloud`,`costUsd`),byProvider:[...t].sort((e,t)=>t.tokens-e.tokens),empty:t.length===0&&e.totalTokens===0}}function Ve(e,t){let n=[],r=new Set;for(let t of e??[]){let e=`${t.backend}:${t.window}`;r.add(e);let i=t.max>0?U(t.used/t.max*100):null;n.push({id:e,backend:t.backend,window:t.window,max:t.max,used:t.used,standing:t.standing,usedPct:i,configuredOnly:!1})}for(let e of t??[]){let t=`${e.engine}:${e.window}`;r.has(t)||(r.add(t),n.push({id:t,backend:e.engine,window:e.window,max:e.max,used:null,standing:`unknown`,usedPct:null,configuredOnly:!0}))}return n.sort((e,t)=>e.backend.localeCompare(t.backend)||e.window.localeCompare(t.window))}var He=`No per-day series is available: the sources this view reads carry aggregate spend only, not a dated history.`;function Ue(e){if(!e)return{available:!1,reason:He};if(e.sourceQuality?.sourceState!==`healthy`)return{available:!1,reason:`No per-day series: the daemon ledger is ${e.sourceQuality?.sourceState??`unavailable`}${e.sourceQuality?.reason?` (${e.sourceQuality.reason})`:``}.`};let t=e.ticks;if(!t||t.length===0)return{available:!1,reason:He};let n=new Map;for(let e of t){let t=Date.parse(e.ts);if(Number.isNaN(t))continue;let r=T(new Date(t));n.set(r,(n.get(r)??0)+(Number.isFinite(e.spentUsd)?e.spentUsd:0))}if(n.size<2)return{available:!1,reason:`No per-day series: only ${n.size} day${n.size===1?``:`s`} of daemon ticks is retained, which is not a trend.`};let r=[...n.keys()].sort(),i=r[0],a=r[r.length-1],o=[],s=F(a);for(let e=new Date(F(i));e.getTime()<=s;e=new Date(e.getFullYear(),e.getMonth(),e.getDate()+1)){let t=T(e);o.push({day:t,usd:n.has(t)?n.get(t):null})}return{available:!0,days:o,tickCount:t.length,caveat:`From the last ${t.length} recorded daemon ticks. The tick ledger is capped and records the autonomous loop only — interactive chat turns are not in it, and a gap is a day with no retained tick, not a measured zero.`}}var We={available:!1,reason:null,dailyBudgetUsd:null,subscriptionMaxPercent:null,todaySpentUsd:null,todaySpentDate:null,foundryLimits:[]};function W(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function G(e,t){if(!e)return null;for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t))return t}return null}function Ge(e,t=null){let n=W(e);if(!n)return{...We,reason:t};let r=W(n.caps)??n,i=W(n.daemon),a=W(n.spend),o=[],s=r.foundryLimits;if(Array.isArray(s))for(let e of s){let t=W(e);if(!t)continue;let n=typeof t.engine==`string`?t.engine:null,r=G(t,[`max`]);n!==null&&r!==null&&o.push({engine:n,window:typeof t.window==`string`?t.window:`1d`,max:r})}return{available:!0,reason:t,dailyBudgetUsd:G(r,[`dailyBudgetUsd`]),subscriptionMaxPercent:G(r,[`subscriptionMaxPercent`]),todaySpentUsd:a?G(a,[`todayUsd`]):G(n,[`todaySpentUsd`,`todaySpendUsd`,`spendTodayUsd`])??G(i,[`todaySpentUsd`]),todaySpentDate:a&&typeof a.todayDate==`string`?a.todayDate:null,foundryLimits:o}}function Ke(e){return{...We,reason:e}}var K={section:`_section_trwms_11`,header:`_header_trwms_20`,headerTitle:`_headerTitle_trwms_33`,headerMeta:`_headerMeta_trwms_41`,ghostButton:`_ghostButton_trwms_50`,scroll:`_scroll_trwms_67`,panel:`_panel_trwms_75`,panelHead:`_panelHead_trwms_83`,panelTitle:`_panelTitle_trwms_95`,panelNote:`_panelNote_trwms_104`,muted:`_muted_trwms_111`,noteList:`_noteList_trwms_124`,num:`_num_trwms_135`,tiles:`_tiles_trwms_142`,cards:`_cards_trwms_150`,card:`_card_trwms_150`,cardHead:`_cardHead_trwms_177`,cardLabel:`_cardLabel_trwms_187`,cardMeta:`_cardMeta_trwms_198`,cardFigures:`_cardFigures_trwms_208`,figure:`_figure_trwms_217`,figureLabel:`_figureLabel_trwms_224`,figureValue:`_figureValue_trwms_232`,windows:`_windows_trwms_241`,windowHead:`_windowHead_trwms_248`,windowPct:`_windowPct_trwms_258`,windowReset:`_windowReset_trwms_264`,track:`_track_trwms_277`,fill:`_fill_trwms_285`,unknownRule:`_unknownRule_trwms_313`,signalRow:`_signalRow_trwms_320`,reason:`_reason_trwms_327`,sourceLine:`_sourceLine_trwms_335`,split:`_split_trwms_350`,splitRow:`_splitRow_trwms_357`,splitBar:`_splitBar_trwms_366`,splitFill:`_splitFill_trwms_373`,limitList:`_limitList_trwms_379`,limitRow:`_limitRow_trwms_384`,limitName:`_limitName_trwms_397`,limitWindow:`_limitWindow_trwms_406`,limitValue:`_limitValue_trwms_411`,verdictDetail:`_verdictDetail_trwms_427`,bindingLabel:`_bindingLabel_trwms_435`,windowBlock:`_windowBlock_trwms_445`,windowBlockLead:`_windowBlockLead_trwms_454`,windowFlag:`_windowFlag_trwms_467`,creditsRow:`_creditsRow_trwms_475`,actionBlock:`_actionBlock_trwms_490`,command:`_command_trwms_496`,commandInline:`_commandInline_trwms_497`,negative:`_negative_trwms_512`,segmented:`_segmented_trwms_518`,segment:`_segment_trwms_518`,charts:`_charts_trwms_560`,tableScroll:`_tableScroll_trwms_572`,stateBlock:`_stateBlock_trwms_580`,stateTitle:`_stateTitle_trwms_588`,stateBody:`_stateBody_trwms_597`,stateActions:`_stateActions_trwms_603`,skeletonGrid:`_skeletonGrid_trwms_607`,capacity:`_capacity_trwms_662`,capacityHeadline:`_capacityHeadline_trwms_667`,chips:`_chips_trwms_682`,chip:`_chip_trwms_682`,chipLabel:`_chipLabel_trwms_729`,chipState:`_chipState_trwms_739`,chipPct:`_chipPct_trwms_759`,capacityFacts:`_capacityFacts_trwms_765`,capacityFact:`_capacityFact_trwms_765`,capacityMuted:`_capacityMuted_trwms_779`,proseResets:`_proseResets_trwms_785`,visuallyHidden:`_visuallyHidden_trwms_789`,cardTrigger:`_cardTrigger_trwms_809`,cardChevron:`_cardChevron_trwms_825`,detail:`_detail_trwms_850`,detailHead:`_detailHead_trwms_858`,detailTitle:`_detailTitle_trwms_865`,detailGrid:`_detailGrid_trwms_873`,detailColumn:`_detailColumn_trwms_880`,evidenceList:`_evidenceList_trwms_884`,evidenceRow:`_evidenceRow_trwms_891`,evidenceValue:`_evidenceValue_trwms_898`,figureTile:`_figureTile_trwms_909`,figureBig:`_figureBig_trwms_920`,figureCaption:`_figureCaption_trwms_928`,panelActions:`_panelActions_trwms_936`,placement:`_placement_trwms_949`,placementBar:`_placementBar_trwms_956`,placementGpu:`_placementGpu_trwms_966`,placementCpu:`_placementCpu_trwms_967`,placementText:`_placementText_trwms_973`,staleNotice:`_staleNotice_trwms_986`,staleFlag:`_staleFlag_trwms_1000`},q=t();function qe({view:e,ariaPrefix:t,prominent:n=!1}){let r=`${t} ${e.label}`;if(e.limitReached)return(0,q.jsxs)(`div`,{className:n?K.windowBlockLead:K.windowBlock,children:[(0,q.jsxs)(`div`,{className:K.windowHead,children:[(0,q.jsx)(`span`,{children:e.label}),(0,q.jsx)(`span`,{className:K.windowFlag,children:`limit reached`})]}),(0,q.jsx)(`div`,{className:K.track,"data-tone":`danger`,role:`img`,"aria-label":`${r}: the provider flagged this window as rate-limited, so no percentage is shown`,children:(0,q.jsx)(`div`,{className:K.fill,style:{width:`100%`}})}),e.resetText?(0,q.jsx)(`p`,{className:K.windowReset,children:e.resetText}):null]});if(e.usedPct===null)return(0,q.jsxs)(`div`,{className:n?K.windowBlockLead:K.windowBlock,children:[(0,q.jsxs)(`div`,{className:K.windowHead,children:[(0,q.jsx)(`span`,{children:e.label}),(0,q.jsx)(l,{quality:V(`No percentage was reported for this window.`),label:r,children:null})]}),(0,q.jsx)(`hr`,{className:K.unknownRule,"aria-hidden":`true`})]});let i=Math.round(e.usedPct);return(0,q.jsxs)(`div`,{className:n?K.windowBlockLead:K.windowBlock,children:[(0,q.jsxs)(`div`,{className:K.windowHead,children:[(0,q.jsx)(`span`,{children:e.label}),(0,q.jsx)(`span`,{className:K.windowPct,children:w(e.usedPct)})]}),(0,q.jsx)(`div`,{className:K.track,"data-tone":e.tone,role:`meter`,"aria-label":`${r} used`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":i,"aria-valuetext":`${w(e.usedPct)} used${e.resetText?`, ${e.resetText}`:``}`,children:(0,q.jsx)(`div`,{className:K.fill,style:{width:`${i}%`}})}),e.resetText?(0,q.jsx)(`p`,{className:K.windowReset,children:e.resetText}):null]})}var Je={available:`success`,credits:`success`,tight:`warning`,exhausted:`danger`,"signed-out":`warning`,"probe-unsupported":`warning`,unknown:`unknown`};function Ye({credits:e}){if(!e)return null;let t=e.unlimited?`unlimited`:e.balance===null?null:e.balanceValue===null?e.balance:e.balanceValue.toLocaleString(`en-US`,{maximumFractionDigits:2});return(0,q.jsxs)(`div`,{className:K.creditsRow,children:[(0,q.jsx)(`span`,{className:K.figureLabel,children:`Credits`}),(0,q.jsx)(`span`,{className:K.num,title:e.balance??void 0,children:t??`not reported`}),(0,q.jsx)(`p`,{className:K.reason,children:`Credits are a separate pool from the window above — a fully used window does not stop a spendable balance from being spent. The provider gives a bare number, not a currency, so it is shown as reported.`})]})}function Xe({card:e,onOpen:t,expanded:n=!1,triggerId:r,detailId:i}){let a={"--engine-color":e.color},o=e.verdict.state===`signed-out`,s=t!==void 0&&e.hasDetail,c=(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`span`,{className:K.cardLabel,children:e.label}),(0,q.jsx)(u,{status:e.verdict.state,tone:Je[e.verdict.state],children:e.verdict.headline})]});return(0,q.jsxs)(`article`,{className:K.card,style:a,"aria-label":`${e.label} usage`,"data-selected":n?`true`:void 0,children:[s?(0,q.jsxs)(`button`,{type:`button`,id:r,className:`${K.cardHead} ${K.cardTrigger}`,"aria-expanded":n,...i?{"aria-controls":i}:{},onClick:()=>t(e.id),children:[c,(0,q.jsx)(`span`,{className:K.cardChevron,"aria-hidden":`true`,children:n?`−`:`+`})]}):(0,q.jsx)(`div`,{className:K.cardHead,children:c}),(0,q.jsxs)(`div`,{className:K.cardMeta,children:[(0,q.jsx)(`span`,{children:S[e.engine]}),(0,q.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,q.jsx)(`span`,{children:e.plan?`${e.plan} plan`:`plan not reported`})]}),(0,q.jsx)(`p`,{className:K.verdictDetail,children:e.verdict.detail}),e.verdict.code?(0,q.jsxs)(`p`,{className:K.sourceLine,children:[`Probe reason `,(0,q.jsx)(`code`,{className:K.commandInline,children:e.verdict.code})]}):null,e.binding?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`span`,{className:K.bindingLabel,children:`Binding constraint`}),(0,q.jsx)(qe,{view:e.binding,ariaPrefix:e.label,prominent:!0})]}):null,e.others.length>0?(0,q.jsx)(`div`,{className:K.windows,children:e.others.map(t=>(0,q.jsx)(qe,{view:t,ariaPrefix:e.label},t.id))}):null,(0,q.jsx)(Ye,{credits:e.credits}),o?(0,q.jsx)(`div`,{className:K.actionBlock,children:e.reconnectCommand?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`span`,{className:K.figureLabel,children:`Reconnect`}),(0,q.jsx)(`code`,{className:K.command,children:e.reconnectCommand})]}):(0,q.jsxs)(`p`,{className:K.reason,children:[`Sign this account back in through its own provider CLI under its pinned profile. Ashlr does not print that invocation here, because the pinned-profile launcher path is never allowed onto a surface. `,(0,q.jsx)(`code`,{className:K.commandInline,children:`ashlr resources`}),` `,`shows the connection state once it is back.`]})}):null,e.sourceNote?(0,q.jsx)(`p`,{className:K.sourceLine,children:e.sourceNote}):null]})}var Ze={available:`success`,credits:`success`,tight:`warning`,exhausted:`danger`,"signed-out":`warning`,"probe-unsupported":`warning`,unknown:`unknown`},Qe=`No per-account history is retained by any source this view reads: the accounts route is a point-in-time snapshot and the usage series carries no per-account breakdown. A trend is not drawn from one reading.`;function $e(e,t){return e===null?`The source behind this card reports no health verdict at all.`:e===`unknown`?t===`claude`?`Health reads unknown, which is how this provider always reads — the probe has no health channel for it. It is not a fault.`:`Health reads unknown: the monitor took no verdict on this account.`:`Monitor health: ${e}.`}function J({label:e,children:t}){return(0,q.jsxs)(`div`,{className:K.evidenceRow,children:[(0,q.jsx)(`dt`,{className:K.figureLabel,children:e}),(0,q.jsx)(`dd`,{className:K.evidenceValue,children:t})]})}function et({card:e,onClose:t,headingId:n}){let{evidence:r}=e,i=e.credits,a=(0,z.useRef)(null);return(0,z.useEffect)(()=>{a.current?.focus()},[e.id]),(0,q.jsxs)(`section`,{className:K.detail,"aria-labelledby":n,children:[(0,q.jsxs)(`div`,{className:K.detailHead,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h4`,{id:n,ref:a,tabIndex:-1,className:K.detailTitle,children:e.label}),(0,q.jsxs)(`div`,{className:K.cardMeta,children:[(0,q.jsx)(`span`,{children:S[e.engine]}),(0,q.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,q.jsx)(`span`,{children:e.plan?`${e.plan} plan`:`plan not reported`}),(0,q.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,q.jsx)(u,{status:e.verdict.state,tone:Ze[e.verdict.state],children:e.verdict.headline})]})]}),(0,q.jsx)(`button`,{type:`button`,className:K.ghostButton,onClick:t,children:`Close`})]}),(0,q.jsx)(`p`,{className:K.verdictDetail,children:e.verdict.detail}),(0,q.jsxs)(`div`,{className:K.detailGrid,children:[(0,q.jsxs)(`div`,{className:K.detailColumn,children:[(0,q.jsxs)(`span`,{className:K.figureLabel,children:[`All windows (`,e.allWindows.length,`)`]}),e.allWindows.length===0?(0,q.jsx)(`p`,{className:K.reason,children:`This account reported no windows at all. That is an absent reading, not a set of windows at zero.`}):(0,q.jsx)(`div`,{className:K.windows,children:e.allWindows.map((t,n)=>(0,q.jsx)(qe,{view:t,ariaPrefix:e.label,prominent:n===0},t.id))}),e.allWindows.some(e=>!e.measured)?(0,q.jsx)(`p`,{className:K.reason,children:`At least one window above carries a provider FLAG rather than a measurement, so no percentage is printed for it. A flagged limit and a measured 100% are different facts.`}):null]}),(0,q.jsxs)(`div`,{className:K.detailColumn,children:[(0,q.jsx)(`span`,{className:K.figureLabel,children:`Probe evidence`}),(0,q.jsxs)(`dl`,{className:K.evidenceList,children:[(0,q.jsx)(J,{label:`Connection`,children:r.state}),(0,q.jsx)(J,{label:`Authentication`,children:r.authentication}),(0,q.jsx)(J,{label:`Health`,children:$e(r.health,e.engine)}),(0,q.jsx)(J,{label:`Observed`,children:r.observedAt===null?(0,q.jsx)(`span`,{className:K.capacityMuted,children:`no observation timestamp was reported`}):(0,q.jsx)(`span`,{className:K.num,title:new Date(r.observedAt).toLocaleString(),children:A(r.observedAt)??new Date(r.observedAt).toLocaleString()})}),(0,q.jsx)(J,{label:`Probe reason`,children:r.reasonCode===null?(0,q.jsx)(`span`,{className:K.capacityMuted,children:`none reported`}):(0,q.jsx)(`code`,{className:K.commandInline,children:r.reasonCode})}),r.unsupported?(0,q.jsxs)(J,{label:`Version pin`,children:[(0,q.jsx)(`code`,{className:K.commandInline,children:r.unsupported.code}),r.unsupported.pinnedVersion?(0,q.jsxs)(q.Fragment,{children:[` `,`pinned to `,(0,q.jsx)(`span`,{className:K.num,children:r.unsupported.pinnedVersion}),`. A one-line constant bump, not an outage.`]}):null]}):null]}),i?(0,q.jsxs)(`div`,{className:K.creditsRow,children:[(0,q.jsx)(`span`,{className:K.figureLabel,children:`Credits`}),(0,q.jsx)(`span`,{className:K.num,title:i.balance??void 0,children:i.unlimited?`unlimited`:i.balanceValue===null?i.balance??`not reported`:i.balanceValue.toLocaleString(`en-US`,{maximumFractionDigits:2})}),(0,q.jsx)(`p`,{className:K.reason,children:`A separate pool from every window above. The provider gives a bare number, not a currency, so it is shown as reported.`})]}):null,r.notes.length>0?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`span`,{className:K.figureLabel,children:`Provider notes`}),(0,q.jsx)(`ul`,{className:K.noteList,children:r.notes.map(e=>(0,q.jsx)(`li`,{className:K.capacityMuted,children:e},e))})]}):null]})]}),(0,q.jsx)(`p`,{className:K.sourceLine,children:Qe})]})}function tt(e,t=3e4){let[n,r]=(0,z.useState)(()=>Date.now());return(0,z.useEffect)(()=>{if(!e)return;let n=setInterval(()=>r(Date.now()),t);return()=>clearInterval(n)},[e,t]),n}function nt({overview:e}){let t=tt(e.resets.length>0),n=(0,z.useMemo)(()=>O(e.resets,t),[e.resets,t]),r=n===null?0:n.atMs-t,i=r<=0,a=e.local;return(0,q.jsxs)(`section`,{className:K.capacity,"aria-label":`Resets and local headroom`,children:[(0,q.jsxs)(`dl`,{className:K.capacityFacts,children:[(0,q.jsxs)(`div`,{className:K.capacityFact,children:[(0,q.jsx)(`dt`,{className:K.figureLabel,children:`Nearest reset`}),(0,q.jsx)(`dd`,{children:n===null?(0,q.jsx)(`span`,{className:K.capacityMuted,children:`No seat reported a dated reset. That is an absent timestamp, not "never".`}):i?(0,q.jsxs)(`span`,{className:K.capacityMuted,children:[(0,q.jsx)(`span`,{className:K.num,children:n.seatLabel}),` · `,n.windowLabel,` was due to reset `,D(new Date(n.atMs).toISOString(),t),` — this reading predates the rollover.`]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`span`,{className:K.num,children:k(r)}),` `,(0,q.jsxs)(`span`,{className:K.capacityMuted,children:[`· `,n.seatLabel,` `,n.windowLabel,`, resets`,` `,D(new Date(n.atMs).toISOString(),t)]})]})})]}),(0,q.jsxs)(`div`,{className:K.capacityFact,children:[(0,q.jsx)(`dt`,{className:K.figureLabel,children:`Local headroom`}),(0,q.jsx)(`dd`,{children:a===null?(0,q.jsx)(`span`,{className:K.capacityMuted,children:`No local source answered.`}):a.reachable?a.headroomBytes===null?(0,q.jsx)(`span`,{className:K.capacityMuted,children:`Either the resident total or the machine budget was not reported, so headroom cannot be computed.`}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`span`,{className:K.num,children:L(a.headroomBytes)}),` `,(0,q.jsxs)(`span`,{className:K.capacityMuted,children:[`free of `,L(a.memoryBudgetBytes),` · `,a.residentCount,` resident,`,` `,a.installedCount,` installed`]})]}):(0,q.jsx)(`span`,{className:K.capacityMuted,children:`The local runtime did not answer this probe, so headroom is unknown — not zero, and not full.`})})]}),(0,q.jsxs)(`div`,{className:K.capacityFact,children:[(0,q.jsx)(`dt`,{className:K.figureLabel,children:`Agentic locally`}),(0,q.jsx)(`dd`,{children:a===null||!a.reachable?(0,q.jsx)(`span`,{className:K.capacityMuted,children:`unknown`}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`span`,{className:K.num,children:a.agenticCount}),` `,(0,q.jsxs)(`span`,{className:K.capacityMuted,children:[`of `,a.installedCount,` installed models can drive a session`,a.unknownToolCount>0?`; ${a.unknownToolCount} did not report a capability list`:``]})]})})]})]}),e.proseResets.length>0?(0,q.jsxs)(`div`,{className:K.proseResets,children:[(0,q.jsx)(`span`,{className:K.figureLabel,children:`Resets reported as text`}),(0,q.jsx)(`ul`,{className:K.noteList,children:e.proseResets.map(e=>(0,q.jsxs)(`li`,{className:K.capacityMuted,children:[e.seatLabel,` · `,e.windowLabel,` — `,e.text]},`${e.seatLabel}-${e.windowLabel}-${e.text}`))}),(0,q.jsx)(`p`,{className:K.capacityMuted,children:`These providers publish a sentence rather than a timestamp, so it is shown exactly as given and never turned into a countdown.`})]}):null]})}function rt(e){let t=e.fullest;if(t===null)return`—`;let n=`${t.exact?``:`≤`}${C(t.tokens)}`;if(t.window===null)return n;let r=t.tokens/t.window*100;return`${n} / ${C(t.window)} · ${r<=100?w(r):te(r/100)}`}var it=[{key:`seat`,label:`Seat`,render:e=>(0,q.jsxs)(q.Fragment,{children:[e.label,(0,q.jsxs)(`span`,{className:K.limitWindow,children:[` · ${S[e.engine]}`,e.retired?` · no longer connected`:``]})]})},{key:`chats`,label:`Chats`,numeric:!0,render:e=>b(e.sessions)},{key:`turns`,label:`Turns`,numeric:!0,render:e=>b(e.turns)},{key:`prompt`,label:`Prompt tokens`,numeric:!0,render:e=>C(e.promptTokens)},{key:`hit`,label:`Cache hit`,numeric:!0,render:e=>e.cacheHitRatio===null?e.promptTokens>0?`none reported`:`—`:se(e.cacheHitRatio)},{key:`compactions`,label:`Compactions`,numeric:!0,render:e=>b(e.compactions)},{key:`expansive`,label:`Expansive chats`,numeric:!0,render:e=>b(e.expansiveSessions)},{key:`fullest`,label:`Fullest context`,numeric:!0,render:e=>rt(e)}];function at({rows:e,unavailableReason:t}){return(0,q.jsxs)(`section`,{className:K.panel,"aria-labelledby":`verse-usage-efficiency`,children:[(0,q.jsxs)(`div`,{className:K.panelHead,children:[(0,q.jsx)(`h3`,{id:`verse-usage-efficiency`,className:K.panelTitle,children:`Context efficiency`}),(0,q.jsx)(`p`,{className:K.panelNote,children:`Per seat, across every chat on this machine. Cache hit is the share of prompt tokens served from the provider's cache — the higher it is, the less each turn re-reads at full price. Compactions are the CLI summarizing a context that outgrew its budget.`})]}),t===null?e.length===0?(0,q.jsx)(`p`,{className:K.muted,children:`No chats yet, so there is nothing to measure — this is an empty history, not a seat at 0%. Start a chat on any seat and its context use shows up here.`}):(0,q.jsx)(`div`,{className:K.tableScroll,children:(0,q.jsx)(d,{caption:`Context efficiency per seat: chats, turns, prompt tokens, cache-hit ratio, compactions, expansive chats and the fullest context`,columns:it,rows:[...e],rowKey:e=>e.seatId})}):(0,q.jsx)(`p`,{className:K.muted,children:t}),(0,q.jsx)(`p`,{className:K.sourceLine,children:`Computed in this browser from each chat's recorded totals — no extra request, no spend. “None reported” means the provider reported no cache activity, not a 0% hit rate; a figure marked ≤ is an upper bound. Compactions are counted from Verse 3.9 on; earlier ones were not recorded.`})]})}function ot(e){switch(e){case`ok`:return`success`;case`warn`:return`warning`;case`over`:return`danger`;case`unlimited`:return`neutral`;default:return`unknown`}}function st({rows:e,capsNote:t}){return(0,q.jsxs)(`section`,{className:K.panel,"aria-labelledby":`verse-usage-limits`,children:[(0,q.jsxs)(`div`,{className:K.panelHead,children:[(0,q.jsx)(`h3`,{id:`verse-usage-limits`,className:K.panelTitle,children:`Dispatch limits`}),(0,q.jsx)(`p`,{className:K.panelNote,children:`Calls recorded in the dispatch ledger against each configured foundry cap. This is not subscription utilization.`})]}),t?(0,q.jsx)(`p`,{className:K.muted,children:t}):null,e.length===0?(0,q.jsx)(`p`,{className:K.muted,children:`No foundry limits are configured, so dispatches are uncapped on this machine. Nothing here is being throttled.`}):(0,q.jsx)(`div`,{className:K.limitList,children:e.map(e=>(0,q.jsxs)(`div`,{className:K.limitRow,children:[(0,q.jsxs)(`span`,{className:K.limitName,children:[e.backend,(0,q.jsxs)(`span`,{className:K.limitWindow,children:[`per `,e.window]}),(0,q.jsx)(u,{status:e.standing,tone:ot(e.standing),children:e.standing===`unknown`?`no reading`:e.standing})]}),e.usedPct===null?(0,q.jsx)(`hr`,{className:K.unknownRule,"aria-hidden":`true`}):(0,q.jsx)(`div`,{className:K.track,"data-tone":e.usedPct>=100?`danger`:e.usedPct>=80?`warn`:`ok`,role:`meter`,"aria-label":`${e.backend} dispatches against its ${e.window} cap`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(e.usedPct),children:(0,q.jsx)(`div`,{className:K.fill,style:{width:`${Math.round(e.usedPct)}%`}})}),(0,q.jsx)(`span`,{className:K.limitValue,children:e.used===null?`configured ${b(e.max)}`:`${b(e.used)} / ${b(e.max)}`})]},e.id))})]})}var ct=`Cost is ESTIMATED from a static price table in this repo, not billed. It will not match a provider invoice.`,lt=`Codex reports cacheRead and cacheWrite as a hardcoded 0 upstream, so any window containing Codex traffic understates cache activity — its cache economics are not comparable to Claude’s.`,ut=`A flat heuristic of $3 per 1M local tokens, not a quote and not a measured price.`,dt=`Fewer than two days in this window carry a rollup row, which is not a trend.`,ft=`The daily rollup carries no per-engine or local/cloud columns, and the only tier split available is a single aggregate with no dates on it. Apportioning the daily totals by that aggregate’s ratio would invent a shape nobody measured, so no per-day split is drawn — the aggregate below is the real figure.`;function pt(e,t){return e.reduce((e,n)=>e+(t(n)===null?0:1),0)}function Y(e,t){return e.map(e=>({x:F(e.day),y:t(e)}))}function mt(e){return e.reduce((e,t)=>({tokensIn:e.tokensIn+t.tokensIn,tokensOut:e.tokensOut+t.tokensOut,estCostUsd:e.estCostUsd+t.estCostUsd,sessions:e.sessions+t.sessions,dayCount:e.dayCount+1}),{tokensIn:0,tokensOut:0,estCostUsd:0,sessions:0,dayCount:0})}function ht(e){return e?e.days.length<2?{available:!1,reason:dt}:{available:!0,days:e.days,series:[{id:`tokensIn`,label:`Tokens in`,points:Y(e.days,e=>e.tokensIn)},{id:`tokensOut`,label:`Tokens out`,points:Y(e.days,e=>e.tokensOut)}]}:{available:!1,reason:`No usage series has been loaded.`}}function gt(e){return e?e.days.length<2?{available:!1,reason:dt}:{available:!0,days:e.days,series:[{id:`estCostUsd`,label:`Estimated spend`,points:Y(e.days,e=>e.estCostUsd)}]}:{available:!1,reason:`No usage series has been loaded.`}}function _t(e){if(!e)return{available:!1,reason:`No usage series has been loaded.`};let t=pt(e.days,e=>e.cacheHitRate);return t===0?{available:!1,reason:`No day in this window reported a cache hit rate, so there is nothing to plot. This is an absent signal, not a 0% hit rate.`}:t<2?{available:!1,reason:`Only ${t} day in this window reported a cache hit rate, which is not a trend.`}:{available:!0,days:e.days,series:[{id:`cacheHitRate`,label:`Cache hit rate`,points:Y(e.days,e=>e.cacheHitRate)}]}}function vt(e){return e?pt(e.days,e=>e.cacheRead)+pt(e.days,e=>e.cacheWrite)===0?{available:!1,reason:`No day in this window reported cache read or write tokens, so there is nothing to plot. This is an absent signal, not zero cache activity.`}:e.days.length<2?{available:!1,reason:dt}:{available:!0,days:e.days,series:[{id:`cacheRead`,label:`Cache read`,points:Y(e.days,e=>e.cacheRead)},{id:`cacheWrite`,label:`Cache write`,points:Y(e.days,e=>e.cacheWrite)}]}:{available:!1,reason:`No usage series has been loaded.`}}function yt(e){if(e.length===0)return{tokensInPerDay:null,tokensOutPerDay:null,estCostUsdPerDay:null,peakCostDay:null};let t=mt(e),n=e.reduce((e,t)=>t.estCostUsd>e.estCostUsd?t:e);return{tokensInPerDay:t.tokensIn/e.length,tokensOutPerDay:t.tokensOut/e.length,estCostUsdPerDay:t.estCostUsd/e.length,peakCostDay:{day:n.day,usd:n.estCostUsd}}}function X(e,t){if(!(!e||e.days.length<2))return e.days.map(t)}var Z={"7d":`Last 7 days`,"30d":`Last 30 days`},bt=g(0),xt=g(1),St=[{key:`provider`,label:`Provider`,render:e=>e.provider},{key:`tier`,label:`Tier`,render:e=>e.tier},{key:`tokens`,label:`Tokens`,numeric:!0,render:e=>b(e.tokens)},{key:`cost`,label:`Cost`,numeric:!0,render:e=>y(e.costUsd)},{key:`share`,label:`Share`,numeric:!0,render:e=>w(e.sharePct)}];function Ct({label:e,tokens:t,total:n,color:r}){let i=n>0?t/n*100:0,a=Math.round(i);return(0,q.jsxs)(`div`,{className:K.splitRow,children:[(0,q.jsx)(`span`,{children:e}),(0,q.jsx)(`div`,{className:K.splitBar,role:`meter`,"aria-label":`${e} share of tokens`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":a,children:(0,q.jsx)(`div`,{className:K.splitFill,style:{width:`${a}%`,"--split-color":r}})}),(0,q.jsxs)(`span`,{className:K.num,children:[b(t),` · `,w(i)]})]})}function wt({split:e,savingsNote:t}){let n=e.localTokens+e.cloudTokens,r=e.byProvider.map(e=>({label:e.provider,value:e.tokens}));return(0,q.jsxs)(`section`,{className:K.panel,"aria-labelledby":`verse-usage-split`,children:[(0,q.jsx)(`div`,{className:K.panelHead,children:(0,q.jsxs)(`h3`,{id:`verse-usage-split`,className:K.panelTitle,children:[`Local vs cloud · `,e.window]})}),(0,q.jsxs)(`div`,{className:K.tiles,children:[(0,q.jsx)(x,{label:`Not spent (ran locally)`,value:(0,q.jsx)(`span`,{className:K.num,children:y(e.localSavingsUsd)}),caption:`Estimated cloud list price of the ${e.window} local tokens. ${t??`A heuristic, not a quote.`}`}),(0,q.jsx)(x,{label:`Estimated cloud spend · ${e.window}`,value:(0,q.jsx)(`span`,{className:K.num,children:y(e.cloudCostUsd)}),caption:ct}),(0,q.jsx)(x,{label:`Tokens · ${e.window}`,value:(0,q.jsx)(`span`,{className:K.num,children:b(e.totalTokens)}),caption:`Local and cloud combined`})]}),e.empty?(0,q.jsx)(`p`,{className:K.muted,style:{marginTop:`var(--space-4)`},children:`No provider activity recorded in this window. Choose a longer window, or run a chat turn and it appears here.`}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`div`,{className:K.split,style:{marginTop:`var(--space-4)`},children:[(0,q.jsx)(Ct,{label:`Local`,tokens:e.localTokens,total:n,color:bt}),(0,q.jsx)(Ct,{label:`Cloud`,tokens:e.cloudTokens,total:n,color:xt})]}),(0,q.jsx)(m,{items:[{label:`Local`,color:bt,kind:`swatch`},{label:`Cloud`,color:xt,kind:`swatch`}]}),(0,q.jsx)(f,{title:`Tokens by provider`,description:`Share of the ${e.window} window`,empty:r.length===0,emptyMessage:`No provider rows in this window.`,table:(0,q.jsx)(d,{caption:`Tokens and cost by provider`,columns:St,rows:e.byProvider,rowKey:e=>e.provider}),children:(0,q.jsx)(h,{data:r,orientation:`horizontal`,height:Math.max(120,r.length*34),formatValue:e=>b(e),ariaLabel:`Tokens by provider over the ${e.window} window`})})]})]})}var Tt={available:`success`,credits:`success`,tight:`warning`,exhausted:`danger`,"signed-out":`warning`,"probe-unsupported":`warning`,unknown:`unknown`},Et=g(0),Dt=g(5);function Ot(e,t=5e3){let[n,r]=(0,z.useState)(()=>Date.now());return(0,z.useEffect)(()=>{if(!e)return;let n=setInterval(()=>r(Date.now()),t);return()=>clearInterval(n)},[e,t]),n}function kt({row:e}){let t=e.resident?e.expiresAtMs:null,n=Ot(t!==null);return t===null?`—`:Ee(t-n)}function At({row:e}){return e.tools===`unknown`?(0,q.jsx)(l,{quality:V(`The runtime did not report a capability list for this model.`),label:`${e.name} tool support`,children:null}):e.tools===`supported`?(0,q.jsx)(u,{status:`agentic`,tone:`success`,children:`tools`}):(0,q.jsx)(u,{status:`no-tools`,tone:`danger`,children:`no tools`})}function jt({row:e}){if(e.sizeBytes===null)return(0,q.jsx)(`span`,{children:`—`});let t=e.resident?`Resident size reported by the runtime.`:`On-disk size; this model is not resident, so it is using no memory.`;return(0,q.jsxs)(`span`,{title:t,children:[L(e.sizeBytes),e.resident&&e.memoryPct!==null?` · ${w(e.memoryPct)} of machine`:``]})}function Mt({row:e}){if(!e.resident)return(0,q.jsx)(`span`,{className:K.capacityMuted,children:`not resident`});if(e.gpuPct===null)return(0,q.jsx)(l,{quality:V(`The runtime reported no VRAM split for this resident model.`),label:`${e.name} placement`,children:null});let t=Math.round(e.gpuPct);return(0,q.jsxs)(`span`,{className:K.placement,children:[(0,q.jsxs)(`span`,{className:K.placementBar,role:`img`,"aria-label":`${e.name}: ${w(e.gpuPct)} of resident bytes on GPU, ${w(100-e.gpuPct)} on CPU`,children:[(0,q.jsx)(`span`,{className:K.placementGpu,style:{width:`${t}%`,"--split-color":Et}}),(0,q.jsx)(`span`,{className:K.placementCpu,style:{width:`${100-t}%`,"--split-color":Dt}})]}),(0,q.jsx)(`span`,{className:K.placementText,children:e.placement===`unknown`?`${w(e.gpuPct)} GPU`:`${e.placement} · ${w(e.gpuPct)} GPU`})]})}function Nt({row:e}){return e.nativeContext===null&&e.configuredContext===null?(0,q.jsx)(`span`,{children:`—`}):e.contextTruncated?(0,q.jsx)(`span`,{title:`Native context is ${I(e.nativeContext)}; Ashlr runs this seat at ${I(e.configuredContext)}.`,children:`${I(e.configuredContext)} of ${I(e.nativeContext)}`}):(0,q.jsx)(`span`,{children:I(e.nativeContext??e.configuredContext)})}var Pt=[{key:`name`,label:`Model`,render:e=>e.name},{key:`state`,label:`State`,render:e=>e.resident?(0,q.jsx)(u,{status:`resident`,tone:`success`,children:`resident`}):(0,q.jsx)(u,{status:`installed`,tone:`neutral`,children:`installed`})},{key:`tools`,label:`Agentic`,render:e=>(0,q.jsx)(At,{row:e})},{key:`size`,label:`Size`,numeric:!0,render:e=>(0,q.jsx)(jt,{row:e})},{key:`placement`,label:`Placement`,render:e=>(0,q.jsx)(Mt,{row:e})},{key:`params`,label:`Params`,numeric:!0,render:e=>e.parameterSize??`—`},{key:`quant`,label:`Quant`,render:e=>e.quantization??`—`},{key:`context`,label:`Context`,numeric:!0,render:e=>(0,q.jsx)(Nt,{row:e})},{key:`keepalive`,label:`Keep-alive`,numeric:!0,render:e=>(0,q.jsx)(kt,{row:e})}];function Ft({staleness:e}){return e.stale?(0,q.jsxs)(`p`,{className:K.staleNotice,role:`status`,children:[(0,q.jsx)(`span`,{className:K.staleFlag,children:`last known-good`}),` Every local figure below is the last known-good reading from `,De(e.staleForMs),` ago`,e.runtimes.length>0?` (${e.runtimes.join(`, `)})`:``,`, not a fresh probe: the runtime did not answer in time and the server kept the previous report rather than erasing it.`]}):null}function It({card:e,staleness:t}){let n={"--engine-color":e.color},r=e.usedPct===null?null:Math.round(e.usedPct),i=e.usedPct===null?null:w(e.usedPct);return(0,q.jsxs)(`article`,{className:K.card,style:n,"aria-label":`Local usage`,children:[(0,q.jsxs)(`div`,{className:K.cardHead,children:[(0,q.jsx)(`span`,{className:K.cardLabel,children:`Local`}),(0,q.jsx)(u,{status:e.verdict.state,tone:Tt[e.verdict.state],children:e.verdict.headline})]}),(0,q.jsxs)(`div`,{className:K.cardMeta,children:[(0,q.jsx)(`span`,{children:`Ollama`}),(0,q.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,q.jsx)(`span`,{children:`no subscription, no quota, no bill`})]}),t?.stale?(0,q.jsx)(Ft,{staleness:t}):null,(0,q.jsx)(`p`,{className:K.verdictDetail,children:e.verdict.detail}),e.verdict.code?(0,q.jsxs)(`p`,{className:K.sourceLine,children:[`Probe reason `,(0,q.jsx)(`code`,{className:K.commandInline,children:e.verdict.code})]}):null,(0,q.jsx)(`span`,{className:K.bindingLabel,children:`Memory budget`}),r===null?(0,q.jsxs)(`div`,{className:K.windowBlockLead,children:[(0,q.jsxs)(`div`,{className:K.windowHead,children:[(0,q.jsx)(`span`,{children:`Resident against machine memory`}),(0,q.jsx)(l,{quality:V(`Either the resident size or the machine memory budget was not reported, so no share can be computed.`),label:`local memory budget`,children:null})]}),(0,q.jsx)(`hr`,{className:K.unknownRule,"aria-hidden":`true`})]}):(0,q.jsxs)(`div`,{className:K.windowBlockLead,children:[(0,q.jsxs)(`div`,{className:K.windowHead,children:[(0,q.jsx)(`span`,{children:`Resident against machine memory`}),(0,q.jsx)(`span`,{className:K.windowPct,children:i})]}),(0,q.jsx)(`div`,{className:K.track,"data-tone":e.tone,role:`meter`,"aria-label":`Local resident models against machine memory budget`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":r,"aria-valuetext":`${L(e.residentBytes)} of ${L(e.memoryBudgetBytes)} resident`,children:(0,q.jsx)(`div`,{className:K.fill,style:{width:`${r}%`}})}),(0,q.jsxs)(`p`,{className:K.windowReset,children:[L(e.residentBytes),` of `,L(e.memoryBudgetBytes)]})]}),(0,q.jsxs)(`p`,{className:K.sourceLine,children:[e.residentCount,` resident · `,e.installedCount,` installed`]})]})}function Lt({serving:e}){if(e===void 0)return(0,q.jsx)(`p`,{className:K.sourceLine,children:`Residency is not concurrency. How many local agents can run at once is decided by the serving runtime, not by these models — a resident model can still be served to one agent at a time. The serving runtime and its real slot count are in Autonomy.`});let t=_e(e);return(0,q.jsxs)(`p`,{className:K.sourceLine,children:[(0,q.jsxs)(`strong`,{children:[t.headline,`.`]}),` `,t.detail]})}function Rt({view:e,serving:t}){let[n,r]=(0,z.useState)(!1),i=(0,z.useMemo)(()=>Oe(e?.runtimes??[]),[e]),a=(0,z.useMemo)(()=>n?(e?.rows??[]).filter(e=>e.tools!==`unsupported`):e?.rows??[],[e,n]),o=(0,z.useMemo)(()=>a.filter(e=>e.resident&&e.sizeBytes!==null),[a]);return(0,q.jsxs)(`section`,{className:K.panel,"aria-labelledby":`verse-usage-local`,children:[(0,q.jsxs)(`div`,{className:K.panelHead,children:[(0,q.jsx)(`h3`,{id:`verse-usage-local`,className:K.panelTitle,children:`Local availability`}),(0,q.jsx)(`p`,{className:K.panelNote,children:`Resident models answer immediately. A model without tool support cannot drive an agentic session at all, however much memory is free.`})]}),(0,q.jsx)(Lt,{serving:t}),(0,q.jsx)(Ft,{staleness:i}),e===null?(0,q.jsxs)(`p`,{className:K.muted,children:[`No local-model source answered, so neither resident nor installed models can be listed. This is a missing source, not an empty machine. Start Ollama (`,(0,q.jsx)(`code`,{className:K.commandInline,children:`ollama serve`}),`) or llama-server, and this fills in on the next check.`]}):e.reachable?e.rows.length===0?(0,q.jsx)(`p`,{className:K.muted,children:`The local runtime answered and reports no installed models. Pull one to give Ashlr a local seat.`}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`div`,{className:K.tiles,children:[(0,q.jsx)(Q,{label:`Resident now`,value:String(e.rows.filter(e=>e.resident).length),caption:e.residentBytes===null?`At least one resident model reported no size, so the total is withheld rather than understated.`:`${L(e.residentBytes)} in memory`}),(0,q.jsx)(Q,{label:`Installed`,value:String(e.rows.length),caption:`On disk; the first turn on one of these pays a load`}),(0,q.jsx)(Q,{label:`Can drive a session`,value:String(e.agenticCount),caption:e.unknownToolCount>0?`${e.nonAgenticCount} cannot; ${e.unknownToolCount} did not report a capability list`:`${e.nonAgenticCount} cannot drive one`}),(0,q.jsx)(Q,{label:`Machine memory`,value:e.memoryBudgetBytes===null?`unknown`:L(e.memoryBudgetBytes),caption:e.freeMemoryBytes===null?`The machine reported no free-memory figure.`:`${L(e.freeMemoryBytes)} reported free by the OS`})]}),(0,q.jsxs)(`div`,{className:K.panelActions,children:[(0,q.jsx)(`button`,{type:`button`,className:K.segment,"aria-pressed":n,onClick:()=>r(e=>!e),children:`Hide models that cannot drive a session`}),e.nonAgenticCount>0?(0,q.jsxs)(`span`,{className:K.capacityMuted,children:[e.nonAgenticCount,` of `,e.rows.length,` installed models cannot drive an agentic session.`]}):null]}),(0,q.jsx)(`div`,{className:K.tableScroll,children:(0,q.jsx)(d,{caption:`Local models: residency, tool support, size, placement, parameters, quantization, context and keep-alive`,columns:Pt,rows:a,rowKey:e=>`${e.runtime??`runtime`}:${e.name}`})}),(0,q.jsx)(`div`,{className:K.charts,children:(0,q.jsx)(f,{title:`Resident memory by model`,description:`What is actually in memory right now`,caveat:`Only models the runtime reports as resident WITH a size appear here. An installed model occupies no memory and is not a bar at zero.`,empty:o.length===0,emptyMessage:`Nothing is resident, so there is no memory in use to chart. That is an idle machine, not a zero reading.`,table:(0,q.jsx)(d,{caption:`Resident size per model`,columns:[{key:`name`,label:`Model`,render:e=>e.name},{key:`size`,label:`Resident`,numeric:!0,render:e=>L(e.sizeBytes)}],rows:o,rowKey:e=>e.name}),children:(0,q.jsx)(h,{data:o.map(e=>({label:e.name,value:e.sizeBytes})),orientation:`horizontal`,height:Math.max(120,o.length*34),formatValue:e=>L(e),ariaLabel:`Resident memory by local model`})})}),e.runtimes.length>0?(0,q.jsx)(`ul`,{className:K.noteList,children:e.runtimes.map(e=>(0,q.jsxs)(`li`,{className:K.capacityMuted,children:[e.runtime,`:`,` `,e.reachable?`${e.modelCount} model${e.modelCount===1?``:`s`} reported`:`did not answer`,e.stale?` · retained reading, ${De(e.staleForMs)} old`:``,e.reason?` · `:``,e.reason?(0,q.jsx)(`code`,{className:K.commandInline,children:e.reason}):null]},e.runtime))}):null,e.notes.length>0?(0,q.jsx)(`ul`,{className:K.noteList,children:e.notes.map(e=>(0,q.jsx)(`li`,{className:K.capacityMuted,children:e},e))}):null,(0,q.jsxs)(`p`,{className:K.sourceLine,children:[`Sizes and the GPU share come from the runtime's own resident report; a model with no reported VRAM split shows no placement bar rather than being drawn as fully on GPU.`,` `,b(e.rows.length),` models installed.`]})]}):(0,q.jsxs)(`p`,{className:K.muted,children:[`No local runtime answered this probe, so nothing about local models can be read. That is an unanswered probe, not a report that no models are installed. Start Ollama (`,(0,q.jsx)(`code`,{className:K.commandInline,children:`ollama serve`}),`) or llama-server, then check again.`,e.reason?(0,q.jsxs)(q.Fragment,{children:[` `,`Probe reason `,(0,q.jsx)(`code`,{className:K.commandInline,children:e.reason}),`.`]}):null]})]})}function Q({label:e,value:t,caption:n}){return(0,q.jsxs)(`div`,{className:K.figureTile,children:[(0,q.jsx)(`span`,{className:K.figureLabel,children:e}),(0,q.jsx)(`span`,{className:K.figureBig,children:t}),(0,q.jsx)(`span`,{className:K.figureCaption,children:n})]})}var zt=[`7d`,`30d`],Bt=[{key:`day`,label:`Day`,render:e=>_(e.day)},{key:`in`,label:`Tokens in`,numeric:!0,render:e=>b(e.tokensIn)},{key:`out`,label:`Tokens out`,numeric:!0,render:e=>b(e.tokensOut)},{key:`sessions`,label:`Sessions`,numeric:!0,render:e=>b(e.sessions)}],Vt=[{key:`day`,label:`Day`,render:e=>_(e.day)},{key:`cost`,label:`Estimated spend`,numeric:!0,render:e=>y(e.estCostUsd)}],Ht=[{key:`day`,label:`Day`,render:e=>_(e.day)},{key:`read`,label:`Cache read`,numeric:!0,render:e=>e.cacheRead===null?`not reported`:b(e.cacheRead)},{key:`write`,label:`Cache write`,numeric:!0,render:e=>e.cacheWrite===null?`not reported`:b(e.cacheWrite)}],Ut=[{key:`day`,label:`Day`,render:e=>_(e.day)},{key:`rate`,label:`Cache hit rate`,numeric:!0,render:e=>e.cacheHitRate===null?`not reported`:ie(e.cacheHitRate)},{key:`read`,label:`Cache read`,numeric:!0,render:e=>e.cacheRead===null?`not reported`:b(e.cacheRead)}];function Wt({series:e,window:t,onWindowChange:n,unavailableReason:r,loading:i}){let a=e?mt(e.days):null,o=e?yt(e.days):null,s=ht(e),c=gt(e),l=_t(e),u=vt(e);return(0,q.jsxs)(`section`,{className:K.panel,"aria-labelledby":`verse-usage-series`,children:[(0,q.jsxs)(`div`,{className:K.panelHead,children:[(0,q.jsx)(`h3`,{id:`verse-usage-series`,className:K.panelTitle,children:`Token output and spend`}),(0,q.jsx)(`div`,{className:K.segmented,role:`group`,"aria-label":`Series window`,children:zt.map(e=>(0,q.jsx)(`button`,{type:`button`,className:K.segment,"aria-pressed":e===t,onClick:()=>n(e),children:e},e))})]}),r?(0,q.jsxs)(`p`,{className:K.muted,children:[r,` No token or spend series can be drawn, and none is invented in its place.`]}):i&&e===null?(0,q.jsxs)(`p`,{className:K.muted,"aria-busy":`true`,children:[`Loading the `,Z[t].toLowerCase(),` rollup…`]}):e===null||e.days.length===0?(0,q.jsxs)(`p`,{className:K.muted,children:[`The rollup for `,Z[t].toLowerCase(),` came back with no days in it. That is an empty window, not a zero.`]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`div`,{className:K.tiles,children:[(0,q.jsx)(x,{label:`Tokens in · ${t}`,value:(0,q.jsx)(`span`,{className:K.num,children:b(a?.tokensIn??0)}),caption:`Across ${a?.dayCount??0} recorded days`,trend:X(e,e=>e.tokensIn),trendLabel:`Tokens in per day`}),(0,q.jsx)(x,{label:`Tokens out · ${t}`,value:(0,q.jsx)(`span`,{className:K.num,children:b(a?.tokensOut??0)}),caption:`What the models actually produced`,trend:X(e,e=>e.tokensOut),trendLabel:`Tokens out per day`}),(0,q.jsx)(x,{label:`Estimated spend · ${t}`,value:(0,q.jsx)(`span`,{className:K.num,children:y(a?.estCostUsd??0)}),caption:`Estimated from a static price table — not billed`,trend:X(e,e=>e.estCostUsd),trendLabel:`Estimated spend per day`}),(0,q.jsx)(x,{label:`Sessions · ${t}`,value:(0,q.jsx)(`span`,{className:K.num,children:b(a?.sessions??0)}),caption:`Rollup rows, not billed calls`,trend:X(e,e=>e.sessions),trendLabel:`Sessions per day`}),(0,q.jsx)(x,{label:`Estimated spend per active day`,value:(0,q.jsx)(`span`,{className:K.num,children:o?.estCostUsdPerDay===null||o===null?`unknown`:y(o.estCostUsdPerDay)}),caption:`Across the ${a?.dayCount??0} days that carry a rollup row — not the ${t} calendar span`}),(0,q.jsx)(x,{label:`Heaviest day`,value:(0,q.jsx)(`span`,{className:K.num,children:o?.peakCostDay?y(o.peakCostDay.usd):`unknown`}),caption:o?.peakCostDay?`${_(o.peakCostDay.day)} — estimated, not billed`:`No day in this window carries a cost row.`})]}),(0,q.jsxs)(`div`,{className:K.charts,children:[(0,q.jsx)(f,{title:`Tokens per day`,description:Z[t],empty:!s.available,emptyMessage:s.available?``:s.reason,table:(0,q.jsx)(d,{caption:`Tokens in and out per day`,columns:Bt,rows:e.days,rowKey:e=>e.day}),children:s.available?(0,q.jsx)(p,{series:s.series,formatX:e=>v(e),formatY:e=>b(e),ariaLabel:`Tokens in and out per day over ${Z[t].toLowerCase()}`}):null}),(0,q.jsx)(f,{title:`Estimated spend per day`,description:Z[t],caveat:ct,empty:!c.available,emptyMessage:c.available?``:c.reason,table:(0,q.jsx)(d,{caption:`Estimated spend per day`,columns:Vt,rows:e.days,rowKey:e=>e.day}),children:c.available?(0,q.jsx)(p,{series:c.series,area:!0,formatX:e=>v(e),formatY:e=>y(e),ariaLabel:`Estimated spend per day over ${Z[t].toLowerCase()}`}):null}),(0,q.jsx)(f,{title:`Cache hit rate`,description:Z[t],caveat:lt,empty:!l.available,emptyMessage:l.available?``:l.reason,table:l.available?(0,q.jsx)(d,{caption:`Cache hit rate per day`,columns:Ut,rows:e.days,rowKey:e=>e.day}):void 0,children:l.available?(0,q.jsx)(p,{series:l.series,formatX:e=>v(e),formatY:e=>te(e),ariaLabel:`Cache hit rate per day over ${Z[t].toLowerCase()}`}):null}),(0,q.jsx)(f,{title:`Cache read and write tokens`,description:Z[t],caveat:lt,empty:!u.available,emptyMessage:u.available?``:u.reason,table:u.available?(0,q.jsx)(d,{caption:`Cache read and write tokens per day`,columns:Ht,rows:e.days,rowKey:e=>e.day}):void 0,children:u.available?(0,q.jsx)(p,{series:u.series,formatX:e=>v(e),formatY:e=>b(e),ariaLabel:`Cache read and write tokens per day over ${Z[t].toLowerCase()}`}):null}),(0,q.jsx)(f,{title:`Local vs cloud per day`,description:Z[t],empty:!0,emptyMessage:ft,children:null})]}),e.caveats.length>0?(0,q.jsx)(`ul`,{className:K.noteList,children:e.caveats.map(e=>(0,q.jsx)(`li`,{className:K.capacityMuted,children:e},e))}):null]})]})}var Gt=[{key:`day`,label:`Day`,render:e=>_(e.day)},{key:`usd`,label:`Spend`,numeric:!0,render:e=>e.usd===null?`no tick retained`:y(e.usd)}];function Kt({series:e,todaySpentUsd:t,todaySpentDate:n,dailyBudgetUsd:r,showSeries:i=!0}){let a=n!==null&&!E(n),o=a?null:t,s=a?`Nothing recorded today — the last ledger day is ${_(n)}`:r===null?`Configured daily budget unavailable`:r===0?`Daily budget is 0 — the loop is stopped`:`of a ${y(r)} daily budget`;return(0,q.jsxs)(`section`,{className:K.panel,"aria-labelledby":`verse-usage-spend`,children:[(0,q.jsx)(`div`,{className:K.panelHead,children:(0,q.jsx)(`h3`,{id:`verse-usage-spend`,className:K.panelTitle,children:`Spend`})}),(0,q.jsx)(`div`,{className:K.tiles,children:(0,q.jsx)(x,{label:`Spend today`,value:(0,q.jsx)(`span`,{className:K.num,children:o===null?`unknown`:y(o)}),caption:s})}),i?(0,q.jsx)(`div`,{style:{marginTop:`var(--space-4)`},children:e.available?(0,q.jsx)(f,{title:`Spend per day`,description:`Autonomous loop, from the daemon tick ledger`,caveat:e.caveat,table:(0,q.jsx)(d,{caption:`Spend per day from the daemon tick ledger`,columns:Gt,rows:e.days,rowKey:e=>e.day}),children:(0,q.jsx)(p,{series:[{id:`spend`,label:`Spend`,points:e.days.map(e=>({x:F(e.day),y:e.usd}))}],area:!0,formatX:e=>v(e),formatY:e=>y(e),ariaLabel:`Autonomous loop spend per day`})}):(0,q.jsx)(f,{title:`Spend per day`,empty:!0,emptyMessage:e.reason,children:null})}):(0,q.jsx)(`p`,{className:K.sourceLine,children:`Per-day spend is charted above from the full usage rollup. The daemon tick ledger is not drawn again here.`})]})}function qt({now:e=Date.now()}){let t=s(P,{freshMs:15e3}),n=a(P);ne(n,ge);let r=Ae();if(!t.data||!t.data.available)return null;let i=t.data.value?.budget??null,o=i?j(i):null,c=i?me(i.canLaunch,`The cloud budget does not allow another launch right now.`):null;return(0,q.jsxs)(`section`,{className:K.panel,"aria-labelledby":`verse-usage-cloud-credits`,children:[(0,q.jsxs)(`div`,{className:K.panelHead,children:[(0,q.jsx)(`h3`,{id:`verse-usage-cloud-credits`,className:K.panelTitle,children:`Cloud credits`}),(0,q.jsx)(`p`,{className:K.panelNote,children:`What Claude Code cloud sessions launched by Verse have cost, as an estimate, and the limits Verse keeps them inside.`})]}),!i||!o?(0,q.jsx)(`p`,{className:M.muted,children:t.data.reason??`The cloud lane did not answer.`}):(0,q.jsxs)(`div`,{className:M.body,children:[(0,q.jsx)(je,{actions:r}),(0,q.jsx)(fe,{value:o.value,max:o.max,label:`Credits remaining`,valueText:o.text,tone:o.tone,"aria-label":`Estimated cloud credits remaining: ${o.text}, ${o.usedText}`}),(0,q.jsxs)(`p`,{className:M.estimateNote,children:[ae(i.estimateNote,e),` `,(0,q.jsxs)(`a`,{className:M.link,href:pe,target:`_blank`,rel:`noreferrer noopener`,"aria-label":`Check the real balance on claude.ai`,children:[`Check usage on claude.ai `,(0,q.jsx)(de,{width:12,height:12,"aria-hidden":`true`})]})]}),o.warning?(0,q.jsx)(`p`,{className:M.notice,"data-tone":`warning`,role:`note`,children:o.warning}):null,(0,q.jsx)(`p`,{className:M.facts,children:N(i,e)}),c?(0,q.jsxs)(`p`,{className:M.notice,"data-tone":`warning`,role:`note`,children:[`New launches are paused: `,c]}):null,(0,q.jsx)(R,{idPrefix:`usage-cloud-budget`,budget:i.budget,busy:r.busy,disabled:r.readOnly,onSave:e=>r.act(()=>he(e),`Change the cloud budget.`)})]}),r.dialogs]})}var Jt={five_hour:`Session · rolling 5h`,seven_day:`Week · all models`,seven_day_sonnet:`Week · Sonnet`,seven_day_opus:`Week · Opus`,seven_day_fable:`Week · Fable`,codex:`Week · Codex`,primary:`Primary window`,secondary:`Secondary window`};function Yt(e){if(e.label)return e.label;let t=Jt[e.id];if(t)return t;let n=/^seven_day_(.+)$/.exec(e.id);return n?`Week · ${n[1]}`:e.id}function Xt(e,t){let n=D(e,t);return n===null?null:`resets ${n}`}function Zt(e,t=Date.now()){let n=e.resetDescription??Xt(e.resetsAt,t);return{id:e.id,label:Yt(e),usedPct:e.limitReached?null:e.usedPercent,tone:e.limitReached?`danger`:e.usedPercent===null?`ok`:H(e.usedPercent),resetText:n,resetsAt:e.resetsAt,limitReached:e.limitReached,measured:e.measured}}function Qt(e){let t=e.windows,n=t.find(e=>e.limitReached);if(n)return n;let r=t.filter(e=>e.usedPercent!==null),i=r.length===0?null:r.reduce((e,t)=>(t.usedPercent??0)>(e.usedPercent??0)?t:e),a=e.binding;if(a){let e=t.find(e=>e.id===a.id)??null;if(e&&(a.limitReached||e.limitReached||i===null||(a.usedPercent??-1)>=(i.usedPercent??-1)))return e}return i}var $t={"connection-monitor-stopped":"Native polling stopped after a metadata sample could not confirm its process cleanup, so these readings are frozen and no new ones are being taken. Restarting `ashlr verse` begins a new collection generation.","collector-unavailable":`This server is not collecting native metadata, so nothing here is a live reading.`,"collector-not-running":`No account collector is running in this server, so these cards fall back to whatever shared evidence exists.`,"collector-owned":"Another collector (`ashlr resource-console`) owns the exclusive metadata lease, so Verse is reading its shared evidence rather than probing.","collector-start-failed":`The metadata collectors could not be started in this server, so no probe has run.`,"connection-polling-paused":`Native polling is paused because no client has asked for account data recently; it resumes on the next request.`,"connection-not-checked":`No probe has run for this account yet in this server.`,"connection-probe-unavailable":`The probe for this account did not return a usable result, so there is no measurement to show.`,"accounts-pool-unavailable":`This accounts root has no readable pool or bindings, so there is nothing to probe.`,"accounts-collection-not-configured":`Native account collection is not configured for this accounts root.`,"usage-version-unsupported":`The usage probe is pinned to a specific provider build and failed closed on the installed one. That is a version pin, not an outage.`,"usage-account-changed":`The account behind this profile changed between two reads, so the reading was discarded rather than attributed to the wrong account.`,"probe-account-unavailable":`The pinned profile answered but carries no usable account identity — it is not authenticated.`,"probe-account-unsupported":`The pinned profile is authenticated by a method this probe does not accept, so no reading was taken.`,"probe-account-changed":`The account behind this pinned profile changed mid-probe, so the reading was discarded.`,"probe-account-hint-mismatch":`The pinned profile is signed in as a different account than this seat expects.`,"probe-native-unavailable":`The provider CLI for this pinned profile could not be run, so no reading was taken.`,"probe-native-exit-failed":`The provider CLI for this pinned profile exited without a usable result.`,"probe-provider-error":`The provider CLI returned an error instead of account metadata.`,"probe-protocol-unsupported":`The installed provider CLI does not speak the metadata protocol this probe requires.`,"probe-quota-invalid":`The provider returned a quota shape this probe does not recognise, so nothing was accepted as a reading.`,"probe-timed-out":`The metadata probe for this account timed out before it returned anything.`};function en(e,t){return e===null?t:$t[e]??t}var tn={available:0,credits:1,tight:2,exhausted:3,"signed-out":4,"probe-unsupported":5,unknown:6},nn=80,rn=100;function an(e){return e?e.unlimited?!0:e.hasCredits?e.balanceValue!==null&&e.balanceValue>0:!1:!1}function on(e){return e.unlimited?`credits are unlimited on this plan`:`a credit balance of ${e.balance??`an unreported amount`} is still spendable`}function sn(e,t){if(e.authentication===`signed-out`||e.state===`signed-out`)return{state:`signed-out`,headline:`Signed out`,detail:en(e.reason,`The probe reached this account’s pinned profile but it is not authenticated, so there is nothing to measure.`),code:e.reason};if(e.unsupported)return{state:`probe-unsupported`,headline:`Probe version-pinned`,detail:`The usage probe failed closed with ${e.unsupported.code}${e.unsupported.pinnedVersion?`; it is pinned to ${e.unsupported.pinnedVersion}`:``}. This is a version pin, not an outage — no window can be read until the pin is bumped.`,code:e.unsupported.code};let n=an(e.credits);if(t===null||t.usedPercent===null&&!t.limitReached)return n&&e.credits?{state:`credits`,headline:`Usable on credits`,detail:`No window reading reached this surface, but ${on(e.credits)}.`,code:e.reason}:{state:`unknown`,headline:`No reading`,detail:en(e.reason,`No window percentage reached this surface for this account, so nothing here is a measurement.`),code:e.reason};let r=t.usedPercent,i=t.limitReached||r!==null&&r>=rn,a=Yt(t);return i?n&&e.credits?{state:`credits`,headline:`Usable on credits`,detail:`${a} is ${t.limitReached?`reported as limit reached`:`fully used`}, but ${on(e.credits)} — credits are independent of the window, so this account is not blocked.`,code:null}:{state:`exhausted`,headline:t.limitReached?`Limit reached`:`Window exhausted`,detail:t.limitReached?`The provider flagged ${a} as rate-limited. That flag is a denial, not a measurement, so no percentage is shown.`:`${a} is at ${w(r)} — it is the binding constraint on this account.`,code:null}:r>=nn?{state:`tight`,headline:`Running tight`,detail:`${a} is the binding constraint at ${w(r)}.`,code:null}:{state:`available`,headline:`Usable now`,detail:`${a} is the binding constraint at ${w(r)}.`,code:null}}function cn(e,t=null){let n=Qt(e),r=sn(e,n),i=e.provider,a=e.windows.filter(e=>e.id!==n?.id).map(e=>Zt(e)),o=n?Zt(n):null,s={state:e.state,authentication:e.authentication,health:e.health,reasonCode:e.reason,observedAt:e.observedAt,notes:e.notes,unsupported:e.unsupported};return{id:e.id,label:e.label,engine:i,color:B[i],plan:e.planType,verdict:r,allWindows:o?[o,...a]:a,evidence:s,hasDetail:e.windows.length>0||e.notes.length>0||e.credits!==null||e.reason!==null,binding:o,others:a,credits:e.credits,reconnectCommand:e.reconnectCommand,observedAt:e.observedAt,rank:tn[r.state],sourceNote:t}}function ln(e){if(!e)return[];let t=new Set;for(let n of e.accounts)for(let e of n.notes)t.add(e);return[...t]}function un(e){return e?e.accounts.map(e=>cn(e)).sort((e,t)=>e.rank-t.rank||e.label.localeCompare(t.label)):[]}function dn(e){if(!e)return null;let t=e.models.filter(e=>e.loaded),n=e.reachable?t.length===0?0:t.some(e=>e.sizeBytes===null)?null:t.reduce((e,t)=>e+(t.sizeBytes??0),0):null,r=e.memoryBudgetBytes,i=n!==null&&r!==null&&r>0?Math.max(0,Math.min(100,n/r*100)):null,a=e.reachable?t.length>0?{state:`available`,headline:`Resident now`,detail:`${t.length} model${t.length===1?``:`s`} already in memory — no load delay, no quota, no bill.`,code:null}:e.models.length>0?{state:`tight`,headline:`Installed, not loaded`,detail:`${e.models.length} model${e.models.length===1?` is`:`s are`} installed but nothing is resident, so the first turn pays a load.`,code:null}:{state:`unknown`,headline:`No models installed`,detail:`The runtime is reachable but reports no installed models.`,code:null}:{state:`unknown`,headline:`Runtime unreachable`,detail:`No local runtime answered, so neither resident nor installed models can be listed. This is an unanswered probe, not a report that the machine is empty.`,code:e.reason};return{residentCount:t.length,installedCount:e.models.length,residentBytes:n,memoryBudgetBytes:r,usedPct:i,tone:i===null?`ok`:H(i),verdict:a,color:B.local,rank:tn[a.state]}}var fn=`Per-account probes are unavailable on this server, so these cards are derived from the seat roster and the per-engine snapshots.`;function pn(e){let{seat:t,control:n,frontier:r,engineSeatCount:i}=e;if(t.engine===`local`)return null;let a=n?.subscriptionUsage?.find(e=>String(e.engine)===t.engine),o=r?.engines.find(e=>String(e.engine)===t.engine),s=ze({engine:t.engine,seat:t,subscription:a,frontier:o,engineSeatCount:i}),c=s.kind===`measured`?s.windows.map(e=>({id:e.id,label:e.label,usedPercent:e.usedPct,resetsAt:e.resetsAt===null?null:new Date(e.resetsAt*1e3).toISOString(),resetDescription:null,limitReached:!1,measured:!0})):[];return{account:{id:t.id,label:t.label,provider:t.engine,state:s.kind===`measured`?`observed`:`unavailable`,authentication:`unknown`,health:null,planType:a?.plan??null,observedAt:t.health.observedAt,windows:c,binding:null,credits:null,reason:s.kind===`measured`?null:s.reason,unsupported:null,reconnectCommand:null,notes:[]},sourceNote:s.kind===`measured`?`${Fe[s.source]}${s.scope===`engine`?` · engine-wide, shared by every account on this engine`:``}`:null}}function mn(e){let t=e.bootstrap?.seats??[],n=new Map;for(let e of t)n.set(e.engine,(n.get(e.engine)??0)+1);return t.map(t=>pn({seat:t,control:e.control,frontier:e.frontier,engineSeatCount:n.get(t.engine)??1})).filter(e=>e!==null).map(e=>cn(e.account,e.sourceNote)).sort((e,t)=>e.rank-t.rank||e.label.localeCompare(t.label))}function $(e){return e instanceof o&&e.status===401}function hn({title:e,body:t,action:n}){return(0,q.jsxs)(`div`,{className:K.stateBlock,role:`status`,children:[(0,q.jsx)(`p`,{className:K.stateTitle,children:e}),(0,q.jsx)(`p`,{className:K.stateBody,children:t}),n?(0,q.jsx)(`div`,{className:K.stateActions,children:n}):null]})}var gn=3e4,_n={gridColumn:`1 / -1`};function vn(e,t){(0,z.useEffect)(()=>{let n=null,r=()=>{n!==null&&clearInterval(n),n=null},i=()=>{let i=typeof document>`u`||document.visibilityState===`visible`;i&&n===null?n=setInterval(e,t):i||r()};return i(),document.addEventListener(`visibilitychange`,i),()=>{document.removeEventListener(`visibilitychange`,i),r()}},[e,t])}function yn(){let[e,t]=(0,z.useState)(`7d`),[n,o]=(0,z.useState)(null),l=s(Ce),u=s(ve),d=s(xe(e)),f=s(Te),p=s(ee),m=s(be),h=s(re),g=r(Ce),_=r(ve),v=r(xe(e)),y=r(Te),b=r(ee),ne=r(be),S=r(re),C=a(Ce),ie=a(ve);vn(C,gn),vn(ie,gn);let w=()=>{g(),_(),v(),y(),b(),ne(),S()},T=(0,z.useMemo)(()=>l.data?.available?Se(l.data.raw):null,[l.data]),E=(0,z.useMemo)(()=>u.data?.available?we(u.data.raw):null,[u.data]),ae=(0,z.useMemo)(()=>d.data?.available?ye(d.data.raw,e):null,[d.data,e]),D=(0,z.useMemo)(()=>m.data?m.data.available?Ge(m.data.raw,m.data.reason):Ke(m.data.reason??`Configured caps unavailable.`):Ke(`Configured caps not loaded yet.`),[m.data]),se=T===null,O=(0,z.useMemo)(()=>T?un(T):mn({bootstrap:h.data,control:p.data,frontier:f.data}),[T,h.data,p.data,f.data]),k=(0,z.useMemo)(()=>ke(E),[E]),A=(0,z.useMemo)(()=>dn(E),[E]),de=(0,z.useMemo)(()=>ln(T),[T]),fe=(0,z.useMemo)(()=>{let e=O.map(e=>({key:e.id,rank:e.rank,label:e.label,kind:`account`,card:e}));return A&&e.push({key:`local`,rank:A.rank,label:`Local`,kind:`local`,card:A}),e.sort((e,t)=>e.rank-t.rank||e.label.localeCompare(t.label))},[O,A]),pe=(0,z.useMemo)(()=>ue({cards:O,localCard:A,localView:k}),[O,A,k]),me=(0,z.useMemo)(()=>Oe(k?.runtimes??[]),[k]),j=ce(),M=(0,z.useMemo)(()=>new Set(O.map(e=>e.id)),[O]),N=(0,z.useMemo)(()=>new Map(j.seats.map(e=>[e.id,e.accountId])),[j.seats]),P=(0,z.useMemo)(()=>{if(n===null)return null;for(let[e,t]of N)if(t===n)return e;return null},[N,n]),he=(0,z.useCallback)(e=>{let t=N.get(e)??e;M.has(t)&&o(e=>e===t?null:t)},[N,M]),ge=e=>{o(t=>t===e?null:e)},_e=(0,z.useCallback)(()=>{let e=n;o(null),e!==null&&typeof document<`u`&&document.getElementById(`verse-account-trigger-${e}`)?.focus()},[n]),F=(0,z.useMemo)(()=>oe(h.data?.sessions??[],h.data?.seats??[]),[h.data]),Ee=h.data?null:h.status===`error`?`The chat list could not be read${h.error?.message?` (${h.error.message})`:``}, so efficiency cannot be computed.`:`Reading the chat list…`,I=(0,z.useMemo)(()=>Be(p.data?.usage),[p.data]),De=(0,z.useMemo)(()=>Ve(p.data?.limits,D.foundryLimits),[p.data,D.foundryLimits]),L=(0,z.useMemo)(()=>Ue(p.data?.daemonObservation),[p.data]),Ae=D.available?D.todaySpentUsd:p.data?.daemon.todaySpentUsd??null,je=D.available?D.todaySpentDate:null,R=$(l.error)||$(u.error)||$(d.error)||$(f.error)||$(p.error)||$(h.error),B=!R&&f.status===`error`&&p.status===`error`&&f.data===void 0&&p.data===void 0,Me=!R&&!B&&l.data===void 0&&f.data===void 0&&p.data===void 0&&(l.status===`loading`||l.status===`idle`||f.status===`loading`||p.status===`loading`||f.status===`idle`||p.status===`idle`),Ne=l.status===`refreshing`||f.status===`refreshing`||p.status===`refreshing`,Pe=T?.sampledAt??f.data?.generatedAt??p.data?.ts??null;return(0,q.jsxs)(`section`,{className:K.section,"aria-label":`Usage`,children:[(0,q.jsxs)(`header`,{className:K.header,"data-app-region":`drag`,children:[(0,q.jsx)(`h2`,{className:K.headerTitle,children:`Usage`}),(0,q.jsxs)(`div`,{className:K.headerMeta,children:[Pe?(0,q.jsxs)(`span`,{children:[Ne?`refreshing · `:``,`as of `,new Date(Pe).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})]}):null,(0,q.jsx)(`button`,{type:`button`,className:K.ghostButton,onClick:w,children:`Refresh`})]})]}),(0,q.jsx)(`div`,{className:K.scroll,children:R?(0,q.jsx)(hn,{title:`Read session expired`,body:`Usage data needs an authenticated read session. Unlock the console with the read token ashlr verse printed, then refresh.`,action:(0,q.jsx)(`button`,{type:`button`,className:K.ghostButton,onClick:w,children:`Try again`})}):B?(0,q.jsx)(hn,{title:`Usage sources unreachable`,body:`Neither /api/usage nor /api/control answered. ${p.error?.message??f.error?.message??``}`.trim(),action:(0,q.jsx)(`button`,{type:`button`,className:K.ghostButton,onClick:w,children:`Retry`})}):Me?(0,q.jsxs)(`div`,{"aria-busy":`true`,children:[(0,q.jsx)(i,{width:`30%`}),(0,q.jsx)(`div`,{className:K.skeletonGrid,style:{marginTop:`var(--space-4)`},children:(0,q.jsx)(c,{count:5})})]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(le,{seats:j.seats,health:j.health,budget:j.budget,selectedSeatId:P,onSelectSeat:he}),(0,q.jsx)(nt,{overview:pe}),(0,q.jsxs)(`section`,{className:K.panel,"aria-labelledby":`verse-usage-accounts`,children:[(0,q.jsxs)(`div`,{className:K.panelHead,children:[(0,q.jsx)(`h3`,{id:`verse-usage-accounts`,className:K.panelTitle,children:`Accounts`}),(0,q.jsx)(`p`,{className:K.panelNote,children:`Ordered by what you can use right now. Each card leads with its binding constraint — the window with the highest used percent, because that is what blocks work.`})]}),se&&l.data&&!l.data.available?(0,q.jsxs)(`p`,{className:K.muted,children:[l.data.reason,` `,fn]}):null,T?.collectorNote?(0,q.jsx)(`p`,{className:K.muted,children:T.collectorNote}):null,de.length>0?(0,q.jsx)(`ul`,{className:K.noteList,children:de.map(e=>(0,q.jsx)(`li`,{className:K.muted,children:e},e))}):null,O.length===0&&A===null?(0,q.jsx)(`p`,{className:K.muted,children:`No accounts and no local runtime were reported. Connect an account or start Ollama, then refresh — this is an empty roster, not a set of accounts at zero.`}):(0,q.jsx)(q.Fragment,{children:(0,q.jsx)(`div`,{className:K.cards,children:fe.map(e=>{if(e.kind!==`account`)return(0,q.jsx)(It,{card:e.card,staleness:me},e.key);let t=n===e.key;return(0,q.jsxs)(z.Fragment,{children:[(0,q.jsx)(Xe,{card:e.card,onOpen:ge,expanded:t,triggerId:`verse-account-trigger-${e.key}`,detailId:`verse-account-detail-${e.key}`}),t?(0,q.jsx)(`div`,{id:`verse-account-detail-${e.key}`,style:_n,children:(0,q.jsx)(et,{card:e.card,headingId:`verse-account-heading-${e.key}`,onClose:_e})}):null]},e.key)})})})]}),(0,q.jsx)(Rt,{view:k}),(0,q.jsx)(Wt,{series:ae,window:e,onWindowChange:t,unavailableReason:d.data&&!d.data.available?d.data.reason:null,loading:d.status===`loading`||d.status===`idle`}),(0,q.jsx)(at,{rows:F,unavailableReason:Ee}),I?(0,q.jsx)(wt,{split:I,savingsNote:ut}):(0,q.jsxs)(`section`,{className:K.panel,"aria-labelledby":`verse-usage-split-missing`,children:[(0,q.jsx)(`div`,{className:K.panelHead,children:(0,q.jsx)(`h3`,{id:`verse-usage-split-missing`,className:K.panelTitle,children:`Local vs cloud`})}),(0,q.jsx)(`div`,{className:K.tiles,children:(0,q.jsx)(x,{label:`Not spent (ran locally)`,value:(0,q.jsx)(`span`,{className:K.num,children:`unknown`}),caption:`/api/control did not answer, so the split is unavailable`})})]}),(0,q.jsx)(qt,{}),(0,q.jsx)(st,{rows:De,capsNote:D.available?null:D.reason}),(0,q.jsx)(Kt,{series:L,todaySpentUsd:Ae,todaySpentDate:je,dailyBudgetUsd:D.dailyBudgetUsd,showSeries:ae===null}),D.available&&D.subscriptionMaxPercent!==null?(0,q.jsxs)(`p`,{className:K.muted,children:[`Subscription throttle threshold is`,` `,(0,q.jsx)(`span`,{className:K.num,children:te(D.subscriptionMaxPercent/100)}),`. It only applies to engines that publish a real window reading — no seat is ever throttled on a guess.`]}):null]})})]})}export{yn as UsageSection};
|
|
2
|
-
//# sourceMappingURL=UsageSection-CqxRGJ40.js.map
|