@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
package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js.map → git-model-_BnI_Ogh.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-model-bk_RXh3y.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/git/git-queries.ts","../../../../../../src/web-ui/routes/verse/git/git-model.ts"],"sourcesContent":["/**\n * routes/verse/git/git-queries.ts — the page's side of `/api/verse/git*`\n * (unit C5; server: core/verse/git-api.ts).\n *\n * Reads are plain fetches, not cache entries: a branch's state is stale the\n * moment a turn commits, and the bar and pane each own their own freshness\n * (poll while visible; re-read after every action).\n *\n * WHY a GET helper of its own instead of data/client.ts `apiGet`: the git\n * routes answer \"not a repository\" (404) and \"not a folder Verse knows\"\n * (409) with a CODE the bar acts on — it drops that root instead of showing\n * an error — and apiGet discards the body of a failed read.\n *\n * Mutations go through the held mutation token exactly like every other\n * Verse write (verse-queries.ts): no token → VerseMutationLockedError, which\n * the caller's token gate turns into the unlock dialog.\n */\nimport { ApiError, apiPost } from '../../../data/client.js';\nimport { getMutationToken, getReadClientProof, reportSessionExpired, touchMutationHold } from '../../../data/auth-store.js';\nimport type {\n VerseGitActionResponse,\n VerseGitCommitRequest,\n VerseGitDiffResponse,\n VerseGitDiffScope,\n VerseGitMergeRequest,\n VerseGitPrRequest,\n VerseGitWorktreeResponse,\n} from '../../../data/api-types.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\nimport type { GitStatusView } from './git-model.js';\n\nexport const GIT_API = '/api/verse/git';\n\n/** Codes that mean \"this root has no bar\", not \"something broke\". */\nexport const GIT_ROOT_UNAVAILABLE_CODES: ReadonlySet<string> = new Set(['VERSE_GIT_NOT_A_REPO', 'VERSE_GIT_REFUSED']);\n\nasync function gitGet<T>(path: string, signal?: AbortSignal): Promise<T> {\n const res = await fetch(path, {\n method: 'GET',\n credentials: 'same-origin',\n headers: { 'x-ashlr-read-client': getReadClientProof() },\n signal,\n });\n if (res.status === 401) {\n reportSessionExpired();\n throw new ApiError('Read session expired.', 401, path);\n }\n if (!res.ok) {\n let detail: string | null = null;\n let code: string | null = null;\n try {\n const body = (await res.json()) as { error?: unknown; code?: unknown };\n detail = typeof body.error === 'string' && body.error ? body.error : null;\n code = typeof body.code === 'string' && body.code ? body.code : null;\n } catch {\n /* not JSON */\n }\n throw new ApiError(`GET ${path} failed (HTTP ${res.status}).`, res.status, path, detail, code);\n }\n return (await res.json()) as T;\n}\n\nexport function fetchGitStatus(root: string, signal?: AbortSignal): Promise<GitStatusView> {\n return gitGet<GitStatusView>(`${GIT_API}/status?root=${encodeURIComponent(root)}`, signal);\n}\n\nexport interface GitDiffView extends VerseGitDiffResponse {\n /** Size of the whole patch before the 256 KB cut; null when no file was asked. */\n patchBytes?: number | null;\n}\n\nexport function fetchGitDiff(root: string, scope: VerseGitDiffScope, file: string | null, signal?: AbortSignal): Promise<GitDiffView> {\n const params = new URLSearchParams({ root, scope });\n if (file !== null) params.set('file', file);\n return gitGet<GitDiffView>(`${GIT_API}/diff?${params.toString()}`, signal);\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nexport function commitGit(req: VerseGitCommitRequest): Promise<VerseGitActionResponse> {\n return post(`${GIT_API}/commit`, req);\n}\n\nexport function pushGit(root: string): Promise<VerseGitActionResponse> {\n return post(`${GIT_API}/push`, { root });\n}\n\nexport function openGitPr(req: VerseGitPrRequest): Promise<VerseGitActionResponse> {\n return post(`${GIT_API}/pr`, req);\n}\n\nexport function mergeGitPr(req: VerseGitMergeRequest): Promise<VerseGitActionResponse> {\n return post(`${GIT_API}/pr/merge`, req);\n}\n\nexport function createGitWorktree(root: string, name: string): Promise<VerseGitWorktreeResponse> {\n return post(`${GIT_API}/worktree`, { root, name });\n}\n\n/** True for a failed read that means \"no bar for this root\" rather than an error to show. */\nexport function isRootUnavailable(err: unknown): boolean {\n return err instanceof ApiError && err.code !== null && GIT_ROOT_UNAVAILABLE_CODES.has(err.code);\n}\n","/**\n * routes/verse/git/git-model.ts — the branch bar's and Review pane's words\n * and decisions, as pure functions (unit C5; SPEC-310C §2, §3).\n *\n * Kept apart from the components so the copy, the suggested-action labels and\n * the menu's disabled reasons are tested as a table, and so the bar's chunk\n * stays small (no React here, no DOM).\n *\n * Copy rules (DESIGN §13.8): operator language with units; \"—\" for a value\n * that was not measured; a state is always a WORD beside any colour or icon.\n */\nimport type {\n VerseGitDiffFile,\n VerseGitPr,\n VerseGitStatus,\n VerseGitSuggestedAction,\n} from '../../../data/api-types.js';\nimport type { VerseGitCheckCounts, VerseGitPrLookup, VerseGitStatusDetail } from '../../../../core/verse/workbench-types.js';\n\n// ---------------------------------------------------------------------------\n// Wire additions the server sends beyond the frozen VerseGitStatus — contract\n// now (workbench-types.ts §7 VerseGitStatusDetail). Optional HERE, so an\n// older server that omits them still renders; the names alias the contract\n// so the two can never drift.\n// ---------------------------------------------------------------------------\n\nexport type GitPrLookup = VerseGitPrLookup;\nexport type GitCheckCounts = VerseGitCheckCounts;\n\nexport interface GitStatusView extends VerseGitStatus, Partial<Omit<VerseGitStatusDetail, keyof VerseGitStatus>> {}\n\n// ---------------------------------------------------------------------------\n// Numbers\n// ---------------------------------------------------------------------------\n\nconst NUMBER = new Intl.NumberFormat('en-US');\n\n/** 35079 → \"35,079\". */\nexport function formatCount(n: number): string {\n return NUMBER.format(Math.max(0, Math.round(n)));\n}\n\n/** \"+35,079 −1,074\" — a real minus sign, grouped digits. */\nexport function diffstatText(additions: number, deletions: number): string {\n return `+${formatCount(additions)} −${formatCount(deletions)}`;\n}\n\n/** The ± counts as a screen reader should hear them. */\nexport function diffstatLabel(files: number, additions: number, deletions: number): string {\n return `${formatCount(files)} ${files === 1 ? 'file' : 'files'} changed, ${formatCount(additions)} added, ${formatCount(deletions)} removed`;\n}\n\n// ---------------------------------------------------------------------------\n// Rows\n// ---------------------------------------------------------------------------\n\n/** A root earns a bar row when there is something to do or to see. */\nexport function hasBranchActivity(s: GitStatusView): boolean {\n if (s.dirty > 0 || s.ahead > 0 || s.diffstat.files > 0) return true;\n if (s.pr && (s.pr.state === 'open' || s.pr.state === 'draft')) return true;\n return false;\n}\n\n/**\n * One row per repository: two chat roots inside the same repo would show the\n * same branch twice. The first root (the chat's priority order) keeps the row.\n */\nexport function dedupeByRepo<T extends GitStatusView>(statuses: readonly T[]): T[] {\n const seen = new Set<string>();\n const out: T[] = [];\n for (const s of statuses) {\n const key = s.gitRoot ?? s.root;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(s);\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// The primary button\n// ---------------------------------------------------------------------------\n\nexport interface PrimaryAction {\n action: Exclude<VerseGitSuggestedAction, 'none'>;\n label: string;\n /** What the click will do, in one sentence (tooltip + accessible description). */\n disclosure: string;\n}\n\nexport function primaryAction(s: GitStatusView): PrimaryAction | null {\n const branch = s.branch ?? 'HEAD';\n const base = s.base ?? 'the default branch';\n switch (s.suggested) {\n case 'commit':\n return { action: 'commit', label: 'Commit', disclosure: `Commit ${formatCount(s.dirty)} changed ${s.dirty === 1 ? 'file' : 'files'} on ${branch}.` };\n case 'push':\n return {\n action: 'push',\n label: 'Push',\n disclosure: s.upstream\n ? `Push ${formatCount(s.ahead)} ${s.ahead === 1 ? 'commit' : 'commits'} on ${branch} to ${s.upstream}.`\n : `Publish ${branch} to origin.`,\n };\n case 'create-pr':\n return {\n action: 'create-pr',\n label: 'Create PR',\n disclosure: `Open a pull request from ${branch} into ${base}${s.upstream === null || s.ahead > 0 ? ', pushing it first' : ''}.`,\n };\n case 'merge':\n return s.pr\n ? { action: 'merge', label: 'Merge', disclosure: `Squash-merge #${s.pr.number} into ${s.pr.baseRef || base}. Checks passed.` }\n : null;\n case 'view-pr':\n return s.pr ? { action: 'view-pr', label: 'View PR', disclosure: `Open #${s.pr.number} on GitHub.` } : null;\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// The ▾ menu (every item present; disabled WITH a reason, never hidden)\n// ---------------------------------------------------------------------------\n\nexport type MenuActionId = 'draft-pr' | 'commit' | 'push' | 'open-github' | 'copy-branch' | 'review';\n\nexport interface MenuItem {\n id: MenuActionId;\n label: string;\n disabledReason: string | null;\n}\n\nexport function menuItems(s: GitStatusView): MenuItem[] {\n const detached = s.branch === null;\n const onBase = s.branch !== null && s.base !== null && s.branch === s.base;\n const conflicts = (s.conflicts ?? 0) > 0;\n const openPr = s.pr !== null && (s.pr.state === 'open' || s.pr.state === 'draft');\n const draftReason = detached\n ? 'HEAD is detached'\n : onBase\n ? `You are on ${s.base}`\n : openPr\n ? `#${s.pr!.number} is already open`\n : s.prLookup === 'unavailable'\n ? 'GitHub is not reachable (is `gh` signed in?)'\n : null;\n return [\n { id: 'draft-pr', label: 'Create draft PR…', disabledReason: draftReason },\n {\n id: 'commit',\n label: 'Commit…',\n disabledReason: detached ? 'HEAD is detached' : conflicts ? 'Resolve the conflicts first' : s.dirty === 0 ? 'Nothing to commit' : null,\n },\n {\n id: 'push',\n label: s.upstream ? 'Push' : 'Publish branch',\n disabledReason: detached ? 'HEAD is detached' : s.upstream !== null && s.ahead === 0 ? 'Already pushed' : s.headSha === null ? 'No commits yet' : null,\n },\n { id: 'open-github', label: 'Open on GitHub', disabledReason: s.pr ? null : 'No pull request for this branch' },\n { id: 'copy-branch', label: 'Copy branch name', disabledReason: detached ? 'HEAD is detached' : null },\n { id: 'review', label: 'Review changes', disabledReason: s.diffstat.files === 0 && s.dirty === 0 ? 'No changes' : null },\n ];\n}\n\n// ---------------------------------------------------------------------------\n// PR chip\n// ---------------------------------------------------------------------------\n\nexport type PrTone = 'success' | 'danger' | 'warning' | 'running' | 'neutral' | 'merged';\n\nexport interface PrChipModel {\n /** \"#463\" */\n number: string;\n title: string;\n /** \"Open\", \"Draft\", \"Merged\", \"Closed\". */\n state: string;\n /** \"checks passing\", \"2 of 9 checks failing\", \"checks running\", \"no checks\", null. */\n checks: string | null;\n tone: PrTone;\n /** Everything above in one sentence, for the accessible name. */\n label: string;\n}\n\nexport function prChip(pr: VerseGitPr, counts: GitCheckCounts | null | undefined): PrChipModel {\n const state = pr.state === 'open' ? 'Open' : pr.state === 'draft' ? 'Draft' : pr.state === 'merged' ? 'Merged' : 'Closed';\n let checks: string | null = null;\n let tone: PrTone = 'neutral';\n if (pr.state === 'merged') {\n tone = 'merged';\n } else if (pr.state === 'closed') {\n tone = 'neutral';\n } else {\n switch (pr.checks) {\n case 'passing':\n checks = counts && counts.total > 0 ? `${counts.passed}/${counts.total} checks passed` : 'checks passed';\n tone = pr.mergeable === false ? 'danger' : 'success';\n break;\n case 'failing':\n checks = counts ? `${counts.failed} of ${counts.total} checks failing` : 'checks failing';\n tone = 'danger';\n break;\n case 'pending':\n checks = counts ? `${counts.pending} of ${counts.total} checks running` : 'checks running';\n tone = 'running';\n break;\n case 'none':\n checks = 'no checks';\n break;\n default:\n checks = 'checks —';\n }\n if (pr.mergeable === false) checks = checks ? `${checks}, conflicts` : 'conflicts';\n }\n const label = [`Pull request #${pr.number}`, pr.title, state, checks].filter(Boolean).join(', ');\n return { number: `#${pr.number}`, title: pr.title, state, checks, tone, label };\n}\n\n// ---------------------------------------------------------------------------\n// PR dialog defaults\n// ---------------------------------------------------------------------------\n\n/**\n * A PR title from the branch: the last commit's subject when there is one\n * (it is usually the best one-line summary), else the branch name made\n * readable (`feat/branch-bar` → \"Branch bar\").\n */\nexport function defaultPrTitle(s: GitStatusView): string {\n const subject = s.headSubject?.trim();\n if (subject) return subject;\n const leaf = (s.branch ?? '').split('/').pop() ?? '';\n const words = leaf.replace(/[-_]+/g, ' ').trim();\n return words ? words[0]!.toUpperCase() + words.slice(1) : '';\n}\n\n// ---------------------------------------------------------------------------\n// Merge: the head the operator confirmed\n// ---------------------------------------------------------------------------\n\n/**\n * What the Merge dialog showed when it opened. WHY a snapshot: the bar\n * re-polls git status every 10 s, and the server's `--match-head-commit`\n * guard only protects the SHA the CLIENT sends. If the dialog followed the\n * live poll, a commit pushed while it was open (and whose CI went green\n * before the click) would be merged under a confirmation the operator gave\n * for a different head. So the dialog pins the PR at open, asserts only what\n * that pin verified, and submits the pinned SHA — never the latest poll's.\n */\nexport interface PinnedMerge {\n number: number;\n title: string;\n headSha: string | null;\n headRef: string;\n baseRef: string;\n checks: VerseGitPr['checks'];\n mergeable: boolean | null;\n counts: GitCheckCounts | null;\n}\n\nexport function pinMerge(s: GitStatusView): PinnedMerge | null {\n const pr = s.pr;\n if (!pr) return null;\n return {\n number: pr.number,\n title: pr.title,\n headSha: pr.headSha,\n headRef: pr.headRef || s.branch || '',\n baseRef: pr.baseRef || s.base || '',\n checks: pr.checks,\n mergeable: pr.mergeable,\n counts: s.prCheckCounts ?? null,\n };\n}\n\n/**\n * The \"Head abc1234, 9/9 checks passed, no conflicts.\" fact, built ONLY from\n * what the pinned read verified for that SHA: \"checks passed\" needs\n * `checks === 'passing'`, \"no conflicts\" needs `mergeable === true`. Anything\n * else says what is actually known (running, failing, not reported, GitHub\n * still computing mergeability) instead of the reassuring default.\n */\nexport function mergeHeadFact(pin: PinnedMerge): { sha: string; detail: string; text: string; verified: boolean } {\n const sha = pin.headSha ? pin.headSha.slice(0, 7) : '—';\n const c = pin.counts;\n let checks: string;\n switch (pin.checks) {\n case 'passing':\n checks = c && c.total > 0 ? `${c.passed}/${c.total} checks passed` : 'checks passed';\n break;\n case 'failing':\n checks = c && c.total > 0 ? `${c.failed} of ${c.total} checks failing` : 'checks failing';\n break;\n case 'pending':\n checks = c && c.total > 0 ? `${c.pending} of ${c.total} checks still running` : 'checks still running';\n break;\n case 'none':\n checks = 'no checks reported';\n break;\n default:\n checks = 'checks not known';\n }\n const conflicts = pin.mergeable === true ? 'no conflicts' : pin.mergeable === false ? 'has conflicts' : 'GitHub has not finished checking for conflicts';\n const detail = `${checks}, ${conflicts}.`;\n return { sha, detail, text: `Head ${sha}, ${detail}`, verified: pin.checks === 'passing' && pin.mergeable === true && pin.headSha !== null };\n}\n\n/**\n * Why Merge must stay disabled for this pin against the latest poll, or null\n * when the live PR is still exactly what the dialog showed. A different head\n * (or PR, or a PR that is gone/closed) means the operator has not reviewed\n * what would merge; a regression in checks or mergeability on the SAME head\n * means the server's own suggestion no longer stands.\n */\nexport function mergeDrift(pin: PinnedMerge, live: GitStatusView | null): string | null {\n const pr = live?.pr ?? null;\n // A draft cannot be merged (the server refuses it), so \"open\" is the only live state that keeps the pin valid.\n if (!pr || pr.number !== pin.number || pr.state !== 'open') {\n return `#${pin.number} is no longer an open, ready pull request — close this and check the branch bar.`;\n }\n if (pr.headSha !== pin.headSha) return 'The PR changed since you opened this — new commits landed. Close and reopen to review the new head.';\n if (pr.checks !== 'passing') return 'Checks on this head are no longer passing — close and reopen once they are.';\n if (pr.mergeable !== true) return 'GitHub no longer reports this head as mergeable — close and reopen to review.';\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Review pane: file tree\n// ---------------------------------------------------------------------------\n\nexport interface FileGroup {\n /** \"src/core/verse\", or \"\" for the repository root. */\n dir: string;\n files: Array<VerseGitDiffFile & { name: string }>;\n}\n\n/** Files grouped by directory, in path order — a flat, scannable tree. */\nexport function groupFiles(files: readonly VerseGitDiffFile[]): FileGroup[] {\n const groups = new Map<string, FileGroup>();\n const sorted = [...files].sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));\n for (const f of sorted) {\n const cut = f.path.lastIndexOf('/');\n const dir = cut === -1 ? '' : f.path.slice(0, cut);\n const name = cut === -1 ? f.path : f.path.slice(cut + 1);\n let g = groups.get(dir);\n if (!g) {\n g = { dir, files: [] };\n groups.set(dir, g);\n }\n g.files.push({ ...f, name });\n }\n return [...groups.values()];\n}\n\nexport const FILE_STATUS_WORD: Record<VerseGitDiffFile['status'], string> = {\n M: 'modified',\n A: 'added',\n D: 'deleted',\n R: 'renamed',\n U: 'conflicted',\n};\n\n// ---------------------------------------------------------------------------\n// Review comments → a message draft\n// ---------------------------------------------------------------------------\n\nexport interface ReviewComment {\n id: string;\n path: string;\n /** The file's line number (new side; old side for a deleted line). */\n line: number;\n side: 'new' | 'old';\n note: string;\n}\n\n/**\n * `path:line: note`, one per line (SPEC-310C §3), in file then line order so\n * the agent reads them top to bottom. A multi-line note keeps its line breaks,\n * indented under its anchor so each comment stays one visual block. A comment\n * on a deleted line says so — its number is the OLD file's.\n */\nexport function commentsToMessage(comments: readonly ReviewComment[]): string {\n const sorted = [...comments].sort((a, b) => (a.path === b.path ? a.line - b.line : a.path < b.path ? -1 : 1));\n return sorted\n .map((c) => {\n const [first, ...rest] = c.note.trim().split('\\n');\n const anchor = `${c.path}:${c.line}${c.side === 'old' ? ' (removed line)' : ''}`;\n return [`${anchor}: ${first ?? ''}`, ...rest.map((l) => ` ${l}`)].join('\\n');\n })\n .join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Errors → one sentence\n// ---------------------------------------------------------------------------\n\n/** What the page says when a git action fails. The server's sentence when it wrote one. */\nexport function describeGitError(err: unknown): string {\n if (err && typeof err === 'object') {\n const e = err as { name?: string; status?: number; detail?: string | null; code?: string | null; message?: string };\n if (e.name === 'DispatchDisabledError') return 'This server is read-only (started without dispatch), so git actions are off.';\n if (e.name === 'VerseMutationLockedError') return 'Unlock actions with the mutation token first.';\n if (e.status === 401) return 'The mutation token was rejected. Unlock again with the token `ashlr verse` printed.';\n if (e.detail) return e.detail;\n if (e.status === 404) return 'This server has no git routes yet. Update Ashlr and restart `ashlr verse`.';\n if (e.status === 409) return 'Git is busy in this repository. Try again in a moment.';\n }\n return 'The git action failed. The terminal will show why.';\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git-model-_BnI_Ogh.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/git/git-queries.ts","../../../../../../src/web-ui/routes/verse/git/git-model.ts"],"sourcesContent":["/**\n * routes/verse/git/git-queries.ts — the page's side of `/api/verse/git*`\n * (unit C5; server: core/verse/git-api.ts).\n *\n * Reads are plain fetches, not cache entries: a branch's state is stale the\n * moment a turn commits, and the bar and pane each own their own freshness\n * (poll while visible; re-read after every action).\n *\n * WHY a GET helper of its own instead of data/client.ts `apiGet`: the git\n * routes answer \"not a repository\" (404) and \"not a folder Verse knows\"\n * (409) with a CODE the bar acts on — it drops that root instead of showing\n * an error — and apiGet discards the body of a failed read.\n *\n * Mutations go through the held mutation token exactly like every other\n * Verse write (verse-queries.ts): no token → VerseMutationLockedError, which\n * the caller's token gate turns into the unlock dialog.\n */\nimport { ApiError, apiPost } from '../../../data/client.js';\nimport { getMutationToken, getReadClientProof, reportSessionExpired, touchMutationHold } from '../../../data/auth-store.js';\nimport type {\n VerseGitActionResponse,\n VerseGitCommitRequest,\n VerseGitDiffResponse,\n VerseGitDiffScope,\n VerseGitMergeRequest,\n VerseGitPrRequest,\n VerseGitWorktreeResponse,\n} from '../../../data/api-types.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\nimport type { GitStatusView } from './git-model.js';\n\nexport const GIT_API = '/api/verse/git';\n\n/** Codes that mean \"this root has no bar\", not \"something broke\". */\nexport const GIT_ROOT_UNAVAILABLE_CODES: ReadonlySet<string> = new Set(['VERSE_GIT_NOT_A_REPO', 'VERSE_GIT_REFUSED']);\n\nasync function gitGet<T>(path: string, signal?: AbortSignal): Promise<T> {\n const res = await fetch(path, {\n method: 'GET',\n credentials: 'same-origin',\n headers: { 'x-ashlr-read-client': getReadClientProof() },\n signal,\n });\n if (res.status === 401) {\n reportSessionExpired();\n throw new ApiError('Read session expired.', 401, path);\n }\n if (!res.ok) {\n let detail: string | null = null;\n let code: string | null = null;\n try {\n const body = (await res.json()) as { error?: unknown; code?: unknown };\n detail = typeof body.error === 'string' && body.error ? body.error : null;\n code = typeof body.code === 'string' && body.code ? body.code : null;\n } catch {\n /* not JSON */\n }\n throw new ApiError(`GET ${path} failed (HTTP ${res.status}).`, res.status, path, detail, code);\n }\n return (await res.json()) as T;\n}\n\nexport function fetchGitStatus(root: string, signal?: AbortSignal): Promise<GitStatusView> {\n return gitGet<GitStatusView>(`${GIT_API}/status?root=${encodeURIComponent(root)}`, signal);\n}\n\nexport interface GitDiffView extends VerseGitDiffResponse {\n /** Size of the whole patch before the 256 KB cut; null when no file was asked. */\n patchBytes?: number | null;\n}\n\nexport function fetchGitDiff(root: string, scope: VerseGitDiffScope, file: string | null, signal?: AbortSignal): Promise<GitDiffView> {\n const params = new URLSearchParams({ root, scope });\n if (file !== null) params.set('file', file);\n return gitGet<GitDiffView>(`${GIT_API}/diff?${params.toString()}`, signal);\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nexport function commitGit(req: VerseGitCommitRequest): Promise<VerseGitActionResponse> {\n return post(`${GIT_API}/commit`, req);\n}\n\nexport function pushGit(root: string): Promise<VerseGitActionResponse> {\n return post(`${GIT_API}/push`, { root });\n}\n\nexport function openGitPr(req: VerseGitPrRequest): Promise<VerseGitActionResponse> {\n return post(`${GIT_API}/pr`, req);\n}\n\nexport function mergeGitPr(req: VerseGitMergeRequest): Promise<VerseGitActionResponse> {\n return post(`${GIT_API}/pr/merge`, req);\n}\n\nexport function createGitWorktree(root: string, name: string): Promise<VerseGitWorktreeResponse> {\n return post(`${GIT_API}/worktree`, { root, name });\n}\n\n/** True for a failed read that means \"no bar for this root\" rather than an error to show. */\nexport function isRootUnavailable(err: unknown): boolean {\n return err instanceof ApiError && err.code !== null && GIT_ROOT_UNAVAILABLE_CODES.has(err.code);\n}\n","/**\n * routes/verse/git/git-model.ts — the branch bar's and Review pane's words\n * and decisions, as pure functions (unit C5; SPEC-310C §2, §3).\n *\n * Kept apart from the components so the copy, the suggested-action labels and\n * the menu's disabled reasons are tested as a table, and so the bar's chunk\n * stays small (no React here, no DOM).\n *\n * Copy rules (DESIGN §13.8): operator language with units; \"—\" for a value\n * that was not measured; a state is always a WORD beside any colour or icon.\n */\nimport type {\n VerseGitDiffFile,\n VerseGitPr,\n VerseGitStatus,\n VerseGitSuggestedAction,\n} from '../../../data/api-types.js';\nimport type { VerseGitCheckCounts, VerseGitPrLookup, VerseGitStatusDetail } from '../../../../core/verse/workbench-types.js';\n\n// ---------------------------------------------------------------------------\n// Wire additions the server sends beyond the frozen VerseGitStatus — contract\n// now (workbench-types.ts §7 VerseGitStatusDetail). Optional HERE, so an\n// older server that omits them still renders; the names alias the contract\n// so the two can never drift.\n// ---------------------------------------------------------------------------\n\nexport type GitPrLookup = VerseGitPrLookup;\nexport type GitCheckCounts = VerseGitCheckCounts;\n\nexport interface GitStatusView extends VerseGitStatus, Partial<Omit<VerseGitStatusDetail, keyof VerseGitStatus>> {}\n\n// ---------------------------------------------------------------------------\n// Numbers\n// ---------------------------------------------------------------------------\n\nconst NUMBER = new Intl.NumberFormat('en-US');\n\n/** 35079 → \"35,079\". */\nexport function formatCount(n: number): string {\n return NUMBER.format(Math.max(0, Math.round(n)));\n}\n\n/** \"+35,079 −1,074\" — a real minus sign, grouped digits. */\nexport function diffstatText(additions: number, deletions: number): string {\n return `+${formatCount(additions)} −${formatCount(deletions)}`;\n}\n\n/** The ± counts as a screen reader should hear them. */\nexport function diffstatLabel(files: number, additions: number, deletions: number): string {\n return `${formatCount(files)} ${files === 1 ? 'file' : 'files'} changed, ${formatCount(additions)} added, ${formatCount(deletions)} removed`;\n}\n\n// ---------------------------------------------------------------------------\n// Rows\n// ---------------------------------------------------------------------------\n\n/** A root earns a bar row when there is something to do or to see. */\nexport function hasBranchActivity(s: GitStatusView): boolean {\n if (s.dirty > 0 || s.ahead > 0 || s.diffstat.files > 0) return true;\n if (s.pr && (s.pr.state === 'open' || s.pr.state === 'draft')) return true;\n return false;\n}\n\n/**\n * One row per repository: two chat roots inside the same repo would show the\n * same branch twice. The first root (the chat's priority order) keeps the row.\n */\nexport function dedupeByRepo<T extends GitStatusView>(statuses: readonly T[]): T[] {\n const seen = new Set<string>();\n const out: T[] = [];\n for (const s of statuses) {\n const key = s.gitRoot ?? s.root;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(s);\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// The primary button\n// ---------------------------------------------------------------------------\n\nexport interface PrimaryAction {\n action: Exclude<VerseGitSuggestedAction, 'none'>;\n label: string;\n /** What the click will do, in one sentence (tooltip + accessible description). */\n disclosure: string;\n}\n\nexport function primaryAction(s: GitStatusView): PrimaryAction | null {\n const branch = s.branch ?? 'HEAD';\n const base = s.base ?? 'the default branch';\n switch (s.suggested) {\n case 'commit':\n return { action: 'commit', label: 'Commit', disclosure: `Commit ${formatCount(s.dirty)} changed ${s.dirty === 1 ? 'file' : 'files'} on ${branch}.` };\n case 'push':\n return {\n action: 'push',\n label: 'Push',\n disclosure: s.upstream\n ? `Push ${formatCount(s.ahead)} ${s.ahead === 1 ? 'commit' : 'commits'} on ${branch} to ${s.upstream}.`\n : `Publish ${branch} to origin.`,\n };\n case 'create-pr':\n return {\n action: 'create-pr',\n label: 'Create PR',\n disclosure: `Open a pull request from ${branch} into ${base}${s.upstream === null || s.ahead > 0 ? ', pushing it first' : ''}.`,\n };\n case 'merge':\n return s.pr\n ? { action: 'merge', label: 'Merge', disclosure: `Squash-merge #${s.pr.number} into ${s.pr.baseRef || base}. Checks passed.` }\n : null;\n case 'view-pr':\n return s.pr ? { action: 'view-pr', label: 'View PR', disclosure: `Open #${s.pr.number} on GitHub.` } : null;\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// The ▾ menu (every item present; disabled WITH a reason, never hidden)\n// ---------------------------------------------------------------------------\n\nexport type MenuActionId = 'draft-pr' | 'commit' | 'push' | 'open-github' | 'copy-branch' | 'review';\n\nexport interface MenuItem {\n id: MenuActionId;\n label: string;\n disabledReason: string | null;\n}\n\nexport function menuItems(s: GitStatusView): MenuItem[] {\n const detached = s.branch === null;\n const onBase = s.branch !== null && s.base !== null && s.branch === s.base;\n const conflicts = (s.conflicts ?? 0) > 0;\n const openPr = s.pr !== null && (s.pr.state === 'open' || s.pr.state === 'draft');\n const draftReason = detached\n ? 'HEAD is detached'\n : onBase\n ? `You are on ${s.base}`\n : openPr\n ? `#${s.pr!.number} is already open`\n : s.prLookup === 'unavailable'\n ? 'GitHub is not reachable (is `gh` signed in?)'\n : null;\n return [\n { id: 'draft-pr', label: 'Create draft PR…', disabledReason: draftReason },\n {\n id: 'commit',\n label: 'Commit…',\n disabledReason: detached ? 'HEAD is detached' : conflicts ? 'Resolve the conflicts first' : s.dirty === 0 ? 'Nothing to commit' : null,\n },\n {\n id: 'push',\n label: s.upstream ? 'Push' : 'Publish branch',\n disabledReason: detached ? 'HEAD is detached' : s.upstream !== null && s.ahead === 0 ? 'Already pushed' : s.headSha === null ? 'No commits yet' : null,\n },\n { id: 'open-github', label: 'Open on GitHub', disabledReason: s.pr ? null : 'No pull request for this branch' },\n { id: 'copy-branch', label: 'Copy branch name', disabledReason: detached ? 'HEAD is detached' : null },\n { id: 'review', label: 'Review changes', disabledReason: s.diffstat.files === 0 && s.dirty === 0 ? 'No changes' : null },\n ];\n}\n\n// ---------------------------------------------------------------------------\n// PR chip\n// ---------------------------------------------------------------------------\n\nexport type PrTone = 'success' | 'danger' | 'warning' | 'running' | 'neutral' | 'merged';\n\nexport interface PrChipModel {\n /** \"#463\" */\n number: string;\n title: string;\n /** \"Open\", \"Draft\", \"Merged\", \"Closed\". */\n state: string;\n /** \"checks passing\", \"2 of 9 checks failing\", \"checks running\", \"no checks\", null. */\n checks: string | null;\n tone: PrTone;\n /** Everything above in one sentence, for the accessible name. */\n label: string;\n}\n\nexport function prChip(pr: VerseGitPr, counts: GitCheckCounts | null | undefined): PrChipModel {\n const state = pr.state === 'open' ? 'Open' : pr.state === 'draft' ? 'Draft' : pr.state === 'merged' ? 'Merged' : 'Closed';\n let checks: string | null = null;\n let tone: PrTone = 'neutral';\n if (pr.state === 'merged') {\n tone = 'merged';\n } else if (pr.state === 'closed') {\n tone = 'neutral';\n } else {\n switch (pr.checks) {\n case 'passing':\n checks = counts && counts.total > 0 ? `${counts.passed}/${counts.total} checks passed` : 'checks passed';\n tone = pr.mergeable === false ? 'danger' : 'success';\n break;\n case 'failing':\n checks = counts ? `${counts.failed} of ${counts.total} checks failing` : 'checks failing';\n tone = 'danger';\n break;\n case 'pending':\n checks = counts ? `${counts.pending} of ${counts.total} checks running` : 'checks running';\n tone = 'running';\n break;\n case 'none':\n checks = 'no checks';\n break;\n default:\n checks = 'checks —';\n }\n if (pr.mergeable === false) checks = checks ? `${checks}, conflicts` : 'conflicts';\n }\n const label = [`Pull request #${pr.number}`, pr.title, state, checks].filter(Boolean).join(', ');\n return { number: `#${pr.number}`, title: pr.title, state, checks, tone, label };\n}\n\n// ---------------------------------------------------------------------------\n// PR dialog defaults\n// ---------------------------------------------------------------------------\n\n/**\n * A PR title from the branch: the last commit's subject when there is one\n * (it is usually the best one-line summary), else the branch name made\n * readable (`feat/branch-bar` → \"Branch bar\").\n */\nexport function defaultPrTitle(s: GitStatusView): string {\n const subject = s.headSubject?.trim();\n if (subject) return subject;\n const leaf = (s.branch ?? '').split('/').pop() ?? '';\n const words = leaf.replace(/[-_]+/g, ' ').trim();\n return words ? words[0]!.toUpperCase() + words.slice(1) : '';\n}\n\n// ---------------------------------------------------------------------------\n// Merge: the head the operator confirmed\n// ---------------------------------------------------------------------------\n\n/**\n * What the Merge dialog showed when it opened. WHY a snapshot: the bar\n * re-polls git status every 10 s, and the server's `--match-head-commit`\n * guard only protects the SHA the CLIENT sends. If the dialog followed the\n * live poll, a commit pushed while it was open (and whose CI went green\n * before the click) would be merged under a confirmation the operator gave\n * for a different head. So the dialog pins the PR at open, asserts only what\n * that pin verified, and submits the pinned SHA — never the latest poll's.\n */\nexport interface PinnedMerge {\n number: number;\n title: string;\n headSha: string | null;\n headRef: string;\n baseRef: string;\n checks: VerseGitPr['checks'];\n mergeable: boolean | null;\n counts: GitCheckCounts | null;\n}\n\nexport function pinMerge(s: GitStatusView): PinnedMerge | null {\n const pr = s.pr;\n if (!pr) return null;\n return {\n number: pr.number,\n title: pr.title,\n headSha: pr.headSha,\n headRef: pr.headRef || s.branch || '',\n baseRef: pr.baseRef || s.base || '',\n checks: pr.checks,\n mergeable: pr.mergeable,\n counts: s.prCheckCounts ?? null,\n };\n}\n\n/**\n * The \"Head abc1234, 9/9 checks passed, no conflicts.\" fact, built ONLY from\n * what the pinned read verified for that SHA: \"checks passed\" needs\n * `checks === 'passing'`, \"no conflicts\" needs `mergeable === true`. Anything\n * else says what is actually known (running, failing, not reported, GitHub\n * still computing mergeability) instead of the reassuring default.\n */\nexport function mergeHeadFact(pin: PinnedMerge): { sha: string; detail: string; text: string; verified: boolean } {\n const sha = pin.headSha ? pin.headSha.slice(0, 7) : '—';\n const c = pin.counts;\n let checks: string;\n switch (pin.checks) {\n case 'passing':\n checks = c && c.total > 0 ? `${c.passed}/${c.total} checks passed` : 'checks passed';\n break;\n case 'failing':\n checks = c && c.total > 0 ? `${c.failed} of ${c.total} checks failing` : 'checks failing';\n break;\n case 'pending':\n checks = c && c.total > 0 ? `${c.pending} of ${c.total} checks still running` : 'checks still running';\n break;\n case 'none':\n checks = 'no checks reported';\n break;\n default:\n checks = 'checks not known';\n }\n const conflicts = pin.mergeable === true ? 'no conflicts' : pin.mergeable === false ? 'has conflicts' : 'GitHub has not finished checking for conflicts';\n const detail = `${checks}, ${conflicts}.`;\n return { sha, detail, text: `Head ${sha}, ${detail}`, verified: pin.checks === 'passing' && pin.mergeable === true && pin.headSha !== null };\n}\n\n/**\n * Why Merge must stay disabled for this pin against the latest poll, or null\n * when the live PR is still exactly what the dialog showed. A different head\n * (or PR, or a PR that is gone/closed) means the operator has not reviewed\n * what would merge; a regression in checks or mergeability on the SAME head\n * means the server's own suggestion no longer stands.\n */\nexport function mergeDrift(pin: PinnedMerge, live: GitStatusView | null): string | null {\n const pr = live?.pr ?? null;\n // A draft cannot be merged (the server refuses it), so \"open\" is the only live state that keeps the pin valid.\n if (!pr || pr.number !== pin.number || pr.state !== 'open') {\n return `#${pin.number} is no longer an open, ready pull request — close this and check the branch bar.`;\n }\n if (pr.headSha !== pin.headSha) return 'The PR changed since you opened this — new commits landed. Close and reopen to review the new head.';\n if (pr.checks !== 'passing') return 'Checks on this head are no longer passing — close and reopen once they are.';\n if (pr.mergeable !== true) return 'GitHub no longer reports this head as mergeable — close and reopen to review.';\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Review pane: file tree\n// ---------------------------------------------------------------------------\n\nexport interface FileGroup {\n /** \"src/core/verse\", or \"\" for the repository root. */\n dir: string;\n files: Array<VerseGitDiffFile & { name: string }>;\n}\n\n/** Files grouped by directory, in path order — a flat, scannable tree. */\nexport function groupFiles(files: readonly VerseGitDiffFile[]): FileGroup[] {\n const groups = new Map<string, FileGroup>();\n const sorted = [...files].sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));\n for (const f of sorted) {\n const cut = f.path.lastIndexOf('/');\n const dir = cut === -1 ? '' : f.path.slice(0, cut);\n const name = cut === -1 ? f.path : f.path.slice(cut + 1);\n let g = groups.get(dir);\n if (!g) {\n g = { dir, files: [] };\n groups.set(dir, g);\n }\n g.files.push({ ...f, name });\n }\n return [...groups.values()];\n}\n\nexport const FILE_STATUS_WORD: Record<VerseGitDiffFile['status'], string> = {\n M: 'modified',\n A: 'added',\n D: 'deleted',\n R: 'renamed',\n U: 'conflicted',\n};\n\n// ---------------------------------------------------------------------------\n// Review comments → a message draft\n// ---------------------------------------------------------------------------\n\nexport interface ReviewComment {\n id: string;\n path: string;\n /** The file's line number (new side; old side for a deleted line). */\n line: number;\n side: 'new' | 'old';\n note: string;\n}\n\n/**\n * `path:line: note`, one per line (SPEC-310C §3), in file then line order so\n * the agent reads them top to bottom. A multi-line note keeps its line breaks,\n * indented under its anchor so each comment stays one visual block. A comment\n * on a deleted line says so — its number is the OLD file's.\n */\nexport function commentsToMessage(comments: readonly ReviewComment[]): string {\n const sorted = [...comments].sort((a, b) => (a.path === b.path ? a.line - b.line : a.path < b.path ? -1 : 1));\n return sorted\n .map((c) => {\n const [first, ...rest] = c.note.trim().split('\\n');\n const anchor = `${c.path}:${c.line}${c.side === 'old' ? ' (removed line)' : ''}`;\n return [`${anchor}: ${first ?? ''}`, ...rest.map((l) => ` ${l}`)].join('\\n');\n })\n .join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Errors → one sentence\n// ---------------------------------------------------------------------------\n\n/** What the page says when a git action fails. The server's sentence when it wrote one. */\nexport function describeGitError(err: unknown): string {\n if (err && typeof err === 'object') {\n const e = err as { name?: string; status?: number; detail?: string | null; code?: string | null; message?: string };\n if (e.name === 'DispatchDisabledError') return 'This server is read-only (started without dispatch), so git actions are off.';\n if (e.name === 'VerseMutationLockedError') return 'Unlock actions with the mutation token first.';\n if (e.status === 401) return 'The mutation token was rejected. Unlock again with the token `ashlr verse` printed.';\n if (e.detail) return e.detail;\n if (e.status === 404) return 'This server has no git routes yet. Update Ashlr and restart `ashlr verse`.';\n if (e.status === 409) return 'Git is busy in this repository. Try again in a moment.';\n }\n return 'The git action failed. The terminal will show why.';\n}\n"],"mappings":"8HA+BA,IAAa,EAAU,iBAGV,EAAkD,IAAI,IAAI,CAAC,uBAAwB,mBAAmB,CAAC,EAEpH,eAAe,EAAU,EAAc,EAAkC,CACvE,IAAM,EAAM,MAAM,MAAM,EAAM,CAC5B,OAAQ,MACR,YAAa,cACb,QAAS,CAAE,sBAAuB,EAAmB,CAAE,EACvD,QACF,CAAC,EACD,GAAI,EAAI,SAAW,IAEjB,MADA,EAAqB,EACf,IAAI,EAAS,wBAAyB,IAAK,CAAI,EAEvD,GAAI,CAAC,EAAI,GAAI,CACX,IAAI,EAAwB,KACxB,EAAsB,KAC1B,GAAI,CACF,IAAM,EAAQ,MAAM,EAAI,KAAK,EAC7B,EAAS,OAAO,EAAK,OAAU,UAAY,EAAK,MAAQ,EAAK,MAAQ,KACrE,EAAO,OAAO,EAAK,MAAS,UAAY,EAAK,KAAO,EAAK,KAAO,IAClE,MAAQ,CAER,CACA,MAAM,IAAI,EAAS,OAAO,EAAK,gBAAgB,EAAI,OAAO,IAAK,EAAI,OAAQ,EAAM,EAAQ,CAAI,CAC/F,CACA,OAAQ,MAAM,EAAI,KAAK,CACzB,CAEA,SAAgB,EAAe,EAAc,EAA8C,CACzF,OAAO,EAAsB,GAAG,EAAQ,eAAe,mBAAmB,CAAI,IAAK,CAAM,CAC3F,CAOA,SAAgB,EAAa,EAAc,EAA0B,EAAqB,EAA4C,CACpI,IAAM,EAAS,IAAI,gBAAgB,CAAE,OAAM,OAAM,CAAC,EAElD,OADI,IAAS,MAAM,EAAO,IAAI,OAAQ,CAAI,EACnC,EAAoB,GAAG,EAAQ,QAAQ,EAAO,SAAS,IAAK,CAAM,CAC3E,CAEA,eAAe,EAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAEA,SAAgB,EAAU,EAA6D,CACrF,OAAO,EAAK,GAAG,EAAQ,SAAU,CAAG,CACtC,CAEA,SAAgB,EAAQ,EAA+C,CACrE,OAAO,EAAK,GAAG,EAAQ,OAAQ,CAAE,MAAK,CAAC,CACzC,CAEA,SAAgB,EAAU,EAAyD,CACjF,OAAO,EAAK,GAAG,EAAQ,KAAM,CAAG,CAClC,CAEA,SAAgB,EAAW,EAA4D,CACrF,OAAO,EAAK,GAAG,EAAQ,WAAY,CAAG,CACxC,CAEA,SAAgB,EAAkB,EAAc,EAAiD,CAC/F,OAAO,EAAK,GAAG,EAAQ,WAAY,CAAE,OAAM,MAAK,CAAC,CACnD,CAGA,SAAgB,EAAkB,EAAuB,CACvD,OAAO,aAAe,GAAY,EAAI,OAAS,MAAQ,EAA2B,IAAI,EAAI,IAAI,CAChG,CCzEA,IAAM,EAAS,IAAI,KAAK,aAAa,OAAO,EAG5C,SAAgB,EAAY,EAAmB,CAC7C,OAAO,EAAO,OAAO,KAAK,IAAI,EAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CACjD,CAGA,SAAgB,EAAa,EAAmB,EAA2B,CACzE,MAAO,IAAI,EAAY,CAAS,EAAE,IAAI,EAAY,CAAS,GAC7D,CAGA,SAAgB,EAAc,EAAe,EAAmB,EAA2B,CACzF,MAAO,GAAG,EAAY,CAAK,EAAE,GAAG,IAAU,EAAI,OAAS,QAAQ,YAAY,EAAY,CAAS,EAAE,UAAU,EAAY,CAAS,EAAE,SACrI,CAOA,SAAgB,EAAkB,EAA2B,CAG3D,MADA,GADI,EAAE,MAAQ,GAAK,EAAE,MAAQ,GAAK,EAAE,SAAS,MAAQ,GACjD,EAAE,KAAO,EAAE,GAAG,QAAU,QAAU,EAAE,GAAG,QAAU,SAEvD,CAMA,SAAgB,EAAsC,EAA6B,CACjF,IAAM,EAAO,IAAI,IACX,EAAW,CAAC,EAClB,IAAK,IAAM,KAAK,EAAU,CACxB,IAAM,EAAM,EAAE,SAAW,EAAE,KACvB,EAAK,IAAI,CAAG,IAChB,EAAK,IAAI,CAAG,EACZ,EAAI,KAAK,CAAC,EACZ,CACA,OAAO,CACT,CAaA,SAAgB,EAAc,EAAwC,CACpE,IAAM,EAAS,EAAE,QAAU,OACrB,EAAO,EAAE,MAAQ,qBACvB,OAAQ,EAAE,UAAV,CACE,IAAK,SACH,MAAO,CAAE,OAAQ,SAAU,MAAO,SAAU,WAAY,UAAU,EAAY,EAAE,KAAK,EAAE,WAAW,EAAE,QAAU,EAAI,OAAS,QAAQ,MAAM,EAAO,EAAG,EACrJ,IAAK,OACH,MAAO,CACL,OAAQ,OACR,MAAO,OACP,WAAY,EAAE,SACV,QAAQ,EAAY,EAAE,KAAK,EAAE,GAAG,EAAE,QAAU,EAAI,SAAW,UAAU,MAAM,EAAO,MAAM,EAAE,SAAS,GACnG,WAAW,EAAO,YACxB,EACF,IAAK,YACH,MAAO,CACL,OAAQ,YACR,MAAO,YACP,WAAY,4BAA4B,EAAO,QAAQ,IAAO,EAAE,WAAa,MAAQ,EAAE,MAAQ,EAAI,qBAAuB,GAAG,EAC/H,EACF,IAAK,QACH,OAAO,EAAE,GACL,CAAE,OAAQ,QAAS,MAAO,QAAS,WAAY,iBAAiB,EAAE,GAAG,OAAO,QAAQ,EAAE,GAAG,SAAW,EAAK,iBAAkB,EAC3H,KACN,IAAK,UACH,OAAO,EAAE,GAAK,CAAE,OAAQ,UAAW,MAAO,UAAW,WAAY,SAAS,EAAE,GAAG,OAAO,YAAa,EAAI,KACzG,QACE,OAAO,IACX,CACF,CAcA,SAAgB,EAAU,EAA8B,CACtD,IAAM,EAAW,EAAE,SAAW,KACxB,EAAS,EAAE,SAAW,MAAQ,EAAE,OAAS,MAAQ,EAAE,SAAW,EAAE,KAChE,GAAa,EAAE,WAAa,GAAK,EACjC,EAAS,EAAE,KAAO,OAAS,EAAE,GAAG,QAAU,QAAU,EAAE,GAAG,QAAU,SAUzE,MAAO,CACL,CAAE,GAAI,WAAY,MAAO,mBAAoB,eAV3B,EAChB,mBACA,EACE,cAAc,EAAE,OAChB,EACE,IAAI,EAAE,GAAI,OAAO,kBACjB,EAAE,WAAa,cACb,+CACA,IAEiE,EACzE,CACE,GAAI,SACJ,MAAO,UACP,eAAgB,EAAW,mBAAqB,EAAY,8BAAgC,EAAE,QAAU,EAAI,oBAAsB,IACpI,EACA,CACE,GAAI,OACJ,MAAO,EAAE,SAAW,OAAS,iBAC7B,eAAgB,EAAW,mBAAqB,EAAE,WAAa,MAAQ,EAAE,QAAU,EAAI,iBAAmB,EAAE,UAAY,KAAO,iBAAmB,IACpJ,EACA,CAAE,GAAI,cAAe,MAAO,iBAAkB,eAAgB,EAAE,GAAK,KAAO,iCAAkC,EAC9G,CAAE,GAAI,cAAe,MAAO,mBAAoB,eAAgB,EAAW,mBAAqB,IAAK,EACrG,CAAE,GAAI,SAAU,MAAO,iBAAkB,eAAgB,EAAE,SAAS,QAAU,GAAK,EAAE,QAAU,EAAI,aAAe,IAAK,CACzH,CACF,CAqBA,SAAgB,EAAO,EAAgB,EAAwD,CAC7F,IAAM,EAAQ,EAAG,QAAU,OAAS,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,SAAW,SAAW,SAC7G,EAAwB,KACxB,EAAe,UACnB,GAAI,EAAG,QAAU,SACf,EAAO,cACF,GAAI,EAAG,QAAU,SACtB,EAAO,cACF,CACL,OAAQ,EAAG,OAAX,CACE,IAAK,UACH,EAAS,GAAU,EAAO,MAAQ,EAAI,GAAG,EAAO,OAAO,GAAG,EAAO,MAAM,gBAAkB,gBACzF,EAAO,EAAG,YAAc,GAAQ,SAAW,UAC3C,MACF,IAAK,UACH,EAAS,EAAS,GAAG,EAAO,OAAO,MAAM,EAAO,MAAM,iBAAmB,iBACzE,EAAO,SACP,MACF,IAAK,UACH,EAAS,EAAS,GAAG,EAAO,QAAQ,MAAM,EAAO,MAAM,iBAAmB,iBAC1E,EAAO,UACP,MACF,IAAK,OACH,EAAS,YACT,MACF,QACE,EAAS,UACb,CACI,EAAG,YAAc,KAAO,EAAS,EAAS,GAAG,EAAO,aAAe,YACzE,CACA,IAAM,EAAQ,CAAC,iBAAiB,EAAG,SAAU,EAAG,MAAO,EAAO,CAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI,EAC/F,MAAO,CAAE,OAAQ,IAAI,EAAG,SAAU,MAAO,EAAG,MAAO,QAAO,SAAQ,OAAM,OAAM,CAChF,CAWA,SAAgB,EAAe,EAA0B,CACvD,IAAM,EAAU,EAAE,aAAa,KAAK,EACpC,GAAI,EAAS,OAAO,EAEpB,IAAM,IADQ,EAAE,QAAU,GAAA,CAAI,MAAM,GAAG,CAAC,CAAC,IAAI,GAAK,GAAA,CAC/B,QAAQ,SAAU,GAAG,CAAC,CAAC,KAAK,EAC/C,OAAO,EAAQ,EAAM,EAAE,CAAE,YAAY,EAAI,EAAM,MAAM,CAAC,EAAI,EAC5D,CA0BA,SAAgB,EAAS,EAAsC,CAC7D,IAAM,EAAK,EAAE,GAEb,OADK,EACE,CACL,OAAQ,EAAG,OACX,MAAO,EAAG,MACV,QAAS,EAAG,QACZ,QAAS,EAAG,SAAW,EAAE,QAAU,GACnC,QAAS,EAAG,SAAW,EAAE,MAAQ,GACjC,OAAQ,EAAG,OACX,UAAW,EAAG,UACd,OAAQ,EAAE,eAAiB,IAC7B,EAVgB,IAWlB,CASA,SAAgB,EAAc,EAAoF,CAChH,IAAM,EAAM,EAAI,QAAU,EAAI,QAAQ,MAAM,EAAG,CAAC,EAAI,IAC9C,EAAI,EAAI,OACV,EACJ,OAAQ,EAAI,OAAZ,CACE,IAAK,UACH,EAAS,GAAK,EAAE,MAAQ,EAAI,GAAG,EAAE,OAAO,GAAG,EAAE,MAAM,gBAAkB,gBACrE,MACF,IAAK,UACH,EAAS,GAAK,EAAE,MAAQ,EAAI,GAAG,EAAE,OAAO,MAAM,EAAE,MAAM,iBAAmB,iBACzE,MACF,IAAK,UACH,EAAS,GAAK,EAAE,MAAQ,EAAI,GAAG,EAAE,QAAQ,MAAM,EAAE,MAAM,uBAAyB,uBAChF,MACF,IAAK,OACH,EAAS,qBACT,MACF,QACE,EAAS,kBACb,CACA,IAAM,EAAY,EAAI,YAAc,GAAO,eAAiB,EAAI,YAAc,GAAQ,gBAAkB,iDAClG,EAAS,GAAG,EAAO,IAAI,EAAU,GACvC,MAAO,CAAE,MAAK,SAAQ,KAAM,QAAQ,EAAI,IAAI,IAAU,SAAU,EAAI,SAAW,WAAa,EAAI,YAAc,IAAQ,EAAI,UAAY,IAAK,CAC7I,CASA,SAAgB,EAAW,EAAkB,EAA2C,CACtF,IAAM,EAAK,GAAM,IAAM,KAQvB,MANI,CAAC,GAAM,EAAG,SAAW,EAAI,QAAU,EAAG,QAAU,OAC3C,IAAI,EAAI,OAAO,kFAEpB,EAAG,UAAY,EAAI,QACnB,EAAG,SAAW,UACd,EAAG,YAAc,GACd,KAD2B,gFADE,8EADG,qGAIzC,CAaA,SAAgB,EAAW,EAAiD,CAC1E,IAAM,EAAS,IAAI,IACb,EAAS,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,EAAG,IAAO,EAAE,KAAO,EAAE,KAAO,GAAK,IAAE,KAAO,EAAE,KAAa,EACzF,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAM,EAAE,KAAK,YAAY,GAAG,EAC5B,EAAM,IAAQ,GAAK,GAAK,EAAE,KAAK,MAAM,EAAG,CAAG,EAC3C,EAAO,IAAQ,GAAK,EAAE,KAAO,EAAE,KAAK,MAAM,EAAM,CAAC,EACnD,EAAI,EAAO,IAAI,CAAG,EACjB,IACH,EAAI,CAAE,MAAK,MAAO,CAAC,CAAE,EACrB,EAAO,IAAI,EAAK,CAAC,GAEnB,EAAE,MAAM,KAAK,CAAE,GAAG,EAAG,MAAK,CAAC,CAC7B,CACA,MAAO,CAAC,GAAG,EAAO,OAAO,CAAC,CAC5B,CAEA,IAAa,EAA+D,CAC1E,EAAG,WACH,EAAG,QACH,EAAG,UACH,EAAG,UACH,EAAG,YACL,EAqBA,SAAgB,EAAkB,EAA4C,CAE5E,MADe,CAAC,GAAG,CAAQ,CAAC,CAAC,MAAM,EAAG,IAAO,EAAE,OAAS,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,GAAK,CACnG,CAAA,CACJ,IAAK,GAAM,CACV,GAAM,CAAC,EAAO,GAAG,GAAQ,EAAE,KAAK,KAAK,CAAC,CAAC,MAAM;CAAI,EAEjD,MAAO,CAAC,GAAG,GADO,EAAE,KAAK,GAAG,EAAE,OAAO,EAAE,OAAS,MAAQ,kBAAoB,KAC1D,IAAI,GAAS,KAAM,GAAG,EAAK,IAAK,GAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK;CAAI,CAC9E,CAAC,CAAC,CACD,KAAK;CAAI,CACd,CAOA,SAAgB,EAAiB,EAAsB,CACrD,GAAI,GAAO,OAAO,GAAQ,SAAU,CAClC,IAAM,EAAI,EACV,GAAI,EAAE,OAAS,wBAAyB,MAAO,+EAC/C,GAAI,EAAE,OAAS,2BAA4B,MAAO,gDAClD,GAAI,EAAE,SAAW,IAAK,MAAO,sFAC7B,GAAI,EAAE,OAAQ,OAAO,EAAE,OACvB,GAAI,EAAE,SAAW,IAAK,MAAO,6EAC7B,GAAI,EAAE,SAAW,IAAK,MAAO,wDAC/B,CACA,MAAO,oDACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,c as t,n,r}from"./index-QesfXBsb.js";var i=t(e(),1),a={data:void 0,error:void 0,status:`idle`,updatedAt:null},o=new Map,s=0,c=[],l=0,u=0;function ee(){--s;let e=c.shift();e&&e()}function te(e){let t=()=>{let t=u;s+=1,s>l&&(l=s);let n=()=>{t===u&&ee()},r;try{r=e()}catch(e){return n(),Promise.reject(e instanceof Error?e:Error(String(e)))}return r.then(e=>(n(),e),e=>{throw n(),e})};return s<4?t():new Promise((e,n)=>{c.push(()=>{t().then(e,n)})})}function ne(){u+=1,s=0,l=0;for(let e of c.splice(0))e()}function re(){return{active:s,queued:c.length,peak:l}}function d(e){let t=o.get(e);return t||(t={snapshot:a,inFlight:null,fetcher:null,subscribers:new Set,issued:0,issuedAt:0,applied:0},o.set(e,t)),t}function f(e,t){e.snapshot={...e.snapshot,...t}}function p(e){let t=o.get(e);if(t)for(let e of t.subscribers)e()}function m(e,t){if(Object.is(e,t))return!0;if(typeof e!=typeof t||e===null||t===null||typeof e!=`object`||Array.isArray(e)!==Array.isArray(t))return!1;if(Array.isArray(e)&&Array.isArray(t))return e.length===t.length&&e.every((e,n)=>m(e,t[n]));let n=e,r=t,i=Object.keys(n);return i.length===Object.keys(r).length&&i.every(e=>Object.prototype.hasOwnProperty.call(r,e)&&m(n[e],r[e]))}function ie(e,t){let n=d(e);return n.subscribers.add(t),()=>{n.subscribers.delete(t)}}function ae(e){return d(e).snapshot}function oe(e,t){return e.snapshot.updatedAt===null||e.snapshot.status===`error`?!1:Date.now()-e.snapshot.updatedAt<t}function se(e,t){return e.inFlight===null?!1:t.joinWindowMs===void 0||Date.now()-e.issuedAt<t.joinWindowMs}function ce(e,t,n){let r=d(e);if(r.fetcher=t,!n.force){if(se(r,n))return r.inFlight;if(n.maxAgeMs!==void 0&&oe(r,n.maxAgeMs))return Promise.resolve()}let i=r.issued+=1;r.issuedAt=Date.now(),f(r,{status:r.snapshot.data===void 0?`loading`:`refreshing`}),p(e);let a=te(t).then(e=>{if(i<r.applied)return;r.applied=i;let t=r.snapshot.data!==void 0&&m(r.snapshot.data,e);f(r,{data:t?r.snapshot.data:e,error:void 0,status:`success`,updatedAt:Date.now()})}).catch(e=>{i<r.applied||(r.applied=i,f(r,{error:e instanceof Error?e:Error(String(e)),status:`error`}))}).finally(()=>{r.issued===i&&(r.inFlight=null),p(e)});return r.inFlight=a,a}function le(e,t){return ce(e,t,{})}function ue(e,t,n){return ce(e,t,{maxAgeMs:n})}function h(e,t,n=!1){return ce(e,t,n?{force:!0}:{joinWindowMs:250})}function g(e){let t=o.get(e);t&&t.fetcher&&le(e,t.fetcher)}function _(e){for(let t of o.keys())t.startsWith(e)&&g(t)}function de(e){for(let[t,n]of o)n.subscribers.size>0&&t.startsWith(e)&&g(t)}function fe(e,t){t.snapshot=a,t.fetcher=null,t.inFlight=null,t.issued+=1,t.applied=t.issued,p(e)}function pe(){ne();for(let[e,t]of[...o]){if(t.subscribers.size===0){o.delete(e);continue}fe(e,t)}}var v=`ashlr.verse.drafts.v1`,y=`ashlr.verse.sent.v1`,me=40,b=65536;function x(e,t){let n={};try{let r=localStorage.getItem(e),i=r?JSON.parse(r):null;if(i&&typeof i==`object`&&!Array.isArray(i))for(let[e,r]of Object.entries(i)){let i=t(r);i!==null&&(n[e]=i)}}catch{}return n}function S(e,t){let n=Object.keys(t);for(let e of n.slice(0,Math.max(0,n.length-me)))delete t[e];try{return localStorage.setItem(e,JSON.stringify(t)),!0}catch{return!1}}var C=e=>typeof e==`string`&&e.length>0?e.slice(0,b):null,he=e=>{if(!Array.isArray(e))return null;let t=e.filter(e=>typeof e==`string`&&e.length>0).slice(-25).map(e=>e.slice(0,b));return t.length>0?t:null},w=new Map;function ge(e){if(!e)return``;let t=w.get(e);return t===void 0?x(v,C)[e]??``:t}function _e(e,t){if(!e)return;let n=t.trim().length>0?t.slice(0,b):``,r=x(v,C);if(delete r[e],n&&(r[e]=n),w.delete(e),!S(v,r)){w.set(e,n);for(let e of[...w.keys()].slice(0,Math.max(0,w.size-me)))w.delete(e)}}function ve(e){return e?x(y,he)[e]??[]:[]}function ye(e,t){if(!e||t.trim().length===0)return;let n=x(y,he),r=n[e]??[];delete n[e],n[e]=(r[r.length-1]===t?r:[...r,t.slice(0,b)]).slice(-25),S(y,n)}function be(e){if(e){w.delete(e);for(let[t,n]of[[v,C],[y,he]]){let r=x(t,n);e in r&&(delete r[e],S(t,r))}}}function xe(){w.clear();for(let e of[v,y])try{localStorage.removeItem(e)}catch{}}var Se=`ashlr.readClientProof.v1`,Ce=/^[a-f0-9]{64}$/,we=12e5;function Te(){let e=new Uint8Array(32);return crypto.getRandomValues(e),Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``)}function Ee(){try{let e=sessionStorage.getItem(Se);if(e&&Ce.test(e))return e}catch{}let e=Te();try{sessionStorage.setItem(Se,e)}catch{}return e}var De=Ee(),T=null,E=null,Oe=!1,D=null,O=null,k=null,A={phase:`checking`,checked:!1,mutationTokenHeldUntil:null},j=new Set;function ke(){for(let e of j)e()}function M(e){A={...A,...e},ke()}function N(e){return j.add(e),()=>j.delete(e)}function P(){return A}function F(){return De}async function I(e){let t=e.trim();if(!/^[a-f0-9]{64}$/.test(t))throw Error(`That does not look like a read token — expected 64 hex characters.`);let n=await fetch(`/api/session`,{method:`POST`,credentials:`same-origin`,headers:{"x-ashlr-token":t,"x-ashlr-read-client":De}});if(n.status===204){D=t,M({phase:`authenticated`,checked:!0});return}throw n.status===401?Error(`Server rejected that token. Double-check the read token printed by this server at startup.`):Error(`Unexpected response establishing session (HTTP ${n.status}).`)}async function Ae(){try{await fetch(`/api/session`,{method:`DELETE`,credentials:`same-origin`,headers:{"x-ashlr-read-client":De}})}catch{}D=null,k=null,L()}function L(){V(),pe(),xe(),M({phase:`unauthenticated`,checked:!0})}function R(){if(A.phase===`authenticated`){if(D){je();return}L()}}function je(){if(O)return O;let e=D;return e?(O=(async()=>{try{return await I(e),de(``),!0}catch{return D=null,k=null,L(),!1}finally{O=null}})(),O):Promise.resolve(!1)}function Me(e){M({phase:e?`authenticated`:`unauthenticated`,checked:!0})}function Ne(){let e=window.__ASHLR_TOKENS__;if(e&&typeof e==`object`){try{delete window.__ASHLR_TOKENS__}catch{window.__ASHLR_TOKENS__=void 0}typeof e.readToken==`string`&&(k={readToken:e.readToken,...typeof e.token==`string`?{token:e.token}:{}})}return k?{...k}:null}async function Pe(){let e=Ne();if(!e)return!1;try{await I(e.readToken)}catch{return k=null,!1}return e.token&&/^[a-f0-9]{64}$/.test(e.token.trim())&&z(e.token.trim(),{host:!0}),!0}function Fe(){return T}function Ie(){return T!==null}function Le(){E&&clearTimeout(E),E=setTimeout(()=>{Oe&&T!==null?B():V()},we)}function z(e,t={}){T=e,Oe=t.host===!0,M({mutationTokenHeldUntil:Date.now()+we}),Le()}function B(){T!==null&&(M({mutationTokenHeldUntil:Date.now()+we}),Le())}function V(){T=null,Oe=!1,E&&=(clearTimeout(E),null),M({mutationTokenHeldUntil:null})}var Re=[`runs`,`swarms`,`inbox`,`daemon`,`daemon-observation`,`fleet-activity-ping`,`fleet-activity-observation`,`snapshot`,`session-expired`],ze={runs:[`runs`],swarms:[`swarms`],inbox:[`inbox`],daemon:[`daemon`,`control-snapshot`,`verse-control`,`verse-usage-control`,`verse-caps`],"daemon-observation":[`daemon`,`control-snapshot`,`verse-control`,`verse-usage-control`,`verse-caps`],"fleet-activity-ping":[`fleet-activity`,`fleet`],"fleet-activity-observation":[`fleet-activity`,`fleet`],snapshot:[`dashboard-snapshot`,`agent-os-snapshot`],"session-expired":[]},Be=new Map,H=null,U=null,W=0;function Ve(){return Math.min(1e3*2**W,15e3)}function G(){H&&=(H.close(),null),U&&=(clearTimeout(U),null)}function He(){U||=setTimeout(()=>{U=null,W+=1,Ue()},Ve())}function Ue(){if(r()){G();return}if(P().phase!==`authenticated`)return;G();let e=`/api/events?client=${encodeURIComponent(F())}`,t=new EventSource(e,{withCredentials:!0});H=t,t.onopen=()=>{W=0};for(let e of Re)t.addEventListener(e,t=>{let n=t,r;try{r=JSON.parse(n.data)}catch{r=void 0}for(let t of ze[e])g(t);e===`inbox`&&(_(`inbox-list:`),_(`proposal-detail-`)),e===`session-expired`&&R();let i=Be.get(e);if(i)for(let e of i)e(r)});t.onerror=()=>{t.close(),H===t&&(H=null),P().phase===`authenticated`&&He()}}N(()=>{P().phase===`authenticated`?(W=0,Ue()):G()});var We=`ashlr.theme.v1`;function Ge(e){let t=document.documentElement;e===`system`?t.removeAttribute(`data-theme`):t.setAttribute(`data-theme`,e)}function Ke(){try{let e=localStorage.getItem(We);if(e===`light`||e===`dark`||e===`system`)return e}catch{}return`system`}var K=Ke();Ge(K);var qe=new Set;function Je(){for(let e of qe)e()}function Ye(e){return qe.add(e),()=>qe.delete(e)}function q(){return K}function J(e){K=e,Ge(K);try{localStorage.setItem(We,K)}catch{}Je()}function Xe(){J(K===`system`?`light`:K===`light`?`dark`:`system`)}var Ze=`ashlr.verse.appearance.v1`,Qe=30,$e=78,Y={h:245,s:72,l:58};function et(){try{return typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}catch{return!1}}function tt(){return{theme:`system`,accentH:Y.h,accentS:Y.s,accentL:Y.l,density:`comfortable`,uiScale:`default`,displayFont:`grotesk`,radius:`default`,motion:`system`,reduceMotion:et()}}function nt(e){return e===`system`||e===`reduce`||e===`full`}function rt(e){return e===`reduce`||e!==`full`&&et()}var it=(e,t,n)=>Math.min(n,Math.max(t,e));function at(e){return e===`comfortable`||e===`compact`}function ot(e){return e==="default"||e===`large`||e===`xlarge`}function st(e){return e===`grotesk`||e===`ui`||e===`mono`}function ct(e){return e===`sharp`||e==="default"||e===`soft`}function lt(e,t){let n={...e,...t},r=t.reduceMotion,i=nt(t.motion)?t.motion:typeof r==`boolean`?r?`reduce`:`full`:nt(e.motion)?e.motion:`system`;return{theme:n.theme===`light`||n.theme===`dark`?n.theme:`system`,accentH:Number.isFinite(n.accentH)?(Math.round(n.accentH)%360+360)%360:Y.h,accentS:Number.isFinite(n.accentS)?it(Math.round(n.accentS),0,100):Y.s,accentL:Number.isFinite(n.accentL)?it(Math.round(n.accentL),Qe,$e):Y.l,density:at(n.density)?n.density:`comfortable`,uiScale:ot(n.uiScale)?n.uiScale:`default`,displayFont:st(n.displayFont)?n.displayFont:`grotesk`,radius:ct(n.radius)?n.radius:`default`,motion:i,reduceMotion:rt(i)}}function ut(){let e=tt(),t={};try{let e=localStorage.getItem(Ze);if(e){let n=JSON.parse(e);n&&typeof n==`object`&&(t=n)}}catch{}let{reduceMotion:n,...r}=t;return lt(e,{...r,theme:q()})}function dt(e){try{let{theme:t,reduceMotion:n,...r}=e;localStorage.setItem(Ze,JSON.stringify(r))}catch{}}var ft={grotesk:null,ui:`var(--font-ui)`,mono:`var(--font-mono)`};function pt(e){if(typeof document>`u`)return;let t=document.documentElement;t.style.setProperty(`--accent-h`,String(e.accentH)),t.style.setProperty(`--accent-s`,`${e.accentS}%`),t.style.setProperty(`--accent-l`,`${e.accentL}%`);let n=ft[e.displayFont];n===null?t.style.removeProperty(`--font-display`):t.style.setProperty(`--font-display`,n),t.setAttribute(`data-density`,e.density),t.setAttribute(`data-ui-scale`,e.uiScale),t.setAttribute(`data-radius`,e.radius),e.motion===`system`?t.removeAttribute(`data-motion`):t.setAttribute(`data-motion`,e.motion)}var X=ut();pt(X);var mt=new Set;function ht(){for(let e of mt)e()}Ye(()=>{X.theme!==q()&&(X={...X,theme:q()},ht())});function gt(e){return mt.add(e),()=>mt.delete(e)}function _t(){return X}function vt(e){let t=lt(X,e),n=t.theme!==X.theme;X=t,pt(X),dt(X),n&&J(X.theme),ht()}function yt(){try{localStorage.removeItem(Ze)}catch{}X=tt(),pt(X),J(`system`),ht()}var bt={min:Qe,max:$e};function xt(e,t){let n=t?.freshMs??1e4,r=(0,i.useSyncExternalStore)((0,i.useCallback)(t=>ie(e.key,t),[e.key]),()=>ae(e.key),()=>ae(e.key));return(0,i.useEffect)(()=>{ue(e.key,()=>e.fetch(),n)},[e.key,n]),r}function St(e){return(0,i.useCallback)(()=>{h(e.key,()=>e.fetch())},[e])}function Ct(e){return(0,i.useCallback)(()=>{h(e.key,()=>e.fetch(),!0)},[e])}function wt(){return(0,i.useSyncExternalStore)(N,()=>P().phase,()=>P().phase)}function Tt(){let e=(0,i.useSyncExternalStore)(N,()=>P().mutationTokenHeldUntil,()=>P().mutationTokenHeldUntil);return{hasHold:Ie(),token:Fe(),heldUntil:e,setToken:z,touch:B,clear:V}}function Et(){return{theme:(0,i.useSyncExternalStore)(Ye,q,q),set:J,cycle:Xe}}function Dt(){return{appearance:(0,i.useSyncExternalStore)(gt,_t,_t),set:vt,reset:yt}}var Z=class extends Error{status;path;detail;code;constructor(e,t,n,r=null,i=null){super(e),this.status=t,this.path=n,this.detail=r,this.code=i,this.name=`ApiError`}},Ot=class extends Z{constructor(e){super(`This server was started without --allow-dispatch, so mutations are disabled.`,404,e),this.name=`DispatchDisabledError`}};async function kt(e,t){let n=await fetch(e,{method:`GET`,credentials:`same-origin`,headers:{"x-ashlr-read-client":F()},signal:t});if(n.status===401)throw R(),new Z(`Read session expired.`,401,e);if(!n.ok){let{detail:t,code:r}=await jt(n);throw new Z(`GET ${e} failed (HTTP ${n.status}).`,n.status,e,t||null,r)}return await n.json()}async function At(e,t,n,r){let i=await fetch(e,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/json`,"x-ashlr-token":n},body:JSON.stringify(t??{}),signal:r});if(i.status===401)throw new Z(`Mutation token was rejected.`,401,e);if(!i.ok){let{detail:t,code:n}=await jt(i);throw i.status===404&&n===null?new Ot(e):new Z(`POST ${e} failed (HTTP ${i.status})${t?`: ${t}`:``}.`,i.status,e,t||null,n)}if(i.status!==204)return await i.json()}async function jt(e){try{let t=await e.json();return{detail:typeof t.error==`string`&&t.error?t.error:typeof t.note==`string`?t.note:``,code:typeof t.code==`string`&&t.code?t.code:null}}catch{return{detail:``,code:null}}}var Q={grid:`_grid_x7p2y_1`,card:`_card_x7p2y_10`,title:`_title_x7p2y_19`,stat:`_stat_x7p2y_25`,caption:`_caption_x7p2y_31`,line:`_line_x7p2y_37`,row:`_row_x7p2y_42`,cell:`_cell_x7p2y_51`},$=n();function Mt({width:e=`100%`}){return(0,$.jsx)(`div`,{className:`skeleton ${Q.line}`,style:{width:e}})}function Nt(){return(0,$.jsxs)(`div`,{className:Q.card,children:[(0,$.jsx)(`div`,{className:`skeleton ${Q.title}`}),(0,$.jsx)(`div`,{className:`skeleton ${Q.stat}`}),(0,$.jsx)(`div`,{className:`skeleton ${Q.caption}`})]})}function Pt(){return(0,$.jsxs)(`div`,{className:Q.row,children:[(0,$.jsx)(`div`,{className:`skeleton ${Q.cell}`,style:{width:`18%`}}),(0,$.jsx)(`div`,{className:`skeleton ${Q.cell}`,style:{width:`38%`}}),(0,$.jsx)(`div`,{className:`skeleton ${Q.cell}`,style:{width:`14%`}}),(0,$.jsx)(`div`,{className:`skeleton ${Q.cell}`,style:{width:`10%`}})]})}function Ft({count:e=4}){return(0,$.jsx)(`div`,{className:Q.grid,children:Array.from({length:e},(e,t)=>(0,$.jsx)(Nt,{},t))})}var It={skipLink:`_skipLink_1uply_1`};function Lt(){return(0,$.jsx)(`button`,{type:`button`,className:It.skipLink,onClick:()=>{let e=document.getElementById(`main-content`);e?.focus(),e?.scrollIntoView({block:`start`})},children:`Skip to content`})}export{je as A,ue as B,Ae as C,F as D,Fe as E,be as F,h as G,g as H,ge as I,le as K,ve as L,z as M,N,Ie as O,B as P,ye as R,V as S,P as T,_ as U,ae as V,re as W,bt as _,Pt as a,Xe as b,kt as c,wt as d,Tt as f,Et as g,Ct as h,Mt as i,R as j,Me as k,At as l,St as m,Nt as n,Z as o,xt as p,ie as q,Ft as r,Ot as s,Lt as t,Dt as u,tt as v,I as w,Pe as x,_t as y,_e as z};
|
|
2
|
+
//# sourceMappingURL=global-CNNGMril.js.map
|