@ashlr/hub 3.16.0 → 3.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +2 -2
- package/dist/authority-surface.json +5 -5
- package/dist/build-identity.json +2 -2
- package/dist/core/daemon/loop.js +1 -0
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/tick-hooks.d.ts +2 -0
- package/dist/core/daemon/tick-hooks.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +2 -1
- package/dist/core/fleet/tick-hooks-live.js +49 -7
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js +2 -0
- package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js.map +1 -0
- package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js +2 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js +2 -0
- package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js +3 -0
- package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js.map +1 -0
- package/dist/core/web/public/next/assets/App-Uy6lDpKw.js +8 -0
- package/dist/core/web/public/next/assets/App-Uy6lDpKw.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js.map +1 -0
- package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js +2 -0
- package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js.map +1 -0
- package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js.map +1 -0
- package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js +7 -0
- package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js.map +1 -0
- package/dist/core/web/public/next/assets/Button-CMR_Op-0.js +2 -0
- package/dist/core/web/public/next/assets/Button-CMR_Op-0.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js.map +1 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js +16 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js +2 -0
- package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js.map +1 -0
- package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js +5 -0
- package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js +3 -0
- package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js +9 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js +3 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js.map +1 -0
- package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js +4 -0
- package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js.map +1 -0
- package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js +2 -0
- package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js.map +1 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js.map +1 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js +2 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js +2 -0
- package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js.map +1 -0
- package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js.map +1 -0
- package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js +2 -0
- package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js.map +1 -0
- package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js +2 -0
- package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js.map +1 -0
- package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js +2 -0
- package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js +2 -0
- package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js +5 -0
- package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js.map +1 -0
- package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js +2 -0
- package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js +3 -0
- package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js +3 -0
- package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js +2 -0
- package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js.map +1 -0
- package/dist/core/web/public/next/assets/Input-CsSZI8QC.js +2 -0
- package/dist/core/web/public/next/assets/Input-CsSZI8QC.js.map +1 -0
- package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js +9 -0
- package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js +3 -0
- package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js +2 -0
- package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js.map +1 -0
- package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js +2 -0
- package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js.map +1 -0
- package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js +2 -0
- package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js.map +1 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js +2 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js +3 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js +72 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js +2 -0
- package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js.map +1 -0
- package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js +2 -0
- package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js.map +1 -0
- package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js +2 -0
- package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js +2 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js +3 -0
- package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js.map +1 -0
- package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js +2 -0
- package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js.map +1 -0
- package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js +7 -0
- package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js.map +1 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js +2 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js.map +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js +4 -0
- package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js.map +1 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js +9 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js.map +1 -0
- package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js.map +1 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js +2 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js.map +1 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js +2 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js +2 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js.map +1 -0
- package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js +3 -0
- package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js +3 -0
- package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js.map +1 -0
- package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js +2 -0
- package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js.map +1 -0
- package/dist/core/web/public/next/assets/Select-DjQDkPJU.js +2 -0
- package/dist/core/web/public/next/assets/Select-DjQDkPJU.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js +2 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js +2 -0
- package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js.map +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js +2 -0
- package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js.map +1 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js +2 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js.map +1 -0
- package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js.map +1 -0
- package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js +2 -0
- package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js +2 -0
- package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js.map +1 -0
- package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js +2 -0
- package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js.map +1 -0
- package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-BEToBKC3.js +2 -0
- package/dist/core/web/public/next/assets/Surface-BEToBKC3.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js.map +1 -0
- package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js +2 -0
- package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js.map +1 -0
- package/dist/core/web/public/next/assets/Tag-Chqolzxz.js +2 -0
- package/dist/core/web/public/next/assets/Tag-Chqolzxz.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js +3 -0
- package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js +26 -0
- package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js.map +1 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js +2 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js.map +1 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js +2 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js +3 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js +2 -0
- package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js +2 -0
- package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js +2 -0
- package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js.map +1 -0
- package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js +2 -0
- package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js +6 -0
- package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-BPyW8QC-.js +2 -0
- package/dist/core/web/public/next/assets/actions-BPyW8QC-.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js +2 -0
- package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js +7 -0
- package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js.map +1 -0
- package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js +2 -0
- package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js.map +1 -0
- package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js +2 -0
- package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js.map +1 -0
- package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js +2 -0
- package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js.map +1 -0
- package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js +2 -0
- package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js +2 -0
- package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js +2 -0
- package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-Di0_Q980.js +2 -0
- package/dist/core/web/public/next/assets/charts-Di0_Q980.js.map +1 -0
- package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js +2 -0
- package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js.map +1 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js +2 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js +2 -0
- package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js +2 -0
- package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js +2 -0
- package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js.map +1 -0
- package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js +2 -0
- package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js.map +1 -0
- package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js +2 -0
- package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js.map +1 -0
- package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js +3 -0
- package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js.map +1 -0
- package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js +2 -0
- package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js.map +1 -0
- package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js.map +1 -0
- package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js +2 -0
- package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js.map +1 -0
- package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js +2 -0
- package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js.map +1 -0
- package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js +2 -0
- package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js +2 -0
- package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js +2 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js +2 -0
- package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js +3 -0
- package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js.map +1 -0
- package/dist/core/web/public/next/assets/format-V6IiIMAL.js +2 -0
- package/dist/core/web/public/next/assets/format-V6IiIMAL.js.map +1 -0
- package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js +5 -0
- package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js.map +1 -0
- package/dist/core/web/public/next/assets/global-CYfRwH6t.js +3 -0
- package/dist/core/web/public/next/assets/global-CYfRwH6t.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js.map +1 -0
- package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js +2 -0
- package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js.map +1 -0
- package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js +2 -0
- package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-BBm_Cy62.js +2 -0
- package/dist/core/web/public/next/assets/icons-BBm_Cy62.js.map +1 -0
- package/dist/core/web/public/next/assets/index-_izD07R9.js +11 -0
- package/dist/core/web/public/next/assets/index-_izD07R9.js.map +1 -0
- package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js +2 -0
- package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js.map +1 -0
- package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js +2 -0
- package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js.map +1 -0
- package/dist/core/web/public/next/assets/live-model-D97AfBFz.js +2 -0
- package/dist/core/web/public/next/assets/live-model-D97AfBFz.js.map +1 -0
- package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js +2 -0
- package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js +2 -0
- package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js +2 -0
- package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js +7 -0
- package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js +2 -0
- package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js +2 -0
- package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js.map +1 -0
- package/dist/core/web/public/next/assets/nav-DC0ynjdb.js +2 -0
- package/dist/core/web/public/next/assets/nav-DC0ynjdb.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js +2 -0
- package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js.map +1 -0
- package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js +2 -0
- package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js.map +1 -0
- package/dist/core/web/public/next/assets/panes-DOXM13lF.js +3 -0
- package/dist/core/web/public/next/assets/panes-DOXM13lF.js.map +1 -0
- package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js +2 -0
- package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js.map +1 -0
- package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js +2 -0
- package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js +2 -0
- package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js +2 -0
- package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js.map +1 -0
- package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js +2 -0
- package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js.map +1 -0
- package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-Bynv7bPl.js +1 -0
- package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js +2 -0
- package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js +2 -0
- package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js.map +1 -0
- package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js +2 -0
- package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js.map +1 -0
- package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js +3 -0
- package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js.map +1 -0
- package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js +2 -0
- package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js.map +1 -0
- package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js +2 -0
- package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js.map +1 -0
- package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js.map +1 -0
- package/dist/core/web/public/next/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js +2 -0
- package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js.map +1 -0
- package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js +2 -0
- package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js.map +1 -0
- package/dist/core/web/public/next/assets/sheet-BxZSmdad.js +2 -0
- package/dist/core/web/public/next/assets/sheet-BxZSmdad.js.map +1 -0
- package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js +2 -0
- package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js.map +1 -0
- package/dist/core/web/public/next/assets/slots-BJc3RJkV.js +3 -0
- package/dist/core/web/public/next/assets/slots-BJc3RJkV.js.map +1 -0
- package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js +4 -0
- package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js.map +1 -0
- package/dist/core/web/public/next/assets/sse-It4xa040.js +2 -0
- package/dist/core/web/public/next/assets/sse-It4xa040.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js.map +1 -0
- package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js +2 -0
- package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js +2 -0
- package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js +2 -0
- package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js +6 -0
- package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js.map +1 -0
- package/dist/core/web/public/next/assets/thread-data-C8z55msn.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-C8z55msn.js.map +1 -0
- package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js +2 -0
- package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js.map +1 -0
- package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js +2 -0
- package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js.map +1 -0
- package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js +2 -0
- package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js.map +1 -0
- package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js +2 -0
- package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js.map +1 -0
- package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js.map +1 -0
- package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js +2 -0
- package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js.map +1 -0
- package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js +2 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js +2 -0
- package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js +2 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js +3 -0
- package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js.map +1 -0
- package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js +2 -0
- package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js.map +1 -0
- package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js +2 -0
- package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js.map +1 -0
- package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js +2 -0
- package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js.map +1 -0
- package/dist/core/web/public/next/index.html +2 -1
- package/dist/core/web/remote-gateway-policy.js +5 -0
- package/dist/core/web/remote-gateway-policy.js.map +1 -1
- package/dist/core/web/static.d.ts +4 -3
- package/dist/core/web/static.js +8 -5
- package/dist/core/web/static.js.map +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/node_modules/fast-uri/index.js +20 -5
- package/node_modules/fast-uri/lib/utils.js +8 -1
- package/node_modules/fast-uri/package.json +1 -1
- package/node_modules/fast-uri/test/component-safe-serialization.test.js +58 -0
- package/node_modules/fast-uri/test/ipv6-validation.test.js +34 -0
- package/node_modules/ip-address/README.md +134 -134
- package/node_modules/ip-address/dist/address-error.d.ts +11 -0
- package/node_modules/ip-address/dist/address-error.js.map +1 -1
- package/node_modules/ip-address/dist/ipv4.d.ts +22 -6
- package/node_modules/ip-address/dist/ipv4.js +22 -6
- package/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/ip-address/dist/ipv6.d.ts +26 -8
- package/node_modules/ip-address/dist/ipv6.js +46 -29
- package/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/ip-address/dist/v6/constants.js +1 -0
- package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/ip-address/package.json +1 -1
- package/package.json +5 -4
- package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js +0 -2
- package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js +0 -2
- package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js +0 -2
- package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js +0 -3
- package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js.map +0 -1
- package/dist/core/web/public/next/assets/App-DebYuj1v.js +0 -8
- package/dist/core/web/public/next/assets/App-DebYuj1v.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js.map +0 -1
- package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js +0 -2
- package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js +0 -3
- package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js.map +0 -1
- package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js +0 -7
- package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js.map +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js.map +0 -1
- package/dist/core/web/public/next/assets/Button-DP2ImS5n.js +0 -2
- package/dist/core/web/public/next/assets/Button-DP2ImS5n.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js.map +0 -1
- package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js +0 -16
- package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js +0 -2
- package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js.map +0 -1
- package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js +0 -5
- package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js +0 -9
- package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js +0 -3
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js.map +0 -1
- package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js +0 -4
- package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js.map +0 -1
- package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js +0 -2
- package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js.map +0 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js +0 -2
- package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js.map +0 -1
- package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js +0 -2
- package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js.map +0 -1
- package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js +0 -2
- package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js.map +0 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js +0 -2
- package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js.map +0 -1
- package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js +0 -2
- package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js +0 -2
- package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js +0 -5
- package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-Cc14h572.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-Cc14h572.js.map +0 -1
- package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js +0 -2
- package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js +0 -3
- package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js +0 -3
- package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js +0 -2
- package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js.map +0 -1
- package/dist/core/web/public/next/assets/Input-BEF-ScuG.js +0 -2
- package/dist/core/web/public/next/assets/Input-BEF-ScuG.js.map +0 -1
- package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js +0 -9
- package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js +0 -3
- package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js +0 -2
- package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js.map +0 -1
- package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js +0 -2
- package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js.map +0 -1
- package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js +0 -2
- package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js.map +0 -1
- package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js +0 -2
- package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js +0 -72
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js +0 -2
- package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js.map +0 -1
- package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js +0 -2
- package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js.map +0 -1
- package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js +0 -2
- package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js +0 -2
- package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js +0 -3
- package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js.map +0 -1
- package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js +0 -2
- package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js.map +0 -1
- package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js +0 -7
- package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js.map +0 -1
- package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js +0 -2
- package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js +0 -4
- package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js.map +0 -1
- package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js +0 -9
- package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js.map +0 -1
- package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js +0 -2
- package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js.map +0 -1
- package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js.map +0 -1
- package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js +0 -2
- package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js +0 -2
- package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js.map +0 -1
- package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js +0 -3
- package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js +0 -3
- package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js.map +0 -1
- package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js +0 -2
- package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js.map +0 -1
- package/dist/core/web/public/next/assets/Select-zXMdgblm.js +0 -2
- package/dist/core/web/public/next/assets/Select-zXMdgblm.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js.map +0 -1
- package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js +0 -2
- package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js.map +0 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js +0 -3
- package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js +0 -2
- package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js.map +0 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js.map +0 -1
- package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js +0 -2
- package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js +0 -2
- package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js +0 -2
- package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js.map +0 -1
- package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js +0 -2
- package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js.map +0 -1
- package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js +0 -2
- package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js +0 -26
- package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js.map +0 -1
- package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js +0 -2
- package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js.map +0 -1
- package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js +0 -2
- package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js +0 -3
- package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js +0 -2
- package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js +0 -2
- package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js +0 -2
- package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js +0 -2
- package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js +0 -6
- package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-CyO4R-IO.js +0 -2
- package/dist/core/web/public/next/assets/actions-CyO4R-IO.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js +0 -2
- package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js +0 -7
- package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js.map +0 -1
- package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js +0 -2
- package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js.map +0 -1
- package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js +0 -2
- package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js.map +0 -1
- package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js +0 -2
- package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js.map +0 -1
- package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js +0 -2
- package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js.map +0 -1
- package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js +0 -2
- package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js +0 -2
- package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-D3I0q4hG.js +0 -2
- package/dist/core/web/public/next/assets/charts-D3I0q4hG.js.map +0 -1
- package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js +0 -2
- package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js.map +0 -1
- package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js +0 -2
- package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js +0 -2
- package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js +0 -2
- package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js +0 -2
- package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js.map +0 -1
- package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js +0 -2
- package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js +0 -2
- package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js +0 -3
- package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js.map +0 -1
- package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js.map +0 -1
- package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js.map +0 -1
- package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js +0 -2
- package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js.map +0 -1
- package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js +0 -2
- package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js.map +0 -1
- package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js +0 -2
- package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js +0 -2
- package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js +0 -2
- package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js +0 -3
- package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js.map +0 -1
- package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js +0 -2
- package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js.map +0 -1
- package/dist/core/web/public/next/assets/format-CcEKjUou.js +0 -2
- package/dist/core/web/public/next/assets/format-CcEKjUou.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-DL3MwN93.js +0 -5
- package/dist/core/web/public/next/assets/git-model-DL3MwN93.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BWc2NPzv.js +0 -3
- package/dist/core/web/public/next/assets/global-BWc2NPzv.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js.map +0 -1
- package/dist/core/web/public/next/assets/headroom-CP99UxyV.js +0 -2
- package/dist/core/web/public/next/assets/headroom-CP99UxyV.js.map +0 -1
- package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js +0 -2
- package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-U34oiN9M.js +0 -2
- package/dist/core/web/public/next/assets/icons-U34oiN9M.js.map +0 -1
- package/dist/core/web/public/next/assets/index-BbDqdepe.js +0 -11
- package/dist/core/web/public/next/assets/index-BbDqdepe.js.map +0 -1
- package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js +0 -2
- package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js.map +0 -1
- package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js +0 -2
- package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js.map +0 -1
- package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js +0 -2
- package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js +0 -2
- package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js.map +0 -1
- package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js +0 -2
- package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js +0 -2
- package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js +0 -2
- package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js +0 -7
- package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js +0 -2
- package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js +0 -2
- package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js.map +0 -1
- package/dist/core/web/public/next/assets/nav-CM-mJcSq.js +0 -2
- package/dist/core/web/public/next/assets/nav-CM-mJcSq.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js.map +0 -1
- package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js.map +0 -1
- package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js +0 -2
- package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js.map +0 -1
- package/dist/core/web/public/next/assets/panes-BjUzIDw6.js +0 -3
- package/dist/core/web/public/next/assets/panes-BjUzIDw6.js.map +0 -1
- package/dist/core/web/public/next/assets/path-display-HyxETV-f.js +0 -2
- package/dist/core/web/public/next/assets/path-display-HyxETV-f.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js +0 -2
- package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js +0 -2
- package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js.map +0 -1
- package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js +0 -2
- package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js.map +0 -1
- package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-BEXDE-HP.js +0 -1
- package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js +0 -2
- package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js.map +0 -1
- package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js +0 -2
- package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js.map +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js +0 -2
- package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js.map +0 -1
- package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js +0 -3
- package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js.map +0 -1
- package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js +0 -2
- package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js.map +0 -1
- package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js +0 -2
- package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js.map +0 -1
- package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js +0 -2
- package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js.map +0 -1
- package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js +0 -2
- package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js.map +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js +0 -2
- package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js.map +0 -1
- package/dist/core/web/public/next/assets/sheet-D0ciShoy.js +0 -2
- package/dist/core/web/public/next/assets/sheet-D0ciShoy.js.map +0 -1
- package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js +0 -2
- package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-m3L6Ints.js +0 -3
- package/dist/core/web/public/next/assets/slots-m3L6Ints.js.map +0 -1
- package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js +0 -4
- package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js.map +0 -1
- package/dist/core/web/public/next/assets/sse-CK65-Cun.js +0 -2
- package/dist/core/web/public/next/assets/sse-CK65-Cun.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js.map +0 -1
- package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js +0 -2
- package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js +0 -2
- package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js +0 -2
- package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js +0 -6
- package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js.map +0 -1
- package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js +0 -2
- package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js.map +0 -1
- package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js +0 -2
- package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js.map +0 -1
- package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js +0 -2
- package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js.map +0 -1
- package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js +0 -2
- package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js.map +0 -1
- package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js +0 -2
- package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js.map +0 -1
- package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js +0 -2
- package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js.map +0 -1
- package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js +0 -2
- package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js +0 -2
- package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js +0 -2
- package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js +0 -2
- package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js +0 -2
- package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js +0 -3
- package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js.map +0 -1
- package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js +0 -2
- package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js.map +0 -1
- package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js +0 -2
- package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js.map +0 -1
- package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js +0 -2
- package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["warning"],"ignoreList":[0],"sources":["../../../../../../node_modules/react-router/dist/development/chunk-OB3PAWPO.mjs","../../../../../../src/web-ui/app/nav-config.ts","../../../../../../src/web-ui/components/layout/Sidebar.tsx","../../../../../../src/web-ui/components/notifications/deriveNotifications.ts","../../../../../../src/web-ui/components/notifications/notification-store.ts","../../../../../../src/web-ui/components/notifications/useNotifications.ts","../../../../../../src/web-ui/components/notifications/NotificationBell.tsx","../../../../../../src/web-ui/components/notifications/types.ts","../../../../../../src/web-ui/components/notifications/NotificationItem.tsx","../../../../../../src/web-ui/components/notifications/useNotificationEngine.ts","../../../../../../src/web-ui/components/notifications/NotificationCenter.tsx","../../../../../../src/web-ui/components/layout/Topbar.tsx","../../../../../../src/web-ui/components/command-palette/commands.ts","../../../../../../src/web-ui/components/command-palette/CommandPalette.tsx","../../../../../../src/web-ui/components/layout/Shell.tsx","../../../../../../src/web-ui/routes/PlaceholderView.tsx","../../../../../../src/web-ui/routes/fleet-dashboard/StatGrid.tsx","../../../../../../src/web-ui/routes/fleet-dashboard/RunsPanel.tsx","../../../../../../src/web-ui/routes/fleet-dashboard/SwarmsPanel.tsx","../../../../../../src/web-ui/routes/fleet-dashboard/DaemonPanel.tsx","../../../../../../src/web-ui/routes/fleet-dashboard/FleetDashboardView.tsx","../../../../../../src/web-ui/components/stream/useRunStreamEvents.ts","../../../../../../src/web-ui/components/stream/useRunStream.ts","../../../../../../src/web-ui/components/stream/RunStreamPanel.tsx","../../../../../../src/web-ui/routes/journal/LiveNowStrip.tsx","../../../../../../src/web-ui/routes/journal/journal-model.ts","../../../../../../src/web-ui/routes/journal/JournalFilters.tsx","../../../../../../src/web-ui/routes/journal/JournalTimeline.tsx","../../../../../../src/web-ui/routes/journal/JournalEntryDetail.tsx","../../../../../../src/web-ui/routes/journal/JournalEntryRow.tsx","../../../../../../src/web-ui/routes/journal/JournalView.tsx","../../../../../../src/web-ui/routes/intelligence/pulse/PulseView.tsx","../../../../../../src/web-ui/routes/intelligence/genome/GenomeView.tsx","../../../../../../src/web-ui/routes/intelligence/production/ProductionView.tsx","../../../../../../src/web-ui/routes/portfolio/PortfolioView.tsx","../../../../../../src/web-ui/routes/work/runs/RunsView.tsx","../../../../../../src/web-ui/routes/work/runs/RunDetailView.tsx","../../../../../../src/web-ui/routes/work/swarms/SwarmsView.tsx","../../../../../../src/web-ui/routes/work/swarms/SwarmDag.tsx","../../../../../../src/web-ui/routes/work/swarms/SwarmDetailView.tsx","../../../../../../src/web-ui/routes/control/daemon/DaemonView.tsx","../../../../../../src/web-ui/routes/control/fleet/FleetView.tsx","../../../../../../src/web-ui/routes/control/security/SecurityView.tsx","../../../../../../src/web-ui/routes/goals/GoalsView.tsx","../../../../../../src/web-ui/routes/inbox/ProposalList.tsx","../../../../../../src/web-ui/routes/inbox/ProposalDetail.tsx","../../../../../../src/web-ui/routes/inbox/InboxView.tsx","../../../../../../src/web-ui/components/agent-os/AgentOsCockpit.tsx","../../../../../../src/web-ui/routes/agent-os/AgentOsView.tsx","../../../../../../src/web-ui/app/routes.tsx","../../../../../../src/web-ui/app/App.tsx"],"sourcesContent":["/**\n * react-router v7.18.4\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nvar __typeError = (msg) => {\n throw TypeError(msg);\n};\nvar __accessCheck = (obj, member, msg) => member.has(obj) || __typeError(\"Cannot \" + msg);\nvar __privateGet = (obj, member, getter) => (__accessCheck(obj, member, \"read from private field\"), getter ? getter.call(obj) : member.get(obj));\nvar __privateAdd = (obj, member, value) => member.has(obj) ? __typeError(\"Cannot add the same private member more than once\") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\nvar __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, \"write to private field\"), setter ? setter.call(obj, value) : member.set(obj, value), value);\n\n// lib/router/url.ts\nvar ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|[\\\\/]{2})/i;\nvar PROTOCOL_RELATIVE_URL_REGEX = /^[\\\\/]{2}/;\nfunction normalizeProtocolRelativeUrl(url, protocol) {\n return protocol + url.replace(/\\\\/g, \"/\");\n}\n\n// lib/router/history.ts\nvar Action = /* @__PURE__ */ ((Action2) => {\n Action2[\"Pop\"] = \"POP\";\n Action2[\"Push\"] = \"PUSH\";\n Action2[\"Replace\"] = \"REPLACE\";\n return Action2;\n})(Action || {});\nvar PopStateEventType = \"popstate\";\nfunction isLocation(obj) {\n return typeof obj === \"object\" && obj != null && \"pathname\" in obj && \"search\" in obj && \"hash\" in obj && \"state\" in obj && \"key\" in obj;\n}\nfunction createMemoryHistory(options = {}) {\n let { initialEntries = [\"/\"], initialIndex, v5Compat = false } = options;\n let entries;\n entries = initialEntries.map(\n (entry, index2) => createMemoryLocation(\n entry,\n typeof entry === \"string\" ? null : entry.state,\n index2 === 0 ? \"default\" : void 0,\n typeof entry === \"string\" ? void 0 : entry.mask\n )\n );\n let index = clampIndex(\n initialIndex == null ? entries.length - 1 : initialIndex\n );\n let action = \"POP\" /* Pop */;\n let listener = null;\n function clampIndex(n) {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n function getCurrentLocation() {\n return entries[index];\n }\n function createMemoryLocation(to, state = null, key, mask) {\n let location = createLocation(\n entries ? getCurrentLocation().pathname : \"/\",\n to,\n state,\n key,\n mask\n );\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in memory history: ${JSON.stringify(\n to\n )}`\n );\n return location;\n }\n function createHref2(to) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n let history = {\n get index() {\n return index;\n },\n get action() {\n return action;\n },\n get location() {\n return getCurrentLocation();\n },\n createHref: createHref2,\n createURL(to) {\n return new URL(createHref2(to), \"http://localhost\");\n },\n encodeLocation(to) {\n let path = typeof to === \"string\" ? parsePath(to) : to;\n return {\n pathname: path.pathname || \"\",\n search: path.search || \"\",\n hash: path.hash || \"\"\n };\n },\n push(to, state) {\n action = \"PUSH\" /* Push */;\n let nextLocation = isLocation(to) ? to : createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 1 });\n }\n },\n replace(to, state) {\n action = \"REPLACE\" /* Replace */;\n let nextLocation = isLocation(to) ? to : createMemoryLocation(to, state);\n entries[index] = nextLocation;\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 0 });\n }\n },\n go(delta) {\n action = \"POP\" /* Pop */;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n if (listener) {\n listener({ action, location: nextLocation, delta });\n }\n },\n listen(fn) {\n listener = fn;\n return () => {\n listener = null;\n };\n }\n };\n return history;\n}\nfunction createBrowserHistory(options = {}) {\n function createBrowserLocation(window2, globalHistory) {\n let maskedLocation = globalHistory.state?.masked;\n let { pathname, search, hash } = maskedLocation || window2.location;\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n globalHistory.state && globalHistory.state.usr || null,\n globalHistory.state && globalHistory.state.key || \"default\",\n maskedLocation ? {\n pathname: window2.location.pathname,\n search: window2.location.search,\n hash: window2.location.hash\n } : void 0\n );\n }\n function createBrowserHref(window2, to) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n return getUrlBasedHistory(\n createBrowserLocation,\n createBrowserHref,\n null,\n options\n );\n}\nfunction createHashHistory(options = {}) {\n function createHashLocation(window2, globalHistory) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\"\n } = parsePath(window2.location.hash.substring(1));\n if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n pathname = \"/\" + pathname;\n }\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n globalHistory.state && globalHistory.state.usr || null,\n globalHistory.state && globalHistory.state.key || \"default\"\n );\n }\n function createHashHref(window2, to) {\n let base = window2.document.querySelector(\"base\");\n let href = \"\";\n if (base && base.getAttribute(\"href\")) {\n let url = window2.location.href;\n let hashIndex = url.indexOf(\"#\");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n }\n function validateHashLocation(location, to) {\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in hash history.push(${JSON.stringify(\n to\n )})`\n );\n }\n return getUrlBasedHistory(\n createHashLocation,\n createHashHref,\n validateHashLocation,\n options\n );\n}\nfunction invariant(value, message) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\nfunction warning(cond, message) {\n if (!cond) {\n if (typeof console !== \"undefined\") console.warn(message);\n try {\n throw new Error(message);\n } catch (e) {\n }\n }\n}\nfunction createKey() {\n return Math.random().toString(36).substring(2, 10);\n}\nfunction getHistoryState(location, index) {\n return {\n usr: location.state,\n key: location.key,\n idx: index,\n masked: location.mask ? {\n pathname: location.pathname,\n search: location.search,\n hash: location.hash\n } : void 0\n };\n}\nfunction createLocation(current, to, state = null, key, mask) {\n let location = {\n pathname: typeof current === \"string\" ? current : current.pathname,\n search: \"\",\n hash: \"\",\n ...typeof to === \"string\" ? parsePath(to) : to,\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that's a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: to && to.key || key || createKey(),\n mask\n };\n return location;\n}\nfunction createPath({\n pathname = \"/\",\n search = \"\",\n hash = \"\"\n}) {\n if (search && search !== \"?\")\n pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\")\n pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\nfunction parsePath(path) {\n let parsedPath = {};\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substring(hashIndex);\n path = path.substring(0, hashIndex);\n }\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substring(searchIndex);\n path = path.substring(0, searchIndex);\n }\n if (path) {\n parsedPath.pathname = path;\n }\n }\n return parsedPath;\n}\nfunction getUrlBasedHistory(getLocation, createHref2, validateLocation, options = {}) {\n let { window: window2 = document.defaultView, v5Compat = false } = options;\n let globalHistory = window2.history;\n let action = \"POP\" /* Pop */;\n let listener = null;\n let index = getIndex();\n if (index == null) {\n index = 0;\n globalHistory.replaceState({ ...globalHistory.state, idx: index }, \"\");\n }\n function getIndex() {\n let state = globalHistory.state || { idx: null };\n return state.idx;\n }\n function handlePop() {\n action = \"POP\" /* Pop */;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n if (listener) {\n listener({ action, location: history.location, delta });\n }\n }\n function push(to, state) {\n action = \"PUSH\" /* Push */;\n let location = isLocation(to) ? to : createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location.mask || location);\n try {\n globalHistory.pushState(historyState, \"\", url);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"DataCloneError\") {\n throw error;\n }\n window2.location.assign(url);\n }\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 1 });\n }\n }\n function replace2(to, state) {\n action = \"REPLACE\" /* Replace */;\n let location = isLocation(to) ? to : createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location.mask || location);\n globalHistory.replaceState(historyState, \"\", url);\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 0 });\n }\n }\n function createURL(to) {\n return createBrowserURLImpl(window2, to);\n }\n let history = {\n get action() {\n return action;\n },\n get location() {\n return getLocation(window2, globalHistory);\n },\n listen(fn) {\n if (listener) {\n throw new Error(\"A history only accepts one active listener\");\n }\n window2.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n return () => {\n window2.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n createHref(to) {\n return createHref2(window2, to);\n },\n createURL,\n encodeLocation(to) {\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash\n };\n },\n push,\n replace: replace2,\n go(n) {\n return globalHistory.go(n);\n }\n };\n return history;\n}\nfunction createBrowserURLImpl(windowImpl, to, isAbsolute = false) {\n let base = \"http://localhost\";\n if (windowImpl) {\n base = windowImpl.location.origin !== \"null\" ? windowImpl.location.origin : windowImpl.location.href;\n }\n invariant(base, \"No window.location.(origin|href) available to create URL\");\n let href = typeof to === \"string\" ? to : createPath(to);\n href = href.replace(/ $/, \"%20\");\n if (!isAbsolute && PROTOCOL_RELATIVE_URL_REGEX.test(href)) {\n href = base + href;\n }\n return new URL(href, base);\n}\n\n// lib/router/utils.ts\nfunction createContext(defaultValue) {\n return { defaultValue };\n}\nvar _map;\nvar RouterContextProvider = class {\n /**\n * Create a new `RouterContextProvider` instance\n * @param init An optional initial context map to populate the provider with\n */\n constructor(init) {\n __privateAdd(this, _map, /* @__PURE__ */ new Map());\n if (init) {\n for (let [context, value] of init) {\n this.set(context, value);\n }\n }\n }\n /**\n * Access a value from the context. If no value has been set for the context,\n * it will return the context's `defaultValue` if provided, or throw an error\n * if no `defaultValue` was set.\n * @param context The context to get the value for\n * @returns The value for the context, or the context's `defaultValue` if no\n * value was set\n */\n get(context) {\n if (__privateGet(this, _map).has(context)) {\n return __privateGet(this, _map).get(context);\n }\n if (context.defaultValue !== void 0) {\n return context.defaultValue;\n }\n throw new Error(\"No value found for context\");\n }\n /**\n * Set a value for the context. If the context already has a value set, this\n * will overwrite it.\n *\n * @param context The context to set the value for\n * @param value The value to set for the context\n * @returns {void}\n */\n set(context, value) {\n __privateGet(this, _map).set(context, value);\n }\n};\n_map = new WeakMap();\nvar unsupportedLazyRouteObjectKeys = /* @__PURE__ */ new Set([\n \"lazy\",\n \"caseSensitive\",\n \"path\",\n \"id\",\n \"index\",\n \"children\"\n]);\nfunction isUnsupportedLazyRouteObjectKey(key) {\n return unsupportedLazyRouteObjectKeys.has(\n key\n );\n}\nvar unsupportedLazyRouteFunctionKeys = /* @__PURE__ */ new Set([\n \"lazy\",\n \"caseSensitive\",\n \"path\",\n \"id\",\n \"index\",\n \"middleware\",\n \"children\"\n]);\nfunction isUnsupportedLazyRouteFunctionKey(key) {\n return unsupportedLazyRouteFunctionKeys.has(\n key\n );\n}\nfunction isIndexRoute(route) {\n return route.index === true;\n}\nfunction convertRoutesToDataRoutes(routes, mapRouteProperties2, parentPath = [], manifest = {}, allowInPlaceMutations = false) {\n return routes.map((route, index) => {\n let treePath = [...parentPath, String(index)];\n let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n invariant(\n route.index !== true || !route.children,\n `Cannot specify children on an index route`\n );\n invariant(\n allowInPlaceMutations || !manifest[id],\n `Found a route id collision on id \"${id}\". Route id's must be globally unique within Data Router usages`\n );\n if (isIndexRoute(route)) {\n let indexRoute = {\n ...route,\n id\n };\n manifest[id] = mergeRouteUpdates(\n indexRoute,\n mapRouteProperties2(indexRoute)\n );\n return indexRoute;\n } else {\n let pathOrLayoutRoute = {\n ...route,\n id,\n children: void 0\n };\n manifest[id] = mergeRouteUpdates(\n pathOrLayoutRoute,\n mapRouteProperties2(pathOrLayoutRoute)\n );\n if (route.children) {\n pathOrLayoutRoute.children = convertRoutesToDataRoutes(\n route.children,\n mapRouteProperties2,\n treePath,\n manifest,\n allowInPlaceMutations\n );\n }\n return pathOrLayoutRoute;\n }\n });\n}\nfunction mergeRouteUpdates(route, updates) {\n return Object.assign(route, {\n ...updates,\n ...typeof updates.lazy === \"object\" && updates.lazy != null ? {\n lazy: {\n ...route.lazy,\n ...updates.lazy\n }\n } : {}\n });\n}\nfunction matchRoutes(routes, locationArg, basename = \"/\") {\n return matchRoutesImpl(routes, locationArg, basename, false);\n}\nfunction matchRoutesImpl(routes, locationArg, basename, allowPartial, precomputedBranches) {\n let location = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n let pathname = stripBasename(location.pathname || \"/\", basename);\n if (pathname == null) {\n return null;\n }\n let branches = precomputedBranches ?? flattenAndRankRoutes(routes);\n let matches = null;\n let decoded = decodePath(pathname);\n for (let i = 0; matches == null && i < branches.length; ++i) {\n matches = matchRouteBranch(\n branches[i],\n decoded,\n allowPartial\n );\n }\n return matches;\n}\nfunction convertRouteMatchToUiMatch(match, loaderData) {\n let { route, pathname, params } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id],\n loaderData: loaderData[route.id],\n handle: route.handle\n };\n}\nfunction flattenAndRankRoutes(routes) {\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n return branches;\n}\nfunction flattenRoutes(routes, branches = [], parentsMeta = [], parentPath = \"\", _hasParentOptionalSegments = false) {\n let flattenRoute = (route, index, hasParentOptionalSegments = _hasParentOptionalSegments, relativePath) => {\n let meta = {\n relativePath: relativePath === void 0 ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route\n };\n if (meta.relativePath.startsWith(\"/\")) {\n if (!meta.relativePath.startsWith(parentPath) && hasParentOptionalSegments) {\n return;\n }\n invariant(\n meta.relativePath.startsWith(parentPath),\n `Absolute route path \"${meta.relativePath}\" nested under path \"${parentPath}\" is not valid. An absolute child route path must start with the combined path of all its parent routes.`\n );\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n `Index routes must not have child routes. Please remove all child routes from route path \"${path}\".`\n );\n flattenRoutes(\n route.children,\n branches,\n routesMeta,\n path,\n hasParentOptionalSegments\n );\n }\n if (route.path == null && !route.index) {\n return;\n }\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta: routesMeta.map((meta2, i) => {\n let [matcher, params] = compilePath(\n meta2.relativePath,\n meta2.caseSensitive,\n i === routesMeta.length - 1\n );\n return {\n ...meta2,\n matcher,\n compiledParams: params\n };\n })\n });\n };\n routes.forEach((route, index) => {\n if (route.path === \"\" || !route.path?.includes(\"?\")) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, true, exploded);\n }\n }\n });\n return branches;\n}\nfunction explodeOptionalSegments(path) {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n let [first, ...rest] = segments;\n let isOptional = first.endsWith(\"?\");\n let required = first.replace(/\\?$/, \"\");\n if (rest.length === 0) {\n return isOptional ? [required, \"\"] : [required];\n }\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n let result = [];\n result.push(\n ...restExploded.map(\n (subpath) => subpath === \"\" ? required : [required, subpath].join(\"/\")\n )\n );\n if (isOptional) {\n result.push(...restExploded);\n }\n return result.map(\n (exploded) => path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded\n );\n}\nfunction rankRouteBranches(branches) {\n branches.sort(\n (a, b) => a.score !== b.score ? b.score - a.score : compareIndexes(\n a.routesMeta.map((meta) => meta.childrenIndex),\n b.routesMeta.map((meta) => meta.childrenIndex)\n )\n );\n}\nvar paramRe = /^:[\\w-]+$/;\nvar dynamicSegmentValue = 3;\nvar indexRouteValue = 2;\nvar emptySegmentValue = 1;\nvar staticSegmentValue = 10;\nvar splatPenalty = -2;\nvar isSplat = (s) => s === \"*\";\nfunction computeScore(path, index) {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n if (index) {\n initialScore += indexRouteValue;\n }\n return segments.filter((s) => !isSplat(s)).reduce(\n (score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === \"\" ? emptySegmentValue : staticSegmentValue),\n initialScore\n );\n}\nfunction compareIndexes(a, b) {\n let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n return siblings ? (\n // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n ) : (\n // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0\n );\n}\nfunction matchRouteBranch(branch, pathname, allowPartial = false) {\n let { routesMeta } = branch;\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname = matchedPathname === \"/\" ? pathname : pathname.slice(matchedPathname.length) || \"/\";\n let pattern = {\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end\n };\n let match = (\n // Use precomputed matcher if it exists\n meta.matcher && meta.compiledParams ? matchPathImpl(\n pattern,\n remainingPathname,\n meta.matcher,\n meta.compiledParams\n ) : matchPath(pattern, remainingPathname)\n );\n let route = meta.route;\n if (!match && end && allowPartial && !routesMeta[routesMeta.length - 1].route.index) {\n match = matchPath(\n {\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end: false\n },\n remainingPathname\n );\n }\n if (!match) {\n return null;\n }\n Object.assign(matchedParams, match.params);\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(\n joinPaths([matchedPathname, match.pathnameBase])\n ),\n route\n });\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n return matches;\n}\nfunction generatePath(originalPath, params = {}) {\n let path = originalPath;\n if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n warning(\n false,\n `Route path \"${path}\" will be treated as if it were \"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must always follow a \\`/\\` in the pattern. To get rid of this warning, please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n path = path.replace(/\\*$/, \"/*\");\n }\n const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n const stringify2 = (p) => p == null ? \"\" : typeof p === \"string\" ? p : String(p);\n const segments = path.split(/\\/+/).map((segment, index, array) => {\n const isLastSegment = index === array.length - 1;\n if (isLastSegment && segment === \"*\") {\n return stringify2(params[\"*\"]);\n }\n const keyMatch = segment.match(/^:([\\w-]+)(\\??)(.*)/);\n if (keyMatch) {\n const [, key, optional, suffix] = keyMatch;\n let param = params[key];\n invariant(optional === \"?\" || param != null, `Missing \":${key}\" param`);\n return encodeURIComponent(stringify2(param)) + suffix;\n }\n return segment.replace(/\\?$/g, \"\");\n }).filter((segment) => !!segment);\n return prefix + segments.join(\"/\");\n}\nfunction matchPath(pattern, pathname) {\n if (typeof pattern === \"string\") {\n pattern = { path: pattern, caseSensitive: false, end: true };\n }\n let [matcher, compiledParams] = compilePath(\n pattern.path,\n pattern.caseSensitive,\n pattern.end\n );\n return matchPathImpl(pattern, pathname, matcher, compiledParams);\n}\nfunction matchPathImpl(pattern, pathname, matcher, compiledParams) {\n let match = pathname.match(matcher);\n if (!match) return null;\n let matchedPathname = match[0];\n let pathnameBase = removeTrailingSlash(matchedPathname, 1);\n let captureGroups = match.slice(1);\n let params = compiledParams.reduce(\n (memo2, { paramName, isOptional }, index) => {\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = removeTrailingSlash(\n matchedPathname.slice(0, matchedPathname.length - splatValue.length),\n 1\n );\n }\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo2[paramName] = void 0;\n } else {\n memo2[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n }\n return memo2;\n },\n {}\n );\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern\n };\n}\nfunction compilePath(path, caseSensitive = false, end = true) {\n warning(\n path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"),\n `Route path \"${path}\" will be treated as if it were \"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must always follow a \\`/\\` in the pattern. To get rid of this warning, please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n let params = [];\n let regexpSource = \"^\" + path.replace(/\\/*\\*?$/, \"\").replace(/^\\/*/, \"/\").replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\").replace(\n /\\/:([\\w-]+)(\\?)?/g,\n (match, paramName, isOptional, index, str) => {\n params.push({ paramName, isOptional: isOptional != null });\n if (isOptional) {\n let nextChar = str.charAt(index + match.length);\n if (nextChar && nextChar !== \"/\") {\n return \"/([^\\\\/]*)\";\n }\n return \"(?:/([^\\\\/]*))?\";\n }\n return \"/([^\\\\/]+)\";\n }\n ).replace(/\\/([\\w-]+)\\?(\\/|$)/g, \"(/$1)?$2\");\n if (path.endsWith(\"*\")) {\n params.push({ paramName: \"*\" });\n regexpSource += path === \"*\" || path === \"/*\" ? \"(.*)$\" : \"(?:\\\\/(.+)|\\\\/*)$\";\n } else if (end) {\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else {\n }\n let matcher = new RegExp(regexpSource, caseSensitive ? void 0 : \"i\");\n return [matcher, params];\n}\nfunction decodePath(value) {\n try {\n return value.split(\"/\").map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\")).join(\"/\");\n } catch (error) {\n warning(\n false,\n `The URL path \"${value}\" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${error}).`\n );\n return value;\n }\n}\nfunction stripBasename(pathname, basename) {\n if (basename === \"/\") return pathname;\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n let startIndex = basename.endsWith(\"/\") ? basename.length - 1 : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n return null;\n }\n return pathname.slice(startIndex) || \"/\";\n}\nfunction prependBasename({\n basename,\n pathname\n}) {\n return pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n}\nvar isAbsoluteUrl = (url) => ABSOLUTE_URL_REGEX.test(url);\nfunction resolvePath(to, fromPathname = \"/\") {\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\"\n } = typeof to === \"string\" ? parsePath(to) : to;\n let pathname;\n if (toPathname) {\n toPathname = removeDoubleSlashes(toPathname);\n if (toPathname.startsWith(\"/\") || toPathname.startsWith(\"\\\\\")) {\n pathname = resolvePathname(toPathname.substring(1), \"/\");\n } else {\n pathname = resolvePathname(toPathname, fromPathname);\n }\n } else {\n pathname = fromPathname;\n }\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash)\n };\n}\nfunction resolvePathname(relativePath, fromPathname) {\n let segments = removeTrailingSlash(fromPathname).split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\nfunction getInvalidPathError(char, field, dest, path) {\n return `Cannot include a '${char}' character in a manually specified \\`to.${field}\\` field [${JSON.stringify(\n path\n )}]. Please separate it out to the \\`to.${dest}\\` field. Alternatively you may provide the full path as a string in <Link to=\"...\"> and the router will parse it for you.`;\n}\nfunction getPathContributingMatches(matches) {\n return matches.filter(\n (match, index) => index === 0 || match.route.path && match.route.path.length > 0\n );\n}\nfunction getResolveToMatches(matches) {\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches.map(\n (match, idx) => idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase\n );\n}\nfunction resolveTo(toArg, routePathnames, locationPathname, isPathRelative = false) {\n let to;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = { ...toArg };\n invariant(\n !to.pathname || !to.pathname.includes(\"?\"),\n getInvalidPathError(\"?\", \"pathname\", \"search\", to)\n );\n invariant(\n !to.pathname || !to.pathname.includes(\"#\"),\n getInvalidPathError(\"#\", \"pathname\", \"hash\", to)\n );\n invariant(\n !to.search || !to.search.includes(\"#\"),\n getInvalidPathError(\"#\", \"search\", \"hash\", to)\n );\n }\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n let from;\n if (toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n if (!isPathRelative && toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n to.pathname = toSegments.join(\"/\");\n }\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n let path = resolvePath(to, from);\n let hasExplicitTrailingSlash = toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n let hasCurrentTrailingSlash = (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (!path.pathname.endsWith(\"/\") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {\n path.pathname += \"/\";\n }\n return path;\n}\nvar removeDoubleSlashes = (path) => path.replace(/[\\\\/]{2,}/g, \"/\");\nvar joinPaths = (paths) => removeDoubleSlashes(paths.join(\"/\"));\nfunction removeTrailingSlash(path, minLength = 0) {\n let end = path.length;\n while (end > minLength && path.charCodeAt(end - 1) === 47) {\n end--;\n }\n return end === path.length ? path : path.slice(0, end);\n}\nvar normalizePathname = (pathname) => removeTrailingSlash(pathname).replace(/^\\/*/, \"/\");\nvar normalizeSearch = (search) => !search || search === \"?\" ? \"\" : search.startsWith(\"?\") ? search : \"?\" + search;\nvar normalizeHash = (hash) => !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\nvar DataWithResponseInit = class {\n constructor(data2, init) {\n this.type = \"DataWithResponseInit\";\n this.data = data2;\n this.init = init || null;\n }\n};\nfunction data(data2, init) {\n return new DataWithResponseInit(\n data2,\n typeof init === \"number\" ? { status: init } : init\n );\n}\nvar redirect = (url, init = 302) => {\n let responseInit = init;\n if (typeof responseInit === \"number\") {\n responseInit = { status: responseInit };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n return new Response(null, { ...responseInit, headers });\n};\nvar redirectDocument = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n return response;\n};\nvar replace = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Replace\", \"true\");\n return response;\n};\nvar SUPPORTED_ERROR_TYPES = [\n \"EvalError\",\n \"RangeError\",\n \"ReferenceError\",\n \"SyntaxError\",\n \"TypeError\",\n \"URIError\"\n];\nvar ErrorResponseImpl = class {\n constructor(status, statusText, data2, internal = false) {\n this.status = status;\n this.statusText = statusText || \"\";\n this.internal = internal;\n if (data2 instanceof Error) {\n this.data = data2.toString();\n this.error = data2;\n } else {\n this.data = data2;\n }\n }\n};\nfunction isRouteErrorResponse(error) {\n return error != null && typeof error.status === \"number\" && typeof error.statusText === \"string\" && typeof error.internal === \"boolean\" && \"data\" in error;\n}\nfunction getRoutePattern(matches) {\n let parts = matches.map((m) => m.route.path).filter(Boolean);\n return joinPaths(parts) || \"/\";\n}\nvar isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\";\nfunction parseToInfo(_to, basename) {\n let to = _to;\n if (typeof to !== \"string\" || !ABSOLUTE_URL_REGEX.test(to)) {\n return {\n absoluteURL: void 0,\n isExternal: false,\n to\n };\n }\n let absoluteURL = to;\n let isExternal = false;\n if (isBrowser) {\n try {\n let currentUrl = new URL(window.location.href);\n let targetUrl = PROTOCOL_RELATIVE_URL_REGEX.test(to) ? new URL(normalizeProtocolRelativeUrl(to, currentUrl.protocol)) : new URL(to);\n let path = stripBasename(targetUrl.pathname, basename);\n if (targetUrl.origin === currentUrl.origin && path != null) {\n to = path + targetUrl.search + targetUrl.hash;\n } else {\n isExternal = true;\n }\n } catch (e) {\n warning(\n false,\n `<Link to=\"${to}\"> contains an invalid URL which will probably break when clicked - please update to a valid URL path.`\n );\n }\n }\n return {\n absoluteURL,\n isExternal,\n to\n };\n}\n\n// lib/router/instrumentation.ts\nvar UninstrumentedSymbol = Symbol(\"Uninstrumented\");\nfunction getRouteInstrumentationUpdates(fns, route) {\n let aggregated = {\n lazy: [],\n \"lazy.loader\": [],\n \"lazy.action\": [],\n \"lazy.middleware\": [],\n middleware: [],\n loader: [],\n action: []\n };\n fns.forEach(\n (fn) => fn({\n id: route.id,\n index: route.index,\n path: route.path,\n instrument(i) {\n let keys = Object.keys(aggregated);\n for (let key of keys) {\n if (i[key]) {\n aggregated[key].push(i[key]);\n }\n }\n }\n })\n );\n let updates = {};\n if (typeof route.lazy === \"function\" && aggregated.lazy.length > 0) {\n let instrumented = wrapImpl(aggregated.lazy, route.lazy, () => void 0);\n if (instrumented) {\n updates.lazy = instrumented;\n }\n }\n if (typeof route.lazy === \"object\") {\n let lazyObject = route.lazy;\n [\"middleware\", \"loader\", \"action\"].forEach((key) => {\n let lazyFn = lazyObject[key];\n let instrumentations = aggregated[`lazy.${key}`];\n if (typeof lazyFn === \"function\" && instrumentations.length > 0) {\n let instrumented = wrapImpl(instrumentations, lazyFn, () => void 0);\n if (instrumented) {\n updates.lazy = Object.assign(updates.lazy || {}, {\n [key]: instrumented\n });\n }\n }\n });\n }\n [\"loader\", \"action\"].forEach((key) => {\n let handler = route[key];\n if (typeof handler === \"function\" && aggregated[key].length > 0) {\n let original = handler[UninstrumentedSymbol] ?? handler;\n let instrumented = wrapImpl(\n aggregated[key],\n original,\n (...args) => getHandlerInfo(args[0])\n );\n if (instrumented) {\n if (key === \"loader\" && original.hydrate === true) {\n instrumented.hydrate = true;\n }\n instrumented[UninstrumentedSymbol] = original;\n updates[key] = instrumented;\n }\n }\n });\n if (route.middleware && route.middleware.length > 0 && aggregated.middleware.length > 0) {\n updates.middleware = route.middleware.map((middleware) => {\n let original = middleware[UninstrumentedSymbol] ?? middleware;\n let instrumented = wrapImpl(\n aggregated.middleware,\n original,\n (...args) => getHandlerInfo(args[0])\n );\n if (instrumented) {\n instrumented[UninstrumentedSymbol] = original;\n return instrumented;\n }\n return middleware;\n });\n }\n return updates;\n}\nfunction instrumentClientSideRouter(router, fns) {\n let aggregated = {\n navigate: [],\n fetch: []\n };\n fns.forEach(\n (fn) => fn({\n instrument(i) {\n let keys = Object.keys(i);\n for (let key of keys) {\n if (i[key]) {\n aggregated[key].push(i[key]);\n }\n }\n }\n })\n );\n if (aggregated.navigate.length > 0) {\n let navigate = router.navigate[UninstrumentedSymbol] ?? router.navigate;\n let instrumentedNavigate = wrapImpl(\n aggregated.navigate,\n navigate,\n (...args) => {\n let [to, opts] = args;\n return {\n to: typeof to === \"number\" || typeof to === \"string\" ? to : to ? createPath(to) : \".\",\n ...getRouterInfo(router, opts ?? {})\n };\n }\n );\n if (instrumentedNavigate) {\n instrumentedNavigate[UninstrumentedSymbol] = navigate;\n router.navigate = instrumentedNavigate;\n }\n }\n if (aggregated.fetch.length > 0) {\n let fetch2 = router.fetch[UninstrumentedSymbol] ?? router.fetch;\n let instrumentedFetch = wrapImpl(aggregated.fetch, fetch2, (...args) => {\n let [key, , href, opts] = args;\n return {\n href: href ?? \".\",\n fetcherKey: key,\n ...getRouterInfo(router, opts ?? {})\n };\n });\n if (instrumentedFetch) {\n instrumentedFetch[UninstrumentedSymbol] = fetch2;\n router.fetch = instrumentedFetch;\n }\n }\n return router;\n}\nfunction instrumentHandler(handler, fns) {\n let aggregated = {\n request: []\n };\n fns.forEach(\n (fn) => fn({\n instrument(i) {\n let keys = Object.keys(i);\n for (let key of keys) {\n if (i[key]) {\n aggregated[key].push(i[key]);\n }\n }\n }\n })\n );\n let instrumentedHandler = handler;\n if (aggregated.request.length > 0) {\n instrumentedHandler = wrapImpl(aggregated.request, handler, (...args) => {\n let [request, context] = args;\n return {\n request: getReadonlyRequest(request),\n context: context != null ? getReadonlyContext(context) : context\n };\n });\n }\n return instrumentedHandler;\n}\nfunction wrapImpl(impls, handler, getInfo) {\n if (impls.length === 0) {\n return null;\n }\n return async (...args) => {\n let result = await recurseRight(\n impls,\n getInfo(...args),\n () => handler(...args),\n impls.length - 1\n );\n if (result.type === \"error\") {\n throw result.value;\n }\n return result.value;\n };\n}\nasync function recurseRight(impls, info, handler, index) {\n let impl = impls[index];\n let result;\n if (!impl) {\n try {\n let value = await handler();\n result = { type: \"success\", value };\n } catch (e) {\n result = { type: \"error\", value: e };\n }\n } else {\n let handlerPromise = void 0;\n let callHandler = async () => {\n if (handlerPromise) {\n console.error(\"You cannot call instrumented handlers more than once\");\n } else {\n handlerPromise = recurseRight(impls, info, handler, index - 1);\n }\n result = await handlerPromise;\n invariant(result, \"Expected a result\");\n if (result.type === \"error\" && result.value instanceof Error) {\n return { status: \"error\", error: result.value };\n }\n return { status: \"success\", error: void 0 };\n };\n try {\n await impl(callHandler, info);\n } catch (e) {\n console.error(\"An instrumentation function threw an error:\", e);\n }\n if (!handlerPromise) {\n await callHandler();\n }\n await handlerPromise;\n }\n if (result) {\n return result;\n }\n return {\n type: \"error\",\n value: new Error(\"No result assigned in instrumentation chain.\")\n };\n}\nfunction getHandlerInfo(args) {\n let { request, context, params, pattern } = args;\n return {\n request: getReadonlyRequest(request),\n params: { ...params },\n pattern,\n context: getReadonlyContext(context)\n };\n}\nfunction getRouterInfo(router, opts) {\n return {\n currentUrl: createPath(router.state.location),\n ...\"formMethod\" in opts ? { formMethod: opts.formMethod } : {},\n ...\"formEncType\" in opts ? { formEncType: opts.formEncType } : {},\n ...\"formData\" in opts ? { formData: opts.formData } : {},\n ...\"body\" in opts ? { body: opts.body } : {}\n };\n}\nfunction getReadonlyRequest(request) {\n return {\n method: request.method,\n url: request.url,\n headers: {\n get: (...args) => request.headers.get(...args)\n }\n };\n}\nfunction getReadonlyContext(context) {\n if (isPlainObject(context)) {\n let frozen = { ...context };\n Object.freeze(frozen);\n return frozen;\n } else {\n return {\n get: (ctx) => context.get(ctx)\n };\n }\n}\nvar objectProtoNames = Object.getOwnPropertyNames(Object.prototype).sort().join(\"\\0\");\nfunction isPlainObject(thing) {\n if (thing === null || typeof thing !== \"object\") {\n return false;\n }\n const proto = Object.getPrototypeOf(thing);\n return proto === Object.prototype || proto === null || Object.getOwnPropertyNames(proto).sort().join(\"\\0\") === objectProtoNames;\n}\n\n// lib/router/navigation.ts\nvar DEFAULT_NAVIGATION_URL = new URL(\"http://localhost\");\nfunction getNavigatorCurrentUrl(navigator) {\n if (navigator.createURL) {\n return navigator.createURL(\"/\");\n }\n try {\n return new URL(navigator.createHref(\"/\"), DEFAULT_NAVIGATION_URL);\n } catch {\n return DEFAULT_NAVIGATION_URL;\n }\n}\nfunction isSameOrigin(a, b) {\n return a.origin === b.origin && (a.origin !== \"null\" || a.protocol === b.protocol && a.host === b.host);\n}\nfunction isExplicitUrl(destination, target) {\n if (destination.startsWith(\"//\")) {\n return true;\n }\n let protocol = target.protocol.toLowerCase();\n if (!destination.toLowerCase().startsWith(protocol)) {\n return false;\n }\n return target.host === \"\" || destination.slice(protocol.length).startsWith(\"//\");\n}\nfunction validateNavigationTarget(original, resolved, currentUrl, externalPolicy) {\n let originalUrl = null;\n try {\n originalUrl = original == null ? null : new URL(original, currentUrl);\n } catch {\n }\n let resolvedUrl = new URL(resolved, currentUrl);\n let originalIsExternal = originalUrl != null && !isSameOrigin(originalUrl, currentUrl);\n let resolvedIsExternal = !isSameOrigin(resolvedUrl, currentUrl);\n if (externalPolicy === \"reject\") {\n if (originalIsExternal || resolvedIsExternal) {\n throw new Error(\"External navigation is not allowed\");\n }\n } else if (resolvedIsExternal) {\n if (originalUrl == null || !isExplicitUrl(original, originalUrl) || !isSameOrigin(originalUrl, resolvedUrl)) {\n throw new Error(\"External navigation is not allowed\");\n }\n }\n}\n\n// lib/router/router.ts\nvar validMutationMethodsArr = [\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\"\n];\nvar validMutationMethods = new Set(\n validMutationMethodsArr\n);\nvar validRequestMethodsArr = [\n \"GET\",\n ...validMutationMethodsArr\n];\nvar validRequestMethods = new Set(validRequestMethodsArr);\nvar redirectStatusCodes = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);\nvar redirectPreserveMethodStatusCodes = /* @__PURE__ */ new Set([307, 308]);\nvar IDLE_NAVIGATION = {\n state: \"idle\",\n location: void 0,\n matches: void 0,\n historyAction: void 0,\n formMethod: void 0,\n formAction: void 0,\n formEncType: void 0,\n formData: void 0,\n json: void 0,\n text: void 0\n};\nvar IDLE_FETCHER = {\n state: \"idle\",\n data: void 0,\n formMethod: void 0,\n formAction: void 0,\n formEncType: void 0,\n formData: void 0,\n json: void 0,\n text: void 0\n};\nvar IDLE_BLOCKER = {\n state: \"unblocked\",\n proceed: void 0,\n reset: void 0,\n location: void 0\n};\nvar defaultMapRouteProperties = (route) => ({\n hasErrorBoundary: Boolean(route.hasErrorBoundary)\n});\nvar TRANSITIONS_STORAGE_KEY = \"remix-router-transitions\";\nvar ResetLoaderDataSymbol = Symbol(\"ResetLoaderData\");\nvar _routes, _branches, _hmrRoutes, _hmrBranches;\nvar DataRoutes = class {\n constructor(routes) {\n __privateAdd(this, _routes);\n __privateAdd(this, _branches);\n __privateAdd(this, _hmrRoutes);\n __privateAdd(this, _hmrBranches);\n __privateSet(this, _routes, routes);\n __privateSet(this, _branches, flattenAndRankRoutes(routes));\n }\n /** The stable route tree */\n get stableRoutes() {\n return __privateGet(this, _routes);\n }\n /** The in-flight route tree if one is active, otherwise the stable tree */\n get activeRoutes() {\n return __privateGet(this, _hmrRoutes) ?? __privateGet(this, _routes);\n }\n /** Pre-computed branches */\n get branches() {\n return __privateGet(this, _hmrBranches) ?? __privateGet(this, _branches);\n }\n get hasHMRRoutes() {\n return __privateGet(this, _hmrRoutes) != null;\n }\n /** Replace the stable route tree and recompute its branches */\n setRoutes(routes) {\n __privateSet(this, _routes, routes);\n __privateSet(this, _branches, flattenAndRankRoutes(routes));\n }\n /** Set a new in-flight route tree and recompute its branches */\n setHmrRoutes(routes) {\n __privateSet(this, _hmrRoutes, routes);\n __privateSet(this, _hmrBranches, flattenAndRankRoutes(routes));\n }\n /** Commit in-flight routes/branches to the stable slot and clear in-flight */\n commitHmrRoutes() {\n if (__privateGet(this, _hmrRoutes)) {\n __privateSet(this, _routes, __privateGet(this, _hmrRoutes));\n __privateSet(this, _branches, __privateGet(this, _hmrBranches));\n __privateSet(this, _hmrRoutes, void 0);\n __privateSet(this, _hmrBranches, void 0);\n }\n }\n};\n_routes = new WeakMap();\n_branches = new WeakMap();\n_hmrRoutes = new WeakMap();\n_hmrBranches = new WeakMap();\nfunction createRouter(init) {\n const routerWindow = init.window ? init.window : typeof window !== \"undefined\" ? window : void 0;\n const isBrowser3 = typeof routerWindow !== \"undefined\" && typeof routerWindow.document !== \"undefined\" && typeof routerWindow.document.createElement !== \"undefined\";\n invariant(\n init.routes.length > 0,\n \"You must provide a non-empty routes array to createRouter\"\n );\n let hydrationRouteProperties2 = init.hydrationRouteProperties || [];\n let _mapRouteProperties = init.mapRouteProperties || defaultMapRouteProperties;\n let mapRouteProperties2 = _mapRouteProperties;\n if (init.instrumentations) {\n let instrumentations = init.instrumentations;\n mapRouteProperties2 = (route) => {\n return {\n ..._mapRouteProperties(route),\n ...getRouteInstrumentationUpdates(\n instrumentations.map((i) => i.route).filter(Boolean),\n route\n )\n };\n };\n }\n let manifest = {};\n let dataRoutes = new DataRoutes(\n convertRoutesToDataRoutes(\n init.routes,\n mapRouteProperties2,\n void 0,\n manifest\n )\n );\n let basename = init.basename || \"/\";\n if (!basename.startsWith(\"/\")) {\n basename = `/${basename}`;\n }\n let dataStrategyImpl = init.dataStrategy || defaultDataStrategyWithMiddleware;\n let future = {\n ...init.future\n };\n let unlistenHistory = null;\n let subscribers = /* @__PURE__ */ new Set();\n let bufferedInitialStateUpdate = null;\n let savedScrollPositions2 = null;\n let getScrollRestorationKey2 = null;\n let getScrollPosition = null;\n let initialScrollRestored = init.hydrationData != null;\n let initialMatches = matchRoutesImpl(\n dataRoutes.activeRoutes,\n init.history.location,\n basename,\n false,\n dataRoutes.branches\n );\n let initialMatchesIsFOW = false;\n let initialErrors = null;\n let initialized;\n let renderFallback;\n if (initialMatches == null && !init.patchRoutesOnNavigation) {\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname\n });\n let { matches, route } = getShortCircuitMatches(dataRoutes.activeRoutes);\n initialized = true;\n renderFallback = !initialized;\n initialMatches = matches;\n initialErrors = { [route.id]: error };\n } else {\n if (initialMatches && !init.hydrationData) {\n let fogOfWar = checkFogOfWar(\n initialMatches,\n dataRoutes.activeRoutes,\n init.history.location.pathname\n );\n if (fogOfWar.active) {\n initialMatches = null;\n }\n }\n if (!initialMatches) {\n initialized = false;\n renderFallback = !initialized;\n initialMatches = [];\n let fogOfWar = checkFogOfWar(\n null,\n dataRoutes.activeRoutes,\n init.history.location.pathname\n );\n if (fogOfWar.active && fogOfWar.matches) {\n initialMatchesIsFOW = true;\n initialMatches = fogOfWar.matches;\n }\n } else if (initialMatches.some((m) => m.route.lazy)) {\n initialized = false;\n renderFallback = !initialized;\n } else if (!initialMatches.some((m) => routeHasLoaderOrMiddleware(m.route))) {\n initialized = true;\n renderFallback = !initialized;\n } else {\n let loaderData = init.hydrationData ? init.hydrationData.loaderData : null;\n let errors = init.hydrationData ? init.hydrationData.errors : null;\n let relevantMatches = initialMatches;\n if (errors) {\n let idx = initialMatches.findIndex(\n (m) => errors[m.route.id] !== void 0\n );\n relevantMatches = relevantMatches.slice(0, idx + 1);\n }\n renderFallback = false;\n initialized = true;\n relevantMatches.forEach((m) => {\n let status = getRouteHydrationStatus(m.route, loaderData, errors);\n renderFallback = renderFallback || status.renderFallback;\n initialized = initialized && !status.shouldLoad;\n });\n }\n }\n let router;\n let state = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n renderFallback,\n navigation: IDLE_NAVIGATION,\n // Don't restore on initial updateState() if we were SSR'd\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: \"idle\",\n loaderData: init.hydrationData && init.hydrationData.loaderData || {},\n actionData: init.hydrationData && init.hydrationData.actionData || null,\n errors: init.hydrationData && init.hydrationData.errors || initialErrors,\n fetchers: /* @__PURE__ */ new Map(),\n blockers: /* @__PURE__ */ new Map()\n };\n let pendingAction = \"POP\" /* Pop */;\n let pendingPopstateNavigationDfd = null;\n let pendingPreventScrollReset = false;\n let pendingNavigationController;\n let pendingViewTransitionEnabled = false;\n let appliedViewTransitions = /* @__PURE__ */ new Map();\n let removePageHideEventListener = null;\n let isUninterruptedRevalidation = false;\n let isRevalidationRequired = false;\n let cancelledFetcherLoads = /* @__PURE__ */ new Set();\n let fetchControllers = /* @__PURE__ */ new Map();\n let incrementingLoadId = 0;\n let pendingNavigationLoadId = -1;\n let fetchReloadIds = /* @__PURE__ */ new Map();\n let fetchRedirectIds = /* @__PURE__ */ new Set();\n let fetchLoadMatches = /* @__PURE__ */ new Map();\n let activeFetchers = /* @__PURE__ */ new Map();\n let fetchersQueuedForDeletion = /* @__PURE__ */ new Set();\n let blockerFunctions = /* @__PURE__ */ new Map();\n let unblockBlockerHistoryUpdate = void 0;\n let pendingRevalidationDfd = null;\n function initialize() {\n unlistenHistory = init.history.listen(\n ({ action: historyAction, location, delta }) => {\n if (unblockBlockerHistoryUpdate) {\n unblockBlockerHistoryUpdate();\n unblockBlockerHistoryUpdate = void 0;\n return;\n }\n warning(\n blockerFunctions.size === 0 || delta != null,\n \"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.\"\n );\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction\n });\n if (blockerKey && delta != null) {\n let nextHistoryUpdatePromise = new Promise((resolve) => {\n unblockBlockerHistoryUpdate = resolve;\n });\n init.history.go(delta * -1);\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location,\n proceed() {\n updateBlocker(blockerKey, {\n state: \"proceeding\",\n proceed: void 0,\n reset: void 0,\n location\n });\n nextHistoryUpdatePromise.then(() => init.history.go(delta));\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey, IDLE_BLOCKER);\n updateState({ blockers });\n }\n });\n pendingPopstateNavigationDfd?.resolve();\n pendingPopstateNavigationDfd = null;\n return;\n }\n return startNavigation(historyAction, location);\n }\n );\n if (isBrowser3) {\n restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n let _saveAppliedTransitions = () => persistAppliedTransitions(routerWindow, appliedViewTransitions);\n routerWindow.addEventListener(\"pagehide\", _saveAppliedTransitions);\n removePageHideEventListener = () => routerWindow.removeEventListener(\"pagehide\", _saveAppliedTransitions);\n }\n if (!state.initialized) {\n startNavigation(\"POP\" /* Pop */, state.location, {\n initialHydration: true\n });\n }\n return router;\n }\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n if (removePageHideEventListener) {\n removePageHideEventListener();\n }\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(state.fetchers, key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n }\n function subscribe(fn) {\n subscribers.add(fn);\n if (bufferedInitialStateUpdate) {\n let { newErrors } = bufferedInitialStateUpdate;\n bufferedInitialStateUpdate = null;\n fn(state, {\n deletedFetchers: [],\n newErrors,\n viewTransitionOpts: void 0,\n flushSync: false\n });\n }\n return () => subscribers.delete(fn);\n }\n function updateState(newState, opts = {}) {\n if (newState.matches) {\n newState.matches = newState.matches.map((m) => {\n let route = manifest[m.route.id];\n let matchRoute = m.route;\n if (matchRoute.element !== route.element || matchRoute.errorElement !== route.errorElement || matchRoute.hydrateFallbackElement !== route.hydrateFallbackElement) {\n return {\n ...m,\n route\n };\n }\n return m;\n });\n }\n state = {\n ...state,\n ...newState\n };\n let unmountedFetchers = [];\n let mountedFetchers = [];\n state.fetchers.forEach((fetcher, key) => {\n if (fetcher.state === \"idle\") {\n if (fetchersQueuedForDeletion.has(key)) {\n unmountedFetchers.push(key);\n } else {\n mountedFetchers.push(key);\n }\n }\n });\n fetchersQueuedForDeletion.forEach((key) => {\n if (!state.fetchers.has(key) && !fetchControllers.has(key)) {\n unmountedFetchers.push(key);\n }\n });\n if (subscribers.size === 0) {\n bufferedInitialStateUpdate = { newErrors: newState.errors ?? null };\n }\n [...subscribers].forEach(\n (subscriber) => subscriber(state, {\n deletedFetchers: unmountedFetchers,\n newErrors: newState.errors ?? null,\n viewTransitionOpts: opts.viewTransitionOpts,\n flushSync: opts.flushSync === true\n })\n );\n unmountedFetchers.forEach((key) => deleteFetcher(state.fetchers, key));\n mountedFetchers.forEach((key) => state.fetchers.delete(key));\n }\n function completeNavigation(location, newState, { flushSync } = {}) {\n let isActionReload = state.actionData != null && state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && state.navigation.state === \"loading\" && location.state?._isRedirect !== true;\n let actionData;\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n actionData = null;\n }\n } else if (isActionReload) {\n actionData = state.actionData;\n } else {\n actionData = null;\n }\n let loaderData = newState.loaderData ? mergeLoaderData(\n state.loaderData,\n newState.loaderData,\n newState.matches || [],\n newState.errors\n ) : state.loaderData;\n let blockers = state.blockers;\n if (blockers.size > 0) {\n blockers = new Map(blockers);\n blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\n }\n let restoreScrollPosition = isUninterruptedRevalidation ? false : getSavedScrollPosition(location, newState.matches || state.matches);\n let preventScrollReset = pendingPreventScrollReset === true || state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && location.state?._isRedirect !== true;\n dataRoutes.commitHmrRoutes();\n if (isUninterruptedRevalidation) {\n } else if (pendingAction === \"POP\" /* Pop */) {\n } else if (pendingAction === \"PUSH\" /* Push */) {\n init.history.push(location, location.state);\n } else if (pendingAction === \"REPLACE\" /* Replace */) {\n init.history.replace(location, location.state);\n }\n let viewTransitionOpts;\n if (pendingAction === \"POP\" /* Pop */ && !isUninterruptedRevalidation && location !== state.location) {\n let priorPaths = appliedViewTransitions.get(state.location.pathname);\n if (priorPaths && priorPaths.has(location.pathname)) {\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location\n };\n } else if (appliedViewTransitions.has(location.pathname)) {\n viewTransitionOpts = {\n currentLocation: location,\n nextLocation: state.location\n };\n }\n } else if (pendingViewTransitionEnabled) {\n let toPaths = appliedViewTransitions.get(state.location.pathname);\n if (toPaths) {\n toPaths.add(location.pathname);\n } else {\n toPaths = /* @__PURE__ */ new Set([location.pathname]);\n appliedViewTransitions.set(state.location.pathname, toPaths);\n }\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location\n };\n }\n updateState(\n {\n ...newState,\n // matches, errors, fetchers go through as-is\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n renderFallback: false,\n navigation: IDLE_NAVIGATION,\n revalidation: \"idle\",\n restoreScrollPosition,\n preventScrollReset,\n blockers\n },\n {\n viewTransitionOpts,\n flushSync: flushSync === true\n }\n );\n pendingAction = \"POP\" /* Pop */;\n pendingPreventScrollReset = false;\n pendingViewTransitionEnabled = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n pendingPopstateNavigationDfd?.resolve();\n pendingPopstateNavigationDfd = null;\n pendingRevalidationDfd?.resolve();\n pendingRevalidationDfd = null;\n }\n async function navigate(to, opts) {\n pendingPopstateNavigationDfd?.resolve();\n pendingPopstateNavigationDfd = null;\n if (typeof to === \"number\") {\n if (!pendingPopstateNavigationDfd) {\n pendingPopstateNavigationDfd = createDeferred();\n }\n let promise = pendingPopstateNavigationDfd.promise;\n init.history.go(to);\n return promise;\n }\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n to,\n opts?.fromRouteId,\n opts?.relative\n );\n let { path, submission, error } = normalizeNavigateOptions(\n false,\n normalizedPath,\n opts\n );\n let maskPath;\n if (opts?.mask) {\n let partialPath = typeof opts.mask === \"string\" ? parsePath(opts.mask) : {\n ...state.location.mask,\n ...opts.mask\n };\n maskPath = {\n pathname: partialPath.pathname ?? \"\",\n search: partialPath.search ?? \"\",\n hash: partialPath.hash ?? \"\"\n };\n if (PROTOCOL_RELATIVE_URL_REGEX.test(maskPath.pathname)) {\n throw new Error(\"External navigation is not allowed\");\n } else if (maskPath.pathname.startsWith(\"\\\\\")) {\n maskPath.pathname = maskPath.pathname.replace(/^\\\\+/, \"/\");\n }\n validateNavigationTarget(\n typeof opts.mask === \"string\" ? opts.mask : createPath(opts.mask),\n createPath(maskPath),\n init.history.createURL(\"/\"),\n \"reject\"\n );\n }\n let currentLocation = state.location;\n let nextLocation = createLocation(\n currentLocation,\n path,\n opts && opts.state,\n void 0,\n maskPath\n );\n nextLocation = {\n ...nextLocation,\n ...init.history.encodeLocation(nextLocation)\n };\n validateNavigationTarget(\n to == null ? init.history.createHref(state.location) : typeof to === \"string\" ? to : createPath(to),\n init.history.createHref(nextLocation.mask || nextLocation),\n init.history.createURL(\"/\"),\n \"reject\"\n );\n let userReplace = opts && opts.replace != null ? opts.replace : void 0;\n let historyAction = \"PUSH\" /* Push */;\n if (userReplace === true) {\n historyAction = \"REPLACE\" /* Replace */;\n } else if (userReplace === false) {\n } else if (submission != null && isMutationMethod(submission.formMethod) && submission.formAction === state.location.pathname + state.location.search) {\n historyAction = \"REPLACE\" /* Replace */;\n }\n let preventScrollReset = opts && \"preventScrollReset\" in opts ? opts.preventScrollReset === true : void 0;\n let flushSync = (opts && opts.flushSync) === true;\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction\n });\n if (blockerKey) {\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location: nextLocation,\n proceed() {\n updateBlocker(blockerKey, {\n state: \"proceeding\",\n proceed: void 0,\n reset: void 0,\n location: nextLocation\n });\n navigate(to, opts);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey, IDLE_BLOCKER);\n updateState({ blockers });\n }\n });\n return;\n }\n await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace,\n enableViewTransition: opts && opts.viewTransition,\n flushSync,\n callSiteDefaultShouldRevalidate: opts && opts.defaultShouldRevalidate\n });\n }\n function revalidate() {\n if (!pendingRevalidationDfd) {\n pendingRevalidationDfd = createDeferred();\n }\n interruptActiveLoads();\n updateState({ revalidation: \"loading\" });\n let promise = pendingRevalidationDfd.promise;\n if (state.navigation.state === \"submitting\") {\n return promise;\n }\n if (state.navigation.state === \"idle\") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true\n });\n return promise;\n }\n startNavigation(\n pendingAction || state.historyAction,\n state.navigation.location,\n {\n overrideNavigation: state.navigation,\n // Proxy through any rending view transition\n enableViewTransition: pendingViewTransitionEnabled === true\n }\n );\n return promise;\n }\n async function startNavigation(historyAction, location, opts) {\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation = (opts && opts.startUninterruptedRevalidation) === true;\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n let routesToUse = dataRoutes.activeRoutes;\n let matches = opts?.initialHydration && state.matches && state.matches.length > 0 && !initialMatchesIsFOW ? (\n // `matchRoutes()` has already been called if we're in here via `router.initialize()`\n state.matches\n ) : matchRoutesImpl(\n routesToUse,\n location,\n basename,\n false,\n dataRoutes.branches\n );\n let flushSync = (opts && opts.flushSync) === true;\n if (matches && state.initialized && !isRevalidationRequired && isHashChangeOnly(state.location, location) && !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))) {\n completeNavigation(location, { matches }, { flushSync });\n return;\n }\n let fogOfWar = checkFogOfWar(matches, routesToUse, location.pathname);\n if (fogOfWar.active && fogOfWar.matches) {\n matches = fogOfWar.matches;\n }\n if (!matches) {\n let { error, notFoundMatches, route } = handleNavigational404(\n location.pathname\n );\n completeNavigation(\n location,\n {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error\n }\n },\n { flushSync }\n );\n return;\n }\n let loadingNavigation = opts && opts.overrideNavigation ? {\n ...opts.overrideNavigation,\n matches,\n historyAction\n } : void 0;\n pendingNavigationController = new AbortController();\n let request = createClientSideRequest(\n init.history,\n location,\n pendingNavigationController.signal,\n opts && opts.submission\n );\n let scopedContext = init.getContext ? await init.getContext() : new RouterContextProvider();\n let pendingActionResult;\n if (opts && opts.pendingError) {\n pendingActionResult = [\n findNearestBoundary(matches).route.id,\n { type: \"error\" /* error */, error: opts.pendingError }\n ];\n } else if (opts && opts.submission && isMutationMethod(opts.submission.formMethod)) {\n let actionResult = await handleAction(\n request,\n location,\n opts.submission,\n matches,\n historyAction,\n scopedContext,\n fogOfWar.active,\n opts && opts.initialHydration === true,\n { replace: opts.replace, flushSync }\n );\n if (actionResult.shortCircuited) {\n return;\n }\n if (actionResult.pendingActionResult) {\n let [routeId, result] = actionResult.pendingActionResult;\n if (isErrorResult(result) && isRouteErrorResponse(result.error) && result.error.status === 404) {\n pendingNavigationController = null;\n completeNavigation(location, {\n matches: actionResult.matches,\n loaderData: {},\n errors: {\n [routeId]: result.error\n }\n });\n return;\n }\n }\n matches = actionResult.matches || matches;\n pendingActionResult = actionResult.pendingActionResult;\n loadingNavigation = getLoadingNavigation(\n location,\n matches,\n historyAction,\n opts.submission\n );\n flushSync = false;\n fogOfWar.active = false;\n request = createClientSideRequest(\n init.history,\n request.url,\n request.signal\n );\n }\n let {\n shortCircuited,\n matches: updatedMatches,\n loaderData,\n errors,\n workingFetchers\n } = await handleLoaders(\n request,\n location,\n matches,\n historyAction,\n scopedContext,\n fogOfWar.active,\n loadingNavigation,\n opts && opts.submission,\n opts && opts.fetcherSubmission,\n opts && opts.replace,\n opts && opts.initialHydration === true,\n flushSync,\n pendingActionResult,\n opts && opts.callSiteDefaultShouldRevalidate\n );\n if (shortCircuited) {\n return;\n }\n pendingNavigationController = null;\n completeNavigation(location, {\n matches: updatedMatches || matches,\n ...getActionDataForCommit(pendingActionResult),\n loaderData,\n errors,\n ...workingFetchers ? { fetchers: workingFetchers } : {}\n });\n }\n async function handleAction(request, location, submission, matches, historyAction, scopedContext, isFogOfWar, initialHydration, opts = {}) {\n interruptActiveLoads();\n let navigation = getSubmittingNavigation(\n location,\n matches,\n historyAction,\n submission\n );\n updateState({ navigation }, { flushSync: opts.flushSync === true });\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n matches,\n location.pathname,\n request.signal\n );\n if (discoverResult.type === \"aborted\") {\n return { shortCircuited: true };\n } else if (discoverResult.type === \"error\") {\n if (discoverResult.partialMatches.length === 0) {\n let { matches: matches2, route } = getShortCircuitMatches(\n dataRoutes.activeRoutes\n );\n return {\n matches: matches2,\n pendingActionResult: [\n route.id,\n {\n type: \"error\" /* error */,\n error: discoverResult.error\n }\n ]\n };\n }\n let boundaryId = findNearestBoundary(discoverResult.partialMatches).route.id;\n return {\n matches: discoverResult.partialMatches,\n pendingActionResult: [\n boundaryId,\n {\n type: \"error\" /* error */,\n error: discoverResult.error\n }\n ]\n };\n } else if (!discoverResult.matches) {\n let { notFoundMatches, error, route } = handleNavigational404(\n location.pathname\n );\n return {\n matches: notFoundMatches,\n pendingActionResult: [\n route.id,\n {\n type: \"error\" /* error */,\n error\n }\n ]\n };\n } else {\n matches = discoverResult.matches;\n }\n }\n let result;\n let actionMatch = getTargetMatch(matches, location);\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n result = {\n type: \"error\" /* error */,\n error: getInternalRouterError(405, {\n method: request.method,\n pathname: location.pathname,\n routeId: actionMatch.route.id\n })\n };\n } else {\n let dsMatches = getTargetedDataStrategyMatches(\n mapRouteProperties2,\n manifest,\n request,\n location,\n matches,\n actionMatch,\n initialHydration ? [] : hydrationRouteProperties2,\n scopedContext\n );\n let results = await callDataStrategy(\n request,\n location,\n dsMatches,\n scopedContext,\n null\n );\n result = results[actionMatch.route.id];\n if (!result) {\n for (let match of matches) {\n if (results[match.route.id]) {\n result = results[match.route.id];\n break;\n }\n }\n }\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n }\n if (isRedirectResult(result)) {\n let replace2;\n if (opts && opts.replace != null) {\n replace2 = opts.replace;\n } else {\n let location2 = normalizeRedirectLocation(\n result.response.headers.get(\"Location\"),\n new URL(request.url),\n basename,\n init.history\n );\n replace2 = location2 === state.location.pathname + state.location.search;\n }\n await startRedirectNavigation(request, result, true, {\n submission,\n replace: replace2\n });\n return { shortCircuited: true };\n }\n if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n if ((opts && opts.replace) !== true) {\n pendingAction = \"PUSH\" /* Push */;\n }\n return {\n matches,\n pendingActionResult: [\n boundaryMatch.route.id,\n result,\n actionMatch.route.id\n ]\n };\n }\n return {\n matches,\n pendingActionResult: [actionMatch.route.id, result]\n };\n }\n async function handleLoaders(request, location, matches, historyAction, scopedContext, isFogOfWar, overrideNavigation, submission, fetcherSubmission, replace2, initialHydration, flushSync, pendingActionResult, callSiteDefaultShouldRevalidate) {\n let loadingNavigation = overrideNavigation || getLoadingNavigation(location, matches, historyAction, submission);\n let activeSubmission = submission || fetcherSubmission || getSubmissionFromNavigation(loadingNavigation);\n let shouldUpdateNavigationState = !isUninterruptedRevalidation && !initialHydration;\n if (isFogOfWar) {\n if (shouldUpdateNavigationState) {\n let actionData = getUpdatedActionData(pendingActionResult);\n updateState(\n {\n navigation: loadingNavigation,\n ...actionData !== void 0 ? { actionData } : {}\n },\n {\n flushSync\n }\n );\n }\n let discoverResult = await discoverRoutes(\n matches,\n location.pathname,\n request.signal\n );\n if (discoverResult.type === \"aborted\") {\n return { shortCircuited: true };\n } else if (discoverResult.type === \"error\") {\n if (discoverResult.partialMatches.length === 0) {\n let { matches: matches2, route } = getShortCircuitMatches(\n dataRoutes.activeRoutes\n );\n return {\n matches: matches2,\n loaderData: {},\n errors: {\n [route.id]: discoverResult.error\n }\n };\n }\n let boundaryId = findNearestBoundary(discoverResult.partialMatches).route.id;\n return {\n matches: discoverResult.partialMatches,\n loaderData: {},\n errors: {\n [boundaryId]: discoverResult.error\n }\n };\n } else if (!discoverResult.matches) {\n let { error, notFoundMatches, route } = handleNavigational404(\n location.pathname\n );\n return {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error\n }\n };\n } else {\n matches = discoverResult.matches;\n }\n }\n let routesToUse = dataRoutes.activeRoutes;\n let { dsMatches, revalidatingFetchers } = getMatchesToLoad(\n request,\n scopedContext,\n mapRouteProperties2,\n manifest,\n init.history,\n state,\n matches,\n activeSubmission,\n location,\n initialHydration ? [] : hydrationRouteProperties2,\n initialHydration === true,\n isRevalidationRequired,\n cancelledFetcherLoads,\n fetchersQueuedForDeletion,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n init.patchRoutesOnNavigation != null,\n dataRoutes.branches,\n pendingActionResult,\n callSiteDefaultShouldRevalidate\n );\n pendingNavigationLoadId = ++incrementingLoadId;\n if (!init.dataStrategy && !dsMatches.some((m) => m.shouldLoad) && !dsMatches.some(\n (m) => m.route.middleware && m.route.middleware.length > 0\n ) && revalidatingFetchers.length === 0) {\n let workingFetchers2 = new Map(state.fetchers);\n let didUpdateFetcherRedirects2 = markFetchRedirectsDone(workingFetchers2);\n completeNavigation(\n location,\n {\n matches,\n loaderData: {},\n // Commit pending error if we're short circuiting\n errors: pendingActionResult && isErrorResult(pendingActionResult[1]) ? { [pendingActionResult[0]]: pendingActionResult[1].error } : null,\n ...getActionDataForCommit(pendingActionResult),\n ...didUpdateFetcherRedirects2 ? { fetchers: workingFetchers2 } : {}\n },\n { flushSync }\n );\n return { shortCircuited: true };\n }\n if (shouldUpdateNavigationState) {\n let updates = {};\n if (!isFogOfWar) {\n updates.navigation = loadingNavigation;\n let actionData = getUpdatedActionData(pendingActionResult);\n if (actionData !== void 0) {\n updates.actionData = actionData;\n }\n }\n if (revalidatingFetchers.length > 0) {\n updates.fetchers = getUpdatedRevalidatingFetchers(revalidatingFetchers);\n }\n updateState(updates, { flushSync });\n }\n revalidatingFetchers.forEach((rf) => {\n abortFetcher(rf.key);\n if (rf.controller) {\n fetchControllers.set(rf.key, rf.controller);\n }\n });\n let abortPendingFetchRevalidations = () => revalidatingFetchers.forEach((f) => abortFetcher(f.key));\n if (pendingNavigationController) {\n pendingNavigationController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n let { loaderResults, fetcherResults } = await callLoadersAndMaybeResolveData(\n dsMatches,\n revalidatingFetchers,\n request,\n location,\n scopedContext\n );\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n if (pendingNavigationController) {\n pendingNavigationController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n revalidatingFetchers.forEach((rf) => fetchControllers.delete(rf.key));\n let redirect2 = findRedirect(loaderResults);\n if (redirect2) {\n await startRedirectNavigation(request, redirect2.result, true, {\n replace: replace2\n });\n return { shortCircuited: true };\n }\n redirect2 = findRedirect(fetcherResults);\n if (redirect2) {\n fetchRedirectIds.add(redirect2.key);\n await startRedirectNavigation(request, redirect2.result, true, {\n replace: replace2\n });\n return { shortCircuited: true };\n }\n let workingFetchers = new Map(state.fetchers);\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n loaderResults,\n pendingActionResult,\n revalidatingFetchers,\n fetcherResults,\n workingFetchers\n );\n if (initialHydration && state.errors) {\n errors = { ...state.errors, ...errors };\n }\n let didUpdateFetcherRedirects = markFetchRedirectsDone(workingFetchers);\n let didAbortFetchLoads = abortStaleFetchLoads(\n pendingNavigationLoadId,\n workingFetchers\n );\n let shouldUpdateFetchers = didUpdateFetcherRedirects || didAbortFetchLoads || revalidatingFetchers.length > 0;\n return {\n matches,\n loaderData,\n errors,\n ...shouldUpdateFetchers ? { workingFetchers } : {}\n };\n }\n function getUpdatedActionData(pendingActionResult) {\n if (pendingActionResult && !isErrorResult(pendingActionResult[1])) {\n return {\n [pendingActionResult[0]]: pendingActionResult[1].data\n };\n } else if (state.actionData) {\n if (Object.keys(state.actionData).length === 0) {\n return null;\n } else {\n return state.actionData;\n }\n }\n }\n function getUpdatedRevalidatingFetchers(revalidatingFetchers) {\n let workingFetchers = new Map(state.fetchers);\n revalidatingFetchers.forEach((rf) => {\n let fetcher = workingFetchers.get(rf.key);\n let revalidatingFetcher = getLoadingFetcher(\n void 0,\n fetcher ? fetcher.data : void 0\n );\n workingFetchers.set(rf.key, revalidatingFetcher);\n });\n return workingFetchers;\n }\n async function fetch2(key, routeId, href, opts) {\n abortFetcher(key);\n let flushSync = (opts && opts.flushSync) === true;\n let routesToUse = dataRoutes.activeRoutes;\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n href,\n routeId,\n opts?.relative\n );\n let matches = matchRoutesImpl(\n routesToUse,\n normalizedPath,\n basename,\n false,\n dataRoutes.branches\n );\n let fogOfWar = checkFogOfWar(matches, routesToUse, normalizedPath);\n if (fogOfWar.active && fogOfWar.matches) {\n matches = fogOfWar.matches;\n }\n if (!matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: normalizedPath }),\n { flushSync }\n );\n return;\n }\n let { path, submission, error } = normalizeNavigateOptions(\n true,\n normalizedPath,\n opts\n );\n if (error) {\n setFetcherError(key, routeId, error, { flushSync });\n return;\n }\n let scopedContext = init.getContext ? await init.getContext() : new RouterContextProvider();\n let preventScrollReset = (opts && opts.preventScrollReset) === true;\n if (submission && isMutationMethod(submission.formMethod)) {\n await handleFetcherAction(\n key,\n routeId,\n path,\n matches,\n scopedContext,\n fogOfWar.active,\n flushSync,\n preventScrollReset,\n submission,\n opts && opts.defaultShouldRevalidate\n );\n return;\n }\n fetchLoadMatches.set(key, { routeId, path });\n await handleFetcherLoader(\n key,\n routeId,\n path,\n matches,\n scopedContext,\n fogOfWar.active,\n flushSync,\n preventScrollReset,\n submission\n );\n }\n async function handleFetcherAction(key, routeId, path, requestMatches, scopedContext, isFogOfWar, flushSync, preventScrollReset, submission, callSiteDefaultShouldRevalidate) {\n interruptActiveLoads();\n fetchLoadMatches.delete(key);\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {\n flushSync\n });\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal,\n submission\n );\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n requestMatches,\n new URL(fetchRequest.url).pathname,\n fetchRequest.signal,\n key\n );\n if (discoverResult.type === \"aborted\") {\n return;\n } else if (discoverResult.type === \"error\") {\n setFetcherError(key, routeId, discoverResult.error, { flushSync });\n return;\n } else if (!discoverResult.matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: path }),\n { flushSync }\n );\n return;\n } else {\n requestMatches = discoverResult.matches;\n }\n }\n let match = getTargetMatch(requestMatches, path);\n if (!match.route.action && !match.route.lazy) {\n let error = getInternalRouterError(405, {\n method: submission.formMethod,\n pathname: path,\n routeId\n });\n setFetcherError(key, routeId, error, { flushSync });\n return;\n }\n fetchControllers.set(key, abortController);\n let originatingLoadId = incrementingLoadId;\n let fetchMatches = getTargetedDataStrategyMatches(\n mapRouteProperties2,\n manifest,\n fetchRequest,\n path,\n requestMatches,\n match,\n hydrationRouteProperties2,\n scopedContext\n );\n let actionResults = await callDataStrategy(\n fetchRequest,\n path,\n fetchMatches,\n scopedContext,\n key\n );\n let actionResult = actionResults[match.route.id];\n if (!actionResult) {\n for (let match2 of fetchMatches) {\n if (actionResults[match2.route.id]) {\n actionResult = actionResults[match2.route.id];\n break;\n }\n }\n }\n if (fetchRequest.signal.aborted) {\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n return;\n }\n if (fetchersQueuedForDeletion.has(key)) {\n if (isRedirectResult(actionResult) || isErrorResult(actionResult)) {\n updateFetcherState(key, getDoneFetcher(void 0));\n return;\n }\n } else {\n if (isRedirectResult(actionResult)) {\n fetchControllers.delete(key);\n if (pendingNavigationLoadId > originatingLoadId) {\n updateFetcherState(key, getDoneFetcher(void 0));\n return;\n } else {\n fetchRedirectIds.add(key);\n updateFetcherState(key, getLoadingFetcher(submission));\n return startRedirectNavigation(fetchRequest, actionResult, false, {\n fetcherSubmission: submission,\n preventScrollReset\n });\n }\n }\n if (isErrorResult(actionResult)) {\n setFetcherError(key, routeId, actionResult.error);\n return;\n }\n }\n let nextLocation = state.navigation.location || state.location;\n let revalidationRequest = createClientSideRequest(\n init.history,\n nextLocation,\n abortController.signal\n );\n let routesToUse = dataRoutes.activeRoutes;\n let matches = state.navigation.state !== \"idle\" ? matchRoutesImpl(\n routesToUse,\n state.navigation.location,\n basename,\n false,\n dataRoutes.branches\n ) : state.matches;\n invariant(matches, \"Didn't find any matches after fetcher action\");\n let loadId = ++incrementingLoadId;\n fetchReloadIds.set(key, loadId);\n let { dsMatches, revalidatingFetchers } = getMatchesToLoad(\n revalidationRequest,\n scopedContext,\n mapRouteProperties2,\n manifest,\n init.history,\n state,\n matches,\n submission,\n nextLocation,\n hydrationRouteProperties2,\n false,\n isRevalidationRequired,\n cancelledFetcherLoads,\n fetchersQueuedForDeletion,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n init.patchRoutesOnNavigation != null,\n dataRoutes.branches,\n [match.route.id, actionResult],\n callSiteDefaultShouldRevalidate\n );\n let loadFetcher = getLoadingFetcher(submission, actionResult.data);\n let workingFetchers = new Map(state.fetchers);\n workingFetchers.set(key, loadFetcher);\n revalidatingFetchers.filter((rf) => rf.key !== key).forEach((rf) => {\n let staleKey = rf.key;\n let existingFetcher2 = workingFetchers.get(staleKey);\n let revalidatingFetcher = getLoadingFetcher(\n void 0,\n existingFetcher2 ? existingFetcher2.data : void 0\n );\n workingFetchers.set(staleKey, revalidatingFetcher);\n abortFetcher(staleKey);\n if (rf.controller) {\n fetchControllers.set(staleKey, rf.controller);\n }\n });\n updateState({ fetchers: workingFetchers });\n let abortPendingFetchRevalidations = () => revalidatingFetchers.forEach((rf) => abortFetcher(rf.key));\n abortController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n let { loaderResults, fetcherResults } = await callLoadersAndMaybeResolveData(\n dsMatches,\n revalidatingFetchers,\n revalidationRequest,\n nextLocation,\n scopedContext\n );\n if (abortController.signal.aborted) {\n return;\n }\n abortController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n fetchReloadIds.delete(key);\n fetchControllers.delete(key);\n revalidatingFetchers.forEach((r) => fetchControllers.delete(r.key));\n let fetcherIsMounted = state.fetchers.has(key);\n let getRedirectStateWithDoneFetcher = (s) => {\n if (!fetcherIsMounted) return s;\n let workingFetchers2 = new Map(s.fetchers);\n workingFetchers2.set(key, getDoneFetcher(actionResult.data));\n return { ...s, fetchers: workingFetchers2 };\n };\n let redirect2 = findRedirect(loaderResults);\n if (redirect2) {\n state = getRedirectStateWithDoneFetcher(state);\n return startRedirectNavigation(\n revalidationRequest,\n redirect2.result,\n false,\n { preventScrollReset }\n );\n }\n redirect2 = findRedirect(fetcherResults);\n if (redirect2) {\n fetchRedirectIds.add(redirect2.key);\n state = getRedirectStateWithDoneFetcher(state);\n return startRedirectNavigation(\n revalidationRequest,\n redirect2.result,\n false,\n { preventScrollReset }\n );\n }\n let finalFetchers = new Map(state.fetchers);\n if (fetcherIsMounted) {\n finalFetchers.set(key, getDoneFetcher(actionResult.data));\n }\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n loaderResults,\n void 0,\n revalidatingFetchers,\n fetcherResults,\n finalFetchers\n );\n abortStaleFetchLoads(loadId, finalFetchers);\n if (state.navigation.state === \"loading\" && loadId > pendingNavigationLoadId) {\n invariant(pendingAction, \"Expected pending action\");\n pendingNavigationController && pendingNavigationController.abort();\n completeNavigation(state.navigation.location, {\n matches,\n loaderData,\n errors,\n fetchers: finalFetchers\n });\n } else {\n updateState({\n errors,\n loaderData: mergeLoaderData(\n state.loaderData,\n loaderData,\n matches,\n errors\n ),\n fetchers: finalFetchers\n });\n isRevalidationRequired = false;\n }\n }\n async function handleFetcherLoader(key, routeId, path, matches, scopedContext, isFogOfWar, flushSync, preventScrollReset, submission) {\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(\n key,\n getLoadingFetcher(\n submission,\n existingFetcher ? existingFetcher.data : void 0\n ),\n { flushSync }\n );\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal\n );\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n matches,\n new URL(fetchRequest.url).pathname,\n fetchRequest.signal,\n key\n );\n if (discoverResult.type === \"aborted\") {\n return;\n } else if (discoverResult.type === \"error\") {\n setFetcherError(key, routeId, discoverResult.error, { flushSync });\n return;\n } else if (!discoverResult.matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: path }),\n { flushSync }\n );\n return;\n } else {\n matches = discoverResult.matches;\n }\n }\n let match = getTargetMatch(matches, path);\n fetchControllers.set(key, abortController);\n let originatingLoadId = incrementingLoadId;\n let dsMatches = getTargetedDataStrategyMatches(\n mapRouteProperties2,\n manifest,\n fetchRequest,\n path,\n matches,\n match,\n hydrationRouteProperties2,\n scopedContext\n );\n let results = await callDataStrategy(\n fetchRequest,\n path,\n dsMatches,\n scopedContext,\n key\n );\n let result = results[match.route.id];\n if (!result) {\n for (let match2 of matches) {\n if (results[match2.route.id]) {\n result = results[match2.route.id];\n break;\n }\n }\n }\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n if (fetchRequest.signal.aborted) {\n return;\n }\n if (fetchersQueuedForDeletion.has(key)) {\n updateFetcherState(key, getDoneFetcher(void 0));\n return;\n }\n if (isRedirectResult(result)) {\n if (pendingNavigationLoadId > originatingLoadId) {\n updateFetcherState(key, getDoneFetcher(void 0));\n return;\n } else {\n fetchRedirectIds.add(key);\n await startRedirectNavigation(fetchRequest, result, false, {\n preventScrollReset\n });\n return;\n }\n }\n if (isErrorResult(result)) {\n setFetcherError(key, routeId, result.error);\n return;\n }\n updateFetcherState(key, getDoneFetcher(result.data));\n }\n async function startRedirectNavigation(request, redirect2, isNavigation, {\n submission,\n fetcherSubmission,\n preventScrollReset,\n replace: replace2\n } = {}) {\n if (!isNavigation) {\n pendingPopstateNavigationDfd?.resolve();\n pendingPopstateNavigationDfd = null;\n }\n if (redirect2.response.headers.has(\"X-Remix-Revalidate\")) {\n isRevalidationRequired = true;\n }\n let location = redirect2.response.headers.get(\"Location\");\n invariant(location, \"Expected a Location header on the redirect Response\");\n let originalLocation = location;\n let currentUrl = new URL(request.url);\n location = normalizeRedirectLocation(\n location,\n currentUrl,\n basename,\n init.history\n );\n validateNavigationTarget(\n originalLocation,\n location,\n currentUrl,\n \"allow-explicit\"\n );\n let redirectLocation = createLocation(state.location, location, {\n _isRedirect: true\n });\n if (isBrowser3) {\n let isDocumentReload = false;\n if (redirect2.response.headers.has(\"X-Remix-Reload-Document\")) {\n isDocumentReload = true;\n } else if (isAbsoluteUrl(location)) {\n const url = createBrowserURLImpl(routerWindow, location, true);\n isDocumentReload = // Hard reload if it's an absolute URL to a new origin\n url.origin !== routerWindow.location.origin || // Hard reload if it's an absolute URL that does not match our basename\n stripBasename(url.pathname, basename) == null;\n }\n if (isDocumentReload) {\n if (replace2) {\n routerWindow.location.replace(location);\n } else {\n routerWindow.location.assign(location);\n }\n return;\n }\n }\n pendingNavigationController = null;\n let redirectNavigationType = replace2 === true || redirect2.response.headers.has(\"X-Remix-Replace\") ? \"REPLACE\" /* Replace */ : \"PUSH\" /* Push */;\n let { formMethod, formAction, formEncType } = state.navigation;\n if (!submission && !fetcherSubmission && formMethod && formAction && formEncType) {\n submission = getSubmissionFromNavigation(state.navigation);\n }\n let activeSubmission = submission || fetcherSubmission;\n if (redirectPreserveMethodStatusCodes.has(redirect2.response.status) && activeSubmission && isMutationMethod(activeSubmission.formMethod)) {\n await startNavigation(redirectNavigationType, redirectLocation, {\n submission: {\n ...activeSubmission,\n formAction: location\n },\n // Preserve these flags across redirects\n preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n enableViewTransition: isNavigation ? pendingViewTransitionEnabled : void 0\n });\n } else {\n let overrideNavigation = getLoadingNavigation(\n redirectLocation,\n [],\n redirectNavigationType,\n submission\n );\n await startNavigation(redirectNavigationType, redirectLocation, {\n overrideNavigation,\n // Send fetcher submissions through for shouldRevalidate\n fetcherSubmission,\n // Preserve these flags across redirects\n preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n enableViewTransition: isNavigation ? pendingViewTransitionEnabled : void 0\n });\n }\n }\n async function callDataStrategy(request, path, matches, scopedContext, fetcherKey) {\n let results;\n let dataResults = {};\n try {\n results = await callDataStrategyImpl(\n dataStrategyImpl,\n request,\n path,\n matches,\n fetcherKey,\n scopedContext,\n false\n );\n } catch (e) {\n matches.filter((m) => m.shouldLoad).forEach((m) => {\n dataResults[m.route.id] = {\n type: \"error\" /* error */,\n error: e\n };\n });\n return dataResults;\n }\n if (request.signal.aborted) {\n return dataResults;\n }\n if (!isMutationMethod(request.method)) {\n for (let match of matches) {\n if (results[match.route.id]?.type === \"error\" /* error */) {\n break;\n }\n if (!results.hasOwnProperty(match.route.id) && !state.loaderData.hasOwnProperty(match.route.id) && (!state.errors || !state.errors.hasOwnProperty(match.route.id)) && match.shouldCallHandler()) {\n results[match.route.id] = {\n type: \"error\" /* error */,\n result: new Error(\n `No result returned from dataStrategy for route ${match.route.id}`\n )\n };\n }\n }\n }\n for (let [routeId, result] of Object.entries(results)) {\n if (isRedirectDataStrategyResult(result)) {\n let response = result.result;\n dataResults[routeId] = {\n type: \"redirect\" /* redirect */,\n response: normalizeRelativeRoutingRedirectResponse(\n response,\n request,\n routeId,\n matches,\n basename\n )\n };\n } else {\n dataResults[routeId] = await convertDataStrategyResultToDataResult(result);\n }\n }\n return dataResults;\n }\n async function callLoadersAndMaybeResolveData(matches, fetchersToLoad, request, location, scopedContext) {\n let loaderResultsPromise = callDataStrategy(\n request,\n location,\n matches,\n scopedContext,\n null\n );\n let fetcherResultsPromise = Promise.all(\n fetchersToLoad.map(async (f) => {\n if (f.matches && f.match && f.request && f.controller) {\n let results = await callDataStrategy(\n f.request,\n f.path,\n f.matches,\n scopedContext,\n f.key\n );\n let result = results[f.match.route.id];\n return { [f.key]: result };\n } else {\n return Promise.resolve({\n [f.key]: {\n type: \"error\" /* error */,\n error: getInternalRouterError(404, {\n pathname: f.path\n })\n }\n });\n }\n })\n );\n let loaderResults = await loaderResultsPromise;\n let fetcherResults = (await fetcherResultsPromise).reduce(\n (acc, r) => Object.assign(acc, r),\n {}\n );\n return {\n loaderResults,\n fetcherResults\n };\n }\n function interruptActiveLoads() {\n isRevalidationRequired = true;\n fetchLoadMatches.forEach((_, key) => {\n if (fetchControllers.has(key)) {\n cancelledFetcherLoads.add(key);\n }\n abortFetcher(key);\n });\n }\n function updateFetcherState(key, fetcher, opts = {}) {\n let workingFetchers = new Map(state.fetchers);\n workingFetchers.set(key, fetcher);\n updateState(\n { fetchers: workingFetchers },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n function setFetcherError(key, routeId, error, opts = {}) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n let workingFetchers = new Map(state.fetchers);\n deleteFetcher(workingFetchers, key);\n updateState(\n {\n errors: {\n [boundaryMatch.route.id]: error\n },\n fetchers: workingFetchers\n },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n function getFetcher(key) {\n activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);\n if (fetchersQueuedForDeletion.has(key)) {\n fetchersQueuedForDeletion.delete(key);\n }\n return state.fetchers.get(key) || IDLE_FETCHER;\n }\n function resetFetcher(key, opts) {\n abortFetcher(key, opts?.reason);\n updateFetcherState(key, getDoneFetcher(null));\n }\n function deleteFetcher(fetchers, key) {\n let fetcher = state.fetchers.get(key);\n if (fetchControllers.has(key) && !(fetcher && fetcher.state === \"loading\" && fetchReloadIds.has(key))) {\n abortFetcher(key);\n }\n fetchLoadMatches.delete(key);\n fetchReloadIds.delete(key);\n fetchRedirectIds.delete(key);\n fetchersQueuedForDeletion.delete(key);\n cancelledFetcherLoads.delete(key);\n fetchers.delete(key);\n }\n function queueFetcherForDeletion(key) {\n let count = (activeFetchers.get(key) || 0) - 1;\n if (count <= 0) {\n activeFetchers.delete(key);\n fetchersQueuedForDeletion.add(key);\n } else {\n activeFetchers.set(key, count);\n }\n updateState({ fetchers: new Map(state.fetchers) });\n }\n function abortFetcher(key, reason) {\n let controller = fetchControllers.get(key);\n if (controller) {\n controller.abort(reason);\n fetchControllers.delete(key);\n }\n }\n function markFetchersDone(keys, fetchers) {\n for (let key of keys) {\n let fetcher = fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n let doneFetcher = getDoneFetcher(fetcher.data);\n fetchers.set(key, doneFetcher);\n }\n }\n function markFetchRedirectsDone(fetchers) {\n let doneKeys = [];\n let didUpdateFetchers = false;\n for (let key of fetchRedirectIds) {\n let fetcher = fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n fetchRedirectIds.delete(key);\n doneKeys.push(key);\n didUpdateFetchers = true;\n }\n }\n markFetchersDone(doneKeys, fetchers);\n return didUpdateFetchers;\n }\n function abortStaleFetchLoads(landedId, fetchers) {\n let yeetedKeys = [];\n for (let [key, id] of fetchReloadIds) {\n if (id < landedId) {\n let fetcher = fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n abortFetcher(key);\n fetchReloadIds.delete(key);\n yeetedKeys.push(key);\n }\n }\n }\n markFetchersDone(yeetedKeys, fetchers);\n return yeetedKeys.length > 0;\n }\n function getBlocker(key, fn) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n if (blockerFunctions.get(key) !== fn) {\n blockerFunctions.set(key, fn);\n }\n return blocker;\n }\n function deleteBlocker(key) {\n state.blockers.delete(key);\n blockerFunctions.delete(key);\n }\n function updateBlocker(key, newBlocker) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n invariant(\n blocker.state === \"unblocked\" && newBlocker.state === \"blocked\" || blocker.state === \"blocked\" && newBlocker.state === \"blocked\" || blocker.state === \"blocked\" && newBlocker.state === \"proceeding\" || blocker.state === \"blocked\" && newBlocker.state === \"unblocked\" || blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\",\n `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}`\n );\n let blockers = new Map(state.blockers);\n blockers.set(key, newBlocker);\n updateState({ blockers });\n }\n function shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction\n }) {\n if (blockerFunctions.size === 0) {\n return;\n }\n if (blockerFunctions.size > 1) {\n warning(false, \"A router only supports one blocker at a time\");\n }\n let entries = Array.from(blockerFunctions.entries());\n let [blockerKey, blockerFunction] = entries[entries.length - 1];\n let blocker = state.blockers.get(blockerKey);\n if (blocker && blocker.state === \"proceeding\") {\n return;\n }\n if (blockerFunction({ currentLocation, nextLocation, historyAction })) {\n return blockerKey;\n }\n }\n function handleNavigational404(pathname) {\n let error = getInternalRouterError(404, { pathname });\n let routesToUse = dataRoutes.activeRoutes;\n let { matches, route } = getShortCircuitMatches(routesToUse);\n return { notFoundMatches: matches, route, error };\n }\n function enableScrollRestoration(positions, getPosition, getKey) {\n savedScrollPositions2 = positions;\n getScrollPosition = getPosition;\n getScrollRestorationKey2 = getKey || null;\n if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n initialScrollRestored = true;\n let y = getSavedScrollPosition(state.location, state.matches);\n if (y != null) {\n updateState({ restoreScrollPosition: y });\n }\n }\n return () => {\n savedScrollPositions2 = null;\n getScrollPosition = null;\n getScrollRestorationKey2 = null;\n };\n }\n function getScrollKey(location, matches) {\n if (getScrollRestorationKey2) {\n let key = getScrollRestorationKey2(\n location,\n matches.map((m) => convertRouteMatchToUiMatch(m, state.loaderData))\n );\n return key || location.key;\n }\n return location.key;\n }\n function saveScrollPosition(location, matches) {\n if (savedScrollPositions2 && getScrollPosition) {\n let key = getScrollKey(location, matches);\n savedScrollPositions2[key] = getScrollPosition();\n }\n }\n function getSavedScrollPosition(location, matches) {\n if (savedScrollPositions2) {\n let key = getScrollKey(location, matches);\n let y = savedScrollPositions2[key];\n if (typeof y === \"number\") {\n return y;\n }\n }\n return null;\n }\n function checkFogOfWar(matches, routesToUse, pathname) {\n if (init.patchRoutesOnNavigation) {\n let activeBranches = dataRoutes.branches;\n if (!matches) {\n let fogMatches = matchRoutesImpl(\n routesToUse,\n pathname,\n basename,\n true,\n activeBranches\n );\n return { active: true, matches: fogMatches || [] };\n } else {\n if (Object.keys(matches[0].params).length > 0) {\n let partialMatches = matchRoutesImpl(\n routesToUse,\n pathname,\n basename,\n true,\n activeBranches\n );\n return { active: true, matches: partialMatches };\n }\n }\n }\n return { active: false, matches: null };\n }\n async function discoverRoutes(matches, pathname, signal, fetcherKey) {\n if (!init.patchRoutesOnNavigation) {\n return { type: \"success\", matches };\n }\n let partialMatches = matches;\n while (true) {\n let localManifest = manifest;\n try {\n await init.patchRoutesOnNavigation({\n signal,\n path: pathname,\n matches: partialMatches,\n fetcherKey,\n patch: (routeId, children) => {\n if (signal.aborted) return;\n patchRoutesImpl(\n routeId,\n children,\n dataRoutes,\n localManifest,\n mapRouteProperties2,\n false\n );\n }\n });\n } catch (e) {\n return { type: \"error\", error: e, partialMatches };\n }\n if (signal.aborted) {\n return { type: \"aborted\" };\n }\n let activeBranches = dataRoutes.branches;\n let newMatches = matchRoutesImpl(\n dataRoutes.activeRoutes,\n pathname,\n basename,\n false,\n activeBranches\n );\n let newPartialMatches = null;\n if (newMatches) {\n if (Object.keys(newMatches[0].params).length === 0) {\n return { type: \"success\", matches: newMatches };\n } else {\n newPartialMatches = matchRoutesImpl(\n dataRoutes.activeRoutes,\n pathname,\n basename,\n true,\n activeBranches\n );\n let matchedDeeper = newPartialMatches && partialMatches.length < newPartialMatches.length && compareMatches(\n partialMatches,\n newPartialMatches.slice(0, partialMatches.length)\n );\n if (!matchedDeeper) {\n return { type: \"success\", matches: newMatches };\n }\n }\n }\n if (!newPartialMatches) {\n newPartialMatches = matchRoutesImpl(\n dataRoutes.activeRoutes,\n pathname,\n basename,\n true,\n activeBranches\n );\n }\n if (!newPartialMatches || compareMatches(partialMatches, newPartialMatches)) {\n return { type: \"success\", matches: null };\n }\n partialMatches = newPartialMatches;\n }\n }\n function compareMatches(a, b) {\n return a.length === b.length && a.every((m, i) => m.route.id === b[i].route.id);\n }\n function _internalSetRoutes(newRoutes) {\n manifest = {};\n dataRoutes.setHmrRoutes(\n convertRoutesToDataRoutes(\n newRoutes,\n mapRouteProperties2,\n void 0,\n manifest\n )\n );\n }\n function patchRoutes(routeId, children, unstable_allowElementMutations = false) {\n patchRoutesImpl(\n routeId,\n children,\n dataRoutes,\n manifest,\n mapRouteProperties2,\n unstable_allowElementMutations\n );\n if (!dataRoutes.hasHMRRoutes) {\n updateState({});\n }\n }\n router = {\n get basename() {\n return basename;\n },\n get future() {\n return future;\n },\n get state() {\n return state;\n },\n get routes() {\n return dataRoutes.stableRoutes;\n },\n get branches() {\n return dataRoutes.branches;\n },\n get manifest() {\n return manifest;\n },\n get window() {\n return routerWindow;\n },\n initialize,\n subscribe,\n enableScrollRestoration,\n navigate,\n fetch: fetch2,\n revalidate,\n // Passthrough to history-aware createHref used by useHref so we get proper\n // hash-aware URLs in DOM paths\n createHref: (to) => init.history.createHref(to),\n createURL: (to) => init.history.createURL(to),\n encodeLocation: (to) => init.history.encodeLocation(to),\n getFetcher,\n resetFetcher,\n deleteFetcher: queueFetcherForDeletion,\n dispose,\n getBlocker,\n deleteBlocker,\n patchRoutes,\n _internalFetchControllers: fetchControllers,\n // TODO: Remove setRoutes, it's temporary to avoid dealing with\n // updating the tree while validating the update algorithm.\n _internalSetRoutes,\n _internalSetStateDoNotUseOrYouWillBreakYourApp(newState) {\n updateState(newState);\n }\n };\n if (init.instrumentations) {\n router = instrumentClientSideRouter(\n router,\n init.instrumentations.map((i) => i.router).filter(Boolean)\n );\n }\n return router;\n}\nfunction createStaticHandler(routes, opts) {\n invariant(\n routes.length > 0,\n \"You must provide a non-empty routes array to createStaticHandler\"\n );\n let manifest = {};\n let basename = (opts ? opts.basename : null) || \"/\";\n let _mapRouteProperties = opts?.mapRouteProperties || defaultMapRouteProperties;\n let mapRouteProperties2 = _mapRouteProperties;\n let future = {\n ...opts?.future\n };\n if (opts?.instrumentations) {\n let instrumentations = opts.instrumentations;\n mapRouteProperties2 = (route) => {\n return {\n ..._mapRouteProperties(route),\n ...getRouteInstrumentationUpdates(\n instrumentations.map((i) => i.route).filter(Boolean),\n route\n )\n };\n };\n }\n let dataRoutes = convertRoutesToDataRoutes(\n routes,\n mapRouteProperties2,\n void 0,\n manifest\n );\n let routeBranches = flattenAndRankRoutes(dataRoutes);\n async function query(request, {\n requestContext,\n filterMatchesToLoad,\n skipLoaderErrorBubbling,\n skipRevalidation,\n dataStrategy,\n generateMiddlewareResponse,\n normalizePath\n } = {}) {\n let normalizePathImpl = normalizePath || defaultNormalizePath;\n let method = request.method;\n let location = createLocation(\n \"\",\n normalizePathImpl(request),\n null,\n \"default\"\n );\n let matches = matchRoutesImpl(\n dataRoutes,\n location,\n basename,\n false,\n routeBranches\n );\n requestContext = requestContext != null ? requestContext : new RouterContextProvider();\n if (!isValidMethod(method) && method !== \"HEAD\") {\n let error = getInternalRouterError(405, { method });\n let { matches: methodNotAllowedMatches, route } = getShortCircuitMatches(dataRoutes);\n let staticContext = {\n basename,\n location,\n matches: methodNotAllowedMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {}\n };\n return generateMiddlewareResponse ? generateMiddlewareResponse(() => Promise.resolve(staticContext)) : staticContext;\n } else if (!matches) {\n let error = getInternalRouterError(404, { pathname: location.pathname });\n let { matches: notFoundMatches, route } = getShortCircuitMatches(dataRoutes);\n let staticContext = {\n basename,\n location,\n matches: notFoundMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {}\n };\n return generateMiddlewareResponse ? generateMiddlewareResponse(() => Promise.resolve(staticContext)) : staticContext;\n }\n if (generateMiddlewareResponse) {\n invariant(\n requestContext instanceof RouterContextProvider,\n \"When using middleware in `staticHandler.query()`, any provided `requestContext` must be an instance of `RouterContextProvider`\"\n );\n try {\n await loadLazyMiddlewareForMatches(\n matches,\n manifest,\n mapRouteProperties2\n );\n let renderedStaticContext;\n let response = await runServerMiddlewarePipeline(\n {\n request,\n url: createDataFunctionUrl(request, location),\n pattern: getRoutePattern(matches),\n matches,\n params: matches[0].params,\n // If we're calling middleware then it must be enabled so we can cast\n // this to the proper type knowing it's not an `AppLoadContext`\n context: requestContext\n },\n async () => {\n let res = await generateMiddlewareResponse(\n async (revalidationRequest, opts2 = {}) => {\n let result2 = await queryImpl(\n revalidationRequest,\n location,\n matches,\n requestContext,\n dataStrategy || null,\n skipLoaderErrorBubbling === true,\n null,\n \"filterMatchesToLoad\" in opts2 ? opts2.filterMatchesToLoad ?? null : filterMatchesToLoad ?? null,\n skipRevalidation === true\n );\n if (isResponse(result2)) {\n return result2;\n }\n renderedStaticContext = { location, basename, ...result2 };\n return renderedStaticContext;\n }\n );\n return res;\n },\n async (error, routeId) => {\n if (isRedirectResponse(error)) {\n return error;\n }\n if (isResponse(error)) {\n try {\n error = new ErrorResponseImpl(\n error.status,\n error.statusText,\n await parseResponseBody(error)\n );\n } catch (e) {\n error = e;\n }\n }\n if (isDataWithResponseInit(error)) {\n error = dataWithResponseInitToErrorResponse(error);\n }\n if (renderedStaticContext) {\n if (routeId in renderedStaticContext.loaderData) {\n renderedStaticContext.loaderData[routeId] = void 0;\n }\n let staticContext = getStaticContextFromError(\n dataRoutes,\n renderedStaticContext,\n error,\n skipLoaderErrorBubbling ? routeId : findNearestBoundary(matches, routeId).route.id\n );\n return generateMiddlewareResponse(\n () => Promise.resolve(staticContext)\n );\n } else {\n let boundaryRouteId = skipLoaderErrorBubbling ? routeId : findNearestBoundary(\n matches,\n matches.find(\n (m) => m.route.id === routeId || m.route.loader\n )?.route.id || routeId\n ).route.id;\n let staticContext = {\n matches,\n location,\n basename,\n loaderData: {},\n actionData: null,\n errors: {\n [boundaryRouteId]: error\n },\n statusCode: isRouteErrorResponse(error) ? error.status : 500,\n actionHeaders: {},\n loaderHeaders: {}\n };\n return generateMiddlewareResponse(\n () => Promise.resolve(staticContext)\n );\n }\n }\n );\n invariant(isResponse(response), \"Expected a response in query()\");\n return response;\n } catch (e) {\n if (isResponse(e)) {\n return e;\n }\n throw e;\n }\n }\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n dataStrategy || null,\n skipLoaderErrorBubbling === true,\n null,\n filterMatchesToLoad || null,\n skipRevalidation === true\n );\n if (isResponse(result)) {\n return result;\n }\n return { location, basename, ...result };\n }\n async function queryRoute(request, {\n routeId,\n requestContext,\n dataStrategy,\n generateMiddlewareResponse,\n normalizePath\n } = {}) {\n let normalizePathImpl = normalizePath || defaultNormalizePath;\n let method = request.method;\n let location = createLocation(\n \"\",\n normalizePathImpl(request),\n null,\n \"default\"\n );\n let matches = matchRoutesImpl(\n dataRoutes,\n location,\n basename,\n false,\n routeBranches\n );\n requestContext = requestContext != null ? requestContext : new RouterContextProvider();\n if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n throw getInternalRouterError(405, { method });\n } else if (!matches) {\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n let match = routeId ? matches.find((m) => m.route.id === routeId) : getTargetMatch(matches, location);\n if (routeId && !match) {\n throw getInternalRouterError(403, {\n pathname: location.pathname,\n routeId\n });\n } else if (!match) {\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n if (generateMiddlewareResponse) {\n invariant(\n requestContext instanceof RouterContextProvider,\n \"When using middleware in `staticHandler.queryRoute()`, any provided `requestContext` must be an instance of `RouterContextProvider`\"\n );\n await loadLazyMiddlewareForMatches(matches, manifest, mapRouteProperties2);\n let response = await runServerMiddlewarePipeline(\n {\n request,\n url: createDataFunctionUrl(request, location),\n pattern: getRoutePattern(matches),\n matches,\n params: matches[0].params,\n // If we're calling middleware then it must be enabled so we can cast\n // this to the proper type knowing it's not an `AppLoadContext`\n context: requestContext\n },\n async () => {\n let res = await generateMiddlewareResponse(\n async (innerRequest) => {\n let result2 = await queryImpl(\n innerRequest,\n location,\n matches,\n requestContext,\n dataStrategy || null,\n false,\n match,\n null,\n false\n );\n let processed = handleQueryResult(result2);\n return isResponse(processed) ? processed : typeof processed === \"string\" ? new Response(processed) : Response.json(processed);\n }\n );\n return res;\n },\n (error) => {\n if (isDataWithResponseInit(error)) {\n return Promise.resolve(dataWithResponseInitToResponse(error));\n }\n if (isResponse(error)) {\n return Promise.resolve(error);\n }\n throw error;\n }\n );\n return response;\n }\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n dataStrategy || null,\n false,\n match,\n null,\n false\n );\n return handleQueryResult(result);\n function handleQueryResult(result2) {\n if (isResponse(result2)) {\n return result2;\n }\n let error = result2.errors ? Object.values(result2.errors)[0] : void 0;\n if (error !== void 0) {\n throw error;\n }\n if (result2.actionData) {\n return Object.values(result2.actionData)[0];\n }\n if (result2.loaderData) {\n return Object.values(result2.loaderData)[0];\n }\n return void 0;\n }\n }\n async function queryImpl(request, location, matches, requestContext, dataStrategy, skipLoaderErrorBubbling, routeMatch, filterMatchesToLoad, skipRevalidation) {\n invariant(\n request.signal,\n \"query()/queryRoute() requests must contain an AbortController signal\"\n );\n try {\n if (isMutationMethod(request.method)) {\n let result2 = await submit(\n request,\n location,\n matches,\n routeMatch || getTargetMatch(matches, location),\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n routeMatch != null,\n filterMatchesToLoad,\n skipRevalidation\n );\n return result2;\n }\n let result = await loadRouteData(\n request,\n location,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n routeMatch,\n filterMatchesToLoad\n );\n return isResponse(result) ? result : {\n ...result,\n actionData: null,\n actionHeaders: {}\n };\n } catch (e) {\n if (isDataStrategyResult(e) && isResponse(e.result)) {\n if (e.type === \"error\" /* error */) {\n throw e.result;\n }\n return e.result;\n }\n if (isRedirectResponse(e)) {\n return e;\n }\n throw e;\n }\n }\n async function submit(request, location, matches, actionMatch, requestContext, dataStrategy, skipLoaderErrorBubbling, isRouteRequest, filterMatchesToLoad, skipRevalidation) {\n let result;\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n let error = getInternalRouterError(405, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: actionMatch.route.id\n });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: \"error\" /* error */,\n error\n };\n } else {\n let dsMatches = getTargetedDataStrategyMatches(\n mapRouteProperties2,\n manifest,\n request,\n location,\n matches,\n actionMatch,\n [],\n requestContext\n );\n let results = await callDataStrategy(\n request,\n location,\n dsMatches,\n isRouteRequest,\n requestContext,\n dataStrategy\n );\n result = results[actionMatch.route.id];\n if (request.signal.aborted) {\n throwStaticHandlerAbortedError(request, isRouteRequest);\n }\n }\n if (isRedirectResult(result)) {\n throw new Response(null, {\n status: result.response.status,\n headers: {\n Location: result.response.headers.get(\"Location\")\n }\n });\n }\n if (isRouteRequest) {\n if (isErrorResult(result)) {\n throw result.error;\n }\n return {\n matches: [actionMatch],\n loaderData: {},\n actionData: { [actionMatch.route.id]: result.data },\n errors: null,\n // Note: statusCode + headers are unused here since queryRoute will\n // return the raw Response or value\n statusCode: 200,\n loaderHeaders: {},\n actionHeaders: {}\n };\n }\n if (skipRevalidation) {\n if (isErrorResult(result)) {\n let boundaryMatch = skipLoaderErrorBubbling ? actionMatch : findNearestBoundary(matches, actionMatch.route.id);\n return {\n statusCode: isRouteErrorResponse(result.error) ? result.error.status : result.statusCode != null ? result.statusCode : 500,\n actionData: null,\n actionHeaders: {\n ...result.headers ? { [actionMatch.route.id]: result.headers } : {}\n },\n matches,\n loaderData: {},\n errors: {\n [boundaryMatch.route.id]: result.error\n },\n loaderHeaders: {}\n };\n } else {\n return {\n actionData: {\n [actionMatch.route.id]: result.data\n },\n actionHeaders: result.headers ? { [actionMatch.route.id]: result.headers } : {},\n matches,\n loaderData: {},\n errors: null,\n statusCode: result.statusCode || 200,\n loaderHeaders: {}\n };\n }\n }\n let loaderRequest = new Request(request.url, {\n headers: request.headers,\n redirect: request.redirect,\n signal: request.signal\n });\n if (isErrorResult(result)) {\n let boundaryMatch = skipLoaderErrorBubbling ? actionMatch : findNearestBoundary(matches, actionMatch.route.id);\n let handlerContext2 = await loadRouteData(\n loaderRequest,\n location,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n null,\n filterMatchesToLoad,\n [boundaryMatch.route.id, result]\n );\n return {\n ...handlerContext2,\n statusCode: isRouteErrorResponse(result.error) ? result.error.status : result.statusCode != null ? result.statusCode : 500,\n actionData: null,\n actionHeaders: {\n ...result.headers ? { [actionMatch.route.id]: result.headers } : {}\n }\n };\n }\n let handlerContext = await loadRouteData(\n loaderRequest,\n location,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n null,\n filterMatchesToLoad\n );\n return {\n ...handlerContext,\n actionData: {\n [actionMatch.route.id]: result.data\n },\n // action status codes take precedence over loader status codes\n ...result.statusCode ? { statusCode: result.statusCode } : {},\n actionHeaders: result.headers ? { [actionMatch.route.id]: result.headers } : {}\n };\n }\n async function loadRouteData(request, location, matches, requestContext, dataStrategy, skipLoaderErrorBubbling, routeMatch, filterMatchesToLoad, pendingActionResult) {\n let isRouteRequest = routeMatch != null;\n if (isRouteRequest && !routeMatch?.route.loader && !routeMatch?.route.lazy) {\n throw getInternalRouterError(400, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: routeMatch?.route.id\n });\n }\n let dsMatches;\n if (routeMatch) {\n dsMatches = getTargetedDataStrategyMatches(\n mapRouteProperties2,\n manifest,\n request,\n location,\n matches,\n routeMatch,\n [],\n requestContext\n );\n } else {\n let maxIdx = pendingActionResult && isErrorResult(pendingActionResult[1]) ? (\n // Up to but not including the boundary\n matches.findIndex((m) => m.route.id === pendingActionResult[0]) - 1\n ) : void 0;\n let pattern = getRoutePattern(matches);\n dsMatches = matches.map((match, index) => {\n if (maxIdx != null && index > maxIdx) {\n return getDataStrategyMatch(\n mapRouteProperties2,\n manifest,\n request,\n location,\n pattern,\n match,\n [],\n requestContext,\n false\n );\n }\n return getDataStrategyMatch(\n mapRouteProperties2,\n manifest,\n request,\n location,\n pattern,\n match,\n [],\n requestContext,\n (match.route.loader || match.route.lazy) != null && (!filterMatchesToLoad || filterMatchesToLoad(match))\n );\n });\n }\n if (!dataStrategy && !dsMatches.some((m) => m.shouldLoad)) {\n return {\n matches,\n loaderData: {},\n errors: pendingActionResult && isErrorResult(pendingActionResult[1]) ? {\n [pendingActionResult[0]]: pendingActionResult[1].error\n } : null,\n statusCode: 200,\n loaderHeaders: {}\n };\n }\n let results = await callDataStrategy(\n request,\n location,\n dsMatches,\n isRouteRequest,\n requestContext,\n dataStrategy\n );\n if (request.signal.aborted) {\n throwStaticHandlerAbortedError(request, isRouteRequest);\n }\n let handlerContext = processRouteLoaderData(\n matches,\n results,\n pendingActionResult,\n true,\n skipLoaderErrorBubbling\n );\n return {\n ...handlerContext,\n matches\n };\n }\n async function callDataStrategy(request, location, matches, isRouteRequest, requestContext, dataStrategy) {\n let results = await callDataStrategyImpl(\n dataStrategy || defaultDataStrategy,\n request,\n location,\n matches,\n null,\n requestContext,\n true\n );\n let dataResults = {};\n await Promise.all(\n matches.map(async (match) => {\n if (!(match.route.id in results)) {\n return;\n }\n let result = results[match.route.id];\n if (isRedirectDataStrategyResult(result)) {\n let response = result.result;\n throw normalizeRelativeRoutingRedirectResponse(\n response,\n request,\n match.route.id,\n matches,\n basename\n );\n }\n if (isRouteRequest) {\n if (isResponse(result.result)) {\n throw result;\n } else if (isDataWithResponseInit(result.result)) {\n throw dataWithResponseInitToResponse(result.result);\n }\n }\n dataResults[match.route.id] = await convertDataStrategyResultToDataResult(result);\n })\n );\n return dataResults;\n }\n return {\n dataRoutes,\n _internalRouteBranches: routeBranches,\n query,\n queryRoute\n };\n}\nfunction getStaticContextFromError(routes, handlerContext, error, boundaryId) {\n let errorBoundaryId = boundaryId || handlerContext._deepestRenderedBoundaryId || routes[0].id;\n return {\n ...handlerContext,\n statusCode: isRouteErrorResponse(error) ? error.status : 500,\n errors: {\n [errorBoundaryId]: error\n }\n };\n}\nfunction throwStaticHandlerAbortedError(request, isRouteRequest) {\n if (request.signal.reason !== void 0) {\n throw request.signal.reason;\n }\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(\n `${method}() call aborted without an \\`AbortSignal.reason\\`: ${request.method} ${request.url}`\n );\n}\nfunction isSubmissionNavigation(opts) {\n return opts != null && (\"formData\" in opts && opts.formData != null || \"body\" in opts && opts.body !== void 0);\n}\nfunction defaultNormalizePath(request) {\n let url = new URL(request.url);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash\n };\n}\nfunction normalizeTo(location, matches, basename, to, fromRouteId, relative) {\n let contextualMatches;\n let activeRouteMatch;\n if (fromRouteId) {\n contextualMatches = [];\n for (let match of matches) {\n contextualMatches.push(match);\n if (match.route.id === fromRouteId) {\n activeRouteMatch = match;\n break;\n }\n }\n } else {\n contextualMatches = matches;\n activeRouteMatch = matches[matches.length - 1];\n }\n let path = resolveTo(\n to ? to : \".\",\n getResolveToMatches(contextualMatches),\n stripBasename(location.pathname, basename) || location.pathname,\n relative === \"path\"\n );\n if (to == null) {\n path.search = location.search;\n path.hash = location.hash;\n }\n if ((to == null || to === \"\" || to === \".\") && activeRouteMatch) {\n let nakedIndex = hasNakedIndexQuery(path.search);\n if (activeRouteMatch.route.index && !nakedIndex) {\n path.search = path.search ? path.search.replace(/^\\?/, \"?index&\") : \"?index\";\n } else if (!activeRouteMatch.route.index && nakedIndex) {\n let params = new URLSearchParams(path.search);\n let indexValues = params.getAll(\"index\");\n params.delete(\"index\");\n indexValues.filter((v) => v).forEach((v) => params.append(\"index\", v));\n let qs = params.toString();\n path.search = qs ? `?${qs}` : \"\";\n }\n }\n if (basename !== \"/\") {\n path.pathname = prependBasename({ basename, pathname: path.pathname });\n }\n return createPath(path);\n}\nfunction normalizeNavigateOptions(isFetcher, path, opts) {\n if (!opts || !isSubmissionNavigation(opts)) {\n return { path };\n }\n if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n return {\n path,\n error: getInternalRouterError(405, { method: opts.formMethod })\n };\n }\n let getInvalidBodyError = () => ({\n path,\n error: getInternalRouterError(400, { type: \"invalid-body\" })\n });\n let rawFormMethod = opts.formMethod || \"get\";\n let formMethod = rawFormMethod.toUpperCase();\n let formAction = stripHashFromPath(path);\n if (opts.body !== void 0) {\n if (opts.formEncType === \"text/plain\") {\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n let text = typeof opts.body === \"string\" ? opts.body : opts.body instanceof FormData || opts.body instanceof URLSearchParams ? (\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n Array.from(opts.body.entries()).reduce(\n (acc, [name, value]) => `${acc}${name}=${value}\n`,\n \"\"\n )\n ) : String(opts.body);\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: void 0,\n json: void 0,\n text\n }\n };\n } else if (opts.formEncType === \"application/json\") {\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n try {\n let json = typeof opts.body === \"string\" ? JSON.parse(opts.body) : opts.body;\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: void 0,\n json,\n text: void 0\n }\n };\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n }\n invariant(\n typeof FormData === \"function\",\n \"FormData is not available in this environment\"\n );\n let searchParams;\n let formData;\n if (opts.formData) {\n searchParams = convertFormDataToSearchParams(opts.formData);\n formData = opts.formData;\n } else if (opts.body instanceof FormData) {\n searchParams = convertFormDataToSearchParams(opts.body);\n formData = opts.body;\n } else if (opts.body instanceof URLSearchParams) {\n searchParams = opts.body;\n formData = convertSearchParamsToFormData(searchParams);\n } else if (opts.body == null) {\n searchParams = new URLSearchParams();\n formData = new FormData();\n } else {\n try {\n searchParams = new URLSearchParams(opts.body);\n formData = convertSearchParamsToFormData(searchParams);\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n let submission = {\n formMethod,\n formAction,\n formEncType: opts && opts.formEncType || \"application/x-www-form-urlencoded\",\n formData,\n json: void 0,\n text: void 0\n };\n if (isMutationMethod(submission.formMethod)) {\n return { path, submission };\n }\n let parsedPath = parsePath(path);\n if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n searchParams.append(\"index\", \"\");\n }\n parsedPath.search = `?${searchParams}`;\n return { path: createPath(parsedPath), submission };\n}\nfunction getMatchesToLoad(request, scopedContext, mapRouteProperties2, manifest, history, state, matches, submission, location, lazyRoutePropertiesToSkip, initialHydration, isRevalidationRequired, cancelledFetcherLoads, fetchersQueuedForDeletion, fetchLoadMatches, fetchRedirectIds, routesToUse, basename, hasPatchRoutesOnNavigation, branches, pendingActionResult, callSiteDefaultShouldRevalidate) {\n let actionResult = pendingActionResult ? isErrorResult(pendingActionResult[1]) ? pendingActionResult[1].error : pendingActionResult[1].data : void 0;\n let currentUrl = history.createURL(state.location);\n let nextUrl = history.createURL(location);\n let maxIdx;\n if (initialHydration && state.errors) {\n let boundaryId = Object.keys(state.errors)[0];\n maxIdx = matches.findIndex((m) => m.route.id === boundaryId);\n } else if (pendingActionResult && isErrorResult(pendingActionResult[1])) {\n let boundaryId = pendingActionResult[0];\n maxIdx = matches.findIndex((m) => m.route.id === boundaryId) - 1;\n }\n let actionStatus = pendingActionResult ? pendingActionResult[1].statusCode : void 0;\n let shouldSkipRevalidation = actionStatus && actionStatus >= 400;\n let baseShouldRevalidateArgs = {\n currentUrl,\n currentParams: state.matches[0]?.params || {},\n nextUrl,\n nextParams: matches[0].params,\n ...submission,\n actionResult,\n actionStatus\n };\n let pattern = getRoutePattern(matches);\n let dsMatches = matches.map((match, index) => {\n let { route } = match;\n let forceShouldLoad = null;\n if (maxIdx != null && index > maxIdx) {\n forceShouldLoad = false;\n } else if (route.lazy) {\n forceShouldLoad = true;\n } else if (!routeHasLoaderOrMiddleware(route)) {\n forceShouldLoad = false;\n } else if (initialHydration) {\n let { shouldLoad: shouldLoad2 } = getRouteHydrationStatus(\n route,\n state.loaderData,\n state.errors\n );\n forceShouldLoad = shouldLoad2;\n } else if (isNewLoader(state.loaderData, state.matches[index], match)) {\n forceShouldLoad = true;\n }\n if (forceShouldLoad !== null) {\n return getDataStrategyMatch(\n mapRouteProperties2,\n manifest,\n request,\n location,\n pattern,\n match,\n lazyRoutePropertiesToSkip,\n scopedContext,\n forceShouldLoad\n );\n }\n let defaultShouldRevalidate = false;\n if (typeof callSiteDefaultShouldRevalidate === \"boolean\") {\n defaultShouldRevalidate = callSiteDefaultShouldRevalidate;\n } else if (shouldSkipRevalidation) {\n defaultShouldRevalidate = false;\n } else if (isRevalidationRequired) {\n defaultShouldRevalidate = true;\n } else if (currentUrl.pathname + currentUrl.search === nextUrl.pathname + nextUrl.search) {\n defaultShouldRevalidate = true;\n } else if (currentUrl.search !== nextUrl.search) {\n defaultShouldRevalidate = true;\n } else if (isNewRouteInstance(state.matches[index], match)) {\n defaultShouldRevalidate = true;\n }\n let shouldRevalidateArgs = {\n ...baseShouldRevalidateArgs,\n defaultShouldRevalidate\n };\n let shouldLoad = shouldRevalidateLoader(match, shouldRevalidateArgs);\n return getDataStrategyMatch(\n mapRouteProperties2,\n manifest,\n request,\n location,\n pattern,\n match,\n lazyRoutePropertiesToSkip,\n scopedContext,\n shouldLoad,\n shouldRevalidateArgs,\n callSiteDefaultShouldRevalidate\n );\n });\n let revalidatingFetchers = [];\n fetchLoadMatches.forEach((f, key) => {\n if (initialHydration || !matches.some((m) => m.route.id === f.routeId) || fetchersQueuedForDeletion.has(key)) {\n return;\n }\n let fetcher = state.fetchers.get(key);\n let isMidInitialLoad = fetcher && fetcher.state !== \"idle\" && fetcher.data === void 0;\n let fetcherMatches = matchRoutesImpl(\n routesToUse,\n f.path,\n basename ?? \"/\",\n false,\n branches\n );\n if (!fetcherMatches) {\n if (hasPatchRoutesOnNavigation && isMidInitialLoad) {\n return;\n }\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: null,\n match: null,\n request: null,\n controller: null\n });\n return;\n }\n if (fetchRedirectIds.has(key)) {\n return;\n }\n let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n let fetchController = new AbortController();\n let fetchRequest = createClientSideRequest(\n history,\n f.path,\n fetchController.signal\n );\n let fetcherDsMatches = null;\n if (cancelledFetcherLoads.has(key)) {\n cancelledFetcherLoads.delete(key);\n fetcherDsMatches = getTargetedDataStrategyMatches(\n mapRouteProperties2,\n manifest,\n fetchRequest,\n f.path,\n fetcherMatches,\n fetcherMatch,\n lazyRoutePropertiesToSkip,\n scopedContext\n );\n } else if (isMidInitialLoad) {\n if (isRevalidationRequired) {\n fetcherDsMatches = getTargetedDataStrategyMatches(\n mapRouteProperties2,\n manifest,\n fetchRequest,\n f.path,\n fetcherMatches,\n fetcherMatch,\n lazyRoutePropertiesToSkip,\n scopedContext\n );\n }\n } else {\n let defaultShouldRevalidate;\n if (typeof callSiteDefaultShouldRevalidate === \"boolean\") {\n defaultShouldRevalidate = callSiteDefaultShouldRevalidate;\n } else if (shouldSkipRevalidation) {\n defaultShouldRevalidate = false;\n } else {\n defaultShouldRevalidate = isRevalidationRequired;\n }\n let shouldRevalidateArgs = {\n ...baseShouldRevalidateArgs,\n defaultShouldRevalidate\n };\n if (shouldRevalidateLoader(fetcherMatch, shouldRevalidateArgs)) {\n fetcherDsMatches = getTargetedDataStrategyMatches(\n mapRouteProperties2,\n manifest,\n fetchRequest,\n f.path,\n fetcherMatches,\n fetcherMatch,\n lazyRoutePropertiesToSkip,\n scopedContext,\n shouldRevalidateArgs\n );\n }\n }\n if (fetcherDsMatches) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: fetcherDsMatches,\n match: fetcherMatch,\n request: fetchRequest,\n controller: fetchController\n });\n }\n });\n return { dsMatches, revalidatingFetchers };\n}\nfunction routeHasLoaderOrMiddleware(route) {\n return route.loader != null || route.middleware != null && route.middleware.length > 0;\n}\nfunction getRouteHydrationStatus(route, loaderData, errors) {\n if (route.lazy) {\n return { shouldLoad: true, renderFallback: true };\n }\n if (!routeHasLoaderOrMiddleware(route)) {\n return { shouldLoad: false, renderFallback: false };\n }\n let hasData = loaderData != null && route.id in loaderData;\n let hasError = errors != null && errors[route.id] !== void 0;\n if (!hasData && hasError) {\n return { shouldLoad: false, renderFallback: false };\n }\n if (typeof route.loader === \"function\" && route.loader.hydrate === true) {\n return { shouldLoad: true, renderFallback: !hasData };\n }\n let shouldLoad = !hasData && !hasError;\n return { shouldLoad, renderFallback: shouldLoad };\n}\nfunction isNewLoader(currentLoaderData, currentMatch, match) {\n let isNew = (\n // [a] -> [a, b]\n !currentMatch || // [a, b] -> [a, c]\n match.route.id !== currentMatch.route.id\n );\n let isMissingData = !currentLoaderData.hasOwnProperty(match.route.id);\n return isNew || isMissingData;\n}\nfunction isNewRouteInstance(currentMatch, match) {\n let currentPath = currentMatch.route.path;\n return (\n // param change for this match, /users/123 -> /users/456\n currentMatch.pathname !== match.pathname || // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n currentPath != null && currentPath.endsWith(\"*\") && currentMatch.params[\"*\"] !== match.params[\"*\"]\n );\n}\nfunction shouldRevalidateLoader(loaderMatch, arg) {\n if (loaderMatch.route.shouldRevalidate) {\n let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n if (typeof routeChoice === \"boolean\") {\n return routeChoice;\n }\n }\n return arg.defaultShouldRevalidate;\n}\nfunction patchRoutesImpl(routeId, children, dataRoutes, manifest, mapRouteProperties2, allowElementMutations) {\n let childrenToPatch;\n if (routeId) {\n let route = manifest[routeId];\n invariant(\n route,\n `No route found to patch children into: routeId = ${routeId}`\n );\n if (!route.children) {\n route.children = [];\n }\n childrenToPatch = route.children;\n } else {\n childrenToPatch = dataRoutes.activeRoutes;\n }\n let uniqueChildren = [];\n let existingChildren = [];\n children.forEach((newRoute) => {\n let existingRoute = childrenToPatch.find(\n (existingRoute2) => isSameRoute(newRoute, existingRoute2)\n );\n if (existingRoute) {\n existingChildren.push({ existingRoute, newRoute });\n } else {\n uniqueChildren.push(newRoute);\n }\n });\n if (uniqueChildren.length > 0) {\n let newRoutes = convertRoutesToDataRoutes(\n uniqueChildren,\n mapRouteProperties2,\n [routeId || \"_\", \"patch\", String(childrenToPatch?.length || \"0\")],\n manifest\n );\n childrenToPatch.push(...newRoutes);\n }\n if (allowElementMutations && existingChildren.length > 0) {\n for (let i = 0; i < existingChildren.length; i++) {\n let { existingRoute, newRoute } = existingChildren[i];\n let existingRouteTyped = existingRoute;\n let [newRouteTyped] = convertRoutesToDataRoutes(\n [newRoute],\n mapRouteProperties2,\n [],\n // Doesn't matter for mutated routes since they already have an id\n {},\n // Don't touch the manifest here since we're updating in place\n true\n );\n Object.assign(existingRouteTyped, {\n element: newRouteTyped.element ? newRouteTyped.element : existingRouteTyped.element,\n errorElement: newRouteTyped.errorElement ? newRouteTyped.errorElement : existingRouteTyped.errorElement,\n hydrateFallbackElement: newRouteTyped.hydrateFallbackElement ? newRouteTyped.hydrateFallbackElement : existingRouteTyped.hydrateFallbackElement\n });\n }\n }\n if (!dataRoutes.hasHMRRoutes) {\n dataRoutes.setRoutes([...dataRoutes.activeRoutes]);\n }\n}\nfunction isSameRoute(newRoute, existingRoute) {\n if (\"id\" in newRoute && \"id\" in existingRoute && newRoute.id === existingRoute.id) {\n return true;\n }\n if (!(newRoute.index === existingRoute.index && newRoute.path === existingRoute.path && newRoute.caseSensitive === existingRoute.caseSensitive)) {\n return false;\n }\n if ((!newRoute.children || newRoute.children.length === 0) && (!existingRoute.children || existingRoute.children.length === 0)) {\n return true;\n }\n return newRoute.children?.every(\n (aChild, i) => existingRoute.children?.some((bChild) => isSameRoute(aChild, bChild))\n ) ?? false;\n}\nvar lazyRoutePropertyCache = /* @__PURE__ */ new WeakMap();\nvar loadLazyRouteProperty = ({\n key,\n route,\n manifest,\n mapRouteProperties: mapRouteProperties2\n}) => {\n let routeToUpdate = manifest[route.id];\n invariant(routeToUpdate, \"No route found in manifest\");\n if (!routeToUpdate.lazy || typeof routeToUpdate.lazy !== \"object\") {\n return;\n }\n let lazyFn = routeToUpdate.lazy[key];\n if (!lazyFn) {\n return;\n }\n let cache = lazyRoutePropertyCache.get(routeToUpdate);\n if (!cache) {\n cache = {};\n lazyRoutePropertyCache.set(routeToUpdate, cache);\n }\n let cachedPromise = cache[key];\n if (cachedPromise) {\n return cachedPromise;\n }\n let propertyPromise = (async () => {\n let isUnsupported = isUnsupportedLazyRouteObjectKey(key);\n let staticRouteValue = routeToUpdate[key];\n let isStaticallyDefined = staticRouteValue !== void 0 && key !== \"hasErrorBoundary\";\n if (isUnsupported) {\n warning(\n !isUnsupported,\n \"Route property \" + key + \" is not a supported lazy route property. This property will be ignored.\"\n );\n cache[key] = Promise.resolve();\n } else if (isStaticallyDefined) {\n warning(\n false,\n `Route \"${routeToUpdate.id}\" has a static property \"${key}\" defined. The lazy property will be ignored.`\n );\n } else {\n let value = await lazyFn();\n if (value != null) {\n Object.assign(routeToUpdate, { [key]: value });\n Object.assign(routeToUpdate, mapRouteProperties2(routeToUpdate));\n }\n }\n if (typeof routeToUpdate.lazy === \"object\") {\n routeToUpdate.lazy[key] = void 0;\n if (Object.values(routeToUpdate.lazy).every((value) => value === void 0)) {\n routeToUpdate.lazy = void 0;\n }\n }\n })();\n cache[key] = propertyPromise;\n return propertyPromise;\n};\nvar lazyRouteFunctionCache = /* @__PURE__ */ new WeakMap();\nfunction loadLazyRoute(route, type, manifest, mapRouteProperties2, lazyRoutePropertiesToSkip) {\n let routeToUpdate = manifest[route.id];\n invariant(routeToUpdate, \"No route found in manifest\");\n if (!route.lazy) {\n return {\n lazyRoutePromise: void 0,\n lazyHandlerPromise: void 0\n };\n }\n if (typeof route.lazy === \"function\") {\n let cachedPromise = lazyRouteFunctionCache.get(routeToUpdate);\n if (cachedPromise) {\n return {\n lazyRoutePromise: cachedPromise,\n lazyHandlerPromise: cachedPromise\n };\n }\n let lazyRoutePromise2 = (async () => {\n invariant(\n typeof route.lazy === \"function\",\n \"No lazy route function found\"\n );\n let lazyRoute = await route.lazy();\n let routeUpdates = {};\n for (let lazyRouteProperty in lazyRoute) {\n let lazyValue = lazyRoute[lazyRouteProperty];\n if (lazyValue === void 0) {\n continue;\n }\n let isUnsupported = isUnsupportedLazyRouteFunctionKey(lazyRouteProperty);\n let staticRouteValue = routeToUpdate[lazyRouteProperty];\n let isStaticallyDefined = staticRouteValue !== void 0 && // This property isn't static since it should always be updated based\n // on the route updates\n lazyRouteProperty !== \"hasErrorBoundary\";\n if (isUnsupported) {\n warning(\n !isUnsupported,\n \"Route property \" + lazyRouteProperty + \" is not a supported property to be returned from a lazy route function. This property will be ignored.\"\n );\n } else if (isStaticallyDefined) {\n warning(\n !isStaticallyDefined,\n `Route \"${routeToUpdate.id}\" has a static property \"${lazyRouteProperty}\" defined but its lazy function is also returning a value for this property. The lazy route property \"${lazyRouteProperty}\" will be ignored.`\n );\n } else {\n routeUpdates[lazyRouteProperty] = lazyValue;\n }\n }\n Object.assign(routeToUpdate, routeUpdates);\n Object.assign(routeToUpdate, {\n // To keep things framework agnostic, we use the provided `mapRouteProperties`\n // function to set the framework-aware properties (`element`/`hasErrorBoundary`)\n // since the logic will differ between frameworks.\n ...mapRouteProperties2(routeToUpdate),\n lazy: void 0\n });\n })();\n lazyRouteFunctionCache.set(routeToUpdate, lazyRoutePromise2);\n lazyRoutePromise2.catch(() => {\n });\n return {\n lazyRoutePromise: lazyRoutePromise2,\n lazyHandlerPromise: lazyRoutePromise2\n };\n }\n let lazyKeys = Object.keys(route.lazy);\n let lazyPropertyPromises = [];\n let lazyHandlerPromise = void 0;\n for (let key of lazyKeys) {\n if (lazyRoutePropertiesToSkip && lazyRoutePropertiesToSkip.includes(key)) {\n continue;\n }\n let promise = loadLazyRouteProperty({\n key,\n route,\n manifest,\n mapRouteProperties: mapRouteProperties2\n });\n if (promise) {\n lazyPropertyPromises.push(promise);\n if (key === type) {\n lazyHandlerPromise = promise;\n }\n }\n }\n let lazyRoutePromise = lazyPropertyPromises.length > 0 ? Promise.all(lazyPropertyPromises).then(() => {\n }) : void 0;\n lazyRoutePromise?.catch(() => {\n });\n lazyHandlerPromise?.catch(() => {\n });\n return {\n lazyRoutePromise,\n lazyHandlerPromise\n };\n}\nfunction isNonNullable(value) {\n return value !== void 0;\n}\nfunction loadLazyMiddlewareForMatches(matches, manifest, mapRouteProperties2) {\n let promises = matches.map(({ route }) => {\n if (typeof route.lazy !== \"object\" || !route.lazy.middleware) {\n return void 0;\n }\n return loadLazyRouteProperty({\n key: \"middleware\",\n route,\n manifest,\n mapRouteProperties: mapRouteProperties2\n });\n }).filter(isNonNullable);\n return promises.length > 0 ? Promise.all(promises) : void 0;\n}\nasync function defaultDataStrategy(args) {\n let matchesToLoad = args.matches.filter((m) => m.shouldLoad);\n let keyedResults = {};\n let results = await Promise.all(matchesToLoad.map((m) => m.resolve()));\n results.forEach((result, i) => {\n keyedResults[matchesToLoad[i].route.id] = result;\n });\n return keyedResults;\n}\nasync function defaultDataStrategyWithMiddleware(args) {\n if (!args.matches.some((m) => m.route.middleware)) {\n return defaultDataStrategy(args);\n }\n return runClientMiddlewarePipeline(args, () => defaultDataStrategy(args));\n}\nfunction runServerMiddlewarePipeline(args, handler, errorHandler) {\n return runMiddlewarePipeline(\n args,\n handler,\n processResult,\n isResponse,\n errorHandler\n );\n function processResult(result) {\n return isDataWithResponseInit(result) ? dataWithResponseInitToResponse(result) : result;\n }\n}\nfunction runClientMiddlewarePipeline(args, handler) {\n return runMiddlewarePipeline(\n args,\n handler,\n (r) => {\n if (isRedirectResponse(r)) {\n throw r;\n }\n return r;\n },\n isDataStrategyResults,\n errorHandler\n );\n function errorHandler(error, routeId, nextResult) {\n if (nextResult) {\n return Promise.resolve(\n Object.assign(nextResult.value, {\n [routeId]: { type: \"error\", result: error }\n })\n );\n } else {\n let { matches } = args;\n let maxBoundaryIdx = Math.min(\n // Throwing route\n Math.max(\n matches.findIndex((m) => m.route.id === routeId),\n 0\n ),\n // or the shallowest route that needs to load data\n Math.max(\n matches.findIndex((m) => m.shouldCallHandler()),\n 0\n )\n );\n let boundaryRouteId = findNearestBoundary(\n matches,\n matches[maxBoundaryIdx].route.id\n ).route.id;\n return Promise.resolve({\n [boundaryRouteId]: { type: \"error\", result: error }\n });\n }\n }\n}\nasync function runMiddlewarePipeline(args, handler, processResult, isResult, errorHandler) {\n let { matches, ...dataFnArgs } = args;\n let tuples = matches.flatMap(\n (m) => m.route.middleware ? m.route.middleware.map((fn) => [m.route.id, fn]) : []\n );\n let result = await callRouteMiddleware(\n dataFnArgs,\n tuples,\n handler,\n processResult,\n isResult,\n errorHandler\n );\n return result;\n}\nasync function callRouteMiddleware(args, middlewares, handler, processResult, isResult, errorHandler, idx = 0) {\n let { request } = args;\n if (request.signal.aborted) {\n throw request.signal.reason ?? new Error(`Request aborted: ${request.method} ${request.url}`);\n }\n let tuple = middlewares[idx];\n if (!tuple) {\n let result = await handler();\n return result;\n }\n let [routeId, middleware] = tuple;\n let nextResult;\n let next = async () => {\n if (nextResult) {\n throw new Error(\"You may only call `next()` once per middleware\");\n }\n try {\n let result = await callRouteMiddleware(\n args,\n middlewares,\n handler,\n processResult,\n isResult,\n errorHandler,\n idx + 1\n );\n nextResult = { value: result };\n return nextResult.value;\n } catch (error) {\n nextResult = { value: await errorHandler(error, routeId, nextResult) };\n return nextResult.value;\n }\n };\n try {\n let value = await middleware(args, next);\n let result = value != null ? processResult(value) : void 0;\n if (isResult(result)) {\n return result;\n } else if (nextResult) {\n return result ?? nextResult.value;\n } else {\n nextResult = { value: await next() };\n return nextResult.value;\n }\n } catch (error) {\n let response = await errorHandler(error, routeId, nextResult);\n return response;\n }\n}\nfunction getDataStrategyMatchLazyPromises(mapRouteProperties2, manifest, request, match, lazyRoutePropertiesToSkip) {\n let lazyMiddlewarePromise = loadLazyRouteProperty({\n key: \"middleware\",\n route: match.route,\n manifest,\n mapRouteProperties: mapRouteProperties2\n });\n let lazyRoutePromises = loadLazyRoute(\n match.route,\n isMutationMethod(request.method) ? \"action\" : \"loader\",\n manifest,\n mapRouteProperties2,\n lazyRoutePropertiesToSkip\n );\n return {\n middleware: lazyMiddlewarePromise,\n route: lazyRoutePromises.lazyRoutePromise,\n handler: lazyRoutePromises.lazyHandlerPromise\n };\n}\nfunction getDataStrategyMatch(mapRouteProperties2, manifest, request, path, pattern, match, lazyRoutePropertiesToSkip, scopedContext, shouldLoad, shouldRevalidateArgs = null, callSiteDefaultShouldRevalidate) {\n let isUsingNewApi = false;\n let _lazyPromises = getDataStrategyMatchLazyPromises(\n mapRouteProperties2,\n manifest,\n request,\n match,\n lazyRoutePropertiesToSkip\n );\n return {\n ...match,\n _lazyPromises,\n shouldLoad,\n shouldRevalidateArgs,\n shouldCallHandler(defaultShouldRevalidate) {\n isUsingNewApi = true;\n if (!shouldRevalidateArgs) {\n return shouldLoad;\n }\n if (typeof callSiteDefaultShouldRevalidate === \"boolean\") {\n return shouldRevalidateLoader(match, {\n ...shouldRevalidateArgs,\n defaultShouldRevalidate: callSiteDefaultShouldRevalidate\n });\n }\n if (typeof defaultShouldRevalidate === \"boolean\") {\n return shouldRevalidateLoader(match, {\n ...shouldRevalidateArgs,\n defaultShouldRevalidate\n });\n }\n return shouldRevalidateLoader(match, shouldRevalidateArgs);\n },\n resolve(handlerOverride) {\n let { lazy, loader, middleware } = match.route;\n let callHandler = isUsingNewApi || shouldLoad || handlerOverride && !isMutationMethod(request.method) && (lazy || loader);\n let isMiddlewareOnlyRoute = middleware && middleware.length > 0 && !loader && !lazy;\n if (callHandler && (isMutationMethod(request.method) || !isMiddlewareOnlyRoute)) {\n return callLoaderOrAction({\n request,\n path,\n pattern,\n match,\n lazyHandlerPromise: _lazyPromises?.handler,\n lazyRoutePromise: _lazyPromises?.route,\n handlerOverride,\n scopedContext\n });\n }\n return Promise.resolve({ type: \"data\" /* data */, result: void 0 });\n }\n };\n}\nfunction getTargetedDataStrategyMatches(mapRouteProperties2, manifest, request, path, matches, targetMatch, lazyRoutePropertiesToSkip, scopedContext, shouldRevalidateArgs = null) {\n return matches.map((match) => {\n if (match.route.id !== targetMatch.route.id) {\n return {\n ...match,\n shouldLoad: false,\n shouldRevalidateArgs,\n shouldCallHandler: () => false,\n _lazyPromises: getDataStrategyMatchLazyPromises(\n mapRouteProperties2,\n manifest,\n request,\n match,\n lazyRoutePropertiesToSkip\n ),\n resolve: () => Promise.resolve({ type: \"data\", result: void 0 })\n };\n }\n return getDataStrategyMatch(\n mapRouteProperties2,\n manifest,\n request,\n path,\n getRoutePattern(matches),\n match,\n lazyRoutePropertiesToSkip,\n scopedContext,\n true,\n shouldRevalidateArgs\n );\n });\n}\nasync function callDataStrategyImpl(dataStrategyImpl, request, path, matches, fetcherKey, scopedContext, isStaticHandler) {\n if (matches.some((m) => m._lazyPromises?.middleware)) {\n await Promise.all(matches.map((m) => m._lazyPromises?.middleware));\n }\n let dataStrategyArgs = {\n request,\n url: createDataFunctionUrl(request, path),\n pattern: getRoutePattern(matches),\n params: matches[0].params,\n context: scopedContext,\n matches\n };\n let runClientMiddleware = isStaticHandler ? () => {\n throw new Error(\n \"You cannot call `runClientMiddleware()` from a static handler `dataStrategy`. Middleware is run outside of `dataStrategy` during SSR in order to bubble up the Response. You can enable middleware via the `respond` API in `query`/`queryRoute`\"\n );\n } : (cb) => {\n let typedDataStrategyArgs = dataStrategyArgs;\n return runClientMiddlewarePipeline(typedDataStrategyArgs, () => {\n return cb({\n ...typedDataStrategyArgs,\n fetcherKey,\n runClientMiddleware: () => {\n throw new Error(\n \"Cannot call `runClientMiddleware()` from within an `runClientMiddleware` handler\"\n );\n }\n });\n });\n };\n let results = await dataStrategyImpl({\n ...dataStrategyArgs,\n fetcherKey,\n runClientMiddleware\n });\n try {\n await Promise.all(\n matches.flatMap((m) => [\n m._lazyPromises?.handler,\n m._lazyPromises?.route\n ])\n );\n } catch (e) {\n }\n return results;\n}\nasync function callLoaderOrAction({\n request,\n path,\n pattern,\n match,\n lazyHandlerPromise,\n lazyRoutePromise,\n handlerOverride,\n scopedContext\n}) {\n let result;\n let onReject;\n let isAction = isMutationMethod(request.method);\n let type = isAction ? \"action\" : \"loader\";\n let runHandler = (handler) => {\n let reject;\n let abortPromise = new Promise((_, r) => reject = r);\n onReject = () => reject();\n request.signal.addEventListener(\"abort\", onReject);\n let actualHandler = (ctx) => {\n if (typeof handler !== \"function\") {\n return Promise.reject(\n new Error(\n `You cannot call the handler for a route which defines a boolean \"${type}\" [routeId: ${match.route.id}]`\n )\n );\n }\n return handler(\n {\n request,\n url: createDataFunctionUrl(request, path),\n pattern,\n params: match.params,\n context: scopedContext\n },\n ...ctx !== void 0 ? [ctx] : []\n );\n };\n let handlerPromise = (async () => {\n try {\n let val = await (handlerOverride ? handlerOverride((ctx) => actualHandler(ctx)) : actualHandler());\n return { type: \"data\", result: val };\n } catch (e) {\n return { type: \"error\", result: e };\n }\n })();\n return Promise.race([handlerPromise, abortPromise]);\n };\n try {\n let handler = isAction ? match.route.action : match.route.loader;\n if (lazyHandlerPromise || lazyRoutePromise) {\n if (handler) {\n let handlerError;\n let [value] = await Promise.all([\n // If the handler throws, don't let it immediately bubble out,\n // since we need to let the lazy() execution finish so we know if this\n // route has a boundary that can handle the error\n runHandler(handler).catch((e) => {\n handlerError = e;\n }),\n // Ensure all lazy route promises are resolved before continuing\n lazyHandlerPromise,\n lazyRoutePromise\n ]);\n if (handlerError !== void 0) {\n throw handlerError;\n }\n result = value;\n } else {\n await lazyHandlerPromise;\n let handler2 = isAction ? match.route.action : match.route.loader;\n if (handler2) {\n [result] = await Promise.all([runHandler(handler2), lazyRoutePromise]);\n } else if (type === \"action\") {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(405, {\n method: request.method,\n pathname,\n routeId: match.route.id\n });\n } else {\n return { type: \"data\" /* data */, result: void 0 };\n }\n }\n } else if (!handler) {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(404, {\n pathname\n });\n } else {\n result = await runHandler(handler);\n }\n } catch (e) {\n return { type: \"error\" /* error */, result: e };\n } finally {\n if (onReject) {\n request.signal.removeEventListener(\"abort\", onReject);\n }\n }\n return result;\n}\nasync function parseResponseBody(response) {\n let contentType = response.headers.get(\"Content-Type\");\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n return response.body == null ? null : response.json();\n }\n return response.text();\n}\nasync function convertDataStrategyResultToDataResult(dataStrategyResult) {\n let { result, type } = dataStrategyResult;\n if (isResponse(result)) {\n let data2;\n try {\n data2 = await parseResponseBody(result);\n } catch (e) {\n return { type: \"error\" /* error */, error: e };\n }\n if (type === \"error\" /* error */) {\n return {\n type: \"error\" /* error */,\n error: new ErrorResponseImpl(result.status, result.statusText, data2),\n statusCode: result.status,\n headers: result.headers\n };\n }\n return {\n type: \"data\" /* data */,\n data: data2,\n statusCode: result.status,\n headers: result.headers\n };\n }\n if (type === \"error\" /* error */) {\n if (isDataWithResponseInit(result)) {\n if (result.data instanceof Error) {\n return {\n type: \"error\" /* error */,\n error: result.data,\n statusCode: result.init?.status,\n headers: result.init?.headers ? new Headers(result.init.headers) : void 0\n };\n }\n return {\n type: \"error\" /* error */,\n error: dataWithResponseInitToErrorResponse(result),\n statusCode: isRouteErrorResponse(result) ? result.status : void 0,\n headers: result.init?.headers ? new Headers(result.init.headers) : void 0\n };\n }\n return {\n type: \"error\" /* error */,\n error: result,\n statusCode: isRouteErrorResponse(result) ? result.status : void 0\n };\n }\n if (isDataWithResponseInit(result)) {\n return {\n type: \"data\" /* data */,\n data: result.data,\n statusCode: result.init?.status,\n headers: result.init?.headers ? new Headers(result.init.headers) : void 0\n };\n }\n return { type: \"data\" /* data */, data: result };\n}\nfunction normalizeRelativeRoutingRedirectResponse(response, request, routeId, matches, basename) {\n let location = response.headers.get(\"Location\");\n invariant(\n location,\n \"Redirects returned/thrown from loaders/actions must have a Location header\"\n );\n if (!isAbsoluteUrl(location)) {\n let trimmedMatches = matches.slice(\n 0,\n matches.findIndex((m) => m.route.id === routeId) + 1\n );\n location = normalizeTo(\n new URL(request.url),\n trimmedMatches,\n basename,\n location\n );\n response.headers.set(\"Location\", location);\n }\n return response;\n}\nvar invalidProtocols = [\n \"about:\",\n \"blob:\",\n \"chrome:\",\n \"chrome-untrusted:\",\n \"content:\",\n \"data:\",\n \"devtools:\",\n \"file:\",\n \"filesystem:\",\n // eslint-disable-next-line no-script-url\n \"javascript:\"\n];\nfunction hasInvalidProtocol(location) {\n try {\n return invalidProtocols.includes(new URL(location).protocol);\n } catch {\n return false;\n }\n}\nfunction normalizeRedirectLocation(location, currentUrl, basename, historyInstance) {\n if (isAbsoluteUrl(location)) {\n let normalizedLocation = location;\n let url = PROTOCOL_RELATIVE_URL_REGEX.test(normalizedLocation) ? new URL(\n normalizeProtocolRelativeUrl(normalizedLocation, currentUrl.protocol)\n ) : new URL(normalizedLocation);\n if (hasInvalidProtocol(url.toString())) {\n throw new Error(\"Invalid redirect location\");\n }\n let isSameBasename = stripBasename(url.pathname, basename) != null;\n if (url.origin === currentUrl.origin && isSameBasename) {\n return removeDoubleSlashes(url.pathname) + url.search + url.hash;\n }\n }\n try {\n let url = historyInstance.createURL(location);\n if (hasInvalidProtocol(url.toString())) {\n throw new Error(\"Invalid redirect location\");\n }\n } catch (e) {\n }\n return location;\n}\nfunction createClientSideRequest(history, location, signal, submission) {\n let url = history.createURL(stripHashFromPath(location)).toString();\n let init = { signal };\n if (submission && isMutationMethod(submission.formMethod)) {\n let { formMethod, formEncType } = submission;\n init.method = formMethod.toUpperCase();\n if (formEncType === \"application/json\") {\n init.headers = new Headers({ \"Content-Type\": formEncType });\n init.body = JSON.stringify(submission.json);\n } else if (formEncType === \"text/plain\") {\n init.body = submission.text;\n } else if (formEncType === \"application/x-www-form-urlencoded\" && submission.formData) {\n init.body = convertFormDataToSearchParams(submission.formData);\n } else {\n init.body = submission.formData;\n }\n }\n return new Request(url, init);\n}\nfunction createDataFunctionUrl(request, path) {\n let url = new URL(request.url);\n let parsed = typeof path === \"string\" ? parsePath(path) : path;\n url.pathname = parsed.pathname || \"/\";\n if (parsed.search) {\n let searchParams = new URLSearchParams(parsed.search);\n let indexValues = searchParams.getAll(\"index\");\n searchParams.delete(\"index\");\n for (let value of indexValues.filter(Boolean)) {\n searchParams.append(\"index\", value);\n }\n url.search = searchParams.size ? `?${searchParams.toString()}` : \"\";\n } else {\n url.search = \"\";\n }\n url.hash = parsed.hash || \"\";\n return url;\n}\nfunction convertFormDataToSearchParams(formData) {\n let searchParams = new URLSearchParams();\n for (let [key, value] of formData.entries()) {\n searchParams.append(key, typeof value === \"string\" ? value : value.name);\n }\n return searchParams;\n}\nfunction convertSearchParamsToFormData(searchParams) {\n let formData = new FormData();\n for (let [key, value] of searchParams.entries()) {\n formData.append(key, value);\n }\n return formData;\n}\nfunction processRouteLoaderData(matches, results, pendingActionResult, isStaticHandler = false, skipLoaderErrorBubbling = false) {\n let loaderData = {};\n let errors = null;\n let statusCode;\n let foundError = false;\n let loaderHeaders = {};\n let pendingError = pendingActionResult && isErrorResult(pendingActionResult[1]) ? pendingActionResult[1].error : void 0;\n matches.forEach((match) => {\n if (!(match.route.id in results)) {\n return;\n }\n let id = match.route.id;\n let result = results[id];\n invariant(\n !isRedirectResult(result),\n \"Cannot handle redirect results in processLoaderData\"\n );\n if (isErrorResult(result)) {\n let error = result.error;\n if (pendingError !== void 0) {\n error = pendingError;\n pendingError = void 0;\n }\n errors = errors || {};\n if (skipLoaderErrorBubbling) {\n errors[id] = error;\n } else {\n let boundaryMatch = findNearestBoundary(matches, id);\n if (errors[boundaryMatch.route.id] == null) {\n errors[boundaryMatch.route.id] = error;\n }\n }\n if (!isStaticHandler) {\n loaderData[id] = ResetLoaderDataSymbol;\n }\n if (!foundError) {\n foundError = true;\n statusCode = isRouteErrorResponse(result.error) ? result.error.status : 500;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n loaderData[id] = result.data;\n if (result.statusCode && result.statusCode !== 200 && !foundError) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n }\n });\n if (pendingError !== void 0 && pendingActionResult) {\n errors = { [pendingActionResult[0]]: pendingError };\n if (pendingActionResult[2]) {\n loaderData[pendingActionResult[2]] = void 0;\n }\n }\n return {\n loaderData,\n errors,\n statusCode: statusCode || 200,\n loaderHeaders\n };\n}\nfunction processLoaderData(state, matches, results, pendingActionResult, revalidatingFetchers, fetcherResults, workingFetchers) {\n let { loaderData, errors } = processRouteLoaderData(\n matches,\n results,\n pendingActionResult\n );\n revalidatingFetchers.filter((f) => !f.matches || f.matches.some((m) => m.shouldLoad)).forEach((rf) => {\n let { key, match, controller } = rf;\n if (controller && controller.signal.aborted) {\n return;\n }\n let result = fetcherResults[key];\n invariant(result, \"Did not find corresponding fetcher result\");\n if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);\n if (!(errors && errors[boundaryMatch.route.id])) {\n errors = {\n ...errors,\n [boundaryMatch.route.id]: result.error\n };\n }\n workingFetchers.delete(key);\n } else if (isRedirectResult(result)) {\n invariant(false, \"Unhandled fetcher revalidation redirect\");\n } else {\n let doneFetcher = getDoneFetcher(result.data);\n workingFetchers.set(key, doneFetcher);\n }\n });\n return { loaderData, errors };\n}\nfunction mergeLoaderData(loaderData, newLoaderData, matches, errors) {\n let mergedLoaderData = Object.entries(newLoaderData).filter(([, v]) => v !== ResetLoaderDataSymbol).reduce((merged, [k, v]) => {\n merged[k] = v;\n return merged;\n }, {});\n for (let match of matches) {\n let id = match.route.id;\n if (!newLoaderData.hasOwnProperty(id) && loaderData.hasOwnProperty(id) && match.route.loader) {\n mergedLoaderData[id] = loaderData[id];\n }\n if (errors && errors.hasOwnProperty(id)) {\n break;\n }\n }\n return mergedLoaderData;\n}\nfunction getActionDataForCommit(pendingActionResult) {\n if (!pendingActionResult) {\n return {};\n }\n return isErrorResult(pendingActionResult[1]) ? {\n // Clear out prior actionData on errors\n actionData: {}\n } : {\n actionData: {\n [pendingActionResult[0]]: pendingActionResult[1].data\n }\n };\n}\nfunction findNearestBoundary(matches, routeId) {\n let eligibleMatches = routeId ? matches.slice(0, matches.findIndex((m) => m.route.id === routeId) + 1) : [...matches];\n return eligibleMatches.reverse().find((m) => m.route.hasErrorBoundary === true) || matches[0];\n}\nfunction getShortCircuitMatches(routes) {\n let route = routes.length === 1 ? routes[0] : routes.find((r) => r.index || !r.path || r.path === \"/\") || {\n id: `__shim-error-route__`\n };\n return {\n matches: [\n {\n params: {},\n pathname: \"\",\n pathnameBase: \"\",\n route\n }\n ],\n route\n };\n}\nfunction getInternalRouterError(status, {\n pathname,\n routeId,\n method,\n type,\n message\n} = {}) {\n let statusText = \"Unknown Server Error\";\n let errorMessage = \"Unknown @remix-run/router error\";\n if (status === 400) {\n statusText = \"Bad Request\";\n if (method && pathname && routeId) {\n errorMessage = `You made a ${method} request to \"${pathname}\" but did not provide a \\`loader\\` for route \"${routeId}\", so there is no way to handle the request.`;\n } else if (type === \"invalid-body\") {\n errorMessage = \"Unable to encode submission body\";\n }\n } else if (status === 403) {\n statusText = \"Forbidden\";\n errorMessage = `Route \"${routeId}\" does not match URL \"${pathname}\"`;\n } else if (status === 404) {\n statusText = \"Not Found\";\n errorMessage = `No route matches URL \"${pathname}\"`;\n } else if (status === 405) {\n statusText = \"Method Not Allowed\";\n if (method && pathname && routeId) {\n errorMessage = `You made a ${method.toUpperCase()} request to \"${pathname}\" but did not provide an \\`action\\` for route \"${routeId}\", so there is no way to handle the request.`;\n } else if (method) {\n errorMessage = `Invalid request method \"${method.toUpperCase()}\"`;\n }\n }\n return new ErrorResponseImpl(\n status || 500,\n statusText,\n new Error(errorMessage),\n true\n );\n}\nfunction findRedirect(results) {\n let entries = Object.entries(results);\n for (let i = entries.length - 1; i >= 0; i--) {\n let [key, result] = entries[i];\n if (isRedirectResult(result)) {\n return { key, result };\n }\n }\n}\nfunction stripHashFromPath(path) {\n let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n return createPath({ ...parsedPath, hash: \"\" });\n}\nfunction isHashChangeOnly(a, b) {\n if (a.pathname !== b.pathname || a.search !== b.search) {\n return false;\n }\n if (a.hash === \"\") {\n return b.hash !== \"\";\n } else if (a.hash === b.hash) {\n return true;\n } else if (b.hash !== \"\") {\n return true;\n }\n return false;\n}\nfunction dataWithResponseInitToResponse(data2) {\n return Response.json(data2.data, data2.init ?? void 0);\n}\nfunction dataWithResponseInitToErrorResponse(data2) {\n return new ErrorResponseImpl(\n data2.init?.status ?? 500,\n data2.init?.statusText ?? \"Internal Server Error\",\n data2.data\n );\n}\nfunction isDataStrategyResults(result) {\n return result != null && typeof result === \"object\" && Object.entries(result).every(\n ([key, value]) => typeof key === \"string\" && isDataStrategyResult(value)\n );\n}\nfunction isDataStrategyResult(result) {\n return result != null && typeof result === \"object\" && \"type\" in result && \"result\" in result && (result.type === \"data\" /* data */ || result.type === \"error\" /* error */);\n}\nfunction isRedirectDataStrategyResult(result) {\n return isResponse(result.result) && redirectStatusCodes.has(result.result.status);\n}\nfunction isErrorResult(result) {\n return result.type === \"error\" /* error */;\n}\nfunction isRedirectResult(result) {\n return (result && result.type) === \"redirect\" /* redirect */;\n}\nfunction isDataWithResponseInit(value) {\n return typeof value === \"object\" && value != null && \"type\" in value && \"data\" in value && \"init\" in value && value.type === \"DataWithResponseInit\";\n}\nfunction isResponse(value) {\n return value != null && typeof value.status === \"number\" && typeof value.statusText === \"string\" && typeof value.headers === \"object\" && typeof value.body !== \"undefined\";\n}\nfunction isRedirectStatusCode(statusCode) {\n return redirectStatusCodes.has(statusCode);\n}\nfunction isRedirectResponse(result) {\n return isResponse(result) && isRedirectStatusCode(result.status) && result.headers.has(\"Location\");\n}\nfunction isValidMethod(method) {\n return validRequestMethods.has(method.toUpperCase());\n}\nfunction isMutationMethod(method) {\n return validMutationMethods.has(method.toUpperCase());\n}\nfunction hasNakedIndexQuery(search) {\n return new URLSearchParams(search).getAll(\"index\").some((v) => v === \"\");\n}\nfunction getTargetMatch(matches, location) {\n let search = typeof location === \"string\" ? parsePath(location).search : location.search;\n if (matches[matches.length - 1].route.index && hasNakedIndexQuery(search || \"\")) {\n return matches[matches.length - 1];\n }\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches[pathMatches.length - 1];\n}\nfunction getSubmissionFromNavigation(navigation) {\n let { formMethod, formAction, formEncType, text, formData, json } = navigation;\n if (!formMethod || !formAction || !formEncType) {\n return;\n }\n if (text != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: void 0,\n json: void 0,\n text\n };\n } else if (formData != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData,\n json: void 0,\n text: void 0\n };\n } else if (json !== void 0) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: void 0,\n json,\n text: void 0\n };\n }\n}\nfunction getLoadingNavigation(location, matches, historyAction, submission) {\n if (submission) {\n let navigation = {\n state: \"loading\",\n location,\n matches,\n historyAction,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text\n };\n return navigation;\n } else {\n let navigation = {\n state: \"loading\",\n location,\n matches,\n historyAction,\n formMethod: void 0,\n formAction: void 0,\n formEncType: void 0,\n formData: void 0,\n json: void 0,\n text: void 0\n };\n return navigation;\n }\n}\nfunction getSubmittingNavigation(location, matches, historyAction, submission) {\n let navigation = {\n state: \"submitting\",\n location,\n matches,\n historyAction,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text\n };\n return navigation;\n}\nfunction getLoadingFetcher(submission, data2) {\n if (submission) {\n let fetcher = {\n state: \"loading\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data: data2\n };\n return fetcher;\n } else {\n let fetcher = {\n state: \"loading\",\n formMethod: void 0,\n formAction: void 0,\n formEncType: void 0,\n formData: void 0,\n json: void 0,\n text: void 0,\n data: data2\n };\n return fetcher;\n }\n}\nfunction getSubmittingFetcher(submission, existingFetcher) {\n let fetcher = {\n state: \"submitting\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data: existingFetcher ? existingFetcher.data : void 0\n };\n return fetcher;\n}\nfunction getDoneFetcher(data2) {\n let fetcher = {\n state: \"idle\",\n formMethod: void 0,\n formAction: void 0,\n formEncType: void 0,\n formData: void 0,\n json: void 0,\n text: void 0,\n data: data2\n };\n return fetcher;\n}\nfunction restoreAppliedTransitions(_window, transitions) {\n try {\n let sessionPositions = _window.sessionStorage.getItem(\n TRANSITIONS_STORAGE_KEY\n );\n if (sessionPositions) {\n let json = JSON.parse(sessionPositions);\n for (let [k, v] of Object.entries(json || {})) {\n if (v && Array.isArray(v)) {\n transitions.set(k, new Set(v || []));\n }\n }\n }\n } catch (e) {\n }\n}\nfunction persistAppliedTransitions(_window, transitions) {\n if (transitions.size > 0) {\n let json = {};\n for (let [k, v] of transitions) {\n json[k] = [...v];\n }\n try {\n _window.sessionStorage.setItem(\n TRANSITIONS_STORAGE_KEY,\n JSON.stringify(json)\n );\n } catch (error) {\n warning(\n false,\n `Failed to save applied view transitions in sessionStorage (${error}).`\n );\n }\n }\n}\nfunction createDeferred() {\n let resolve;\n let reject;\n let promise = new Promise((res, rej) => {\n resolve = async (val) => {\n res(val);\n try {\n await promise;\n } catch (e) {\n }\n };\n reject = async (error) => {\n rej(error);\n try {\n await promise;\n } catch (e) {\n }\n };\n });\n return {\n promise,\n //@ts-ignore\n resolve,\n //@ts-ignore\n reject\n };\n}\n\n// lib/context.ts\nimport * as React from \"react\";\nvar DataRouterContext = React.createContext(null);\nDataRouterContext.displayName = \"DataRouter\";\nvar DataRouterStateContext = React.createContext(null);\nDataRouterStateContext.displayName = \"DataRouterState\";\nvar RSCRouterContext = React.createContext(false);\nfunction useIsRSCRouterContext() {\n return React.useContext(RSCRouterContext);\n}\nvar ViewTransitionContext = React.createContext({\n isTransitioning: false\n});\nViewTransitionContext.displayName = \"ViewTransition\";\nvar FetchersContext = React.createContext(\n /* @__PURE__ */ new Map()\n);\nFetchersContext.displayName = \"Fetchers\";\nvar AwaitContext = React.createContext(null);\nAwaitContext.displayName = \"Await\";\nvar AwaitContextProvider = (props) => React.createElement(AwaitContext.Provider, props);\nvar NavigationContext = React.createContext(\n null\n);\nNavigationContext.displayName = \"Navigation\";\nvar LocationContext = React.createContext(\n null\n);\nLocationContext.displayName = \"Location\";\nvar RouteContext = React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false\n});\nRouteContext.displayName = \"Route\";\nvar RouteErrorContext = React.createContext(null);\nRouteErrorContext.displayName = \"RouteError\";\nvar ENABLE_DEV_WARNINGS = true;\n\n// lib/hooks.tsx\nimport * as React2 from \"react\";\n\n// lib/errors.ts\nvar ERROR_DIGEST_BASE = \"REACT_ROUTER_ERROR\";\nvar ERROR_DIGEST_REDIRECT = \"REDIRECT\";\nvar ERROR_DIGEST_ROUTE_ERROR_RESPONSE = \"ROUTE_ERROR_RESPONSE\";\nfunction decodeRedirectErrorDigest(digest) {\n if (digest.startsWith(`${ERROR_DIGEST_BASE}:${ERROR_DIGEST_REDIRECT}:{`)) {\n try {\n let parsed = JSON.parse(digest.slice(28));\n if (typeof parsed === \"object\" && parsed && typeof parsed.status === \"number\" && typeof parsed.statusText === \"string\" && typeof parsed.location === \"string\" && typeof parsed.reloadDocument === \"boolean\" && typeof parsed.replace === \"boolean\") {\n return parsed;\n }\n } catch {\n }\n }\n}\nfunction decodeRouteErrorResponseDigest(digest) {\n if (digest.startsWith(\n `${ERROR_DIGEST_BASE}:${ERROR_DIGEST_ROUTE_ERROR_RESPONSE}:{`\n )) {\n try {\n let parsed = JSON.parse(digest.slice(40));\n if (typeof parsed === \"object\" && parsed && typeof parsed.status === \"number\" && typeof parsed.statusText === \"string\") {\n return new ErrorResponseImpl(\n parsed.status,\n parsed.statusText,\n parsed.data\n );\n }\n } catch {\n }\n }\n}\n\n// lib/hooks.tsx\nfunction useHref(to, { relative } = {}) {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useHref() may be used only in the context of a <Router> component.`\n );\n let { basename, navigator } = React2.useContext(NavigationContext);\n let { hash, pathname, search } = useResolvedPath(to, { relative });\n let joinedPathname = pathname;\n if (basename !== \"/\") {\n joinedPathname = pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n return navigator.createHref({ pathname: joinedPathname, search, hash });\n}\nfunction useInRouterContext() {\n return React2.useContext(LocationContext) != null;\n}\nfunction useLocation() {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useLocation() may be used only in the context of a <Router> component.`\n );\n return React2.useContext(LocationContext).location;\n}\nfunction useNavigationType() {\n return React2.useContext(LocationContext).navigationType;\n}\nfunction useMatch(pattern) {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useMatch() may be used only in the context of a <Router> component.`\n );\n let { pathname } = useLocation();\n return React2.useMemo(\n () => matchPath(pattern, decodePath(pathname)),\n [pathname, pattern]\n );\n}\nvar navigateEffectWarning = `You should call navigate() in a React.useEffect(), not when your component is first rendered.`;\nfunction useIsomorphicLayoutEffect(cb) {\n let isStatic = React2.useContext(NavigationContext).static;\n if (!isStatic) {\n React2.useLayoutEffect(cb);\n }\n}\nfunction useNavigate() {\n let { isDataRoute } = React2.useContext(RouteContext);\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\nfunction useNavigateUnstable() {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useNavigate() may be used only in the context of a <Router> component.`\n );\n let dataRouterContext = React2.useContext(DataRouterContext);\n let { basename, navigator } = React2.useContext(NavigationContext);\n let { matches } = React2.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let routePathnamesJson = JSON.stringify(getResolveToMatches(matches));\n let activeRef = React2.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React2.useCallback(\n (to, options = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n let path = resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n options.relative === \"path\"\n );\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n validateNavigationTarget(\n typeof to === \"string\" ? to : createPath(to),\n navigator.createHref(path),\n getNavigatorCurrentUrl(navigator),\n \"reject\"\n );\n (!!options.replace ? navigator.replace : navigator.push)(\n path,\n options.state,\n options\n );\n },\n [\n basename,\n navigator,\n routePathnamesJson,\n locationPathname,\n dataRouterContext\n ]\n );\n return navigate;\n}\nvar OutletContext = React2.createContext(null);\nfunction useOutletContext() {\n return React2.useContext(OutletContext);\n}\nfunction useOutlet(context) {\n let outlet = React2.useContext(RouteContext).outlet;\n return React2.useMemo(\n () => outlet && /* @__PURE__ */ React2.createElement(OutletContext.Provider, { value: context }, outlet),\n [outlet, context]\n );\n}\nfunction useParams() {\n let { matches } = React2.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch?.params ?? {};\n}\nfunction useResolvedPath(to, { relative } = {}) {\n let { matches } = React2.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let routePathnamesJson = JSON.stringify(getResolveToMatches(matches));\n return React2.useMemo(\n () => resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n relative === \"path\"\n ),\n [to, routePathnamesJson, locationPathname, relative]\n );\n}\nfunction useRoutes(routes, locationArg) {\n return useRoutesImpl(routes, locationArg);\n}\nfunction useRoutesImpl(routes, locationArg, dataRouterOpts) {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useRoutes() may be used only in the context of a <Router> component.`\n );\n let { navigator } = React2.useContext(NavigationContext);\n let { matches: parentMatches } = React2.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n let parentRoute = routeMatch && routeMatch.route;\n if (ENABLE_DEV_WARNINGS) {\n let parentPath = parentRoute && parentRoute.path || \"\";\n warningOnce(\n parentPathname,\n !parentRoute || parentPath.endsWith(\"*\") || parentPath.endsWith(\"*?\"),\n `You rendered descendant <Routes> (or called \\`useRoutes()\\`) at \"${parentPathname}\" (under <Route path=\"${parentPath}\">) but the parent route path has no trailing \"*\". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.\n\nPlease change the parent <Route path=\"${parentPath}\"> to <Route path=\"${parentPath === \"/\" ? \"*\" : `${parentPath}/*`}\">.`\n );\n }\n let locationFromContext = useLocation();\n let location;\n if (locationArg) {\n let parsedLocationArg = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n invariant(\n parentPathnameBase === \"/\" || parsedLocationArg.pathname?.startsWith(parentPathnameBase),\n `When overriding the location using \\`<Routes location>\\` or \\`useRoutes(routes, location)\\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is \"${parentPathnameBase}\" but pathname \"${parsedLocationArg.pathname}\" was given in the \\`location\\` prop.`\n );\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n let pathname = location.pathname || \"/\";\n let remainingPathname = pathname;\n if (parentPathnameBase !== \"/\") {\n let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n }\n let matches = dataRouterOpts && dataRouterOpts.state.matches.length ? (\n // If we're in a data router, use the matches we've already identified but ensure\n // we have the latest route instances from the manifest in case elements have changed\n dataRouterOpts.state.matches.map(\n (m) => Object.assign(m, {\n route: dataRouterOpts.manifest[m.route.id] || m.route\n })\n )\n ) : matchRoutes(routes, { pathname: remainingPathname });\n if (ENABLE_DEV_WARNINGS) {\n warning(\n parentRoute || matches != null,\n `No routes matched location \"${location.pathname}${location.search}${location.hash}\" `\n );\n warning(\n matches == null || matches[matches.length - 1].route.element !== void 0 || matches[matches.length - 1].route.Component !== void 0 || matches[matches.length - 1].route.lazy !== void 0,\n `Matched leaf route at location \"${location.pathname}${location.search}${location.hash}\" does not have an element or Component. This means it will render an <Outlet /> with a null value by default resulting in an \"empty\" page.`\n );\n }\n let renderedMatches = _renderMatches(\n matches && matches.map(\n (match) => Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes.\n // Pre-encode `%`, `?` and `#` ahead of `encodeLocation` because it uses\n // `new URL()` internally and we need to prevent it from treating\n // them as separators\n navigator.encodeLocation ? navigator.encodeLocation(\n match.pathname.replace(/%/g, \"%25\").replace(/\\?/g, \"%3F\").replace(/#/g, \"%23\")\n ).pathname : match.pathname\n ]),\n pathnameBase: match.pathnameBase === \"/\" ? parentPathnameBase : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n // Pre-encode `%`, `?` and `#` ahead of `encodeLocation` because it uses\n // `new URL()` internally and we need to prevent it from treating\n // them as separators\n navigator.encodeLocation ? navigator.encodeLocation(\n match.pathnameBase.replace(/%/g, \"%25\").replace(/\\?/g, \"%3F\").replace(/#/g, \"%23\")\n ).pathname : match.pathnameBase\n ])\n })\n ),\n parentMatches,\n dataRouterOpts\n );\n if (locationArg && renderedMatches) {\n return /* @__PURE__ */ React2.createElement(\n LocationContext.Provider,\n {\n value: {\n location: {\n pathname: \"/\",\n search: \"\",\n hash: \"\",\n state: null,\n key: \"default\",\n mask: void 0,\n ...location\n },\n navigationType: \"POP\" /* Pop */\n }\n },\n renderedMatches\n );\n }\n return renderedMatches;\n}\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error) ? `${error.status} ${error.statusText}` : error instanceof Error ? error.message : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = { padding: \"0.5rem\", backgroundColor: lightgrey };\n let codeStyles = { padding: \"2px 4px\", backgroundColor: lightgrey };\n let devInfo = null;\n if (ENABLE_DEV_WARNINGS) {\n console.error(\n \"Error handled by React Router default ErrorBoundary:\",\n error\n );\n devInfo = /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(\"p\", null, \"\\u{1F4BF} Hey developer \\u{1F44B}\"), /* @__PURE__ */ React2.createElement(\"p\", null, \"You can provide a way better UX than this when your app throws errors by providing your own \", /* @__PURE__ */ React2.createElement(\"code\", { style: codeStyles }, \"ErrorBoundary\"), \" or\", \" \", /* @__PURE__ */ React2.createElement(\"code\", { style: codeStyles }, \"errorElement\"), \" prop on your route.\"));\n }\n return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(\"h2\", null, \"Unexpected Application Error!\"), /* @__PURE__ */ React2.createElement(\"h3\", { style: { fontStyle: \"italic\" } }, message), stack ? /* @__PURE__ */ React2.createElement(\"pre\", { style: preStyles }, stack) : null, devInfo);\n}\nvar defaultErrorElement = /* @__PURE__ */ React2.createElement(DefaultErrorComponent, null);\nvar RenderErrorBoundary = class extends React2.Component {\n constructor(props) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error\n };\n }\n static getDerivedStateFromError(error) {\n return { error };\n }\n static getDerivedStateFromProps(props, state) {\n if (state.location !== props.location || state.revalidation !== \"idle\" && props.revalidation === \"idle\") {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation\n };\n }\n return {\n error: props.error !== void 0 ? props.error : state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation\n };\n }\n componentDidCatch(error, errorInfo) {\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n } else {\n console.error(\n \"React Router caught the following error during render\",\n error\n );\n }\n }\n render() {\n let error = this.state.error;\n if (this.context && typeof error === \"object\" && error && \"digest\" in error && typeof error.digest === \"string\") {\n const decoded = decodeRouteErrorResponseDigest(error.digest);\n if (decoded) error = decoded;\n }\n let result = error !== void 0 ? /* @__PURE__ */ React2.createElement(RouteContext.Provider, { value: this.props.routeContext }, /* @__PURE__ */ React2.createElement(\n RouteErrorContext.Provider,\n {\n value: error,\n children: this.props.component\n }\n )) : this.props.children;\n if (this.context) {\n return /* @__PURE__ */ React2.createElement(RSCErrorHandler, { error }, result);\n }\n return result;\n }\n};\nRenderErrorBoundary.contextType = RSCRouterContext;\nvar errorRedirectHandledMap = /* @__PURE__ */ new WeakMap();\nfunction RSCErrorHandler({\n children,\n error\n}) {\n let { basename, navigator } = React2.useContext(NavigationContext);\n if (typeof error === \"object\" && error && \"digest\" in error && typeof error.digest === \"string\") {\n let redirect2 = decodeRedirectErrorDigest(error.digest);\n if (redirect2) {\n let existingRedirect = errorRedirectHandledMap.get(error);\n if (existingRedirect) throw existingRedirect;\n let parsed = parseToInfo(redirect2.location, basename);\n let target = parsed.absoluteURL || parsed.to;\n validateNavigationTarget(\n redirect2.location,\n target,\n getNavigatorCurrentUrl(navigator),\n \"allow-explicit\"\n );\n if (hasInvalidProtocol(target)) {\n throw new Error(\"Invalid redirect location\");\n }\n if (isBrowser && !errorRedirectHandledMap.get(error)) {\n if (parsed.isExternal || redirect2.reloadDocument) {\n window.location.href = target;\n } else {\n const redirectPromise = Promise.resolve().then(\n () => window.__reactRouterDataRouter.navigate(parsed.to, {\n replace: redirect2.replace\n })\n );\n errorRedirectHandledMap.set(error, redirectPromise);\n throw redirectPromise;\n }\n }\n return /* @__PURE__ */ React2.createElement(\"meta\", { httpEquiv: \"refresh\", content: `0;url=${target}` });\n }\n }\n return children;\n}\nfunction RenderedRoute({ routeContext, match, children }) {\n let dataRouterContext = React2.useContext(DataRouterContext);\n if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n return /* @__PURE__ */ React2.createElement(RouteContext.Provider, { value: routeContext }, children);\n}\nfunction _renderMatches(matches, parentMatches = [], dataRouterOpts) {\n let dataRouterState = dataRouterOpts?.state;\n if (matches == null) {\n if (!dataRouterState) {\n return null;\n }\n if (dataRouterState.errors) {\n matches = dataRouterState.matches;\n } else if (parentMatches.length === 0 && !dataRouterState.initialized && dataRouterState.matches.length > 0) {\n matches = dataRouterState.matches;\n } else {\n return null;\n }\n }\n let renderedMatches = matches;\n let errors = dataRouterState?.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex(\n (m) => m.route.id && errors?.[m.route.id] !== void 0\n );\n invariant(\n errorIndex >= 0,\n `Could not find a matching route for errors on route IDs: ${Object.keys(\n errors\n ).join(\",\")}`\n );\n renderedMatches = renderedMatches.slice(\n 0,\n Math.min(renderedMatches.length, errorIndex + 1)\n );\n }\n let renderFallback = false;\n let fallbackIndex = -1;\n if (dataRouterOpts && dataRouterState) {\n renderFallback = dataRouterState.renderFallback;\n for (let i = 0; i < renderedMatches.length; i++) {\n let match = renderedMatches[i];\n if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n fallbackIndex = i;\n }\n if (match.route.id) {\n let { loaderData, errors: errors2 } = dataRouterState;\n let needsToRunLoader = match.route.loader && !loaderData.hasOwnProperty(match.route.id) && (!errors2 || errors2[match.route.id] === void 0);\n if (match.route.lazy || needsToRunLoader) {\n if (dataRouterOpts.isStatic) {\n renderFallback = true;\n }\n if (fallbackIndex >= 0) {\n renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n } else {\n renderedMatches = [renderedMatches[0]];\n }\n break;\n }\n }\n }\n }\n let onErrorHandler = dataRouterOpts?.onError;\n let onError = dataRouterState && onErrorHandler ? (error, errorInfo) => {\n onErrorHandler(error, {\n location: dataRouterState.location,\n params: dataRouterState.matches?.[0]?.params ?? {},\n pattern: getRoutePattern(dataRouterState.matches),\n errorInfo\n });\n } : void 0;\n return renderedMatches.reduceRight(\n (outlet, match, index) => {\n let error;\n let shouldRenderHydrateFallback = false;\n let errorElement = null;\n let hydrateFallbackElement = null;\n if (dataRouterState) {\n error = errors && match.route.id ? errors[match.route.id] : void 0;\n errorElement = match.route.errorElement || defaultErrorElement;\n if (renderFallback) {\n if (fallbackIndex < 0 && index === 0) {\n warningOnce(\n \"route-fallback\",\n false,\n \"No `HydrateFallback` element provided to render during initial hydration\"\n );\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = null;\n } else if (fallbackIndex === index) {\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n }\n }\n }\n let matches2 = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children;\n if (error) {\n children = errorElement;\n } else if (shouldRenderHydrateFallback) {\n children = hydrateFallbackElement;\n } else if (match.route.Component) {\n children = /* @__PURE__ */ React2.createElement(match.route.Component, null);\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return /* @__PURE__ */ React2.createElement(\n RenderedRoute,\n {\n match,\n routeContext: {\n outlet,\n matches: matches2,\n isDataRoute: dataRouterState != null\n },\n children\n }\n );\n };\n return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /* @__PURE__ */ React2.createElement(\n RenderErrorBoundary,\n {\n location: dataRouterState.location,\n revalidation: dataRouterState.revalidation,\n component: errorElement,\n error,\n children: getChildren(),\n routeContext: { outlet: null, matches: matches2, isDataRoute: true },\n onError\n }\n ) : getChildren();\n },\n null\n );\n}\nfunction getDataRouterConsoleError(hookName) {\n return `${hookName} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`;\n}\nfunction useDataRouterContext(hookName) {\n let ctx = React2.useContext(DataRouterContext);\n invariant(ctx, getDataRouterConsoleError(hookName));\n return ctx;\n}\nfunction useDataRouterState(hookName) {\n let state = React2.useContext(DataRouterStateContext);\n invariant(state, getDataRouterConsoleError(hookName));\n return state;\n}\nfunction useRouteContext(hookName) {\n let route = React2.useContext(RouteContext);\n invariant(route, getDataRouterConsoleError(hookName));\n return route;\n}\nfunction useCurrentRouteId(hookName) {\n let route = useRouteContext(hookName);\n let thisRoute = route.matches[route.matches.length - 1];\n invariant(\n thisRoute.route.id,\n `${hookName} can only be used on routes that contain a unique \"id\"`\n );\n return thisRoute.route.id;\n}\nfunction useRouteId() {\n return useCurrentRouteId(\"useRouteId\" /* UseRouteId */);\n}\nfunction useNavigation() {\n let state = useDataRouterState(\"useNavigation\" /* UseNavigation */);\n return React2.useMemo(() => {\n let { matches, historyAction, ...rest } = state.navigation;\n return rest;\n }, [state.navigation]);\n}\nfunction useRevalidator() {\n let dataRouterContext = useDataRouterContext(\"useRevalidator\" /* UseRevalidator */);\n let state = useDataRouterState(\"useRevalidator\" /* UseRevalidator */);\n let revalidate = React2.useCallback(async () => {\n await dataRouterContext.router.revalidate();\n }, [dataRouterContext.router]);\n return React2.useMemo(\n () => ({ revalidate, state: state.revalidation }),\n [revalidate, state.revalidation]\n );\n}\nfunction useMatches() {\n let { matches, loaderData } = useDataRouterState(\n \"useMatches\" /* UseMatches */\n );\n return React2.useMemo(\n () => matches.map((m) => convertRouteMatchToUiMatch(m, loaderData)),\n [matches, loaderData]\n );\n}\nfunction useLoaderData() {\n let state = useDataRouterState(\"useLoaderData\" /* UseLoaderData */);\n let routeId = useCurrentRouteId(\"useLoaderData\" /* UseLoaderData */);\n return state.loaderData[routeId];\n}\nfunction useRouteLoaderData(routeId) {\n let state = useDataRouterState(\"useRouteLoaderData\" /* UseRouteLoaderData */);\n return state.loaderData[routeId];\n}\nfunction useActionData() {\n let state = useDataRouterState(\"useActionData\" /* UseActionData */);\n let routeId = useCurrentRouteId(\"useLoaderData\" /* UseLoaderData */);\n return state.actionData ? state.actionData[routeId] : void 0;\n}\nfunction useRouteError() {\n let error = React2.useContext(RouteErrorContext);\n let state = useDataRouterState(\"useRouteError\" /* UseRouteError */);\n let routeId = useCurrentRouteId(\"useRouteError\" /* UseRouteError */);\n if (error !== void 0) {\n return error;\n }\n return state.errors?.[routeId];\n}\nfunction useAsyncValue() {\n let value = React2.useContext(AwaitContext);\n return value?._data;\n}\nfunction useAsyncError() {\n let value = React2.useContext(AwaitContext);\n return value?._error;\n}\nvar blockerId = 0;\nfunction useBlocker(shouldBlock) {\n let { router, basename } = useDataRouterContext(\"useBlocker\" /* UseBlocker */);\n let state = useDataRouterState(\"useBlocker\" /* UseBlocker */);\n let [blockerKey, setBlockerKey] = React2.useState(\"\");\n let blockerFunction = React2.useCallback(\n (arg) => {\n if (typeof shouldBlock !== \"function\") {\n return !!shouldBlock;\n }\n if (basename === \"/\") {\n return shouldBlock(arg);\n }\n let { currentLocation, nextLocation, historyAction } = arg;\n return shouldBlock({\n currentLocation: {\n ...currentLocation,\n pathname: stripBasename(currentLocation.pathname, basename) || currentLocation.pathname\n },\n nextLocation: {\n ...nextLocation,\n pathname: stripBasename(nextLocation.pathname, basename) || nextLocation.pathname\n },\n historyAction\n });\n },\n [basename, shouldBlock]\n );\n React2.useEffect(() => {\n let key = String(++blockerId);\n setBlockerKey(key);\n return () => router.deleteBlocker(key);\n }, [router]);\n React2.useEffect(() => {\n if (blockerKey !== \"\") {\n router.getBlocker(blockerKey, blockerFunction);\n }\n }, [router, blockerKey, blockerFunction]);\n return blockerKey && state.blockers.has(blockerKey) ? state.blockers.get(blockerKey) : IDLE_BLOCKER;\n}\nfunction useNavigateStable() {\n let { router } = useDataRouterContext(\"useNavigate\" /* UseNavigateStable */);\n let id = useCurrentRouteId(\"useNavigate\" /* UseNavigateStable */);\n let activeRef = React2.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React2.useCallback(\n async (to, options = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n if (!activeRef.current) return;\n if (typeof to === \"number\") {\n await router.navigate(to);\n } else {\n await router.navigate(to, { fromRouteId: id, ...options });\n }\n },\n [router, id]\n );\n return navigate;\n}\nvar alreadyWarned = {};\nfunction warningOnce(key, cond, message) {\n if (!cond && !alreadyWarned[key]) {\n alreadyWarned[key] = true;\n warning(false, message);\n }\n}\nfunction useRoute(...args) {\n const currentRouteId = useCurrentRouteId(\n \"useRoute\" /* UseRoute */\n );\n const id = args[0] ?? currentRouteId;\n const state = useDataRouterState(\"useRoute\" /* UseRoute */);\n const route = state.matches.find(({ route: route2 }) => route2.id === id);\n if (route === void 0) return void 0;\n return {\n handle: route.route.handle,\n loaderData: state.loaderData[id],\n actionData: state.actionData?.[id]\n };\n}\nfunction toRouterStateMatch(match) {\n return {\n id: match.route.id,\n pathname: match.pathname,\n params: match.params,\n handle: match.route.handle\n };\n}\nfunction useRouterState() {\n let {\n location,\n historyAction: type,\n matches,\n navigation\n } = useDataRouterState(\"unstable_useRouterState\" /* UseRouterState */);\n let active = React2.useMemo(\n () => ({\n type,\n location,\n searchParams: new URLSearchParams(location.search),\n params: matches[matches.length - 1]?.params ?? {},\n matches: matches.map((m) => toRouterStateMatch(m))\n }),\n [location, matches, type]\n );\n let pending = React2.useMemo(() => {\n if (navigation.state === \"idle\") return null;\n let shared = {\n type: navigation.historyAction,\n location: navigation.location,\n searchParams: new URLSearchParams(navigation.location.search),\n params: navigation.matches[navigation.matches.length - 1]?.params ?? {},\n matches: navigation.matches.map((m) => toRouterStateMatch(m))\n };\n return navigation.state === \"loading\" ? {\n ...shared,\n state: \"loading\",\n formMethod: navigation.formMethod,\n formAction: navigation.formAction,\n formEncType: navigation.formEncType,\n formData: navigation.formData,\n json: navigation.json,\n text: navigation.text\n } : {\n ...shared,\n state: \"submitting\",\n formMethod: navigation.formMethod,\n formAction: navigation.formAction,\n formEncType: navigation.formEncType,\n formData: navigation.formData,\n json: navigation.json,\n text: navigation.text\n };\n }, [navigation]);\n return React2.useMemo(\n () => ({ active, pending }),\n [active, pending]\n );\n}\n\n// lib/components.tsx\nimport * as React3 from \"react\";\n\n// lib/server-runtime/warnings.ts\nvar alreadyWarned2 = {};\nfunction warnOnce(condition, message) {\n if (!condition && !alreadyWarned2[message]) {\n alreadyWarned2[message] = true;\n console.warn(message);\n }\n}\n\n// lib/components.tsx\nvar USE_OPTIMISTIC = \"useOptimistic\";\nvar useOptimisticImpl = React3[USE_OPTIMISTIC];\nvar stableUseOptimisticSetter = () => void 0;\nfunction useOptimisticSafe(val) {\n if (useOptimisticImpl) {\n return useOptimisticImpl(val);\n } else {\n return [val, stableUseOptimisticSetter];\n }\n}\nfunction mapRouteProperties(route) {\n let updates = {\n // Note: this check also occurs in createRoutesFromChildren so update\n // there if you change this -- please and thank you!\n hasErrorBoundary: route.hasErrorBoundary || route.ErrorBoundary != null || route.errorElement != null\n };\n if (route.Component) {\n if (ENABLE_DEV_WARNINGS) {\n if (route.element) {\n warning(\n false,\n \"You should not include both `Component` and `element` on your route - `Component` will be used.\"\n );\n }\n }\n Object.assign(updates, {\n element: React3.createElement(route.Component),\n Component: void 0\n });\n }\n if (route.HydrateFallback) {\n if (ENABLE_DEV_WARNINGS) {\n if (route.hydrateFallbackElement) {\n warning(\n false,\n \"You should not include both `HydrateFallback` and `hydrateFallbackElement` on your route - `HydrateFallback` will be used.\"\n );\n }\n }\n Object.assign(updates, {\n hydrateFallbackElement: React3.createElement(route.HydrateFallback),\n HydrateFallback: void 0\n });\n }\n if (route.ErrorBoundary) {\n if (ENABLE_DEV_WARNINGS) {\n if (route.errorElement) {\n warning(\n false,\n \"You should not include both `ErrorBoundary` and `errorElement` on your route - `ErrorBoundary` will be used.\"\n );\n }\n }\n Object.assign(updates, {\n errorElement: React3.createElement(route.ErrorBoundary),\n ErrorBoundary: void 0\n });\n }\n return updates;\n}\nvar hydrationRouteProperties = [\n \"HydrateFallback\",\n \"hydrateFallbackElement\"\n];\nfunction createMemoryRouter(routes, opts) {\n return createRouter({\n basename: opts?.basename,\n getContext: opts?.getContext,\n future: opts?.future,\n history: createMemoryHistory({\n initialEntries: opts?.initialEntries,\n initialIndex: opts?.initialIndex\n }),\n hydrationData: opts?.hydrationData,\n routes,\n hydrationRouteProperties,\n mapRouteProperties,\n dataStrategy: opts?.dataStrategy,\n patchRoutesOnNavigation: opts?.patchRoutesOnNavigation,\n instrumentations: opts?.instrumentations\n }).initialize();\n}\nvar Deferred = class {\n constructor() {\n this.status = \"pending\";\n this.promise = new Promise((resolve, reject) => {\n this.resolve = (value) => {\n if (this.status === \"pending\") {\n this.status = \"resolved\";\n resolve(value);\n }\n };\n this.reject = (reason) => {\n if (this.status === \"pending\") {\n this.status = \"rejected\";\n reject(reason);\n }\n };\n });\n }\n};\nfunction RouterProvider({\n router,\n flushSync: reactDomFlushSyncImpl,\n onError,\n useTransitions\n}) {\n let unstable_rsc = useIsRSCRouterContext();\n useTransitions = unstable_rsc || useTransitions;\n let [_state, setStateImpl] = React3.useState(router.state);\n let [state, setOptimisticState] = useOptimisticSafe(_state);\n let [pendingState, setPendingState] = React3.useState();\n let [vtContext, setVtContext] = React3.useState({\n isTransitioning: false\n });\n let [renderDfd, setRenderDfd] = React3.useState();\n let [transition, setTransition] = React3.useState();\n let [interruption, setInterruption] = React3.useState();\n let fetcherData = React3.useRef(/* @__PURE__ */ new Map());\n let setState = React3.useCallback(\n (newState, { deletedFetchers, newErrors, flushSync, viewTransitionOpts }) => {\n if (newErrors && onError) {\n Object.values(newErrors).forEach(\n (error) => onError(error, {\n location: newState.location,\n params: newState.matches[0]?.params ?? {},\n pattern: getRoutePattern(newState.matches)\n })\n );\n }\n newState.fetchers.forEach((fetcher, key) => {\n if (fetcher.data !== void 0) {\n fetcherData.current.set(key, fetcher.data);\n }\n });\n deletedFetchers.forEach((key) => fetcherData.current.delete(key));\n warnOnce(\n flushSync === false || reactDomFlushSyncImpl != null,\n 'You provided the `flushSync` option to a router update, but you are not using the `<RouterProvider>` from `react-router/dom` so `ReactDOM.flushSync()` is unavailable. Please update your app to `import { RouterProvider } from \"react-router/dom\"` and ensure you have `react-dom` installed as a dependency to use the `flushSync` option.'\n );\n let isViewTransitionAvailable = router.window != null && router.window.document != null && typeof router.window.document.startViewTransition === \"function\";\n warnOnce(\n viewTransitionOpts == null || isViewTransitionAvailable,\n \"You provided the `viewTransition` option to a router update, but you do not appear to be running in a DOM environment as `window.startViewTransition` is not available.\"\n );\n if (!viewTransitionOpts || !isViewTransitionAvailable) {\n if (reactDomFlushSyncImpl && flushSync) {\n reactDomFlushSyncImpl(() => setStateImpl(newState));\n } else if (useTransitions === false) {\n setStateImpl(newState);\n } else {\n React3.startTransition(() => {\n if (useTransitions === true) {\n setOptimisticState((s) => getOptimisticRouterState(s, newState));\n }\n setStateImpl(newState);\n });\n }\n return;\n }\n if (reactDomFlushSyncImpl && flushSync) {\n reactDomFlushSyncImpl(() => {\n if (transition) {\n renderDfd?.resolve();\n transition.skipTransition();\n }\n setVtContext({\n isTransitioning: true,\n flushSync: true,\n currentLocation: viewTransitionOpts.currentLocation,\n nextLocation: viewTransitionOpts.nextLocation\n });\n });\n let t = router.window.document.startViewTransition(() => {\n reactDomFlushSyncImpl(() => setStateImpl(newState));\n });\n t.finished.finally(() => {\n reactDomFlushSyncImpl(() => {\n setRenderDfd(void 0);\n setTransition(void 0);\n setPendingState(void 0);\n setVtContext({ isTransitioning: false });\n });\n });\n reactDomFlushSyncImpl(() => setTransition(t));\n return;\n }\n if (transition) {\n renderDfd?.resolve();\n transition.skipTransition();\n setInterruption({\n state: newState,\n currentLocation: viewTransitionOpts.currentLocation,\n nextLocation: viewTransitionOpts.nextLocation\n });\n } else {\n setPendingState(newState);\n setVtContext({\n isTransitioning: true,\n flushSync: false,\n currentLocation: viewTransitionOpts.currentLocation,\n nextLocation: viewTransitionOpts.nextLocation\n });\n }\n },\n [\n router.window,\n reactDomFlushSyncImpl,\n transition,\n renderDfd,\n useTransitions,\n setOptimisticState,\n onError\n ]\n );\n React3.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n React3.useEffect(() => {\n if (vtContext.isTransitioning && !vtContext.flushSync) {\n setRenderDfd(new Deferred());\n }\n }, [vtContext]);\n React3.useEffect(() => {\n if (renderDfd && pendingState && router.window) {\n let newState = pendingState;\n let renderPromise = renderDfd.promise;\n let transition2 = router.window.document.startViewTransition(async () => {\n if (useTransitions === false) {\n setStateImpl(newState);\n } else {\n React3.startTransition(() => {\n if (useTransitions === true) {\n setOptimisticState((s) => getOptimisticRouterState(s, newState));\n }\n setStateImpl(newState);\n });\n }\n await renderPromise;\n });\n transition2.finished.finally(() => {\n setRenderDfd(void 0);\n setTransition(void 0);\n setPendingState(void 0);\n setVtContext({ isTransitioning: false });\n });\n setTransition(transition2);\n }\n }, [\n pendingState,\n renderDfd,\n router.window,\n useTransitions,\n setOptimisticState\n ]);\n React3.useEffect(() => {\n if (renderDfd && pendingState && state.location.key === pendingState.location.key) {\n renderDfd.resolve();\n }\n }, [renderDfd, transition, state.location, pendingState]);\n React3.useEffect(() => {\n if (!vtContext.isTransitioning && interruption) {\n setPendingState(interruption.state);\n setVtContext({\n isTransitioning: true,\n flushSync: false,\n currentLocation: interruption.currentLocation,\n nextLocation: interruption.nextLocation\n });\n setInterruption(void 0);\n }\n }, [vtContext.isTransitioning, interruption]);\n let navigator = React3.useMemo(() => {\n return {\n createHref: router.createHref,\n createURL: router.createURL,\n encodeLocation: router.encodeLocation,\n go: (n) => router.navigate(n),\n push: (to, state2, opts) => router.navigate(to, {\n state: state2,\n preventScrollReset: opts?.preventScrollReset\n }),\n replace: (to, state2, opts) => router.navigate(to, {\n replace: true,\n state: state2,\n preventScrollReset: opts?.preventScrollReset\n })\n };\n }, [router]);\n let basename = router.basename || \"/\";\n let dataRouterContext = React3.useMemo(\n () => ({\n router,\n navigator,\n static: false,\n basename,\n onError\n }),\n [router, navigator, basename, onError]\n );\n return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(DataRouterContext.Provider, { value: dataRouterContext }, /* @__PURE__ */ React3.createElement(DataRouterStateContext.Provider, { value: state }, /* @__PURE__ */ React3.createElement(FetchersContext.Provider, { value: fetcherData.current }, /* @__PURE__ */ React3.createElement(ViewTransitionContext.Provider, { value: vtContext }, /* @__PURE__ */ React3.createElement(\n Router,\n {\n basename,\n location: state.location,\n navigationType: state.historyAction,\n navigator,\n useTransitions\n },\n /* @__PURE__ */ React3.createElement(\n MemoizedDataRoutes,\n {\n routes: router.routes,\n manifest: router.manifest,\n future: router.future,\n state,\n isStatic: false,\n onError\n }\n )\n ))))), null);\n}\nfunction getOptimisticRouterState(currentState, newState) {\n return {\n // Don't surface \"current location specific\" stuff mid-navigation\n // (historyAction, location, matches, loaderData, errors, initialized,\n // restoreScroll, preventScrollReset, blockers, etc.)\n ...currentState,\n // Only surface \"pending/in-flight stuff\"\n // (navigation, revalidation, actionData, fetchers, )\n navigation: newState.navigation.state !== \"idle\" ? newState.navigation : currentState.navigation,\n revalidation: newState.revalidation !== \"idle\" ? newState.revalidation : currentState.revalidation,\n actionData: newState.navigation.state !== \"submitting\" ? newState.actionData : currentState.actionData,\n fetchers: newState.fetchers\n };\n}\nvar MemoizedDataRoutes = React3.memo(DataRoutes2);\nfunction DataRoutes2({\n routes,\n manifest,\n future,\n state,\n isStatic,\n onError\n}) {\n return useRoutesImpl(routes, void 0, {\n manifest,\n state,\n isStatic,\n onError,\n future\n });\n}\nfunction MemoryRouter({\n basename,\n children,\n initialEntries,\n initialIndex,\n useTransitions\n}) {\n let historyRef = React3.useRef();\n if (historyRef.current == null) {\n historyRef.current = createMemoryHistory({\n initialEntries,\n initialIndex,\n v5Compat: true\n });\n }\n let history = historyRef.current;\n let [state, setStateImpl] = React3.useState({\n action: history.action,\n location: history.location\n });\n let setState = React3.useCallback(\n (newState) => {\n if (useTransitions === false) {\n setStateImpl(newState);\n } else {\n React3.startTransition(() => setStateImpl(newState));\n }\n },\n [useTransitions]\n );\n React3.useLayoutEffect(() => history.listen(setState), [history, setState]);\n return /* @__PURE__ */ React3.createElement(\n Router,\n {\n basename,\n children,\n location: state.location,\n navigationType: state.action,\n navigator: history,\n useTransitions\n }\n );\n}\nfunction Navigate({\n to,\n replace: replace2,\n state,\n relative\n}) {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of\n // the router loaded. We can help them understand how to avoid that.\n `<Navigate> may be used only in the context of a <Router> component.`\n );\n let { static: isStatic, navigator } = React3.useContext(NavigationContext);\n warning(\n !isStatic,\n `<Navigate> must not be used on the initial render in a <StaticRouter>. This is a no-op, but you should modify your code so the <Navigate> is only ever rendered in response to some user interaction or state change.`\n );\n let { matches } = React3.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let navigate = useNavigate();\n let path = resolveTo(\n to,\n getResolveToMatches(matches),\n locationPathname,\n relative === \"path\"\n );\n validateNavigationTarget(\n typeof to === \"string\" ? to : createPath(to),\n navigator.createHref(path),\n getNavigatorCurrentUrl(navigator),\n \"reject\"\n );\n let jsonPath = JSON.stringify(path);\n React3.useEffect(() => {\n navigate(JSON.parse(jsonPath), { replace: replace2, state, relative });\n }, [navigate, jsonPath, relative, replace2, state]);\n return null;\n}\nfunction Outlet(props) {\n return useOutlet(props.context);\n}\nfunction Route(props) {\n invariant(\n false,\n `A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>.`\n );\n}\nfunction Router({\n basename: basenameProp = \"/\",\n children = null,\n location: locationProp,\n navigationType = \"POP\" /* Pop */,\n navigator,\n static: staticProp = false,\n useTransitions\n}) {\n invariant(\n !useInRouterContext(),\n `You cannot render a <Router> inside another <Router>. You should never have more than one in your app.`\n );\n let basename = basenameProp.replace(/^\\/*/, \"/\");\n let navigationContext = React3.useMemo(\n () => ({\n basename,\n navigator,\n static: staticProp,\n useTransitions,\n future: {}\n }),\n [basename, navigator, staticProp, useTransitions]\n );\n if (typeof locationProp === \"string\") {\n locationProp = parsePath(locationProp);\n }\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n state = null,\n key = \"default\",\n mask\n } = locationProp;\n let locationContext = React3.useMemo(() => {\n let trailingPathname = stripBasename(pathname, basename);\n if (trailingPathname == null) {\n return null;\n }\n return {\n location: {\n pathname: trailingPathname,\n search,\n hash,\n state,\n key,\n mask\n },\n navigationType\n };\n }, [basename, pathname, search, hash, state, key, navigationType, mask]);\n warning(\n locationContext != null,\n `<Router basename=\"${basename}\"> is not able to match the URL \"${pathname}${search}${hash}\" because it does not start with the basename, so the <Router> won't render anything.`\n );\n if (locationContext == null) {\n return null;\n }\n return /* @__PURE__ */ React3.createElement(NavigationContext.Provider, { value: navigationContext }, /* @__PURE__ */ React3.createElement(LocationContext.Provider, { children, value: locationContext }));\n}\nfunction Routes({\n children,\n location\n}) {\n return useRoutes(createRoutesFromChildren(children), location);\n}\nfunction Await({\n children,\n errorElement,\n resolve\n}) {\n let dataRouterContext = React3.useContext(DataRouterContext);\n let dataRouterStateContext = React3.useContext(DataRouterStateContext);\n let onError = React3.useCallback(\n (error, errorInfo) => {\n if (dataRouterContext && dataRouterContext.onError && dataRouterStateContext) {\n dataRouterContext.onError(error, {\n location: dataRouterStateContext.location,\n params: dataRouterStateContext.matches[0]?.params || {},\n pattern: getRoutePattern(dataRouterStateContext.matches),\n errorInfo\n });\n }\n },\n [dataRouterContext, dataRouterStateContext]\n );\n return /* @__PURE__ */ React3.createElement(\n AwaitErrorBoundary,\n {\n resolve,\n errorElement,\n onError\n },\n /* @__PURE__ */ React3.createElement(ResolveAwait, null, children)\n );\n}\nvar AwaitErrorBoundary = class extends React3.Component {\n constructor(props) {\n super(props);\n this.state = { error: null };\n }\n static getDerivedStateFromError(error) {\n return { error };\n }\n componentDidCatch(error, errorInfo) {\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n } else {\n console.error(\n \"<Await> caught the following error during render\",\n error,\n errorInfo\n );\n }\n }\n render() {\n let { children, errorElement, resolve } = this.props;\n let promise = null;\n let status = 0 /* pending */;\n if (!(resolve instanceof Promise)) {\n status = 1 /* success */;\n promise = Promise.resolve();\n Object.defineProperty(promise, \"_tracked\", { get: () => true });\n Object.defineProperty(promise, \"_data\", { get: () => resolve });\n } else if (this.state.error) {\n status = 2 /* error */;\n let renderError = this.state.error;\n promise = Promise.reject().catch(() => {\n });\n Object.defineProperty(promise, \"_tracked\", { get: () => true });\n Object.defineProperty(promise, \"_error\", { get: () => renderError });\n } else if (resolve._tracked) {\n promise = resolve;\n status = \"_error\" in promise ? 2 /* error */ : \"_data\" in promise ? 1 /* success */ : 0 /* pending */;\n } else {\n status = 0 /* pending */;\n Object.defineProperty(resolve, \"_tracked\", { get: () => true });\n promise = resolve.then(\n (data2) => Object.defineProperty(resolve, \"_data\", { get: () => data2 }),\n (error) => {\n this.props.onError?.(error);\n Object.defineProperty(resolve, \"_error\", { get: () => error });\n }\n );\n }\n if (status === 2 /* error */ && !errorElement) {\n throw promise._error;\n }\n if (status === 2 /* error */) {\n return /* @__PURE__ */ React3.createElement(AwaitContext.Provider, { value: promise, children: errorElement });\n }\n if (status === 1 /* success */) {\n return /* @__PURE__ */ React3.createElement(AwaitContext.Provider, { value: promise, children });\n }\n throw promise;\n }\n};\nfunction ResolveAwait({\n children\n}) {\n let data2 = useAsyncValue();\n let toRender = typeof children === \"function\" ? children(data2) : children;\n return /* @__PURE__ */ React3.createElement(React3.Fragment, null, toRender);\n}\nfunction createRoutesFromChildren(children, parentPath = []) {\n let routes = [];\n React3.Children.forEach(children, (element, index) => {\n if (!React3.isValidElement(element)) {\n return;\n }\n let treePath = [...parentPath, index];\n if (element.type === React3.Fragment) {\n routes.push.apply(\n routes,\n createRoutesFromChildren(element.props.children, treePath)\n );\n return;\n }\n invariant(\n element.type === Route,\n `[${typeof element.type === \"string\" ? element.type : element.type.name}] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`\n );\n invariant(\n !element.props.index || !element.props.children,\n \"An index route cannot have child routes.\"\n );\n let route = {\n id: element.props.id || treePath.join(\"-\"),\n caseSensitive: element.props.caseSensitive,\n element: element.props.element,\n Component: element.props.Component,\n index: element.props.index,\n path: element.props.path,\n middleware: element.props.middleware,\n loader: element.props.loader,\n action: element.props.action,\n hydrateFallbackElement: element.props.hydrateFallbackElement,\n HydrateFallback: element.props.HydrateFallback,\n errorElement: element.props.errorElement,\n ErrorBoundary: element.props.ErrorBoundary,\n hasErrorBoundary: element.props.hasErrorBoundary === true || element.props.ErrorBoundary != null || element.props.errorElement != null,\n shouldRevalidate: element.props.shouldRevalidate,\n handle: element.props.handle,\n lazy: element.props.lazy\n };\n if (element.props.children) {\n route.children = createRoutesFromChildren(\n element.props.children,\n treePath\n );\n }\n routes.push(route);\n });\n return routes;\n}\nvar createRoutesFromElements = createRoutesFromChildren;\nfunction renderMatches(matches) {\n return _renderMatches(matches);\n}\nfunction useRouteComponentProps() {\n return {\n params: useParams(),\n loaderData: useLoaderData(),\n actionData: useActionData(),\n matches: useMatches()\n };\n}\nfunction WithComponentProps({\n children\n}) {\n const props = useRouteComponentProps();\n return React3.cloneElement(children, props);\n}\nfunction withComponentProps(Component4) {\n return function WithComponentProps2() {\n const props = useRouteComponentProps();\n return React3.createElement(Component4, props);\n };\n}\nfunction useHydrateFallbackProps() {\n return {\n params: useParams(),\n loaderData: useLoaderData(),\n actionData: useActionData()\n };\n}\nfunction WithHydrateFallbackProps({\n children\n}) {\n const props = useHydrateFallbackProps();\n return React3.cloneElement(children, props);\n}\nfunction withHydrateFallbackProps(HydrateFallback) {\n return function WithHydrateFallbackProps2() {\n const props = useHydrateFallbackProps();\n return React3.createElement(HydrateFallback, props);\n };\n}\nfunction useErrorBoundaryProps() {\n return {\n params: useParams(),\n loaderData: useLoaderData(),\n actionData: useActionData(),\n error: useRouteError()\n };\n}\nfunction WithErrorBoundaryProps({\n children\n}) {\n const props = useErrorBoundaryProps();\n return React3.cloneElement(children, props);\n}\nfunction withErrorBoundaryProps(ErrorBoundary) {\n return function WithErrorBoundaryProps2() {\n const props = useErrorBoundaryProps();\n return React3.createElement(ErrorBoundary, props);\n };\n}\n\n// lib/dom/dom.ts\nvar defaultMethod = \"get\";\nvar defaultEncType = \"application/x-www-form-urlencoded\";\nfunction isHtmlElement(object) {\n return typeof HTMLElement !== \"undefined\" && object instanceof HTMLElement;\n}\nfunction isButtonElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\nfunction isFormElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\nfunction isInputElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n return event.button === 0 && // Ignore everything but left clicks\n (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event);\n}\nfunction createSearchParams(init = \"\") {\n return new URLSearchParams(\n typeof init === \"string\" || Array.isArray(init) || init instanceof URLSearchParams ? init : Object.keys(init).reduce((memo2, key) => {\n let value = init[key];\n return memo2.concat(\n Array.isArray(value) ? value.map((v) => [key, v]) : [[key, value]]\n );\n }, [])\n );\n}\nfunction getSearchParamsForLocation(locationSearch, defaultSearchParams) {\n let searchParams = createSearchParams(locationSearch);\n if (defaultSearchParams) {\n defaultSearchParams.forEach((_, key) => {\n if (!searchParams.has(key)) {\n defaultSearchParams.getAll(key).forEach((value) => {\n searchParams.append(key, value);\n });\n }\n });\n }\n return searchParams;\n}\nvar _formDataSupportsSubmitter = null;\nfunction isFormDataSubmitterSupported() {\n if (_formDataSupportsSubmitter === null) {\n try {\n new FormData(\n document.createElement(\"form\"),\n // @ts-expect-error if FormData supports the submitter parameter, this will throw\n 0\n );\n _formDataSupportsSubmitter = false;\n } catch (e) {\n _formDataSupportsSubmitter = true;\n }\n }\n return _formDataSupportsSubmitter;\n}\nvar supportedFormEncTypes = /* @__PURE__ */ new Set([\n \"application/x-www-form-urlencoded\",\n \"multipart/form-data\",\n \"text/plain\"\n]);\nfunction getFormEncType(encType) {\n if (encType != null && !supportedFormEncTypes.has(encType)) {\n warning(\n false,\n `\"${encType}\" is not a valid \\`encType\\` for \\`<Form>\\`/\\`<fetcher.Form>\\` and will default to \"${defaultEncType}\"`\n );\n return null;\n }\n return encType;\n}\nfunction getFormSubmissionInfo(target, basename) {\n let method;\n let action;\n let encType;\n let formData;\n let body;\n if (isFormElement(target)) {\n let attr = target.getAttribute(\"action\");\n action = attr ? stripBasename(attr, basename) : null;\n method = target.getAttribute(\"method\") || defaultMethod;\n encType = getFormEncType(target.getAttribute(\"enctype\")) || defaultEncType;\n formData = new FormData(target);\n } else if (isButtonElement(target) || isInputElement(target) && (target.type === \"submit\" || target.type === \"image\")) {\n let form = target.form;\n if (form == null) {\n throw new Error(\n `Cannot submit a <button> or <input type=\"submit\"> without a <form>`\n );\n }\n let attr = target.getAttribute(\"formaction\") || form.getAttribute(\"action\");\n action = attr ? stripBasename(attr, basename) : null;\n method = target.getAttribute(\"formmethod\") || form.getAttribute(\"method\") || defaultMethod;\n encType = getFormEncType(target.getAttribute(\"formenctype\")) || getFormEncType(form.getAttribute(\"enctype\")) || defaultEncType;\n formData = new FormData(form, target);\n if (!isFormDataSubmitterSupported()) {\n let { name, type, value } = target;\n if (type === \"image\") {\n let prefix = name ? `${name}.` : \"\";\n formData.append(`${prefix}x`, \"0\");\n formData.append(`${prefix}y`, \"0\");\n } else if (name) {\n formData.append(name, value);\n }\n }\n } else if (isHtmlElement(target)) {\n throw new Error(\n `Cannot submit element that is not <form>, <button>, or <input type=\"submit|image\">`\n );\n } else {\n method = defaultMethod;\n action = null;\n encType = defaultEncType;\n body = target;\n }\n if (formData && encType === \"text/plain\") {\n body = formData;\n formData = void 0;\n }\n return { action, method: method.toLowerCase(), encType, formData, body };\n}\n\n// lib/dom/ssr/single-fetch.tsx\nimport * as React4 from \"react\";\n\n// vendor/turbo-stream-v2/utils.ts\nvar HOLE = -1;\nvar NAN = -2;\nvar NEGATIVE_INFINITY = -3;\nvar NEGATIVE_ZERO = -4;\nvar NULL = -5;\nvar POSITIVE_INFINITY = -6;\nvar UNDEFINED = -7;\nvar TYPE_BIGINT = \"B\";\nvar TYPE_DATE = \"D\";\nvar TYPE_ERROR = \"E\";\nvar TYPE_MAP = \"M\";\nvar TYPE_NULL_OBJECT = \"N\";\nvar TYPE_PROMISE = \"P\";\nvar TYPE_REGEXP = \"R\";\nvar TYPE_SET = \"S\";\nvar TYPE_SYMBOL = \"Y\";\nvar TYPE_URL = \"U\";\nvar TYPE_PREVIOUS_RESOLVED = \"Z\";\nvar Deferred2 = class {\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n};\nfunction createLineSplittingTransform() {\n const decoder = new TextDecoder();\n let leftover = \"\";\n return new TransformStream({\n transform(chunk, controller) {\n const str = decoder.decode(chunk, { stream: true });\n const parts = (leftover + str).split(\"\\n\");\n leftover = parts.pop() || \"\";\n for (const part of parts) {\n controller.enqueue(part);\n }\n },\n flush(controller) {\n if (leftover) {\n controller.enqueue(leftover);\n }\n }\n });\n}\n\n// vendor/turbo-stream-v2/flatten.ts\nvar TIME_LIMIT_MS = 1;\nvar getNow = () => Date.now();\nvar yieldToMain = () => new Promise((resolve) => setTimeout(resolve, 0));\nasync function flatten(input) {\n const { indices } = this;\n const existing = indices.get(input);\n if (existing) return [existing];\n if (input === void 0) return UNDEFINED;\n if (input === null) return NULL;\n if (Number.isNaN(input)) return NAN;\n if (input === Number.POSITIVE_INFINITY) return POSITIVE_INFINITY;\n if (input === Number.NEGATIVE_INFINITY) return NEGATIVE_INFINITY;\n if (input === 0 && 1 / input < 0) return NEGATIVE_ZERO;\n const index = this.index++;\n indices.set(input, index);\n const stack = [[input, index]];\n await stringify.call(this, stack);\n return index;\n}\nasync function stringify(stack) {\n const { deferred, indices, plugins, postPlugins } = this;\n const str = this.stringified;\n let lastYieldTime = getNow();\n const flattenValue = (value) => {\n const existing = indices.get(value);\n if (existing) return [existing];\n if (value === void 0) return UNDEFINED;\n if (value === null) return NULL;\n if (Number.isNaN(value)) return NAN;\n if (value === Number.POSITIVE_INFINITY) return POSITIVE_INFINITY;\n if (value === Number.NEGATIVE_INFINITY) return NEGATIVE_INFINITY;\n if (value === 0 && 1 / value < 0) return NEGATIVE_ZERO;\n const index = this.index++;\n indices.set(value, index);\n stack.push([value, index]);\n return index;\n };\n let i = 0;\n while (stack.length > 0) {\n const now = getNow();\n if (++i % 6e3 === 0 && now - lastYieldTime >= TIME_LIMIT_MS) {\n await yieldToMain();\n lastYieldTime = getNow();\n }\n const [input, index] = stack.pop();\n const partsForObj = (obj) => Object.keys(obj).map((k) => `\"_${flattenValue(k)}\":${flattenValue(obj[k])}`).join(\",\");\n let error = null;\n switch (typeof input) {\n case \"boolean\":\n case \"number\":\n case \"string\":\n str[index] = JSON.stringify(input);\n break;\n case \"bigint\":\n str[index] = `[\"${TYPE_BIGINT}\",\"${input}\"]`;\n break;\n case \"symbol\": {\n const keyFor = Symbol.keyFor(input);\n if (!keyFor) {\n error = new Error(\n \"Cannot encode symbol unless created with Symbol.for()\"\n );\n } else {\n str[index] = `[\"${TYPE_SYMBOL}\",${JSON.stringify(keyFor)}]`;\n }\n break;\n }\n case \"object\": {\n if (!input) {\n str[index] = `${NULL}`;\n break;\n }\n const isArray = Array.isArray(input);\n let pluginHandled = false;\n if (!isArray && plugins) {\n for (const plugin of plugins) {\n const pluginResult = plugin(input);\n if (Array.isArray(pluginResult)) {\n pluginHandled = true;\n const [pluginIdentifier, ...rest] = pluginResult;\n str[index] = `[${JSON.stringify(pluginIdentifier)}`;\n if (rest.length > 0) {\n str[index] += `,${rest.map((v) => flattenValue(v)).join(\",\")}`;\n }\n str[index] += \"]\";\n break;\n }\n }\n }\n if (!pluginHandled) {\n let result = isArray ? \"[\" : \"{\";\n if (isArray) {\n for (let i2 = 0; i2 < input.length; i2++)\n result += (i2 ? \",\" : \"\") + (i2 in input ? flattenValue(input[i2]) : HOLE);\n str[index] = `${result}]`;\n } else if (input instanceof Date) {\n const dateTime = input.getTime();\n str[index] = `[\"${TYPE_DATE}\",${Number.isNaN(dateTime) ? JSON.stringify(\"invalid\") : dateTime}]`;\n } else if (input instanceof URL) {\n str[index] = `[\"${TYPE_URL}\",${JSON.stringify(input.href)}]`;\n } else if (input instanceof RegExp) {\n str[index] = `[\"${TYPE_REGEXP}\",${JSON.stringify(\n input.source\n )},${JSON.stringify(input.flags)}]`;\n } else if (input instanceof Set) {\n if (input.size > 0) {\n str[index] = `[\"${TYPE_SET}\",${[...input].map((val) => flattenValue(val)).join(\",\")}]`;\n } else {\n str[index] = `[\"${TYPE_SET}\"]`;\n }\n } else if (input instanceof Map) {\n if (input.size > 0) {\n str[index] = `[\"${TYPE_MAP}\",${[...input].flatMap(([k, v]) => [flattenValue(k), flattenValue(v)]).join(\",\")}]`;\n } else {\n str[index] = `[\"${TYPE_MAP}\"]`;\n }\n } else if (input instanceof Promise) {\n str[index] = `[\"${TYPE_PROMISE}\",${index}]`;\n deferred[index] = input;\n } else if (input instanceof Error) {\n str[index] = `[\"${TYPE_ERROR}\",${JSON.stringify(input.message)}`;\n if (input.name !== \"Error\") {\n str[index] += `,${JSON.stringify(input.name)}`;\n }\n str[index] += \"]\";\n } else if (Object.getPrototypeOf(input) === null) {\n str[index] = `[\"${TYPE_NULL_OBJECT}\",{${partsForObj(input)}}]`;\n } else if (isPlainObject2(input)) {\n str[index] = `{${partsForObj(input)}}`;\n } else {\n error = new Error(\"Cannot encode object with prototype\");\n }\n }\n break;\n }\n default: {\n const isArray = Array.isArray(input);\n let pluginHandled = false;\n if (!isArray && plugins) {\n for (const plugin of plugins) {\n const pluginResult = plugin(input);\n if (Array.isArray(pluginResult)) {\n pluginHandled = true;\n const [pluginIdentifier, ...rest] = pluginResult;\n str[index] = `[${JSON.stringify(pluginIdentifier)}`;\n if (rest.length > 0) {\n str[index] += `,${rest.map((v) => flattenValue(v)).join(\",\")}`;\n }\n str[index] += \"]\";\n break;\n }\n }\n }\n if (!pluginHandled) {\n error = new Error(\"Cannot encode function or unexpected type\");\n }\n }\n }\n if (error) {\n let pluginHandled = false;\n if (postPlugins) {\n for (const plugin of postPlugins) {\n const pluginResult = plugin(input);\n if (Array.isArray(pluginResult)) {\n pluginHandled = true;\n const [pluginIdentifier, ...rest] = pluginResult;\n str[index] = `[${JSON.stringify(pluginIdentifier)}`;\n if (rest.length > 0) {\n str[index] += `,${rest.map((v) => flattenValue(v)).join(\",\")}`;\n }\n str[index] += \"]\";\n break;\n }\n }\n }\n if (!pluginHandled) {\n throw error;\n }\n }\n }\n}\nvar objectProtoNames2 = Object.getOwnPropertyNames(Object.prototype).sort().join(\"\\0\");\nfunction isPlainObject2(thing) {\n const proto = Object.getPrototypeOf(thing);\n return proto === Object.prototype || proto === null || Object.getOwnPropertyNames(proto).sort().join(\"\\0\") === objectProtoNames2;\n}\n\n// vendor/turbo-stream-v2/unflatten.ts\nvar globalObj = typeof window !== \"undefined\" ? window : typeof globalThis !== \"undefined\" ? globalThis : void 0;\nfunction unflatten(parsed) {\n const { hydrated, values } = this;\n if (typeof parsed === \"number\") return hydrate.call(this, parsed);\n if (!Array.isArray(parsed) || !parsed.length) throw new SyntaxError();\n const startIndex = values.length;\n for (const value of parsed) {\n values.push(value);\n }\n hydrated.length = values.length;\n return hydrate.call(this, startIndex);\n}\nfunction hydrate(index) {\n const { hydrated, values, deferred, plugins } = this;\n let result;\n const stack = [\n [\n index,\n (v) => {\n result = v;\n }\n ]\n ];\n let postRun = [];\n while (stack.length > 0) {\n const [index2, set] = stack.pop();\n switch (index2) {\n case UNDEFINED:\n set(void 0);\n continue;\n case NULL:\n set(null);\n continue;\n case NAN:\n set(NaN);\n continue;\n case POSITIVE_INFINITY:\n set(Infinity);\n continue;\n case NEGATIVE_INFINITY:\n set(-Infinity);\n continue;\n case NEGATIVE_ZERO:\n set(-0);\n continue;\n }\n if (hydrated[index2]) {\n set(hydrated[index2]);\n continue;\n }\n const value = values[index2];\n if (!value || typeof value !== \"object\") {\n hydrated[index2] = value;\n set(value);\n continue;\n }\n if (Array.isArray(value)) {\n if (typeof value[0] === \"string\") {\n const [type, b, c] = value;\n switch (type) {\n case TYPE_DATE:\n set(hydrated[index2] = new Date(b));\n continue;\n case TYPE_URL:\n set(hydrated[index2] = new URL(b));\n continue;\n case TYPE_BIGINT:\n set(hydrated[index2] = BigInt(b));\n continue;\n case TYPE_REGEXP:\n set(hydrated[index2] = new RegExp(b, c));\n continue;\n case TYPE_SYMBOL:\n set(hydrated[index2] = Symbol.for(b));\n continue;\n case TYPE_SET:\n const newSet = /* @__PURE__ */ new Set();\n hydrated[index2] = newSet;\n for (let i = value.length - 1; i > 0; i--)\n stack.push([\n value[i],\n (v) => {\n newSet.add(v);\n }\n ]);\n set(newSet);\n continue;\n case TYPE_MAP:\n const map = /* @__PURE__ */ new Map();\n hydrated[index2] = map;\n for (let i = value.length - 2; i > 0; i -= 2) {\n const r = [];\n stack.push([\n value[i + 1],\n (v) => {\n r[1] = v;\n }\n ]);\n stack.push([\n value[i],\n (k) => {\n r[0] = k;\n }\n ]);\n postRun.push(() => {\n map.set(r[0], r[1]);\n });\n }\n set(map);\n continue;\n case TYPE_NULL_OBJECT:\n const obj = /* @__PURE__ */ Object.create(null);\n hydrated[index2] = obj;\n for (const key of Object.keys(b).reverse()) {\n const r = [];\n stack.push([\n b[key],\n (v) => {\n r[1] = v;\n }\n ]);\n stack.push([\n Number(key.slice(1)),\n (k) => {\n r[0] = k;\n }\n ]);\n postRun.push(() => {\n obj[r[0]] = r[1];\n });\n }\n set(obj);\n continue;\n case TYPE_PROMISE:\n if (hydrated[b]) {\n set(hydrated[index2] = hydrated[b]);\n } else {\n const d = new Deferred2();\n deferred[b] = d;\n set(hydrated[index2] = d.promise);\n }\n continue;\n case TYPE_ERROR:\n const [, message, errorType] = value;\n let error = errorType && globalObj && SUPPORTED_ERROR_TYPES.includes(errorType) && errorType in globalObj && typeof globalObj[errorType] === \"function\" ? new globalObj[errorType](message) : new Error(message);\n hydrated[index2] = error;\n set(error);\n continue;\n case TYPE_PREVIOUS_RESOLVED:\n set(hydrated[index2] = hydrated[b]);\n continue;\n default:\n if (Array.isArray(plugins)) {\n const r = [];\n const vals = value.slice(1);\n for (let i = 0; i < vals.length; i++) {\n const v = vals[i];\n stack.push([\n v,\n (v2) => {\n r[i] = v2;\n }\n ]);\n }\n postRun.push(() => {\n for (const plugin of plugins) {\n const result2 = plugin(value[0], ...r);\n if (result2) {\n set(hydrated[index2] = result2.value);\n return;\n }\n }\n throw new SyntaxError();\n });\n continue;\n }\n throw new SyntaxError();\n }\n } else {\n const array = [];\n hydrated[index2] = array;\n for (let i = 0; i < value.length; i++) {\n const n = value[i];\n if (n !== HOLE) {\n stack.push([\n n,\n (v) => {\n array[i] = v;\n }\n ]);\n }\n }\n set(array);\n continue;\n }\n } else {\n const object = {};\n hydrated[index2] = object;\n for (const key of Object.keys(value).reverse()) {\n const r = [];\n stack.push([\n value[key],\n (v) => {\n r[1] = v;\n }\n ]);\n stack.push([\n Number(key.slice(1)),\n (k) => {\n r[0] = k;\n }\n ]);\n postRun.push(() => {\n object[r[0]] = r[1];\n });\n }\n set(object);\n continue;\n }\n }\n while (postRun.length > 0) {\n postRun.pop()();\n }\n return result;\n}\n\n// vendor/turbo-stream-v2/turbo-stream.ts\nasync function decode(readable, options) {\n const { plugins } = options ?? {};\n const done = new Deferred2();\n const reader = readable.pipeThrough(createLineSplittingTransform()).getReader();\n const decoder = {\n values: [],\n hydrated: [],\n deferred: {},\n plugins\n };\n const decoded = await decodeInitial.call(decoder, reader);\n let donePromise = done.promise;\n if (decoded.done) {\n done.resolve();\n } else {\n donePromise = decodeDeferred.call(decoder, reader).then(done.resolve).catch((reason) => {\n for (const deferred of Object.values(decoder.deferred)) {\n deferred.reject(reason);\n }\n done.reject(reason);\n });\n }\n return {\n done: donePromise.then(() => reader.closed),\n value: decoded.value\n };\n}\nasync function decodeInitial(reader) {\n const read = await reader.read();\n if (!read.value) {\n throw new SyntaxError();\n }\n let line;\n try {\n line = JSON.parse(read.value);\n } catch (reason) {\n throw new SyntaxError();\n }\n return {\n done: read.done,\n value: unflatten.call(this, line)\n };\n}\nasync function decodeDeferred(reader) {\n let read = await reader.read();\n while (!read.done) {\n if (!read.value) continue;\n const line = read.value;\n switch (line[0]) {\n case TYPE_PROMISE: {\n const colonIndex = line.indexOf(\":\");\n const deferredId = Number(line.slice(1, colonIndex));\n const deferred = this.deferred[deferredId];\n if (!deferred) {\n throw new Error(`Deferred ID ${deferredId} not found in stream`);\n }\n const lineData = line.slice(colonIndex + 1);\n let jsonLine;\n try {\n jsonLine = JSON.parse(lineData);\n } catch (reason) {\n throw new SyntaxError();\n }\n const value = unflatten.call(this, jsonLine);\n deferred.resolve(value);\n break;\n }\n case TYPE_ERROR: {\n const colonIndex = line.indexOf(\":\");\n const deferredId = Number(line.slice(1, colonIndex));\n const deferred = this.deferred[deferredId];\n if (!deferred) {\n throw new Error(`Deferred ID ${deferredId} not found in stream`);\n }\n const lineData = line.slice(colonIndex + 1);\n let jsonLine;\n try {\n jsonLine = JSON.parse(lineData);\n } catch (reason) {\n throw new SyntaxError();\n }\n const value = unflatten.call(this, jsonLine);\n deferred.reject(value);\n break;\n }\n default:\n throw new SyntaxError();\n }\n read = await reader.read();\n }\n}\nfunction encode(input, options) {\n const { onComplete, plugins, postPlugins, signal } = options ?? {};\n const encoder = {\n deferred: {},\n index: 0,\n indices: /* @__PURE__ */ new Map(),\n stringified: [],\n plugins,\n postPlugins,\n signal\n };\n const textEncoder = new TextEncoder();\n let lastSentIndex = 0;\n const readable = new ReadableStream({\n async start(controller) {\n const id = await flatten.call(encoder, input);\n if (Array.isArray(id)) {\n throw new Error(\"This should never happen\");\n }\n if (id < 0) {\n controller.enqueue(textEncoder.encode(`${id}\n`));\n } else {\n controller.enqueue(\n textEncoder.encode(`[${encoder.stringified.join(\",\")}]\n`)\n );\n lastSentIndex = encoder.stringified.length - 1;\n }\n const seenPromises = /* @__PURE__ */ new WeakSet();\n let processingChain = Promise.resolve();\n if (Object.keys(encoder.deferred).length) {\n let raceDone;\n const racePromise = new Promise((resolve, reject) => {\n raceDone = resolve;\n if (signal) {\n const rejectPromise = () => reject(signal.reason || new Error(\"Signal was aborted.\"));\n if (signal.aborted) {\n rejectPromise();\n } else {\n signal.addEventListener(\"abort\", (event) => {\n rejectPromise();\n });\n }\n }\n });\n while (Object.keys(encoder.deferred).length > 0) {\n for (const [deferredId, deferred] of Object.entries(\n encoder.deferred\n )) {\n if (seenPromises.has(deferred)) continue;\n seenPromises.add(\n // biome-ignore lint/suspicious/noAssignInExpressions: <explanation>\n encoder.deferred[Number(deferredId)] = Promise.race([\n racePromise,\n deferred\n ]).then(\n (resolved) => {\n processingChain = processingChain.then(async () => {\n const id2 = await flatten.call(encoder, resolved);\n if (Array.isArray(id2)) {\n controller.enqueue(\n textEncoder.encode(\n `${TYPE_PROMISE}${deferredId}:[[\"${TYPE_PREVIOUS_RESOLVED}\",${id2[0]}]]\n`\n )\n );\n encoder.index++;\n lastSentIndex++;\n } else if (id2 < 0) {\n controller.enqueue(\n textEncoder.encode(\n `${TYPE_PROMISE}${deferredId}:${id2}\n`\n )\n );\n } else {\n const values = encoder.stringified.slice(lastSentIndex + 1).join(\",\");\n controller.enqueue(\n textEncoder.encode(\n `${TYPE_PROMISE}${deferredId}:[${values}]\n`\n )\n );\n lastSentIndex = encoder.stringified.length - 1;\n }\n });\n return processingChain;\n },\n (reason) => {\n processingChain = processingChain.then(async () => {\n if (!reason || typeof reason !== \"object\" || !(reason instanceof Error)) {\n reason = new Error(\"An unknown error occurred\");\n }\n const id2 = await flatten.call(encoder, reason);\n if (Array.isArray(id2)) {\n controller.enqueue(\n textEncoder.encode(\n `${TYPE_ERROR}${deferredId}:[[\"${TYPE_PREVIOUS_RESOLVED}\",${id2[0]}]]\n`\n )\n );\n encoder.index++;\n lastSentIndex++;\n } else if (id2 < 0) {\n controller.enqueue(\n textEncoder.encode(\n `${TYPE_ERROR}${deferredId}:${id2}\n`\n )\n );\n } else {\n const values = encoder.stringified.slice(lastSentIndex + 1).join(\",\");\n controller.enqueue(\n textEncoder.encode(\n `${TYPE_ERROR}${deferredId}:[${values}]\n`\n )\n );\n lastSentIndex = encoder.stringified.length - 1;\n }\n });\n return processingChain;\n }\n ).finally(() => {\n delete encoder.deferred[Number(deferredId)];\n })\n );\n }\n await Promise.race(Object.values(encoder.deferred));\n }\n raceDone();\n }\n await Promise.all(Object.values(encoder.deferred));\n await processingChain;\n controller.close();\n onComplete?.();\n }\n });\n return readable;\n}\n\n// lib/dom/ssr/data.ts\nasync function createRequestInit(request) {\n let init = { signal: request.signal };\n if (request.method !== \"GET\") {\n init.method = request.method;\n let contentType = request.headers.get(\"Content-Type\");\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n init.headers = { \"Content-Type\": contentType };\n init.body = JSON.stringify(await request.json());\n } else if (contentType && /\\btext\\/plain\\b/.test(contentType)) {\n init.headers = { \"Content-Type\": contentType };\n init.body = await request.text();\n } else if (contentType && /\\bapplication\\/x-www-form-urlencoded\\b/.test(contentType)) {\n init.body = new URLSearchParams(await request.text());\n } else {\n init.body = await request.formData();\n }\n }\n return init;\n}\n\n// lib/dom/ssr/markup.ts\nvar ESCAPE_LOOKUP = {\n \"&\": \"\\\\u0026\",\n \">\": \"\\\\u003e\",\n \"<\": \"\\\\u003c\",\n \"\\u2028\": \"\\\\u2028\",\n \"\\u2029\": \"\\\\u2029\"\n};\nvar ESCAPE_REGEX = /[&><\\u2028\\u2029]/g;\nfunction escapeHtml(html) {\n return html.replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);\n}\nfunction escapeAttribute(value) {\n return value.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\n// lib/dom/ssr/invariant.ts\nfunction invariant2(value, message) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\n\n// lib/dom/ssr/single-fetch.tsx\nvar SingleFetchRedirectSymbol = Symbol(\"SingleFetchRedirect\");\nvar SingleFetchNoResultError = class extends Error {\n};\nvar SINGLE_FETCH_REDIRECT_STATUS = 202;\nvar NO_BODY_STATUS_CODES = /* @__PURE__ */ new Set([100, 101, 204, 205]);\nfunction StreamTransfer({\n context,\n identifier,\n reader,\n textDecoder,\n nonce\n}) {\n if (!context.renderMeta || !context.renderMeta.didRenderScripts) {\n return null;\n }\n if (!context.renderMeta.streamCache) {\n context.renderMeta.streamCache = {};\n }\n let { streamCache } = context.renderMeta;\n let promise = streamCache[identifier];\n if (!promise) {\n promise = streamCache[identifier] = reader.read().then((result) => {\n streamCache[identifier].result = {\n done: result.done,\n value: textDecoder.decode(result.value, { stream: true })\n };\n }).catch((e) => {\n streamCache[identifier].error = e;\n });\n }\n if (promise.error) {\n throw promise.error;\n }\n if (promise.result === void 0) {\n throw promise;\n }\n let { done, value } = promise.result;\n let scriptTag = value ? /* @__PURE__ */ React4.createElement(\n \"script\",\n {\n nonce,\n dangerouslySetInnerHTML: {\n __html: `window.__reactRouterContext.streamController.enqueue(${escapeHtml(\n JSON.stringify(value)\n )});`\n }\n }\n ) : null;\n if (done) {\n return /* @__PURE__ */ React4.createElement(React4.Fragment, null, scriptTag, /* @__PURE__ */ React4.createElement(\n \"script\",\n {\n nonce,\n dangerouslySetInnerHTML: {\n __html: `window.__reactRouterContext.streamController.close();`\n }\n }\n ));\n } else {\n return /* @__PURE__ */ React4.createElement(React4.Fragment, null, scriptTag, /* @__PURE__ */ React4.createElement(React4.Suspense, null, /* @__PURE__ */ React4.createElement(\n StreamTransfer,\n {\n context,\n identifier: identifier + 1,\n reader,\n textDecoder,\n nonce\n }\n )));\n }\n}\nfunction getTurboStreamSingleFetchDataStrategy(getRouter, manifest, routeModules, ssr, basename, trailingSlashAware) {\n let dataStrategy = getSingleFetchDataStrategyImpl(\n getRouter,\n (match) => {\n let manifestRoute = manifest.routes[match.route.id];\n invariant2(manifestRoute, \"Route not found in manifest\");\n return {\n hasLoader: manifestRoute.hasLoader,\n hasClientLoader: manifestRoute.hasClientLoader\n };\n },\n fetchAndDecodeViaTurboStream,\n ssr,\n basename,\n trailingSlashAware\n );\n return async (args) => args.runClientMiddleware(dataStrategy);\n}\nfunction getSingleFetchDataStrategyImpl(getRouter, getRouteInfo, fetchAndDecode, ssr, basename, trailingSlashAware, shouldAllowOptOut = () => true) {\n return async (args) => {\n let { request, matches, fetcherKey } = args;\n let router = getRouter();\n if (request.method !== \"GET\") {\n return singleFetchActionStrategy(\n args,\n fetchAndDecode,\n basename,\n trailingSlashAware\n );\n }\n let foundRevalidatingServerLoader = matches.some((m) => {\n let { hasLoader, hasClientLoader } = getRouteInfo(m);\n return m.shouldCallHandler() && hasLoader && !hasClientLoader;\n });\n if (!ssr && !foundRevalidatingServerLoader) {\n return nonSsrStrategy(\n args,\n getRouteInfo,\n fetchAndDecode,\n basename,\n trailingSlashAware\n );\n }\n if (fetcherKey) {\n return singleFetchLoaderFetcherStrategy(\n args,\n fetchAndDecode,\n basename,\n trailingSlashAware\n );\n }\n return singleFetchLoaderNavigationStrategy(\n args,\n router,\n getRouteInfo,\n fetchAndDecode,\n ssr,\n basename,\n trailingSlashAware,\n shouldAllowOptOut\n );\n };\n}\nasync function singleFetchActionStrategy(args, fetchAndDecode, basename, trailingSlashAware) {\n let actionMatch = args.matches.find((m) => m.shouldCallHandler());\n invariant2(actionMatch, \"No action match found\");\n let actionStatus = void 0;\n let result = await actionMatch.resolve(async (handler) => {\n let result2 = await handler(async () => {\n let { data: data2, status } = await fetchAndDecode(\n args,\n basename,\n trailingSlashAware,\n [actionMatch.route.id]\n );\n actionStatus = status;\n return unwrapSingleFetchResult(data2, actionMatch.route.id);\n });\n return result2;\n });\n if (isResponse(result.result) || isRouteErrorResponse(result.result) || isDataWithResponseInit(result.result)) {\n return { [actionMatch.route.id]: result };\n }\n return {\n [actionMatch.route.id]: {\n type: result.type,\n result: data(result.result, actionStatus)\n }\n };\n}\nasync function nonSsrStrategy(args, getRouteInfo, fetchAndDecode, basename, trailingSlashAware) {\n let matchesToLoad = args.matches.filter((m) => m.shouldCallHandler());\n let results = {};\n await Promise.all(\n matchesToLoad.map(\n (m) => m.resolve(async (handler) => {\n try {\n let { hasClientLoader } = getRouteInfo(m);\n let routeId = m.route.id;\n let result = hasClientLoader ? await handler(async () => {\n let { data: data2 } = await fetchAndDecode(\n args,\n basename,\n trailingSlashAware,\n [routeId]\n );\n return unwrapSingleFetchResult(data2, routeId);\n }) : await handler();\n results[m.route.id] = { type: \"data\", result };\n } catch (e) {\n results[m.route.id] = { type: \"error\", result: e };\n }\n })\n )\n );\n return results;\n}\nasync function singleFetchLoaderNavigationStrategy(args, router, getRouteInfo, fetchAndDecode, ssr, basename, trailingSlashAware, shouldAllowOptOut = () => true) {\n let routesParams = /* @__PURE__ */ new Set();\n let foundOptOutRoute = false;\n let routeDfds = args.matches.map(() => createDeferred2());\n let singleFetchDfd = createDeferred2();\n let results = {};\n let resolvePromise = Promise.all(\n args.matches.map(\n async (m, i) => m.resolve(async (handler) => {\n routeDfds[i].resolve();\n let routeId = m.route.id;\n let { hasLoader, hasClientLoader } = getRouteInfo(m);\n let defaultShouldRevalidate = !m.shouldRevalidateArgs || m.shouldRevalidateArgs.actionStatus == null || m.shouldRevalidateArgs.actionStatus < 400;\n let shouldCall = m.shouldCallHandler(defaultShouldRevalidate);\n if (!shouldCall) {\n foundOptOutRoute || (foundOptOutRoute = m.shouldRevalidateArgs != null && // This is a revalidation,\n hasLoader);\n return;\n }\n if (shouldAllowOptOut(m) && hasClientLoader) {\n if (hasLoader) {\n foundOptOutRoute = true;\n }\n try {\n let result = await handler(async () => {\n let { data: data2 } = await fetchAndDecode(\n args,\n basename,\n trailingSlashAware,\n [routeId]\n );\n return unwrapSingleFetchResult(data2, routeId);\n });\n results[routeId] = { type: \"data\", result };\n } catch (e) {\n results[routeId] = { type: \"error\", result: e };\n }\n return;\n }\n if (hasLoader) {\n routesParams.add(routeId);\n }\n try {\n let result = await handler(async () => {\n let data2 = await singleFetchDfd.promise;\n return unwrapSingleFetchResult(data2, routeId);\n });\n results[routeId] = { type: \"data\", result };\n } catch (e) {\n results[routeId] = { type: \"error\", result: e };\n }\n })\n )\n );\n await Promise.all(routeDfds.map((d) => d.promise));\n let isInitialLoad = !router.state.initialized && router.state.navigation.state === \"idle\";\n if ((isInitialLoad || routesParams.size === 0) && !window.__reactRouterHdrActive) {\n singleFetchDfd.resolve({ routes: {} });\n } else {\n let targetRoutes = ssr && foundOptOutRoute && routesParams.size > 0 ? [...routesParams.keys()] : void 0;\n try {\n let data2 = await fetchAndDecode(\n args,\n basename,\n trailingSlashAware,\n targetRoutes\n );\n singleFetchDfd.resolve(data2.data);\n } catch (e) {\n singleFetchDfd.reject(e);\n }\n }\n await resolvePromise;\n await bubbleMiddlewareErrors(\n singleFetchDfd.promise,\n args.matches,\n routesParams,\n results\n );\n return results;\n}\nasync function bubbleMiddlewareErrors(singleFetchPromise, matches, routesParams, results) {\n try {\n let middlewareError;\n let fetchedData = await singleFetchPromise;\n if (\"routes\" in fetchedData) {\n for (let match of matches) {\n if (match.route.id in fetchedData.routes) {\n let routeResult = fetchedData.routes[match.route.id];\n if (\"error\" in routeResult) {\n middlewareError = routeResult.error;\n if (results[match.route.id]?.result == null) {\n results[match.route.id] = {\n type: \"error\",\n result: middlewareError\n };\n }\n break;\n }\n }\n }\n }\n if (middlewareError !== void 0) {\n Array.from(routesParams.values()).forEach((routeId) => {\n if (results[routeId].result instanceof SingleFetchNoResultError) {\n results[routeId].result = middlewareError;\n }\n });\n }\n } catch (e) {\n }\n}\nasync function singleFetchLoaderFetcherStrategy(args, fetchAndDecode, basename, trailingSlashAware) {\n let fetcherMatch = args.matches.find((m) => m.shouldCallHandler());\n invariant2(fetcherMatch, \"No fetcher match found\");\n let routeId = fetcherMatch.route.id;\n let result = await fetcherMatch.resolve(\n async (handler) => handler(async () => {\n let { data: data2 } = await fetchAndDecode(args, basename, trailingSlashAware, [\n routeId\n ]);\n return unwrapSingleFetchResult(data2, routeId);\n })\n );\n return { [fetcherMatch.route.id]: result };\n}\nfunction stripIndexParam(url) {\n let indexValues = url.searchParams.getAll(\"index\");\n url.searchParams.delete(\"index\");\n let indexValuesToKeep = [];\n for (let indexValue of indexValues) {\n if (indexValue) {\n indexValuesToKeep.push(indexValue);\n }\n }\n for (let toKeep of indexValuesToKeep) {\n url.searchParams.append(\"index\", toKeep);\n }\n return url;\n}\nfunction singleFetchUrl(reqUrl, basename, trailingSlashAware, extension) {\n let url = typeof reqUrl === \"string\" ? new URL(\n reqUrl,\n // This can be called during the SSR flow via PrefetchPageLinksImpl so\n // don't assume window is available\n typeof window === \"undefined\" ? \"server://singlefetch/\" : window.location.origin\n ) : reqUrl;\n if (trailingSlashAware) {\n if (url.pathname.endsWith(\"/\")) {\n url.pathname = `${url.pathname}_.${extension}`;\n } else {\n url.pathname = `${url.pathname}.${extension}`;\n }\n } else {\n if (url.pathname === \"/\") {\n url.pathname = `_root.${extension}`;\n } else if (basename && stripBasename(url.pathname, basename) === \"/\") {\n url.pathname = `${removeTrailingSlash(basename)}/_root.${extension}`;\n } else {\n url.pathname = `${removeTrailingSlash(url.pathname)}.${extension}`;\n }\n }\n return url;\n}\nasync function fetchAndDecodeViaTurboStream(args, basename, trailingSlashAware, targetRoutes) {\n let { request } = args;\n let url = singleFetchUrl(request.url, basename, trailingSlashAware, \"data\");\n if (request.method === \"GET\") {\n url = stripIndexParam(url);\n if (targetRoutes) {\n url.searchParams.set(\"_routes\", targetRoutes.join(\",\"));\n }\n }\n let res = await fetch(url, await createRequestInit(request));\n if (res.status >= 400 && !res.headers.has(\"X-Remix-Response\")) {\n throw new ErrorResponseImpl(res.status, res.statusText, await res.text());\n }\n if (res.status === 204 && res.headers.has(\"X-Remix-Redirect\")) {\n return {\n status: SINGLE_FETCH_REDIRECT_STATUS,\n data: {\n redirect: {\n redirect: res.headers.get(\"X-Remix-Redirect\"),\n status: Number(res.headers.get(\"X-Remix-Status\") || \"302\"),\n revalidate: res.headers.get(\"X-Remix-Revalidate\") === \"true\",\n reload: res.headers.get(\"X-Remix-Reload-Document\") === \"true\",\n replace: res.headers.get(\"X-Remix-Replace\") === \"true\"\n }\n }\n };\n }\n if (NO_BODY_STATUS_CODES.has(res.status)) {\n let routes = {};\n if (targetRoutes && request.method !== \"GET\") {\n routes[targetRoutes[0]] = { data: void 0 };\n }\n return {\n status: res.status,\n data: { routes }\n };\n }\n invariant2(res.body, \"No response body to decode\");\n try {\n let decoded = await decodeViaTurboStream(res.body, window);\n let data2;\n if (request.method === \"GET\") {\n let typed = decoded.value;\n if (SingleFetchRedirectSymbol in typed) {\n data2 = { redirect: typed[SingleFetchRedirectSymbol] };\n } else {\n data2 = { routes: typed };\n }\n } else {\n let typed = decoded.value;\n let routeId = targetRoutes?.[0];\n invariant2(routeId, \"No routeId found for single fetch call decoding\");\n if (\"redirect\" in typed) {\n data2 = { redirect: typed };\n } else {\n data2 = { routes: { [routeId]: typed } };\n }\n }\n return { status: res.status, data: data2 };\n } catch (e) {\n throw new Error(\"Unable to decode turbo-stream response\");\n }\n}\nfunction decodeViaTurboStream(body, global) {\n return decode(body, {\n plugins: [\n (type, ...rest) => {\n if (type === \"SanitizedError\") {\n let [name, message, stack] = rest;\n let Constructor = Error;\n if (name && SUPPORTED_ERROR_TYPES.includes(name) && name in global && // @ts-expect-error\n typeof global[name] === \"function\") {\n Constructor = global[name];\n }\n let error = new Constructor(message);\n error.stack = stack;\n return { value: error };\n }\n if (type === \"ErrorResponse\") {\n let [data2, status, statusText] = rest;\n return {\n value: new ErrorResponseImpl(status, statusText, data2)\n };\n }\n if (type === \"SingleFetchRedirect\") {\n return { value: { [SingleFetchRedirectSymbol]: rest[0] } };\n }\n if (type === \"SingleFetchClassInstance\") {\n return { value: rest[0] };\n }\n if (type === \"SingleFetchFallback\") {\n return { value: void 0 };\n }\n }\n ]\n });\n}\nfunction unwrapSingleFetchResult(result, routeId) {\n if (\"redirect\" in result) {\n let {\n redirect: location,\n revalidate,\n reload,\n replace: replace2,\n status\n } = result.redirect;\n throw redirect(location, {\n status,\n headers: {\n // Three R's of redirecting (lol Veep)\n ...revalidate ? { \"X-Remix-Revalidate\": \"yes\" } : null,\n ...reload ? { \"X-Remix-Reload-Document\": \"yes\" } : null,\n ...replace2 ? { \"X-Remix-Replace\": \"yes\" } : null\n }\n });\n }\n let routeResult = result.routes[routeId];\n if (routeResult == null) {\n throw new SingleFetchNoResultError(\n `No result found for routeId \"${routeId}\"`\n );\n } else if (\"error\" in routeResult) {\n throw routeResult.error;\n } else if (\"data\" in routeResult) {\n return routeResult.data;\n } else {\n throw new Error(`Invalid response found for routeId \"${routeId}\"`);\n }\n}\nfunction createDeferred2() {\n let resolve;\n let reject;\n let promise = new Promise((res, rej) => {\n resolve = async (val) => {\n res(val);\n try {\n await promise;\n } catch (e) {\n }\n };\n reject = async (error) => {\n rej(error);\n try {\n await promise;\n } catch (e) {\n }\n };\n });\n return {\n promise,\n //@ts-ignore\n resolve,\n //@ts-ignore\n reject\n };\n}\n\n// lib/dom/ssr/errorBoundaries.tsx\nimport * as React9 from \"react\";\n\n// lib/dom/ssr/components.tsx\nimport * as React8 from \"react\";\n\n// lib/dom/ssr/routeModules.ts\nasync function loadRouteModule(route, routeModulesCache) {\n if (route.id in routeModulesCache) {\n return routeModulesCache[route.id];\n }\n try {\n let routeModule = await import(\n /* @vite-ignore */\n /* webpackIgnore: true */\n route.module\n );\n routeModulesCache[route.id] = routeModule;\n return routeModule;\n } catch (error) {\n console.error(\n `Error loading route module \\`${route.module}\\`, reloading page...`\n );\n console.error(error);\n if (window.__reactRouterContext && window.__reactRouterContext.isSpaMode && // @ts-expect-error\n import.meta.hot) {\n throw error;\n }\n window.location.reload();\n return new Promise(() => {\n });\n }\n}\n\n// lib/dom/ssr/links.ts\nfunction getKeyedLinksForMatches(matches, routeModules, manifest) {\n let descriptors = matches.map((match) => {\n let module = routeModules[match.route.id];\n let route = manifest.routes[match.route.id];\n return [\n route && route.css ? route.css.map((href) => ({ rel: \"stylesheet\", href })) : [],\n module?.links?.() || []\n ];\n }).flat(2);\n let preloads = getModuleLinkHrefs(matches, manifest);\n return dedupeLinkDescriptors(descriptors, preloads);\n}\nfunction getRouteCssDescriptors(route) {\n if (!route.css) return [];\n return route.css.map((href) => ({ rel: \"stylesheet\", href }));\n}\nasync function prefetchRouteCss(route) {\n if (!route.css) return;\n let descriptors = getRouteCssDescriptors(route);\n await Promise.all(descriptors.map(prefetchStyleLink));\n}\nasync function prefetchStyleLinks(route, routeModule) {\n if (!route.css && !routeModule.links || !isPreloadSupported()) return;\n let descriptors = [];\n if (route.css) {\n descriptors.push(...getRouteCssDescriptors(route));\n }\n if (routeModule.links) {\n descriptors.push(...routeModule.links());\n }\n if (descriptors.length === 0) return;\n let styleLinks = [];\n for (let descriptor of descriptors) {\n if (!isPageLinkDescriptor(descriptor) && descriptor.rel === \"stylesheet\") {\n styleLinks.push({\n ...descriptor,\n rel: \"preload\",\n as: \"style\"\n });\n }\n }\n await Promise.all(styleLinks.map(prefetchStyleLink));\n}\nasync function prefetchStyleLink(descriptor) {\n return new Promise((resolve) => {\n if (descriptor.media && !window.matchMedia(descriptor.media).matches || document.querySelector(\n `link[rel=\"stylesheet\"][href=\"${descriptor.href}\"]`\n )) {\n return resolve();\n }\n let link = document.createElement(\"link\");\n Object.assign(link, descriptor);\n function removeLink() {\n if (document.head.contains(link)) {\n document.head.removeChild(link);\n }\n }\n link.onload = () => {\n removeLink();\n resolve();\n };\n link.onerror = () => {\n removeLink();\n resolve();\n };\n document.head.appendChild(link);\n });\n}\nfunction isPageLinkDescriptor(object) {\n return object != null && typeof object.page === \"string\";\n}\nfunction isHtmlLinkDescriptor(object) {\n if (object == null) {\n return false;\n }\n if (object.href == null) {\n return object.rel === \"preload\" && typeof object.imageSrcSet === \"string\" && typeof object.imageSizes === \"string\";\n }\n return typeof object.rel === \"string\" && typeof object.href === \"string\";\n}\nasync function getKeyedPrefetchLinks(matches, manifest, routeModules) {\n let links = await Promise.all(\n matches.map(async (match) => {\n let route = manifest.routes[match.route.id];\n if (route) {\n let mod = await loadRouteModule(route, routeModules);\n return mod.links ? mod.links() : [];\n }\n return [];\n })\n );\n return dedupeLinkDescriptors(\n links.flat(1).filter(isHtmlLinkDescriptor).filter((link) => link.rel === \"stylesheet\" || link.rel === \"preload\").map(\n (link) => link.rel === \"stylesheet\" ? { ...link, rel: \"prefetch\", as: \"style\" } : { ...link, rel: \"prefetch\" }\n )\n );\n}\nfunction getNewMatchesForLinks(page, nextMatches, currentMatches, manifest, location, mode) {\n let isNew = (match, index) => {\n if (!currentMatches[index]) return true;\n return match.route.id !== currentMatches[index].route.id;\n };\n let matchPathChanged = (match, index) => {\n return (\n // param change, /users/123 -> /users/456\n currentMatches[index].pathname !== match.pathname || // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n currentMatches[index].route.path?.endsWith(\"*\") && currentMatches[index].params[\"*\"] !== match.params[\"*\"]\n );\n };\n if (mode === \"assets\") {\n return nextMatches.filter(\n (match, index) => isNew(match, index) || matchPathChanged(match, index)\n );\n }\n if (mode === \"data\") {\n return nextMatches.filter((match, index) => {\n let manifestRoute = manifest.routes[match.route.id];\n if (!manifestRoute || !manifestRoute.hasLoader) {\n return false;\n }\n if (isNew(match, index) || matchPathChanged(match, index)) {\n return true;\n }\n if (match.route.shouldRevalidate) {\n let routeChoice = match.route.shouldRevalidate({\n currentUrl: new URL(\n location.pathname + location.search + location.hash,\n window.origin\n ),\n currentParams: currentMatches[0]?.params || {},\n nextUrl: new URL(page, window.origin),\n nextParams: match.params,\n defaultShouldRevalidate: true\n });\n if (typeof routeChoice === \"boolean\") {\n return routeChoice;\n }\n }\n return true;\n });\n }\n return [];\n}\nfunction getModuleLinkHrefs(matches, manifest, { includeHydrateFallback } = {}) {\n return dedupeHrefs(\n matches.map((match) => {\n let route = manifest.routes[match.route.id];\n if (!route) return [];\n let hrefs = [route.module];\n if (route.clientActionModule) {\n hrefs = hrefs.concat(route.clientActionModule);\n }\n if (route.clientLoaderModule) {\n hrefs = hrefs.concat(route.clientLoaderModule);\n }\n if (includeHydrateFallback && route.hydrateFallbackModule) {\n hrefs = hrefs.concat(route.hydrateFallbackModule);\n }\n if (route.imports) {\n hrefs = hrefs.concat(route.imports);\n }\n return hrefs;\n }).flat(1)\n );\n}\nfunction dedupeHrefs(hrefs) {\n return [...new Set(hrefs)];\n}\nfunction sortKeys(obj) {\n let sorted = {};\n let keys = Object.keys(obj).sort();\n for (let key of keys) {\n sorted[key] = obj[key];\n }\n return sorted;\n}\nfunction dedupeLinkDescriptors(descriptors, preloads) {\n let set = /* @__PURE__ */ new Set();\n let preloadsSet = new Set(preloads);\n return descriptors.reduce((deduped, descriptor) => {\n let alreadyModulePreload = preloads && !isPageLinkDescriptor(descriptor) && descriptor.as === \"script\" && descriptor.href && preloadsSet.has(descriptor.href);\n if (alreadyModulePreload) {\n return deduped;\n }\n let key = JSON.stringify(sortKeys(descriptor));\n if (!set.has(key)) {\n set.add(key);\n deduped.push({ key, link: descriptor });\n }\n return deduped;\n }, []);\n}\nvar _isPreloadSupported;\nfunction isPreloadSupported() {\n if (_isPreloadSupported !== void 0) {\n return _isPreloadSupported;\n }\n let el = document.createElement(\"link\");\n _isPreloadSupported = el.relList.supports(\"preload\");\n el = null;\n return _isPreloadSupported;\n}\n\n// lib/dom/ssr/fog-of-war.ts\nimport * as React7 from \"react\";\n\n// lib/dom/ssr/routes.tsx\nimport * as React6 from \"react\";\n\n// lib/dom/ssr/fallback.tsx\nimport * as React5 from \"react\";\nfunction RemixRootDefaultHydrateFallback() {\n let { nonce } = useFrameworkContext();\n return /* @__PURE__ */ React5.createElement(BoundaryShell, { title: \"Loading...\", renderScripts: true }, ENABLE_DEV_WARNINGS ? /* @__PURE__ */ React5.createElement(\n \"script\",\n {\n nonce,\n dangerouslySetInnerHTML: {\n __html: `\n console.log(\n \"\\u{1F4BF} Hey developer \\u{1F44B}. You can provide a way better UX than this \" +\n \"when your app is loading JS modules and/or running \\`clientLoader\\` \" +\n \"functions. Check out https://reactrouter.com/start/framework/route-module#hydratefallback \" +\n \"for more information.\"\n );\n `\n }\n }\n ) : null);\n}\n\n// lib/dom/ssr/routes.tsx\nfunction groupRoutesByParentId(manifest) {\n let routes = {};\n Object.values(manifest).forEach((route) => {\n if (route) {\n let parentId = route.parentId || \"\";\n if (!routes[parentId]) {\n routes[parentId] = [];\n }\n routes[parentId].push(route);\n }\n });\n return routes;\n}\nfunction getRouteComponents(route, routeModule, isSpaMode) {\n let Component4 = getRouteModuleComponent(routeModule);\n let HydrateFallback = routeModule.HydrateFallback && (!isSpaMode || route.id === \"root\") ? routeModule.HydrateFallback : route.id === \"root\" ? RemixRootDefaultHydrateFallback : void 0;\n let ErrorBoundary = routeModule.ErrorBoundary ? routeModule.ErrorBoundary : route.id === \"root\" ? () => /* @__PURE__ */ React6.createElement(RemixRootDefaultErrorBoundary, { error: useRouteError() }) : void 0;\n if (route.id === \"root\" && routeModule.Layout) {\n return {\n ...Component4 ? {\n element: /* @__PURE__ */ React6.createElement(routeModule.Layout, null, /* @__PURE__ */ React6.createElement(Component4, null))\n } : { Component: Component4 },\n ...ErrorBoundary ? {\n errorElement: /* @__PURE__ */ React6.createElement(routeModule.Layout, null, /* @__PURE__ */ React6.createElement(ErrorBoundary, null))\n } : { ErrorBoundary },\n ...HydrateFallback ? {\n hydrateFallbackElement: /* @__PURE__ */ React6.createElement(routeModule.Layout, null, /* @__PURE__ */ React6.createElement(HydrateFallback, null))\n } : { HydrateFallback }\n };\n }\n return { Component: Component4, ErrorBoundary, HydrateFallback };\n}\nfunction createServerRoutes(manifest, routeModules, future, isSpaMode, parentId = \"\", routesByParentId = groupRoutesByParentId(manifest), spaModeLazyPromise = Promise.resolve({ Component: () => null })) {\n return (routesByParentId[parentId] || []).map((route) => {\n let routeModule = routeModules[route.id];\n invariant2(\n routeModule,\n \"No `routeModule` available to create server routes\"\n );\n let dataRoute = {\n ...getRouteComponents(route, routeModule, isSpaMode),\n caseSensitive: route.caseSensitive,\n id: route.id,\n index: route.index,\n path: route.path,\n handle: routeModule.handle,\n // For SPA Mode, all routes are lazy except root. However we tell the\n // router root is also lazy here too since we don't need a full\n // implementation - we just need a `lazy` prop to tell the RR rendering\n // where to stop which is always at the root route in SPA mode\n lazy: isSpaMode ? () => spaModeLazyPromise : void 0,\n // For partial hydration rendering, we need to indicate when the route\n // has a loader/clientLoader, but it won't ever be called during the static\n // render, so just give it a no-op function so we can render down to the\n // proper fallback\n loader: route.hasLoader || route.hasClientLoader ? () => null : void 0\n // We don't need middleware/action/shouldRevalidate on these routes since\n // they're for a static render\n };\n let children = createServerRoutes(\n manifest,\n routeModules,\n future,\n isSpaMode,\n route.id,\n routesByParentId,\n spaModeLazyPromise\n );\n if (children.length > 0) dataRoute.children = children;\n return dataRoute;\n });\n}\nfunction createClientRoutesWithHMRRevalidationOptOut(needsRevalidation, manifest, routeModulesCache, initialState, ssr, isSpaMode) {\n return createClientRoutes(\n manifest,\n routeModulesCache,\n initialState,\n ssr,\n isSpaMode,\n \"\",\n groupRoutesByParentId(manifest),\n needsRevalidation\n );\n}\nfunction preventInvalidServerHandlerCall(type, route) {\n if (type === \"loader\" && !route.hasLoader || type === \"action\" && !route.hasAction) {\n let fn = type === \"action\" ? \"serverAction()\" : \"serverLoader()\";\n let msg = `You are trying to call ${fn} on a route that does not have a server ${type} (routeId: \"${route.id}\")`;\n console.error(msg);\n throw new ErrorResponseImpl(400, \"Bad Request\", new Error(msg), true);\n }\n}\nfunction noActionDefinedError(type, routeId) {\n let article = type === \"clientAction\" ? \"a\" : \"an\";\n let msg = `Route \"${routeId}\" does not have ${article} ${type}, but you are trying to submit to it. To fix this, please add ${article} \\`${type}\\` function to the route`;\n console.error(msg);\n throw new ErrorResponseImpl(405, \"Method Not Allowed\", new Error(msg), true);\n}\nfunction createClientRoutes(manifest, routeModulesCache, initialState, ssr, isSpaMode, parentId = \"\", routesByParentId = groupRoutesByParentId(manifest), needsRevalidation) {\n return (routesByParentId[parentId] || []).map((route) => {\n let routeModule = routeModulesCache[route.id];\n function fetchServerHandler(singleFetch) {\n invariant2(\n typeof singleFetch === \"function\",\n \"No single fetch function available for route handler\"\n );\n return singleFetch();\n }\n function fetchServerLoader(singleFetch) {\n if (!route.hasLoader) return Promise.resolve(null);\n return fetchServerHandler(singleFetch);\n }\n function fetchServerAction(singleFetch) {\n if (!route.hasAction) {\n throw noActionDefinedError(\"action\", route.id);\n }\n return fetchServerHandler(singleFetch);\n }\n function prefetchModule(modulePath) {\n import(\n /* @vite-ignore */\n /* webpackIgnore: true */\n modulePath\n );\n }\n function prefetchRouteModuleChunks(route2) {\n if (route2.clientActionModule) {\n prefetchModule(route2.clientActionModule);\n }\n if (route2.clientLoaderModule) {\n prefetchModule(route2.clientLoaderModule);\n }\n }\n async function prefetchStylesAndCallHandler(handler) {\n let cachedModule = routeModulesCache[route.id];\n let linkPrefetchPromise = cachedModule ? prefetchStyleLinks(route, cachedModule) : Promise.resolve();\n try {\n return handler();\n } finally {\n await linkPrefetchPromise;\n }\n }\n let dataRoute = {\n id: route.id,\n index: route.index,\n path: route.path\n };\n if (routeModule) {\n Object.assign(dataRoute, {\n ...dataRoute,\n ...getRouteComponents(route, routeModule, isSpaMode),\n middleware: routeModule.clientMiddleware,\n handle: routeModule.handle,\n shouldRevalidate: getShouldRevalidateFunction(\n dataRoute.path,\n routeModule,\n route,\n ssr,\n needsRevalidation\n )\n });\n let hasInitialData = initialState && initialState.loaderData && route.id in initialState.loaderData;\n let initialData = hasInitialData ? initialState?.loaderData?.[route.id] : void 0;\n let hasInitialError = initialState && initialState.errors && route.id in initialState.errors;\n let initialError = hasInitialError ? initialState?.errors?.[route.id] : void 0;\n let isHydrationRequest = needsRevalidation == null && (routeModule.clientLoader?.hydrate === true || !route.hasLoader);\n dataRoute.loader = async ({ request, params, context, pattern, url }, singleFetch) => {\n let _isHydrationRequest = isHydrationRequest;\n isHydrationRequest = false;\n let result = await prefetchStylesAndCallHandler(async () => {\n invariant2(\n routeModule,\n \"No `routeModule` available for critical-route loader\"\n );\n if (!routeModule.clientLoader) {\n return fetchServerLoader(singleFetch);\n }\n return routeModule.clientLoader({\n request,\n params,\n context,\n pattern,\n url,\n async serverLoader() {\n preventInvalidServerHandlerCall(\"loader\", route);\n if (_isHydrationRequest) {\n if (hasInitialData) {\n return initialData;\n }\n if (hasInitialError) {\n throw initialError;\n }\n }\n return fetchServerLoader(singleFetch);\n }\n });\n });\n return result;\n };\n dataRoute.loader.hydrate = shouldHydrateRouteLoader(\n route.id,\n routeModule.clientLoader,\n route.hasLoader,\n isSpaMode\n );\n dataRoute.action = ({ request, params, context, pattern, url }, singleFetch) => {\n return prefetchStylesAndCallHandler(async () => {\n invariant2(\n routeModule,\n \"No `routeModule` available for critical-route action\"\n );\n if (!routeModule.clientAction) {\n if (isSpaMode) {\n throw noActionDefinedError(\"clientAction\", route.id);\n }\n return fetchServerAction(singleFetch);\n }\n return routeModule.clientAction({\n request,\n params,\n context,\n pattern,\n url,\n async serverAction() {\n preventInvalidServerHandlerCall(\"action\", route);\n return fetchServerAction(singleFetch);\n }\n });\n });\n };\n } else {\n if (!route.hasClientLoader) {\n dataRoute.loader = (_, singleFetch) => prefetchStylesAndCallHandler(() => {\n return fetchServerLoader(singleFetch);\n });\n }\n if (!route.hasClientAction) {\n dataRoute.action = (_, singleFetch) => prefetchStylesAndCallHandler(() => {\n if (isSpaMode) {\n throw noActionDefinedError(\"clientAction\", route.id);\n }\n return fetchServerAction(singleFetch);\n });\n }\n let lazyRoutePromise;\n async function getLazyRoute() {\n if (lazyRoutePromise) {\n return await lazyRoutePromise;\n }\n lazyRoutePromise = (async () => {\n if (route.clientLoaderModule || route.clientActionModule) {\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n let routeModulePromise = loadRouteModuleWithBlockingLinks(\n route,\n routeModulesCache\n );\n prefetchRouteModuleChunks(route);\n return await routeModulePromise;\n })();\n return await lazyRoutePromise;\n }\n dataRoute.lazy = {\n loader: route.hasClientLoader ? async () => {\n let { clientLoader } = route.clientLoaderModule ? await import(\n /* @vite-ignore */\n /* webpackIgnore: true */\n route.clientLoaderModule\n ) : await getLazyRoute();\n invariant2(clientLoader, \"No `clientLoader` export found\");\n return (args, singleFetch) => clientLoader({\n ...args,\n async serverLoader() {\n preventInvalidServerHandlerCall(\"loader\", route);\n return fetchServerLoader(singleFetch);\n }\n });\n } : void 0,\n action: route.hasClientAction ? async () => {\n let clientActionPromise = route.clientActionModule ? import(\n /* @vite-ignore */\n /* webpackIgnore: true */\n route.clientActionModule\n ) : getLazyRoute();\n prefetchRouteModuleChunks(route);\n let { clientAction } = await clientActionPromise;\n invariant2(clientAction, \"No `clientAction` export found\");\n return (args, singleFetch) => clientAction({\n ...args,\n async serverAction() {\n preventInvalidServerHandlerCall(\"action\", route);\n return fetchServerAction(singleFetch);\n }\n });\n } : void 0,\n middleware: route.hasClientMiddleware ? async () => {\n let { clientMiddleware } = route.clientMiddlewareModule ? await import(\n /* @vite-ignore */\n /* webpackIgnore: true */\n route.clientMiddlewareModule\n ) : await getLazyRoute();\n invariant2(clientMiddleware, \"No `clientMiddleware` export found\");\n return clientMiddleware;\n } : void 0,\n shouldRevalidate: async () => {\n let lazyRoute = await getLazyRoute();\n return getShouldRevalidateFunction(\n dataRoute.path,\n lazyRoute,\n route,\n ssr,\n needsRevalidation\n );\n },\n handle: async () => (await getLazyRoute()).handle,\n // No need to wrap these in layout since the root route is never\n // loaded via route.lazy()\n Component: async () => (await getLazyRoute()).Component,\n ErrorBoundary: route.hasErrorBoundary ? async () => (await getLazyRoute()).ErrorBoundary : void 0\n };\n }\n let children = createClientRoutes(\n manifest,\n routeModulesCache,\n initialState,\n ssr,\n isSpaMode,\n route.id,\n routesByParentId,\n needsRevalidation\n );\n if (children.length > 0) dataRoute.children = children;\n return dataRoute;\n });\n}\nfunction getShouldRevalidateFunction(path, route, manifestRoute, ssr, needsRevalidation) {\n if (needsRevalidation) {\n return wrapShouldRevalidateForHdr(\n manifestRoute.id,\n route.shouldRevalidate,\n needsRevalidation\n );\n }\n if (!ssr && manifestRoute.hasLoader && !manifestRoute.hasClientLoader) {\n let myParams = path ? compilePath(path)[1].map((p) => p.paramName) : [];\n const didParamsChange = (opts) => myParams.some((p) => opts.currentParams[p] !== opts.nextParams[p]);\n if (route.shouldRevalidate) {\n let fn = route.shouldRevalidate;\n return (opts) => fn({\n ...opts,\n defaultShouldRevalidate: didParamsChange(opts)\n });\n } else {\n return (opts) => didParamsChange(opts);\n }\n }\n return route.shouldRevalidate;\n}\nfunction wrapShouldRevalidateForHdr(routeId, routeShouldRevalidate, needsRevalidation) {\n let handledRevalidation = false;\n return (arg) => {\n if (!handledRevalidation) {\n handledRevalidation = true;\n return needsRevalidation.has(routeId);\n }\n return routeShouldRevalidate ? routeShouldRevalidate(arg) : arg.defaultShouldRevalidate;\n };\n}\nasync function loadRouteModuleWithBlockingLinks(route, routeModules) {\n let routeModulePromise = loadRouteModule(route, routeModules);\n let prefetchRouteCssPromise = prefetchRouteCss(route);\n let routeModule = await routeModulePromise;\n await Promise.all([\n prefetchRouteCssPromise,\n prefetchStyleLinks(route, routeModule)\n ]);\n return {\n Component: getRouteModuleComponent(routeModule),\n ErrorBoundary: routeModule.ErrorBoundary,\n clientMiddleware: routeModule.clientMiddleware,\n clientAction: routeModule.clientAction,\n clientLoader: routeModule.clientLoader,\n handle: routeModule.handle,\n links: routeModule.links,\n meta: routeModule.meta,\n shouldRevalidate: routeModule.shouldRevalidate\n };\n}\nfunction getRouteModuleComponent(routeModule) {\n if (routeModule.default == null) return void 0;\n let isEmptyObject = typeof routeModule.default === \"object\" && Object.keys(routeModule.default).length === 0;\n if (!isEmptyObject) {\n return routeModule.default;\n }\n}\nfunction shouldHydrateRouteLoader(routeId, clientLoader, hasLoader, isSpaMode) {\n return isSpaMode && routeId !== \"root\" || clientLoader != null && (clientLoader.hydrate === true || hasLoader !== true);\n}\n\n// lib/dom/ssr/fog-of-war.ts\nvar nextPaths = /* @__PURE__ */ new Set();\nvar discoveredPathsMaxSize = 1e3;\nvar discoveredPaths = /* @__PURE__ */ new Set();\nvar URL_LIMIT = 7680;\nfunction getPathsWithAncestors(paths) {\n let result = /* @__PURE__ */ new Set();\n paths.forEach((path) => {\n if (!path.startsWith(\"/\")) {\n path = `/${path}`;\n }\n for (let i = 1; i < path.length; i++) {\n if (path[i] === \"/\") {\n result.add(path.slice(0, i));\n }\n }\n result.add(path);\n });\n return Array.from(result);\n}\nfunction isFogOfWarEnabled(routeDiscovery, ssr) {\n return routeDiscovery.mode === \"lazy\" && ssr === true;\n}\nfunction getPartialManifest({ sri, ...manifest }, router) {\n let routeIds = new Set(router.state.matches.map((m) => m.route.id));\n let segments = router.state.location.pathname.split(\"/\").filter(Boolean);\n let paths = [\"/\"];\n segments.pop();\n while (segments.length > 0) {\n paths.push(`/${segments.join(\"/\")}`);\n segments.pop();\n }\n paths.forEach((path) => {\n let matches = matchRoutesImpl(\n router.routes,\n path,\n router.basename || \"/\",\n false,\n router.branches\n );\n if (matches) {\n matches.forEach((m) => routeIds.add(m.route.id));\n }\n });\n let initialRoutes = [...routeIds].reduce(\n (acc, id) => Object.assign(acc, { [id]: manifest.routes[id] }),\n {}\n );\n return {\n ...manifest,\n routes: initialRoutes,\n sri: sri ? true : void 0\n };\n}\nfunction getPatchRoutesOnNavigationFunction(getRouter, manifest, routeModules, ssr, routeDiscovery, isSpaMode, basename) {\n if (!isFogOfWarEnabled(routeDiscovery, ssr)) {\n return void 0;\n }\n return async ({ path, patch, signal, fetcherKey }) => {\n if (discoveredPaths.has(path)) {\n return;\n }\n let { state } = getRouter();\n await fetchAndApplyManifestPatches(\n [path],\n // If we're patching for a fetcher call, reload the current location\n // Otherwise prefer any ongoing navigation location\n fetcherKey ? window.location.href : createPath(state.navigation.location || state.location),\n manifest,\n routeModules,\n ssr,\n isSpaMode,\n basename,\n routeDiscovery.manifestPath,\n patch,\n signal\n );\n };\n}\nfunction useFogOFWarDiscovery(router, manifest, routeModules, ssr, routeDiscovery, isSpaMode) {\n React7.useEffect(() => {\n if (!isFogOfWarEnabled(routeDiscovery, ssr) || // @ts-expect-error - TS doesn't know about this yet\n window.navigator?.connection?.saveData === true) {\n return;\n }\n function registerElement(el) {\n let path = el.tagName === \"FORM\" ? el.getAttribute(\"action\") : el.getAttribute(\"href\");\n if (!path) {\n return;\n }\n let pathname = el.tagName === \"A\" ? el.pathname : new URL(path, window.location.origin).pathname;\n if (!discoveredPaths.has(pathname)) {\n nextPaths.add(pathname);\n }\n }\n async function fetchPatches() {\n document.querySelectorAll(\"a[data-discover], form[data-discover]\").forEach(registerElement);\n let lazyPaths = Array.from(nextPaths.keys()).filter((path) => {\n if (discoveredPaths.has(path)) {\n nextPaths.delete(path);\n return false;\n }\n return true;\n });\n if (lazyPaths.length === 0) {\n return;\n }\n try {\n await fetchAndApplyManifestPatches(\n lazyPaths,\n null,\n manifest,\n routeModules,\n ssr,\n isSpaMode,\n router.basename,\n routeDiscovery.manifestPath,\n router.patchRoutes\n );\n } catch (e) {\n console.error(\"Failed to fetch manifest patches\", e);\n }\n }\n let debouncedFetchPatches = debounce(fetchPatches, 100);\n fetchPatches();\n let observer = new MutationObserver(() => debouncedFetchPatches());\n observer.observe(document.documentElement, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: [\"data-discover\", \"href\", \"action\"]\n });\n return () => observer.disconnect();\n }, [ssr, isSpaMode, manifest, routeModules, router, routeDiscovery]);\n}\nfunction getManifestPath(_manifestPath, basename) {\n let manifestPath = _manifestPath || \"/__manifest\";\n return basename == null ? manifestPath : joinPaths([basename, manifestPath]);\n}\nvar MANIFEST_VERSION_STORAGE_KEY = \"react-router-manifest-version\";\nasync function fetchAndApplyManifestPatches(paths, errorReloadPath, manifest, routeModules, ssr, isSpaMode, basename, manifestPath, patchRoutes, signal) {\n paths = getPathsWithAncestors(paths);\n const searchParams = new URLSearchParams();\n searchParams.set(\"paths\", paths.sort().join(\",\"));\n searchParams.set(\"version\", manifest.version);\n let url = new URL(\n getManifestPath(manifestPath, basename),\n window.location.origin\n );\n url.search = searchParams.toString();\n if (url.toString().length > URL_LIMIT) {\n nextPaths.clear();\n return;\n }\n let serverPatches;\n try {\n let res = await fetch(url, { signal });\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}`);\n } else if (res.status === 204 && res.headers.has(\"X-Remix-Reload-Document\")) {\n if (!errorReloadPath) {\n console.warn(\n \"Detected a manifest version mismatch during eager route discovery. The next navigation/fetch to an undiscovered route will result in a new document navigation to sync up with the latest manifest.\"\n );\n return;\n }\n try {\n if (sessionStorage.getItem(MANIFEST_VERSION_STORAGE_KEY) === manifest.version) {\n console.error(\n \"Unable to discover routes due to manifest version mismatch.\"\n );\n return;\n }\n sessionStorage.setItem(MANIFEST_VERSION_STORAGE_KEY, manifest.version);\n } catch {\n }\n window.location.href = errorReloadPath;\n console.warn(\"Detected manifest version mismatch, reloading...\");\n await new Promise(() => {\n });\n } else if (res.status >= 400) {\n throw new Error(await res.text());\n }\n try {\n sessionStorage.removeItem(MANIFEST_VERSION_STORAGE_KEY);\n } catch {\n }\n serverPatches = await res.json();\n } catch (e) {\n if (signal?.aborted) return;\n throw e;\n }\n let knownRoutes = new Set(Object.keys(manifest.routes));\n let patches = Object.values(serverPatches).reduce((acc, route) => {\n if (route && !knownRoutes.has(route.id)) {\n acc[route.id] = route;\n }\n return acc;\n }, {});\n Object.assign(manifest.routes, patches);\n paths.forEach((p) => addToFifoQueue(p, discoveredPaths));\n let parentIds = /* @__PURE__ */ new Set();\n Object.values(patches).forEach((patch) => {\n if (patch && (!patch.parentId || !patches[patch.parentId])) {\n parentIds.add(patch.parentId);\n }\n });\n parentIds.forEach(\n (parentId) => patchRoutes(\n parentId || null,\n createClientRoutes(patches, routeModules, null, ssr, isSpaMode, parentId)\n )\n );\n}\nfunction addToFifoQueue(path, queue) {\n if (queue.size >= discoveredPathsMaxSize) {\n let first = queue.values().next().value;\n queue.delete(first);\n }\n queue.add(path);\n}\nfunction debounce(callback, wait) {\n let timeoutId;\n return (...args) => {\n window.clearTimeout(timeoutId);\n timeoutId = window.setTimeout(() => callback(...args), wait);\n };\n}\n\n// lib/dom/ssr/components.tsx\nfunction useDataRouterContext2() {\n let context = React8.useContext(DataRouterContext);\n invariant2(\n context,\n \"You must render this element inside a <DataRouterContext.Provider> element\"\n );\n return context;\n}\nfunction useDataRouterStateContext() {\n let context = React8.useContext(DataRouterStateContext);\n invariant2(\n context,\n \"You must render this element inside a <DataRouterStateContext.Provider> element\"\n );\n return context;\n}\nvar FrameworkContext = React8.createContext(void 0);\nFrameworkContext.displayName = \"FrameworkContext\";\nfunction useFrameworkContext() {\n let context = React8.useContext(FrameworkContext);\n invariant2(\n context,\n \"You must render this element inside a <HydratedRouter> element\"\n );\n return context;\n}\nfunction usePrefetchBehavior(prefetch, theirElementProps) {\n let frameworkContext = React8.useContext(FrameworkContext);\n let [maybePrefetch, setMaybePrefetch] = React8.useState(false);\n let [shouldPrefetch, setShouldPrefetch] = React8.useState(false);\n let { onFocus, onBlur, onMouseEnter, onMouseLeave, onTouchStart } = theirElementProps;\n let ref = React8.useRef(null);\n React8.useEffect(() => {\n if (prefetch === \"render\") {\n setShouldPrefetch(true);\n }\n if (prefetch === \"viewport\") {\n let callback = (entries) => {\n entries.forEach((entry) => {\n setShouldPrefetch(entry.isIntersecting);\n });\n };\n let observer = new IntersectionObserver(callback, { threshold: 0.5 });\n if (ref.current) observer.observe(ref.current);\n return () => {\n observer.disconnect();\n };\n }\n }, [prefetch]);\n React8.useEffect(() => {\n if (maybePrefetch) {\n let id = setTimeout(() => {\n setShouldPrefetch(true);\n }, 100);\n return () => {\n clearTimeout(id);\n };\n }\n }, [maybePrefetch]);\n let setIntent = () => {\n setMaybePrefetch(true);\n };\n let cancelIntent = () => {\n setMaybePrefetch(false);\n setShouldPrefetch(false);\n };\n if (!frameworkContext) {\n return [false, ref, {}];\n }\n if (prefetch !== \"intent\") {\n return [shouldPrefetch, ref, {}];\n }\n return [\n shouldPrefetch,\n ref,\n {\n onFocus: composeEventHandlers(onFocus, setIntent),\n onBlur: composeEventHandlers(onBlur, cancelIntent),\n onMouseEnter: composeEventHandlers(onMouseEnter, setIntent),\n onMouseLeave: composeEventHandlers(onMouseLeave, cancelIntent),\n onTouchStart: composeEventHandlers(onTouchStart, setIntent)\n }\n ];\n}\nfunction composeEventHandlers(theirHandler, ourHandler) {\n return (event) => {\n theirHandler && theirHandler(event);\n if (!event.defaultPrevented) {\n ourHandler(event);\n }\n };\n}\nfunction getActiveMatches(matches, errors, isSpaMode) {\n if (isSpaMode && !isHydrated) {\n return [matches[0]];\n }\n if (errors) {\n let errorIdx = matches.findIndex((m) => errors[m.route.id] !== void 0);\n return matches.slice(0, errorIdx + 1);\n }\n return matches;\n}\nvar CRITICAL_CSS_DATA_ATTRIBUTE = \"data-react-router-critical-css\";\nfunction Links({ nonce, crossOrigin }) {\n let {\n isSpaMode,\n manifest,\n routeModules,\n criticalCss,\n nonce: contextNonce\n } = useFrameworkContext();\n let { errors, matches: routerMatches } = useDataRouterStateContext();\n let matches = getActiveMatches(routerMatches, errors, isSpaMode);\n let keyedLinks = React8.useMemo(\n () => getKeyedLinksForMatches(matches, routeModules, manifest),\n [matches, routeModules, manifest]\n );\n if (nonce == null && contextNonce) {\n nonce = contextNonce;\n }\n return /* @__PURE__ */ React8.createElement(React8.Fragment, null, typeof criticalCss === \"string\" ? /* @__PURE__ */ React8.createElement(\n \"style\",\n {\n ...{ [CRITICAL_CSS_DATA_ATTRIBUTE]: \"\" },\n nonce,\n dangerouslySetInnerHTML: { __html: criticalCss }\n }\n ) : null, typeof criticalCss === \"object\" ? /* @__PURE__ */ React8.createElement(\n \"link\",\n {\n ...{ [CRITICAL_CSS_DATA_ATTRIBUTE]: \"\" },\n rel: \"stylesheet\",\n href: criticalCss.href,\n nonce,\n crossOrigin\n }\n ) : null, keyedLinks.map(\n ({ key, link }) => isPageLinkDescriptor(link) ? /* @__PURE__ */ React8.createElement(\n PrefetchPageLinks,\n {\n key,\n nonce,\n ...link,\n crossOrigin: link.crossOrigin ?? crossOrigin\n }\n ) : /* @__PURE__ */ React8.createElement(\n \"link\",\n {\n key,\n nonce,\n ...link,\n crossOrigin: link.crossOrigin ?? crossOrigin\n }\n )\n ));\n}\nfunction PrefetchPageLinks({ page, ...linkProps }) {\n let rsc = useIsRSCRouterContext();\n let { nonce: contextNonce } = useFrameworkContext();\n let { router } = useDataRouterContext2();\n let matches = React8.useMemo(\n () => matchRoutes(router.routes, page, router.basename),\n [router.routes, page, router.basename]\n );\n if (!matches) {\n return null;\n }\n if (linkProps.nonce == null && contextNonce) {\n linkProps = { ...linkProps, nonce: contextNonce };\n }\n if (rsc) {\n return /* @__PURE__ */ React8.createElement(RSCPrefetchPageLinksImpl, { page, matches, ...linkProps });\n }\n return /* @__PURE__ */ React8.createElement(PrefetchPageLinksImpl, { page, matches, ...linkProps });\n}\nfunction useKeyedPrefetchLinks(matches) {\n let { manifest, routeModules } = useFrameworkContext();\n let [keyedPrefetchLinks, setKeyedPrefetchLinks] = React8.useState([]);\n React8.useEffect(() => {\n let interrupted = false;\n void getKeyedPrefetchLinks(matches, manifest, routeModules).then(\n (links) => {\n if (!interrupted) {\n setKeyedPrefetchLinks(links);\n }\n }\n );\n return () => {\n interrupted = true;\n };\n }, [matches, manifest, routeModules]);\n return keyedPrefetchLinks;\n}\nfunction RSCPrefetchPageLinksImpl({\n page,\n matches: nextMatches,\n ...linkProps\n}) {\n let location = useLocation();\n let { future } = useFrameworkContext();\n let { basename } = useDataRouterContext2();\n let dataHrefs = React8.useMemo(() => {\n if (page === location.pathname + location.search + location.hash) {\n return [];\n }\n let url = singleFetchUrl(\n page,\n basename,\n future.v8_trailingSlashAwareDataRequests,\n \"rsc\"\n );\n let hasSomeRoutesWithShouldRevalidate = false;\n let targetRoutes = [];\n for (let match of nextMatches) {\n if (typeof match.route.shouldRevalidate === \"function\") {\n hasSomeRoutesWithShouldRevalidate = true;\n } else {\n targetRoutes.push(match.route.id);\n }\n }\n if (hasSomeRoutesWithShouldRevalidate && targetRoutes.length > 0) {\n url.searchParams.set(\"_routes\", targetRoutes.join(\",\"));\n }\n return [url.pathname + url.search];\n }, [\n basename,\n future.v8_trailingSlashAwareDataRequests,\n page,\n location,\n nextMatches\n ]);\n return /* @__PURE__ */ React8.createElement(React8.Fragment, null, dataHrefs.map((href) => /* @__PURE__ */ React8.createElement(\"link\", { key: href, rel: \"prefetch\", as: \"fetch\", href, ...linkProps })));\n}\nfunction PrefetchPageLinksImpl({\n page,\n matches: nextMatches,\n ...linkProps\n}) {\n let location = useLocation();\n let { future, manifest, routeModules } = useFrameworkContext();\n let { basename } = useDataRouterContext2();\n let { loaderData, matches } = useDataRouterStateContext();\n let newMatchesForData = React8.useMemo(\n () => getNewMatchesForLinks(\n page,\n nextMatches,\n matches,\n manifest,\n location,\n \"data\"\n ),\n [page, nextMatches, matches, manifest, location]\n );\n let newMatchesForAssets = React8.useMemo(\n () => getNewMatchesForLinks(\n page,\n nextMatches,\n matches,\n manifest,\n location,\n \"assets\"\n ),\n [page, nextMatches, matches, manifest, location]\n );\n let dataHrefs = React8.useMemo(() => {\n if (page === location.pathname + location.search + location.hash) {\n return [];\n }\n let routesParams = /* @__PURE__ */ new Set();\n let foundOptOutRoute = false;\n nextMatches.forEach((m) => {\n let manifestRoute = manifest.routes[m.route.id];\n if (!manifestRoute || !manifestRoute.hasLoader) {\n return;\n }\n if (!newMatchesForData.some((m2) => m2.route.id === m.route.id) && m.route.id in loaderData && routeModules[m.route.id]?.shouldRevalidate) {\n foundOptOutRoute = true;\n } else if (manifestRoute.hasClientLoader) {\n foundOptOutRoute = true;\n } else {\n routesParams.add(m.route.id);\n }\n });\n if (routesParams.size === 0) {\n return [];\n }\n let url = singleFetchUrl(\n page,\n basename,\n future.v8_trailingSlashAwareDataRequests,\n \"data\"\n );\n if (foundOptOutRoute && routesParams.size > 0) {\n url.searchParams.set(\n \"_routes\",\n nextMatches.filter((m) => routesParams.has(m.route.id)).map((m) => m.route.id).join(\",\")\n );\n }\n return [url.pathname + url.search];\n }, [\n basename,\n future.v8_trailingSlashAwareDataRequests,\n loaderData,\n location,\n manifest,\n newMatchesForData,\n nextMatches,\n page,\n routeModules\n ]);\n let moduleHrefs = React8.useMemo(\n () => getModuleLinkHrefs(newMatchesForAssets, manifest),\n [newMatchesForAssets, manifest]\n );\n let keyedPrefetchLinks = useKeyedPrefetchLinks(newMatchesForAssets);\n return /* @__PURE__ */ React8.createElement(React8.Fragment, null, dataHrefs.map((href) => /* @__PURE__ */ React8.createElement(\"link\", { key: href, rel: \"prefetch\", as: \"fetch\", href, ...linkProps })), moduleHrefs.map((href) => /* @__PURE__ */ React8.createElement(\"link\", { key: href, rel: \"modulepreload\", href, ...linkProps })), keyedPrefetchLinks.map(({ key, link }) => (\n // these don't spread `linkProps` because they are full link descriptors\n // already with their own props\n /* @__PURE__ */ React8.createElement(\n \"link\",\n {\n key,\n nonce: linkProps.nonce,\n ...link,\n crossOrigin: link.crossOrigin ?? linkProps.crossOrigin\n }\n )\n )));\n}\nfunction Meta() {\n let { isSpaMode, routeModules } = useFrameworkContext();\n let {\n errors,\n matches: routerMatches,\n loaderData\n } = useDataRouterStateContext();\n let location = useLocation();\n let _matches = getActiveMatches(routerMatches, errors, isSpaMode);\n let error = null;\n if (errors) {\n error = errors[_matches[_matches.length - 1].route.id];\n }\n let meta = [];\n let leafMeta = null;\n let matches = [];\n for (let i = 0; i < _matches.length; i++) {\n let _match = _matches[i];\n let routeId = _match.route.id;\n let data2 = loaderData[routeId];\n let params = _match.params;\n let routeModule = routeModules[routeId];\n let routeMeta = [];\n let match = {\n id: routeId,\n data: data2,\n loaderData: data2,\n meta: [],\n params: _match.params,\n pathname: _match.pathname,\n handle: _match.route.handle,\n error\n };\n matches[i] = match;\n if (routeModule?.meta) {\n routeMeta = typeof routeModule.meta === \"function\" ? routeModule.meta({\n data: data2,\n loaderData: data2,\n params,\n location,\n matches,\n error\n }) : Array.isArray(routeModule.meta) ? [...routeModule.meta] : routeModule.meta;\n } else if (leafMeta) {\n routeMeta = [...leafMeta];\n }\n routeMeta = routeMeta || [];\n if (!Array.isArray(routeMeta)) {\n throw new Error(\n \"The route at \" + _match.route.path + \" returns an invalid value. All route meta functions must return an array of meta objects.\\n\\nTo reference the meta function API, see https://reactrouter.com/start/framework/route-module#meta\"\n );\n }\n match.meta = routeMeta;\n matches[i] = match;\n meta = [...routeMeta];\n leafMeta = meta;\n }\n return /* @__PURE__ */ React8.createElement(React8.Fragment, null, meta.flat().map((metaProps) => {\n if (!metaProps) {\n return null;\n }\n if (\"tagName\" in metaProps) {\n let { tagName, ...rest } = metaProps;\n if (!isValidMetaTag(tagName)) {\n console.warn(\n `A meta object uses an invalid tagName: ${tagName}. Expected either 'link' or 'meta'`\n );\n return null;\n }\n let Comp = tagName;\n return /* @__PURE__ */ React8.createElement(Comp, { key: JSON.stringify(rest), ...rest });\n }\n if (\"title\" in metaProps) {\n return /* @__PURE__ */ React8.createElement(\"title\", { key: \"title\" }, String(metaProps.title));\n }\n if (\"charset\" in metaProps) {\n metaProps.charSet ?? (metaProps.charSet = metaProps.charset);\n delete metaProps.charset;\n }\n if (\"charSet\" in metaProps && metaProps.charSet != null) {\n return typeof metaProps.charSet === \"string\" ? /* @__PURE__ */ React8.createElement(\"meta\", { key: \"charSet\", charSet: metaProps.charSet }) : null;\n }\n if (\"script:ld+json\" in metaProps) {\n try {\n let json = JSON.stringify(metaProps[\"script:ld+json\"]);\n return /* @__PURE__ */ React8.createElement(\n \"script\",\n {\n key: `script:ld+json:${json}`,\n type: \"application/ld+json\",\n dangerouslySetInnerHTML: { __html: escapeHtml(json) }\n }\n );\n } catch (e) {\n return null;\n }\n }\n return /* @__PURE__ */ React8.createElement(\"meta\", { key: JSON.stringify(metaProps), ...metaProps });\n }));\n}\nfunction isValidMetaTag(tagName) {\n return typeof tagName === \"string\" && /^(meta|link)$/.test(tagName);\n}\nvar isHydrated = false;\nfunction setIsHydrated() {\n isHydrated = true;\n}\nfunction Scripts(scriptProps) {\n let {\n manifest,\n serverHandoffString,\n isSpaMode,\n renderMeta,\n routeDiscovery,\n ssr,\n nonce: contextNonce\n } = useFrameworkContext();\n let { router, static: isStatic, staticContext } = useDataRouterContext2();\n let { matches: routerMatches } = useDataRouterStateContext();\n let isRSCRouterContext = useIsRSCRouterContext();\n let enableFogOfWar = isFogOfWarEnabled(routeDiscovery, ssr);\n if (scriptProps.nonce == null && contextNonce) {\n scriptProps = { ...scriptProps, nonce: contextNonce };\n }\n if (renderMeta) {\n renderMeta.didRenderScripts = true;\n }\n let matches = getActiveMatches(routerMatches, null, isSpaMode);\n React8.useEffect(() => {\n setIsHydrated();\n }, []);\n let initialScripts = React8.useMemo(() => {\n if (isRSCRouterContext) {\n return null;\n }\n let streamScript = \"window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());\";\n let contextScript = staticContext ? `window.__reactRouterContext = ${serverHandoffString};${streamScript}` : \" \";\n let routeModulesScript = !isStatic ? \" \" : `${manifest.hmr?.runtime ? `import ${JSON.stringify(manifest.hmr.runtime)};` : \"\"}${!enableFogOfWar ? `import ${JSON.stringify(manifest.url)}` : \"\"};\n${matches.map((match, routeIndex) => {\n let routeVarName = `route${routeIndex}`;\n let manifestEntry = manifest.routes[match.route.id];\n invariant2(manifestEntry, `Route ${match.route.id} not found in manifest`);\n let {\n clientActionModule,\n clientLoaderModule,\n clientMiddlewareModule,\n hydrateFallbackModule,\n module\n } = manifestEntry;\n let chunks = [\n ...clientActionModule ? [\n {\n module: clientActionModule,\n varName: `${routeVarName}_clientAction`\n }\n ] : [],\n ...clientLoaderModule ? [\n {\n module: clientLoaderModule,\n varName: `${routeVarName}_clientLoader`\n }\n ] : [],\n ...clientMiddlewareModule ? [\n {\n module: clientMiddlewareModule,\n varName: `${routeVarName}_clientMiddleware`\n }\n ] : [],\n ...hydrateFallbackModule ? [\n {\n module: hydrateFallbackModule,\n varName: `${routeVarName}_HydrateFallback`\n }\n ] : [],\n { module, varName: `${routeVarName}_main` }\n ];\n if (chunks.length === 1) {\n return `import * as ${routeVarName} from ${JSON.stringify(module)};`;\n }\n let chunkImportsSnippet = chunks.map((chunk) => `import * as ${chunk.varName} from \"${chunk.module}\";`).join(\"\\n\");\n let mergedChunksSnippet = `const ${routeVarName} = {${chunks.map((chunk) => `...${chunk.varName}`).join(\",\")}};`;\n return [chunkImportsSnippet, mergedChunksSnippet].join(\"\\n\");\n }).join(\"\\n\")}\n ${enableFogOfWar ? (\n // Inline a minimal manifest with the SSR matches\n `window.__reactRouterManifest = ${JSON.stringify(\n getPartialManifest(manifest, router),\n null,\n 2\n )};`\n ) : \"\"}\n window.__reactRouterRouteModules = {${matches.map((match, index) => `${JSON.stringify(match.route.id)}:route${index}`).join(\",\")}};\n\nimport(${JSON.stringify(manifest.entry.module)});`;\n return /* @__PURE__ */ React8.createElement(React8.Fragment, null, /* @__PURE__ */ React8.createElement(\n \"script\",\n {\n ...scriptProps,\n suppressHydrationWarning: true,\n dangerouslySetInnerHTML: { __html: contextScript },\n type: void 0\n }\n ), /* @__PURE__ */ React8.createElement(\n \"script\",\n {\n ...scriptProps,\n suppressHydrationWarning: true,\n dangerouslySetInnerHTML: { __html: routeModulesScript },\n type: \"module\",\n async: true\n }\n ));\n }, []);\n let preloads = isHydrated || isRSCRouterContext ? [] : [\n // Dedupe through a Set\n ...new Set(\n manifest.entry.imports.concat(\n getModuleLinkHrefs(matches, manifest, {\n includeHydrateFallback: true\n })\n )\n )\n ];\n let sri = typeof manifest.sri === \"object\" ? manifest.sri : {};\n warnOnce(\n !isRSCRouterContext,\n \"The <Scripts /> element is a no-op when using RSC and can be safely removed.\"\n );\n return isHydrated || isRSCRouterContext ? null : /* @__PURE__ */ React8.createElement(React8.Fragment, null, typeof manifest.sri === \"object\" ? /* @__PURE__ */ React8.createElement(\n \"script\",\n {\n ...scriptProps,\n \"rr-importmap\": \"\",\n type: \"importmap\",\n suppressHydrationWarning: true,\n dangerouslySetInnerHTML: {\n __html: JSON.stringify({\n integrity: sri\n })\n }\n }\n ) : null, !enableFogOfWar ? /* @__PURE__ */ React8.createElement(\n \"link\",\n {\n rel: \"modulepreload\",\n href: manifest.url,\n crossOrigin: scriptProps.crossOrigin,\n integrity: sri[manifest.url],\n nonce: scriptProps.nonce,\n suppressHydrationWarning: true\n }\n ) : null, /* @__PURE__ */ React8.createElement(\n \"link\",\n {\n rel: \"modulepreload\",\n href: manifest.entry.module,\n crossOrigin: scriptProps.crossOrigin,\n integrity: sri[manifest.entry.module],\n nonce: scriptProps.nonce,\n suppressHydrationWarning: true\n }\n ), preloads.map((path) => /* @__PURE__ */ React8.createElement(\n \"link\",\n {\n key: path,\n rel: \"modulepreload\",\n href: path,\n crossOrigin: scriptProps.crossOrigin,\n integrity: sri[path],\n nonce: scriptProps.nonce,\n suppressHydrationWarning: true\n }\n )), initialScripts);\n}\nfunction mergeRefs(...refs) {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref != null) {\n ref.current = value;\n }\n });\n };\n}\n\n// lib/dom/ssr/errorBoundaries.tsx\nvar RemixErrorBoundary = class extends React9.Component {\n constructor(props) {\n super(props);\n this.state = { error: props.error || null, location: props.location };\n }\n static getDerivedStateFromError(error) {\n return { error };\n }\n static getDerivedStateFromProps(props, state) {\n if (state.location !== props.location) {\n return { error: props.error || null, location: props.location };\n }\n return { error: props.error || state.error, location: state.location };\n }\n render() {\n if (this.state.error) {\n return /* @__PURE__ */ React9.createElement(\n RemixRootDefaultErrorBoundary,\n {\n error: this.state.error,\n isOutsideRemixApp: true\n }\n );\n } else {\n return this.props.children;\n }\n }\n};\nfunction RemixRootDefaultErrorBoundary({\n error,\n isOutsideRemixApp\n}) {\n let { nonce } = useFrameworkContext();\n console.error(error);\n let heyDeveloper = /* @__PURE__ */ React9.createElement(\n \"script\",\n {\n nonce,\n dangerouslySetInnerHTML: {\n __html: `\n console.log(\n \"\\u{1F4BF} Hey developer \\u{1F44B}. You can provide a way better UX than this when your app throws errors. Check out https://reactrouter.com/how-to/error-boundary for more information.\"\n );\n `\n }\n }\n );\n if (isRouteErrorResponse(error)) {\n return /* @__PURE__ */ React9.createElement(BoundaryShell, { title: \"Unhandled Thrown Response!\" }, /* @__PURE__ */ React9.createElement(\"h1\", { style: { fontSize: \"24px\" } }, error.status, \" \", error.statusText), ENABLE_DEV_WARNINGS ? heyDeveloper : null);\n }\n let errorInstance;\n if (error instanceof Error) {\n errorInstance = error;\n } else {\n let errorString = error == null ? \"Unknown Error\" : typeof error === \"object\" && \"toString\" in error ? error.toString() : JSON.stringify(error);\n errorInstance = new Error(errorString);\n }\n return /* @__PURE__ */ React9.createElement(\n BoundaryShell,\n {\n title: \"Application Error!\",\n isOutsideRemixApp\n },\n /* @__PURE__ */ React9.createElement(\"h1\", { style: { fontSize: \"24px\" } }, \"Application Error\"),\n /* @__PURE__ */ React9.createElement(\n \"pre\",\n {\n style: {\n padding: \"2rem\",\n background: \"hsla(10, 50%, 50%, 0.1)\",\n color: \"red\",\n overflow: \"auto\"\n }\n },\n errorInstance.stack\n ),\n heyDeveloper\n );\n}\nfunction BoundaryShell({\n title,\n renderScripts,\n isOutsideRemixApp,\n children\n}) {\n let { routeModules } = useFrameworkContext();\n if (routeModules.root?.Layout && !isOutsideRemixApp) {\n return children;\n }\n return /* @__PURE__ */ React9.createElement(\"html\", { lang: \"en\" }, /* @__PURE__ */ React9.createElement(\"head\", null, /* @__PURE__ */ React9.createElement(\"meta\", { charSet: \"utf-8\" }), /* @__PURE__ */ React9.createElement(\n \"meta\",\n {\n name: \"viewport\",\n content: \"width=device-width,initial-scale=1,viewport-fit=cover\"\n }\n ), /* @__PURE__ */ React9.createElement(\"title\", null, title)), /* @__PURE__ */ React9.createElement(\"body\", null, /* @__PURE__ */ React9.createElement(\"main\", { style: { fontFamily: \"system-ui, sans-serif\", padding: \"2rem\" } }, children, renderScripts ? /* @__PURE__ */ React9.createElement(Scripts, null) : null)));\n}\n\n// lib/dom/lib.tsx\nimport * as React10 from \"react\";\nvar isBrowser2 = typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\";\ntry {\n if (isBrowser2) {\n window.__reactRouterVersion = // @ts-expect-error\n \"7.18.4\";\n }\n} catch (e) {\n}\nfunction createBrowserRouter(routes, opts) {\n return createRouter({\n basename: opts?.basename,\n getContext: opts?.getContext,\n future: opts?.future,\n history: createBrowserHistory({ window: opts?.window }),\n hydrationData: opts?.hydrationData || parseHydrationData(),\n routes,\n mapRouteProperties,\n hydrationRouteProperties,\n dataStrategy: opts?.dataStrategy,\n patchRoutesOnNavigation: opts?.patchRoutesOnNavigation,\n window: opts?.window,\n instrumentations: opts?.instrumentations\n }).initialize();\n}\nfunction createHashRouter(routes, opts) {\n return createRouter({\n basename: opts?.basename,\n getContext: opts?.getContext,\n future: opts?.future,\n history: createHashHistory({ window: opts?.window }),\n hydrationData: opts?.hydrationData || parseHydrationData(),\n routes,\n mapRouteProperties,\n hydrationRouteProperties,\n dataStrategy: opts?.dataStrategy,\n patchRoutesOnNavigation: opts?.patchRoutesOnNavigation,\n window: opts?.window,\n instrumentations: opts?.instrumentations\n }).initialize();\n}\nfunction parseHydrationData() {\n let state = window?.__staticRouterHydrationData;\n if (state && state.errors) {\n state = {\n ...state,\n errors: deserializeErrors(state.errors)\n };\n }\n return state;\n}\nfunction deserializeErrors(errors) {\n if (!errors) return null;\n let entries = Object.entries(errors);\n let serialized = {};\n for (let [key, val] of entries) {\n if (val && val.__type === \"RouteErrorResponse\") {\n serialized[key] = new ErrorResponseImpl(\n val.status,\n val.statusText,\n val.data,\n val.internal === true\n );\n } else if (val && val.__type === \"Error\") {\n if (typeof val.__subType === \"string\" && SUPPORTED_ERROR_TYPES.includes(val.__subType)) {\n let ErrorConstructor = window[val.__subType];\n if (typeof ErrorConstructor === \"function\") {\n try {\n let error = new ErrorConstructor(val.message);\n error.stack = \"\";\n serialized[key] = error;\n } catch (e) {\n }\n }\n }\n if (serialized[key] == null) {\n let error = new Error(val.message);\n error.stack = \"\";\n serialized[key] = error;\n }\n } else {\n serialized[key] = val;\n }\n }\n return serialized;\n}\nfunction BrowserRouter({\n basename,\n children,\n useTransitions,\n window: window2\n}) {\n let historyRef = React10.useRef();\n if (historyRef.current == null) {\n historyRef.current = createBrowserHistory({ window: window2, v5Compat: true });\n }\n let history = historyRef.current;\n let [state, setStateImpl] = React10.useState({\n action: history.action,\n location: history.location\n });\n let setState = React10.useCallback(\n (newState) => {\n if (useTransitions === false) {\n setStateImpl(newState);\n } else {\n React10.startTransition(() => setStateImpl(newState));\n }\n },\n [useTransitions]\n );\n React10.useLayoutEffect(() => history.listen(setState), [history, setState]);\n return /* @__PURE__ */ React10.createElement(\n Router,\n {\n basename,\n children,\n location: state.location,\n navigationType: state.action,\n navigator: history,\n useTransitions\n }\n );\n}\nfunction HashRouter({\n basename,\n children,\n useTransitions,\n window: window2\n}) {\n let historyRef = React10.useRef();\n if (historyRef.current == null) {\n historyRef.current = createHashHistory({ window: window2, v5Compat: true });\n }\n let history = historyRef.current;\n let [state, setStateImpl] = React10.useState({\n action: history.action,\n location: history.location\n });\n let setState = React10.useCallback(\n (newState) => {\n if (useTransitions === false) {\n setStateImpl(newState);\n } else {\n React10.startTransition(() => setStateImpl(newState));\n }\n },\n [useTransitions]\n );\n React10.useLayoutEffect(() => history.listen(setState), [history, setState]);\n return /* @__PURE__ */ React10.createElement(\n Router,\n {\n basename,\n children,\n location: state.location,\n navigationType: state.action,\n navigator: history,\n useTransitions\n }\n );\n}\nfunction HistoryRouter({\n basename,\n children,\n history,\n useTransitions\n}) {\n let [state, setStateImpl] = React10.useState({\n action: history.action,\n location: history.location\n });\n let setState = React10.useCallback(\n (newState) => {\n if (useTransitions === false) {\n setStateImpl(newState);\n } else {\n React10.startTransition(() => setStateImpl(newState));\n }\n },\n [useTransitions]\n );\n React10.useLayoutEffect(() => history.listen(setState), [history, setState]);\n return /* @__PURE__ */ React10.createElement(\n Router,\n {\n basename,\n children,\n location: state.location,\n navigationType: state.action,\n navigator: history,\n useTransitions\n }\n );\n}\nHistoryRouter.displayName = \"unstable_HistoryRouter\";\nvar Link = React10.forwardRef(\n function LinkWithRef({\n onClick,\n discover = \"render\",\n prefetch = \"none\",\n relative,\n reloadDocument,\n replace: replace2,\n mask,\n state,\n target,\n to,\n preventScrollReset,\n viewTransition,\n defaultShouldRevalidate,\n ...rest\n }, forwardedRef) {\n let { basename, navigator, useTransitions } = React10.useContext(NavigationContext);\n let isAbsolute = typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to);\n let parsed = parseToInfo(to, basename);\n to = parsed.to;\n let href = useHref(to, { relative });\n let location = useLocation();\n let maskedHref = null;\n if (mask) {\n let resolved = resolveTo(\n mask,\n [],\n location.mask ? location.mask.pathname : \"/\",\n true\n );\n if (basename !== \"/\") {\n resolved.pathname = resolved.pathname === \"/\" ? basename : joinPaths([basename, resolved.pathname]);\n }\n maskedHref = navigator.createHref(resolved);\n }\n let [shouldPrefetch, prefetchRef, prefetchHandlers] = usePrefetchBehavior(\n prefetch,\n rest\n );\n let internalOnClick = useLinkClickHandler(to, {\n replace: replace2,\n mask,\n state,\n target,\n preventScrollReset,\n relative,\n viewTransition,\n defaultShouldRevalidate,\n useTransitions\n });\n function handleClick(event) {\n if (onClick) onClick(event);\n if (!event.defaultPrevented) {\n internalOnClick(event);\n }\n }\n let isSpaLink = !(parsed.isExternal || reloadDocument);\n let link = (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n /* @__PURE__ */ React10.createElement(\n \"a\",\n {\n ...rest,\n ...prefetchHandlers,\n href: (isSpaLink ? maskedHref : void 0) || parsed.absoluteURL || href,\n onClick: isSpaLink ? handleClick : onClick,\n ref: mergeRefs(forwardedRef, prefetchRef),\n target,\n \"data-discover\": !isAbsolute && discover === \"render\" ? \"true\" : void 0\n }\n )\n );\n return shouldPrefetch && !isAbsolute ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, link, /* @__PURE__ */ React10.createElement(PrefetchPageLinks, { page: href })) : link;\n }\n);\nLink.displayName = \"Link\";\nvar NavLink = React10.forwardRef(\n function NavLinkWithRef({\n \"aria-current\": ariaCurrentProp = \"page\",\n caseSensitive = false,\n className: classNameProp = \"\",\n end = false,\n style: styleProp,\n to,\n viewTransition,\n children,\n ...rest\n }, ref) {\n let path = useResolvedPath(to, { relative: rest.relative });\n let location = useLocation();\n let routerState = React10.useContext(DataRouterStateContext);\n let { navigator, basename } = React10.useContext(NavigationContext);\n let isTransitioning = routerState != null && // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useViewTransitionState(path) && viewTransition === true;\n let toPathname = navigator.encodeLocation ? navigator.encodeLocation(path).pathname : path.pathname;\n let locationPathname = location.pathname;\n let nextLocationPathname = routerState && routerState.navigation && routerState.navigation.location ? routerState.navigation.location.pathname : null;\n if (!caseSensitive) {\n locationPathname = locationPathname.toLowerCase();\n nextLocationPathname = nextLocationPathname ? nextLocationPathname.toLowerCase() : null;\n toPathname = toPathname.toLowerCase();\n }\n if (nextLocationPathname && basename) {\n nextLocationPathname = stripBasename(nextLocationPathname, basename) || nextLocationPathname;\n }\n const endSlashPosition = toPathname !== \"/\" && toPathname.endsWith(\"/\") ? toPathname.length - 1 : toPathname.length;\n let isActive = locationPathname === toPathname || !end && locationPathname.startsWith(toPathname) && locationPathname.charAt(endSlashPosition) === \"/\";\n let isPending = nextLocationPathname != null && (nextLocationPathname === toPathname || !end && nextLocationPathname.startsWith(toPathname) && nextLocationPathname.charAt(toPathname.length) === \"/\");\n let renderProps = {\n isActive,\n isPending,\n isTransitioning\n };\n let ariaCurrent = isActive ? ariaCurrentProp : void 0;\n let className;\n if (typeof classNameProp === \"function\") {\n className = classNameProp(renderProps);\n } else {\n className = [\n classNameProp,\n isActive ? \"active\" : null,\n isPending ? \"pending\" : null,\n isTransitioning ? \"transitioning\" : null\n ].filter(Boolean).join(\" \");\n }\n let style = typeof styleProp === \"function\" ? styleProp(renderProps) : styleProp;\n return /* @__PURE__ */ React10.createElement(\n Link,\n {\n ...rest,\n \"aria-current\": ariaCurrent,\n className,\n ref,\n style,\n to,\n viewTransition\n },\n typeof children === \"function\" ? children(renderProps) : children\n );\n }\n);\nNavLink.displayName = \"NavLink\";\nvar Form = React10.forwardRef(\n ({\n discover = \"render\",\n fetcherKey,\n navigate,\n reloadDocument,\n replace: replace2,\n state,\n method = defaultMethod,\n action,\n onSubmit,\n relative,\n preventScrollReset,\n viewTransition,\n defaultShouldRevalidate,\n ...props\n }, forwardedRef) => {\n let { useTransitions } = React10.useContext(NavigationContext);\n let submit = useSubmit();\n let formAction = useFormAction(action, { relative });\n let formMethod = method.toLowerCase() === \"get\" ? \"get\" : \"post\";\n let isAbsolute = typeof action === \"string\" && ABSOLUTE_URL_REGEX.test(action);\n let submitHandler = (event) => {\n onSubmit && onSubmit(event);\n if (event.defaultPrevented) return;\n event.preventDefault();\n let submitter = event.nativeEvent.submitter;\n let submitMethod = submitter?.getAttribute(\"formmethod\") || method;\n let doSubmit = () => submit(submitter || event.currentTarget, {\n fetcherKey,\n method: submitMethod,\n navigate,\n replace: replace2,\n state,\n relative,\n preventScrollReset,\n viewTransition,\n defaultShouldRevalidate\n });\n if (useTransitions && navigate !== false) {\n React10.startTransition(() => doSubmit());\n } else {\n doSubmit();\n }\n };\n return /* @__PURE__ */ React10.createElement(\n \"form\",\n {\n ref: forwardedRef,\n method: formMethod,\n action: formAction,\n onSubmit: reloadDocument ? onSubmit : submitHandler,\n ...props,\n \"data-discover\": !isAbsolute && discover === \"render\" ? \"true\" : void 0\n }\n );\n }\n);\nForm.displayName = \"Form\";\nfunction ScrollRestoration({\n getKey,\n storageKey,\n ...props\n}) {\n let remixContext = React10.useContext(FrameworkContext);\n let { basename } = React10.useContext(NavigationContext);\n let location = useLocation();\n let matches = useMatches();\n useScrollRestoration({ getKey, storageKey });\n let ssrKey = React10.useMemo(\n () => {\n if (!remixContext || !getKey) return null;\n let userKey = getScrollRestorationKey(\n location,\n matches,\n basename,\n getKey\n );\n return userKey !== location.key ? userKey : null;\n },\n // Nah, we only need this the first time for the SSR render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n if (!remixContext || remixContext.isSpaMode) {\n return null;\n }\n let restoreScroll = ((storageKey2, restoreKey) => {\n if (!window.history.state || !window.history.state.key) {\n let key = Math.random().toString(32).slice(2);\n window.history.replaceState({ key }, \"\");\n }\n try {\n let positions = JSON.parse(sessionStorage.getItem(storageKey2) || \"{}\");\n let storedY = positions[restoreKey || window.history.state.key];\n if (typeof storedY === \"number\") {\n window.scrollTo(0, storedY);\n }\n } catch (error) {\n console.error(error);\n sessionStorage.removeItem(storageKey2);\n }\n }).toString();\n if (props.nonce == null && remixContext?.nonce) {\n props.nonce = remixContext.nonce;\n }\n return /* @__PURE__ */ React10.createElement(\n \"script\",\n {\n ...props,\n suppressHydrationWarning: true,\n dangerouslySetInnerHTML: {\n __html: `(${restoreScroll})(${escapeHtml(\n JSON.stringify(storageKey || SCROLL_RESTORATION_STORAGE_KEY)\n )}, ${escapeHtml(JSON.stringify(ssrKey))})`\n }\n }\n );\n}\nScrollRestoration.displayName = \"ScrollRestoration\";\nfunction getDataRouterConsoleError2(hookName) {\n return `${hookName} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`;\n}\nfunction useDataRouterContext3(hookName) {\n let ctx = React10.useContext(DataRouterContext);\n invariant(ctx, getDataRouterConsoleError2(hookName));\n return ctx;\n}\nfunction useDataRouterState2(hookName) {\n let state = React10.useContext(DataRouterStateContext);\n invariant(state, getDataRouterConsoleError2(hookName));\n return state;\n}\nfunction useLinkClickHandler(to, {\n target,\n replace: replaceProp,\n mask,\n state,\n preventScrollReset,\n relative,\n viewTransition,\n defaultShouldRevalidate,\n useTransitions\n} = {}) {\n let navigate = useNavigate();\n let location = useLocation();\n let path = useResolvedPath(to, { relative });\n return React10.useCallback(\n (event) => {\n if (shouldProcessLinkClick(event, target)) {\n event.preventDefault();\n let replace2 = replaceProp !== void 0 ? replaceProp : createPath(location) === createPath(path);\n let doNavigate = () => navigate(to, {\n replace: replace2,\n mask,\n state,\n preventScrollReset,\n relative,\n viewTransition,\n defaultShouldRevalidate\n });\n if (useTransitions) {\n React10.startTransition(() => doNavigate());\n } else {\n doNavigate();\n }\n }\n },\n [\n location,\n navigate,\n path,\n replaceProp,\n mask,\n state,\n target,\n to,\n preventScrollReset,\n relative,\n viewTransition,\n defaultShouldRevalidate,\n useTransitions\n ]\n );\n}\nfunction useSearchParams(defaultInit) {\n warning(\n typeof URLSearchParams !== \"undefined\",\n `You cannot use the \\`useSearchParams\\` hook in a browser that does not support the URLSearchParams API. If you need to support Internet Explorer 11, we recommend you load a polyfill such as https://github.com/ungap/url-search-params.`\n );\n let defaultSearchParamsRef = React10.useRef(createSearchParams(defaultInit));\n let hasSetSearchParamsRef = React10.useRef(false);\n let location = useLocation();\n let searchParams = React10.useMemo(\n () => (\n // Only merge in the defaults if we haven't yet called setSearchParams.\n // Once we call that we want those to take precedence, otherwise you can't\n // remove a param with setSearchParams({}) if it has an initial value\n getSearchParamsForLocation(\n location.search,\n hasSetSearchParamsRef.current ? null : defaultSearchParamsRef.current\n )\n ),\n [location.search]\n );\n let navigate = useNavigate();\n let setSearchParams = React10.useCallback(\n (nextInit, navigateOptions) => {\n const newSearchParams = createSearchParams(\n typeof nextInit === \"function\" ? nextInit(new URLSearchParams(searchParams)) : nextInit\n );\n hasSetSearchParamsRef.current = true;\n navigate(\"?\" + newSearchParams, navigateOptions);\n },\n [navigate, searchParams]\n );\n return [searchParams, setSearchParams];\n}\nvar fetcherId = 0;\nvar getUniqueFetcherId = () => `__${String(++fetcherId)}__`;\nfunction useSubmit() {\n let { router } = useDataRouterContext3(\"useSubmit\" /* UseSubmit */);\n let { basename } = React10.useContext(NavigationContext);\n let currentRouteId = useRouteId();\n let routerFetch = router.fetch;\n let routerNavigate = router.navigate;\n return React10.useCallback(\n async (target, options = {}) => {\n let { action, method, encType, formData, body } = getFormSubmissionInfo(\n target,\n basename\n );\n if (options.navigate === false) {\n let key = options.fetcherKey || getUniqueFetcherId();\n await routerFetch(key, currentRouteId, options.action || action, {\n defaultShouldRevalidate: options.defaultShouldRevalidate,\n preventScrollReset: options.preventScrollReset,\n formData,\n body,\n formMethod: options.method || method,\n formEncType: options.encType || encType,\n flushSync: options.flushSync\n });\n } else {\n await routerNavigate(options.action || action, {\n defaultShouldRevalidate: options.defaultShouldRevalidate,\n preventScrollReset: options.preventScrollReset,\n formData,\n body,\n formMethod: options.method || method,\n formEncType: options.encType || encType,\n replace: options.replace,\n state: options.state,\n fromRouteId: currentRouteId,\n flushSync: options.flushSync,\n viewTransition: options.viewTransition\n });\n }\n },\n [routerFetch, routerNavigate, basename, currentRouteId]\n );\n}\nfunction useFormAction(action, { relative } = {}) {\n let { basename } = React10.useContext(NavigationContext);\n let routeContext = React10.useContext(RouteContext);\n invariant(routeContext, \"useFormAction must be used inside a RouteContext\");\n let [match] = routeContext.matches.slice(-1);\n let path = { ...useResolvedPath(action ? action : \".\", { relative }) };\n let location = useLocation();\n if (action == null) {\n path.search = location.search;\n let params = new URLSearchParams(path.search);\n let indexValues = params.getAll(\"index\");\n let hasNakedIndexParam = indexValues.some((v) => v === \"\");\n if (hasNakedIndexParam) {\n params.delete(\"index\");\n indexValues.filter((v) => v).forEach((v) => params.append(\"index\", v));\n let qs = params.toString();\n path.search = qs ? `?${qs}` : \"\";\n }\n }\n if ((!action || action === \".\") && match.route.index) {\n path.search = path.search ? path.search.replace(/^\\?/, \"?index&\") : \"?index\";\n }\n if (basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n return createPath(path);\n}\nfunction useFetcher({\n key\n} = {}) {\n let { router } = useDataRouterContext3(\"useFetcher\" /* UseFetcher */);\n let state = useDataRouterState2(\"useFetcher\" /* UseFetcher */);\n let fetcherData = React10.useContext(FetchersContext);\n let route = React10.useContext(RouteContext);\n let routeId = route.matches[route.matches.length - 1]?.route.id;\n invariant(fetcherData, `useFetcher must be used inside a FetchersContext`);\n invariant(route, `useFetcher must be used inside a RouteContext`);\n invariant(\n routeId != null,\n `useFetcher can only be used on routes that contain a unique \"id\"`\n );\n let defaultKey = React10.useId();\n let [fetcherKey, setFetcherKey] = React10.useState(key || defaultKey);\n if (key && key !== fetcherKey) {\n setFetcherKey(key);\n }\n let { deleteFetcher, getFetcher, resetFetcher, fetch: routerFetch } = router;\n React10.useEffect(() => {\n getFetcher(fetcherKey);\n return () => deleteFetcher(fetcherKey);\n }, [deleteFetcher, getFetcher, fetcherKey]);\n let load = React10.useCallback(\n async (href, opts) => {\n invariant(routeId, \"No routeId available for fetcher.load()\");\n await routerFetch(fetcherKey, routeId, href, opts);\n },\n [fetcherKey, routeId, routerFetch]\n );\n let submitImpl = useSubmit();\n let submit = React10.useCallback(\n async (target, opts) => {\n await submitImpl(target, {\n ...opts,\n navigate: false,\n fetcherKey\n });\n },\n [fetcherKey, submitImpl]\n );\n let reset = React10.useCallback(\n (opts) => resetFetcher(fetcherKey, opts),\n [resetFetcher, fetcherKey]\n );\n let FetcherForm = React10.useMemo(() => {\n let FetcherForm2 = React10.forwardRef(\n (props, ref) => {\n return /* @__PURE__ */ React10.createElement(Form, { ...props, navigate: false, fetcherKey, ref });\n }\n );\n FetcherForm2.displayName = \"fetcher.Form\";\n return FetcherForm2;\n }, [fetcherKey]);\n let fetcher = state.fetchers.get(fetcherKey) || IDLE_FETCHER;\n let data2 = fetcherData.get(fetcherKey);\n let fetcherWithComponents = React10.useMemo(\n () => ({\n Form: FetcherForm,\n submit,\n load,\n reset,\n ...fetcher,\n data: data2\n }),\n [FetcherForm, submit, load, reset, fetcher, data2]\n );\n return fetcherWithComponents;\n}\nfunction useFetchers() {\n let state = useDataRouterState2(\"useFetchers\" /* UseFetchers */);\n return React10.useMemo(\n () => Array.from(state.fetchers.entries()).map(([key, fetcher]) => ({\n ...fetcher,\n key\n })),\n [state.fetchers]\n );\n}\nvar SCROLL_RESTORATION_STORAGE_KEY = \"react-router-scroll-positions\";\nvar savedScrollPositions = {};\nfunction getScrollRestorationKey(location, matches, basename, getKey) {\n let key = null;\n if (getKey) {\n if (basename !== \"/\") {\n key = getKey(\n {\n ...location,\n pathname: stripBasename(location.pathname, basename) || location.pathname\n },\n matches\n );\n } else {\n key = getKey(location, matches);\n }\n }\n if (key == null) {\n key = location.key;\n }\n return key;\n}\nfunction useScrollRestoration({\n getKey,\n storageKey\n} = {}) {\n let { router } = useDataRouterContext3(\"useScrollRestoration\" /* UseScrollRestoration */);\n let { restoreScrollPosition, preventScrollReset } = useDataRouterState2(\n \"useScrollRestoration\" /* UseScrollRestoration */\n );\n let { basename } = React10.useContext(NavigationContext);\n let location = useLocation();\n let matches = useMatches();\n let navigation = useNavigation();\n React10.useEffect(() => {\n window.history.scrollRestoration = \"manual\";\n return () => {\n window.history.scrollRestoration = \"auto\";\n };\n }, []);\n usePageHide(\n React10.useCallback(() => {\n if (navigation.state === \"idle\") {\n let key = getScrollRestorationKey(location, matches, basename, getKey);\n savedScrollPositions[key] = window.scrollY;\n }\n try {\n sessionStorage.setItem(\n storageKey || SCROLL_RESTORATION_STORAGE_KEY,\n JSON.stringify(savedScrollPositions)\n );\n } catch (error) {\n warning(\n false,\n `Failed to save scroll positions in sessionStorage, <ScrollRestoration /> will not work properly (${error}).`\n );\n }\n window.history.scrollRestoration = \"auto\";\n }, [navigation.state, getKey, basename, location, matches, storageKey])\n );\n if (typeof document !== \"undefined\") {\n React10.useLayoutEffect(() => {\n try {\n let sessionPositions = sessionStorage.getItem(\n storageKey || SCROLL_RESTORATION_STORAGE_KEY\n );\n if (sessionPositions) {\n savedScrollPositions = JSON.parse(sessionPositions);\n }\n } catch (e) {\n }\n }, [storageKey]);\n React10.useLayoutEffect(() => {\n let disableScrollRestoration = router?.enableScrollRestoration(\n savedScrollPositions,\n () => window.scrollY,\n getKey ? (location2, matches2) => getScrollRestorationKey(location2, matches2, basename, getKey) : void 0\n );\n return () => disableScrollRestoration && disableScrollRestoration();\n }, [router, basename, getKey]);\n React10.useLayoutEffect(() => {\n if (restoreScrollPosition === false) {\n return;\n }\n if (typeof restoreScrollPosition === \"number\") {\n window.scrollTo(0, restoreScrollPosition);\n return;\n }\n try {\n if (location.hash) {\n let el = document.getElementById(\n decodeURIComponent(location.hash.slice(1))\n );\n if (el) {\n el.scrollIntoView();\n return;\n }\n }\n } catch {\n warning(\n false,\n `\"${location.hash.slice(\n 1\n )}\" is not a decodable element ID. The view will not scroll to it.`\n );\n }\n if (preventScrollReset === true) {\n return;\n }\n window.scrollTo(0, 0);\n }, [location, restoreScrollPosition, preventScrollReset]);\n }\n}\nfunction useBeforeUnload(callback, options) {\n let { capture } = options || {};\n React10.useEffect(() => {\n let opts = capture != null ? { capture } : void 0;\n window.addEventListener(\"beforeunload\", callback, opts);\n return () => {\n window.removeEventListener(\"beforeunload\", callback, opts);\n };\n }, [callback, capture]);\n}\nfunction usePageHide(callback, options) {\n let { capture } = options || {};\n React10.useEffect(() => {\n let opts = capture != null ? { capture } : void 0;\n window.addEventListener(\"pagehide\", callback, opts);\n return () => {\n window.removeEventListener(\"pagehide\", callback, opts);\n };\n }, [callback, capture]);\n}\nfunction usePrompt({\n when,\n message\n}) {\n let blocker = useBlocker(when);\n React10.useEffect(() => {\n if (blocker.state === \"blocked\") {\n let proceed = window.confirm(message);\n if (proceed) {\n setTimeout(blocker.proceed, 0);\n } else {\n blocker.reset();\n }\n }\n }, [blocker, message]);\n React10.useEffect(() => {\n if (blocker.state === \"blocked\" && !when) {\n blocker.reset();\n }\n }, [blocker, when]);\n}\nfunction useViewTransitionState(to, { relative } = {}) {\n let vtContext = React10.useContext(ViewTransitionContext);\n invariant(\n vtContext != null,\n \"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?\"\n );\n let { basename } = useDataRouterContext3(\n \"useViewTransitionState\" /* useViewTransitionState */\n );\n let path = useResolvedPath(to, { relative });\n if (!vtContext.isTransitioning) {\n return false;\n }\n let currentPath = stripBasename(vtContext.currentLocation.pathname, basename) || vtContext.currentLocation.pathname;\n let nextPath = stripBasename(vtContext.nextLocation.pathname, basename) || vtContext.nextLocation.pathname;\n return matchPath(path.pathname, nextPath) != null || matchPath(path.pathname, currentPath) != null;\n}\n\n// lib/dom/server.tsx\nimport * as React11 from \"react\";\nfunction StaticRouter({\n basename,\n children,\n location: locationProp = \"/\"\n}) {\n if (typeof locationProp === \"string\") {\n locationProp = parsePath(locationProp);\n }\n let action = \"POP\" /* Pop */;\n let location = {\n pathname: locationProp.pathname || \"/\",\n search: locationProp.search || \"\",\n hash: locationProp.hash || \"\",\n state: locationProp.state != null ? locationProp.state : null,\n key: locationProp.key || \"default\",\n mask: void 0\n };\n let staticNavigator = getStatelessNavigator();\n return /* @__PURE__ */ React11.createElement(\n Router,\n {\n basename,\n children,\n location,\n navigationType: action,\n navigator: staticNavigator,\n static: true,\n useTransitions: false\n }\n );\n}\nfunction StaticRouterProvider({\n context,\n router,\n hydrate: hydrate2 = true,\n nonce\n}) {\n invariant(\n router && context,\n \"You must provide `router` and `context` to <StaticRouterProvider>\"\n );\n let dataRouterContext = {\n router,\n navigator: getStatelessNavigator(),\n static: true,\n staticContext: context,\n basename: context.basename || \"/\"\n };\n let fetchersContext = /* @__PURE__ */ new Map();\n let hydrateScript = \"\";\n if (hydrate2 !== false) {\n let data2 = {\n loaderData: context.loaderData,\n actionData: context.actionData,\n errors: serializeErrors(context.errors)\n };\n let json = escapeHtml(JSON.stringify(JSON.stringify(data2)));\n hydrateScript = `window.__staticRouterHydrationData = JSON.parse(${json});`;\n }\n let { state } = dataRouterContext.router;\n return /* @__PURE__ */ React11.createElement(React11.Fragment, null, /* @__PURE__ */ React11.createElement(DataRouterContext.Provider, { value: dataRouterContext }, /* @__PURE__ */ React11.createElement(DataRouterStateContext.Provider, { value: state }, /* @__PURE__ */ React11.createElement(FetchersContext.Provider, { value: fetchersContext }, /* @__PURE__ */ React11.createElement(ViewTransitionContext.Provider, { value: { isTransitioning: false } }, /* @__PURE__ */ React11.createElement(\n Router,\n {\n basename: dataRouterContext.basename,\n location: state.location,\n navigationType: state.historyAction,\n navigator: dataRouterContext.navigator,\n static: dataRouterContext.static,\n useTransitions: false\n },\n /* @__PURE__ */ React11.createElement(\n DataRoutes2,\n {\n manifest: router.manifest,\n routes: router.routes,\n future: router.future,\n state,\n isStatic: true\n }\n )\n ))))), hydrateScript ? /* @__PURE__ */ React11.createElement(\n \"script\",\n {\n suppressHydrationWarning: true,\n nonce,\n dangerouslySetInnerHTML: { __html: hydrateScript }\n }\n ) : null);\n}\nfunction serializeErrors(errors) {\n if (!errors) return null;\n let entries = Object.entries(errors);\n let serialized = {};\n for (let [key, val] of entries) {\n if (isRouteErrorResponse(val)) {\n serialized[key] = { ...val, __type: \"RouteErrorResponse\" };\n } else if (val instanceof Error) {\n serialized[key] = {\n message: val.message,\n __type: \"Error\",\n // If this is a subclass (i.e., ReferenceError), send up the type so we\n // can re-create the same type during hydration.\n ...val.name !== \"Error\" ? {\n __subType: val.name\n } : {}\n };\n } else {\n serialized[key] = val;\n }\n }\n return serialized;\n}\nfunction getStatelessNavigator() {\n return {\n createHref,\n encodeLocation,\n push(to) {\n throw new Error(\n `You cannot use navigator.push() on the server because it is a stateless environment. This error was probably triggered when you did a \\`navigate(${JSON.stringify(to)})\\` somewhere in your app.`\n );\n },\n replace(to) {\n throw new Error(\n `You cannot use navigator.replace() on the server because it is a stateless environment. This error was probably triggered when you did a \\`navigate(${JSON.stringify(to)}, { replace: true })\\` somewhere in your app.`\n );\n },\n go(delta) {\n throw new Error(\n `You cannot use navigator.go() on the server because it is a stateless environment. This error was probably triggered when you did a \\`navigate(${delta})\\` somewhere in your app.`\n );\n },\n back() {\n throw new Error(\n `You cannot use navigator.back() on the server because it is a stateless environment.`\n );\n },\n forward() {\n throw new Error(\n `You cannot use navigator.forward() on the server because it is a stateless environment.`\n );\n }\n };\n}\nfunction createStaticHandler2(routes, opts) {\n return createStaticHandler(routes, {\n ...opts,\n mapRouteProperties\n });\n}\nfunction createStaticRouter(routes, context, opts = {}) {\n let manifest = {};\n let dataRoutes = convertRoutesToDataRoutes(\n routes,\n mapRouteProperties,\n void 0,\n manifest\n );\n let matches = context.matches.map((match) => {\n let route = manifest[match.route.id] || match.route;\n return {\n ...match,\n route\n };\n });\n let msg = (method) => `You cannot use router.${method}() on the server because it is a stateless environment`;\n return {\n get basename() {\n return context.basename;\n },\n get future() {\n return {\n v8_middleware: false,\n v8_passThroughRequests: false,\n v8_trailingSlashAwareDataRequests: false,\n ...opts?.future\n };\n },\n get state() {\n return {\n historyAction: \"POP\" /* Pop */,\n location: context.location,\n matches,\n loaderData: context.loaderData,\n actionData: context.actionData,\n errors: context.errors,\n initialized: true,\n renderFallback: false,\n navigation: IDLE_NAVIGATION,\n restoreScrollPosition: null,\n preventScrollReset: false,\n revalidation: \"idle\",\n fetchers: /* @__PURE__ */ new Map(),\n blockers: /* @__PURE__ */ new Map()\n };\n },\n get routes() {\n return dataRoutes;\n },\n get branches() {\n return opts.branches;\n },\n get manifest() {\n return manifest;\n },\n get window() {\n return void 0;\n },\n initialize() {\n throw msg(\"initialize\");\n },\n subscribe() {\n throw msg(\"subscribe\");\n },\n enableScrollRestoration() {\n throw msg(\"enableScrollRestoration\");\n },\n navigate() {\n throw msg(\"navigate\");\n },\n fetch() {\n throw msg(\"fetch\");\n },\n revalidate() {\n throw msg(\"revalidate\");\n },\n createHref,\n encodeLocation,\n getFetcher() {\n return IDLE_FETCHER;\n },\n deleteFetcher() {\n throw msg(\"deleteFetcher\");\n },\n resetFetcher() {\n throw msg(\"resetFetcher\");\n },\n dispose() {\n throw msg(\"dispose\");\n },\n getBlocker() {\n return IDLE_BLOCKER;\n },\n deleteBlocker() {\n throw msg(\"deleteBlocker\");\n },\n patchRoutes() {\n throw msg(\"patchRoutes\");\n },\n _internalFetchControllers: /* @__PURE__ */ new Map(),\n _internalSetRoutes() {\n throw msg(\"_internalSetRoutes\");\n },\n _internalSetStateDoNotUseOrYouWillBreakYourApp() {\n throw msg(\"_internalSetStateDoNotUseOrYouWillBreakYourApp\");\n }\n };\n}\nfunction createHref(to) {\n return typeof to === \"string\" ? to : createPath(to);\n}\nfunction encodeLocation(to) {\n let href = typeof to === \"string\" ? to : createPath(to);\n href = href.replace(/ $/, \"%20\");\n let encoded = ABSOLUTE_URL_REGEX.test(href) ? new URL(href) : new URL(href, \"http://localhost\");\n return {\n pathname: encoded.pathname,\n search: encoded.search,\n hash: encoded.hash\n };\n}\n\nexport {\n PROTOCOL_RELATIVE_URL_REGEX,\n Action,\n createMemoryHistory,\n createBrowserHistory,\n createHashHistory,\n invariant,\n createPath,\n parsePath,\n createContext,\n RouterContextProvider,\n convertRoutesToDataRoutes,\n matchRoutes,\n matchRoutesImpl,\n generatePath,\n matchPath,\n stripBasename,\n resolvePath,\n data,\n redirect,\n redirectDocument,\n replace,\n ErrorResponseImpl,\n isRouteErrorResponse,\n instrumentHandler,\n validateNavigationTarget,\n IDLE_NAVIGATION,\n IDLE_FETCHER,\n IDLE_BLOCKER,\n createRouter,\n createStaticHandler,\n getStaticContextFromError,\n hasInvalidProtocol,\n isDataWithResponseInit,\n isResponse,\n isRedirectStatusCode,\n isRedirectResponse,\n isMutationMethod,\n DataRouterContext,\n DataRouterStateContext,\n RSCRouterContext,\n ViewTransitionContext,\n FetchersContext,\n AwaitContextProvider,\n NavigationContext,\n LocationContext,\n RouteContext,\n ENABLE_DEV_WARNINGS,\n decodeRedirectErrorDigest,\n decodeRouteErrorResponseDigest,\n useHref,\n useInRouterContext,\n useLocation,\n useNavigationType,\n useMatch,\n useNavigate,\n useOutletContext,\n useOutlet,\n useParams,\n useResolvedPath,\n useRoutes,\n useNavigation,\n useRevalidator,\n useMatches,\n useLoaderData,\n useRouteLoaderData,\n useActionData,\n useRouteError,\n useAsyncValue,\n useAsyncError,\n useBlocker,\n useRoute,\n useRouterState,\n warnOnce,\n mapRouteProperties,\n hydrationRouteProperties,\n createMemoryRouter,\n RouterProvider,\n MemoryRouter,\n Navigate,\n Outlet,\n Route,\n Router,\n Routes,\n Await,\n createRoutesFromChildren,\n createRoutesFromElements,\n renderMatches,\n WithComponentProps,\n withComponentProps,\n WithHydrateFallbackProps,\n withHydrateFallbackProps,\n WithErrorBoundaryProps,\n withErrorBoundaryProps,\n createSearchParams,\n escapeHtml,\n escapeAttribute,\n encode,\n createRequestInit,\n SingleFetchRedirectSymbol,\n SINGLE_FETCH_REDIRECT_STATUS,\n NO_BODY_STATUS_CODES,\n StreamTransfer,\n getTurboStreamSingleFetchDataStrategy,\n getSingleFetchDataStrategyImpl,\n stripIndexParam,\n singleFetchUrl,\n decodeViaTurboStream,\n RemixErrorBoundary,\n createServerRoutes,\n createClientRoutesWithHMRRevalidationOptOut,\n noActionDefinedError,\n createClientRoutes,\n shouldHydrateRouteLoader,\n URL_LIMIT,\n getPathsWithAncestors,\n getPatchRoutesOnNavigationFunction,\n useFogOFWarDiscovery,\n getManifestPath,\n FrameworkContext,\n CRITICAL_CSS_DATA_ATTRIBUTE,\n Links,\n PrefetchPageLinks,\n Meta,\n setIsHydrated,\n Scripts,\n createBrowserRouter,\n createHashRouter,\n BrowserRouter,\n HashRouter,\n HistoryRouter,\n Link,\n NavLink,\n Form,\n ScrollRestoration,\n useLinkClickHandler,\n useSearchParams,\n useSubmit,\n useFormAction,\n useFetcher,\n useFetchers,\n useScrollRestoration,\n useBeforeUnload,\n usePrompt,\n useViewTransitionState,\n StaticRouter,\n StaticRouterProvider,\n createStaticHandler2,\n createStaticRouter\n};\n","/**\n * app/nav-config.ts — single source of truth for navigation hierarchy.\n * routes.tsx, components/layout/Sidebar.tsx, and the command palette all\n * read this one list rather than each maintaining their own — the audit\n * that kicked this rebuild off found 14 flat, ~70%-overlapping hash links\n * because the old app had no such shared structure. Add a route here once;\n * it shows up in the sidebar AND ⌘K automatically.\n *\n * Only `overview` has a real view wired up (FleetDashboardView — the\n * foundation's reference implementation). Every other leaf renders\n * <PlaceholderView/> until another agent builds it; see routes.tsx.\n */\n\nexport interface NavLeaf {\n path: string;\n label: string;\n description: string;\n /** Present once a real view exists; routes.tsx falls back to a placeholder otherwise. */\n implemented?: boolean;\n}\n\nexport interface NavGroup {\n id: string;\n label: string;\n leaves: NavLeaf[];\n}\n\nexport const NAV_GROUPS: NavGroup[] = [\n {\n id: 'overview',\n label: 'Overview',\n leaves: [\n {\n path: '/overview',\n label: 'Fleet Dashboard',\n description: 'Repos, activity, runs, swarms, MCP health, genome, and daemon status at a glance.',\n implemented: true,\n },\n {\n path: '/agent-os',\n label: 'Agent OS',\n description: 'Authenticated, observation-only decision spine for capability runway and value bets.',\n implemented: true,\n },\n {\n path: '/universe',\n label: 'Universe',\n description: 'Compare experiments, follow variant lineages, and inspect the retained population.',\n implemented: true,\n },\n ],\n },\n {\n id: 'journal',\n label: 'Journal',\n leaves: [\n {\n path: '/journal',\n label: 'Work Journal',\n description:\n 'Chronological, filterable, scrubable record of runs, merges, judge verdicts, and daemon ticks — with live streaming into any in-progress run.',\n implemented: true,\n },\n ],\n },\n {\n id: 'work',\n label: 'Work',\n leaves: [\n {\n path: '/work/runs',\n label: 'Runs',\n description: 'Dispatched goal runs and their token burn.',\n implemented: true,\n },\n {\n path: '/work/swarms',\n label: 'Swarms',\n description: 'Multi-task DAG runs with live burndown.',\n implemented: true,\n },\n ],\n },\n {\n id: 'inbox',\n label: 'Inbox',\n leaves: [\n {\n path: '/inbox',\n label: 'Proposals',\n description: 'Review, filter, and approve/reject proposals — including history (rejected/approved).',\n implemented: true,\n },\n ],\n },\n {\n id: 'control',\n label: 'Control',\n leaves: [\n {\n path: '/control/daemon',\n label: 'Daemon',\n description: 'Autonomous operator state, spend, and direction mode.',\n implemented: true,\n },\n {\n path: '/control/fleet',\n label: 'Fleet',\n description: 'Queue depth, lease health, and the kill switch.',\n implemented: true,\n },\n {\n path: '/control/security',\n label: 'Security',\n description: 'Supply-chain / binshield findings from the cached backlog.',\n implemented: true,\n },\n ],\n },\n {\n id: 'intelligence',\n label: 'Intelligence',\n leaves: [\n {\n path: '/intelligence/pulse',\n label: 'Pulse',\n description: 'Activity rollups over the dashboard window.',\n implemented: true,\n },\n {\n path: '/intelligence/genome',\n label: 'Genome',\n description: 'Cross-repo knowledge search and recall.',\n implemented: true,\n },\n {\n path: '/intelligence/production',\n label: 'Production',\n description: 'Ships-per-day, judge verdicts, auto-merges.',\n implemented: true,\n },\n ],\n },\n {\n id: 'portfolio',\n label: 'Portfolio',\n leaves: [\n {\n path: '/portfolio',\n label: 'Portfolio',\n description: 'Org-level roll-up across enrolled repos.',\n implemented: true,\n },\n ],\n },\n {\n id: 'goals',\n label: 'Goals',\n leaves: [\n { path: '/goals', label: 'Goals', description: 'Active goals and milestone progress.', implemented: true },\n ],\n },\n];\n\nexport const ALL_NAV_LEAVES: NavLeaf[] = NAV_GROUPS.flatMap((g) => g.leaves);\n","/**\n * components/layout/Sidebar.tsx — grouped, hierarchical nav (foundation\n * brief item 3), reading NAV_GROUPS from app/nav-config.ts so it can never\n * drift from what the command palette offers.\n */\nimport { NavLink } from 'react-router-dom';\nimport { NAV_GROUPS } from '../../app/nav-config.js';\nimport styles from './Sidebar.module.css';\n\nexport function Sidebar() {\n return (\n <nav className={styles.sidebar} aria-label=\"Primary\">\n <div className={styles.brand}>\n <span className={styles.brandMark} aria-hidden=\"true\">\n ▲\n </span>\n <span className={styles.brandName}>ashlr</span>\n </div>\n {NAV_GROUPS.map((group) => (\n <div key={group.id} className={styles.group}>\n <h2 className={styles.groupLabel}>{group.label}</h2>\n <ul className={styles.leaves}>\n {group.leaves.map((leaf) => (\n <li key={leaf.path}>\n <NavLink\n to={leaf.path}\n className={({ isActive }) => `${styles.link} ${isActive ? styles.active : ''}`}\n >\n {leaf.label}\n {!leaf.implemented ? <span className={styles.soon}>soon</span> : null}\n </NavLink>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n );\n}\n","/**\n * components/notifications/deriveNotifications.ts — pure, framework-free\n * transform from the backend snapshots the app already fetches into the\n * attention queue the notification centre shows. No React, no fetch, no\n * timers here — trivially unit-testable, matching the split cache.ts /\n * auth-store.ts already use for framework-free stores.\n *\n * Every rule below is grounded in a field the fleet already computes,\n * per the build brief: `fleet.nextActions` / `fleet.autonomousShipReadiness`\n * are the exact data the legacy dashboard's \"Needs you\" deck reads\n * (buildOperatorBriefingModel, public/app.js:7438-7494); `control.security`\n * and `control.limits` are existing Mission Control sections; run failures\n * and the pending-proposal backlog come from resources every other view\n * already fetches (`runsQuery`, `inboxQuery`). Nothing here invents new\n * backend computation — it only re-prioritizes what already exists into one\n * queue instead of requiring the operator to notice it across five tabs.\n */\nimport type { ControlSnapshot, FleetStatus, RunState } from '../../data/api-types.js';\nimport type { InboxProposal } from '../../data/queries.js';\nimport type { AppNotification, NotificationSeverity } from './types.js';\n\nexport interface DeriveInputs {\n control?: ControlSnapshot;\n fleet?: FleetStatus;\n runs?: RunState[];\n inbox?: { pending: number; proposals: InboxProposal[] };\n}\n\n/** A running run with no observed update for this long is worth flagging\n * even if nobody has the live stream open watching it — this is what makes\n * \"what happened overnight\" catch a wedged 3am run instead of requiring the\n * operator to have been staring at a stream panel when it stalled. */\nconst RUN_STALL_NOTIFY_MS = 3 * 60 * 1000;\n/** A pending proposal sitting this long escalates from medium to high. */\nconst PROPOSAL_BACKLOG_ESCALATE_MS = 2 * 60 * 60 * 1000;\n/** A failed/aborted run older than this is history, not something that\n * still \"needs you\" right now — see the run-failure rule below. */\nconst RUN_FAILURE_NOTIFY_WINDOW_MS = 24 * 60 * 60 * 1000;\n\nfunction fleetActionHref(id: string): string {\n const lower = id.toLowerCase();\n if (lower.includes('proposal') || lower.includes('inbox')) return '/inbox';\n if (lower.includes('security') || lower.includes('audit')) return '/control/security';\n if (lower.includes('evidence') || lower.includes('fleet') || lower.includes('queue')) return '/control/fleet';\n return '/control/daemon';\n}\n\nexport function deriveNotifications(input: DeriveInputs): AppNotification[] {\n const out: AppNotification[] = [];\n const now = Date.now();\n\n // ── 1. fleet.nextActions — the fleet's own priority-ranked to-do list. ──\n for (const action of input.fleet?.nextActions ?? []) {\n out.push({\n id: `next-action-${action.id}`,\n category: 'action-required',\n severity: action.priority,\n title: action.label,\n detail: action.detail,\n ts: new Date(now).toISOString(),\n actionHref: fleetActionHref(action.id),\n actionLabel: 'Inspect',\n });\n }\n\n // ── 2. Autonomous ship readiness — blocked/unknown verdicts. ──\n const readiness = input.fleet?.autonomousShipReadiness;\n if (readiness) {\n if (readiness.verdict === 'blocked' && readiness.topBlocker) {\n out.push({\n id: `readiness-blocked-${readiness.topBlocker.id}`,\n category: 'readiness',\n severity: readiness.topBlocker.severity,\n title: 'Autonomous readiness is blocked',\n detail: readiness.topBlocker.detail,\n ts: readiness.freshness.generatedAt,\n actionHref: '/control/fleet',\n actionLabel: 'Inspect fleet',\n });\n } else if (readiness.verdict === 'unknown') {\n out.push({\n id: 'readiness-unknown',\n category: 'readiness',\n severity: 'medium',\n title: 'Autonomous readiness is unknown',\n detail: 'Fresh, authoritative state is required before autonomous operation can be treated as clear.',\n ts: readiness.freshness.generatedAt,\n actionHref: '/control/fleet',\n actionLabel: 'Inspect fleet',\n });\n }\n }\n\n // ── 3. Security findings. ──\n const security = input.control?.security;\n if (security?.available) {\n if (security.counts.critical > 0) {\n const top = security.findings.find((f) => f.severity === 'critical');\n out.push({\n id: 'security-critical',\n category: 'security',\n severity: 'critical',\n title: `${security.counts.critical} critical security finding${security.counts.critical === 1 ? '' : 's'}`,\n detail: top ? `${top.repo}: ${top.title}` : 'See the security backlog for details.',\n ts: new Date(now).toISOString(),\n actionHref: '/control/security',\n actionLabel: 'Review findings',\n });\n } else if (security.counts.high > 0) {\n const top = security.findings.find((f) => f.severity === 'high');\n out.push({\n id: 'security-high',\n category: 'security',\n severity: 'high',\n title: `${security.counts.high} high-severity security finding${security.counts.high === 1 ? '' : 's'}`,\n detail: top ? `${top.repo}: ${top.title}` : 'See the security backlog for details.',\n ts: new Date(now).toISOString(),\n actionHref: '/control/security',\n actionLabel: 'Review findings',\n });\n }\n }\n\n // ── 4. Budget / rate limits. ──\n for (const limit of input.control?.limits ?? []) {\n if (limit.standing === 'over') {\n out.push({\n id: `budget-over-${limit.backend}-${limit.window}`,\n category: 'budget',\n severity: 'high',\n title: `${limit.backend} is over its ${limit.window} limit`,\n detail: `${limit.used.toLocaleString()} / ${limit.max.toLocaleString()} used.`,\n ts: new Date(now).toISOString(),\n actionHref: '/control/daemon',\n actionLabel: 'Review usage',\n });\n } else if (limit.standing === 'warn') {\n out.push({\n id: `budget-warn-${limit.backend}-${limit.window}`,\n category: 'budget',\n severity: 'medium',\n title: `${limit.backend} is approaching its ${limit.window} limit`,\n detail: `${limit.used.toLocaleString()} / ${limit.max.toLocaleString()} used.`,\n ts: new Date(now).toISOString(),\n actionHref: '/control/daemon',\n actionLabel: 'Review usage',\n });\n }\n }\n\n // ── 5. Daemon health — the source itself being degraded is actionable. ──\n const daemon = input.control?.daemon;\n if (daemon && (daemon.sourceQuality.sourceState !== 'healthy' || daemon.sourceQuality.complete === false)) {\n const reason = daemon.sourceQuality.reason;\n out.push({\n id: 'daemon-health-degraded',\n category: 'daemon-health',\n severity: reason === 'missing' || reason === 'unavailable' ? 'high' : 'medium',\n title: 'Daemon state cannot be confirmed',\n detail: reason ? `Source: ${reason}.` : 'The daemon state source is degraded or incomplete.',\n ts: new Date(now).toISOString(),\n actionHref: '/control/daemon',\n actionLabel: 'Inspect daemon',\n sourceQuality: daemon.sourceQuality,\n });\n }\n\n // ── 6. Pending-proposal backlog. ──\n if (input.inbox && input.inbox.pending > 0) {\n const oldest = input.inbox.proposals.reduce<number | null>((min, p) => {\n const t = new Date(p.createdAt).getTime();\n return min === null || t < min ? t : min;\n }, null);\n const ageMs = oldest !== null ? now - oldest : 0;\n const severity: NotificationSeverity = ageMs > PROPOSAL_BACKLOG_ESCALATE_MS ? 'high' : 'medium';\n out.push({\n id: 'proposal-backlog',\n category: 'proposal',\n severity,\n title: `${input.inbox.pending} proposal${input.inbox.pending === 1 ? '' : 's'} awaiting review`,\n detail:\n ageMs > PROPOSAL_BACKLOG_ESCALATE_MS\n ? `Oldest has been waiting ${Math.round(ageMs / (60 * 60 * 1000))}h.`\n : 'Approve, reject, or leave for autonomous handling per policy.',\n ts: oldest !== null ? new Date(oldest).toISOString() : new Date(now).toISOString(),\n actionHref: '/inbox',\n actionLabel: 'Open inbox',\n });\n }\n\n // ── 7. Run failures (recent window only) and silent stalls. ──\n // `runs` is a plain last-200 list with no recency filter server-side — on\n // a real fleet that easily spans weeks (verified live against an\n // operator's actual `ashlr serve`: /api/runs returned runs from three\n // weeks earlier). Without a window, every historical failure would sit in\n // the attention queue forever, which is exactly the \"nag\" the\n // non-negotiables rule out. Old failures are still fully visible in the\n // Work Journal (its whole point is unbounded-by-recency history) — the\n // notification centre only surfaces ones recent enough to plausibly still\n // need a human's attention.\n for (const run of input.runs ?? []) {\n if (run.status === 'failed' || run.status === 'aborted') {\n if (now - new Date(run.updatedAt).getTime() > RUN_FAILURE_NOTIFY_WINDOW_MS) continue;\n out.push({\n id: `run-failed-${run.id}`,\n category: 'run',\n severity: run.status === 'failed' ? 'high' : 'medium',\n title: `Run ${run.status}: ${run.goal}`,\n detail: run.result ?? run.terminationReason ?? `Run ${run.id} ${run.status}.`,\n ts: run.updatedAt,\n actionHref: `/work/runs/${run.id}`,\n actionLabel: 'Open run',\n });\n continue;\n }\n if (run.status === 'running') {\n const age = now - new Date(run.updatedAt).getTime();\n if (age > RUN_STALL_NOTIFY_MS) {\n out.push({\n id: `run-stalled-${run.id}`,\n category: 'run',\n severity: 'medium',\n title: `No update from a running run in ${Math.round(age / 60_000)}m`,\n detail: run.goal,\n ts: run.updatedAt,\n actionHref: `/work/runs/${run.id}`,\n actionLabel: 'Watch live',\n });\n }\n }\n }\n\n return out;\n}\n\n/** Sort worst-first, then most-recent-first within a severity band —\n * matches SEVERITY_ORDER so the list reads top-to-bottom as \"most urgent\n * first\" the same way everywhere it's rendered. */\nexport function sortNotifications(items: AppNotification[]): AppNotification[] {\n const rank: Record<NotificationSeverity, number> = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };\n return [...items].sort((a, b) => {\n const s = rank[a.severity] - rank[b.severity];\n if (s !== 0) return s;\n return new Date(b.ts).getTime() - new Date(a.ts).getTime();\n });\n}\n","/**\n * components/notifications/notification-store.ts — the framework-free store\n * behind the notification centre, following the same\n * plain-module-plus-useSyncExternalStore split as data/cache.ts and\n * data/auth-store.ts (no React import here; only the hook file bridges it).\n *\n * Responsibilities beyond just holding a list:\n * - Dedupe: `reconcile()` is keyed by `AppNotification.id`. Re-deriving\n * the same active issue updates it in place; an id that stops appearing\n * means the underlying issue resolved, and it's dropped silently — no\n * \"resolved!\" spam.\n * - Mute: per-category, persisted to localStorage (a UI preference, not a\n * secret — same class of persistence as the theme toggle).\n * - Throttle for the OS Notification API: a real desktop notification only\n * fires for an id the store has never seen before, at critical/high\n * severity, in an unmuted category, while permission is granted — never\n * once per poll for a still-active issue.\n */\nimport type { AppNotification, NotificationCategory } from './types.js';\nimport { sortNotifications } from './deriveNotifications.js';\n\nconst MUTE_STORAGE_KEY = 'ashlr.notifications.mutedCategories.v1'; // gitleaks:allow -- public preference key\nconst DESKTOP_PREF_STORAGE_KEY = 'ashlr.notifications.desktopEnabled.v1';\n\nexport type DesktopPermission = 'unsupported' | 'default' | 'granted' | 'denied';\n\ninterface NotificationStoreState {\n items: AppNotification[];\n panelOpen: boolean;\n mutedCategories: NotificationCategory[];\n desktopEnabled: boolean;\n desktopPermission: DesktopPermission;\n}\n\nfunction loadMuted(): Set<NotificationCategory> {\n try {\n const raw = localStorage.getItem(MUTE_STORAGE_KEY);\n if (!raw) return new Set();\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) return new Set(parsed as NotificationCategory[]);\n } catch {\n /* best-effort */\n }\n return new Set();\n}\n\nfunction saveMuted(muted: Set<NotificationCategory>): void {\n try {\n localStorage.setItem(MUTE_STORAGE_KEY, JSON.stringify([...muted]));\n } catch {\n /* best-effort */\n }\n}\n\nfunction loadDesktopPref(): boolean {\n try {\n return localStorage.getItem(DESKTOP_PREF_STORAGE_KEY) === '1';\n } catch {\n return false;\n }\n}\n\nfunction currentDesktopPermission(): DesktopPermission {\n if (typeof Notification === 'undefined') return 'unsupported';\n return Notification.permission as DesktopPermission;\n}\n\nconst mutedCategories = loadMuted();\nlet allItems: AppNotification[] = [];\nlet panelOpen = false;\nlet desktopEnabled = loadDesktopPref();\nconst everSeenIds = new Set<string>();\n\nlet state: NotificationStoreState = {\n items: [],\n panelOpen: false,\n mutedCategories: [...mutedCategories],\n desktopEnabled,\n desktopPermission: currentDesktopPermission(),\n};\n\nconst listeners = new Set<() => void>();\nfunction emit(): void {\n for (const l of listeners) l();\n}\n\nfunction recompute(): void {\n const visible = sortNotifications(allItems.filter((n) => !mutedCategories.has(n.category)));\n state = {\n items: visible,\n panelOpen,\n mutedCategories: [...mutedCategories],\n desktopEnabled,\n desktopPermission: currentDesktopPermission(),\n };\n emit();\n}\n\nexport function subscribeNotifications(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function getNotificationSnapshot(): NotificationStoreState {\n return state;\n}\n\n/**\n * Replace the full derived set for this poll cycle. Fires a throttled\n * desktop notification for any id that is BOTH new (never seen before in\n * this tab) and unmuted critical/high — never for an id already active.\n */\nexport function reconcileNotifications(derived: AppNotification[]): void {\n const previousIds = new Set(allItems.map((n) => n.id));\n allItems = derived;\n\n if (desktopEnabled && currentDesktopPermission() === 'granted') {\n for (const n of derived) {\n if (mutedCategories.has(n.category)) continue;\n if (n.severity !== 'critical' && n.severity !== 'high') continue;\n if (previousIds.has(n.id) || everSeenIds.has(n.id)) continue;\n everSeenIds.add(n.id);\n try {\n void new Notification(n.title, { body: n.detail, tag: n.id });\n } catch {\n /* best-effort — some browsers throw outside a user gesture context */\n }\n }\n }\n for (const n of derived) everSeenIds.add(n.id);\n\n recompute();\n}\n\nexport function openPanel(): void {\n panelOpen = true;\n recompute();\n}\n\nexport function closePanel(): void {\n panelOpen = false;\n recompute();\n}\n\nexport function togglePanel(): void {\n panelOpen = !panelOpen;\n recompute();\n}\n\nexport function isMuted(category: NotificationCategory): boolean {\n return mutedCategories.has(category);\n}\n\nexport function setMuted(category: NotificationCategory, muted: boolean): void {\n if (muted) mutedCategories.add(category);\n else mutedCategories.delete(category);\n saveMuted(mutedCategories);\n recompute();\n}\n\nexport async function enableDesktopNotifications(): Promise<DesktopPermission> {\n if (typeof Notification === 'undefined') return 'unsupported';\n let permission = Notification.permission as DesktopPermission;\n if (permission === 'default') {\n permission = (await Notification.requestPermission()) as DesktopPermission;\n }\n desktopEnabled = permission === 'granted';\n try {\n localStorage.setItem(DESKTOP_PREF_STORAGE_KEY, desktopEnabled ? '1' : '0');\n } catch {\n /* best-effort */\n }\n recompute();\n return permission;\n}\n\nexport function disableDesktopNotifications(): void {\n desktopEnabled = false;\n try {\n localStorage.setItem(DESKTOP_PREF_STORAGE_KEY, '0');\n } catch {\n /* best-effort */\n }\n recompute();\n}\n\n/** Test-only: reset all module-level state between test files. */\nexport function __resetNotificationStoreForTests(): void {\n allItems = [];\n panelOpen = false;\n desktopEnabled = false;\n mutedCategories.clear();\n everSeenIds.clear();\n recompute();\n}\n","/**\n * components/notifications/useNotifications.ts — the only file in this\n * subtree that imports React, bridging notification-store.ts's plain\n * external store the same way data/hooks.ts bridges cache.ts/auth-store.ts.\n */\nimport { useSyncExternalStore } from 'react';\nimport { getNotificationSnapshot, subscribeNotifications } from './notification-store.js';\n\nexport function useNotifications() {\n return useSyncExternalStore(subscribeNotifications, getNotificationSnapshot, getNotificationSnapshot);\n}\n","/**\n * components/notifications/NotificationBell.tsx — the persistent, global\n * entry point into the attention queue (mounted in Topbar so it's reachable\n * from every view, not just one page — \"interject at any moment\" per the\n * build brief). Purely presentational + store-toggling; the actual engine\n * runs inside <NotificationCenter/> regardless of open state.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { useNotifications } from './useNotifications.js';\nimport { togglePanel } from './notification-store.js';\nimport styles from './NotificationBell.module.css';\n\nexport function NotificationBell() {\n const { items } = useNotifications();\n const urgent = items.filter((n) => n.severity === 'critical' || n.severity === 'high').length;\n const total = items.length;\n\n // The badge count updates live in the background (the engine runs\n // regardless of panel-open state) but the badge itself is aria-hidden and\n // the button's accessible name only reflects the *current* count, not the\n // fact that it changed — a screen-reader user had no way to learn a new\n // urgent item arrived without re-focusing the bell. This announces the\n // delta, once, only on an increase (never on read/mute-driven decreases,\n // which aren't \"you should look now\" events).\n const prevUrgentRef = useRef(urgent);\n const [announcement, setAnnouncement] = useState('');\n useEffect(() => {\n if (urgent > prevUrgentRef.current) {\n const delta = urgent - prevUrgentRef.current;\n setAnnouncement(`${delta} new urgent notification${delta === 1 ? '' : 's'}, ${urgent} urgent total.`);\n }\n prevUrgentRef.current = urgent;\n }, [urgent]);\n\n return (\n <>\n <button\n type=\"button\"\n className={styles.bell}\n onClick={togglePanel}\n aria-haspopup=\"dialog\"\n aria-label={total === 0 ? 'Notifications, none open' : `Notifications, ${total} open, ${urgent} urgent`}\n >\n <span aria-hidden=\"true\">🔔</span>\n {total > 0 ? (\n <span className={`${styles.badge} ${urgent > 0 ? styles.badgeUrgent : ''}`} aria-hidden=\"true\">\n {total > 99 ? '99+' : total}\n </span>\n ) : null}\n </button>\n <div aria-live=\"polite\" className=\"visually-hidden\">\n {announcement}\n </div>\n </>\n );\n}\n","/**\n * components/notifications/types.ts — the notification centre's own vocab.\n *\n * Severity deliberately reuses `FleetNextAction.priority`'s four-level scale\n * (`critical | high | medium | low`, src/core/fleet/status.ts:455-462) plus\n * one addition, `info`, for passive/no-action items — this is the SAME\n * scale the legacy dashboard's \"Needs you\" deck already computes\n * (buildOperatorBriefingModel in public/app.js), reused per the build brief\n * rather than inventing a parallel one. `severityToTone` below maps it onto\n * the app-wide `StatusBadge` tone vocabulary so a notification's color never\n * disagrees with what the same severity means anywhere else in the UI.\n */\nimport type { Tone } from '../primitives/StatusBadge.js';\nimport type { SourceQuality } from '../../data/api-types.js';\n\nexport type NotificationSeverity = 'critical' | 'high' | 'medium' | 'low' | 'info';\n\nexport const SEVERITY_ORDER: NotificationSeverity[] = ['critical', 'high', 'medium', 'low', 'info'];\n\nexport function severityToTone(severity: NotificationSeverity): Tone {\n switch (severity) {\n case 'critical':\n return 'danger';\n case 'high':\n return 'warning';\n case 'medium':\n return 'running';\n case 'low':\n return 'neutral';\n case 'info':\n return 'info';\n }\n}\n\nexport type NotificationCategory =\n | 'action-required'\n | 'readiness'\n | 'security'\n | 'budget'\n | 'daemon-health'\n | 'proposal'\n | 'run'\n | 'log-source';\n\nexport const NOTIFICATION_CATEGORY_LABEL: Record<NotificationCategory, string> = {\n 'action-required': 'Action required',\n readiness: 'Autonomous readiness',\n security: 'Security',\n budget: 'Budget & limits',\n 'daemon-health': 'Daemon health',\n proposal: 'Proposals',\n run: 'Runs',\n 'log-source': 'Log source',\n};\n\nexport interface AppNotification {\n /** Stable per-underlying-issue id (e.g. `run-failed-r_123`) — re-deriving\n * with the same id updates the existing entry in place instead of\n * duplicating it; the id disappearing from a fresh derive means the\n * underlying issue resolved, and the store retires it automatically. */\n id: string;\n category: NotificationCategory;\n severity: NotificationSeverity;\n title: string;\n detail: string;\n /** ISO timestamp of the underlying event, when known; falls back to first-seen. */\n ts: string;\n /** Hash-router path to jump straight to the relevant view. */\n actionHref?: string;\n actionLabel?: string;\n /** Present when the notification is itself ABOUT degraded/unknown source\n * data (e.g. \"daemon state unknown\") — distinct from Epistemic's per-field\n * withholding, this is the notification centre surfacing the gap as an\n * actionable \"go check\" item rather than staying silent about it. */\n sourceQuality?: SourceQuality;\n}\n","/**\n * components/notifications/NotificationItem.tsx — one row in the attention\n * queue: severity, what it's about, why, and a direct action — plus a\n * mute-this-category control so an operator drowning in one noisy category\n * can quiet it without losing the rest (non-negotiable: never nag).\n */\nimport { Epistemic } from '../primitives/Epistemic.js';\nimport { StatusBadge } from '../primitives/StatusBadge.js';\nimport { severityToTone, NOTIFICATION_CATEGORY_LABEL, type AppNotification } from './types.js';\nimport { isMuted, setMuted } from './notification-store.js';\nimport styles from './NotificationItem.module.css';\n\nfunction formatRelative(iso: string): string {\n const seconds = Math.max(0, Math.round((Date.now() - new Date(iso).getTime()) / 1000));\n if (seconds < 5) return 'just now';\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.round(minutes / 60);\n if (hours < 48) return `${hours}h ago`;\n return `${Math.round(hours / 24)}d ago`;\n}\n\nexport function NotificationItem({ item }: { item: AppNotification }) {\n const muted = isMuted(item.category);\n return (\n <article className={styles.item} data-focus-key={`notification-${item.id}`}>\n <div className={styles.top}>\n <StatusBadge status={item.severity} tone={severityToTone(item.severity)}>\n {item.severity.toUpperCase()}\n </StatusBadge>\n <span className={styles.category}>{NOTIFICATION_CATEGORY_LABEL[item.category]}</span>\n <span className={styles.time} title={new Date(item.ts).toLocaleString()}>\n {formatRelative(item.ts)}\n </span>\n </div>\n <h3 className={styles.title}>{item.title}</h3>\n <p className={styles.detail}>\n {item.sourceQuality ? (\n <Epistemic quality={item.sourceQuality} label={item.title}>\n {item.detail}\n </Epistemic>\n ) : (\n item.detail\n )}\n </p>\n <div className={styles.actions}>\n {item.actionHref ? (\n <a className={styles.actionLink} href={`#${item.actionHref}`} data-focus-key={`notification-${item.id}-action`}>\n {item.actionLabel ?? 'Open'}\n </a>\n ) : null}\n <button\n type=\"button\"\n className={styles.muteBtn}\n onClick={() => setMuted(item.category, !muted)}\n aria-pressed={muted}\n >\n {muted ? `Unmute ${NOTIFICATION_CATEGORY_LABEL[item.category]}` : `Mute ${NOTIFICATION_CATEGORY_LABEL[item.category]}`}\n </button>\n </div>\n </article>\n );\n}\n","/**\n * components/notifications/useNotificationEngine.ts — the one place that\n * turns backend queries into the notification store's active list. Mount\n * this exactly once (NotificationCenter does, unconditionally, regardless\n * of whether its panel is open) — it has no UI of its own.\n *\n * All four queries share the authenticated SSE refresh channel. Runs/inbox\n * have direct events; daemon observations invalidate control-snapshot and\n * fleet-activity observations invalidate fleet. useQuery fetches initially\n * and subscribes to those cache updates, so a second notification poller\n * would duplicate the same expensive reads even with the panel closed.\n */\nimport { useEffect } from 'react';\nimport { useQuery } from '../../data/hooks.js';\nimport { controlSnapshotQuery, fleetStatusQuery, runsQuery, inboxQuery } from '../../data/queries.js';\nimport { deriveNotifications } from './deriveNotifications.js';\nimport { reconcileNotifications } from './notification-store.js';\n\nexport function useNotificationEngine(): void {\n const control = useQuery(controlSnapshotQuery);\n const fleet = useQuery(fleetStatusQuery);\n const runs = useQuery(runsQuery);\n const inbox = useQuery(inboxQuery);\n\n const controlData = control.data;\n const fleetData = fleet.data;\n const runsData = runs.data;\n const inboxData = inbox.data;\n\n useEffect(() => {\n reconcileNotifications(\n deriveNotifications({\n control: controlData,\n fleet: fleetData,\n runs: runsData,\n inbox: inboxData,\n }),\n );\n }, [controlData, fleetData, runsData, inboxData]);\n}\n","/**\n * components/notifications/NotificationCenter.tsx — the attention queue\n * itself. Mount exactly once, anywhere always-rendered (Topbar, alongside\n * <NotificationBell/>) — it runs useNotificationEngine() unconditionally\n * (so the bell's badge count and any desktop alert can fire even while the\n * panel is closed) and only gates the visible panel on `panelOpen`.\n *\n * Built on the shared <Dialog/> primitive per DESIGN.md's component\n * convention (\"if you need a new modal, extend Dialog, don't hand-roll\n * one\") — `widthClassName` docks it to the right as a drawer instead of the\n * centered card Dialog uses by default, but focus trap / Escape / backdrop\n * click / return-focus all come for free.\n */\nimport { useRef } from 'react';\nimport { Dialog } from '../primitives/Dialog.js';\nimport { NotificationItem } from './NotificationItem.js';\nimport { useNotifications } from './useNotifications.js';\nimport { useNotificationEngine } from './useNotificationEngine.js';\nimport { closePanel, enableDesktopNotifications, disableDesktopNotifications } from './notification-store.js';\nimport styles from './NotificationCenter.module.css';\n\nexport function NotificationCenter() {\n // Always runs, regardless of panelOpen — see header comment.\n useNotificationEngine();\n const { items, panelOpen, desktopEnabled, desktopPermission } = useNotifications();\n const closeBtnRef = useRef<HTMLButtonElement>(null);\n\n async function toggleDesktop() {\n if (desktopEnabled) {\n disableDesktopNotifications();\n } else {\n const result = await enableDesktopNotifications();\n if (result === 'denied') {\n // Browser-level denial — nothing more we can do from here; the\n // toggle will simply reflect \"off\" next render.\n }\n }\n }\n\n return (\n <Dialog\n open={panelOpen}\n onClose={closePanel}\n titleId=\"notification-center-title\"\n title={\n <span className={styles.titleRow}>\n <span>Notifications</span>\n <button type=\"button\" ref={closeBtnRef} className={styles.closeBtn} onClick={closePanel} aria-label=\"Close notifications\">\n ×\n </button>\n </span>\n }\n widthClassName={styles.drawer}\n initialFocusRef={closeBtnRef}\n >\n <div className={styles.header}>\n <button type=\"button\" className={styles.desktopToggle} onClick={() => void toggleDesktop()} disabled={desktopPermission === 'unsupported' || desktopPermission === 'denied'}>\n {desktopPermission === 'unsupported'\n ? 'Desktop alerts not supported in this browser'\n : desktopPermission === 'denied'\n ? 'Desktop alerts blocked in browser settings'\n : desktopEnabled\n ? '🔔 Desktop alerts on'\n : '🔕 Desktop alerts off — enable'}\n </button>\n </div>\n\n {items.length === 0 ? (\n <div className={styles.clear}>\n <strong>Nothing needs you right now.</strong>\n <span>The fleet is operating within its observed authority.</span>\n </div>\n ) : (\n <ul className={styles.list}>\n {items.map((item) => (\n <li key={item.id}>\n <NotificationItem item={item} />\n </li>\n ))}\n </ul>\n )}\n\n <a href=\"#/journal\" className={styles.journalLink} onClick={closePanel}>\n See full history in the Work Journal →\n </a>\n </Dialog>\n );\n}\n","/**\n * components/layout/Topbar.tsx — ⌘K trigger, theme toggle, and the\n * mutation-hold indicator (shows whether actions are unlocked right now,\n * and lets the operator lock early rather than waiting for idle timeout).\n */\nimport { useMutationHold, useTheme } from '../../data/hooks.js';\nimport { NotificationBell } from '../notifications/NotificationBell.js';\nimport { NotificationCenter } from '../notifications/NotificationCenter.js';\nimport styles from './Topbar.module.css';\n\nexport function Topbar({ onOpenPalette }: { onOpenPalette: () => void }) {\n const { theme, cycle: cycleTheme } = useTheme();\n const mutation = useMutationHold();\n\n return (\n <header className={styles.topbar}>\n <button type=\"button\" className={styles.paletteTrigger} onClick={onOpenPalette}>\n <span>Search or run a command</span>\n <kbd className={styles.kbd}>⌘K</kbd>\n </button>\n <div className={styles.actions}>\n <NotificationBell />\n {mutation.hasHold ? (\n <button type=\"button\" className={styles.lockBtn} onClick={mutation.clear} title=\"Lock actions now\">\n 🔓 Unlocked\n </button>\n ) : (\n <span className={styles.lockedIndicator} title=\"Actions require the dispatch token\">\n 🔒 Locked\n </span>\n )}\n <button type=\"button\" className={styles.themeBtn} onClick={cycleTheme} aria-label={`Theme: ${theme}`}>\n {theme === 'system' ? '🖥️' : theme === 'light' ? '☀️' : '🌙'}\n </button>\n </div>\n <NotificationCenter />\n </header>\n );\n}\n","/**\n * components/command-palette/commands.ts — the command registry. Static\n * navigation commands are derived from app/nav-config.ts (single source of\n * truth, shared with the sidebar); action commands are declared here.\n * Extend this array — do not hand-roll a second command list somewhere\n * else.\n *\n * Two additional command sources are generated fresh on every palette\n * open/keystroke rather than living in the static COMMANDS array, because\n * they need live router/cache state a plain module-load-time array can't\n * capture:\n * - buildContextCommands(pathname) — actions scoped to what the operator\n * is already looking at (right now: approve/reject when on /inbox/:id\n * and that proposal is still pending)\n * - buildJumpCommands(query) — fuzzy id/title search across whatever\n * runs/proposals/goals are already cached, generated FROM the query\n * rather than filtered by it after the fact\n *\n * Every guarded action (pause/resume fleet, approve/reject a proposal)\n * carries `requiresConfirm` AND `requiresMutationToken` and goes through\n * both, in that order — CommandPalette.tsx enforces this the same way\n * FleetView/ProposalDetail already do for their own buttons. The palette is\n * a second entry point into the same actions, never a shortcut around their\n * safety gates.\n */\nimport { ALL_NAV_LEAVES } from '../../app/nav-config.js';\nimport { pauseFleet, resumeFleet, approveProposal, rejectProposal } from '../../data/mutations.js';\nimport { openPanel as openNotificationPanel } from '../notifications/notification-store.js';\nimport { getQuerySnapshot, runQuery } from '../../data/cache.js';\nimport { runsQuery, goalsQuery, inboxListQuery, type GoalSummary, type InboxListResponse } from '../../data/queries.js';\nimport { cycleTheme } from '../../data/theme-store.js';\nimport type { RunState } from '../../data/api-types.js';\n\nexport interface CommandConfirm {\n title: string;\n body: string;\n confirmLabel: string;\n /** Approve-shaped actions read as primary even though irreversible;\n * reject/pause-shaped ones read as destructive. Matches ConfirmDialog's\n * own `destructive` prop 1:1. */\n destructive?: boolean;\n}\n\nexport type NavigateFn = (path: string, opts?: { state?: unknown }) => void;\n\nexport interface Command {\n id: string;\n title: string;\n subtitle?: string;\n group: 'Navigate' | 'Actions' | 'Jump to';\n keywords?: string[];\n /** Shown before anything runs, regardless of token state — the palette\n * must never let a guarded action skip the same confirm step its regular\n * UI requires. */\n requiresConfirm?: CommandConfirm;\n /** Requires the mutation-token hold; the palette prompts for it if\n * absent, after any requiresConfirm step. */\n requiresMutationToken?: boolean;\n run: (nav: NavigateFn) => void | Promise<void>;\n}\n\nconst navCommands: Command[] = ALL_NAV_LEAVES.map((leaf) => ({\n id: `nav:${leaf.path}`,\n title: leaf.label,\n subtitle: leaf.description,\n group: 'Navigate',\n run: (nav) => nav(leaf.path),\n}));\n\nconst actionCommands: Command[] = [\n {\n id: 'action:pause-fleet',\n title: 'Pause fleet',\n subtitle: 'Engage the fleet kill switch',\n group: 'Actions',\n keywords: ['stop', 'kill', 'halt'],\n requiresConfirm: {\n title: 'Pause the fleet?',\n body: 'This engages the global kill switch. Autonomous dispatch halts fleet-wide until explicitly resumed.',\n confirmLabel: 'Yes, pause',\n },\n requiresMutationToken: true,\n run: async () => {\n await pauseFleet();\n },\n },\n {\n id: 'action:resume-fleet',\n title: 'Resume fleet',\n subtitle: 'Clear the fleet kill switch',\n group: 'Actions',\n keywords: ['start', 'unpause'],\n requiresConfirm: {\n title: 'Resume the fleet?',\n body: 'This clears the global kill switch. Autonomous dispatch will resume across the fleet.',\n confirmLabel: 'Yes, resume',\n },\n requiresMutationToken: true,\n run: async () => {\n await resumeFleet();\n },\n },\n {\n id: 'action:open-notifications',\n title: 'Open notification centre',\n subtitle: 'What needs you right now, ranked by severity',\n group: 'Actions',\n keywords: ['alerts', 'attention', 'bell', 'needs you'],\n run: () => {\n openNotificationPanel();\n },\n },\n {\n id: 'action:toggle-theme',\n title: 'Toggle theme',\n subtitle: 'Cycle system → light → dark',\n group: 'Actions',\n keywords: ['dark mode', 'light mode', 'appearance', 'dark', 'light'],\n run: () => {\n cycleTheme();\n },\n },\n {\n id: 'action:open-journal-today',\n title: 'Open journal — today',\n subtitle: 'Work journal filtered to today',\n group: 'Actions',\n keywords: ['journal', 'today', 'log', 'history'],\n run: (nav) => {\n nav('/journal', { state: { windowToday: true } });\n },\n },\n];\n\nexport const COMMANDS: Command[] = [...navCommands, ...actionCommands];\n\n/**\n * Warm the caches buildJumpCommands reads from. Fire-and-forget: called\n * once when the palette opens so jump results are ready by the time the\n * operator finishes typing. runQuery is safe to call redundantly (in-flight\n * de-dupe) and never throws into the caller — a cold/failed cache just\n * means jump results appear a beat late or not at all, never an error\n * surfaced through the palette.\n */\nexport function warmJumpCaches(): void {\n void runQuery(runsQuery.key, runsQuery.fetch);\n void runQuery(goalsQuery.key, goalsQuery.fetch);\n const allProposals = inboxListQuery({ status: 'all', limit: 500 });\n void runQuery(allProposals.key, allProposals.fetch);\n}\n\nconst JUMP_LIMIT = 5;\nconst JUMP_MIN_QUERY_LEN = 2;\n\nfunction matchesJump(haystack: string, q: string): boolean {\n return haystack.toLowerCase().includes(q);\n}\n\n/**\n * Jump-to-id/title search across whatever's already cached for\n * runs/proposals/goals — substring match, same rigor as filterCommands'\n * static search (no fuzzy-match library exists anywhere in this repo).\n * Generated FROM the query, unlike filterCommands: these commands don't\n * exist until there's something short enough to be worth jumping to.\n */\nexport function buildJumpCommands(query: string): Command[] {\n const q = query.trim().toLowerCase();\n if (q.length < JUMP_MIN_QUERY_LEN) return [];\n\n const results: Command[] = [];\n\n const runs = getQuerySnapshot<RunState[]>(runsQuery.key).data ?? [];\n for (const run of runs) {\n if (results.length >= JUMP_LIMIT) break;\n if (matchesJump(run.id, q) || matchesJump(run.goal, q)) {\n results.push({\n id: `jump:run:${run.id}`,\n title: run.goal,\n subtitle: `Run ${run.id} · ${run.status}`,\n group: 'Jump to',\n run: (nav) => nav(`/work/runs/${run.id}`),\n });\n }\n }\n\n const goals = getQuerySnapshot<GoalSummary[]>(goalsQuery.key).data ?? [];\n let goalCount = 0;\n for (const goal of goals) {\n if (goalCount >= JUMP_LIMIT) break;\n if (matchesJump(goal.id, q) || matchesJump(goal.objective, q)) {\n goalCount++;\n results.push({\n id: `jump:goal:${goal.id}`,\n title: goal.objective,\n subtitle: `Goal ${goal.id} · ${goal.status}`,\n group: 'Jump to',\n // No per-goal detail route exists yet (routes.tsx only has the\n // /goals list) — jump lands on the list, same as every other goal\n // link in the app today.\n run: (nav) => nav('/goals'),\n });\n }\n }\n\n const proposalsKey = inboxListQuery({ status: 'all', limit: 500 }).key;\n const proposals = getQuerySnapshot<InboxListResponse>(proposalsKey).data?.proposals ?? [];\n let proposalCount = 0;\n for (const p of proposals) {\n if (proposalCount >= JUMP_LIMIT) break;\n if (matchesJump(p.id, q) || matchesJump(p.title, q)) {\n proposalCount++;\n results.push({\n id: `jump:proposal:${p.id}`,\n title: p.title,\n subtitle: `Proposal ${p.id} · ${p.status}`,\n group: 'Jump to',\n run: (nav) => nav(`/inbox/${encodeURIComponent(p.id)}`),\n });\n }\n }\n\n return results;\n}\n\nconst PROPOSAL_ROUTE_RE = /^\\/inbox\\/([^/]+)$/;\n\ninterface CachedProposalDetail {\n id: string;\n title: string;\n status: string;\n}\n\n/**\n * Contextual actions scoped to the current route — right now just\n * approve/reject when the operator is already looking at one pending\n * proposal (/inbox/:id). Reads the same `proposal-detail-${id}` cache key\n * ProposalDetail.tsx populates (data/queries.ts's proposalDetailQuery) —\n * if it isn't warm yet (e.g. the palette is opened before that view\n * finishes its own fetch) this simply omits the contextual commands rather\n * than guessing at proposal state.\n */\nexport function buildContextCommands(pathname: string): Command[] {\n const match = PROPOSAL_ROUTE_RE.exec(pathname);\n if (!match) return [];\n const id = decodeURIComponent(match[1]!);\n const detail = getQuerySnapshot<CachedProposalDetail>(`proposal-detail-${id}`).data;\n if (!detail || detail.status !== 'pending') return [];\n\n return [\n {\n id: `action:approve-proposal:${id}`,\n title: `Approve \"${detail.title}\"`,\n subtitle: 'Writes the diff to disk and dispatches it',\n group: 'Actions',\n keywords: ['approve', 'ship', 'proposal'],\n requiresConfirm: {\n title: 'Approve this proposal?',\n body: `\"${detail.title}\" will be applied. This writes the diff to disk and dispatches it.`,\n confirmLabel: 'Approve',\n },\n requiresMutationToken: true,\n run: async () => {\n await approveProposal(id);\n },\n },\n {\n id: `action:reject-proposal:${id}`,\n title: `Reject \"${detail.title}\"`,\n subtitle: 'Cannot be undone',\n group: 'Actions',\n keywords: ['reject', 'decline', 'proposal'],\n requiresConfirm: {\n title: 'Reject this proposal?',\n body: `\"${detail.title}\" will be rejected. This cannot be undone.`,\n confirmLabel: 'Reject',\n destructive: true,\n },\n requiresMutationToken: true,\n run: async () => {\n await rejectProposal(id);\n },\n },\n ];\n}\n\n/**\n * Static + contextual commands, substring-matched against the query (every\n * whitespace-split term must match), plus fuzzy jump results appended at\n * the end. Context commands are searched like any other — they don't get a\n * free pass past the query.\n */\nexport function filterCommands(query: string, contextCommands: Command[] = []): Command[] {\n const q = query.trim().toLowerCase();\n const staticAndContext = [...contextCommands, ...COMMANDS];\n const staticMatches = !q\n ? staticAndContext\n : staticAndContext.filter((c) => {\n const haystack = [c.title, c.subtitle ?? '', ...(c.keywords ?? [])].join(' ').toLowerCase();\n return q.split(/\\s+/).every((term) => haystack.includes(term));\n });\n return [...staticMatches, ...buildJumpCommands(query)];\n}\n","/**\n * components/command-palette/CommandPalette.tsx — ⌘K. Navigate anywhere,\n * run any action, all from the keyboard (foundation brief item 6: \"treat\n * it as core, not a nice-to-have\").\n *\n * Global open/close is owned here via a document-level keydown listener\n * (mounted once from App.tsx) rather than requiring every view to know the\n * palette exists.\n *\n * Guarded actions (pause/resume fleet, approve/reject a proposal) go\n * through the same confirm → token → execute sequence their regular UI\n * uses (see ConfirmDialog + MutationTokenDialog below) — the palette is a\n * second entry point, never a shortcut around either gate. The sequence\n * mirrors FleetView.tsx's requestAction/confirmIntent/effect pattern: show\n * the confirm dialog first (regardless of token state), and only after\n * it's accepted check whether the token hold is live; if not, prompt for\n * it and auto-run the pending command once the hold appears.\n */\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { filterCommands, buildContextCommands, warmJumpCaches, type Command } from './commands.js';\nimport { hasMutationHold } from '../../data/auth-store.js';\nimport { MutationTokenDialog } from '../auth/MutationTokenDialog.js';\nimport { ConfirmDialog } from '../../routes/inbox/ConfirmDialog.js';\nimport { useToast } from '../primitives/Toast.js';\nimport styles from './CommandPalette.module.css';\n\nexport function useCommandPaletteShortcut(setOpen: (open: boolean) => void) {\n useEffect(() => {\n function onKeyDown(e: KeyboardEvent) {\n const isModK = (e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k';\n if (isModK) {\n e.preventDefault();\n setOpen(true);\n }\n }\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [setOpen]);\n}\n\nexport function CommandPalette({ open, onClose }: { open: boolean; onClose: () => void }) {\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const [pendingCommand, setPendingCommand] = useState<Command | null>(null);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [tokenOpen, setTokenOpen] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const listId = useId();\n const navigate = useNavigate();\n const location = useLocation();\n const toast = useToast();\n\n const contextCommands = useMemo(() => (open ? buildContextCommands(location.pathname) : []), [open, location.pathname]);\n const results = useMemo(() => filterCommands(query, contextCommands), [query, contextCommands]);\n\n // Open: capture whatever had focus so it can be restored on close (same\n // contract as the shared Dialog primitive), reset search state, warm the\n // jump-search caches, and focus the input a tick after the portal mounts.\n // Close: restore focus to whatever opened the palette.\n useEffect(() => {\n if (!open) return;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n setQuery('');\n setActiveIndex(0);\n warmJumpCaches();\n const raf = requestAnimationFrame(() => inputRef.current?.focus());\n return () => {\n cancelAnimationFrame(raf);\n previouslyFocused?.focus();\n };\n }, [open]);\n\n useEffect(() => {\n setActiveIndex(0);\n }, [query]);\n\n useEffect(() => {\n setActiveIndex((i) => Math.min(i, Math.max(results.length - 1, 0)));\n }, [results.length]);\n\n async function runCommand(cmd: Command) {\n try {\n await cmd.run((path, opts) => navigate(path, opts));\n } catch (err) {\n toast.show(err instanceof Error ? err.message : 'Command failed.', 'danger');\n } finally {\n setPendingCommand(null);\n }\n }\n\n function requestExecute(cmd: Command) {\n onClose();\n if (cmd.requiresConfirm) {\n setPendingCommand(cmd);\n setConfirmOpen(true);\n return;\n }\n if (cmd.requiresMutationToken && !hasMutationHold()) {\n setPendingCommand(cmd);\n setTokenOpen(true);\n return;\n }\n void runCommand(cmd);\n }\n\n function onConfirmAccept() {\n setConfirmOpen(false);\n if (!pendingCommand) return;\n if (pendingCommand.requiresMutationToken && !hasMutationHold()) {\n setTokenOpen(true);\n } else {\n void runCommand(pendingCommand);\n }\n }\n\n function onConfirmCancel() {\n setConfirmOpen(false);\n setPendingCommand(null);\n }\n\n function onKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Escape') {\n onClose();\n return;\n }\n if (e.key === 'Tab') {\n // The input is the only natively focusable element in the panel\n // (options are hover/Enter-driven, not individually tabbable) — trap\n // Tab here instead of letting focus escape to whatever the portal\n // happens to sit next to in the DOM.\n e.preventDefault();\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, results.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const cmd = results[activeIndex];\n if (cmd) requestExecute(cmd);\n }\n }\n\n return (\n <>\n {open\n ? createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\n <div className={styles.panel} role=\"dialog\" aria-modal=\"true\" aria-label=\"Command palette\">\n <input\n ref={inputRef}\n className={styles.input}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder=\"Navigate or run a command…\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-activedescendant={results[activeIndex] ? `cmd-${results[activeIndex].id}` : undefined}\n autoComplete=\"off\"\n />\n <ul id={listId} role=\"listbox\" className={styles.list}>\n {results.length === 0 ? (\n <li className={styles.empty}>No matching commands.</li>\n ) : (\n results.map((cmd, i) => (\n <li\n key={cmd.id}\n id={`cmd-${cmd.id}`}\n role=\"option\"\n aria-selected={i === activeIndex}\n className={`${styles.item} ${i === activeIndex ? styles.active : ''}`}\n onMouseEnter={() => setActiveIndex(i)}\n onMouseDown={(e) => {\n e.preventDefault();\n requestExecute(cmd);\n }}\n >\n <span className={styles.itemTitle}>{cmd.title}</span>\n {cmd.subtitle ? <span className={styles.itemSubtitle}>{cmd.subtitle}</span> : null}\n <span className={styles.itemGroup}>{cmd.group}</span>\n </li>\n ))\n )}\n </ul>\n </div>\n </div>,\n document.body,\n )\n : null}\n\n {pendingCommand?.requiresConfirm ? (\n <ConfirmDialog\n open={confirmOpen}\n onClose={onConfirmCancel}\n title={pendingCommand.requiresConfirm.title}\n body={pendingCommand.requiresConfirm.body}\n confirmLabel={pendingCommand.requiresConfirm.confirmLabel}\n destructive={pendingCommand.requiresConfirm.destructive}\n onConfirm={onConfirmAccept}\n />\n ) : null}\n\n <MutationTokenDialog\n open={tokenOpen}\n onClose={() => {\n setTokenOpen(false);\n setPendingCommand(null);\n }}\n onUnlocked={() => {\n const command = pendingCommand;\n setTokenOpen(false);\n setPendingCommand(null);\n if (command) void runCommand(command);\n }}\n reason={pendingCommand ? `\"${pendingCommand.title}\" requires the dispatch token.` : undefined}\n />\n </>\n );\n}\n","/**\n * components/layout/Shell.tsx — the app frame: sidebar + topbar + a single\n * real scroll container (`<main>`) that useScrollRestore attaches to. Every\n * routed view renders inside this <main>; none of them own their own\n * scroll container, so scroll/focus/details state survives navigation\n * consistently everywhere instead of each view reimplementing it.\n */\nimport { useRef, useState } from 'react';\nimport { Outlet, useLocation } from 'react-router-dom';\nimport { Sidebar } from './Sidebar.js';\nimport { Topbar } from './Topbar.js';\nimport { CommandPalette, useCommandPaletteShortcut } from '../command-palette/CommandPalette.js';\nimport { RouteErrorBoundary } from '../primitives/RouteErrorBoundary.js';\nimport { useScrollRestore } from '../../hooks/useScrollRestore.js';\nimport styles from './Shell.module.css';\n\nexport function Shell() {\n const mainRef = useRef<HTMLElement>(null);\n const location = useLocation();\n const [paletteOpen, setPaletteOpen] = useState(false);\n\n useScrollRestore(location.pathname, mainRef);\n useCommandPaletteShortcut(setPaletteOpen);\n\n return (\n <div className={styles.shell}>\n <Sidebar />\n <div className={styles.body}>\n <Topbar onOpenPalette={() => setPaletteOpen(true)} />\n <main ref={mainRef} className={styles.main} id=\"main-content\" tabIndex={-1}>\n <RouteErrorBoundary resetKey={location.pathname}>\n <Outlet />\n </RouteErrorBoundary>\n </main>\n </div>\n <CommandPalette open={paletteOpen} onClose={() => setPaletteOpen(false)} />\n </div>\n );\n}\n","/**\n * routes/PlaceholderView.tsx — every nav leaf in app/nav-config.ts without\n * `implemented: true` renders this instead of a real view. It exists so\n * the routing/nav/palette foundation is provably complete end-to-end\n * (every path resolves to *something* real, deep-links work, back/forward\n * works) without pretending unbuilt views are built. View agents replace\n * this by adding `implemented: true` to the leaf and pointing its route at\n * a real component — see routes.tsx and DESIGN.md \"Adding a view\".\n */\nimport styles from './PlaceholderView.module.css';\n\nexport function PlaceholderView({ title, description }: { title: string; description: string }) {\n return (\n <div className={styles.wrap}>\n <h1 className={styles.title}>{title}</h1>\n <p className={styles.description}>{description}</p>\n <p className={styles.note}>Not built yet — this route, its nav entry, and its ⌘K command all already work.</p>\n </div>\n );\n}\n","/**\n * routes/fleet-dashboard/StatGrid.tsx — the glanceable header row: repos,\n * tools, activity, MCP health, genome, inbox. Pure presentation — the\n * parent view decides loading/refreshing/error.\n */\nimport type { DashboardSnapshot } from '../../data/api-types.js';\nimport { SkeletonCardGrid } from '../../components/primitives/Skeleton.js';\nimport styles from './StatGrid.module.css';\n\nexport function StatGridSkeleton() {\n return <SkeletonCardGrid count={6} />;\n}\n\nfunction Stat({ label, value, caption }: { label: string; value: string; caption?: string }) {\n return (\n <div className={styles.stat}>\n <span className={styles.statLabel}>{label}</span>\n <span className={styles.statValue}>{value}</span>\n {caption ? <span className={styles.statCaption}>{caption}</span> : null}\n </div>\n );\n}\n\nexport function StatGrid({ snapshot }: { snapshot: DashboardSnapshot }) {\n const mcpUp = snapshot.mcp.filter((m) => m.ok).length;\n return (\n <div className={styles.grid}>\n <Stat\n label=\"Repos\"\n value={String(snapshot.repos.total)}\n caption={`${snapshot.repos.dirty} dirty · ${snapshot.repos.stale} stale`}\n />\n <Stat label=\"Tools\" value={`${snapshot.tools.installed}/${snapshot.tools.total}`} caption=\"installed\" />\n <Stat\n label=\"Activity\"\n value={String(snapshot.activity.sessions)}\n caption={`${snapshot.activity.tokens.toLocaleString()} tok · $${snapshot.activity.estCostUsd.toFixed(2)}`}\n />\n <Stat label=\"MCP\" value={`${mcpUp}/${snapshot.mcp.length}`} caption=\"reachable\" />\n <Stat\n label=\"Genome\"\n value={String(snapshot.genome.entries)}\n caption={`${snapshot.genome.projects} projects`}\n />\n <Stat label=\"Inbox\" value={String(snapshot.inbox.pending)} caption=\"pending\" />\n </div>\n );\n}\n","/**\n * routes/fleet-dashboard/RunsPanel.tsx — recent runs. Wrapped in a\n * <details data-state-key> so useScrollRestore's collapse-state capture\n * has a real thing to exercise on this reference view; rows carry\n * data-focus-key so keyboard focus survives a background refresh even\n * though the whole list re-renders with fresh objects every SSE tick.\n */\nimport type { DashboardSnapshot } from '../../data/api-types.js';\nimport { StatusBadge } from '../../components/primitives/StatusBadge.js';\nimport { SkeletonRow } from '../../components/primitives/Skeleton.js';\nimport panel from './Panel.module.css';\nimport styles from './RunsPanel.module.css';\n\nexport function RunsPanelSkeleton() {\n return (\n <details className={panel.panel} open data-state-key=\"fleet-dashboard-runs\">\n <summary className={panel.panelHeader}>\n <span className={panel.panelTitle}>Recent runs</span>\n </summary>\n <div className={panel.panelBody}>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n </details>\n );\n}\n\nexport function RunsPanel({ runs }: { runs: DashboardSnapshot['runs'] }) {\n return (\n <details className={panel.panel} open data-state-key=\"fleet-dashboard-runs\">\n <summary className={panel.panelHeader}>\n <span className={panel.panelTitle}>Recent runs</span>\n <span className=\"text-tertiary text-xs\">{runs.length}</span>\n </summary>\n <div className={panel.panelBody}>\n {runs.length === 0 ? (\n <p className={panel.emptyState}>No runs yet.</p>\n ) : (\n <table className={styles.table}>\n <thead>\n <tr>\n <th scope=\"col\">Goal</th>\n <th scope=\"col\" className={styles.statusCol}>\n Status\n </th>\n <th scope=\"col\" className={styles.tokensCol}>\n Tokens\n </th>\n </tr>\n </thead>\n <tbody>\n {runs.map((run) => (\n <tr key={run.id}>\n <td>\n <a\n href={`#/work/runs/${run.id}`}\n data-focus-key={`run-${run.id}`}\n className={styles.goalLink}\n title={run.goal}\n >\n {run.goal}\n </a>\n </td>\n <td>\n <StatusBadge status={run.status} />\n </td>\n <td className={styles.tokens}>{run.tokens.toLocaleString()}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n </details>\n );\n}\n","/**\n * routes/fleet-dashboard/SwarmsPanel.tsx — active/recent swarms with a live\n * task burndown bar and a PhaseDot for the current DAG phase, when known.\n */\nimport type { DashboardSnapshot } from '../../data/api-types.js';\nimport { StatusBadge, PhaseDot } from '../../components/primitives/StatusBadge.js';\nimport panel from './Panel.module.css';\nimport styles from './SwarmsPanel.module.css';\n\nexport function SwarmsPanel({ swarms }: { swarms: DashboardSnapshot['swarms'] }) {\n return (\n <details className={panel.panel} open data-state-key=\"fleet-dashboard-swarms\">\n <summary className={panel.panelHeader}>\n <span className={panel.panelTitle}>Swarms</span>\n <span className=\"text-tertiary text-xs\">{swarms.length}</span>\n </summary>\n <div className={panel.panelBody}>\n {swarms.length === 0 ? (\n <p className={panel.emptyState}>No active swarms.</p>\n ) : (\n <ul className={styles.list}>\n {swarms.map((swarm, i) => {\n const pct = swarm.tasksTotal > 0 ? Math.round((swarm.tasksDone / swarm.tasksTotal) * 100) : 0;\n return (\n <li key={swarm.id} className={styles.item}>\n <a\n href={`#/work/swarms/${swarm.id}`}\n data-focus-key={`swarm-${swarm.id}`}\n className={styles.itemHeader}\n title={swarm.goal}\n >\n {swarm.phase ? <PhaseDot index={i} /> : null}\n <span className={styles.goal}>{swarm.goal}</span>\n <StatusBadge status={swarm.status} />\n </a>\n <div className={styles.burndown}>\n <div className={styles.burndownTrack}>\n <div className={styles.burndownFill} style={{ width: `${pct}%` }} />\n </div>\n <span className={styles.burndownLabel}>\n {swarm.tasksDone}/{swarm.tasksTotal}\n {swarm.phase ? ` · ${swarm.phase}` : ''}\n </span>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </details>\n );\n}\n","/**\n * routes/fleet-dashboard/DaemonPanel.tsx — the reference use of the\n * epistemic-honesty primitive (foundation brief item 7). ControlSnapshot's\n * `daemon.sourceQuality` is a real `{sourceState, complete, reason}` on the\n * backend (src/core/web/control.ts buildDaemon/fallbackDaemon) — when it's\n * degraded, this panel shows \"unknown\" for state/pid/spend and WITHHOLDS\n * the pause/resume affordance entirely, rather than rendering a button\n * wired to a guess.\n */\nimport type { ControlSnapshot } from '../../data/api-types.js';\nimport { Epistemic } from '../../components/primitives/Epistemic.js';\nimport { StatusBadge } from '../../components/primitives/StatusBadge.js';\nimport { SkeletonLine } from '../../components/primitives/Skeleton.js';\nimport panel from './Panel.module.css';\nimport styles from './DaemonPanel.module.css';\n\nexport function DaemonPanelSkeleton() {\n return (\n <details className={panel.panel} open data-state-key=\"fleet-dashboard-daemon\">\n <summary className={panel.panelHeader}>\n <span className={panel.panelTitle}>Daemon</span>\n </summary>\n <div className={panel.panelBody}>\n <SkeletonLine width=\"40%\" />\n </div>\n </details>\n );\n}\n\nexport function DaemonPanel({ daemon }: { daemon: ControlSnapshot['daemon'] }) {\n return (\n <details className={panel.panel} open data-state-key=\"fleet-dashboard-daemon\">\n <summary className={panel.panelHeader}>\n <span className={panel.panelTitle}>Daemon</span>\n <Epistemic quality={daemon.sourceQuality} label=\"daemon state\">\n <StatusBadge status={daemon.running ? 'running' : 'pending'}>\n {daemon.running ? 'running' : 'stopped'}\n </StatusBadge>\n </Epistemic>\n </summary>\n <div className={panel.panelBody}>\n <dl className={styles.grid}>\n <div>\n <dt>Runtime state</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"runtime state\">\n {daemon.runtimeState}\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>PID</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"pid\">\n {daemon.pid ?? '—'}\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Today's spend</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"spend\">\n ${daemon.todaySpentUsd.toFixed(2)}\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Direction mode</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"direction mode\">\n {daemon.activeDirectionMode ?? 'none'}\n </Epistemic>\n </dd>\n </div>\n </dl>\n </div>\n </details>\n );\n}\n","/**\n * routes/fleet-dashboard/FleetDashboardView.tsx — the foundation's ONE\n * fully-implemented view (foundation brief deliverable). Read this file\n * plus its sub-panels as the pattern every other view should copy:\n *\n * 1. Pull each resource through useQuery(<queryDef>) from data/hooks.ts\n * — never call apiGet directly from a view.\n * 2. Branch on `status`: 'loading' -> skeleton, 'error' -> inline error\n * (never a full-page error, the rest of the shell stays usable),\n * otherwise render real content — 'refreshing' additionally shows\n * <RefreshIndicator/> next to the section it's stale for.\n * 3. Never blank the page. Even on 'refreshing' the last-good `data` is\n * still there and still rendered.\n * 4. Wrap anything sourced from a `sourceQuality`-bearing field in\n * <Epistemic/> (see DaemonPanel.tsx) instead of trusting it blindly.\n */\nimport { dashboardSnapshotQuery, controlSnapshotQuery } from '../../data/queries.js';\nimport { useQuery } from '../../data/hooks.js';\nimport { RefreshIndicator } from '../../components/primitives/RefreshIndicator.js';\nimport { StatGrid, StatGridSkeleton } from './StatGrid.js';\nimport { RunsPanel, RunsPanelSkeleton } from './RunsPanel.js';\nimport { SwarmsPanel } from './SwarmsPanel.js';\nimport { DaemonPanel, DaemonPanelSkeleton } from './DaemonPanel.js';\nimport styles from './FleetDashboardView.module.css';\n\nexport function FleetDashboardView() {\n const snapshotQuery = useQuery(dashboardSnapshotQuery);\n const controlQuery = useQuery(controlSnapshotQuery);\n\n return (\n <div className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Fleet Dashboard</h1>\n <div className={styles.freshness} aria-live=\"polite\">\n {snapshotQuery.status === 'refreshing' ? <RefreshIndicator /> : null}\n {snapshotQuery.updatedAt ? (\n <span className={styles.freshnessLabel}>Updated {formatRelative(snapshotQuery.updatedAt)}</span>\n ) : null}\n </div>\n </header>\n\n {snapshotQuery.status === 'loading' ? (\n <StatGridSkeleton />\n ) : snapshotQuery.status === 'error' ? (\n <ErrorBanner message={snapshotQuery.error?.message ?? 'Failed to load snapshot.'} />\n ) : snapshotQuery.data ? (\n <StatGrid snapshot={snapshotQuery.data} />\n ) : null}\n\n <div className={styles.panels}>\n {snapshotQuery.status === 'loading' ? (\n <RunsPanelSkeleton />\n ) : snapshotQuery.data ? (\n <RunsPanel runs={snapshotQuery.data.runs} />\n ) : null}\n\n {snapshotQuery.data ? <SwarmsPanel swarms={snapshotQuery.data.swarms} /> : null}\n\n {controlQuery.status === 'loading' ? (\n <DaemonPanelSkeleton />\n ) : controlQuery.status === 'error' ? (\n <ErrorBanner message={controlQuery.error?.message ?? 'Failed to load control snapshot.'} />\n ) : controlQuery.data ? (\n <DaemonPanel daemon={controlQuery.data.daemon} />\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction ErrorBanner({ message }: { message: string }) {\n return (\n <div className={styles.error} role=\"alert\">\n {message}\n </div>\n );\n}\n\nfunction formatRelative(ts: number): string {\n const seconds = Math.max(0, Math.round((Date.now() - ts) / 1000));\n if (seconds < 5) return 'just now';\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.round(seconds / 60);\n return `${minutes}m ago`;\n}\n","/**\n * components/stream/useRunStreamEvents.ts — the SSE transport half of live\n * run streaming. Opens one EventSource per mounted run against\n * `GET /api/run/:id/events` (src/core/web/run-stream.ts) and exposes the\n * frames it receives.\n *\n * This hook does NOT reconstruct a full RunState from events — the server\n * event protocol intentionally carries only the new slice per tick (see\n * run-stream.ts's header comment for exactly why: RunStep.summary is the\n * finest real granularity available without engine changes, there is no\n * token stream). The full structured run (steps/tasks/usage/status) still\n * comes from the existing GET /api/run/:id query cache; useRunStream.ts\n * composes this hook with that query, using SSE frames as a push-triggered\n * refetch signal instead of useRunStream's old fixed 2s poll, and using the\n * server's own `stall` events instead of client-inferred staleness.\n *\n * Fallback contract: if the endpoint doesn't exist (older server — 404/400/\n * 503 before the connection ever reaches 'open'), or EventSource itself\n * isn't available, `status` settles to 'unavailable' and the caller is\n * expected to fall back to polling. It never retries forever against a\n * route that plainly isn't there.\n */\nimport { useEffect, useState } from 'react';\nimport { getReadClientProof } from '../../data/auth-store.js';\n\nexport interface RunStreamChunk {\n seq: number;\n taskId: string;\n kind: string;\n index: number;\n ts: string;\n text: string;\n}\n\n/**\n * v333: a line from the run's durable stream file (streaming.ts's\n * fileSink()) — live engine subprocess output / builtin model-delta text as\n * it happened, not just a step boundary. No `index` (there's no stable array\n * position the way RunStep has one — the server derives its seq from the\n * stream file's line position instead, see run-stream.ts's\n * emitNewOutputChunks). `taskId` is often absent: whole-goal engine\n * delegation and sandboxed runs have no per-task concept.\n */\nexport interface RunStreamOutputChunk {\n seq: number;\n taskId: string | null;\n kind: string;\n ts: string;\n text: string;\n}\n\nexport interface RunStreamTaskStarted {\n seq: number;\n taskId: string;\n index: number;\n goal: string;\n}\n\nexport interface RunStreamDoneEvent {\n status: string;\n result: string | null;\n terminationReason: string | null;\n}\n\nexport type SseTransportStatus = 'connecting' | 'open' | 'unavailable';\n\nexport interface RunStreamEventsState {\n status: SseTransportStatus;\n chunks: RunStreamChunk[];\n /** v333: live output-chunk frames tailed from the durable stream file —\n * see RunStreamOutputChunk. Append-only for the life of this mount. */\n outputChunks: RunStreamOutputChunk[];\n starts: RunStreamTaskStarted[];\n stall: { ageMs: number; at: number } | null;\n runDone: RunStreamDoneEvent | null;\n /** Increments on every received frame — a cheap effect dependency for\n * \"something changed, go refetch the structured run now\". */\n version: number;\n}\n\nconst INITIAL_STATE: RunStreamEventsState = {\n status: 'connecting',\n chunks: [],\n outputChunks: [],\n starts: [],\n stall: null,\n runDone: null,\n version: 0,\n};\n\nfunction parseEventData<T>(evt: Event): T | null {\n const messageEvent = evt as MessageEvent<string>;\n try {\n return JSON.parse(messageEvent.data) as T;\n } catch {\n return null;\n }\n}\n\n/** @param enabled skip opening a connection entirely (e.g. run already terminal, or caller has already fallen back to polling). */\nexport function useRunStreamEvents(runId: string, enabled: boolean): RunStreamEventsState {\n const [state, setState] = useState<RunStreamEventsState>(INITIAL_STATE);\n\n useEffect(() => {\n if (!enabled) {\n setState(INITIAL_STATE);\n return;\n }\n setState(INITIAL_STATE);\n\n if (typeof EventSource === 'undefined') {\n setState((s) => ({ ...s, status: 'unavailable' }));\n return;\n }\n\n const url = `/api/run/${encodeURIComponent(runId)}/events?client=${encodeURIComponent(getReadClientProof())}`;\n const source = new EventSource(url, { withCredentials: true });\n\n source.onopen = () => {\n setState((s) => (s.status === 'unavailable' ? s : { ...s, status: 'open' }));\n };\n\n // A route the server doesn't recognize (older build) or a rejected\n // connection (bad/expired session, invalid run id, connection cap)\n // answers with a plain JSON error, not an event-stream — the browser\n // surfaces that as an error with no preceding 'open'. Treat \"errored\n // before ever opening\" as permanently unavailable for this mount rather\n // than retrying indefinitely; a transient error AFTER a successful open\n // is left to EventSource's own built-in reconnect.\n source.onerror = () => {\n setState((s) => (s.status === 'open' ? s : { ...s, status: 'unavailable' }));\n };\n\n source.addEventListener('step-started', (evt) => {\n const data = parseEventData<RunStreamTaskStarted>(evt);\n if (!data) return;\n setState((s) => ({ ...s, starts: [...s.starts, data], version: s.version + 1 }));\n });\n\n source.addEventListener('step-output-chunk', (evt) => {\n const data = parseEventData<RunStreamChunk>(evt);\n if (!data) return;\n setState((s) => ({ ...s, chunks: [...s.chunks, data], version: s.version + 1 }));\n });\n\n source.addEventListener('step-done', () => {\n setState((s) => ({ ...s, stall: null, version: s.version + 1 }));\n });\n\n source.addEventListener('output-chunk', (evt) => {\n const data = parseEventData<RunStreamOutputChunk>(evt);\n if (!data) return;\n setState((s) => ({ ...s, outputChunks: [...s.outputChunks, data], version: s.version + 1 }));\n });\n\n source.addEventListener('stall', (evt) => {\n const data = parseEventData<{ ageMs: number }>(evt);\n if (!data) return;\n setState((s) => ({ ...s, stall: { ageMs: data.ageMs, at: Date.now() }, version: s.version + 1 }));\n });\n\n source.addEventListener('run-done', (evt) => {\n const data = parseEventData<RunStreamDoneEvent>(evt);\n setState((s) => ({\n ...s,\n runDone: data ?? { status: 'done', result: null, terminationReason: null },\n stall: null,\n version: s.version + 1,\n }));\n });\n\n return () => {\n source.close();\n };\n }, [runId, enabled]);\n\n return state;\n}\n","/**\n * components/stream/useRunStream.ts — the engine behind live run streaming\n * (M416: \"watch an agent work in real time\"). Prefers a genuine push\n * channel — GET /api/run/:id/events (src/core/web/run-stream.ts), a per-run\n * SSE tail — and falls back to the original incremental-polling approach\n * against GET /api/run/:id when that route isn't there (older server) or\n * EventSource isn't available. See useRunStreamEvents.ts for the transport\n * and run-stream.ts's header comment for exactly what granularity the\n * source data actually supports (RunStep.summary, not raw model tokens —\n * this was never fabricated, only the DELIVERY changed from poll to push).\n *\n * Honesty contract (non-negotiable per the build brief, unchanged by adding\n * a push transport): this hook never reports 'live' when nothing has\n * actually changed for a while. On the polling fallback, phase flips to\n * 'stalled' after STALL_AFTER_MS with no observed change; on the SSE path,\n * the exact same signal is computed server-side (run-stream.ts's\n * RUN_STALL_AFTER_MS, same threshold) and pushed as an explicit `stall`\n * event instead of inferred client-side.\n */\nimport { useEffect, useMemo, useState } from 'react';\nimport { useQuery, useRefetch } from '../../data/hooks.js';\nimport { runDetailQuery } from '../../data/queries.js';\nimport { ApiError } from '../../data/client.js';\nimport type { RunState } from '../../data/api-types.js';\nimport { useRunStreamEvents, type RunStreamChunk, type RunStreamOutputChunk } from './useRunStreamEvents.js';\n\n/** Client poll cadence. The server's own disk-poll floor (SSE_POLL_MS,\n * src/core/web/api.ts:138) is ~1.5s — polling faster than that cannot\n * surface data any sooner, so this intentionally sits just above it rather\n * than implying a latency this API can't deliver. Only used on the polling\n * fallback path — the SSE path's tail interval is run-stream.ts's\n * RUN_TAIL_POLL_MS (500ms), server-side. */\nexport const RUN_STREAM_POLL_MS = 2000;\n\n/** No observed change for 4 poll cycles (~8s) while status is 'running' —\n * long enough to absorb an ordinary quiet beat between steps, short enough\n * that a genuinely wedged run doesn't masquerade as live for minutes.\n * Mirrored server-side by run-stream.ts's RUN_STALL_AFTER_MS. */\nconst STALL_AFTER_MS = RUN_STREAM_POLL_MS * 4;\n\nexport type RunStreamPhase = 'connecting' | 'live' | 'stalled' | 'done' | 'not-found' | 'error';\nexport type RunStreamTransport = 'sse' | 'polling';\n\nexport interface RunStreamState {\n phase: RunStreamPhase;\n run: RunState | undefined;\n error: Error | undefined;\n /** When the run's own data last actually changed (step count / status / updatedAt). */\n lastChangedAt: number | null;\n /** When this hook last attempted a poll, regardless of whether anything changed. */\n lastPolledAt: number | null;\n /** Manually force an immediate poll (e.g. a \"check now\" affordance). */\n pollNow: () => void;\n /** Which transport is actually driving updates right now. */\n transport: RunStreamTransport;\n /** Live output chunks pushed over SSE (empty on the polling fallback — the\n * structured `run.steps` is still complete either way, this is purely the\n * append-only feed for a live output pane). */\n chunks: RunStreamChunk[];\n /** v333: live engine/model text tailed from the durable stream file — see\n * RunStreamOutputChunk. Empty on the polling fallback, same reasoning as\n * `chunks`: the polling path has no SSE frames to carry it. This is the\n * finer-than-step-boundary text the \"live output pane\" actually renders. */\n outputChunks: RunStreamOutputChunk[];\n /** Age (ms) of the server's most recent stall notice, when SSE-driven. */\n stallAgeMs: number | null;\n}\n\nfunction fingerprintOf(run: RunState | undefined): string | null {\n if (!run) return null;\n return `${run.status}:${run.steps.length}:${run.updatedAt}`;\n}\n\nexport function useRunStream(runId: string): RunStreamState {\n const def = useMemo(() => runDetailQuery(runId), [runId]);\n const query = useQuery(def);\n const refetch = useRefetch(def);\n\n const [lastChangedAt, setLastChangedAt] = useState<number | null>(null);\n const [lastPolledAt, setLastPolledAt] = useState<number | null>(null);\n const [, forceTick] = useState(0);\n\n const isTerminal = query.data ? query.data.status !== 'running' : false;\n const is404 = query.error instanceof ApiError && query.error.status === 404;\n\n // Attempt SSE for every non-terminal, non-404 run. Once the SSE hook\n // settles on 'unavailable' (older server, or EventSource unsupported) this\n // permanently falls back to polling for the life of this mount — it never\n // fights a route that plainly isn't there.\n const sseEnabled = !isTerminal && !is404;\n const events = useRunStreamEvents(runId, sseEnabled);\n const transport: RunStreamTransport = events.status === 'open' ? 'sse' : 'polling';\n\n const fingerprint = fingerprintOf(query.data);\n\n // Fires only when `fingerprint` actually changes identity (React's\n // dependency comparison, not a manual ref check) — i.e. only when the run\n // genuinely produced a new step, changed status, or bumped updatedAt.\n useEffect(() => {\n if (fingerprint !== null) setLastChangedAt(Date.now());\n }, [fingerprint]);\n\n // Polling fallback — only runs while SSE has not successfully opened.\n // Once transport flips to 'sse' this interval stops; if SSE later drops to\n // 'unavailable' the effect re-runs (transport dependency) and polling\n // resumes automatically.\n useEffect(() => {\n if (isTerminal || is404 || transport === 'sse') return;\n const interval = setInterval(() => {\n refetch();\n setLastPolledAt(Date.now());\n forceTick((n) => n + 1); // re-render so stalled-detection re-evaluates \"now\" even with no data change\n }, RUN_STREAM_POLL_MS);\n return () => clearInterval(interval);\n }, [refetch, isTerminal, is404, transport]);\n\n // SSE push -> refetch the structured run. `events.version` bumps on every\n // frame (step-started/step-output-chunk/step-done/stall/run-done); this is\n // the \"push\" half that makes the SSE path faster than the poll floor.\n useEffect(() => {\n if (transport !== 'sse' || events.version === 0) return;\n refetch();\n setLastPolledAt(Date.now());\n }, [events.version, transport, refetch]);\n\n // Server-pushed stall notice is only \"fresh\" for a bounded window — after\n // that, prefer re-evaluating from lastChangedAt like the polling path so a\n // client that missed a later non-stall frame (tab backgrounded, etc.)\n // doesn't get stuck showing a stale stall banner forever.\n const stallFreshMs = RUN_STREAM_POLL_MS * 6;\n const sseStallFresh =\n transport === 'sse' && events.stall !== null && Date.now() - events.stall.at < stallFreshMs;\n\n let phase: RunStreamPhase;\n if (is404) {\n phase = 'not-found';\n } else if (query.status === 'error' && query.data === undefined) {\n phase = 'error';\n } else if (query.status === 'loading') {\n phase = 'connecting';\n } else if (!query.data) {\n phase = 'connecting';\n } else if (query.data.status !== 'running') {\n phase = 'done';\n } else if (transport === 'sse') {\n phase = sseStallFresh ? 'stalled' : 'live';\n } else if (lastChangedAt !== null && Date.now() - lastChangedAt > STALL_AFTER_MS) {\n phase = 'stalled';\n } else {\n phase = 'live';\n }\n\n return {\n phase,\n run: query.data,\n error: query.error,\n lastChangedAt,\n lastPolledAt,\n pollNow: () => {\n refetch();\n setLastPolledAt(Date.now());\n },\n transport,\n chunks: events.chunks,\n outputChunks: events.outputChunks,\n stallAgeMs: sseStallFresh ? events.stall!.ageMs : null,\n };\n}\n","/**\n * components/stream/RunStreamPanel.tsx — live view of one in-progress run:\n * current status, elapsed time/usage, and the step transcript as it builds\n * (M416 \"live run streaming\"). Backed by useRunStream's polling, not a\n * push channel — see that hook's header comment for why, and\n * RUN_STREAM_POLL_MS / the 'stalled' phase for how staleness is surfaced\n * rather than hidden.\n *\n * Reusable: any owner (journal's \"watch live\" action today; a future\n * /work/runs/:id detail view tomorrow) can mount `<RunStreamPanel runId=.../>`\n * directly — it owns its own data fetching, so the caller only needs an id.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { useRunStream, RUN_STREAM_POLL_MS, type RunStreamPhase, type RunStreamTransport } from './useRunStream.js';\nimport { StatusBadge } from '../primitives/StatusBadge.js';\nimport { SkeletonLine } from '../primitives/Skeleton.js';\nimport type { RunStep } from '../../data/api-types.js';\nimport styles from './RunStreamPanel.module.css';\n\nconst STEP_KIND_LABEL: Record<RunStep['kind'], string> = {\n plan: 'Plan',\n model: 'Model',\n tool: 'Tool',\n synthesize: 'Synthesize',\n};\n\nfunction formatElapsed(startIso: string, endIso?: string): string {\n const start = new Date(startIso).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n const seconds = Math.max(0, Math.round((end - start) / 1000));\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const rem = seconds % 60;\n return `${minutes}m ${rem}s`;\n}\n\nfunction formatClock(iso: string): string {\n try {\n return new Date(iso).toLocaleTimeString(undefined, { hour12: false });\n } catch {\n return iso;\n }\n}\n\nfunction PhaseBanner({\n phase,\n lastChangedAt,\n stallAgeMs,\n transport,\n error,\n}: {\n phase: RunStreamPhase;\n lastChangedAt: number | null;\n stallAgeMs: number | null;\n transport: RunStreamTransport;\n error: Error | undefined;\n}) {\n if (phase === 'connecting') {\n return (\n <div className={styles.banner} role=\"status\">\n <span className={styles.bannerDot} data-tone=\"connecting\" aria-hidden=\"true\" />\n Connecting to run…\n </div>\n );\n }\n if (phase === 'not-found') {\n return (\n <div className={`${styles.banner} ${styles.bannerDanger}`} role=\"alert\">\n <span className={styles.bannerDot} data-tone=\"danger\" aria-hidden=\"true\" />\n Run not found. It may have been pruned from disk since this link was opened.\n </div>\n );\n }\n if (phase === 'error') {\n return (\n <div className={`${styles.banner} ${styles.bannerDanger}`} role=\"alert\">\n <span className={styles.bannerDot} data-tone=\"danger\" aria-hidden=\"true\" />\n Stream disconnected{error ? `: ${error.message}` : ''}. Retrying every {RUN_STREAM_POLL_MS / 1000}s…\n </div>\n );\n }\n if (phase === 'stalled') {\n // Prefer the server's own stall age (SSE path — data-driven, not a\n // client guess); fall back to the client-computed gap on the polling path.\n const secs =\n stallAgeMs !== null\n ? Math.round(stallAgeMs / 1000)\n : lastChangedAt !== null\n ? Math.round((Date.now() - lastChangedAt) / 1000)\n : null;\n return (\n <div className={`${styles.banner} ${styles.bannerWarning}`} role=\"status\" aria-live=\"polite\">\n <span className={styles.bannerDot} data-tone=\"warning\" aria-hidden=\"true\" />\n No change observed{secs !== null ? ` in ${secs}s` : ''} — this run may be stalled, or is simply quiet between\n steps. Still {transport === 'sse' ? 'watching' : 'polling'}.\n </div>\n );\n }\n if (phase === 'live') {\n return (\n <div className={styles.banner} role=\"status\">\n <span className={styles.bannerDot} data-tone=\"live\" aria-hidden=\"true\" />\n {transport === 'sse'\n ? 'Live · streaming (server tail ~500ms)'\n : `Live · polling every ${RUN_STREAM_POLL_MS / 1000}s (server refresh floor ~1.5s — this cannot be faster than that)`}\n </div>\n );\n }\n return (\n <div className={styles.banner} role=\"status\">\n <span className={styles.bannerDot} data-tone=\"done\" aria-hidden=\"true\" />\n Run finished — no longer {transport === 'sse' ? 'streaming' : 'polling'}.\n </div>\n );\n}\n\nexport function RunStreamPanelSkeleton() {\n return (\n <div className={styles.panel}>\n <SkeletonLine width=\"40%\" />\n <SkeletonLine width=\"90%\" />\n <SkeletonLine width=\"70%\" />\n </div>\n );\n}\n\nexport function RunStreamPanel({ runId }: { runId: string }) {\n const stream = useRunStream(runId);\n const { phase, run, error, lastChangedAt, transport, stallAgeMs, outputChunks } = stream;\n const scrollRef = useRef<HTMLDivElement>(null);\n const stickToBottomRef = useRef(true);\n // Mirrors stickToBottomRef in React state purely so the \"Follow\" button can\n // render reactively — the ref alone is enough to drive the scroll effect,\n // but a ref mutation doesn't trigger a re-render.\n const [following, setFollowing] = useState(true);\n\n // v333: independent scroll/follow state for the live output pane — same\n // append/pin/follow contract as the step transcript above, but it tracks\n // its own scroll position since the two panes grow independently (an\n // engine can emit many output chunks between step boundaries).\n const outputScrollRef = useRef<HTMLDivElement>(null);\n const outputStickToBottomRef = useRef(true);\n const [outputFollowing, setOutputFollowing] = useState(true);\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el || !stickToBottomRef.current) return;\n el.scrollTop = el.scrollHeight;\n }, [run?.steps.length]);\n\n useEffect(() => {\n const el = outputScrollRef.current;\n if (!el || !outputStickToBottomRef.current) return;\n el.scrollTop = el.scrollHeight;\n }, [outputChunks.length]);\n\n function onScroll() {\n const el = scrollRef.current;\n if (!el) return;\n const distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;\n const pinned = distanceFromBottom < 48;\n stickToBottomRef.current = pinned;\n setFollowing(pinned);\n }\n\n function onOutputScroll() {\n const el = outputScrollRef.current;\n if (!el) return;\n const distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;\n const pinned = distanceFromBottom < 48;\n outputStickToBottomRef.current = pinned;\n setOutputFollowing(pinned);\n }\n\n function resumeFollowing() {\n stickToBottomRef.current = true;\n setFollowing(true);\n const el = scrollRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n }\n\n function resumeOutputFollowing() {\n outputStickToBottomRef.current = true;\n setOutputFollowing(true);\n const el = outputScrollRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n }\n\n if (!run && phase === 'connecting') return <RunStreamPanelSkeleton />;\n\n return (\n <div className={styles.panel}>\n <header className={styles.header}>\n <div className={styles.headerTop}>\n <h3 className={styles.title}>{run?.goal ?? `Run ${runId}`}</h3>\n {run ? <StatusBadge status={run.status} /> : null}\n </div>\n {run ? (\n <dl className={styles.statRow}>\n <div>\n <dt>Elapsed</dt>\n <dd>{formatElapsed(run.createdAt, run.status === 'running' ? undefined : run.updatedAt)}</dd>\n </div>\n <div>\n <dt>Tokens</dt>\n <dd>\n {run.usage.tokensIn.toLocaleString()} in / {run.usage.tokensOut.toLocaleString()} out\n </dd>\n </div>\n <div>\n <dt>Cost</dt>\n <dd>${run.usage.estCostUsd.toFixed(3)}</dd>\n </div>\n <div>\n <dt>Steps</dt>\n <dd>{run.steps.length}</dd>\n </div>\n <div>\n <dt>Tasks</dt>\n <dd>\n {run.tasks.filter((t) => t.status === 'done').length}/{run.tasks.length}\n </dd>\n </div>\n </dl>\n ) : null}\n </header>\n\n <PhaseBanner\n phase={phase}\n lastChangedAt={lastChangedAt}\n stallAgeMs={stallAgeMs}\n transport={transport}\n error={error}\n />\n\n {outputChunks.length > 0 ? (\n <div className={styles.transcriptWrap}>\n <div\n ref={outputScrollRef}\n className={styles.transcript}\n onScroll={onOutputScroll}\n tabIndex={0}\n role=\"log\"\n aria-label=\"Live engine output\"\n aria-live={outputFollowing ? 'polite' : 'off'}\n >\n {outputChunks.map((chunk, i) => (\n <div key={`${chunk.ts}-${i}`} className={styles.step} data-focus-key={`run-output-chunk-${i}`}>\n <span className={styles.stepKind} data-kind={chunk.kind}>\n {chunk.kind}\n </span>\n <span className={styles.stepTime} title={chunk.ts}>\n {formatClock(chunk.ts)}\n </span>\n <span className={styles.stepTask}>{chunk.taskId ?? ''}</span>\n <span className={styles.stepSummary}>{chunk.text}</span>\n </div>\n ))}\n </div>\n {!outputFollowing ? (\n <button type=\"button\" className={styles.followButton} onClick={resumeOutputFollowing}>\n ↓ Follow\n </button>\n ) : null}\n </div>\n ) : null}\n\n <div className={styles.transcriptWrap}>\n <div\n ref={scrollRef}\n className={styles.transcript}\n onScroll={onScroll}\n tabIndex={0}\n role=\"log\"\n aria-label=\"Run step transcript\"\n aria-live={following ? 'polite' : 'off'}\n >\n {!run || run.steps.length === 0 ? (\n <p className={styles.empty}>No steps recorded yet.</p>\n ) : (\n run.steps.map((step, i) => (\n <div key={`${step.ts}-${i}`} className={styles.step} data-focus-key={`run-stream-step-${i}`}>\n <span className={styles.stepKind} data-kind={step.kind}>\n {STEP_KIND_LABEL[step.kind] ?? step.kind}\n </span>\n <span className={styles.stepTime} title={step.ts}>\n {formatClock(step.ts)}\n </span>\n <span className={styles.stepTask}>{step.taskId}</span>\n <span className={styles.stepSummary}>{step.summary}</span>\n {step.usage ? (\n <span className={styles.stepUsage}>\n {(step.usage.tokensIn + step.usage.tokensOut).toLocaleString()} tok\n </span>\n ) : null}\n </div>\n ))\n )}\n </div>\n {!following ? (\n <button type=\"button\" className={styles.followButton} onClick={resumeFollowing}>\n ↓ Follow\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n","/**\n * routes/journal/LiveNowStrip.tsx — \"watch an agent work in real time\"\n * surfaced right at the top of the journal: any run currently `running`\n * gets a one-click \"Watch live\" that opens <RunStreamPanel/> in a drawer.\n * Reuses components/stream's live-streaming primitive rather than\n * reimplementing it — this is the journal's own integration point for that\n * feature (routes/work/** is owned by another agent and not touched here).\n */\nimport { useState } from 'react';\nimport { useQuery } from '../../data/hooks.js';\nimport { dashboardSnapshotQuery } from '../../data/queries.js';\nimport { Dialog } from '../../components/primitives/Dialog.js';\nimport { RunStreamPanel } from '../../components/stream/index.js';\nimport styles from './LiveNowStrip.module.css';\n\nexport function LiveNowStrip() {\n const snapshotQuery = useQuery(dashboardSnapshotQuery);\n const [watchingRunId, setWatchingRunId] = useState<string | null>(null);\n const runningRuns = (snapshotQuery.data?.runs ?? []).filter((r) => r.status === 'running');\n\n if (runningRuns.length === 0) return null;\n\n return (\n <div className={styles.strip}>\n <span className={styles.label}>Live now</span>\n <ul className={styles.list} aria-live=\"polite\" aria-label=\"Currently running\">\n {runningRuns.map((run) => (\n <li key={run.id}>\n <button type=\"button\" className={styles.watchBtn} onClick={() => setWatchingRunId(run.id)}>\n <span className={styles.pulse} aria-hidden=\"true\" />\n {run.goal}\n </button>\n </li>\n ))}\n </ul>\n <Dialog\n open={watchingRunId !== null}\n onClose={() => setWatchingRunId(null)}\n titleId=\"live-now-title\"\n title=\"Watching live\"\n widthClassName={styles.dialogWidth}\n >\n {watchingRunId ? <RunStreamPanel runId={watchingRunId} /> : null}\n </Dialog>\n </div>\n );\n}\n","/**\n * routes/journal/journal-model.ts — pure merge/sort of every history source\n * the read API actually exposes into one chronological feed. No React, no\n * fetch — trivially unit-testable, same split as data/cache.ts.\n *\n * HONESTY, spelled out because it matters for this specific view: the\n * operator's real machine has ~672 historical proposals and weeks of\n * daemon-activity JSONL on disk, per the build brief. None of that is\n * reachable through the current read-only web API — there is no bulk\n * historical-proposal endpoint (only `/api/inbox`, pending-only) and no\n * endpoint for the JSONL files. This model merges what IS exposed:\n * - up to 200 daemon tick/merge/info/dispatch log lines (/api/logs-observation)\n * - up to 20 recent merges / 20 recent ticks / 20 recent agent actions\n * (/api/fleet-activity — each independently capped server-side)\n * - up to 200 recent runs (/api/runs)\n * - all currently-pending proposals (/api/inbox)\n * JournalView surfaces that window explicitly rather than implying this is\n * the full history — see its \"windowNote\" caption.\n */\nimport type {\n ControlLogEntry,\n FleetActivitySnapshot,\n RunState,\n SourceQuality,\n} from '../../data/api-types.js';\nimport type { ControlLogsObservation, InboxProposal } from '../../data/queries.js';\n\nexport type JournalSource = 'daemon-tick' | 'merge' | 'agent-action' | 'run' | 'proposal';\n\nexport interface JournalDrillIn {\n proposalId?: string;\n runId?: string;\n}\n\nexport interface JournalEntry {\n id: string;\n ts: string;\n source: JournalSource;\n title: string;\n detail: string;\n repo?: string;\n /** Fed straight to <StatusBadge status=.../> — statusToTone() decides the color. */\n statusLabel: string;\n sourceQuality?: SourceQuality;\n drillIn?: JournalDrillIn;\n}\n\nexport interface JournalBuildInputs {\n logs?: ControlLogsObservation;\n fleetActivity?: FleetActivitySnapshot;\n runs?: RunState[];\n inbox?: { pending: number; proposals: InboxProposal[] };\n}\n\nfunction logKindToStatus(kind: ControlLogEntry['kind']): string {\n switch (kind) {\n case 'merge':\n return 'merged';\n case 'dispatch':\n return 'running';\n case 'tick':\n return 'info';\n case 'info':\n default:\n return 'pending';\n }\n}\n\nexport function buildJournalEntries(input: JournalBuildInputs): JournalEntry[] {\n const out: JournalEntry[] = [];\n\n for (const [i, entry] of (input.logs?.entries ?? []).entries()) {\n out.push({\n id: `log-${entry.ts}-${i}`,\n ts: entry.ts,\n source: 'daemon-tick',\n title: entry.kind === 'merge' ? 'Daemon merge' : entry.kind === 'dispatch' ? 'Daemon dispatch' : 'Daemon tick',\n detail: entry.msg + (entry.dryRun ? ' (dry run)' : ''),\n statusLabel: logKindToStatus(entry.kind),\n sourceQuality: input.logs?.sourceQuality,\n });\n }\n\n for (const [i, tick] of (input.fleetActivity?.recentTicks ?? []).entries()) {\n out.push({\n id: `fleet-tick-${tick.ts}-${i}`,\n ts: tick.ts,\n source: 'daemon-tick',\n title: 'Fleet tick',\n detail:\n [tick.reason, tick.directionReason].filter(Boolean).join(' — ') ||\n `${tick.merged} merged, $${tick.spentUsd.toFixed(2)} spent`,\n statusLabel: tick.dryRun ? 'pending' : 'info',\n sourceQuality: input.fleetActivity?.recentTicksSourceQuality,\n });\n }\n\n for (const [i, merge] of (input.fleetActivity?.recentMerges ?? []).entries()) {\n out.push({\n id: `merge-${merge.ts}-${i}`,\n ts: merge.ts,\n source: 'merge',\n title: `Merged in ${merge.repo ?? 'unknown repo'}`,\n detail: `${merge.engine ?? 'unknown engine'}${merge.proposalId ? ` · proposal ${merge.proposalId}` : ''}`,\n repo: merge.repo ?? undefined,\n statusLabel: 'merged',\n sourceQuality: input.fleetActivity?.recentMergesSourceQuality,\n drillIn: merge.proposalId ? { proposalId: merge.proposalId } : undefined,\n });\n }\n\n for (const [i, action] of (input.fleetActivity?.recentActions ?? []).entries()) {\n out.push({\n id: `action-${action.ts}-${i}`,\n ts: action.ts,\n source: 'agent-action',\n title: action.proseDigest ?? action.summary ?? action.action,\n detail: action.summary,\n repo: action.repo,\n statusLabel: action.outcome,\n // Every sibling block above wires its matching sourceQuality field\n // through (recentMergesSourceQuality, recentTicksSourceQuality below) so\n // a degraded read renders as genuinely unknown, not silently as healthy.\n // This block previously omitted it even though the backend already\n // populates recentActionsSource — fixed so agent-action rows don't\n // conflate \"empty\" with \"couldn't look\" next to rows that don't.\n sourceQuality: input.fleetActivity?.recentActionsSource,\n drillIn: action.proposalId ? { proposalId: action.proposalId } : action.runId ? { runId: action.runId } : undefined,\n });\n }\n\n for (const run of input.runs ?? []) {\n out.push({\n id: `run-${run.id}`,\n ts: run.updatedAt,\n source: 'run',\n title: run.goal,\n detail: run.result ?? run.terminationReason ?? `${run.steps.length} step(s), ${run.tasks.length} task(s)`,\n statusLabel: run.status,\n drillIn: { runId: run.id },\n });\n }\n\n for (const proposal of input.inbox?.proposals ?? []) {\n out.push({\n id: `proposal-pending-${proposal.id}`,\n ts: proposal.createdAt,\n source: 'proposal',\n title: proposal.title,\n detail: `${proposal.kind} · ${proposal.origin}`,\n repo: proposal.repo,\n statusLabel: 'pending',\n drillIn: { proposalId: proposal.id },\n });\n }\n\n out.sort((a, b) => new Date(b.ts).getTime() - new Date(a.ts).getTime());\n return out;\n}\n\nexport interface JournalFilterState {\n sources: Set<JournalSource>;\n query: string;\n windowMs: number | null; // null = all available\n}\n\n/** Milliseconds since local midnight — used for the \"today\" quick-filter\n * (JournalFilters.tsx) and for the command palette's \"open journal, filtered\n * to today\" action, which needs the same number before the view even\n * mounts. A pure function (no Date.now() smuggled in as a default) so both\n * call sites and tests get the identical value for a given `now`. */\nexport function startOfTodayMs(now: Date = new Date()): number {\n const start = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n return now.getTime() - start.getTime();\n}\n\nexport function filterJournalEntries(entries: JournalEntry[], filter: JournalFilterState): JournalEntry[] {\n const now = Date.now();\n const q = filter.query.trim().toLowerCase();\n return entries.filter((e) => {\n if (!filter.sources.has(e.source)) return false;\n if (filter.windowMs !== null && now - new Date(e.ts).getTime() > filter.windowMs) return false;\n if (q) {\n const haystack = `${e.title} ${e.detail} ${e.repo ?? ''} ${e.statusLabel}`.toLowerCase();\n if (!haystack.includes(q)) return false;\n }\n return true;\n });\n}\n\n/** Hourly density buckets for the scrub timeline, oldest-first. */\nexport function bucketByHour(entries: JournalEntry[], hours: number): { bucketStartMs: number; count: number }[] {\n const now = Date.now();\n const hourMs = 60 * 60 * 1000;\n const buckets: { bucketStartMs: number; count: number }[] = [];\n for (let i = hours - 1; i >= 0; i--) {\n buckets.push({ bucketStartMs: now - i * hourMs, count: 0 });\n }\n for (const e of entries) {\n const t = new Date(e.ts).getTime();\n const age = now - t;\n if (age < 0 || age > hours * hourMs) continue;\n const idx = hours - 1 - Math.floor(age / hourMs);\n if (idx >= 0 && idx < buckets.length) buckets[idx]!.count += 1;\n }\n return buckets;\n}\n","/**\n * routes/journal/JournalFilters.tsx — fully controlled filter bar: source\n * toggles, free-text search, and a time-window quick-pick. Kept dumb on\n * purpose (all state lives in JournalView) so it stays trivially testable\n * and swappable.\n */\nimport type { JournalSource } from './journal-model.js';\nimport { startOfTodayMs } from './journal-model.js';\nimport styles from './JournalFilters.module.css';\n\nconst SOURCE_OPTIONS: { value: JournalSource; label: string }[] = [\n { value: 'run', label: 'Runs' },\n { value: 'merge', label: 'Merges' },\n { value: 'proposal', label: 'Proposals' },\n { value: 'agent-action', label: 'Agent actions' },\n { value: 'daemon-tick', label: 'Daemon ticks' },\n];\n\n// 'today' is dynamic (since local midnight, not a fixed rolling window) so\n// it carries `dynamic: true` instead of a fixed `ms` — the select handler\n// below recomputes it at selection time via startOfTodayMs(). Same value the\n// command palette's \"Open journal — today\" action seeds JournalView with.\nconst WINDOW_OPTIONS: { value: string; label: string; ms: number | null; dynamic?: boolean }[] = [\n { value: '1h', label: 'Last hour', ms: 60 * 60 * 1000 },\n { value: 'today', label: 'Today', ms: null, dynamic: true },\n { value: '24h', label: 'Last 24h', ms: 24 * 60 * 60 * 1000 },\n { value: '7d', label: 'Last 7 days', ms: 7 * 24 * 60 * 60 * 1000 },\n { value: 'all', label: 'All available', ms: null },\n];\n\nexport interface JournalFiltersProps {\n sources: Set<JournalSource>;\n onSourcesChange: (next: Set<JournalSource>) => void;\n query: string;\n onQueryChange: (next: string) => void;\n windowValue: string;\n onWindowChange: (value: string, ms: number | null) => void;\n}\n\nexport function JournalFilters({ sources, onSourcesChange, query, onQueryChange, windowValue, onWindowChange }: JournalFiltersProps) {\n function toggleSource(source: JournalSource) {\n const next = new Set(sources);\n if (next.has(source)) next.delete(source);\n else next.add(source);\n onSourcesChange(next);\n }\n\n return (\n <div className={styles.bar}>\n <input\n type=\"search\"\n className={styles.search}\n placeholder=\"Search title, detail, repo…\"\n value={query}\n onChange={(e) => onQueryChange(e.target.value)}\n aria-label=\"Search the work journal\"\n />\n <div className={styles.sources} role=\"group\" aria-label=\"Filter by source\">\n {SOURCE_OPTIONS.map((opt) => (\n <label key={opt.value} className={styles.sourceOption}>\n <input type=\"checkbox\" checked={sources.has(opt.value)} onChange={() => toggleSource(opt.value)} />\n {opt.label}\n </label>\n ))}\n </div>\n <select\n className={styles.windowSelect}\n value={windowValue}\n onChange={(e) => {\n const opt = WINDOW_OPTIONS.find((o) => o.value === e.target.value);\n onWindowChange(e.target.value, opt?.dynamic ? startOfTodayMs() : (opt?.ms ?? null));\n }}\n aria-label=\"Time window\"\n >\n {WINDOW_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\nexport const ALL_JOURNAL_SOURCES = new Set<JournalSource>(SOURCE_OPTIONS.map((o) => o.value));\n","/**\n * routes/journal/JournalTimeline.tsx — the \"scrubable\" part of the brief: a\n * density strip over the visible window, one bar per hour. Clicking or\n * keyboard-activating a bar jumps the list to the newest entry in that\n * hour. Pure CSS bars, not a canvas/SVG dependency — density is all the\n * signal this needs to carry.\n */\nimport { bucketByHour, type JournalEntry } from './journal-model.js';\nimport styles from './JournalTimeline.module.css';\n\nexport interface JournalTimelineProps {\n entries: JournalEntry[];\n hours: number;\n onScrubTo: (bucketStartMs: number) => void;\n}\n\nexport function JournalTimeline({ entries, hours, onScrubTo }: JournalTimelineProps) {\n const buckets = bucketByHour(entries, hours);\n const max = Math.max(1, ...buckets.map((b) => b.count));\n\n return (\n <div className={styles.strip} role=\"group\" aria-label={`Activity density over the last ${hours} hours`}>\n {buckets.map((b) => {\n const pct = Math.round((b.count / max) * 100);\n const label = new Date(b.bucketStartMs).toLocaleTimeString(undefined, { hour: 'numeric' });\n return (\n <button\n key={b.bucketStartMs}\n type=\"button\"\n className={styles.bar}\n onClick={() => onScrubTo(b.bucketStartMs)}\n disabled={b.count === 0}\n title={`${label}: ${b.count} entr${b.count === 1 ? 'y' : 'ies'}`}\n aria-label={`${label}: ${b.count} entries`}\n >\n <span className={styles.fill} style={{ height: `${Math.max(pct, b.count > 0 ? 8 : 0)}%` }} />\n </button>\n );\n })}\n </div>\n );\n}\n","/**\n * routes/journal/JournalEntryDetail.tsx — the \"why did it do that, in one\n * click\" drill-in (build brief, journal section). Only mounts when its\n * parent <details> is opened, so the extra fetch it performs (proposal\n * diff/taste/verdict, or a live run stream) never happens for rows nobody\n * expands.\n */\nimport { useQuery } from '../../data/hooks.js';\nimport { proposalDetailQuery } from '../../data/queries.js';\nimport { RunStreamPanel } from '../../components/stream/index.js';\nimport { SkeletonLine } from '../../components/primitives/Skeleton.js';\nimport { StatusBadge } from '../../components/primitives/StatusBadge.js';\nimport type { JournalDrillIn } from './journal-model.js';\nimport styles from './JournalEntryDetail.module.css';\n\nfunction ProposalDetail({ proposalId }: { proposalId: string }) {\n const query = useQuery(proposalDetailQuery(proposalId));\n\n if (query.status === 'loading') return <SkeletonLine width=\"80%\" />;\n if (query.status === 'error') {\n return (\n <p className={styles.error}>\n Could not load proposal {proposalId}: {query.error?.message ?? 'not found on disk (it may have been pruned).'}\n </p>\n );\n }\n const p = query.data;\n if (!p) return null;\n\n return (\n <div className={styles.detailBody}>\n <dl className={styles.grid}>\n <div>\n <dt>Status</dt>\n <dd>\n <StatusBadge status={p.status} />\n </dd>\n </div>\n {p.riskClass ? (\n <div>\n <dt>Risk</dt>\n <dd>{p.riskClass}</dd>\n </div>\n ) : null}\n {p.taste ? (\n <div>\n <dt>Judge verdict</dt>\n <dd>\n {p.taste.verdict} · alignment {p.taste.alignment}/10 · ambition {p.taste.ambition}/10 · design{' '}\n {p.taste.design}/10\n </dd>\n </div>\n ) : null}\n {p.decisionReason ? (\n <div>\n <dt>Decision</dt>\n <dd>{p.decisionReason}</dd>\n </div>\n ) : null}\n {p.learningSource ? (\n <div>\n <dt>Learning source</dt>\n <dd>{p.learningSource}</dd>\n </div>\n ) : null}\n </dl>\n {p.taste?.rationale ? <p className={styles.rationale}>{p.taste.rationale}</p> : null}\n {p.diff ? (\n <details className={styles.diffDetails}>\n <summary>Diff ({p.diff.split('\\n').length} lines)</summary>\n <pre className={styles.diff}>{p.diff}</pre>\n </details>\n ) : (\n <p className={styles.error}>No diff recorded for this proposal.</p>\n )}\n </div>\n );\n}\n\nexport function JournalEntryDetail({ drillIn }: { drillIn: JournalDrillIn }) {\n if (drillIn.runId) {\n return <RunStreamPanel runId={drillIn.runId} />;\n }\n if (drillIn.proposalId) {\n return <ProposalDetail proposalId={drillIn.proposalId} />;\n }\n return null;\n}\n","/**\n * routes/journal/JournalEntryRow.tsx — one line of the work journal.\n * `<details data-state-key>` per DESIGN.md's scroll/expanded-state-survival\n * pattern (useScrollRestore) so expanding a row to drill in survives a\n * background refresh; `data-focus-key` on the summary so keyboard focus\n * survives the same. The detail body (JournalEntryDetail) only mounts once\n * expanded — see that file's header comment for why.\n */\nimport { useState } from 'react';\nimport { StatusBadge } from '../../components/primitives/StatusBadge.js';\nimport { EpistemicBadge } from '../../components/primitives/Epistemic.js';\nimport { JournalEntryDetail } from './JournalEntryDetail.js';\nimport type { JournalEntry } from './journal-model.js';\nimport styles from './JournalEntryRow.module.css';\n\nconst SOURCE_LABEL: Record<JournalEntry['source'], string> = {\n 'daemon-tick': 'Daemon',\n merge: 'Merge',\n 'agent-action': 'Agent',\n run: 'Run',\n proposal: 'Proposal',\n};\n\nfunction formatWhen(iso: string): string {\n const d = new Date(iso);\n return `${d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })} ${d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`;\n}\n\nexport function JournalEntryRow({ entry }: { entry: JournalEntry }) {\n const hasDrillIn = Boolean(entry.drillIn);\n // <details> stays UNCONTROLLED on purpose — useScrollRestore\n // (hooks/useScrollRestore.ts) restores expanded/collapsed state by setting\n // the DOM `.open` property directly on `[data-state-key]` elements, which\n // a React-controlled `open` prop would fight on the next render. `expanded`\n // here only gates whether the (expensive: fetches a proposal or polls a\n // run) <JournalEntryDetail/> actually mounts — it does not drive the\n // <details> element itself. The native `toggle` event fires for both user\n // clicks and scroll-restore's programmatic `.open = true`, so this stays\n // in sync either way.\n const [expanded, setExpanded] = useState(false);\n\n return (\n <details\n className={styles.row}\n data-state-key={`journal-${entry.id}`}\n onToggle={(e) => setExpanded(e.currentTarget.open)}\n >\n <summary className={styles.summary} data-focus-key={`journal-${entry.id}`}>\n <span className={styles.sourceTag} data-source={entry.source}>\n {SOURCE_LABEL[entry.source]}\n </span>\n <span className={styles.when} title={entry.ts}>\n {formatWhen(entry.ts)}\n </span>\n <StatusBadge status={entry.statusLabel} />\n {entry.repo ? <span className={styles.repo}>{entry.repo}</span> : null}\n <span className={styles.title}>{entry.title}</span>\n <EpistemicBadge quality={entry.sourceQuality} />\n {hasDrillIn ? (\n <span className={styles.expandHint} aria-hidden=\"true\">\n why? ▾\n </span>\n ) : null}\n </summary>\n <div className={styles.body}>\n <p className={styles.detailText}>{entry.detail}</p>\n {expanded && entry.drillIn ? <JournalEntryDetail drillIn={entry.drillIn} /> : null}\n </div>\n </details>\n );\n}\n","/**\n * routes/journal/JournalView.tsx — \"what did the fleet do overnight,\n * answerable in one glance; why, in one click\" (build brief). Merges every\n * history source the read API exposes (see journal-model.ts's header\n * comment for the exact, honestly-stated window), makes it filterable and\n * scrubable, and surfaces a live-now strip for anything currently running.\n *\n * Follows DESIGN.md's view checklist: useQuery per resource (never apiGet\n * directly), 'loading' -> skeleton, 'error' -> inline banner (never blanks\n * the shell), 'refreshing' -> real content + <RefreshIndicator/>, every\n * sourceQuality-bearing field wrapped in <Epistemic/> (done inside\n * JournalEntryRow via <EpistemicBadge/>).\n */\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useQuery, useRefetch } from '../../data/hooks.js';\nimport { controlLogsObservationQuery, fleetActivityQuery, runsQuery, inboxQuery } from '../../data/queries.js';\nimport { RefreshIndicator } from '../../components/primitives/RefreshIndicator.js';\nimport { SkeletonRow } from '../../components/primitives/Skeleton.js';\nimport { LiveNowStrip } from './LiveNowStrip.js';\nimport { JournalFilters, ALL_JOURNAL_SOURCES } from './JournalFilters.js';\nimport { JournalTimeline } from './JournalTimeline.js';\nimport { JournalEntryRow } from './JournalEntryRow.js';\nimport { buildJournalEntries, filterJournalEntries, startOfTodayMs, type JournalSource } from './journal-model.js';\n\n/** Command-palette \"Open journal — today\" navigates here with\n * `state: { windowToday: true }` (react-router's location.state, not a new\n * URL-param convention — this app is HashRouter'd with no useSearchParams\n * usage anywhere else). Read once on mount as the initial filter; the\n * operator can still change it from the normal filter bar afterward. */\ninterface JournalNavState {\n windowToday?: boolean;\n}\nimport styles from './JournalView.module.css';\n\n/** control-logs-observation isn't SSE-invalidated (its key isn't in\n * data/sse.ts's EVENT_TO_CACHE_KEYS) — poll it ourselves, same rationale as\n * the notification engine's summary poll. */\nconst LOGS_POLL_MS = 8000;\n\nfunction formatRelative(ts: number): string {\n const seconds = Math.max(0, Math.round((Date.now() - ts) / 1000));\n if (seconds < 5) return 'just now';\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.round(seconds / 60);\n return `${minutes}m ago`;\n}\n\nexport function JournalView() {\n const location = useLocation();\n const openedToToday = (location.state as JournalNavState | null)?.windowToday === true;\n\n const logsQuery = useQuery(controlLogsObservationQuery);\n const activityQuery = useQuery(fleetActivityQuery);\n const runsListQuery = useQuery(runsQuery);\n const inboxListQuery = useQuery(inboxQuery);\n const refetchLogs = useRefetch(controlLogsObservationQuery);\n\n useEffect(() => {\n const id = setInterval(refetchLogs, LOGS_POLL_MS);\n return () => clearInterval(id);\n }, [refetchLogs]);\n\n const [sources, setSources] = useState<Set<JournalSource>>(new Set(ALL_JOURNAL_SOURCES));\n const [query, setQuery] = useState('');\n const [windowValue, setWindowValue] = useState(openedToToday ? 'today' : '24h');\n const [windowMs, setWindowMs] = useState<number | null>(openedToToday ? startOfTodayMs() : 24 * 60 * 60 * 1000);\n\n const entries = useMemo(\n () =>\n buildJournalEntries({\n logs: logsQuery.data,\n fleetActivity: activityQuery.data,\n runs: runsListQuery.data,\n inbox: inboxListQuery.data,\n }),\n [logsQuery.data, activityQuery.data, runsListQuery.data, inboxListQuery.data],\n );\n\n const filtered = useMemo(\n () => filterJournalEntries(entries, { sources, query, windowMs }),\n [entries, sources, query, windowMs],\n );\n\n const rowRefs = useRef(new Map<string, HTMLLIElement>());\n function scrubTo(bucketStartMs: number) {\n const hourMs = 60 * 60 * 1000;\n const target = filtered.find((e) => new Date(e.ts).getTime() <= bucketStartMs + hourMs);\n if (!target) return;\n rowRefs.current.get(target.id)?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n\n const anyLoading =\n logsQuery.status === 'loading' &&\n activityQuery.status === 'loading' &&\n runsListQuery.status === 'loading' &&\n inboxListQuery.status === 'loading';\n const anyRefreshing = [logsQuery, activityQuery, runsListQuery, inboxListQuery].some((q) => q.status === 'refreshing');\n const latestUpdatedAt = Math.max(\n logsQuery.updatedAt ?? 0,\n activityQuery.updatedAt ?? 0,\n runsListQuery.updatedAt ?? 0,\n inboxListQuery.updatedAt ?? 0,\n );\n\n const errors = [\n logsQuery.status === 'error' ? `daemon log: ${logsQuery.error?.message}` : null,\n activityQuery.status === 'error' ? `fleet activity: ${activityQuery.error?.message}` : null,\n runsListQuery.status === 'error' ? `runs: ${runsListQuery.error?.message}` : null,\n inboxListQuery.status === 'error' ? `inbox: ${inboxListQuery.error?.message}` : null,\n ].filter((e): e is string => e !== null);\n\n return (\n <div className={styles.view}>\n <header className={styles.header}>\n <div>\n <h1 className={styles.title}>Work Journal</h1>\n <p className={styles.windowNote}>\n Merges the daemon log (last 200 lines), fleet activity (last ~20 merges/ticks/agent actions), recent runs\n (last 200), and the pending-proposal inbox. The read API does not expose the full on-disk history beyond\n this window.\n </p>\n </div>\n <div className={styles.freshness} aria-live=\"polite\">\n {anyRefreshing ? <RefreshIndicator /> : null}\n {latestUpdatedAt > 0 ? <span className={styles.freshnessLabel}>Updated {formatRelative(latestUpdatedAt)}</span> : null}\n </div>\n </header>\n\n {errors.length > 0 ? (\n <div className={styles.errorBanner} role=\"alert\">\n Some sources failed to load: {errors.join('; ')}\n </div>\n ) : null}\n\n <LiveNowStrip />\n\n {anyLoading ? (\n <div className={styles.panel}>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : (\n <>\n <JournalTimeline entries={entries} hours={24} onScrubTo={scrubTo} />\n <JournalFilters\n sources={sources}\n onSourcesChange={setSources}\n query={query}\n onQueryChange={setQuery}\n windowValue={windowValue}\n onWindowChange={(value, ms) => {\n setWindowValue(value);\n setWindowMs(ms);\n }}\n />\n <div className={styles.panel}>\n {filtered.length === 0 ? (\n <p className={styles.empty}>Nothing matches the current filters in this window.</p>\n ) : (\n <ul className={styles.list}>\n {filtered.map((entry) => (\n <li\n key={entry.id}\n ref={(el) => {\n if (el) rowRefs.current.set(entry.id, el);\n else rowRefs.current.delete(entry.id);\n }}\n >\n <JournalEntryRow entry={entry} />\n </li>\n ))}\n </ul>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n","/**\n * routes/intelligence/pulse/PulseView.tsx — cost/token rollups over\n * 1d/7d/30d windows (GET /api/pulse?window=). Reference pattern followed:\n * routes/fleet-dashboard/FleetDashboardView.tsx (useQuery, status branching,\n * never blank on refresh) + DESIGN.md \"Adding a new view\" checklist.\n */\nimport { useState } from 'react';\nimport { pulseQuery, type PulseWindow } from '../../../data/queries.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport { SkeletonCardGrid } from '../../../components/primitives/Skeleton.js';\nimport {\n ChartContainer,\n LineChart,\n BarChart,\n StatTile,\n TableView,\n chartFormat,\n type Series,\n type CategoricalDatum,\n type TableColumn,\n} from '../../../components/charts/index.js';\nimport type { ActivityRollup, ProjectActivity, ModelUsage } from '../../../data/api-types.js';\nimport { calendarDayStart } from '../../verse/growth/calendar-day.js';\nimport styles from './PulseView.module.css';\n\nconst WINDOWS: PulseWindow[] = ['1d', '7d', '30d'];\n\nconst BUDGET_TONE: Record<string, Tone> = { ok: 'success', warn: 'warning', over: 'danger' };\n\nfunction projectLabel(path: string): string {\n const parts = path.replace(/\\/+$/, '').split('/');\n return parts[parts.length - 1] || path;\n}\n\nexport function PulseView() {\n const [window, setWindow] = useState<PulseWindow>('7d');\n const query = useQuery(pulseQuery(window));\n\n return (\n <div className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Pulse</h1>\n <div className={styles.freshness} aria-live=\"polite\">\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n {query.updatedAt ? (\n <span className={styles.freshnessLabel}>Updated {formatRelative(query.updatedAt)}</span>\n ) : null}\n </div>\n </header>\n\n <div className={styles.filterRow} role=\"group\" aria-label=\"Time window\">\n <div className={styles.windowGroup}>\n {WINDOWS.map((w) => (\n <button\n key={w}\n type=\"button\"\n className={`${styles.windowButton} ${w === window ? styles.windowButtonActive : ''}`}\n aria-pressed={w === window}\n onClick={() => setWindow(w)}\n >\n {w}\n </button>\n ))}\n </div>\n {query.data ? <StatusBadge status={query.data.budget.level} tone={BUDGET_TONE[query.data.budget.level]}>\n {query.data.budget.message}\n </StatusBadge> : null}\n </div>\n\n {query.status === 'loading' ? (\n <SkeletonCardGrid count={4} />\n ) : query.status === 'error' ? (\n <div className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Failed to load pulse data.'}\n </div>\n ) : query.data ? (\n <PulseBody rollup={query.data} />\n ) : null}\n </div>\n );\n}\n\nfunction PulseBody({ rollup }: { rollup: ActivityRollup }) {\n const costSeries: Series[] = [\n {\n id: 'cost',\n label: 'Est. cost (USD)',\n // Local midnight of each calendar-day row (see growth/calendar-day): the\n // axis labels in local time, so a UTC-midnight stamp read a day early\n // west of UTC.\n points: rollup.byDay.map((d) => ({ x: calendarDayStart(d.day), y: d.estCostUsd })),\n },\n ];\n\n const topProjects = [...rollup.byProject]\n .sort((a, b) => b.estCostUsd - a.estCostUsd)\n .slice(0, 8);\n const projectBars: CategoricalDatum[] = topProjects.map((p) => ({\n label: projectLabel(p.project),\n value: p.estCostUsd,\n }));\n\n const topModels = [...rollup.byModel].sort((a, b) => b.estCostUsd - a.estCostUsd).slice(0, 8);\n const modelBars: CategoricalDatum[] = topModels.map((m) => ({ label: m.model, value: m.estCostUsd }));\n\n const projectColumns: TableColumn<ProjectActivity>[] = [\n { key: 'project', label: 'Project', render: (r) => projectLabel(r.project) },\n { key: 'sessions', label: 'Sessions', numeric: true, render: (r) => String(r.sessions) },\n { key: 'commits', label: 'Commits', numeric: true, render: (r) => String(r.commits) },\n { key: 'cost', label: 'Cost', numeric: true, render: (r) => chartFormat.formatUsd(r.estCostUsd) },\n ];\n\n const modelColumns: TableColumn<ModelUsage>[] = [\n { key: 'model', label: 'Model', render: (r) => r.model },\n { key: 'calls', label: 'Calls', numeric: true, render: (r) => String(r.calls) },\n {\n key: 'tokens',\n label: 'Tokens',\n numeric: true,\n render: (r) => chartFormat.formatCompact(r.tokensIn + r.tokensOut),\n },\n { key: 'cost', label: 'Cost', numeric: true, render: (r) => chartFormat.formatUsd(r.estCostUsd) },\n ];\n\n return (\n <>\n <div className={styles.kpiGrid}>\n <StatTile label=\"Est. cost\" value={chartFormat.formatUsd(rollup.totals.estCostUsd)} caption={rollup.window} />\n <StatTile\n label=\"Tokens\"\n value={chartFormat.formatCompact(rollup.totals.tokensIn + rollup.totals.tokensOut)}\n caption={`${chartFormat.formatCompact(rollup.totals.tokensIn)} in / ${chartFormat.formatCompact(rollup.totals.tokensOut)} out`}\n />\n <StatTile label=\"Sessions\" value={String(rollup.totals.sessions)} />\n <StatTile label=\"Commits\" value={String(rollup.totals.commits)} />\n </div>\n\n <div className={styles.chartsGrid}>\n <ChartContainer\n title=\"Cost over time\"\n description={`since ${new Date(rollup.since).toLocaleDateString()}`}\n empty={rollup.byDay.length === 0}\n emptyMessage=\"No activity recorded in this window.\"\n table={\n <TableView\n caption=\"Daily cost\"\n rowKey={(r) => r.day}\n rows={rollup.byDay}\n columns={[\n { key: 'day', label: 'Day', render: (r) => r.day },\n { key: 'cost', label: 'Cost', numeric: true, render: (r) => chartFormat.formatUsd(r.estCostUsd) },\n { key: 'sessions', label: 'Sessions', numeric: true, render: (r) => String(r.sessions) },\n ]}\n />\n }\n >\n <LineChart\n series={costSeries}\n area\n ariaLabel=\"Estimated cost over time\"\n formatX={(x) => new Date(x).toLocaleDateString(undefined, { month: 'short', day: 'numeric' })}\n formatY={(y) => chartFormat.formatUsd(y)}\n />\n </ChartContainer>\n\n <ChartContainer\n title=\"Top projects by cost\"\n empty={projectBars.length === 0}\n emptyMessage=\"No project activity in this window.\"\n table={\n <TableView caption=\"Cost by project\" rowKey={(r) => r.project} rows={topProjects} columns={projectColumns} />\n }\n >\n <BarChart\n data={projectBars}\n orientation=\"horizontal\"\n ariaLabel=\"Top projects by estimated cost\"\n formatValue={(v) => chartFormat.formatUsd(v)}\n />\n </ChartContainer>\n\n <ChartContainer\n title=\"Cost by model\"\n empty={modelBars.length === 0}\n emptyMessage=\"No model activity in this window.\"\n table={\n <TableView caption=\"Cost by model\" rowKey={(r) => r.model} rows={topModels} columns={modelColumns} />\n }\n >\n <BarChart\n data={modelBars}\n ariaLabel=\"Cost by model\"\n formatValue={(v) => chartFormat.formatUsd(v)}\n />\n </ChartContainer>\n </div>\n </>\n );\n}\n\nfunction formatRelative(ts: number): string {\n const seconds = Math.max(0, Math.round((Date.now() - ts) / 1000));\n if (seconds < 5) return 'just now';\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.round(seconds / 60);\n return `${minutes}m ago`;\n}\n","/**\n * routes/intelligence/genome/GenomeView.tsx — cross-repo knowledge search\n * (GET /api/genome[?q=]). ~2,014 entries across ~564 projects on the\n * operator's machine (per the brief), so: debounce the query, cap how many\n * rows render in browse mode (no query — the full unfiltered list), and\n * never eagerly render thousands of DOM rows.\n */\nimport { useEffect, useMemo, useState } from 'react';\nimport { genomeQuery, isRecallHit } from '../../../data/queries.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { ChartContainer, BarChart, chartFormat, type CategoricalDatum } from '../../../components/charts/index.js';\nimport type { GenomeEntry, RecallHit } from '../../../data/api-types.js';\nimport styles from './GenomeView.module.css';\n\nconst BROWSE_LIMIT = 50;\nconst DEBOUNCE_MS = 300;\n\nfunction useDebounced<T>(value: T, ms: number): T {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n const t = setTimeout(() => setDebounced(value), ms);\n return () => clearTimeout(t);\n }, [value, ms]);\n return debounced;\n}\n\nfunction snippetOf(text: string, max = 220): string {\n const t = text.trim();\n return t.length > max ? `${t.slice(0, max - 1)}…` : t;\n}\n\nfunction relativeTs(iso: string): string {\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return iso;\n const days = Math.floor((Date.now() - ms) / 86_400_000);\n if (days <= 0) return 'today';\n if (days === 1) return 'yesterday';\n if (days < 30) return `${days}d ago`;\n const months = Math.floor(days / 30);\n return `${months}mo ago`;\n}\n\nexport function GenomeView() {\n const [query, setQuery] = useState('');\n const debouncedQuery = useDebounced(query, DEBOUNCE_MS);\n const resourceQuery = useQuery(genomeQuery(debouncedQuery));\n const isSearching = debouncedQuery.trim().length > 0;\n\n const data = resourceQuery.data;\n\n const { rows, totalCount } = useMemo(() => {\n if (!data) return { rows: [] as (GenomeEntry | RecallHit)[], totalCount: 0 };\n if (isSearching) return { rows: data, totalCount: data.length };\n const entries = data as GenomeEntry[];\n const sorted = [...entries].sort((a, b) => Date.parse(b.ts) - Date.parse(a.ts));\n return { rows: sorted.slice(0, BROWSE_LIMIT), totalCount: entries.length };\n }, [data, isSearching]);\n\n const projectBars: CategoricalDatum[] = useMemo(() => {\n if (!data || isSearching) return [];\n const entries = data as GenomeEntry[];\n const counts = new Map<string, number>();\n for (const e of entries) {\n const key = e.project ?? '(unscoped)';\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 8)\n .map(([label, value]) => ({ label, value }));\n }, [data, isSearching]);\n\n return (\n <div className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Genome</h1>\n <div aria-live=\"polite\">{resourceQuery.status === 'refreshing' ? <RefreshIndicator /> : null}</div>\n </header>\n\n <div className={styles.searchRow}>\n <input\n type=\"search\"\n className={styles.searchInput}\n placeholder=\"Search the genome (title, tags, body text)…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n aria-label=\"Search cross-repo knowledge\"\n />\n {data ? (\n <span className={styles.resultCount}>\n {isSearching\n ? `${totalCount} match${totalCount === 1 ? '' : 'es'}`\n : `showing ${rows.length} of ${totalCount}`}\n </span>\n ) : null}\n </div>\n\n {!isSearching && projectBars.length > 0 ? (\n <ChartContainer title=\"Top projects by genome entries\" description=\"browse mode — all loaded entries\">\n <BarChart\n data={projectBars}\n orientation=\"horizontal\"\n ariaLabel=\"Top projects by genome entry count\"\n formatValue={(v) => chartFormat.formatCompact(v)}\n />\n </ChartContainer>\n ) : null}\n\n {resourceQuery.status === 'loading' ? (\n <div className={styles.skeletons} aria-hidden=\"true\">\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : resourceQuery.status === 'error' ? (\n <div className={styles.error} role=\"alert\">\n {resourceQuery.error?.message ?? 'Failed to load genome data.'}\n </div>\n ) : rows.length === 0 ? (\n <p className={styles.empty}>\n {isSearching ? `No genome entries match \"${debouncedQuery}\".` : 'No genome entries recorded yet.'}\n </p>\n ) : (\n <ul className={styles.results}>\n {rows.map((item) => {\n const hit = isRecallHit(item) ? item : null;\n const entry = hit ? hit.entry : (item as GenomeEntry);\n return (\n <li key={entry.id} className={styles.row}>\n <div className={styles.rowHeader}>\n <span className={styles.rowTitle}>{entry.title}</span>\n <span className={styles.rowMeta}>\n {hit ? <span className={styles.badge}>{hit.method} · {hit.score.toFixed(2)}</span> : null}\n <span>{relativeTs(entry.ts)}</span>\n </span>\n </div>\n <div className={styles.rowMeta}>\n <span className={styles.badge}>{entry.project ?? 'unscoped'}</span>\n <span className={styles.badge}>{entry.source}</span>\n </div>\n <p className={styles.snippet}>{snippetOf(entry.text)}</p>\n {entry.tags.length > 0 ? (\n <div className={styles.tags}>\n {entry.tags.map((t) => (\n <span key={t} className={styles.tag}>\n {t}\n </span>\n ))}\n </div>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","/**\n * routes/intelligence/production/ProductionView.tsx — ships-per-day, judge\n * verdict breakdown, auto-merges (DashboardSnapshot.production via\n * GET /api/snapshot) + per-model ship rate / cost-per-merge / best-of-N wins\n * (GET /api/models?window=).\n *\n * Source-backed production truth: every persisted aggregate is rendered\n * through its corresponding source-quality contract.\n * ProductionSummary.judgeVerdicts24h is built from JudgeTrace, whose\n * `verdict` field is strictly 'ship'|'review'|'noise'|'harmful' — a\n * judge-parse-failure/judge-network-failure (manager.ts's judgeProposal()\n * fallback, ~line 611-626) sets `verdict: 'review'` because that's the\n * fail-closed choice for the AUTO-REJECT gate, and nothing downstream of\n * that field currently re-splits it. The recent fix (commit 5db524aa) tags\n * the distinction correctly in the decisions ledger's `judgeReasonCode`\n * ('judge-parse-failure' / 'judge-network-failure', see\n * judge-decision-metadata.ts) for LEARNING purposes, but that tag isn't\n * propagated into JudgeTrace or ProductionSummary, the only judge-verdict\n * aggregate exposed via any GET route today. Per this build's scope\n * (src/core/dashboard.ts and src/core/web/api.ts are off-limits), this view\n * cannot re-derive the split client-side — so it discloses the gap instead\n * of pretending the 'review' bucket is clean. Flagged separately for a\n * backend follow-up (add parse/network counts to ProductionSummary).\n */\nimport { useState } from 'react';\nimport { dashboardSnapshotQuery, modelsQuery, type ModelStatsWindow } from '../../../data/queries.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { Epistemic, isKnown } from '../../../components/primitives/Epistemic.js';\nimport { SkeletonCardGrid } from '../../../components/primitives/Skeleton.js';\nimport {\n ChartContainer,\n BarChart,\n StatTile,\n TableView,\n chartFormat,\n type CategoricalDatum,\n type TableColumn,\n} from '../../../components/charts/index.js';\nimport type { ModelStats, DashboardProductionSummary } from '../../../data/api-types.js';\nimport styles from './ProductionView.module.css';\n\nconst WINDOWS: ModelStatsWindow[] = ['7d', '30d', 'all'];\n\nfunction engineModelLabel(m: ModelStats): string {\n return `${m.engine}:${m.model}`;\n}\n\nexport function ProductionView() {\n const [window, setWindow] = useState<ModelStatsWindow>('30d');\n const snapshotQuery = useQuery(dashboardSnapshotQuery);\n const modelsResult = useQuery(modelsQuery(window));\n\n // DashboardSnapshot types `.production` as the base ProductionSummary\n // (see the api-types.ts note on DashboardProductionSummary), but\n // buildSnapshot() always returns the richer DashboardProductionSummary\n // shape at runtime — this cast just recovers that at the type level.\n const production = snapshotQuery.data?.production as DashboardProductionSummary | undefined;\n\n return (\n <div className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Production</h1>\n <div aria-live=\"polite\">\n {snapshotQuery.status === 'refreshing' || modelsResult.status === 'refreshing' ? (\n <RefreshIndicator />\n ) : null}\n </div>\n </header>\n\n {snapshotQuery.status === 'loading' ? (\n <SkeletonCardGrid count={4} />\n ) : snapshotQuery.status === 'error' ? (\n <div className={styles.error} role=\"alert\">\n {snapshotQuery.error?.message ?? 'Failed to load production summary.'}\n </div>\n ) : !production ? (\n <p className={styles.notAvailable}>\n Production summary not available on this server (older producer, or not yet populated).\n </p>\n ) : (\n <ProductionSection production={production} />\n )}\n\n <div className={styles.filterRow} role=\"group\" aria-label=\"Model stats window\">\n <div className={styles.windowGroup}>\n {WINDOWS.map((w) => (\n <button\n key={w}\n type=\"button\"\n className={`${styles.windowButton} ${w === window ? styles.windowButtonActive : ''}`}\n aria-pressed={w === window}\n onClick={() => setWindow(w)}\n >\n {w}\n </button>\n ))}\n </div>\n </div>\n\n {modelsResult.status === 'loading' ? (\n <SkeletonCardGrid count={3} />\n ) : modelsResult.status === 'error' ? (\n <div className={styles.error} role=\"alert\">\n {modelsResult.error?.message ?? 'Failed to load per-model stats.'}\n </div>\n ) : modelsResult.data ? (\n <ModelStatsSection result={modelsResult.data} />\n ) : null}\n </div>\n );\n}\n\nfunction ProductionSection({ production }: { production: DashboardProductionSummary }) {\n const jv = production.judgeVerdicts24h;\n const judgeFailures = production.judgeFailures24h ?? { total: 0, parse: 0, network: 0 };\n const verdictBars: CategoricalDatum[] = [\n { label: 'ship', value: jv.ship },\n { label: 'review', value: jv.review },\n { label: 'noise', value: jv.noise },\n { label: 'harmful', value: jv.harmful },\n ];\n const shipTrend: CategoricalDatum[] = production.shipsPerDayTrend.map((d) => ({\n label: chartFormat.formatDayLabel(d.date),\n value: d.count,\n }));\n const totalShipped = production.shipsPerDayTrend.reduce((sum, d) => sum + d.count, 0);\n const proposalsKnown = isKnown(production.proposalSourceQuality);\n const verdictsKnown = isKnown(production.judgeTraceSourceQuality);\n\n return (\n <>\n <div className={styles.kpiGrid}>\n <StatTile\n label=\"Proposals (24h)\"\n value={<Epistemic quality={production.proposalSourceQuality} label=\"proposals\">{String(production.proposals24h.total)}</Epistemic>}\n caption={<Epistemic quality={production.proposalSourceQuality} label=\"pending proposals\">{`${production.proposals24h.pending} pending`}</Epistemic>}\n />\n <StatTile label=\"Auto-merges today\" value={<Epistemic quality={production.proposalSourceQuality} label=\"auto-merges\">{String(production.autoMergesToday.count)}</Epistemic>} />\n <StatTile label=\"Judged (24h)\" value={<Epistemic quality={production.judgeTraceSourceQuality} label=\"judge verdicts\">{String(jv.total)}</Epistemic>} />\n <StatTile label=\"Judge failures (24h)\" value={<Epistemic quality={production.judgeFailureSourceQuality} label=\"judge failures\">{String(judgeFailures.total)}</Epistemic>} caption={<Epistemic quality={production.judgeFailureSourceQuality}>{`${judgeFailures.parse} parse · ${judgeFailures.network} network`}</Epistemic>} />\n <StatTile label=\"Active goals\" value={<Epistemic quality={production.activeGoalsSourceQuality} label=\"active goals\">{String(production.activeGoals.length)}</Epistemic>} />\n </div>\n\n <div className={styles.chartsGrid}>\n <ChartContainer\n title=\"Ships per day\"\n description=\"last 7 days\"\n empty={proposalsKnown && shipTrend.length === 0}\n emptyMessage=\"No ship history recorded yet.\"\n table={proposalsKnown ? (\n <TableView\n caption=\"Ships per day\"\n rowKey={(r) => r.label}\n rows={shipTrend}\n columns={[\n { key: 'day', label: 'Day', render: (r) => r.label },\n { key: 'count', label: 'Ships', numeric: true, render: (r) => String(r.value ?? 0) },\n ]}\n />\n ) : undefined}\n >\n {!proposalsKnown ? (\n <Epistemic quality={production.proposalSourceQuality} label=\"ship history\">ship history</Epistemic>\n ) : totalShipped === 0 ? (\n <p className={styles.notAvailable}>\n 0 ships in the last 7 days — this is the real number, not a loading state.\n </p>\n ) : null}\n {proposalsKnown ? <BarChart data={shipTrend} ariaLabel=\"Ships per day, last 7 days\" formatValue={(v) => String(v)} /> : null}\n </ChartContainer>\n\n <ChartContainer\n title=\"Judge verdict breakdown\"\n description=\"last 24h\"\n empty={verdictsKnown && jv.total === 0}\n emptyMessage=\"No judge verdicts recorded in the last 24h.\"\n >\n {verdictsKnown\n ? <BarChart data={verdictBars} ariaLabel=\"Judge verdict breakdown, last 24h\" formatValue={(v) => String(v)} />\n : <Epistemic quality={production.judgeTraceSourceQuality} label=\"judge verdicts\">judge verdicts</Epistemic>}\n </ChartContainer>\n </div>\n\n {!isKnown(production.activeGoalsSourceQuality) ? (\n <div className={styles.section}><h2 className={styles.sectionTitle}>Active goals</h2><Epistemic quality={production.activeGoalsSourceQuality} label=\"active goals\">active goals</Epistemic></div>\n ) : production.activeGoals.length > 0 ? (\n <div className={styles.section}>\n <h2 className={styles.sectionTitle}>Active goals</h2>\n <ul className={styles.goalsList}>\n {production.activeGoals.map((g) => {\n const fraction = g.totalMilestones > 0 ? g.doneMilestones / g.totalMilestones : 0;\n return (\n <li key={g.goalId} className={styles.goalRow}>\n <span className={styles.goalObjective}>{g.objective}</span>\n <div className={styles.meterTrack}>\n <div className={styles.meterFill} style={{ width: `${Math.round(fraction * 100)}%` }} />\n </div>\n <span className={styles.goalMeta}>\n {g.doneMilestones} / {g.totalMilestones} milestones\n </span>\n </li>\n );\n })}\n </ul>\n </div>\n ) : null}\n </>\n );\n}\n\nfunction ModelStatsSection({ result }: { result: { models: ModelStats[]; bestOfNSource: unknown } }) {\n const models = [...result.models].sort((a, b) => b.dispatches - a.dispatches).slice(0, 12);\n const shipRateBars: CategoricalDatum[] = models.map((m) => ({\n label: engineModelLabel(m),\n value: m.judged > 0 ? m.shipRate : null,\n }));\n\n const columns: TableColumn<ModelStats>[] = [\n { key: 'model', label: 'Model', render: (r) => engineModelLabel(r) },\n { key: 'dispatches', label: 'Dispatches', numeric: true, render: (r) => String(r.dispatches) },\n {\n key: 'shipRate',\n label: 'Ship rate',\n numeric: true,\n render: (r) => (r.judged > 0 ? chartFormat.formatPercent(r.shipRate) : '—'),\n },\n { key: 'merged', label: 'Merged', numeric: true, render: (r) => String(r.merged) },\n {\n key: 'costPerMerged',\n label: 'Cost / merge',\n numeric: true,\n render: (r) => (r.costPerMergedUsd !== null ? chartFormat.formatUsd(r.costPerMergedUsd) : '—'),\n },\n {\n key: 'bestOfN',\n label: 'Best-of-N win rate',\n numeric: true,\n render: (r) =>\n r.bestOfNAvailable ? (\n <Epistemic quality={result.bestOfNSource as never} label=\"best-of-N win rate\">\n {chartFormat.formatPercent(r.bestOfN.winRate)}\n </Epistemic>\n ) : (\n '—'\n ),\n },\n ];\n\n return (\n <div className={styles.chartsGrid}>\n <ChartContainer\n title=\"Ship rate by model\"\n description=\"judged proposals in the selected window\"\n empty={models.length === 0}\n emptyMessage=\"No dispatch history for this window.\"\n table={<TableView caption=\"Per-model economics\" rowKey={engineModelLabel} rows={models} columns={columns} />}\n >\n <BarChart\n data={shipRateBars}\n ariaLabel=\"Ship rate by model\"\n formatValue={(v) => chartFormat.formatPercent(v)}\n />\n </ChartContainer>\n </div>\n );\n}\n","/**\n * routes/portfolio/PortfolioView.tsx — org-level roll-up across enrolled\n * repos (GET /api/portfolio -> DashboardSnapshot.portfolio ?? null). `null`\n * is a legitimate, non-error response (older producer or empty enrollment)\n * and is rendered as an honest \"not available\" state, never as a zeroed\n * chart pretending to be real data.\n */\nimport { dashboardSnapshotQuery, portfolioQuery } from '../../data/queries.js';\nimport { useQuery } from '../../data/hooks.js';\nimport { RefreshIndicator } from '../../components/primitives/RefreshIndicator.js';\nimport { SkeletonCardGrid } from '../../components/primitives/Skeleton.js';\nimport {\n ChartContainer,\n BarChart,\n StatTile,\n TableView,\n chartFormat,\n type CategoricalDatum,\n type TableColumn,\n} from '../../components/charts/index.js';\nimport type {\n PortfolioBacklogItem,\n PortfolioGoalInFlight,\n PortfolioSummary,\n} from '../../data/api-types.js';\nimport styles from './PortfolioView.module.css';\n\nfunction formatRelative(ts: number): string {\n const seconds = Math.max(0, Math.round((Date.now() - ts) / 1000));\n if (seconds < 5) return 'just now';\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.round(seconds / 60);\n return `${minutes}m ago`;\n}\n\nexport function PortfolioView() {\n const query = useQuery(portfolioQuery);\n // Today-deltas are computed against a prior digest and live on the same\n // portfolio payload, but the digest itself is built server-side once a\n // day; the snapshot query keeps this view's freshness indicator honest\n // relative to the rest of the app even though portfolioQuery has no SSE\n // channel of its own.\n const snapshotQuery = useQuery(dashboardSnapshotQuery);\n\n return (\n <div className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Portfolio</h1>\n <div className={styles.freshness} aria-live=\"polite\">\n {query.status === 'refreshing' || snapshotQuery.status === 'refreshing' ? <RefreshIndicator /> : null}\n {query.updatedAt ? <span className={styles.freshnessLabel}>Updated {formatRelative(query.updatedAt)}</span> : null}\n </div>\n </header>\n\n {query.status === 'loading' ? (\n <SkeletonCardGrid count={6} />\n ) : query.status === 'error' ? (\n <div className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Failed to load portfolio.'}\n </div>\n ) : query.data === null ? (\n <p className={styles.notAvailable}>\n No portfolio roll-up available — either this server has no enrolled repos, or it predates the portfolio\n feature.\n </p>\n ) : query.data ? (\n <PortfolioBody portfolio={query.data} />\n ) : null}\n </div>\n );\n}\n\nfunction PortfolioBody({ portfolio }: { portfolio: PortfolioSummary }) {\n const { health, goalsInFlight, backlogTop, cost, effectiveness, today } = portfolio;\n\n const worstRepoBars: CategoricalDatum[] = health.worstRepos.map((r) => ({\n label: r.repo.split('/').filter(Boolean).pop() ?? r.repo,\n value: r.score,\n }));\n\n const backlogColumns: TableColumn<PortfolioBacklogItem>[] = [\n { key: 'title', label: 'Item', render: (r) => r.title },\n { key: 'repo', label: 'Repo', render: (r) => r.repo ?? '—' },\n { key: 'score', label: 'Score', numeric: true, render: (r) => r.score.toFixed(1) },\n ];\n\n return (\n <>\n <div className={styles.kpiGrid}>\n <StatTile\n label=\"Portfolio health\"\n value={`${health.averageScore.toFixed(0)} (${health.averageGrade})`}\n caption={`${health.reposScored} repos scored`}\n delta={\n today.healthScoreDelta !== null ? { value: today.healthScoreDelta, goodWhenPositive: true } : null\n }\n />\n <StatTile label=\"Goals in flight\" value={String(goalsInFlight.length)} />\n <StatTile\n label=\"Backlog top items\"\n value={String(backlogTop.length)}\n delta={\n today.pendingProposalsDelta !== null\n ? { value: today.pendingProposalsDelta, versus: 'pending proposals' }\n : null\n }\n />\n <StatTile\n label=\"Spend\"\n value={chartFormat.formatUsd(cost.spentUsd)}\n caption={`${cost.window} window`}\n delta={today.spendUsdDelta !== null ? { value: today.spendUsdDelta, goodWhenPositive: false } : null}\n />\n <StatTile label=\"Local savings\" value={chartFormat.formatUsd(cost.localSavingsUsd)} />\n <StatTile label=\"Projected monthly\" value={chartFormat.formatUsd(cost.projectedMonthlyUsd)} />\n </div>\n\n {effectiveness ? (\n <div className={styles.effectiveness}>\n <p className={styles.effectivenessHeadline}>{effectiveness.headline}</p>\n <span className={styles.rowMeta}>\n Success rate {chartFormat.formatPercent(effectiveness.successRate)}\n {effectiveness.effectivenessDeltaPct !== null\n ? ` (${effectiveness.effectivenessDeltaPct >= 0 ? '+' : ''}${effectiveness.effectivenessDeltaPct.toFixed(1)}pp)`\n : ''}\n </span>\n </div>\n ) : null}\n\n <div className={styles.chartsGrid}>\n <ChartContainer\n title=\"Worst-scoring repos\"\n empty={worstRepoBars.length === 0}\n emptyMessage=\"No enrolled repos scored yet.\"\n table={\n <TableView\n caption=\"Worst-scoring repos\"\n rowKey={(r) => r.repo}\n rows={health.worstRepos}\n columns={[\n { key: 'repo', label: 'Repo', render: (r) => r.repo },\n { key: 'score', label: 'Score', numeric: true, render: (r) => r.score.toFixed(0) },\n { key: 'grade', label: 'Grade', render: (r) => r.grade },\n ]}\n />\n }\n >\n <BarChart\n data={worstRepoBars}\n orientation=\"horizontal\"\n ariaLabel=\"Worst-scoring repos by health score\"\n formatValue={(v) => v.toFixed(0)}\n />\n </ChartContainer>\n\n <div className={styles.section}>\n <h2 className={styles.sectionTitle}>In-flight goals</h2>\n {goalsInFlight.length === 0 ? (\n <p className={styles.notAvailable}>No goals currently in flight.</p>\n ) : (\n <ul className={styles.list}>\n {goalsInFlight.map((g: PortfolioGoalInFlight) => (\n <li key={g.goalId} className={styles.row}>\n <span className={styles.rowTitle}>\n {g.objective}\n <span className={styles.rowMeta}>{Math.round(g.fractionDone * 100)}%</span>\n </span>\n <div className={styles.meterTrack}>\n <div className={styles.meterFill} style={{ width: `${Math.round(g.fractionDone * 100)}%` }} />\n </div>\n <span className={styles.rowMeta}>\n {g.nextActionable ? `Next: ${g.nextActionable}` : 'Nothing actionable queued'}\n </span>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n\n <div className={styles.section}>\n <h2 className={styles.sectionTitle}>Top backlog</h2>\n {backlogTop.length === 0 ? (\n <p className={styles.notAvailable}>Backlog is empty.</p>\n ) : (\n <TableView caption=\"Top backlog items\" rowKey={(r) => r.title} rows={backlogTop} columns={backlogColumns} />\n )}\n </div>\n </>\n );\n}\n","/**\n * routes/work/runs/RunsView.tsx — dispatched goal runs (GET /api/runs).\n *\n * The audit finding this replaces: the old UI rendered all ~200 runs\n * unsorted and unfiltered with no pagination, so \"show me failed runs in\n * repo X since Tuesday\" was impossible without reading the whole table by\n * eye. This view adds real search, status/engine/provider filters, a date\n * floor, and sortable columns instead.\n *\n * Note on \"repo X\": RunState (src/core/types.ts:1968) has no structured\n * `repo` field — runs are keyed by goal text, not by repository. The search\n * box matches against `goal` (which in practice names the target\n * repo/project) rather than a fabricated repo dropdown backed by nothing.\n *\n * /api/runs is server-capped at 200 (`listRuns({limit:200})`,\n * src/core/web/api.ts:1122) — there is no cursor/offset param to page\n * beyond that, so this view filters/sorts client-side over that window and\n * says so rather than implying it can reach further back.\n */\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { runsQuery } from '../../../data/queries.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { useScrollRestore } from '../../../hooks/useScrollRestore.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport type { RunState } from '../../../data/api-types.js';\nimport styles from './RunsView.module.css';\n\ntype SortKey = 'createdAt' | 'updatedAt' | 'tokens' | 'estCostUsd' | 'steps' | 'status';\ntype SortDir = 'asc' | 'desc';\n\nfunction runTokens(run: RunState): number {\n return run.usage.tokensIn + run.usage.tokensOut;\n}\n\nfunction matchesSearch(run: RunState, query: string): boolean {\n if (!query) return true;\n const q = query.toLowerCase();\n return run.id.toLowerCase().includes(q) || run.goal.toLowerCase().includes(q);\n}\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' });\n}\n\nexport function RunsView() {\n const containerRef = useRef<HTMLDivElement>(null);\n useScrollRestore('/work/runs', containerRef);\n const navigate = useNavigate();\n\n const runsResult = useQuery(runsQuery);\n\n // Roving tabindex, same pattern as ProposalList's onListKeyDown — the audit\n // finding this replaces: rows here were plain <tr>s with a single Link per\n // row as the only focusable element, so a keyboard user tabbed through\n // every row's link one at a time with no Arrow/Enter row navigation.\n const [focusedIndex, setFocusedIndex] = useState(0);\n const rowRefs = useRef<Map<string, HTMLTableRowElement>>(new Map());\n\n const [search, setSearch] = useState('');\n const [statusFilter, setStatusFilter] = useState<string>('all');\n const [engineFilter, setEngineFilter] = useState<string>('all');\n const [providerFilter, setProviderFilter] = useState<string>('all');\n const [since, setSince] = useState<string>('');\n const [sortKey, setSortKey] = useState<SortKey>('createdAt');\n const [sortDir, setSortDir] = useState<SortDir>('desc');\n\n const runs = useMemo(() => runsResult.data ?? [], [runsResult.data]);\n\n const { statuses, engines, providers } = useMemo(() => {\n const statuses = new Set<string>();\n const engines = new Set<string>();\n const providers = new Set<string>();\n for (const r of runs) {\n statuses.add(r.status);\n engines.add(r.engine);\n providers.add(r.provider);\n }\n return {\n statuses: Array.from(statuses).sort(),\n engines: Array.from(engines).sort(),\n providers: Array.from(providers).sort(),\n };\n }, [runs]);\n\n const sinceMs = since ? new Date(since).getTime() : null;\n\n const filtered = useMemo(() => {\n let rows = runs.filter((r) => {\n if (statusFilter !== 'all' && r.status !== statusFilter) return false;\n if (engineFilter !== 'all' && r.engine !== engineFilter) return false;\n if (providerFilter !== 'all' && r.provider !== providerFilter) return false;\n if (sinceMs !== null) {\n const createdMs = new Date(r.createdAt).getTime();\n if (Number.isNaN(createdMs) || createdMs < sinceMs) return false;\n }\n if (!matchesSearch(r, search.trim())) return false;\n return true;\n });\n\n rows = [...rows].sort((a, b) => {\n let cmp = 0;\n switch (sortKey) {\n case 'createdAt':\n cmp = a.createdAt.localeCompare(b.createdAt);\n break;\n case 'updatedAt':\n cmp = a.updatedAt.localeCompare(b.updatedAt);\n break;\n case 'tokens':\n cmp = runTokens(a) - runTokens(b);\n break;\n case 'estCostUsd':\n cmp = a.usage.estCostUsd - b.usage.estCostUsd;\n break;\n case 'steps':\n cmp = a.steps.length - b.steps.length;\n break;\n case 'status':\n cmp = a.status.localeCompare(b.status);\n break;\n }\n return sortDir === 'asc' ? cmp : -cmp;\n });\n\n return rows;\n }, [runs, statusFilter, engineFilter, providerFilter, sinceMs, search, sortKey, sortDir]);\n\n useEffect(() => {\n setFocusedIndex((i) => Math.min(i, Math.max(filtered.length - 1, 0)));\n }, [filtered.length]);\n\n function onTableKeyDown(e: React.KeyboardEvent) {\n if (filtered.length === 0) return;\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n const next = Math.min(focusedIndex + 1, filtered.length - 1);\n setFocusedIndex(next);\n rowRefs.current.get(filtered[next]!.id)?.focus();\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n const next = Math.max(focusedIndex - 1, 0);\n setFocusedIndex(next);\n rowRefs.current.get(filtered[next]!.id)?.focus();\n } else if (e.key === 'Enter') {\n const row = filtered[focusedIndex];\n if (row) navigate(`/work/runs/${row.id}`);\n }\n }\n\n function toggleSort(key: SortKey) {\n if (key === sortKey) {\n setSortDir((d) => (d === 'asc' ? 'desc' : 'asc'));\n } else {\n setSortKey(key);\n setSortDir('desc');\n }\n }\n\n function sortIndicator(key: SortKey): string {\n if (key !== sortKey) return '';\n return sortDir === 'asc' ? ' ↑' : ' ↓';\n }\n\n return (\n <div ref={containerRef} className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Runs</h1>\n <div className={styles.freshness} aria-live=\"polite\">\n {runsResult.status === 'refreshing' ? <RefreshIndicator /> : null}\n <span className={styles.count}>\n {filtered.length} of {runs.length} runs (server caps at 200 most recent)\n </span>\n </div>\n </header>\n\n <form className={styles.filters} role=\"search\" aria-label=\"Filter runs\" onSubmit={(e) => e.preventDefault()}>\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Search</span>\n <input\n type=\"text\"\n className={styles.input}\n placeholder=\"goal or run id (e.g. repo/project name)\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </label>\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Status</span>\n <select className={styles.select} value={statusFilter} onChange={(e) => setStatusFilter(e.target.value)}>\n <option value=\"all\">All</option>\n {statuses.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n </label>\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Engine</span>\n <select className={styles.select} value={engineFilter} onChange={(e) => setEngineFilter(e.target.value)}>\n <option value=\"all\">All</option>\n {engines.map((e) => (\n <option key={e} value={e}>\n {e}\n </option>\n ))}\n </select>\n </label>\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Provider</span>\n <select className={styles.select} value={providerFilter} onChange={(e) => setProviderFilter(e.target.value)}>\n <option value=\"all\">All</option>\n {providers.map((p) => (\n <option key={p} value={p}>\n {p}\n </option>\n ))}\n </select>\n </label>\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Since</span>\n <input type=\"date\" className={styles.input} value={since} onChange={(e) => setSince(e.target.value)} />\n </label>\n {(statusFilter !== 'all' || engineFilter !== 'all' || providerFilter !== 'all' || since || search) && (\n <button\n type=\"button\"\n className={styles.clear}\n onClick={() => {\n setSearch('');\n setStatusFilter('all');\n setEngineFilter('all');\n setProviderFilter('all');\n setSince('');\n }}\n >\n Clear filters\n </button>\n )}\n </form>\n\n {runsResult.status === 'loading' ? (\n <div className={styles.tableWrap}>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : runsResult.status === 'error' ? (\n <div className={styles.error} role=\"alert\">\n {runsResult.error?.message ?? 'Failed to load runs.'}\n </div>\n ) : filtered.length === 0 ? (\n <p className={styles.empty}>No runs match the current filters.</p>\n ) : (\n <div className={styles.tableWrap}>\n <table className={styles.table} onKeyDown={onTableKeyDown}>\n <thead>\n <tr>\n <th scope=\"col\">Goal</th>\n <th scope=\"col\" className={styles.statusCol}>\n <button type=\"button\" className={styles.sortHeader} onClick={() => toggleSort('status')}>\n Status{sortIndicator('status')}\n </button>\n </th>\n <th scope=\"col\" className={styles.engineCol}>\n Engine\n </th>\n <th scope=\"col\" className={styles.providerCol}>\n Provider\n </th>\n <th scope=\"col\" className={styles.tokensCol}>\n <button type=\"button\" className={styles.sortHeader} onClick={() => toggleSort('tokens')}>\n Tokens in/out{sortIndicator('tokens')}\n </button>\n </th>\n <th scope=\"col\" className={styles.costCol}>\n <button type=\"button\" className={styles.sortHeader} onClick={() => toggleSort('estCostUsd')}>\n Est cost{sortIndicator('estCostUsd')}\n </button>\n </th>\n <th scope=\"col\" className={styles.stepsCol}>\n <button type=\"button\" className={styles.sortHeader} onClick={() => toggleSort('steps')}>\n Steps{sortIndicator('steps')}\n </button>\n </th>\n <th scope=\"col\" className={styles.createdCol}>\n <button type=\"button\" className={styles.sortHeader} onClick={() => toggleSort('createdAt')}>\n Created{sortIndicator('createdAt')}\n </button>\n </th>\n </tr>\n </thead>\n <tbody>\n {filtered.map((run, i) => (\n <tr\n key={run.id}\n ref={(el) => {\n if (el) rowRefs.current.set(run.id, el);\n else rowRefs.current.delete(run.id);\n }}\n tabIndex={i === focusedIndex ? 0 : -1}\n onFocus={() => setFocusedIndex(i)}\n aria-current={i === focusedIndex ? 'true' : undefined}\n className={styles.row}\n >\n <td>\n <Link\n to={`/work/runs/${run.id}`}\n data-focus-key={`run-${run.id}`}\n className={styles.goalLink}\n title={run.goal}\n tabIndex={-1}\n >\n {run.goal}\n </Link>\n </td>\n <td>\n <StatusBadge status={run.status} />\n </td>\n <td>{run.engine}</td>\n <td>{run.provider}</td>\n <td className={styles.numeric}>\n {run.usage.tokensIn.toLocaleString()} / {run.usage.tokensOut.toLocaleString()}\n </td>\n <td className={styles.numeric}>${run.usage.estCostUsd.toFixed(4)}</td>\n <td className={styles.numeric}>{run.steps.length}</td>\n <td className={styles.date}>{formatDate(run.createdAt)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n );\n}\n","/**\n * routes/work/runs/RunDetailView.tsx — GET /api/run/:id. Full RunState:\n * budget/usage, the append-only step log, and the task DAG (id, goal, deps,\n * status, result/error) — deps rendered as jump links to the dependency's\n * own task row so \"why did this fail\" is traceable without a diagram.\n */\nimport { useRef } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { runDetailQuery } from '../../../data/queries.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { useScrollRestore } from '../../../hooks/useScrollRestore.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport type { RunState, RunTask } from '../../../data/api-types.js';\nimport styles from './RunDetailView.module.css';\n\nfunction formatDate(iso: string | undefined): string {\n if (!iso) return '—';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toLocaleString();\n}\n\nfunction taskAnchorId(taskId: string): string {\n return `task-${encodeURIComponent(taskId)}`;\n}\n\nexport function RunDetailView() {\n const { id } = useParams<{ id: string }>();\n const containerRef = useRef<HTMLDivElement>(null);\n useScrollRestore(`/work/runs/${id ?? ''}`, containerRef);\n\n const query = useQuery(runDetailQuery(id ?? ''));\n\n if (!id) {\n return (\n <div className={styles.view}>\n <p className={styles.error} role=\"alert\">\n No run id in URL.\n </p>\n </div>\n );\n }\n\n if (query.status === 'loading') {\n return (\n <div ref={containerRef} className={styles.view}>\n <SkeletonLine width=\"60%\" />\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"80%\" />\n </div>\n );\n }\n\n if (query.status === 'error' || !query.data) {\n return (\n <div ref={containerRef} className={styles.view}>\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? `Run ${id} not found.`}\n </p>\n </div>\n );\n }\n\n const run: RunState = query.data;\n const tasksById = new Map(run.tasks.map((t) => [t.id, t]));\n\n return (\n <div ref={containerRef} className={styles.view}>\n <header className={styles.header}>\n <div>\n <p className={styles.eyebrow}>Run {run.id}</p>\n <h1 className={styles.title}>{run.goal}</h1>\n </div>\n <div className={styles.freshness} aria-live=\"polite\">\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n <StatusBadge status={run.status} />\n </div>\n </header>\n\n <dl className={styles.metaGrid}>\n <div>\n <dt>Engine</dt>\n <dd>{run.engine}</dd>\n </div>\n <div>\n <dt>Provider</dt>\n <dd>{run.provider}</dd>\n </div>\n {run.engineModel ? (\n <div>\n <dt>Model</dt>\n <dd>{run.engineModel}</dd>\n </div>\n ) : null}\n <div>\n <dt>Tokens in / out</dt>\n <dd className={styles.numeric}>\n {run.usage.tokensIn.toLocaleString()} / {run.usage.tokensOut.toLocaleString()}\n </dd>\n </div>\n <div>\n <dt>Est cost</dt>\n <dd className={styles.numeric}>${run.usage.estCostUsd.toFixed(4)}</dd>\n </div>\n <div>\n <dt>Steps</dt>\n <dd className={styles.numeric}>{run.usage.steps}</dd>\n </div>\n <div>\n <dt>Budget (tokens / steps)</dt>\n <dd className={styles.numeric}>\n {run.budget.maxTokens.toLocaleString()} / {run.budget.maxSteps}\n </dd>\n </div>\n <div>\n <dt>Created</dt>\n <dd>{formatDate(run.createdAt)}</dd>\n </div>\n <div>\n <dt>Updated</dt>\n <dd>{formatDate(run.updatedAt)}</dd>\n </div>\n {run.terminationReason ? (\n <div>\n <dt>Termination reason</dt>\n <dd>{run.terminationReason}</dd>\n </div>\n ) : null}\n </dl>\n\n {run.result ? (\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Result</h2>\n <p className={styles.resultText}>{run.result}</p>\n </section>\n ) : null}\n\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Tasks ({run.tasks.length})</h2>\n {run.tasks.length === 0 ? (\n <p className={styles.empty}>No tasks recorded.</p>\n ) : (\n <ul className={styles.taskList}>\n {run.tasks.map((task: RunTask) => (\n <li key={task.id} id={taskAnchorId(task.id)} className={styles.taskItem} tabIndex={-1}>\n <div className={styles.taskHeader}>\n <span className={styles.taskId}>{task.id}</span>\n <StatusBadge status={task.status} />\n </div>\n <p className={styles.taskGoal}>{task.goal}</p>\n {task.deps.length > 0 ? (\n <p className={styles.taskDeps}>\n depends on:{' '}\n {task.deps.map((depId, i) => (\n <span key={depId}>\n {i > 0 ? ', ' : ''}\n {tasksById.has(depId) ? (\n <a href={`#${taskAnchorId(depId)}`} className={styles.depLink}>\n {depId}\n </a>\n ) : (\n <span className={styles.depMissing}>{depId} (unresolved)</span>\n )}\n </span>\n ))}\n </p>\n ) : null}\n {task.error ? (\n <p className={styles.taskError} role=\"alert\">\n {task.error}\n </p>\n ) : null}\n {task.usage ? (\n <p className={styles.taskUsage}>\n {task.usage.tokensIn.toLocaleString()} / {task.usage.tokensOut.toLocaleString()} tokens · $\n {task.usage.estCostUsd.toFixed(4)}\n </p>\n ) : null}\n </li>\n ))}\n </ul>\n )}\n </section>\n\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Step log ({run.steps.length})</h2>\n {run.steps.length === 0 ? (\n <p className={styles.empty}>No steps recorded.</p>\n ) : (\n <ol className={styles.stepList}>\n {run.steps.map((step, i) => (\n <li key={`${step.ts}-${i}`} className={styles.stepItem}>\n <span className={styles.stepTs}>{formatDate(step.ts)}</span>\n <span className={styles.stepKind}>{step.kind}</span>\n <span className={styles.stepTask}>\n {step.taskId ? (\n <a href={`#${taskAnchorId(step.taskId)}`} className={styles.depLink}>\n {step.taskId}\n </a>\n ) : null}\n </span>\n <span className={styles.stepSummary}>{step.summary}</span>\n </li>\n ))}\n </ol>\n )}\n </section>\n </div>\n );\n}\n","/**\n * routes/work/swarms/SwarmsView.tsx — multi-task DAG runs (GET /api/swarms).\n * List view with the same search/filter/sort treatment as RunsView, plus a\n * compact per-row burndown bar (ported convention from\n * routes/fleet-dashboard/SwarmsPanel.tsx). The full DAG lives on the detail\n * view (SwarmDetailView.tsx) — a list of up to 200 rows isn't the place for\n * one SVG diagram per row.\n */\nimport { useMemo, useRef, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { swarmsQuery } from '../../../data/queries.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { useScrollRestore } from '../../../hooks/useScrollRestore.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport type { SwarmRun } from '../../../data/api-types.js';\nimport styles from './SwarmsView.module.css';\n\ntype SortKey = 'createdAt' | 'updatedAt' | 'progress' | 'tokens' | 'estCostUsd';\ntype SortDir = 'asc' | 'desc';\n\nfunction swarmTasksDone(sw: SwarmRun): number {\n return sw.tasks.filter((t) => t.status === 'done').length;\n}\nfunction swarmTasksTotal(sw: SwarmRun): number {\n // Some historical swarm records (e.g. very early smoke-test runs) predate\n // the `plan` field and have no plan at all — guard against that rather\n // than crashing the whole list (2 of 80 real records on this machine hit\n // this path).\n return Math.max(sw.plan?.tasks.length ?? 0, sw.tasks.length);\n}\n// Same historical records that predate `plan` (see swarmTasksTotal above)\n// also predate `usage` — default to zeroed usage rather than crashing.\nfunction swarmUsage(sw: SwarmRun): { tokensIn: number; tokensOut: number; estCostUsd: number } {\n return sw.usage ?? { tokensIn: 0, tokensOut: 0, estCostUsd: 0 };\n}\nfunction swarmTokens(sw: SwarmRun): number {\n const u = swarmUsage(sw);\n return u.tokensIn + u.tokensOut;\n}\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' });\n}\n\nexport function SwarmsView() {\n const containerRef = useRef<HTMLDivElement>(null);\n useScrollRestore('/work/swarms', containerRef);\n\n const swarmsResult = useQuery(swarmsQuery);\n const swarms = useMemo(() => swarmsResult.data ?? [], [swarmsResult.data]);\n\n const [search, setSearch] = useState('');\n const [statusFilter, setStatusFilter] = useState('all');\n const [sortKey, setSortKey] = useState<SortKey>('createdAt');\n const [sortDir, setSortDir] = useState<SortDir>('desc');\n\n const statuses = useMemo(() => Array.from(new Set(swarms.map((s) => s.status))).sort(), [swarms]);\n\n const filtered = useMemo(() => {\n let rows = swarms.filter((s) => {\n if (statusFilter !== 'all' && s.status !== statusFilter) return false;\n if (!search.trim()) return true;\n const q = search.trim().toLowerCase();\n return s.id.toLowerCase().includes(q) || s.goal.toLowerCase().includes(q);\n });\n\n rows = [...rows].sort((a, b) => {\n let cmp = 0;\n switch (sortKey) {\n case 'createdAt':\n cmp = a.createdAt.localeCompare(b.createdAt);\n break;\n case 'updatedAt':\n cmp = a.updatedAt.localeCompare(b.updatedAt);\n break;\n case 'progress': {\n const pa = swarmTasksTotal(a) > 0 ? swarmTasksDone(a) / swarmTasksTotal(a) : 0;\n const pb = swarmTasksTotal(b) > 0 ? swarmTasksDone(b) / swarmTasksTotal(b) : 0;\n cmp = pa - pb;\n break;\n }\n case 'tokens':\n cmp = swarmTokens(a) - swarmTokens(b);\n break;\n case 'estCostUsd':\n cmp = swarmUsage(a).estCostUsd - swarmUsage(b).estCostUsd;\n break;\n }\n return sortDir === 'asc' ? cmp : -cmp;\n });\n\n return rows;\n }, [swarms, statusFilter, search, sortKey, sortDir]);\n\n function toggleSort(key: SortKey) {\n if (key === sortKey) setSortDir((d) => (d === 'asc' ? 'desc' : 'asc'));\n else {\n setSortKey(key);\n setSortDir('desc');\n }\n }\n function sortIndicator(key: SortKey): string {\n if (key !== sortKey) return '';\n return sortDir === 'asc' ? ' ↑' : ' ↓';\n }\n\n return (\n <div ref={containerRef} className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Swarms</h1>\n <div className={styles.freshness} aria-live=\"polite\">\n {swarmsResult.status === 'refreshing' ? <RefreshIndicator /> : null}\n <span className={styles.count}>\n {filtered.length} of {swarms.length} swarms\n </span>\n </div>\n </header>\n\n <form className={styles.filters} role=\"search\" aria-label=\"Filter swarms\" onSubmit={(e) => e.preventDefault()}>\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Search</span>\n <input\n type=\"text\"\n className={styles.input}\n placeholder=\"goal or swarm id\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </label>\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Status</span>\n <select className={styles.select} value={statusFilter} onChange={(e) => setStatusFilter(e.target.value)}>\n <option value=\"all\">All</option>\n {statuses.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n </label>\n </form>\n\n {swarmsResult.status === 'loading' ? (\n <div className={styles.listWrap}>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : swarmsResult.status === 'error' ? (\n <div className={styles.error} role=\"alert\">\n {swarmsResult.error?.message ?? 'Failed to load swarms.'}\n </div>\n ) : filtered.length === 0 ? (\n <p className={styles.empty}>No swarms match the current filters.</p>\n ) : (\n <div className={styles.listWrap}>\n <div className={styles.listHeader}>\n <span>Goal</span>\n <button type=\"button\" className={styles.sortHeader} onClick={() => toggleSort('progress')}>\n Progress{sortIndicator('progress')}\n </button>\n <button type=\"button\" className={styles.sortHeader} onClick={() => toggleSort('tokens')}>\n Tokens{sortIndicator('tokens')}\n </button>\n <button type=\"button\" className={styles.sortHeader} onClick={() => toggleSort('estCostUsd')}>\n Cost{sortIndicator('estCostUsd')}\n </button>\n <button type=\"button\" className={styles.sortHeader} onClick={() => toggleSort('createdAt')}>\n Created{sortIndicator('createdAt')}\n </button>\n </div>\n <ul className={styles.list}>\n {filtered.map((sw) => {\n const done = swarmTasksDone(sw);\n const total = swarmTasksTotal(sw);\n const pct = total > 0 ? Math.round((done / total) * 100) : 0;\n const usage = swarmUsage(sw);\n return (\n <li key={sw.id} className={styles.item}>\n <Link\n to={`/work/swarms/${sw.id}`}\n data-focus-key={`swarm-${sw.id}`}\n className={styles.goalLink}\n title={sw.goal}\n >\n <span className={styles.goalText}>{sw.goal}</span>\n <StatusBadge status={sw.status} />\n </Link>\n <div className={styles.burndown}>\n <div className={styles.burndownTrack}>\n <div className={styles.burndownFill} style={{ width: `${pct}%` }} />\n </div>\n <span className={styles.burndownLabel}>\n {done}/{total}\n </span>\n </div>\n <span className={styles.numeric}>\n {usage.tokensIn.toLocaleString()}/{usage.tokensOut.toLocaleString()}\n </span>\n <span className={styles.numeric}>${usage.estCostUsd.toFixed(4)}</span>\n <span className={styles.date}>{formatDate(sw.createdAt)}</span>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","/**\n * routes/work/swarms/SwarmDag.tsx — ported from the hand-rolled SVG DAG at\n * src/core/web/public/app.js:1334-1493 (`buildSwarmDag`). The layout\n * algorithm (phase-column layout, tasks stacked within a column, cubic-\n * bezier dependency edges with an arrowhead marker) is unchanged — it was\n * self-contained and worth keeping rather than reinventing. Two deliberate\n * departures from the original:\n *\n * 1. Color: the legacy version hardcoded its own STATUS_COLOR map\n * (app.js:40-49), which is exactly the \"two files disagree about what a\n * status color means\" bug DESIGN.md's status-color section documents.\n * This version routes every node through `statusToTone()` instead, so a\n * DAG node and a <StatusBadge/> for the same status always render the\n * same color from the one place that owns the mapping.\n * 2. Interactivity: the legacy DAG had none (no click/hover/focus). Each\n * node here is a real SVG <a> to `#{taskAnchorPrefix}-{taskId}`, making\n * every node keyboard-reachable (Tab + Enter) and jumping to that task's\n * row in the plain-text task list rendered alongside the DAG — so the\n * graph is a navigation aid, not the only way to reach a task's detail.\n */\nimport type { ReactNode } from 'react';\nimport { statusToTone } from '../../../components/primitives/StatusBadge.js';\nimport type { SwarmPlan, SwarmTaskRun } from '../../../data/api-types.js';\nimport styles from './SwarmDag.module.css';\n\nconst PHASE_ORDER: Record<string, number> = { scaffold: 0, build: 1, integrate: 2, verify: 3, review: 4 };\n\nexport interface DagTaskNode {\n id: string;\n phase: string;\n goal: string;\n deps: string[];\n status: string;\n}\n\n/**\n * Merge plan tasks (spec: goal/deps/phase) with runtime tasks (status) —\n * same precedence as the legacy merge (app.js:1339-1346): spec first, then\n * runtime fields overlay it by id.\n */\nexport function mergeSwarmTasks(plan: SwarmPlan | undefined, taskRuns: SwarmTaskRun[]): DagTaskNode[] {\n const map = new Map<string, DagTaskNode>();\n for (const s of plan?.tasks ?? []) {\n map.set(s.id, { id: s.id, phase: s.phase, goal: s.goal, deps: s.deps, status: 'pending' });\n }\n for (const r of taskRuns) {\n const existing = map.get(r.id);\n map.set(r.id, {\n id: r.id,\n phase: r.phase || existing?.phase || 'build',\n goal: existing?.goal ?? '',\n deps: existing?.deps ?? [],\n status: r.status,\n });\n }\n return Array.from(map.values());\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length > n ? `${s.slice(0, n - 1)}…` : s;\n}\n\nconst NODE_W = 140;\nconst NODE_H = 48;\nconst H_GAP = 60;\nconst V_GAP = 20;\nconst PAD = 20;\n\ninterface NodePos {\n x: number;\n y: number;\n cx: number;\n cy: number;\n}\n\nexport function SwarmDag({\n tasks,\n taskAnchorPrefix = 'dag-task',\n}: {\n tasks: DagTaskNode[];\n taskAnchorPrefix?: string;\n}): ReactNode {\n if (tasks.length === 0) {\n return <p className={styles.empty}>No tasks in this swarm.</p>;\n }\n\n const phaseGroups = new Map<string, DagTaskNode[]>();\n for (const t of tasks) {\n const ph = t.phase || 'build';\n const list = phaseGroups.get(ph) ?? [];\n list.push(t);\n phaseGroups.set(ph, list);\n }\n const phases = Array.from(phaseGroups.keys()).sort((a, b) => (PHASE_ORDER[a] ?? 99) - (PHASE_ORDER[b] ?? 99));\n\n const colX = new Map<string, number>();\n let x = PAD;\n for (const ph of phases) {\n colX.set(ph, x);\n x += NODE_W + H_GAP;\n }\n const totalW = x + PAD;\n\n const nodePos = new Map<string, NodePos>();\n for (const ph of phases) {\n let y = PAD;\n for (const t of phaseGroups.get(ph)!) {\n const px = colX.get(ph)!;\n nodePos.set(t.id, { x: px, y, cx: px + NODE_W / 2, cy: y + NODE_H / 2 });\n y += NODE_H + V_GAP;\n }\n }\n const totalH = Math.max(...Array.from(nodePos.values()).map((p) => p.y + NODE_H)) + PAD * 2;\n\n const edges: { key: string; d: string }[] = [];\n for (const t of tasks) {\n const to = nodePos.get(t.id);\n if (!to) continue;\n for (const depId of t.deps) {\n const from = nodePos.get(depId);\n if (!from) continue;\n const x1 = from.x + NODE_W;\n const y1 = from.cy;\n const x2 = to.x;\n const y2 = to.cy;\n const mx = (x1 + x2) / 2;\n edges.push({ key: `${depId}->${t.id}`, d: `M ${x1} ${y1} C ${mx} ${y1}, ${mx} ${y2}, ${x2} ${y2}` });\n }\n }\n\n return (\n <svg\n width={totalW}\n height={totalH}\n viewBox={`0 0 ${totalW} ${totalH}`}\n className={styles.svg}\n role=\"img\"\n aria-label=\"Swarm task dependency graph\"\n >\n <defs>\n <marker id=\"dag-arrow\" markerWidth=\"8\" markerHeight=\"8\" refX=\"6\" refY=\"3\" orient=\"auto\">\n <path d=\"M0,0 L0,6 L8,3 z\" className={styles.arrowHead} />\n </marker>\n </defs>\n\n {phases.map((ph) => (\n <text key={ph} x={colX.get(ph)! + NODE_W / 2} y={PAD - 6} textAnchor=\"middle\" className={styles.phaseLabel}>\n {ph}\n </text>\n ))}\n\n {edges.map((e) => (\n <path key={e.key} d={e.d} className={styles.edge} fill=\"none\" markerEnd=\"url(#dag-arrow)\" />\n ))}\n\n {tasks.map((t) => {\n const pos = nodePos.get(t.id);\n if (!pos) return null;\n const tone = statusToTone(t.status);\n return (\n <g key={t.id} transform={`translate(${pos.x},${pos.y})`}>\n <a href={`#${taskAnchorPrefix}-${encodeURIComponent(t.id)}`} className={styles.nodeLink}>\n <title>{`${t.id} — ${t.goal} (${t.status})`}</title>\n <rect width={NODE_W} height={NODE_H} rx={6} ry={6} className={`${styles.nodeRect} ${styles[tone]}`} />\n <circle cx={10} cy={NODE_H / 2} r={4} className={`${styles.statusDot} ${styles[tone]}`} />\n <text x={20} y={17} className={styles.nodeId}>\n {truncate(t.id, 18)}\n </text>\n <text x={20} y={33} className={styles.nodeGoal}>\n {truncate(t.goal, 20)}\n </text>\n </a>\n </g>\n );\n })}\n </svg>\n );\n}\n","/**\n * routes/work/swarms/SwarmDetailView.tsx — GET /api/swarm/:id. Renders the\n * ported DAG (SwarmDag.tsx) above a plain-text, keyboard-navigable task list\n * — the DAG is a navigation aid, not the only way to reach a task's status/\n * error/result, matching the \"run detail was unreachable by keyboard\"\n * lesson from the audit (this view has no click-only-reachable content).\n */\nimport { useRef } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { swarmDetailQuery } from '../../../data/queries.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { useScrollRestore } from '../../../hooks/useScrollRestore.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { SwarmDag, mergeSwarmTasks } from './SwarmDag.js';\nimport styles from './SwarmDetailView.module.css';\n\nconst TASK_ANCHOR_PREFIX = 'dag-task';\n\nfunction formatDate(iso: string | undefined): string {\n if (!iso) return '—';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toLocaleString();\n}\n\nexport function SwarmDetailView() {\n const { id } = useParams<{ id: string }>();\n const containerRef = useRef<HTMLDivElement>(null);\n useScrollRestore(`/work/swarms/${id ?? ''}`, containerRef);\n\n const query = useQuery(swarmDetailQuery(id ?? ''));\n\n if (!id) {\n return (\n <div className={styles.view}>\n <p className={styles.error} role=\"alert\">\n No swarm id in URL.\n </p>\n </div>\n );\n }\n\n if (query.status === 'loading') {\n return (\n <div ref={containerRef} className={styles.view}>\n <SkeletonLine width=\"60%\" />\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"80%\" />\n </div>\n );\n }\n\n if (query.status === 'error' || !query.data) {\n return (\n <div ref={containerRef} className={styles.view}>\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? `Swarm ${id} not found.`}\n </p>\n </div>\n );\n }\n\n const swarm = query.data;\n const done = swarm.tasks.filter((t) => t.status === 'done').length;\n // Guard against historical swarm records with no `plan` at all (see the\n // matching comment in SwarmsView.tsx) — mergeSwarmTasks below already\n // handles `plan` being undefined via `plan?.tasks ?? []`.\n const total = Math.max(swarm.plan?.tasks.length ?? 0, swarm.tasks.length);\n const pct = total > 0 ? Math.round((done / total) * 100) : 0;\n const dagNodes = mergeSwarmTasks(swarm.plan, swarm.tasks);\n // Same historical records that predate `plan` also predate `usage`.\n const usage = swarm.usage ?? { tokensIn: 0, tokensOut: 0, estCostUsd: 0 };\n\n return (\n <div ref={containerRef} className={styles.view}>\n <header className={styles.header}>\n <div>\n <p className={styles.eyebrow}>Swarm {swarm.id}</p>\n <h1 className={styles.title}>{swarm.goal}</h1>\n </div>\n <div className={styles.freshness} aria-live=\"polite\">\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n <StatusBadge status={swarm.status} />\n </div>\n </header>\n\n <div className={styles.burndownRow}>\n <div className={styles.burndownTrack}>\n <div className={styles.burndownFill} style={{ width: `${pct}%` }} />\n </div>\n <span className={styles.burndownLabel}>\n {done}/{total} tasks done ({pct}%)\n </span>\n </div>\n\n <dl className={styles.metaGrid}>\n <div>\n <dt>Tokens in / out</dt>\n <dd className={styles.numeric}>\n {usage.tokensIn.toLocaleString()} / {usage.tokensOut.toLocaleString()}\n </dd>\n </div>\n <div>\n <dt>Est cost</dt>\n <dd className={styles.numeric}>${usage.estCostUsd.toFixed(4)}</dd>\n </div>\n <div>\n <dt>Parallelism</dt>\n <dd className={styles.numeric}>{swarm.parallel}</dd>\n </div>\n <div>\n <dt>Created</dt>\n <dd>{formatDate(swarm.createdAt)}</dd>\n </div>\n <div>\n <dt>Updated</dt>\n <dd>{formatDate(swarm.updatedAt)}</dd>\n </div>\n {swarm.project ? (\n <div>\n <dt>Project</dt>\n <dd className={styles.mono}>{swarm.project}</dd>\n </div>\n ) : null}\n </dl>\n\n {swarm.escalations && swarm.escalations.length > 0 ? (\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Escalations ({swarm.escalations.length})</h2>\n <ul className={styles.escalationList}>\n {swarm.escalations.map((esc, i) => (\n <li key={i} className={styles.escalationItem}>\n <pre className={styles.escalationJson}>{JSON.stringify(esc, null, 2)}</pre>\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n\n {swarm.result ? (\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Result</h2>\n <p className={styles.resultText}>{swarm.result}</p>\n </section>\n ) : null}\n\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Task graph</h2>\n <div className={styles.dagWrap}>\n <SwarmDag tasks={dagNodes} taskAnchorPrefix={TASK_ANCHOR_PREFIX} />\n </div>\n </section>\n\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Tasks ({dagNodes.length})</h2>\n <ul className={styles.taskList}>\n {dagNodes.map((task) => (\n <li\n key={task.id}\n id={`${TASK_ANCHOR_PREFIX}-${task.id}`}\n data-focus-key={`swarm-task-${task.id}`}\n className={styles.taskItem}\n tabIndex={-1}\n >\n <div className={styles.taskHeader}>\n <span className={styles.taskId}>{task.id}</span>\n <span className={styles.taskPhase}>{task.phase}</span>\n <StatusBadge status={task.status} />\n </div>\n <p className={styles.taskGoal}>{task.goal}</p>\n {task.deps.length > 0 ? (\n <p className={styles.taskDeps}>depends on: {task.deps.join(', ')}</p>\n ) : null}\n </li>\n ))}\n </ul>\n </section>\n </div>\n );\n}\n","/**\n * routes/control/daemon/DaemonView.tsx — autonomous operator state, spend,\n * and direction mode (GET /api/control's `.daemon`/`.daemonObservation`).\n *\n * Every field here traces back to `daemon.sourceQuality` (a real\n * `{sourceState, complete, reason}` — src/core/web/control.ts `ControlDaemon`)\n * and is wrapped in <Epistemic/>: when the source is degraded this renders\n * \"unknown\", not a guess.\n *\n * The recovery callout below is the one thing this view adds beyond\n * DaemonPanel's dashboard-compact version: when sourceQuality.reason is\n * 'unreadable', src/core/daemon/state.ts's loadDaemonStateStrict() shows\n * that reason both for a plain read failure AND for the specific case where\n * a daemon-state-recovery marker file is present (\"daemon state recovery is\n * in progress\", state.ts:437-450) — the API does not currently disambiguate\n * the two, so this view surfaces the real CLI remedy for BOTH as a single\n * conditional next step (verbatim from `ashlr daemon recover-state --help` /\n * `resolve-state --help`, src/cli/daemon.ts:82-86) rather than asserting a\n * diagnosis the response can't actually confirm. This was previously\n * undiscoverable — the old UI had no daemon page at all, only a compact\n * dashboard panel with no failure-mode guidance.\n */\nimport { useRef } from 'react';\nimport { controlSnapshotQuery, daemonObservationQuery } from '../../../data/queries.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { useScrollRestore } from '../../../hooks/useScrollRestore.js';\nimport { Epistemic, isKnown } from '../../../components/primitives/Epistemic.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport type { DaemonSourceQuality } from '../../../data/api-types.js';\nimport styles from './DaemonView.module.css';\n\nconst REASON_COPY: Record<string, string> = {\n missing: 'No daemon state file has been written yet — the daemon may never have run on this machine.',\n malformed: 'The daemon state file exists but failed to parse.',\n unreadable:\n 'The daemon state file could not be read. This is also the exact signal produced when a state-recovery ' +\n 'marker is present (a prior repair left a quarantine in progress) — the API does not distinguish the two ' +\n 'cases, so treat this as \"inspect before trusting displayed daemon state.\"',\n inconsistent: 'The daemon state file and the live lock/activity check disagree — the daemon may be mid-restart.',\n unavailable: 'The daemon state read path itself failed (I/O error or similar).',\n};\n\nfunction formatDate(iso: string | null | undefined): string {\n if (!iso) return '—';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toLocaleString();\n}\n\nfunction RecoveryCallout({ quality }: { quality: DaemonSourceQuality }) {\n const reason = quality.reason;\n const copy = REASON_COPY[reason] ?? 'Daemon state could not be verified.';\n return (\n <section className={styles.callout} role=\"alert\">\n <p className={styles.calloutTitle}>Daemon state is unknown ({reason})</p>\n <p className={styles.calloutBody}>{copy}</p>\n <p className={styles.calloutBody}>\n Real remedy — preview or execute a state recovery from a terminal on this machine:\n </p>\n <pre className={styles.calloutCommand}>\n {'ashlr daemon recover-state --dry-run --expected-sha256 <sha256> [--json]\\n' +\n 'ashlr daemon recover-state --execute --plan-id <uuid> --plan-sha256 <sha256> --authorize <plan-sha256> [--json]'}\n </pre>\n <p className={styles.calloutBody}>If a quarantine already exists and needs resolving instead:</p>\n <pre className={styles.calloutCommand}>\n {'ashlr daemon resolve-state --dry-run --quarantine-plan-id <uuid> --quarantine-receipt-sha256 <sha256> [--json]\\n' +\n 'ashlr daemon resolve-state --execute --plan-id <uuid> --plan-sha256 <sha256> --authorize <plan-sha256> --confirm <plan-sha256> [--json]'}\n </pre>\n </section>\n );\n}\n\nexport function DaemonView() {\n const containerRef = useRef<HTMLDivElement>(null);\n useScrollRestore('/control/daemon', containerRef);\n\n const controlQuery = useQuery(controlSnapshotQuery);\n const observationQuery = useQuery(daemonObservationQuery);\n\n const daemon = controlQuery.data?.daemon;\n const observation = observationQuery.data;\n\n return (\n <div ref={containerRef} className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Daemon</h1>\n <div className={styles.freshness} aria-live=\"polite\">\n {controlQuery.status === 'refreshing' || observationQuery.status === 'refreshing' ? (\n <RefreshIndicator />\n ) : null}\n {daemon ? (\n <Epistemic quality={daemon.sourceQuality} label=\"daemon state\">\n <StatusBadge status={daemon.running ? 'running' : 'pending'}>\n {daemon.running ? 'running' : 'stopped'}\n </StatusBadge>\n </Epistemic>\n ) : null}\n </div>\n </header>\n\n {controlQuery.status === 'loading' ? (\n <SkeletonLine width=\"60%\" />\n ) : controlQuery.status === 'error' || !daemon ? (\n <p className={styles.error} role=\"alert\">\n {controlQuery.error?.message ?? 'Failed to load control snapshot.'}\n </p>\n ) : (\n <>\n {!isKnown(daemon.sourceQuality) ? <RecoveryCallout quality={daemon.sourceQuality} /> : null}\n\n <dl className={styles.metaGrid}>\n <div>\n <dt>Runtime state</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"runtime state\">\n {daemon.runtimeState}\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>PID</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"pid\">\n {daemon.pid ?? '—'}\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Last tick</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"last tick\">\n {formatDate(daemon.lastTickAt)}\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Today's spend</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"spend\">\n ${daemon.todaySpentUsd.toFixed(2)}\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Direction mode</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"direction mode\">\n {daemon.activeDirectionMode ?? 'none'}\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Direction reason</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"direction reason\">\n {daemon.activeDirectionReason ?? '—'}\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Autonomy control loop</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"autonomy control loop\">\n {daemon.autonomyControlLoop ? 'enabled' : 'disabled'}\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Autonomy control mode</dt>\n <dd>\n <Epistemic quality={daemon.sourceQuality} label=\"autonomy control mode\">\n {daemon.autonomyControlMode}\n </Epistemic>\n </dd>\n </div>\n </dl>\n\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>OS service</h2>\n <dl className={styles.metaGrid}>\n <div>\n <dt>Registration state</dt>\n <dd>{daemon.service.registrationState}</dd>\n </div>\n <div>\n <dt>Installed</dt>\n <dd>{daemon.service.installed ? 'yes' : 'no'}</dd>\n </div>\n <div>\n <dt>Running</dt>\n <dd>{daemon.service.running ? 'yes' : 'no'}</dd>\n </div>\n <div>\n <dt>Runtime state</dt>\n <dd>{daemon.service.runtimeState ?? 'unknown'}</dd>\n </div>\n <div>\n <dt>Platform</dt>\n <dd>{daemon.service.platformSpec}</dd>\n </div>\n </dl>\n {daemon.service.errorLog ? (\n <p className={styles.serviceError} role=\"alert\">\n {daemon.service.errorLog}\n </p>\n ) : null}\n </section>\n </>\n )}\n\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Recent ticks</h2>\n {observationQuery.status === 'loading' ? (\n <SkeletonLine width=\"80%\" />\n ) : !observation || !observation.ticks || observation.ticks.length === 0 ? (\n <p className={styles.empty}>No tick history available.</p>\n ) : (\n <div className={styles.tickTableWrap}>\n <table className={styles.tickTable}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Reason</th>\n <th scope=\"col\">Items</th>\n <th scope=\"col\">Proposals</th>\n <th scope=\"col\">Spend</th>\n </tr>\n </thead>\n <tbody>\n {[...observation.ticks]\n .reverse()\n .slice(0, 20)\n .map((tick, i) => (\n <tr key={`${tick.ts}-${i}`}>\n <td className={styles.date}>{formatDate(tick.ts)}</td>\n <td>\n {tick.reason}\n {tick.dryRun ? <span className={styles.dryRun}> (dry-run)</span> : null}\n </td>\n <td className={styles.numeric}>{tick.itemsConsidered}</td>\n <td className={styles.numeric}>{tick.proposalsCreated}</td>\n <td className={styles.numeric}>${tick.spentUsd.toFixed(4)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </section>\n </div>\n );\n}\n","/**\n * routes/control/fleet/FleetView.tsx — queue depth, lease health, and the\n * kill switch (GET /api/fleet, GET /api/fleet-activity; POST\n * /api/fleet/pause|resume).\n *\n * The audit finding this fixes: the old UI's kill switch engaged on a\n * single click with no confirmation. This one requires an explicit confirm\n * step (Dialog) before it will even offer the token prompt, and the token\n * prompt itself only appears if no mutation hold is already active — so the\n * full path to actually pausing the fleet is: click \"Pause fleet\" -> confirm\n * dialog -> (token dialog, only if not already unlocked) -> mutation fires.\n *\n * Kill-switch state is read from `FleetStatus.killSwitch`\n * (`{state, sourceState, reason}` — src/core/fleet/status.ts:1690-1696),\n * which is a *different* shape from the `{sourceState, complete, reason?}`\n * SourceQuality the rest of the app keys Epistemic off of, so it's adapted\n * into that shape here (`sourceState: killSwitch.sourceState`,\n * `complete: killSwitch.sourceState === 'healthy'`) before being handed to\n * <Epistemic/> — same withhold-the-control behavior, correct source shape.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { fleetStatusQuery, fleetActivityQuery } from '../../../data/queries.js';\nimport { useQuery, useMutationHold } from '../../../data/hooks.js';\nimport { pauseFleet, resumeFleet } from '../../../data/mutations.js';\nimport { useScrollRestore } from '../../../hooks/useScrollRestore.js';\nimport { Epistemic } from '../../../components/primitives/Epistemic.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport styles from './FleetView.module.css';\n\ntype PendingAction = 'pause' | 'resume' | null;\n\nfunction formatDate(iso: string | null | undefined): string {\n if (!iso) return '—';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toLocaleString();\n}\n\nexport function FleetView() {\n const containerRef = useRef<HTMLDivElement>(null);\n useScrollRestore('/control/fleet', containerRef);\n\n const fleetQuery = useQuery(fleetStatusQuery);\n const activityQuery = useQuery(fleetActivityQuery);\n const mutationHold = useMutationHold();\n\n const [pendingAction, setPendingAction] = useState<PendingAction>(null);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [tokenOpen, setTokenOpen] = useState(false);\n const [mutating, setMutating] = useState(false);\n const [mutationError, setMutationError] = useState<string | null>(null);\n\n async function executeAction(action: NonNullable<PendingAction>) {\n setMutating(true);\n setMutationError(null);\n try {\n if (action === 'pause') await pauseFleet();\n else await resumeFleet();\n } catch (e) {\n setMutationError(e instanceof Error ? e.message : String(e));\n } finally {\n setMutating(false);\n setPendingAction(null);\n }\n }\n\n function requestAction(action: NonNullable<PendingAction>) {\n setMutationError(null);\n setPendingAction(action);\n setConfirmOpen(true);\n }\n\n function confirmIntent() {\n setConfirmOpen(false);\n if (mutationHold.hasHold) {\n if (pendingAction) void executeAction(pendingAction);\n } else {\n setTokenOpen(true);\n }\n }\n\n // After the token dialog closes: if a hold now exists, the pending action\n // was confirmed AND unlocked, so run it. If not, the dialog was cancelled\n // — drop the pending action rather than leaving a stale confirm hanging.\n useEffect(() => {\n if (tokenOpen) return;\n if (!pendingAction) return;\n if (mutationHold.hasHold) void executeAction(pendingAction);\n else setPendingAction(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- deliberately fires only on tokenOpen transitioning closed.\n }, [tokenOpen]);\n\n const fleet = fleetQuery.data;\n const killSwitch = fleet?.killSwitch;\n const killQuality = killSwitch\n ? { sourceState: killSwitch.sourceState, complete: killSwitch.sourceState === 'healthy', reason: killSwitch.reason }\n : undefined;\n const isPaused = fleet?.killed === true;\n\n return (\n <div ref={containerRef} className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Fleet</h1>\n <div className={styles.freshness} aria-live=\"polite\">\n {fleetQuery.status === 'refreshing' || activityQuery.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n </header>\n\n {fleetQuery.status === 'loading' ? (\n <SkeletonLine width=\"60%\" />\n ) : fleetQuery.status === 'error' || !fleet ? (\n <p className={styles.error} role=\"alert\">\n {fleetQuery.error?.message ?? 'Failed to load fleet status.'}\n </p>\n ) : (\n <>\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Kill switch</h2>\n <div className={styles.killSwitchRow}>\n <Epistemic\n quality={killQuality}\n label=\"kill switch\"\n renderControl={() => (\n <button\n type=\"button\"\n className={isPaused ? styles.resumeButton : styles.pauseButton}\n onClick={() => requestAction(isPaused ? 'resume' : 'pause')}\n disabled={mutating}\n >\n {mutating ? 'Working…' : isPaused ? 'Resume fleet' : 'Pause fleet'}\n </button>\n )}\n >\n <StatusBadge status={isPaused ? 'paused' : 'running'}>\n {isPaused ? 'engaged — fleet paused' : 'clear — fleet active'}\n </StatusBadge>\n </Epistemic>\n </div>\n {mutationError ? (\n <p className={styles.mutationError} role=\"alert\">\n {mutationError}\n </p>\n ) : null}\n </section>\n\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Queue depth</h2>\n <dl className={styles.metaGrid}>\n <div>\n <dt>Backlog items</dt>\n <dd className={styles.numeric}>{fleet.queue.backlogItems}</dd>\n </div>\n {fleet.queue.eligibleBacklogItems !== undefined ? (\n <div>\n <dt>Eligible</dt>\n <dd className={styles.numeric}>{fleet.queue.eligibleBacklogItems}</dd>\n </div>\n ) : null}\n {fleet.queue.cooldownItems !== undefined ? (\n <div>\n <dt>Cooldown</dt>\n <dd className={styles.numeric}>{fleet.queue.cooldownItems}</dd>\n </div>\n ) : null}\n {fleet.queue.pendingItems !== undefined ? (\n <div>\n <dt>Pending</dt>\n <dd className={styles.numeric}>{fleet.queue.pendingItems}</dd>\n </div>\n ) : null}\n {fleet.queue.nextEligibleAt !== undefined ? (\n <div>\n <dt>Next eligible</dt>\n <dd>{formatDate(fleet.queue.nextEligibleAt)}</dd>\n </div>\n ) : null}\n </dl>\n </section>\n\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Lease health</h2>\n {!fleet.queue.shared ? (\n <p className={styles.empty}>Shared fleet queue is not in use on this deployment.</p>\n ) : (\n <>\n <dl className={styles.metaGrid}>\n <div>\n <dt>Active claims</dt>\n <dd className={styles.numeric}>{fleet.queue.shared.activeClaims}</dd>\n </div>\n <div>\n <dt>Owned by this machine</dt>\n <dd className={styles.numeric}>{fleet.queue.shared.ownedClaims}</dd>\n </div>\n <div>\n <dt>Reclaimable (expired)</dt>\n <dd className={styles.numeric}>{fleet.queue.shared.reclaimableClaims}</dd>\n </div>\n {fleet.queue.shared.executingClaims !== undefined ? (\n <div>\n <dt>Executing</dt>\n <dd className={styles.numeric}>{fleet.queue.shared.executingClaims}</dd>\n </div>\n ) : null}\n {fleet.queue.shared.ambiguousClaims !== undefined ? (\n <div>\n <dt>Ambiguous (needs reconciliation)</dt>\n <dd className={styles.numeric}>{fleet.queue.shared.ambiguousClaims}</dd>\n </div>\n ) : null}\n <div>\n <dt>Next lease expiry</dt>\n <dd>{formatDate(fleet.queue.shared.nextLeaseExpiryAt)}</dd>\n </div>\n <div>\n <dt>Advisory lock</dt>\n <dd>\n {fleet.queue.shared.lock.present\n ? fleet.queue.shared.lock.stale\n ? 'present, stale'\n : 'present, healthy'\n : 'absent'}\n {fleet.queue.shared.lock.recoveryRequired ? (\n <span className={styles.lockWarning}> — recovery required</span>\n ) : null}\n </dd>\n </div>\n </dl>\n {fleet.queue.shared.claimsByMachine.length > 0 ? (\n <div className={styles.tableWrap}>\n <table className={styles.table}>\n <thead>\n <tr>\n <th scope=\"col\">Machine</th>\n <th scope=\"col\">Active</th>\n <th scope=\"col\">Expired</th>\n <th scope=\"col\">Executing</th>\n </tr>\n </thead>\n <tbody>\n {fleet.queue.shared.claimsByMachine.map((m) => (\n <tr key={m.machineId}>\n <td className={styles.mono}>{m.machineId}</td>\n <td className={styles.numeric}>{m.active}</td>\n <td className={styles.numeric}>{m.expired}</td>\n <td className={styles.numeric}>{m.executing ?? '—'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : null}\n </>\n )}\n </section>\n </>\n )}\n\n <section className={styles.section}>\n <h2 className={styles.sectionTitle}>Recent activity</h2>\n {activityQuery.status === 'loading' ? (\n <SkeletonLine width=\"70%\" />\n ) : activityQuery.status === 'error' || !activityQuery.data ? (\n <p className={styles.error} role=\"alert\">\n {activityQuery.error?.message ?? 'Failed to load fleet activity.'}\n </p>\n ) : (\n <dl className={styles.metaGrid}>\n <div>\n <dt>Cooldown items</dt>\n <dd className={styles.numeric}>{activityQuery.data.cooldownCount}</dd>\n </div>\n <div>\n <dt>Engines ready</dt>\n <dd className={styles.numeric}>\n {activityQuery.data.engineReadiness.filter((e) => e.installed && e.authed === true).length} /{' '}\n {activityQuery.data.engineReadiness.length}\n </dd>\n </div>\n <div>\n <dt>Recent auto-merges</dt>\n <dd className={styles.numeric}>{fleet?.merges.recent ?? '—'}</dd>\n </div>\n </dl>\n )}\n </section>\n\n <Dialog\n open={confirmOpen}\n onClose={() => {\n setConfirmOpen(false);\n setPendingAction(null);\n }}\n titleId=\"fleet-kill-switch-confirm\"\n title={pendingAction === 'resume' ? 'Resume the fleet?' : 'Pause the fleet?'}\n >\n <p className={styles.confirmBody}>\n {pendingAction === 'resume'\n ? 'This clears the global kill switch. Autonomous dispatch will resume across the fleet.'\n : 'This engages the global kill switch. Autonomous dispatch halts fleet-wide until explicitly resumed.'}\n </p>\n <div className={styles.confirmActions}>\n <button\n type=\"button\"\n className={styles.cancelButton}\n onClick={() => {\n setConfirmOpen(false);\n setPendingAction(null);\n }}\n >\n Cancel\n </button>\n <button type=\"button\" className={styles.confirmButton} onClick={confirmIntent}>\n {pendingAction === 'resume' ? 'Yes, resume' : 'Yes, pause'}\n </button>\n </div>\n </Dialog>\n\n <MutationTokenDialog\n open={tokenOpen}\n onClose={() => setTokenOpen(false)}\n reason={\n pendingAction === 'resume'\n ? 'Resuming the fleet requires the dispatch token.'\n : 'Pausing the fleet requires the dispatch token.'\n }\n />\n </div>\n );\n}\n","/**\n * routes/control/security/SecurityView.tsx — supply-chain / binshield\n * findings by severity (GET /api/control's `.security`, built by\n * `buildSecurity()` in src/core/web/control.ts:528-569, reading the cached\n * backlog only — never a live re-scan).\n *\n * `ControlSecurity.available` is NOT a sourceQuality field (no\n * `{sourceState, complete, reason}` shape) but the same epistemic instinct\n * applies: `available: false` means \"no cached security data was found\" —\n * absent backlog, empty backlog, or no security-source items — and must\n * render distinctly from \"available: true, 0 findings\" (an actually clean\n * scan). Collapsing those two into one \"0 findings\" state would be exactly\n * the kind of guess-dressed-as-fact Epistemic exists to prevent elsewhere.\n *\n * Severity ('critical'|'high'|'medium'|'low') isn't in StatusBadge's\n * STATUS_TONE map (it's a priority scale, not a lifecycle status) — mapped\n * to a tone locally and passed via StatusBadge's existing `tone` override\n * rather than editing the shared statusToTone() mapping other views depend\n * on.\n */\nimport { useMemo, useRef, useState } from 'react';\nimport { controlSnapshotQuery } from '../../../data/queries.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { useScrollRestore } from '../../../hooks/useScrollRestore.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport styles from './SecurityView.module.css';\n\nconst SEVERITY_TONE: Record<string, Tone> = {\n critical: 'danger',\n high: 'danger',\n medium: 'warning',\n low: 'neutral',\n};\n\nconst SEVERITY_ORDER: Record<string, number> = { critical: 0, high: 1, medium: 2, low: 3 };\n\nexport function SecurityView() {\n const containerRef = useRef<HTMLDivElement>(null);\n useScrollRestore('/control/security', containerRef);\n\n const query = useQuery(controlSnapshotQuery);\n const security = query.data?.security;\n\n const [search, setSearch] = useState('');\n const [severityFilter, setSeverityFilter] = useState('all');\n const [repoFilter, setRepoFilter] = useState('all');\n\n const repos = useMemo(\n () => Array.from(new Set((security?.findings ?? []).map((f) => f.repo))).sort(),\n [security],\n );\n\n const filtered = useMemo(() => {\n const findings = security?.findings ?? [];\n return findings\n .filter((f) => (severityFilter === 'all' ? true : f.severity === severityFilter))\n .filter((f) => (repoFilter === 'all' ? true : f.repo === repoFilter))\n .filter((f) => {\n if (!search.trim()) return true;\n const q = search.trim().toLowerCase();\n return f.title.toLowerCase().includes(q) || f.repo.toLowerCase().includes(q);\n })\n .sort((a, b) => (SEVERITY_ORDER[a.severity] ?? 9) - (SEVERITY_ORDER[b.severity] ?? 9));\n }, [security, severityFilter, repoFilter, search]);\n\n return (\n <div ref={containerRef} className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Security</h1>\n <div className={styles.freshness} aria-live=\"polite\">\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n </header>\n\n {query.status === 'loading' ? (\n <SkeletonLine width=\"60%\" />\n ) : query.status === 'error' || !security ? (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Failed to load control snapshot.'}\n </p>\n ) : !security.available ? (\n <p className={styles.unavailable}>\n No cached security data available — the backlog is absent, empty, or has no security-source findings.\n This is not the same as \"clean\": it means binshield hasn't produced cached findings for this fleet yet.\n </p>\n ) : (\n <>\n <div className={styles.counts}>\n <div className={`${styles.countTile} ${styles.critical}`}>\n <span className={styles.countValue}>{security.counts.critical}</span>\n <span className={styles.countLabel}>Critical</span>\n </div>\n <div className={`${styles.countTile} ${styles.high}`}>\n <span className={styles.countValue}>{security.counts.high}</span>\n <span className={styles.countLabel}>High</span>\n </div>\n <div className={`${styles.countTile} ${styles.medium}`}>\n <span className={styles.countValue}>{security.counts.medium}</span>\n <span className={styles.countLabel}>Medium</span>\n </div>\n <div className={`${styles.countTile} ${styles.low}`}>\n <span className={styles.countValue}>{security.counts.low}</span>\n <span className={styles.countLabel}>Low</span>\n </div>\n </div>\n\n <form\n className={styles.filters}\n role=\"search\"\n aria-label=\"Filter findings\"\n onSubmit={(e) => e.preventDefault()}\n >\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Search</span>\n <input\n type=\"text\"\n className={styles.input}\n placeholder=\"title or repo\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </label>\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Severity</span>\n <select className={styles.select} value={severityFilter} onChange={(e) => setSeverityFilter(e.target.value)}>\n <option value=\"all\">All</option>\n <option value=\"critical\">Critical</option>\n <option value=\"high\">High</option>\n <option value=\"medium\">Medium</option>\n <option value=\"low\">Low</option>\n </select>\n </label>\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Repo</span>\n <select className={styles.select} value={repoFilter} onChange={(e) => setRepoFilter(e.target.value)}>\n <option value=\"all\">All</option>\n {repos.map((r) => (\n <option key={r} value={r}>\n {r}\n </option>\n ))}\n </select>\n </label>\n </form>\n\n {filtered.length === 0 ? (\n <p className={styles.empty}>No findings match the current filters.</p>\n ) : (\n <div className={styles.tableWrap}>\n <table className={styles.table}>\n <thead>\n <tr>\n <th scope=\"col\">Severity</th>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Finding</th>\n </tr>\n </thead>\n <tbody>\n {filtered.map((f, i) => (\n <tr key={`${f.repo}-${f.title}-${i}`}>\n <td>\n <StatusBadge status={f.severity} tone={SEVERITY_TONE[f.severity] ?? 'neutral'} />\n </td>\n <td className={styles.mono}>{f.repo}</td>\n <td>{f.title}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * routes/goals/GoalsView.tsx — active goals and milestone progress\n * (GET /api/goals, GET /api/vision/mission).\n *\n * /api/goals (src/core/web/api.ts:1654-1686) is fully read-only and already\n * degrades to `[]` on any failure — no sourceQuality to wrap there. The\n * Mission Outcome Room summary (/api/vision/mission) DOES carry a real\n * epistemic breakdown per source (`sources.briefing/goals/enrollment/\n * proposals`, each `{sourceState, complete, reason?}` — structurally the\n * same shape as SourceQuality even though it's defined locally in\n * queries.ts because the backend handler itself is untyped\n * `Record<string, unknown>`), so that section is wrapped in <Epistemic/>\n * per-source rather than shown as one blended status.\n */\nimport { useRef } from 'react';\nimport { goalsQuery, visionMissionQuery } from '../../data/queries.js';\nimport { useQuery } from '../../data/hooks.js';\nimport { useScrollRestore } from '../../hooks/useScrollRestore.js';\nimport { Epistemic } from '../../components/primitives/Epistemic.js';\nimport { StatusBadge } from '../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../components/primitives/Skeleton.js';\nimport styles from './GoalsView.module.css';\n\nexport function GoalsView() {\n const containerRef = useRef<HTMLDivElement>(null);\n useScrollRestore('/goals', containerRef);\n\n const goalsResult = useQuery(goalsQuery);\n const missionResult = useQuery(visionMissionQuery);\n\n const goals = goalsResult.data ?? [];\n const mission = missionResult.data;\n\n return (\n <div ref={containerRef} className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Goals</h1>\n <div className={styles.freshness} aria-live=\"polite\">\n {goalsResult.status === 'refreshing' || missionResult.status === 'refreshing' ? <RefreshIndicator /> : null}\n <span className={styles.count}>{goals.length} goals</span>\n </div>\n </header>\n\n {missionResult.status === 'loading' ? (\n <SkeletonLine width=\"50%\" />\n ) : missionResult.status === 'success' && mission ? (\n <section className={styles.missionCard}>\n <h2 className={styles.sectionTitle}>Mission state</h2>\n <p className={styles.missionState}>{mission.state}</p>\n <dl className={styles.sourceGrid}>\n <div>\n <dt>Briefing</dt>\n <dd>\n <Epistemic quality={mission.sources.briefing ?? undefined} label=\"briefing source\">\n available\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Goals source</dt>\n <dd>\n <Epistemic quality={mission.sources.goals ?? undefined} label=\"goals source\">\n available\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Enrollment</dt>\n <dd>\n <Epistemic quality={mission.sources.enrollment ?? undefined} label=\"enrollment source\">\n available\n </Epistemic>\n </dd>\n </div>\n <div>\n <dt>Proposals</dt>\n <dd>\n <Epistemic quality={mission.sources.proposals ?? undefined} label=\"proposals source\">\n available\n </Epistemic>\n </dd>\n </div>\n </dl>\n </section>\n ) : null}\n\n {goalsResult.status === 'loading' ? (\n <div className={styles.list}>\n <SkeletonLine width=\"90%\" />\n <SkeletonLine width=\"70%\" />\n </div>\n ) : goalsResult.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {goalsResult.error?.message ?? 'Failed to load goals.'}\n </p>\n ) : goals.length === 0 ? (\n <p className={styles.empty}>No active goals.</p>\n ) : (\n <ul className={styles.list}>\n {goals.map((goal) => {\n const pct = Math.round((goal.progress.fractionDone ?? 0) * 100);\n return (\n <li key={goal.id} className={styles.goalCard} data-focus-key={`goal-${goal.id}`} tabIndex={0}>\n <div className={styles.goalHeader}>\n <h3 className={styles.goalObjective}>{goal.objective}</h3>\n <StatusBadge status={goal.status} />\n </div>\n\n <div className={styles.progressRow}>\n <div className={styles.progressTrack}>\n <div className={styles.progressFill} style={{ width: `${pct}%` }} />\n </div>\n <span className={styles.progressLabel}>{pct}%</span>\n </div>\n\n {/*\n progress.nextActionableId is an internal milestone *id*\n (goals/advance.ts nextActionableMilestone(goal)?.id) — the\n /api/goals handler only returns {title,status,order} per\n milestone, with no id, so there is no reliable key to match\n this against a specific list item below. Shown as its own\n line instead of silently (and possibly wrongly) highlighting\n a milestone by title collision.\n */}\n {goal.progress.nextActionableId ? (\n <p className={styles.nextActionable}>\n Next actionable milestone id: <span className={styles.mono}>{goal.progress.nextActionableId}</span>\n </p>\n ) : null}\n\n {goal.milestones.length > 0 ? (\n <ol className={styles.milestoneList}>\n {[...goal.milestones]\n .sort((a, b) => a.order - b.order)\n .map((m) => (\n <li key={m.title} className={styles.milestoneItem}>\n <StatusBadge status={m.status} />\n <span className={styles.milestoneTitle}>{m.title}</span>\n </li>\n ))}\n </ol>\n ) : (\n <p className={styles.noMilestones}>No milestones yet.</p>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","/**\n * routes/inbox/ProposalList.tsx — proposal triage list (operator-console\n * brief item 1). Pending by default; real server-side status/since\n * filtering (src/core/web/api.ts's new `?status=&since=&limit=`) makes the\n * 672 rejected/approved/etc. actually browsable for the first time, plus\n * client-side repo/text search over whatever page is loaded. Full keyboard\n * list traversal + open + batch-select (the old UI had 3 key handlers in\n * 7,901 lines; run detail was entirely unreachable by keyboard).\n */\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { Link, useNavigate } from 'react-router-dom';\nimport type { Proposal, ProposalStatus } from '../../data/api-types.js';\nimport { inboxListQuery, type InboxHistoryStatus } from '../../data/queries.js';\nimport { useQuery } from '../../data/hooks.js';\nimport { hasMutationHold } from '../../data/auth-store.js';\nimport { approveProposal, rejectProposal } from '../../data/mutations.js';\nimport { DispatchDisabledError } from '../../data/client.js';\nimport { StatusBadge } from '../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../components/primitives/RefreshIndicator.js';\nimport { SkeletonRow } from '../../components/primitives/Skeleton.js';\nimport { MutationTokenDialog } from '../../components/auth/MutationTokenDialog.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\nimport styles from './ProposalList.module.css';\n\nconst STATUS_OPTIONS: { value: InboxHistoryStatus; label: string }[] = [\n { value: 'pending', label: 'Pending' },\n { value: 'rejected', label: 'Rejected' },\n { value: 'approved', label: 'Approved' },\n { value: 'applied', label: 'Applied' },\n { value: 'failed', label: 'Failed' },\n { value: 'awaiting-host-merge', label: 'Awaiting host merge' },\n { value: 'all', label: 'All statuses' },\n];\n\nfunction formatAge(iso: string): string {\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return '—';\n const seconds = Math.max(0, Math.round((Date.now() - ms) / 1000));\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.round(minutes / 60);\n if (hours < 24) return `${hours}h`;\n return `${Math.round(hours / 24)}d`;\n}\n\ntype BatchAction = 'approve' | 'reject' | null;\n\nexport function ProposalList({ selectedId, onDispatchDisabled }: { selectedId: string | null; onDispatchDisabled: () => void }) {\n const [status, setStatus] = useState<InboxHistoryStatus>('pending');\n const [since, setSince] = useState('');\n const [search, setSearch] = useState('');\n const [repoFilter, setRepoFilter] = useState('');\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n const [batchAction, setBatchAction] = useState<BatchAction>(null);\n const [tokenDialogOpen, setTokenDialogOpen] = useState(false);\n const [batchConfirmOpen, setBatchConfirmOpen] = useState(false);\n const [batchBusy, setBatchBusy] = useState(false);\n const [batchError, setBatchError] = useState<string | null>(null);\n\n const searchInputRef = useRef<HTMLInputElement>(null);\n const rowRefs = useRef<Map<string, HTMLTableRowElement>>(new Map());\n const navigate = useNavigate();\n\n const query = useQuery(inboxListQuery({ status, since: since || undefined, limit: 500 }));\n\n const rows: Proposal[] = useMemo(() => {\n const all = query.data?.proposals ?? [];\n const s = search.trim().toLowerCase();\n const r = repoFilter.trim().toLowerCase();\n return all.filter((p) => {\n if (s && !p.title.toLowerCase().includes(s) && !(p.summary ?? '').toLowerCase().includes(s)) return false;\n if (r && !(p.repo ?? '').toLowerCase().includes(r)) return false;\n return true;\n });\n }, [query.data, search, repoFilter]);\n\n useEffect(() => {\n setFocusedIndex((i) => Math.min(i, Math.max(rows.length - 1, 0)));\n }, [rows.length]);\n\n function toggleSelected(id: string, proposalStatus: ProposalStatus) {\n if (proposalStatus !== 'pending') return; // only pending proposals can be approved/rejected\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }\n\n function onListKeyDown(e: React.KeyboardEvent) {\n if (rows.length === 0) return;\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n const next = Math.min(focusedIndex + 1, rows.length - 1);\n setFocusedIndex(next);\n rowRefs.current.get(rows[next]!.id)?.focus();\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n const next = Math.max(focusedIndex - 1, 0);\n setFocusedIndex(next);\n rowRefs.current.get(rows[next]!.id)?.focus();\n } else if (e.key === 'Enter') {\n const row = rows[focusedIndex];\n if (row) navigate(`/inbox/${encodeURIComponent(row.id)}`);\n } else if (e.key === ' ') {\n const row = rows[focusedIndex];\n if (row) {\n e.preventDefault();\n toggleSelected(row.id, row.status);\n }\n } else if (e.key === '/') {\n e.preventDefault();\n searchInputRef.current?.focus();\n }\n }\n\n function requestBatchAction(action: 'approve' | 'reject') {\n if (selectedIds.size === 0) return;\n setBatchError(null);\n setBatchAction(action);\n if (hasMutationHold()) setBatchConfirmOpen(true);\n else setTokenDialogOpen(true);\n }\n\n function onTokenDialogClose() {\n setTokenDialogOpen(false);\n if (hasMutationHold()) setBatchConfirmOpen(true);\n else setBatchAction(null);\n }\n\n async function confirmBatchAction() {\n if (!batchAction) return;\n setBatchBusy(true);\n setBatchError(null);\n const ids = Array.from(selectedIds);\n const failures: string[] = [];\n for (const id of ids) {\n try {\n if (batchAction === 'approve') await approveProposal(id);\n else await rejectProposal(id);\n } catch (err) {\n if (err instanceof DispatchDisabledError) {\n setBatchBusy(false);\n setBatchConfirmOpen(false);\n setBatchAction(null);\n onDispatchDisabled();\n return;\n }\n failures.push(id);\n }\n }\n setBatchBusy(false);\n if (failures.length > 0) {\n setBatchError(`${failures.length} of ${ids.length} failed (already decided, or a transient error). Selection kept for retry.`);\n setSelectedIds(new Set(failures));\n } else {\n setBatchConfirmOpen(false);\n setBatchAction(null);\n setSelectedIds(new Set());\n }\n }\n\n const selectedPendingCount = selectedIds.size;\n\n return (\n <div className={styles.list}>\n <div className={styles.filters}>\n <label className={styles.filterField}>\n <span className={styles.filterLabel}>Status</span>\n <select value={status} onChange={(e) => setStatus(e.target.value as InboxHistoryStatus)}>\n {STATUS_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n <label className={styles.filterField}>\n <span className={styles.filterLabel}>Since</span>\n <input type=\"date\" value={since} onChange={(e) => setSince(e.target.value)} />\n </label>\n <label className={styles.filterField}>\n <span className={styles.filterLabel}>Repo</span>\n <input type=\"text\" placeholder=\"filter by repo\" value={repoFilter} onChange={(e) => setRepoFilter(e.target.value)} />\n </label>\n <label className={styles.filterField}>\n <span className={styles.filterLabel}>Search</span>\n <input\n ref={searchInputRef}\n type=\"search\"\n placeholder=\"title or summary — press / to focus\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </label>\n </div>\n\n <div className={styles.summary} aria-live=\"polite\">\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n {query.data ? (\n <span>\n {rows.length} shown of {query.data.total} total\n {query.data.truncated ? ' · narrow filters to see more' : ''}\n </span>\n ) : null}\n </div>\n\n {selectedPendingCount > 0 ? (\n <div className={styles.batchBar}>\n <span>{selectedPendingCount} selected</span>\n <button type=\"button\" onClick={() => setSelectedIds(new Set())}>\n Clear\n </button>\n <button type=\"button\" className={styles.batchReject} onClick={() => requestBatchAction('reject')}>\n Reject {selectedPendingCount}\n </button>\n <button type=\"button\" className={styles.batchApprove} onClick={() => requestBatchAction('approve')}>\n Approve {selectedPendingCount}\n </button>\n </div>\n ) : null}\n\n {query.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : query.status === 'error' ? (\n <div className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Failed to load proposals.'}\n </div>\n ) : rows.length === 0 ? (\n <p className={styles.empty}>\n No {status === 'all' ? '' : status + ' '}proposals match{search || repoFilter ? ' this filter' : ''}.\n </p>\n ) : (\n <table className={styles.table} role=\"grid\" aria-label=\"Proposals\" onKeyDown={onListKeyDown}>\n <thead>\n <tr>\n <th scope=\"col\" className={styles.checkboxCol} />\n <th scope=\"col\">Title</th>\n <th scope=\"col\" className={styles.repoCol}>\n Repo\n </th>\n <th scope=\"col\" className={styles.kindCol}>\n Kind\n </th>\n <th scope=\"col\" className={styles.ageCol}>\n Age\n </th>\n <th scope=\"col\" className={styles.statusCol}>\n Status\n </th>\n <th scope=\"col\" className={styles.whyCol}>\n Why\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.map((p, i) => (\n <tr\n key={p.id}\n ref={(el) => {\n if (el) rowRefs.current.set(p.id, el);\n else rowRefs.current.delete(p.id);\n }}\n data-focus-key={`proposal-${p.id}`}\n tabIndex={i === focusedIndex ? 0 : -1}\n className={`${styles.row} ${p.id === selectedId ? styles.rowActive : ''}`}\n onFocus={() => setFocusedIndex(i)}\n aria-selected={p.id === selectedId}\n >\n <td className={styles.checkboxCol}>\n <input\n type=\"checkbox\"\n checked={selectedIds.has(p.id)}\n disabled={p.status !== 'pending'}\n title={p.status !== 'pending' ? 'Only pending proposals can be approved/rejected' : undefined}\n onChange={() => toggleSelected(p.id, p.status)}\n onClick={(e) => e.stopPropagation()}\n />\n </td>\n <td>\n <Link to={`/inbox/${encodeURIComponent(p.id)}`} className={styles.titleLink} title={p.title}>\n {p.title}\n </Link>\n </td>\n <td className={styles.repoCell} title={p.repo ?? undefined}>\n {p.repo ? p.repo.split('/').pop() : '—'}\n </td>\n <td>{p.kind}</td>\n <td className={styles.age}>{formatAge(p.createdAt)}</td>\n <td>\n <StatusBadge status={p.status} />\n </td>\n <td className={styles.why} title={p.decisionReason ?? undefined}>\n {p.decisionReason ?? '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n <MutationTokenDialog\n open={tokenDialogOpen}\n onClose={onTokenDialogClose}\n reason={`${batchAction === 'approve' ? 'Approving' : 'Rejecting'} ${selectedPendingCount} proposals requires the dispatch token.`}\n />\n\n <ConfirmDialog\n open={batchConfirmOpen}\n onClose={() => {\n setBatchConfirmOpen(false);\n setBatchAction(null);\n setBatchError(null);\n }}\n title={batchAction === 'approve' ? `Approve ${selectedPendingCount} proposals?` : `Reject ${selectedPendingCount} proposals?`}\n body={\n batchAction === 'approve' ? (\n <>\n This applies all {selectedPendingCount} selected proposals to their repos now, one at a time. This\n cannot be undone from this dialog.\n </>\n ) : (\n <>This rejects all {selectedPendingCount} selected proposals. They stay visible in history as rejected.</>\n )\n }\n confirmLabel={batchAction === 'approve' ? `Approve ${selectedPendingCount}` : `Reject ${selectedPendingCount}`}\n destructive={batchAction === 'reject'}\n busy={batchBusy}\n error={batchError}\n onConfirm={() => void confirmBatchAction()}\n />\n </div>\n );\n}\n","/**\n * routes/inbox/ProposalDetail.tsx — evidence + diff review + approve/reject\n * for one proposal (operator-console brief items 2-4). Every judge-verdict\n * field is wrapped in <Epistemic/> keyed off decisionEvidence.sourceQuality\n * (src/core/web/api.ts's decisions-ledger join) — when the ledger read is\n * degraded or no decision row matches this proposal, this renders \"unknown\"\n * and withholds nothing it would have to guess, rather than presenting an\n * absent judgeReasonCode as \"never judged\". A judge-parse-failure/\n * judge-network-failure reason code is an infra failure, NOT a considered\n * judgment, and is rendered with its own distinct label/tone — never folded\n * into a genuine judge-review (see JUDGE_REASON_DISPLAY below).\n */\nimport { useState } from 'react';\nimport type { DecisionEntry, JudgeDecisionReasonCode } from '../../data/api-types.js';\nimport { proposalDetailQuery } from '../../data/queries.js';\nimport { useQuery } from '../../data/hooks.js';\nimport { hasMutationHold } from '../../data/auth-store.js';\nimport { approveProposal, rejectProposal } from '../../data/mutations.js';\nimport { DispatchDisabledError } from '../../data/client.js';\nimport { Epistemic } from '../../components/primitives/Epistemic.js';\nimport { StatusBadge, type Tone } from '../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../components/primitives/Skeleton.js';\nimport { MutationTokenDialog } from '../../components/auth/MutationTokenDialog.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\nimport { DiffViewer } from './DiffViewer.js';\nimport styles from './ProposalDetail.module.css';\n\nconst JUDGE_REASON_DISPLAY: Record<JudgeDecisionReasonCode, { label: string; tone: Tone }> = {\n 'judge-ship-would-merge': { label: 'Ship (would merge)', tone: 'success' },\n 'judge-ship-review-required': { label: 'Ship (review required)', tone: 'success' },\n 'judge-review': { label: 'Review', tone: 'warning' },\n 'judge-noise': { label: 'Noise', tone: 'neutral' },\n 'judge-harmful': { label: 'Harmful', tone: 'danger' },\n 'judge-verdict-unrecognized': { label: 'Unrecognized verdict', tone: 'unknown' },\n // Infra failures, not a considered judgment — the exact conflation bug\n // the backend just fixed. `tone: 'unknown'` (violet) deliberately, not\n // 'danger' or 'warning' — those would read as a real verdict.\n 'judge-parse-failure': { label: 'Judge parse failure — not a review', tone: 'unknown' },\n 'judge-network-failure': { label: 'Judge network failure — not a review', tone: 'unknown' },\n};\n\nfunction latestJudged(decisions: DecisionEntry[]): DecisionEntry | null {\n const judged = decisions.filter((d) => d.action === 'judged' && d.judgeReasonCode);\n if (judged.length === 0) return null;\n return judged.reduce((a, b) => (Date.parse(b.ts) > Date.parse(a.ts) ? b : a));\n}\n\nfunction formatRelative(iso: string | undefined): string {\n if (!iso) return '—';\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return '—';\n const seconds = Math.max(0, Math.round((Date.now() - ms) / 1000));\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.round(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.round(hours / 24);\n return `${days}d ago`;\n}\n\ntype PendingAction = 'approve' | 'reject' | null;\n\n/**\n * What approving actually does, in one sentence, shown BEFORE the click.\n *\n * Deliberately a local function rather than an import from\n * `routes/verse/approvals/approvals-model.ts`: that module belongs to the V2\n * surface and this is the legacy console. Duplicating four lines of copy is\n * cheaper than coupling the old view to the new one's model, and the two are\n * free to diverge when the legacy view is retired.\n */\nfunction approveConsequence(kind: string, repo: string | null | undefined): string {\n const where = repo && repo.length > 0 ? repo : 'the target repository';\n if (kind === 'pr') {\n return `Approving pushes a branch to ${where}'s remote and opens a real pull request. Other people can see it immediately, and it cannot be undone from here.`;\n }\n if (kind === 'patch') {\n return `Approving writes this diff to ${where} on disk now. Nothing is pushed, but the working tree changes.`;\n }\n return `Approving applies this ${kind} proposal to ${where} now.`;\n}\n\nexport function ProposalDetail({ id, onDispatchDisabled }: { id: string; onDispatchDisabled: () => void }) {\n const query = useQuery(proposalDetailQuery(id));\n const [pendingAction, setPendingAction] = useState<PendingAction>(null);\n const [tokenDialogOpen, setTokenDialogOpen] = useState(false);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n function requestAction(action: 'approve' | 'reject') {\n setActionError(null);\n setPendingAction(action);\n if (hasMutationHold()) {\n setConfirmOpen(true);\n } else {\n setTokenDialogOpen(true);\n }\n }\n\n function onTokenDialogClose() {\n setTokenDialogOpen(false);\n // Live read, not the hook snapshot — MutationTokenDialog's onClose can\n // fire synchronously before this component re-renders, so a snapshot\n // captured at last render would still read stale here.\n if (hasMutationHold()) {\n setConfirmOpen(true);\n } else {\n setPendingAction(null); // dialog was cancelled/dismissed, not unlocked\n }\n }\n\n async function confirmPendingAction() {\n if (!pendingAction) return;\n setBusy(true);\n setActionError(null);\n try {\n if (pendingAction === 'approve') await approveProposal(id);\n else await rejectProposal(id);\n setConfirmOpen(false);\n setPendingAction(null);\n } catch (err) {\n if (err instanceof DispatchDisabledError) {\n setConfirmOpen(false);\n setPendingAction(null);\n onDispatchDisabled();\n } else {\n setActionError(err instanceof Error ? err.message : 'Action failed. Try again.');\n }\n } finally {\n setBusy(false);\n }\n }\n\n if (query.status === 'loading') {\n return (\n <div className={styles.panel}>\n <SkeletonLine width=\"60%\" />\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"90%\" />\n </div>\n );\n }\n\n if (query.status === 'error' || !query.data) {\n return (\n <div className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Failed to load this proposal.'}\n </div>\n );\n }\n\n const p = query.data;\n const evidence = p.decisionEvidence;\n const judged = latestJudged(evidence.decisions);\n const judgeDisplay = judged?.judgeReasonCode ? JUDGE_REASON_DISPLAY[judged.judgeReasonCode] : null;\n const canDecide = p.status === 'pending';\n\n return (\n <div className={styles.panel}>\n <header className={styles.header}>\n <div className={styles.titleRow}>\n <h2 className={styles.title}>{p.title}</h2>\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n <div className={styles.metaRow}>\n <StatusBadge status={p.status} />\n <span className={styles.metaItem}>{p.kind}</span>\n <span className={styles.metaItem} title={p.repo ?? undefined}>\n {p.repo ?? 'no repo'}\n </span>\n <span className={styles.metaItem}>created {formatRelative(p.createdAt)}</span>\n {p.decidedAt ? <span className={styles.metaItem}>decided {formatRelative(p.decidedAt)}</span> : null}\n {p.riskClass ? <span className={`${styles.riskBadge} ${styles[`risk_${p.riskClass}`]}`}>{p.riskClass} risk</span> : null}\n </div>\n {p.summary ? <p className={styles.summary}>{p.summary}</p> : null}\n </header>\n\n <section className={styles.evidence} aria-label=\"Evidence\">\n <div className={styles.evidenceRow}>\n <span className={styles.evidenceLabel}>Judge verdict</span>\n <Epistemic quality={evidence.sourceQuality} label=\"judge verdict\">\n {judgeDisplay ? (\n <StatusBadge status={judged!.judgeReasonCode!} tone={judgeDisplay.tone}>\n {judgeDisplay.label}\n </StatusBadge>\n ) : (\n <span className={styles.muted}>not yet judged</span>\n )}\n </Epistemic>\n </div>\n {judged?.judgeRationaleState ? (\n <p className={styles.rationaleNote}>\n Model rationale:{' '}\n {judged.judgeRationaleState === 'not-persisted' ? 'not persisted' : 'legacy (redacted)'}\n </p>\n ) : null}\n\n {p.decisionReason ? (\n <div className={styles.evidenceRow}>\n <span className={styles.evidenceLabel}>Decision reason</span>\n <span>{p.decisionReason}</span>\n </div>\n ) : null}\n\n {p.verifyResult ? (\n <div className={styles.evidenceRow}>\n <span className={styles.evidenceLabel}>Verification</span>\n <div>\n <StatusBadge status={p.verifyResult.passed ? 'success' : 'failed'}>\n {p.verifyResult.passed ? 'passed' : 'failed'}\n </StatusBadge>\n {p.verifyResult.ran && p.verifyResult.ran.length > 0 ? (\n <span className={styles.muted}> · ran {p.verifyResult.ran.map((r) => r.kind).join(', ')}</span>\n ) : null}\n {p.verifyResult.failed && p.verifyResult.failed.length > 0 ? (\n <p className={styles.failedChecks}>Failed: {p.verifyResult.failed.join(', ')}</p>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {p.evidenceOutcome ? (\n <div className={styles.evidenceRow}>\n <span className={styles.evidenceLabel}>Gates</span>\n <span className={styles.muted}>\n {p.evidenceOutcome.gateCount ?? 0} gate{p.evidenceOutcome.gateCount === 1 ? '' : 's'}\n {p.evidenceOutcome.policyAction ? ` · policy: ${p.evidenceOutcome.policyAction}` : ''}\n {p.evidenceOutcome.trustBasis ? ` · trust: ${p.evidenceOutcome.trustBasis}` : ''}\n </span>\n </div>\n ) : null}\n\n {p.result ? (\n <div className={styles.evidenceRow}>\n <span className={styles.evidenceLabel}>Result</span>\n <span>{p.result}</span>\n </div>\n ) : null}\n </section>\n\n <section className={styles.diffSection} aria-label=\"Diff\">\n <DiffViewer diff={p.diff} proposalKind={p.kind} />\n </section>\n\n {canDecide ? (\n <footer className={styles.actions}>\n {actionError && !confirmOpen ? (\n <p className={styles.actionError} role=\"alert\">\n {actionError}\n </p>\n ) : null}\n {/* APPROVE IS THE DESTRUCTIVE ONE. A `pr` proposal pushes a branch\n and opens a real pull request other people can see; a `patch`\n writes the diff to disk. Reject only marks a row rejected and is\n fully recoverable. This footer used to give Reject the danger\n border and Approve the quiet accent fill, which trains the exact\n wrong reflex — that the red button is the risky one — on the only\n irreversible click in this view. The weights are the Verse\n approvals surface's: Reject neutral, Approve carrying the accent,\n and the consequence spelled out before the click. */}\n <p className={styles.actionConsequence}>{approveConsequence(p.kind, p.repo)}</p>\n <button type=\"button\" className={styles.rejectButton} onClick={() => requestAction('reject')}>\n Reject\n </button>\n <button type=\"button\" className={styles.approveButton} onClick={() => requestAction('approve')}>\n Approve\n </button>\n </footer>\n ) : (\n <footer className={styles.decided}>\n This proposal is already <strong>{p.status}</strong> — no further action available.\n </footer>\n )}\n\n <MutationTokenDialog\n open={tokenDialogOpen}\n onClose={onTokenDialogClose}\n reason={\n pendingAction === 'approve'\n ? 'Approving a proposal mutates the fleet and requires the dispatch token.'\n : 'Rejecting a proposal requires the dispatch token.'\n }\n />\n\n <ConfirmDialog\n open={confirmOpen}\n onClose={() => {\n setConfirmOpen(false);\n setPendingAction(null);\n setActionError(null);\n }}\n title={pendingAction === 'approve' ? 'Approve this proposal?' : 'Reject this proposal?'}\n body={\n pendingAction === 'approve' ? (\n <>\n This applies <strong>{p.title}</strong> to <code>{p.repo}</code> now.{' '}\n {approveConsequence(p.kind, p.repo)} Review the diff above before confirming.\n </>\n ) : (\n <>\n This rejects <strong>{p.title}</strong> and discards it. It stays visible in history (status:\n rejected) but will never be applied. Nothing is written to <code>{p.repo}</code>.\n </>\n )\n }\n confirmLabel={\n pendingAction === 'approve'\n ? (p.kind === 'pr' ? 'Approve and open the pull request' : 'Approve and apply')\n : 'Reject'\n }\n // Approve is the irreversible one; reject is a recoverable bookkeeping\n // change. This was inverted, which made the loud red confirm appear on\n // the SAFE action and the quiet one on the action that pushes a branch.\n destructive={pendingAction === 'approve'}\n busy={busy}\n error={actionError}\n onConfirm={() => void confirmPendingAction()}\n />\n </div>\n );\n}\n","/**\n * routes/inbox/InboxView.tsx — proposal review: the human-in-the-loop\n * moment (operator-console brief). Mounted at both `/inbox` (list only) and\n * `/inbox/:id` (list + detail, deep-linkable) so a specific proposal is\n * bookmarkable/shareable, matching the param-route pattern established by\n * `/work/runs/:id` (app/routes.tsx).\n */\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { ProposalList } from './ProposalList.js';\nimport { ProposalDetail } from './ProposalDetail.js';\nimport styles from './InboxView.module.css';\n\nexport function InboxView() {\n const { id } = useParams<{ id?: string }>();\n const [dispatchDisabled, setDispatchDisabled] = useState(false);\n\n return (\n <div className={styles.view}>\n <header className={styles.header}>\n <h1 className={styles.title}>Inbox</h1>\n <p className={styles.subtitle}>Review proposals, inspect diffs and judge evidence, approve or reject.</p>\n </header>\n\n {dispatchDisabled ? (\n <div className={styles.dispatchBanner} role=\"alert\">\n This server was started without <code>--allow-dispatch</code>, so approve/reject are read-only right now.\n Restart <code>ashlr serve --allow-dispatch</code> to enable them. Browsing and diff review still work.\n </div>\n ) : null}\n\n <div className={styles.layout}>\n <div className={styles.listPane}>\n <ProposalList selectedId={id ?? null} onDispatchDisabled={() => setDispatchDisabled(true)} />\n </div>\n <div className={styles.detailPane}>\n {id ? (\n <ProposalDetail id={id} onDispatchDisabled={() => setDispatchDisabled(true)} />\n ) : (\n <div className={styles.emptyDetail}>\n <p>Select a proposal to review its diff and evidence.</p>\n <p className={styles.hint}>↑/↓ to move · Enter to open · Space to select · / to search</p>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { StatusBadge, type Tone } from '../primitives/StatusBadge.js';\nimport type {\n ActiveValueBetSummary,\n AgentOsCockpitSnapshot,\n CapabilityLaneSummary,\n EvidenceState,\n} from './types.js';\nimport styles from './AgentOsCockpit.module.css';\n\nexport const MAX_VISIBLE_VALUE_BETS = 3;\n\nfunction evidenceTone(state: EvidenceState): Tone {\n if (state === 'complete') return 'success';\n if (state === 'pending') return 'running';\n if (state === 'incomplete') return 'warning';\n return 'unknown';\n}\n\nfunction capabilityTone(state: CapabilityLaneSummary['state']): Tone {\n if (state === 'ready') return 'success';\n if (state === 'tight') return 'warning';\n if (state === 'unavailable') return 'danger';\n return 'unknown';\n}\n\nfunction decisionTone(decision: ActiveValueBetSummary['decision']): Tone {\n if (decision === 'continue') return 'running';\n if (decision === 'observing') return 'info';\n return 'warning';\n}\n\nfunction outcomeTone(state: ActiveValueBetSummary['outcome']['state']): Tone {\n if (state === 'effective') return 'success';\n if (state === 'refuted') return 'danger';\n if (state === 'pending') return 'running';\n return 'unknown';\n}\n\nfunction CapabilityLane({ capability }: { capability: CapabilityLaneSummary }) {\n return (\n <li className={styles.capabilityLane}>\n <div className={styles.laneIdentity}>\n <span className={styles.laneName}>{capability.label}</span>\n <StatusBadge status={capability.state} tone={capabilityTone(capability.state)} />\n </div>\n <div\n className={styles.headroomTrack}\n role=\"img\"\n aria-label={`${capability.label} headroom: ${capability.headroom}`}\n >\n <span className={`${styles.headroomFill} ${styles[capability.headroom]}`} />\n </div>\n <span className={styles.allocation}>{capability.allocationLabel}</span>\n <span className={styles.reset} data-urgency={capability.resetUrgency}>\n {capability.resetLabel}\n </span>\n </li>\n );\n}\n\nfunction ValueBet({ bet }: { bet: ActiveValueBetSummary }) {\n return (\n <li className={styles.bet}>\n <div className={styles.betDecision}>\n <StatusBadge status={bet.decision} tone={decisionTone(bet.decision)} />\n <span className={styles.assurance}>{bet.assurance}</span>\n </div>\n <div className={styles.betThesis}>\n <h3>{bet.title}</h3>\n <p>{bet.valueCase}</p>\n </div>\n <span className={styles.betAllocation}>{bet.allocationLabel}</span>\n <div className={styles.betEvidence}>\n <span>\n <span className={styles.fieldLabel}>Outcome</span>\n <StatusBadge status={bet.outcome.state} tone={outcomeTone(bet.outcome.state)}>\n {bet.outcome.label}\n </StatusBadge>\n </span>\n <span>\n <span className={styles.fieldLabel}>Evidence</span>\n <StatusBadge status={bet.evidence.state} tone={evidenceTone(bet.evidence.state)}>\n {bet.evidence.label}\n </StatusBadge>\n </span>\n </div>\n </li>\n );\n}\n\nexport function AgentOsCockpit({ snapshot }: { snapshot: AgentOsCockpitSnapshot }) {\n const visibleBets = snapshot.activeValueBets.slice(0, MAX_VISIBLE_VALUE_BETS);\n const omittedBets = Math.max(0, snapshot.activeValueBets.length - visibleBets.length);\n const nextAction = snapshot.nextAction;\n\n return (\n <section className={styles.cockpit} aria-labelledby=\"agent-os-title\">\n <header className={styles.decisionSpine}>\n <div className={styles.mission}>\n <div className={styles.titleLine}>\n <h2 id=\"agent-os-title\">Agent OS</h2>\n <StatusBadge\n status={snapshot.sourceState}\n tone={snapshot.sourceState === 'healthy' ? 'success' : snapshot.sourceState === 'degraded' ? 'warning' : 'unknown'}\n />\n <span className={styles.revision}>{snapshot.livingEndState.revisionLabel}</span>\n </div>\n <p className={styles.northStar}>{snapshot.livingEndState.northStar}</p>\n <p className={styles.bottleneck}>\n <span>Current bottleneck</span>\n {snapshot.livingEndState.currentBottleneck}\n </p>\n </div>\n\n <aside\n className={`${styles.nextAction} ${nextAction ? styles[nextAction.kind] : styles.clear}`}\n aria-label=\"Exception-first next action\"\n >\n <span className={styles.nextActionLabel}>Next action</span>\n <strong>{nextAction?.title ?? 'No verified next action available'}</strong>\n <p>{nextAction?.reason ?? 'No exception or clearance evidence was provided.'}</p>\n {nextAction ? (\n <StatusBadge status={nextAction.evidenceState} tone={evidenceTone(nextAction.evidenceState)}>\n {nextAction.evidenceState} evidence\n </StatusBadge>\n ) : null}\n </aside>\n </header>\n\n <section className={styles.spectrum} aria-labelledby=\"capability-spectrum-title\">\n <div className={styles.sectionHeading}>\n <h3 id=\"capability-spectrum-title\">Capability spectrum</h3>\n <p>Usable model runway, ordered by reset urgency</p>\n </div>\n {snapshot.capabilitySpectrum.length > 0 ? (\n <ul className={styles.capabilityList}>\n {snapshot.capabilitySpectrum.map((capability) => (\n <CapabilityLane key={capability.lane} capability={capability} />\n ))}\n </ul>\n ) : (\n <p className={styles.empty}>Capability evidence is not available.</p>\n )}\n </section>\n\n <section className={styles.bets} aria-labelledby=\"active-value-bets-title\">\n <div className={styles.sectionHeading}>\n <h3 id=\"active-value-bets-title\">Active value bets</h3>\n <p>{visibleBets.length} of 3 portfolio slots visible</p>\n </div>\n {visibleBets.length > 0 ? (\n <ol className={styles.betList}>\n {visibleBets.map((bet) => <ValueBet key={bet.key} bet={bet} />)}\n </ol>\n ) : (\n <p className={styles.empty}>No active value bet is verified.</p>\n )}\n {omittedBets > 0 ? (\n <p className={styles.omitted}>{omittedBets} lower-ranked {omittedBets === 1 ? 'bet is' : 'bets are'} held outside this view.</p>\n ) : null}\n </section>\n\n <p className={styles.authorityNote}>\n Observation only. This view cannot dispatch, merge, release, deploy, or change policy.\n </p>\n </section>\n );\n}\n","/**\n * Authenticated, read-only Agent OS route.\n *\n * The cockpit is mounted only for a complete healthy snapshot with an\n * authenticated persistence envelope and every authority bit false. Missing,\n * degraded, unauthenticated, or unexpectedly authoritative responses render\n * an explicit evidence state and never fall back to sample values.\n */\n\nimport { useRef } from 'react';\n\nimport { AgentOsCockpit } from '../../components/agent-os/AgentOsCockpit.js';\nimport { StatusBadge, type Tone } from '../../components/primitives/StatusBadge.js';\nimport { RefreshIndicator } from '../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../components/primitives/Skeleton.js';\nimport { useQuery } from '../../data/hooks.js';\nimport { agentOsSnapshotQuery } from '../../data/queries.js';\nimport type { AgentOsSnapshotResponse } from '../../data/api-types.js';\nimport { useScrollRestore } from '../../hooks/useScrollRestore.js';\nimport styles from './AgentOsView.module.css';\n\nfunction hasNoOperationalAuthority(response: AgentOsSnapshotResponse): boolean {\n return response.authority === 'observation-only' && response.sameUserTamperResistant === false &&\n response.rollbackProtected === false &&\n response.historicalAuthority === false && response.executionAuthority === false &&\n response.proposalAuthority === false && response.mergeAuthority === false &&\n response.deployAuthority === false && response.publicationAuthority === false &&\n response.externalMutationAuthority === false;\n}\n\nfunction unavailableReason(response: AgentOsSnapshotResponse): string {\n if (response.reason) return response.reason;\n if (response.sourceState === 'missing') return 'No authenticated Agent OS snapshot has been recorded.';\n if (response.authentication !== 'authenticated') return 'Snapshot authentication is unavailable or invalid.';\n if (response.sameUserTamperResistant !== false) return 'The response made an unsupported same-user tamper-resistance claim.';\n if (!hasNoOperationalAuthority(response)) return 'The response crossed the observation-only authority boundary.';\n if (!response.complete) return 'The snapshot chain is incomplete.';\n if (!response.snapshot) return 'No verified Agent OS snapshot is available.';\n return 'The Agent OS snapshot is degraded.';\n}\n\nfunction sourceTone(response: AgentOsSnapshotResponse): Tone {\n if (response.sourceState === 'healthy' && response.complete && response.authentication === 'authenticated' &&\n hasNoOperationalAuthority(response) && response.snapshot !== null) {\n return 'success';\n }\n if (response.sourceState === 'degraded' || response.authentication === 'invalid' ||\n !hasNoOperationalAuthority(response)) return 'warning';\n return 'unknown';\n}\n\nexport function AgentOsView() {\n const containerRef = useRef<HTMLDivElement>(null);\n useScrollRestore('/agent-os', containerRef);\n const query = useQuery(agentOsSnapshotQuery);\n const response = query.data;\n const renderable = response?.sourceState === 'healthy' && response.complete &&\n response.authentication === 'authenticated' && hasNoOperationalAuthority(response) && response.snapshot !== null;\n\n return (\n <div ref={containerRef} className={styles.view}>\n <header className={styles.header}>\n <div>\n <p className={styles.eyebrow}>Overview</p>\n <h1 className={styles.title}>Agent-native engineering OS</h1>\n <p className={styles.subtitle}>Authenticated fleet intelligence. Observation only.</p>\n </div>\n <div className={styles.freshness} aria-live=\"polite\">\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n {response ? (\n <StatusBadge status={response.sourceState} tone={sourceTone(response)}>\n {response.sourceState}\n </StatusBadge>\n ) : null}\n </div>\n </header>\n\n {query.status === 'loading' ? (\n <section className={styles.loading} aria-label=\"Loading Agent OS snapshot\">\n <SkeletonLine width=\"65%\" />\n <SkeletonLine width=\"90%\" />\n <SkeletonLine width=\"75%\" />\n </section>\n ) : query.status === 'error' ? (\n <section className={styles.unavailable} role=\"alert\">\n <h2>Agent OS snapshot unavailable</h2>\n <p>{query.error?.message ?? 'The read-only Agent OS endpoint could not be reached.'}</p>\n <p className={styles.boundary}>No capability, value, or next-action values are inferred when the source cannot be read.</p>\n </section>\n ) : response && renderable && response.snapshot ? (\n <AgentOsCockpit snapshot={response.snapshot} />\n ) : response ? (\n <section className={styles.unavailable} role=\"status\">\n <div className={styles.unavailableHeading}>\n <h2>{response.sourceState === 'missing' ? 'No Agent OS snapshot yet' : 'Agent OS snapshot degraded'}</h2>\n <StatusBadge status={response.authentication} tone={response.authentication === 'authenticated' ? 'success' : 'warning'} />\n </div>\n <p>{unavailableReason(response)}</p>\n <p className={styles.boundary}>The cockpit remains hidden until a complete authenticated observation-only snapshot is available.</p>\n </section>\n ) : (\n <section className={styles.unavailable} role=\"status\">\n <h2>Agent OS snapshot unavailable</h2>\n <p>No response was provided by the read-only Agent OS endpoint.</p>\n </section>\n )}\n </div>\n );\n}\n","/**\n * app/routes.tsx — the route table. Driven by NAV_GROUPS\n * (app/nav-config.ts) so every nav leaf resolves to *something* real:\n * FleetDashboardView for the one implemented leaf, PlaceholderView for\n * everything else. Two illustrative param routes (/work/runs/:id,\n * /work/swarms/:id) exist to prove deep-linking with a resource id works\n * end-to-end even before those views are built — that's the pattern a view\n * agent follows: add the real component, delete the placeholder route.\n *\n * ROUTING STRATEGY — hash-based (react-router-dom's HashRouter), on\n * purpose: src/core/web/static.ts (which this foundation must not modify)\n * only special-cases the literal \"/\" to resolve to index.html; every other\n * path is resolved as a literal file and 404s if it doesn't exist. A\n * pushState router would 404 on refresh or on a pasted deep link for any\n * route but \"/\". Hash routing sidesteps this entirely — the hash never\n * reaches the server — while still giving real hierarchical, bookmarkable,\n * shareable URLs (`#/work/runs/r_123`), which is what the foundation brief\n * actually asked for (\"real client-side routing with deep links, not just\n * hash-to-view\"). See DESIGN.md \"Routing\" for the full rationale and what\n * changes here once the legacy app is retired and server.ts gains a real\n * SPA catch-all.\n */\nimport { Navigate, Route, Routes } from 'react-router-dom';\nimport { Shell } from '../components/layout/Shell.js';\nimport { PlaceholderView } from '../routes/PlaceholderView.js';\nimport { FleetDashboardView } from '../routes/fleet-dashboard/FleetDashboardView.js';\nimport { JournalView } from '../routes/journal/JournalView.js';\nimport { PulseView } from '../routes/intelligence/pulse/PulseView.js';\nimport { GenomeView } from '../routes/intelligence/genome/GenomeView.js';\nimport { ProductionView } from '../routes/intelligence/production/ProductionView.js';\nimport { PortfolioView } from '../routes/portfolio/PortfolioView.js';\nimport { RunsView } from '../routes/work/runs/RunsView.js';\nimport { RunDetailView } from '../routes/work/runs/RunDetailView.js';\nimport { SwarmsView } from '../routes/work/swarms/SwarmsView.js';\nimport { SwarmDetailView } from '../routes/work/swarms/SwarmDetailView.js';\nimport { DaemonView } from '../routes/control/daemon/DaemonView.js';\nimport { FleetView } from '../routes/control/fleet/FleetView.js';\nimport { SecurityView } from '../routes/control/security/SecurityView.js';\nimport { GoalsView } from '../routes/goals/GoalsView.js';\nimport { InboxView } from '../routes/inbox/InboxView.js';\nimport { AgentOsView } from '../routes/agent-os/AgentOsView.js';\nimport { UniverseView } from '../routes/universe/UniverseView.js';\nimport { NAV_GROUPS, ALL_NAV_LEAVES } from './nav-config.js';\n\nexport function AppRoutes() {\n return (\n <Routes>\n <Route element={<Shell />}>\n <Route index element={<Navigate to=\"/overview\" replace />} />\n {ALL_NAV_LEAVES.map((leaf) =>\n leaf.implemented ? null : (\n <Route\n key={leaf.path}\n path={leaf.path}\n element={<PlaceholderView title={leaf.label} description={leaf.description} />}\n />\n ),\n )}\n <Route path=\"/overview\" element={<FleetDashboardView />} />\n <Route path=\"/agent-os\" element={<AgentOsView />} />\n <Route path=\"/universe\" element={<UniverseView />} />\n <Route path=\"/journal\" element={<JournalView />} />\n <Route path=\"/intelligence/pulse\" element={<PulseView />} />\n <Route path=\"/intelligence/genome\" element={<GenomeView />} />\n <Route path=\"/intelligence/production\" element={<ProductionView />} />\n <Route path=\"/portfolio\" element={<PortfolioView />} />\n <Route path=\"/work/runs\" element={<RunsView />} />\n <Route path=\"/work/runs/:id\" element={<RunDetailView />} />\n <Route path=\"/work/swarms\" element={<SwarmsView />} />\n <Route path=\"/work/swarms/:id\" element={<SwarmDetailView />} />\n <Route path=\"/control/daemon\" element={<DaemonView />} />\n <Route path=\"/control/fleet\" element={<FleetView />} />\n <Route path=\"/control/security\" element={<SecurityView />} />\n <Route path=\"/goals\" element={<GoalsView />} />\n <Route path=\"/inbox\" element={<InboxView />} />\n <Route path=\"/inbox/:id\" element={<InboxView />} />\n <Route path=\"*\" element={<Navigate to=\"/overview\" replace />} />\n </Route>\n </Routes>\n );\n}\n\n// Referenced by tests / DESIGN.md to assert every group's leaves round-trip\n// through this route table without a manual re-listing.\nexport { NAV_GROUPS };\n","/**\n * app/App.tsx — root composition: theme/reset CSS is imported once here,\n * the auth gate decides between <SessionGate/> and the routed shell, and\n * ToastProvider wraps everything so any component can surface an error\n * without prop-drilling a callback.\n *\n * BOOTSTRAP: on first mount we don't know yet whether the 15-minute read\n * session cookie from a previous page load is still valid, so we probe it\n * with a real protected GET rather than guessing from stored state (there\n * is deliberately nothing in storage that would tell us — see\n * data/auth-store.ts). A 200 means \"still logged in, skip SessionGate\"; a\n * 401 means show it. Either way this doubles as the first real data fetch,\n * not a throwaway ping.\n */\nimport { useEffect } from 'react';\nimport { HashRouter } from 'react-router-dom';\nimport { AppRoutes } from './routes.js';\nimport { SkipToContent } from './SkipToContent.js';\nimport { SessionGate } from '../components/auth/SessionGate.js';\nimport { ToastProvider } from '../components/primitives/Toast.js';\nimport { useAuthPhase } from '../data/hooks.js';\nimport { markCheckComplete } from '../data/auth-store.js';\nimport { runQuery, getQuerySnapshot } from '../data/cache.js';\nimport { dashboardSnapshotQuery } from '../data/queries.js';\nimport '../design/global.css';\n\nfunction useBootstrapSessionProbe(phase: ReturnType<typeof useAuthPhase>) {\n useEffect(() => {\n if (phase !== 'checking') return;\n let cancelled = false;\n void runQuery(dashboardSnapshotQuery.key, dashboardSnapshotQuery.fetch).then(() => {\n if (cancelled) return;\n const entry = getQuerySnapshot(dashboardSnapshotQuery.key);\n markCheckComplete(entry.status === 'success');\n });\n return () => {\n cancelled = true;\n };\n }, [phase]);\n}\n\nexport function App() {\n const phase = useAuthPhase();\n useBootstrapSessionProbe(phase);\n // The global Hub event feed is only needed after the root mounts. Scoped\n // consoles (including the phone) do not subscribe to this channel.\n useEffect(() => { void import('../data/sse.js'); }, []);\n\n return (\n <ToastProvider>\n {phase === 'checking' ? (\n <div aria-live=\"polite\" className=\"visually-hidden\">\n Checking for an existing session…\n </div>\n ) : phase === 'unauthenticated' ? (\n <SessionGate />\n ) : (\n <HashRouter>\n <SkipToContent />\n <AppRoutes />\n </HashRouter>\n )}\n </ToastProvider>\n );\n}\n"],"file":"App-DebYuj1v.js"}
|