@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/data/cache.ts","../../../../../../src/web-ui/routes/verse/chat/composer-memory.ts","../../../../../../src/web-ui/data/remote-mode.ts","../../../../../../src/web-ui/data/auth-store.ts","../../../../../../src/web-ui/data/theme-store.ts","../../../../../../src/web-ui/data/hooks.ts","../../../../../../src/web-ui/data/client.ts"],"sourcesContent":["/**\n * data/cache.ts — the resource cache every view reads through. This is what\n * makes tab switches instant instead of blanking to \"Loading…\": a resource\n * fetched once stays in the cache and renders immediately (possibly stale)\n * on the next mount, with a background refresh kicked off silently behind\n * it. No framework dependency — a plain keyed store consumed via\n * useSyncExternalStore (see hooks.ts), matching the pattern already used\n * for auth-store.ts.\n *\n * Design choices, spelled out because a future agent will extend this:\n * - In-flight de-dupe: two components requesting the same key at once\n * share one fetch, not two.\n * - Never clears `data` on refetch. `status` distinguishes 'loading'\n * (no data yet — show a skeleton) from 'refreshing' (stale data still\n * shown — show a subtle indicator) from 'success'/'error'.\n * - `invalidate(key)` is how the SSE layer (sse.ts) tells the cache \"the\n * server just told us this changed\" without either module importing\n * React.\n * - useSyncExternalStore requires getSnapshot() to return a NEW object\n * reference whenever the observable state actually changes (it detects\n * updates via Object.is, not deep equality) — mutating one long-lived\n * entry object in place and handing back the same reference would fire\n * subscribers that never actually re-render. Every state transition\n * below therefore replaces `bookkeeping.snapshot` wholesale instead of\n * patching fields on it.\n *\n * ---------------------------------------------------------------------------\n * V2.1 — the request burst, and the three defects that lived in this file\n * ---------------------------------------------------------------------------\n *\n * Mounting the Usage section fires SEVEN reads at once (accounts, control,\n * bootstrap, usage-series, local-models, /api/control, /api/usage), several\n * of which spawn short-lived probe processes server-side. That burst starved\n * the 2s local-runtime probe timeout and made a healthy Ollama report as\n * unreachable roughly one burst in ten. The probe timeouts were hardened\n * server-side; the burst itself was still this file's problem. Three changes:\n *\n * 1. CONCURRENCY GATE. Every fetch this cache issues passes through a\n * process-wide gate capped at QUERY_CONCURRENCY_LIMIT. The same seven\n * reads still happen, but at most four are outstanding at once, so the\n * server is never asked to run seven probe-spawning handlers in\n * parallel. Nothing is dropped, nothing is delayed by a timer — a\n * queued task starts the microtask a slot frees. The gate is what makes\n * the probe timeout survivable, and it costs the caller nothing: the\n * browser already caps at ~6 sockets per origin, so this is a cap the\n * requests were going to hit anyway, applied where we can order it.\n *\n * 2. FRESHNESS. `ensureQuery(key, fetcher, maxAgeMs)` is the MOUNT path: it\n * skips the request entirely when the cached value is younger than\n * `maxAgeMs`. Re-entering a section you were just in is now zero\n * requests instead of seven. `runQuery` keeps its old always-fetch\n * semantics because the SSE layer and the prefetchers depend on it.\n *\n * 3. REFRESH THAT ACTUALLY RE-READS. `runQuery`'s in-flight de-dupe is\n * right for two components mounting at once and WRONG for a person\n * pressing Refresh: a click landing while a read is in flight joined\n * the running promise and returned data fetched before the click — a\n * silent no-op, and with local-models taking seconds under load the\n * window was real. `refetchQuery` fixes it in two steps, because the\n * same hook backs both a person's button and a 3s poll loop:\n * - by default it joins an in-flight read ONLY while that read is\n * younger than REFETCH_JOIN_WINDOW_MS. A poll tick landing on a\n * read that started milliseconds ago still coalesces (which is the\n * documented contract UniverseView's poll relies on); a click\n * landing on a read that started seconds ago issues a new request.\n * - with `force` it never joins at all. That is the strict guarantee\n * for an explicit user-initiated refresh (hooks.ts `useRefresh`).\n * Either way a newer request SUPERSEDES an older one by sequence\n * number, so the last read ISSUED is the one whose result is kept even\n * if an earlier one lands later.\n *\n * And the latent one: `evictAll()` used to call `store.clear()`, which\n * dropped the Bookkeeping objects that mounted components had registered\n * their `useSyncExternalStore` listeners on. Those components stayed\n * subscribed to an orphan Set that nothing would ever notify again — they\n * would never re-render for the rest of their life. Evict now RESETS an\n * entry that still has subscribers (and deletes only the unobserved ones),\n * so a subscriber always survives an evict.\n */\n\nexport type QueryStatus = 'idle' | 'loading' | 'refreshing' | 'success' | 'error';\n\nexport interface QueryEntry<T> {\n data: T | undefined;\n error: Error | undefined;\n status: QueryStatus;\n updatedAt: number | null;\n}\n\ninterface Bookkeeping<T = unknown> {\n snapshot: QueryEntry<T>;\n inFlight: Promise<void> | null;\n fetcher: (() => Promise<T>) | null;\n subscribers: Set<() => void>;\n /** Sequence number of the newest request ISSUED for this key. */\n issued: number;\n /** `Date.now()` when that newest request was issued. */\n issuedAt: number;\n /** Highest sequence number whose result has been written to `snapshot`. */\n applied: number;\n}\n\nconst IDLE_SNAPSHOT: QueryEntry<unknown> = { data: undefined, error: undefined, status: 'idle', updatedAt: null };\n\nconst store = new Map<string, Bookkeeping>();\n\n// ---------------------------------------------------------------------------\n// Concurrency gate\n// ---------------------------------------------------------------------------\n\n/**\n * How many cache-issued fetches may be outstanding at once, process-wide.\n *\n * Four, not one: the point is to stop a seven-way burst from spawning seven\n * concurrent server-side probes, not to serialize the app. Four keeps a\n * section's first paint fast while leaving the server two of its six sockets\n * for the SSE stream and any non-cache request.\n */\nexport const QUERY_CONCURRENCY_LIMIT = 4;\n\nlet activeFetches = 0;\nconst gateQueue: (() => void)[] = [];\n/** Peak concurrency observed since the gate was last reset. */\nlet peakConcurrency = 0;\n/**\n * Bumped by `resetQueryGate`. A fetch issued under an older generation no\n * longer owns a slot, so its eventual settlement must not decrement the new\n * generation's count — otherwise a request that never settles (a hung\n * socket, or a test stubbing fetch with a promise that never resolves) would\n * permanently consume capacity and starve every later read.\n */\nlet gateGeneration = 0;\n\nfunction releaseSlot(): void {\n activeFetches -= 1;\n const next = gateQueue.shift();\n if (next) next();\n}\n\n/**\n * Run `task` when a slot is free. Purely promise-driven — no timers, so this\n * is safe under fake timers and adds no latency beyond one microtask.\n */\nfunction schedule<T>(task: () => Promise<T>): Promise<T> {\n const start = (): Promise<T> => {\n const generation = gateGeneration;\n activeFetches += 1;\n if (activeFetches > peakConcurrency) peakConcurrency = activeFetches;\n const done = (): void => {\n if (generation === gateGeneration) releaseSlot();\n };\n let running: Promise<T>;\n try {\n running = task();\n } catch (err) {\n // A fetcher that throws synchronously must still free its slot.\n done();\n return Promise.reject(err instanceof Error ? err : new Error(String(err)));\n }\n return running.then(\n (value) => {\n done();\n return value;\n },\n (err: unknown) => {\n done();\n throw err;\n },\n );\n };\n\n if (activeFetches < QUERY_CONCURRENCY_LIMIT) return start();\n return new Promise<T>((resolve, reject) => {\n gateQueue.push(() => {\n start().then(resolve, reject);\n });\n });\n}\n\n/**\n * Abandon the gate's accounting: forget how many fetches are outstanding and\n * let everything queued run now. Called from `evictAll()`, which is both the\n * logout path and every test's `beforeEach` — a read that outlives the state\n * it was issued for has no claim on the next one's capacity.\n *\n * Nothing is cancelled. Requests already in flight still settle and still\n * write their result unless the key was evicted underneath them.\n */\nexport function resetQueryGate(): void {\n gateGeneration += 1;\n activeFetches = 0;\n peakConcurrency = 0;\n for (const start of gateQueue.splice(0)) start();\n}\n\n/**\n * What the gate is doing right now. The tests read it, and so does the shell's\n * idle warm-up (routes/verse/shell/warmup.ts): it starts nothing while any\n * read is running or queued here.\n */\nexport function queryGateStats(): { active: number; queued: number; peak: number } {\n return { active: activeFetches, queued: gateQueue.length, peak: peakConcurrency };\n}\n\n// ---------------------------------------------------------------------------\n// Entries\n// ---------------------------------------------------------------------------\n\nfunction entryFor<T>(key: string): Bookkeeping<T> {\n let e = store.get(key) as Bookkeeping<T> | undefined;\n if (!e) {\n e = {\n snapshot: IDLE_SNAPSHOT as QueryEntry<T>,\n inFlight: null,\n fetcher: null,\n subscribers: new Set(),\n issued: 0,\n issuedAt: 0,\n applied: 0,\n };\n store.set(key, e);\n }\n return e;\n}\n\nfunction setSnapshot<T>(e: Bookkeeping<T>, patch: Partial<QueryEntry<T>>): void {\n e.snapshot = { ...e.snapshot, ...patch };\n}\n\nfunction notify(key: string): void {\n const e = store.get(key);\n if (!e) return;\n for (const s of e.subscribers) s();\n}\n\n/**\n * Structural equality for API payloads, used to decide whether a refresh\n * actually changed anything.\n *\n * A Refresh that re-reads seven routes and finds six of them byte-identical\n * should re-render nothing for those six. Keeping the PREVIOUS `data`\n * reference when the new body is deep-equal does exactly that: the snapshot\n * object still changes (status and updatedAt did), so useSyncExternalStore\n * still fires, but every `useMemo`/`memo` keyed on `data` downstream skips —\n * and the Usage section's models are all keyed on `data`.\n *\n * Deliberately structural rather than JSON.stringify: key order is not\n * significant in these payloads, and stringify would also throw on the\n * (never-seen, but cheap to survive) cyclic body.\n */\nfunction sameData(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null || typeof a !== 'object') return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, i) => sameData(item, b[i]));\n }\n const left = a as Record<string, unknown>;\n const right = b as Record<string, unknown>;\n const leftKeys = Object.keys(left);\n if (leftKeys.length !== Object.keys(right).length) return false;\n return leftKeys.every((k) => Object.prototype.hasOwnProperty.call(right, k) && sameData(left[k], right[k]));\n}\n\nexport function subscribeQuery(key: string, listener: () => void): () => void {\n const e = entryFor(key);\n e.subscribers.add(listener);\n return () => {\n e.subscribers.delete(listener);\n };\n}\n\nexport function getQuerySnapshot<T>(key: string): QueryEntry<T> {\n return entryFor<T>(key).snapshot;\n}\n\n/**\n * How long an in-flight read is accepted as already satisfying a refetch.\n *\n * A poll tick (UniverseView refreshes every 3–15s and again on\n * visibilitychange) that lands on a read issued milliseconds ago should\n * coalesce with it — that is the behavior its own comment and tests pin\n * down. A person's Refresh landing on a read that has been running for\n * seconds should not: they are asking about the world as of the click.\n */\nexport const REFETCH_JOIN_WINDOW_MS = 250;\n\nexport interface QueryRunOptions {\n /**\n * Skip the request when the cached value is younger than this many ms.\n * Undefined (the default) always fetches.\n */\n maxAgeMs?: number;\n /**\n * Join an in-flight read only while it is younger than this. Undefined\n * joins any in-flight read (the original de-dupe).\n */\n joinWindowMs?: number;\n /**\n * User-initiated. Never joins an in-flight read and never honours\n * `maxAgeMs` — pressing Refresh must produce a request that was issued\n * after the click.\n */\n force?: boolean;\n}\n\nfunction isFresh(e: Bookkeeping, maxAgeMs: number): boolean {\n if (e.snapshot.updatedAt === null) return false;\n if (e.snapshot.status === 'error') return false;\n return Date.now() - e.snapshot.updatedAt < maxAgeMs;\n}\n\nfunction mayJoin(e: Bookkeeping, options: QueryRunOptions): boolean {\n if (e.inFlight === null) return false;\n if (options.joinWindowMs === undefined) return true;\n return Date.now() - e.issuedAt < options.joinWindowMs;\n}\n\nfunction execute<T>(key: string, fetcher: () => Promise<T>, options: QueryRunOptions): Promise<void> {\n const e = entryFor<T>(key);\n e.fetcher = fetcher;\n\n if (!options.force) {\n // Two components mounting at once share one request.\n if (mayJoin(e, options)) return e.inFlight!;\n // Already fresh enough for this caller: no request at all.\n if (options.maxAgeMs !== undefined && isFresh(e, options.maxAgeMs)) return Promise.resolve();\n }\n\n const seq = (e.issued += 1);\n e.issuedAt = Date.now();\n setSnapshot(e, { status: e.snapshot.data !== undefined ? 'refreshing' : 'loading' });\n notify(key);\n\n const run = schedule(fetcher)\n .then((data) => {\n // A superseded request (a forced refresh was issued after this one, or\n // the key was evicted) must never overwrite a newer answer.\n if (seq < e.applied) return;\n e.applied = seq;\n const unchanged = e.snapshot.data !== undefined && sameData(e.snapshot.data, data);\n setSnapshot(e, {\n data: unchanged ? e.snapshot.data : data,\n error: undefined,\n status: 'success',\n updatedAt: Date.now(),\n });\n })\n .catch((err: unknown) => {\n if (seq < e.applied) return;\n e.applied = seq;\n setSnapshot(e, { error: err instanceof Error ? err : new Error(String(err)), status: 'error' });\n })\n .finally(() => {\n // Only the newest request owns `inFlight`; an older, superseded one\n // finishing must not clear the newer one's slot.\n if (e.issued === seq) e.inFlight = null;\n notify(key);\n });\n\n e.inFlight = run;\n return run;\n}\n\n/**\n * Kick off (or join) a fetch for `key`. Safe to call redundantly — repeated\n * calls with an in-flight fetch are no-ops. Registers `fetcher` on the\n * entry so invalidate() can re-run it later without the caller re-supplying\n * it (e.g. from the SSE layer, which doesn't have per-view fetch closures).\n */\nexport function runQuery<T>(key: string, fetcher: () => Promise<T>): Promise<void> {\n return execute(key, fetcher, {});\n}\n\n/**\n * The MOUNT path (hooks.ts `useQuery`). Identical to `runQuery` except that a\n * value fetched less than `maxAgeMs` ago is accepted as-is and no request is\n * made. This is what turns \"switch to Usage and back\" from fourteen requests\n * into seven.\n */\nexport function ensureQuery<T>(key: string, fetcher: () => Promise<T>, maxAgeMs: number): Promise<void> {\n return execute(key, fetcher, { maxAgeMs });\n}\n\n/**\n * The REFRESH path (hooks.ts `useRefetch` / `useRefresh`).\n *\n * Default (`force: false`): joins an in-flight read only while that read is\n * younger than REFETCH_JOIN_WINDOW_MS, so a burst of poll ticks still\n * collapses into one request while a click on a long-running read gets a\n * real re-read.\n *\n * `force: true`: never joins. Always issues a request made after the call,\n * and wins the race against anything already running regardless of which\n * lands first. This is the guarantee an explicit user-initiated refresh\n * needs.\n */\nexport function refetchQuery<T>(key: string, fetcher: () => Promise<T>, force = false): Promise<void> {\n return execute(key, fetcher, force ? { force: true } : { joinWindowMs: REFETCH_JOIN_WINDOW_MS });\n}\n\n/** Re-run the last fetcher registered for `key`, if any (used by sse.ts). */\nexport function invalidate(key: string): void {\n const e = store.get(key);\n if (!e || !e.fetcher) return;\n void runQuery(key, e.fetcher);\n}\n\n/** Re-run the fetcher for every cached key starting with `prefix`. For\n * parameterized resources (per-filter inbox list queries, per-id inbox\n * detail queries) the exact live key isn't known ahead of time — used by\n * sse.ts and data/mutations.ts so those views live-update too. */\nexport function invalidatePrefix(prefix: string): void {\n for (const key of store.keys()) {\n if (key.startsWith(prefix)) invalidate(key);\n }\n}\n\n/**\n * `invalidatePrefix`, but only for keys a mounted component is SUBSCRIBED to.\n *\n * The read-session renewal sweep (auth-store.ts) uses it. An entry nobody is\n * reading — a surface the shell's idle warm-up fetched but the operator never\n * opened, or one they left — is left exactly as it is: whoever mounts it next\n * goes through `ensureQuery`, which re-reads it if it is older than that\n * caller accepts or if it failed (a read that 401ed is 'error', never fresh).\n * Re-running those fetchers on every 15-minute renewal was pure background\n * traffic through the same gate as the chat reads waiting on their retry.\n */\nexport function invalidateObserved(prefix: string): void {\n for (const [key, e] of store) {\n if (e.subscribers.size > 0 && key.startsWith(prefix)) invalidate(key);\n }\n}\n\n/**\n * Reset one entry to idle WITHOUT dropping its subscriber set, and supersede\n * anything still in flight for it so a late result cannot repopulate the key\n * after it was deliberately cleared.\n */\nfunction resetEntry(key: string, e: Bookkeeping): void {\n e.snapshot = IDLE_SNAPSHOT as QueryEntry<unknown>;\n e.fetcher = null;\n e.inFlight = null;\n e.issued += 1;\n e.applied = e.issued;\n notify(key);\n}\n\n/** Drop a key entirely (rare — e.g. on logout, so stale data never leaks\n * into the next session's first paint). An entry that still has mounted\n * subscribers is RESET rather than deleted: deleting it would orphan the\n * listener set those components registered on, leaving them subscribed to\n * something nothing can notify. */\nexport function evict(key: string): void {\n const e = store.get(key);\n if (!e) return;\n if (e.subscribers.size === 0) {\n store.delete(key);\n return;\n }\n resetEntry(key, e);\n}\n\nexport function evictAll(): void {\n resetQueryGate();\n for (const [key, e] of [...store]) {\n if (e.subscribers.size === 0) {\n store.delete(key);\n continue;\n }\n resetEntry(key, e);\n }\n}\n","/**\n * routes/verse/chat/composer-memory.ts — the composer's memory: drafts\n * and sent messages, per chat.\n *\n * Two things a long agentic day needs from a message box and does not get\n * from a bare `useState`:\n *\n * 1. A draft survives switching chats and reloading the app. Half-written\n * instructions are expensive to re-type and are lost today the moment\n * ⌘K lands somewhere else.\n * 2. What was already sent can be recalled with ↑, the way every shell\n * works, because the second attempt at a prompt is usually the first\n * one plus a clause.\n *\n * Both are per-session and stored in `localStorage`, bounded so a long-lived\n * browser cannot accumulate an unbounded map. Every access is wrapped: a\n * private window with storage blocked still runs the app.\n *\n * Split from composer-state.ts (which re-exports all of it) so the modules on\n * the chat first-paint path that only FORGET or CLEAR this memory (the Chat\n * section on delete, auth-store on logout) do not pull the cost estimator and\n * context-math into the chat first-paint critical JS.\n */\n\nconst DRAFT_KEY = 'ashlr.verse.drafts.v1';\nconst SENT_KEY = 'ashlr.verse.sent.v1';\n\n/** Sessions remembered, newest last. */\nconst SESSION_LIMIT = 40;\n/** Messages recalled per session. */\nconst HISTORY_LIMIT = 25;\n/** Matches VERSE_MAX_TURN_TEXT_BYTES; a draft over it cannot be sent anyway. */\nconst TEXT_LIMIT = 64 * 1024;\n\nfunction readMap<T>(key: string, parse: (value: unknown) => T | null): Record<string, T> {\n const out: Record<string, T> = {};\n try {\n const raw = localStorage.getItem(key);\n const parsed = raw ? (JSON.parse(raw) as unknown) : null;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n for (const [id, value] of Object.entries(parsed as Record<string, unknown>)) {\n const clean = parse(value);\n if (clean !== null) out[id] = clean;\n }\n }\n } catch {\n /* storage unavailable or corrupt — an empty memory is a valid one */\n }\n return out;\n}\n\n/** True when the write landed; false when storage refused it (blocked, over quota). */\nfunction writeMap(key: string, map: Record<string, unknown>): boolean {\n // Insertion order is recency order: every write deletes before re-inserting.\n const ids = Object.keys(map);\n for (const stale of ids.slice(0, Math.max(0, ids.length - SESSION_LIMIT))) delete map[stale];\n try {\n localStorage.setItem(key, JSON.stringify(map));\n return true;\n } catch {\n /* best-effort — the caller decides whether a refusal loses anything */\n return false;\n }\n}\n\nconst asText = (value: unknown): string | null =>\n typeof value === 'string' && value.length > 0 ? value.slice(0, TEXT_LIMIT) : null;\n\nconst asHistory = (value: unknown): string[] | null => {\n if (!Array.isArray(value)) return null;\n const list = value.filter((v): v is string => typeof v === 'string' && v.length > 0)\n .slice(-HISTORY_LIMIT)\n .map((v) => v.slice(0, TEXT_LIMIT));\n return list.length > 0 ? list : null;\n};\n\n/**\n * Drafts whose last write storage REFUSED, held for the page's lifetime ('' =\n * a clear that could not be written) and consulted BEFORE storage.\n *\n * WHY: `localStorage` writes fail silently (blocked storage, a full quota),\n * and one draft is not a convenience but the only copy of something: the\n * handoff note. The dialog hands it over with `saveDraft` and the new chat's\n * Composer restores it with `loadDraft`; with storage refusing, the edited\n * note — possibly written after a paid summary turn — simply vanished. An\n * entry here is always newer than whatever storage holds for that chat, and a\n * later write that lands removes it, so storage is the answer again.\n */\nconst unsavedDrafts = new Map<string, string>();\n\n/** The unsent draft for this chat, or `''`. */\nexport function loadDraft(sessionId: string | null | undefined): string {\n if (!sessionId) return '';\n const unsaved = unsavedDrafts.get(sessionId);\n if (unsaved !== undefined) return unsaved;\n return readMap(DRAFT_KEY, asText)[sessionId] ?? '';\n}\n\n/** Persist (or clear, when empty) the draft for this chat. */\nexport function saveDraft(sessionId: string | null | undefined, text: string): void {\n if (!sessionId) return;\n const clean = text.trim().length > 0 ? text.slice(0, TEXT_LIMIT) : '';\n const map = readMap(DRAFT_KEY, asText);\n delete map[sessionId];\n if (clean) map[sessionId] = clean;\n unsavedDrafts.delete(sessionId);\n if (!writeMap(DRAFT_KEY, map)) {\n unsavedDrafts.set(sessionId, clean);\n // Bounded like storage: oldest refusals go first.\n for (const stale of [...unsavedDrafts.keys()].slice(0, Math.max(0, unsavedDrafts.size - SESSION_LIMIT))) unsavedDrafts.delete(stale);\n }\n}\n\n/** Messages sent in this chat, oldest first. */\nexport function loadHistory(sessionId: string | null | undefined): string[] {\n if (!sessionId) return [];\n return readMap(SENT_KEY, asHistory)[sessionId] ?? [];\n}\n\n/** Record a sent message; consecutive duplicates are not stored twice. */\nexport function pushHistory(sessionId: string | null | undefined, text: string): void {\n if (!sessionId || text.trim().length === 0) return;\n const map = readMap(SENT_KEY, asHistory);\n const current = map[sessionId] ?? [];\n delete map[sessionId];\n const next = current[current.length - 1] === text ? current : [...current, text.slice(0, TEXT_LIMIT)];\n map[sessionId] = next.slice(-HISTORY_LIMIT);\n writeMap(SENT_KEY, map);\n}\n\n/**\n * Forget everything this chat remembered — its unsent draft and its sent\n * messages.\n *\n * Deleting a chat removes its transcript from disk, but the verbatim prompts\n * stayed in browser storage under the dead session id until forty newer\n * sessions rotated them out.\n */\nexport function forgetComposerMemory(sessionId: string | null | undefined): void {\n if (!sessionId) return;\n unsavedDrafts.delete(sessionId);\n for (const [key, parse] of [\n [DRAFT_KEY, asText],\n [SENT_KEY, asHistory],\n ] as const) {\n const map: Record<string, unknown> = readMap(key, parse as (v: unknown) => unknown);\n if (!(sessionId in map)) continue;\n delete map[sessionId];\n writeMap(key, map);\n }\n}\n\n/**\n * Drop every remembered draft and sent message, for every session.\n *\n * Called on disconnect/logout alongside the query cache's `evictAll`, whose\n * contract is that stale data must not leak into the next session's first\n * paint. Prompt text is precisely the content that wipe exists for, and it is\n * the one thing that used to survive it.\n */\nexport function clearComposerMemory(): void {\n unsavedDrafts.clear();\n for (const key of [DRAFT_KEY, SENT_KEY]) {\n try {\n localStorage.removeItem(key);\n } catch {\n /* storage unavailable — nothing to clear */\n }\n }\n}\n\nexport const VERSE_DRAFT_STORAGE_KEY = DRAFT_KEY;\nexport const VERSE_SENT_STORAGE_KEY = SENT_KEY;\n","/** Only the gateway injects this marker into the mobile HTML it serves. */\nexport function isRemoteMobileMode(): boolean {\n return typeof document !== 'undefined'\n && document.head.querySelector('meta[name=\"ashlr-remote-gateway\"][content=\"v1\"]') !== null;\n}\n","/**\n * data/auth-store.ts — the read-session + mutation-token authority for the\n * whole app. Mirrors the two-token model in src/core/web/server.ts exactly:\n *\n * READ authority — exchanged via POST /api/session (raw readToken + a\n * per-tab client proof) for an HttpOnly cookie good\n * for 15 minutes. The raw read token is remembered in\n * MEMORY ONLY (never any storage) for the tab's\n * lifetime so the 15-minute ticket can be renewed\n * silently when a GET/SSE comes back 401 — a live\n * chat must not turn into \"paste a 64-hex token every\n * 15 minutes\". The client proof is not a secret by\n * itself (it has no authority without the signed\n * cookie) and is kept in sessionStorage so a page\n * reload can keep using the still-valid cookie instead\n * of forcing re-entry.\n *\n * MUTATION authority — the raw x-ashlr-token header, required on every\n * mutating call, NEVER exchanged for a session and\n * NEVER persisted to any storage. Held in memory only,\n * for a bounded \"hold\" window, so approving a run of\n * proposals isn't one window.prompt() per click. The\n * hold is cleared on tab close, explicit lock, or\n * idle timeout.\n *\n * This module has no React dependency — it is a plain external store\n * consumed via useSyncExternalStore in hooks.ts, per the same pattern used\n * for the query cache.\n */\n\nimport { evictAll, invalidateObserved } from './cache.js';\n// The composer owns its own storage format, so the key names live with it\n// rather than being duplicated here where they could drift.\nimport { clearComposerMemory } from '../routes/verse/chat/composer-memory.js';\nimport { isRemoteMobileMode } from './remote-mode.js';\n\nconst READ_CLIENT_STORAGE_KEY = 'ashlr.readClientProof.v1';\nconst READ_CLIENT_RE = /^[a-f0-9]{64}$/;\nconst MUTATION_HOLD_MS = 20 * 60 * 1000; // 20 minutes of inactivity clears the hold.\n\nexport type AuthPhase = 'checking' | 'unauthenticated' | 'authenticated';\n\ninterface AuthState {\n phase: AuthPhase;\n /** True once a session check has actually completed (vs. still booting). */\n checked: boolean;\n mutationTokenHeldUntil: number | null;\n}\n\nfunction randomHex64(): string {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\nfunction loadOrCreateClientProof(): string {\n if (isRemoteMobileMode()) return '';\n try {\n const existing = sessionStorage.getItem(READ_CLIENT_STORAGE_KEY);\n if (existing && READ_CLIENT_RE.test(existing)) return existing;\n } catch {\n // sessionStorage unavailable (privacy mode, etc.) — fall through to an\n // in-memory-only proof for this page life.\n }\n const proof = randomHex64();\n try {\n sessionStorage.setItem(READ_CLIENT_STORAGE_KEY, proof);\n } catch {\n /* best-effort persistence only */\n }\n return proof;\n}\n\nlet clientProof = loadOrCreateClientProof();\n\n/** In-memory only. Never touches storage. Cleared by clearMutationToken(). */\nlet mutationToken: string | null = null;\nlet mutationHoldTimer: ReturnType<typeof setTimeout> | null = null;\n/**\n * The mutation token came from the desktop host (window.__ASHLR_TOKENS__).\n * The operator never saw it, so an idle timeout must re-arm the hold rather\n * than clear it — a cleared hold would ask for a token nobody can paste.\n */\nlet mutationHeldByHost = false;\n/** A paired remote session may act only when the gateway advertises writes. */\nlet remoteActGranted = false;\n\n/**\n * Last read token that the server accepted (typed or host-injected). Memory\n * only, same trust boundary as the mutation hold; used to renew the cookie\n * silently on 401. Dropped on explicit disconnect or when renewal fails.\n */\nlet rememberedReadToken: string | null = null;\nlet renewal: Promise<boolean> | null = null;\n/** Desktop-injected tokens kept for re-adoption (see the host-injected section below). */\nlet hostTokens: InjectedTokens | null = null;\n\nlet state: AuthState = { phase: 'checking', checked: false, mutationTokenHeldUntil: null };\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of listeners) l();\n}\n\nfunction setState(patch: Partial<AuthState>): void {\n state = { ...state, ...patch };\n emit();\n}\n\nexport function subscribeAuth(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function getAuthSnapshot(): AuthState {\n return state;\n}\n\nexport function getReadClientProof(): string {\n if (isRemoteMobileMode()) throw new Error('Local read-client proof is unavailable on the phone gateway.');\n return clientProof;\n}\n\n/** Regenerate the client proof (e.g. after an explicit \"forget this device\"). */\nexport function resetReadClientProof(): string {\n clientProof = randomHex64();\n try {\n sessionStorage.setItem(READ_CLIENT_STORAGE_KEY, clientProof);\n } catch {\n /* best-effort */\n }\n return clientProof;\n}\n\n/**\n * Exchange a raw read token for a session cookie. Throws on failure with a\n * message safe to show the operator. The raw token never leaves this call.\n */\nexport async function establishReadSession(rawReadToken: string): Promise<void> {\n if (isRemoteMobileMode()) throw new Error('Hub read tokens are unavailable on the phone gateway.');\n const trimmed = rawReadToken.trim();\n if (!/^[a-f0-9]{64}$/.test(trimmed)) {\n throw new Error('That does not look like a read token — expected 64 hex characters.');\n }\n const res = await fetch('/api/session', {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'x-ashlr-token': trimmed,\n 'x-ashlr-read-client': clientProof,\n },\n });\n if (res.status === 204) {\n rememberedReadToken = trimmed;\n setState({ phase: 'authenticated', checked: true });\n return;\n }\n if (res.status === 401) {\n throw new Error('Server rejected that token. Double-check the read token printed by this server at startup.');\n }\n throw new Error(`Unexpected response establishing session (HTTP ${res.status}).`);\n}\n\nexport async function clearReadSession(): Promise<void> {\n if (isRemoteMobileMode()) {\n try { await (await import('./remote-session.js')).logoutRemoteDevice(); }\n finally { expireNow(); }\n return;\n }\n try {\n await fetch('/api/session', {\n method: 'DELETE',\n credentials: 'same-origin',\n headers: { 'x-ashlr-read-client': clientProof },\n });\n } catch {\n /* best-effort */\n }\n rememberedReadToken = null;\n hostTokens = null;\n expireNow();\n}\n\nfunction expireNow(): void {\n clearMutationToken();\n evictAll();\n // `evictAll` clears the query cache so nothing stale leaks into the next\n // session's first paint. The composer's drafts and sent-message history live\n // in localStorage, not in that cache, and they are verbatim prompt text —\n // exactly the kind of content this wipe exists for.\n clearComposerMemory();\n setState({ phase: 'unauthenticated', checked: true });\n}\n\n/**\n * Called by data/client.ts whenever any authenticated GET comes back 401\n * (and by sse.ts on `session-expired`). With a remembered read token the\n * cookie is re-issued silently and the phase never flips; the failed call's\n * own retry/reconnect (SSE backoff, the next refetch) then succeeds. Only\n * when renewal fails (server restarted with fresh tokens) does the gate show.\n */\nexport function reportSessionExpired(): void {\n if (state.phase !== 'authenticated') return;\n if (isRemoteMobileMode()) { expireNow(); return; }\n if (rememberedReadToken) {\n void renewReadSession();\n return;\n }\n expireNow();\n}\n\n/** Re-exchange the remembered read token for a fresh cookie; one flight at a time. */\nexport function renewReadSession(): Promise<boolean> {\n if (renewal) return renewal;\n const token = rememberedReadToken;\n if (!token) return Promise.resolve(false);\n renewal = (async () => {\n try {\n await establishReadSession(token);\n // Whatever is on screen and 401ed while the ticket was lapsed refetches\n // against the new cookie. Only what is OBSERVED: an entry nobody reads\n // (a surface the idle warm-up fetched but the operator never opened)\n // re-reads when it next mounts, if it is stale or failed — re-running\n // them all here cost ~8 background reads every 15 minutes, all day.\n invalidateObserved('');\n return true;\n } catch {\n rememberedReadToken = null;\n hostTokens = null;\n expireNow();\n return false;\n } finally {\n renewal = null;\n }\n })();\n return renewal;\n}\n\n/** Test hygiene: forget the remembered read token and host tokens without a network call. */\nexport function forgetRememberedTokens(): void {\n rememberedReadToken = null;\n hostTokens = null;\n renewal = null;\n}\n\nexport function markCheckComplete(authenticated: boolean): void {\n setState({ phase: authenticated ? 'authenticated' : 'unauthenticated', checked: true });\n}\n\n// ---------------------------------------------------------------------------\n// Host-injected tokens (desktop wrapper). The Tauri shell starts the server\n// itself and hands both tokens to the page through an initialization script\n// (`window.__ASHLR_TOKENS__`, see desktop/README.md) so the operator never\n// pastes them. The object is removed from `window` before either token is\n// used and kept in this module's memory instead (`hostTokens`), because the\n// desktop operator has no terminal to paste from: when the 15-minute cookie\n// lapses or the gate re-mounts, adoption re-runs from memory. The read token\n// is exchanged for the cookie exactly like a typed one and the mutation token\n// goes into the memory-only hold. Nothing is persisted and nothing is logged.\n// ---------------------------------------------------------------------------\n\nexport interface InjectedTokens {\n readToken: string;\n /** Mutation token; absent or null when the host started the server without dispatch. */\n token?: string | null;\n}\n\ndeclare global {\n interface Window {\n __ASHLR_TOKENS__?: InjectedTokens;\n }\n}\n\n/**\n * Take host-injected tokens: from `window` (cleared from the page on first\n * sight, remembered here) or, on later calls, from memory.\n */\nexport function takeInjectedTokens(): InjectedTokens | null {\n const injected = window.__ASHLR_TOKENS__;\n if (injected && typeof injected === 'object') {\n try {\n delete window.__ASHLR_TOKENS__;\n } catch {\n window.__ASHLR_TOKENS__ = undefined;\n }\n if (typeof injected.readToken === 'string') {\n hostTokens = { readToken: injected.readToken, ...(typeof injected.token === 'string' ? { token: injected.token } : {}) };\n }\n }\n return hostTokens ? { ...hostTokens } : null;\n}\n\n/**\n * Establish the read session (and set the mutation hold) from host-injected\n * tokens. Resolves true when a session was established; false when nothing\n * was injected or the server rejected the read token (the caller then falls\n * back to the normal SessionGate flow — the failure is never surfaced with\n * the token in it).\n */\nexport async function adoptInjectedTokens(): Promise<boolean> {\n if (isRemoteMobileMode()) return false;\n const injected = takeInjectedTokens();\n if (!injected) return false;\n try {\n await establishReadSession(injected.readToken);\n } catch {\n // Wrong or stale tokens are not worth retrying from memory.\n hostTokens = null;\n return false;\n }\n if (injected.token && /^[a-f0-9]{64}$/.test(injected.token.trim())) setMutationToken(injected.token.trim(), { host: true });\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Mutation token — session-scoped hold, memory-only.\n// ---------------------------------------------------------------------------\n\nexport function getMutationToken(): string | null {\n if (isRemoteMobileMode()) return remoteActGranted ? '*' : null;\n return mutationToken;\n}\n\nexport function hasMutationHold(): boolean {\n if (isRemoteMobileMode()) return remoteActGranted;\n return mutationToken !== null;\n}\n\n/** A capability flag for UI guards, never a substitute for server policy. */\nexport function setRemoteActGranted(value: boolean): void {\n remoteActGranted = value;\n emit();\n}\n\nfunction armIdleClear(): void {\n if (mutationHoldTimer) clearTimeout(mutationHoldTimer);\n mutationHoldTimer = setTimeout(() => {\n // A host-held token has no operator to re-paste it: keep the hold alive.\n if (mutationHeldByHost && mutationToken !== null) touchMutationHold();\n else clearMutationToken();\n }, MUTATION_HOLD_MS);\n}\n\n/**\n * Set the mutation token for this tab's session hold. Never persisted.\n * `host` marks a token injected by the desktop wrapper (see adoptInjectedTokens).\n */\nexport function setMutationToken(token: string, opts: { host?: boolean } = {}): void {\n if (isRemoteMobileMode()) throw new Error('Hub mutation tokens are unavailable on the phone gateway.');\n mutationToken = token;\n mutationHeldByHost = opts.host === true;\n const heldUntil = Date.now() + MUTATION_HOLD_MS;\n setState({ mutationTokenHeldUntil: heldUntil });\n armIdleClear();\n}\n\n/** Extend the hold window on real use (called after every mutating call). */\nexport function touchMutationHold(): void {\n if (mutationToken === null) return;\n const heldUntil = Date.now() + MUTATION_HOLD_MS;\n setState({ mutationTokenHeldUntil: heldUntil });\n armIdleClear();\n}\n\nexport function clearMutationToken(): void {\n remoteActGranted = false;\n mutationToken = null;\n mutationHeldByHost = false;\n if (mutationHoldTimer) {\n clearTimeout(mutationHoldTimer);\n mutationHoldTimer = null;\n }\n setState({ mutationTokenHeldUntil: null });\n}\n","/**\n * data/theme-store.ts — the theme preference, extracted out of Topbar.tsx\n * so the command palette's \"Toggle theme\" action can read/write the same\n * source of truth Topbar's own button uses (same module-level state +\n * subscribe pattern as auth-store.ts — commands.ts's `run` closures have no\n * React context to call useState from, so this can't live in a component).\n */\n\nexport type ThemePreference = 'system' | 'light' | 'dark';\n\nconst THEME_STORAGE_KEY = 'ashlr.theme.v1';\n\nfunction applyTheme(pref: ThemePreference): void {\n const root = document.documentElement;\n if (pref === 'system') root.removeAttribute('data-theme');\n else root.setAttribute('data-theme', pref);\n}\n\nfunction loadTheme(): ThemePreference {\n try {\n const v = localStorage.getItem(THEME_STORAGE_KEY);\n if (v === 'light' || v === 'dark' || v === 'system') return v;\n } catch {\n /* ignore */\n }\n return 'system';\n}\n\nlet theme: ThemePreference = loadTheme();\napplyTheme(theme);\n\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of listeners) l();\n}\n\nexport function subscribeTheme(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function getTheme(): ThemePreference {\n return theme;\n}\n\nexport function setTheme(next: ThemePreference): void {\n theme = next;\n applyTheme(theme);\n try {\n localStorage.setItem(THEME_STORAGE_KEY, theme);\n } catch {\n /* best-effort persistence only */\n }\n emit();\n}\n\nexport function cycleTheme(): void {\n setTheme(theme === 'system' ? 'light' : theme === 'light' ? 'dark' : 'system');\n}\n","/**\n * data/hooks.ts — React bindings over the framework-free stores in\n * cache.ts / auth-store.ts / sse.ts. This is the only file in the data\n * layer that imports React; every module underneath it stays plain\n * TypeScript so it's trivially unit-testable without a DOM.\n */\nimport { useCallback, useEffect, useSyncExternalStore } from 'react';\nimport { ensureQuery, getQuerySnapshot, refetchQuery, subscribeQuery, type QueryEntry } from './cache.js';\nimport type { QueryDef } from './queries.js';\nimport {\n getAuthSnapshot,\n subscribeAuth,\n type AuthPhase,\n hasMutationHold,\n getMutationToken,\n setMutationToken as storeSetMutationToken,\n touchMutationHold,\n clearMutationToken,\n} from './auth-store.js';\nimport type { SseEventName } from './sse.js';\nimport { subscribeTheme, getTheme, setTheme, cycleTheme, type ThemePreference } from './theme-store.js';\n\n/**\n * How long a cached value is accepted on MOUNT without re-reading it.\n *\n * A section that re-mounts inside this window (rail switch, a parent\n * re-keying, React 18's double-invoked effects in StrictMode) issues no\n * request at all. Ten seconds is short enough that any surface a human\n * revisits deliberately still re-reads, and long enough that the Usage\n * section's seven probe-spawning reads happen ONCE per visit rather than\n * once per mount.\n *\n * This does not make data stale: keys with an SSE event still refresh the\n * instant the server says they changed (sse.ts → invalidate, which is not\n * freshness-gated), and `useRefetch` always ignores it.\n */\nexport const DEFAULT_QUERY_FRESH_MS = 10_000;\n\nexport interface UseQueryOptions {\n /** Override `DEFAULT_QUERY_FRESH_MS` for this subscription. 0 = always fetch. */\n freshMs?: number;\n}\n\n/**\n * Subscribe to a resource. Fetches on mount (and on `key` change) unless the\n * cached value is still fresh, stays subscribed to background refreshes\n * triggered by sse.ts, and NEVER clears `data` while refetching —\n * `status === 'refreshing'` is the signal to show a subtle indicator instead\n * of a skeleton, `status === 'loading'` (no data yet at all) is the only\n * state that should render a skeleton.\n */\nexport function useQuery<T>(def: QueryDef<T>, options?: UseQueryOptions): QueryEntry<T> {\n const freshMs = options?.freshMs ?? DEFAULT_QUERY_FRESH_MS;\n const snapshot = useSyncExternalStore(\n useCallback((listener) => subscribeQuery(def.key, listener), [def.key]),\n () => getQuerySnapshot<T>(def.key),\n () => getQuerySnapshot<T>(def.key),\n );\n\n useEffect(() => {\n // Cache refreshers outlive any one component. Binding the stored fetcher\n // to this component's AbortSignal poisons later SSE invalidations after\n // unmount, so the shared cache owns the request lifetime.\n void ensureQuery(def.key, () => def.fetch(), freshMs);\n // Re-fetch only when the resource identity changes, not on every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- def.fetch is re-created per render on purpose; only def.key identifies the resource.\n }, [def.key, freshMs]);\n\n return snapshot;\n}\n\n/**\n * Manually trigger a re-fetch without waiting for SSE — a \"Retry\" button, a\n * \"Refresh\" button, or a poll loop.\n *\n * Ignores freshness always, and joins an in-flight read only while that read\n * is younger than `REFETCH_JOIN_WINDOW_MS`. Both halves matter, because this\n * one hook backs two different callers:\n *\n * - A poll (UniverseView ticks every 3–15s and again on visibilitychange)\n * landing on a read that started milliseconds ago SHOULD coalesce with\n * it; issuing a second request there is pure waste.\n * - A person's click landing on a read that has been running for seconds\n * SHOULD NOT. That was the old behavior: the click joined the running\n * promise and returned data fetched before the click — a silent no-op,\n * and with local-model probes taking seconds under load the window was\n * wide enough to hit in ordinary use.\n *\n * For the strict guarantee — a request issued after the click, every time,\n * no matter what else is running — use `useRefresh`.\n */\nexport function useRefetch<T>(def: QueryDef<T>): () => void {\n return useCallback(() => {\n void refetchQuery(def.key, () => def.fetch());\n }, [def]);\n}\n\n/**\n * The explicit user-initiated refresh: ALWAYS issues a new request, never\n * joins one already running, and the read it issues is the one whose result\n * is kept even if an older read lands after it.\n *\n * Use this behind anything a person presses that promises them a fresh\n * reading — a Refresh button on a surface with no SSE invalidation, where\n * the whole reason the button exists is that nothing else will re-read.\n */\nexport function useRefresh<T>(def: QueryDef<T>): () => void {\n return useCallback(() => {\n void refetchQuery(def.key, () => def.fetch(), true);\n }, [def]);\n}\n\nexport function useAuthPhase(): AuthPhase {\n return useSyncExternalStore(subscribeAuth, () => getAuthSnapshot().phase, () => getAuthSnapshot().phase);\n}\n\nexport interface MutationHold {\n hasHold: boolean;\n token: string | null;\n heldUntil: number | null;\n setToken: (token: string) => void;\n touch: () => void;\n clear: () => void;\n}\n\nexport function useMutationHold(): MutationHold {\n const heldUntil = useSyncExternalStore(\n subscribeAuth,\n () => getAuthSnapshot().mutationTokenHeldUntil,\n () => getAuthSnapshot().mutationTokenHeldUntil,\n );\n return {\n hasHold: hasMutationHold(),\n token: getMutationToken(),\n heldUntil,\n setToken: storeSetMutationToken,\n touch: touchMutationHold,\n clear: clearMutationToken,\n };\n}\n\n/** Subscribe to a raw named SSE event for the lifetime of the component. */\nexport function useSseEvent(name: SseEventName, onEvent: (payload: unknown) => void): void {\n useEffect(() => {\n let active = true;\n let unsubscribe: () => void = () => undefined;\n void import('./sse.js').then(({ onSseEvent }) => {\n if (active) unsubscribe = onSseEvent(name, onEvent);\n }).catch(() => undefined);\n return () => { active = false; unsubscribe(); };\n }, [name, onEvent]);\n}\n\nexport interface ThemeControl {\n theme: ThemePreference;\n set: (next: ThemePreference) => void;\n cycle: () => void;\n}\n\n/** Shared with Topbar's theme button and the command palette's \"Toggle\n * theme\" action — both read/write data/theme-store.ts through this hook so\n * neither can drift out of sync with the other. */\nexport function useTheme(): ThemeControl {\n const theme = useSyncExternalStore(subscribeTheme, getTheme, getTheme);\n return { theme, set: setTheme, cycle: cycleTheme };\n}\n","/**\n * data/client.ts — thin typed HTTP client for the existing /api/* surface.\n * No redefinition of response shapes here — callers type each call with the\n * interfaces re-exported from ./api-types.ts.\n */\nimport { getReadClientProof, reportSessionExpired } from './auth-store.js';\nimport { isRemoteMobileMode } from './remote-mode.js';\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly path: string,\n /**\n * The server's own sentence about the refusal, when it sent one, without\n * the \"POST … failed (HTTP N)\" wrapper. A surface that wants to show the\n * operator why an action was refused should prefer this over `message`:\n * it is the text the route author wrote for a person to read.\n */\n public readonly detail: string | null = null,\n /**\n * The route's machine-readable refusal code (`VERSE_SESSION_NOT_FOUND`,\n * `VERSE_SESSION_BUSY`, …) when the body carried one; null otherwise. Lets a\n * caller branch on WHAT was refused without parsing the sentence.\n */\n public readonly code: string | null = null,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n/**\n * Raised for the 404 a mutation route answers when --allow-dispatch is off.\n *\n * That gate answers a bare `{ error: 'not found' }` — deliberately the same\n * body as a route that does not exist, so a read-only server does not\n * advertise its write surface. A route that DOES exist and refuses with a 404\n * of its own (\"session not found\") says so with a `code`; apiPost keeps those\n * as plain ApiErrors, so a deleted chat is never reported as \"this server is\n * read-only\".\n */\nexport class DispatchDisabledError extends ApiError {\n constructor(path: string) {\n super('This server was started without --allow-dispatch, so mutations are disabled.', 404, path);\n this.name = 'DispatchDisabledError';\n }\n}\n\n/**\n * The plain reason a READ failed, one or two short sentences for a surface to\n * print after its own \"X unavailable.\" Routes that fail a read answer\n * `{ code, error }` with `error` a sentence written for the operator\n * (budget-api.ts, activity-api.ts), which apiGet keeps as `detail`; prefer it\n * over our own \"GET … failed (HTTP N)\" wrapper, which names a URL instead of\n * the cause. Anything that is not an ApiError gets a fixed sentence: a\n * browser's own exception text (\"Failed to fetch\", a JSON parser's\n * \"Unexpected token <\") is not written for a person. Fits ChartFrame's\n * `{ kind: 'unknown', reason }` and a NoticeSlot line alike.\n */\nexport function readFailureReason(err: unknown): string {\n if (err instanceof ApiError) return err.detail ?? `The server answered HTTP ${err.status}.`;\n // fetch() rejects with a TypeError when the request never got an answer.\n if (err instanceof TypeError) return 'The server did not answer.';\n return 'The request failed.';\n}\n\n/** GET an authenticated read route. 401 reports session-expired and throws. */\nexport async function apiGet<T>(path: string, signal?: AbortSignal): Promise<T> {\n if (isRemoteMobileMode()) return (await import('./remote-session.js')).remoteApiGet<T>(path, signal);\n const res = await fetch(path, {\n method: 'GET',\n credentials: 'same-origin',\n headers: { 'x-ashlr-read-client': getReadClientProof() },\n signal,\n });\n if (res.status === 401) {\n reportSessionExpired();\n throw new ApiError('Read session expired.', 401, path);\n }\n if (!res.ok) {\n // Keep the route's own sentence and code (e.g. the grant draft's\n // `no-trust-roots`) so a reader can branch on WHAT was refused.\n const { detail, code } = await readRefusal(res);\n throw new ApiError(`GET ${path} failed (HTTP ${res.status}).`, res.status, path, detail || null, code);\n }\n return (await res.json()) as T;\n}\n\n/**\n * POST a mutating route with the raw mutation token. `mutationToken` must\n * come from the caller (data/mutations.ts pulls it from auth-store) — this\n * function does not read auth-store itself so it stays trivially testable.\n */\nexport async function apiPost<T>(\n path: string,\n body: unknown,\n mutationToken: string,\n signal?: AbortSignal,\n): Promise<T> {\n if (isRemoteMobileMode()) return (await import('./remote-session.js')).remoteMutate<T>('POST', path, body);\n const res = await fetch(path, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n 'x-ashlr-token': mutationToken,\n },\n body: JSON.stringify(body ?? {}),\n signal,\n });\n if (res.status === 401) {\n throw new ApiError('Mutation token was rejected.', 401, path);\n }\n if (!res.ok) {\n const { detail, code } = await readRefusal(res);\n // Only a CODELESS 404 is the dispatch gate (see DispatchDisabledError).\n // An unknown sub-path on an older server is codeless too and lands here\n // as well — the two are indistinguishable by design, so callers that\n // word this error must not assert which one it was.\n if (res.status === 404 && code === null) {\n throw new DispatchDisabledError(path);\n }\n throw new ApiError(\n `POST ${path} failed (HTTP ${res.status})${detail ? `: ${detail}` : ''}.`,\n res.status,\n path,\n detail || null,\n code,\n );\n }\n if (res.status === 204) return undefined as T;\n return (await res.json()) as T;\n}\n\n/**\n * DELETE a mutating route with the raw mutation token — apiPost's twin, with\n * the same refusal reading (a codeless 404 is the dispatch gate). Used where\n * a route retires a thing by id (`DELETE /api/verse/leader/directives/<id>`).\n */\nexport async function apiDelete<T>(path: string, mutationToken: string, signal?: AbortSignal): Promise<T> {\n if (isRemoteMobileMode()) return (await import('./remote-session.js')).remoteMutate<T>('DELETE', path, {});\n const res = await fetch(path, {\n method: 'DELETE',\n credentials: 'same-origin',\n headers: { 'x-ashlr-token': mutationToken },\n signal,\n });\n if (res.status === 401) throw new ApiError('Mutation token was rejected.', 401, path);\n if (!res.ok) {\n const { detail, code } = await readRefusal(res);\n if (res.status === 404 && code === null) throw new DispatchDisabledError(path);\n throw new ApiError(`DELETE ${path} failed (HTTP ${res.status})${detail ? `: ${detail}` : ''}.`, res.status, path, detail || null, code);\n }\n if (res.status === 204) return undefined as T;\n const text = await res.text();\n return (text ? JSON.parse(text) : undefined) as T;\n}\n\n/** A route's own refusal sentence and code, including daemon `note` bodies. */\nasync function readRefusal(res: Response): Promise<{ detail: string; code: string | null }> {\n try {\n const j = (await res.json()) as { error?: unknown; note?: unknown; message?: unknown; code?: unknown };\n const detail = typeof j.error === 'string' && j.error ? j.error\n : typeof j.note === 'string' && j.note ? j.note\n : typeof j.message === 'string' ? j.message : '';\n return { detail, code: typeof j.code === 'string' && j.code ? j.code : null };\n } catch {\n return { detail: '', code: null };\n }\n}\n\n/** Build the SSE URL, carrying the client proof as the query-string proof\n * EventSource can't attach as a header (see server.ts readSessionClientProof). */\nexport function eventsUrl(): string {\n return `/api/events?client=${encodeURIComponent(getReadClientProof())}`;\n}\n"],"file":"global-CYfRwH6t.js"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ConfirmDialog-B_wCnbcC.js","assets/Dialog-DI5D6Is2.js","assets/focus-trap-C2rynI8q.js","assets/Dialog-tQ8kFulD.css","assets/ConfirmDialog-Dx15x0Ho.css","assets/MutationTokenDialog-T3r9EtHi.js","assets/global-1SED_aTT.css","assets/MutationTokenDialog-CrfJ0PdD.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n,t as r}from"./index-_izD07R9.js";import{B as i,I as a,N as o,P as s}from"./VerseShared-CFE5B-IY.js";import{t as c}from"./preloaded-E_jepvvg.js";var l=e(n(),1),u=t(),d=c(()=>r(()=>import(`./ConfirmDialog-B_wCnbcC.js`).then(e=>e.n).then(e=>e.ConfirmDialog),__vite__mapDeps([0,1,2,3,4]))).Slot,f=c(()=>r(()=>import(`./MutationTokenDialog-T3r9EtHi.js`).then(e=>e.n).then(e=>e.MutationTokenDialog),__vite__mapDeps([5,1,2,6,3,7]))).Slot;function p(){let{request:e,phase:t,error:n}=i();return e?(0,u.jsxs)(l.Suspense,{fallback:null,children:[(0,u.jsx)(d,{open:t!==`token`&&!e.skipConfirm,onClose:o,title:e.title,body:e.body,confirmLabel:n?`Try again`:e.confirmLabel,destructive:e.destructive,busy:t===`running`,error:n,onConfirm:()=>s()}),(0,u.jsx)(f,{open:t===`token`,onClose:a,reason:e.tokenReason??`This action changes state on this machine and requires the dispatch token.`,tokenHelp:`the mutation token ashlr verse printed`})]}):null}export{p as GuardHost};
|
|
3
|
+
//# sourceMappingURL=guarded-action-A9ZsIE8S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":";6OAwDM,EAHsB,YACpB,OAAO,8BAA+B,cAAC,KAAM,GAAM,EAAE,aAAa,+BAEpD,EAAoB,KAIpC,EAHoB,YAClB,OAAO,oCAAkD,cAAC,KAAM,GAAM,EAAE,mBAAmB,iCAEvE,EAAkB,KAQ9C,SAAgB,GAAY,CAC1B,GAAM,CAAE,UAAS,QAAO,SAAU,EAAc,EAEhD,OADK,GAEH,UAAC,WAAD,CAAU,SAAU,KAApB,WACE,SAAC,EAAD,CACE,KAAM,IAAU,SAAW,CAAC,EAAQ,YACpC,QAAS,EACT,MAAO,EAAQ,MACf,KAAM,EAAQ,KACd,aAAc,EAAQ,YAAc,EAAQ,aAC5C,YAAa,EAAQ,YACrB,KAAM,IAAU,UACT,QACP,cAAiB,EAAa,CAC/B,IACD,SAAC,EAAD,CACE,KAAM,IAAU,QAChB,QAAS,EACT,OAAQ,EAAQ,aAAe,6EAC/B,UAAU,wCACX,EACO,IApBS,IAsBvB","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/guarded-action.tsx"],"sourcesContent":["/**\n * routes/verse/shell/guarded-action.tsx — confirmation FIRST, then the\n * mutation token, then the action (unit C1; SPEC-310C §1 \"Guarded actions ask\n * for confirmation, then the mutation token\").\n *\n * The palette and the drawer's single-letter keys are the fastest way to do\n * anything in Verse, which is exactly why they must not be a shortcut around\n * the confirm step the regular UI requires. Every guarded path — a catalog\n * command with a `guard`, a Needs-you approve / reject / veto — goes through\n * ONE host, so the order can never differ between two entry points:\n *\n * confirm ──Cancel──▶ nothing happened\n * │ Confirm\n * ├─ token needed and not held ─▶ MutationTokenDialog ──Cancel──▶ nothing\n * │ │ unlocked\n * ▼ ▼\n * running (the confirm dialog shows \"Working…\")\n * ├─ ok ─▶ closed (the caller's own onDone decides the toast)\n * └─ error ─▶ back to confirm, with the sentence; Confirm retries\n *\n * Why confirm before token (the old ApprovalDetail asked for the token\n * first): an operator who presses A by mistake should be able to back out at\n * the FIRST prompt, which should describe what is about to happen — not a\n * prompt asking for a secret.\n */\nimport { Suspense, type ComponentProps } from 'react';\nimport type { MutationTokenDialog as MutationTokenDialogComponent } from '../../../components/auth/MutationTokenDialog.js';\nimport type { ConfirmDialog as ConfirmDialogComponent } from '../../inbox/ConfirmDialog.js';\nimport { cancelGuard, confirmGuard, guardTokenClosed, useGuardState } from './guard-store.js';\nimport { preloadedLazy } from './preloaded.js';\n\nexport {\n cancelGuard,\n confirmGuard,\n describeActionError,\n guardTokenClosed,\n isGuardOpen,\n requestGuarded,\n resetGuard,\n useGuardState,\n type GuardedRequest,\n type GuardPhase,\n type GuardState,\n} from './guard-store.js';\n\n/**\n * The two dialogs are preloaded, not static imports: GuardHost is mounted by\n * the shell at first paint but draws nothing until a guarded action starts,\n * and the dialogs (with the dialog primitive and its focus trap) were ~4 KB\n * of chat first-paint critical JS. Their download starts when this module\n * evaluates, so the first guarded action finds them in and they mount in the\n * same render that opens them.\n */\nconst ConfirmDialogModule = preloadedLazy<ComponentProps<typeof ConfirmDialogComponent>>(\n () => import('../../inbox/ConfirmDialog.js').then((m) => m.ConfirmDialog),\n);\nconst ConfirmDialog = ConfirmDialogModule.Slot;\nconst TokenDialogModule = preloadedLazy<ComponentProps<typeof MutationTokenDialogComponent>>(\n () => import('../../../components/auth/MutationTokenDialog.js').then((m) => m.MutationTokenDialog),\n);\nconst MutationTokenDialog = TokenDialogModule.Slot;\n\n/** Resolves once both dialogs are in (tests await it; the app never needs to). */\nexport function preloadGuardDialogs(): Promise<unknown> {\n return Promise.all([ConfirmDialogModule.ready(), TokenDialogModule.ready()]);\n}\n\n/** Mounted once by the shell. */\nexport function GuardHost() {\n const { request, phase, error } = useGuardState();\n if (!request) return null;\n return (\n <Suspense fallback={null}>\n <ConfirmDialog\n open={phase !== 'token' && !request.skipConfirm}\n onClose={cancelGuard}\n title={request.title}\n body={request.body}\n confirmLabel={error ? 'Try again' : request.confirmLabel}\n destructive={request.destructive}\n busy={phase === 'running'}\n error={error}\n onConfirm={() => confirmGuard()}\n />\n <MutationTokenDialog\n open={phase === 'token'}\n onClose={guardTokenClosed}\n reason={request.tokenReason ?? 'This action changes state on this machine and requires the dispatch token.'}\n tokenHelp=\"the mutation token ashlr verse printed\"\n />\n </Suspense>\n );\n}\n"],"file":"guarded-action-A9ZsIE8S.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{C as e,M as t,a as n,t as r}from"./global-CYfRwH6t.js";import{f as i}from"./VerseConsoleApp-DO84Xscn.js";import{E as a,O as o,i as s}from"./VerseShared-CFE5B-IY.js";function c(t){let n=e();if(!n)throw new r(`Mutation token was rejected.`,401,t);return n}async function l(){await o();let e=a().data?.running??[];if(e.length===0){i(`Nothing is running.`,`neutral`);return}c(`/api/verse/sessions`);let n=await Promise.allSettled(e.map(e=>s(e.sessionId)));t();let r=n.filter(e=>e.status===`rejected`).length;if(o(),r>0)throw Error(`Stopped ${e.length-r} of ${e.length} chats; ${r} did not answer.`);i(e.length===1?`Stopped 1 chat.`:`Stopped ${e.length} chats.`,`success`)}async function u(){let e=c(`/api/verse/authority`),a=null;try{a=await n(`/api/verse/authority`,{action:`stop`},e)}catch(t){if(!(t instanceof r&&t.status===404&&t.code===null))throw t;await n(`/api/verse/daemon`,{action:`stop`},e)}t(),o(),i(d(a),`success`)}function d(e){let t=`Fleet stopped. It stays stopped until you resume it.`,n=e?.result?.stop;if(typeof n!=`object`||!n)return t;let{quiesced:r,liveExecutionLeases:i,mergeRevokeFailures:a}=n,o=[t];if(r===!1){let e=typeof i==`number`&&Number.isFinite(i)&&i>0?i:null;o.push(e===null?`Agents already running are finishing.`:`${e} agent${e===1?` is`:`s are`} still finishing work started before Stop.`)}if(Array.isArray(a)&&a.length>0){let e=a.length;o.push(`${e} armed merge${e===1?``:`s`} could not be revoked; Stop still blocks ${e===1?`it`:`them`}.`)}return o.join(` `)}var f={"chats.stop-all":l,"fleet.stop":u};function p(e){let t=f[e];return t?t():Promise.reject(Error(`No shell runner for ${e}.`))}export{p as runGuardedShellCommand};
|
|
2
|
+
//# sourceMappingURL=guarded-runners-xMakDn92.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guarded-runners-xMakDn92.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/guarded-runners.ts"],"sourcesContent":["/**\n * routes/verse/shell/guarded-runners.ts — what the shell's own guarded\n * commands DO once the operator has confirmed (and unlocked): stop every\n * running chat, stop the fleet.\n *\n * Split from run-command.ts, which still owns the guard itself (confirm →\n * token → run, through guarded-action.tsx). run-command is on the chat\n * first-paint path — the shell's key handler runs through it — while these\n * run only after a confirmation, so run-command loads this module with\n * import() when a run starts. Keep SHELL_GUARDED_COMMAND_IDS in\n * run-command.ts in step with GUARDED_RUNNERS below.\n */\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { ApiError, apiPost } from '../../../data/client.js';\nimport { cancelVerseTurn } from '../verse-queries.js';\nimport { shellNotify } from './run-command.js';\nimport { getActivityState, refreshActivity } from './useActivity.js';\n\nfunction requireToken(path: string): string {\n const token = getMutationToken();\n if (!token) throw new ApiError('Mutation token was rejected.', 401, path);\n return token;\n}\n\n/** Stop every running chat. Stops what activity says is running NOW, one cancel each. */\nasync function stopRunningChats(): Promise<void> {\n await refreshActivity();\n const running = getActivityState().data?.running ?? [];\n if (running.length === 0) {\n shellNotify('Nothing is running.', 'neutral');\n return;\n }\n requireToken('/api/verse/sessions');\n const results = await Promise.allSettled(running.map((r) => cancelVerseTurn(r.sessionId)));\n touchMutationHold();\n const failed = results.filter((r) => r.status === 'rejected').length;\n void refreshActivity();\n if (failed > 0) throw new Error(`Stopped ${running.length - failed} of ${running.length} chats; ${failed} did not answer.`);\n shellNotify(running.length === 1 ? 'Stopped 1 chat.' : `Stopped ${running.length} chats.`, 'success');\n}\n\n/**\n * Stop the fleet: the authority route's `stop` (B-U1) when this build has it;\n * otherwise the daemon's ordinary stop, which engages the kill switch\n * (control-api.ts `POST /api/verse/daemon {action:'stop'}`). Both stop\n * autonomous work only — chats keep running.\n */\nasync function stopFleet(): Promise<void> {\n const token = requireToken('/api/verse/authority');\n let body: unknown = null;\n try {\n body = await apiPost<unknown>('/api/verse/authority', { action: 'stop' }, token);\n } catch (err) {\n // A CODELESS 404 from the authority route = not in this build (or no\n // dispatch, which the daemon route will then report on its own).\n if (!(err instanceof ApiError && err.status === 404 && err.code === null)) throw err;\n await apiPost<unknown>('/api/verse/daemon', { action: 'stop' }, token);\n }\n touchMutationHold();\n void refreshActivity();\n shellNotify(describeFleetStop(body), 'success');\n}\n\n/**\n * The toast after Stop, from B-U1's StopResult (`{ result: { stop } }` on\n * the authority route). Stop arms KILL at once but does not wait for agents\n * admitted before it (waitMs 0), so \"stopped\" alone would claim more than the\n * server knows (B-U6 request 8): the drain state and any armed merge it could\n * not revoke are said out loud. The daemon fallback has no such fields and\n * gets the plain sentence.\n */\nexport function describeFleetStop(body: unknown): string {\n const base = 'Fleet stopped. It stays stopped until you resume it.';\n const stop = (body as { result?: { stop?: unknown } } | null)?.result?.stop;\n if (typeof stop !== 'object' || stop === null) return base;\n const { quiesced, liveExecutionLeases, mergeRevokeFailures } = stop as {\n quiesced?: unknown;\n liveExecutionLeases?: unknown;\n mergeRevokeFailures?: unknown;\n };\n const parts = [base];\n if (quiesced === false) {\n const n = typeof liveExecutionLeases === 'number' && Number.isFinite(liveExecutionLeases) && liveExecutionLeases > 0 ? liveExecutionLeases : null;\n // Unknown counts as still running (the server fails closed the same way).\n parts.push(n === null ? 'Agents already running are finishing.' : `${n} agent${n === 1 ? ' is' : 's are'} still finishing work started before Stop.`);\n }\n if (Array.isArray(mergeRevokeFailures) && mergeRevokeFailures.length > 0) {\n const m = mergeRevokeFailures.length;\n parts.push(`${m} armed merge${m === 1 ? '' : 's'} could not be revoked; Stop still blocks ${m === 1 ? 'it' : 'them'}.`);\n }\n return parts.join(' ');\n}\n\nexport const GUARDED_RUNNERS: Readonly<Record<string, () => Promise<void>>> = {\n 'chats.stop-all': stopRunningChats,\n 'fleet.stop': stopFleet,\n};\n\n/** Run the shell's runner for a confirmed guarded command. */\nexport function runGuardedShellCommand(id: string): Promise<void> {\n const runner = GUARDED_RUNNERS[id];\n if (!runner) return Promise.reject(new Error(`No shell runner for ${id}.`));\n return runner();\n}\n"],"mappings":"4KAkBA,SAAS,EAAa,EAAsB,CAC1C,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EAAS,+BAAgC,IAAK,CAAI,EACxE,OAAO,CACT,CAGA,eAAe,GAAkC,CAC/C,MAAM,EAAgB,EACtB,IAAM,EAAU,EAAiB,CAAC,CAAC,MAAM,SAAW,CAAC,EACrD,GAAI,EAAQ,SAAW,EAAG,CACxB,EAAY,sBAAuB,SAAS,EAC5C,MACF,CACA,EAAa,qBAAqB,EAClC,IAAM,EAAU,MAAM,QAAQ,WAAW,EAAQ,IAAK,GAAM,EAAgB,EAAE,SAAS,CAAC,CAAC,EACzF,EAAkB,EAClB,IAAM,EAAS,EAAQ,OAAQ,GAAM,EAAE,SAAW,UAAU,CAAC,CAAC,OAE9D,GADA,EAAqB,EACjB,EAAS,EAAG,MAAU,MAAM,WAAW,EAAQ,OAAS,EAAO,MAAM,EAAQ,OAAO,UAAU,EAAO,iBAAiB,EAC1H,EAAY,EAAQ,SAAW,EAAI,kBAAoB,WAAW,EAAQ,OAAO,SAAU,SAAS,CACtG,CAQA,eAAe,GAA2B,CACxC,IAAM,EAAQ,EAAa,sBAAsB,EAC7C,EAAgB,KACpB,GAAI,CACF,EAAO,MAAM,EAAiB,uBAAwB,CAAE,OAAQ,MAAO,EAAG,CAAK,CACjF,OAAS,EAAK,CAGZ,GAAI,EAAE,aAAe,GAAY,EAAI,SAAW,KAAO,EAAI,OAAS,MAAO,MAAM,EACjF,MAAM,EAAiB,oBAAqB,CAAE,OAAQ,MAAO,EAAG,CAAK,CACvE,CACA,EAAkB,EAClB,EAAqB,EACrB,EAAY,EAAkB,CAAI,EAAG,SAAS,CAChD,CAUA,SAAgB,EAAkB,EAAuB,CACvD,IAAM,EAAO,uDACP,EAAQ,GAAiD,QAAQ,KACvE,GAAI,OAAO,GAAS,WAAY,EAAe,OAAO,EACtD,GAAM,CAAE,WAAU,sBAAqB,uBAAwB,EAKzD,EAAQ,CAAC,CAAI,EACnB,GAAI,IAAa,GAAO,CACtB,IAAM,EAAI,OAAO,GAAwB,UAAY,OAAO,SAAS,CAAmB,GAAK,EAAsB,EAAI,EAAsB,KAE7I,EAAM,KAAK,IAAM,KAAO,wCAA0C,GAAG,EAAE,QAAQ,IAAM,EAAI,MAAQ,QAAQ,2CAA2C,CACtJ,CACA,GAAI,MAAM,QAAQ,CAAmB,GAAK,EAAoB,OAAS,EAAG,CACxE,IAAM,EAAI,EAAoB,OAC9B,EAAM,KAAK,GAAG,EAAE,cAAc,IAAM,EAAI,GAAK,IAAI,2CAA2C,IAAM,EAAI,KAAO,OAAO,EAAE,CACxH,CACA,OAAO,EAAM,KAAK,GAAG,CACvB,CAEA,IAAa,EAAiE,CAC5E,iBAAkB,EAClB,aAAc,CAChB,EAGA,SAAgB,EAAuB,EAA2B,CAChE,IAAM,EAAS,EAAgB,GAE/B,OADK,EACE,EAAO,EADM,QAAQ,OAAW,MAAM,uBAAuB,EAAG,EAAE,CAAC,CAE5E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{B as e,R as t,V as n}from"./verse-model-DAOz9LrY.js";function r(e){let t=e.resetsAt??e.resetDescription??null;return t?`${e.text.replace(/\.\s*$/,``)} (resets ${t}).`:e.text}function i(e){return e.map(r)}function a(e){return e.length<=4?e.join(`, `):`${e.slice(0,3).join(`, `)} and ${e.length-3} more`}var o=9e5;function s(e,t,n){let r=n??c(e),i=e.engine===`local`,a=t===void 0?e.capacity??null:t,o=!i&&a&&(a.usability===`ready`||a.usability===`tight`||a.usability===`exhausted`)?a:null,s=o===null?[]:o.windows.map(e=>({id:e.id,usedPercent:typeof e.usedPercent==`number`&&Number.isFinite(e.usedPercent)?Math.max(0,Math.min(100,e.usedPercent)):null,resetsAt:e.resetsAt,resetDescription:e.resetDescription,limitReached:e.limitReached===!0})),u=!i&&a?.usability===`signed-out`;return{seatId:e.id,engine:e.engine,label:e.label,free:i,windows:s,signedOut:u,reachable:i?!0:!u&&null,contextWindow:typeof e.contextWindow==`number`&&e.contextWindow>0?e.contextWindow:null,observedAt:o===null?null:o.observedAt??e.health.observedAt??null,spentTodayUsd:null,...l(e,r)}}function c(e){return(e.models.find(e=>!e.unavailableReason)??e.models[0])?.id??null}function l(r,i){let a={tier:n(r.engine,i),costBasis:r.costBasis??t(r.engine,{modelId:i})};return e(r.engine)&&(a.windowless=!0),a}function u(e,t){if(!e.resetsAt)return null;let n=Date.parse(e.resetsAt);return Number.isFinite(n)?n-t:null}function d(e,t,n){let r=t.id;if(e===`claude`){if(r===`five_hour`)return`session`;if(r===`seven_day`)return`weekly`;if(r.startsWith(`seven_day_`))return`model`}if(e===`grok`)return`weekly`;let i=u(t,n);if(e===`codex`){if(r.endsWith(`_secondary`))return`weekly`;if(r.endsWith(`_primary`))return i!==null&&i>189e5?`weekly`:`session`}return i!==null&&i<=189e5?`session`:`weekly`}function f(e,t,n){if(n===`session`)return`5-hour window`;if(n===`model`){let e=t.id.startsWith(`seven_day_`)?t.id.slice(10):t.id;return`${e.charAt(0).toUpperCase()}${e.slice(1)}-only weekly window`}return e===`grok`||t.id.endsWith(`_monthly`)?t.id.endsWith(`_monthly`)?`monthly billing window`:t.id.endsWith(`_weekly`)?`weekly window`:`billing-period window`:`weekly window`}function p(e){return e.resetsAt?{resetsAt:e.resetsAt,resetDescription:null}:{resetsAt:null,resetDescription:e.resetDescription??null}}function m(e){return e.limitReached||e.usedPercent!==null&&e.usedPercent>=100}function h(e){return`${Math.round(e)}%`}function g(e){let t=Math.round(e/6e4);if(t<120)return`${t} min`;let n=Math.round(t/60);return n<48?`${n} h`:`${Math.round(n/24)} days`}function _(e){let t=null;for(let n of e)n.window.usedPercent!==null&&(t===null||n.window.usedPercent>t.window.usedPercent)&&(t=n);return t}function v(e){let t=[];for(let n of e){let e=n.window.resetsAt;if(!e||!Number.isFinite(Date.parse(e)))return null;t.push(e)}return t.sort((e,t)=>Date.parse(t)-Date.parse(e)),t[0]??null}function y(e,t,n){let{nowMs:r}=n,a=n.readingMaxAgeMs??9e5,o=[];if(e.free){let n=e.reachable!==!1;t.enabled||o.push({kind:`switched-off`,text:`Autonomy is switched off for this seat.`}),n||o.push({kind:`unreachable`,text:`The local model runtime is not reachable.`});let r=t.enabled&&n;return r&&o.push({kind:`headroom`,text:`Local model — free, with no usage window to protect.`}),{headroom:{seatId:e.seatId,sessionUsedPercent:null,weeklyUsedPercent:null,bindingWindow:null,autonomyHeadroomPercent:n?100:null,resetAt:null,eligibleForAutonomy:r,reasons:i(o)},reopensAt:null,exhausted:!1,unknownUsage:!1,spentReasons:[],details:o,spentDetails:[]}}let s=e.windows.map(t=>({window:t,cls:d(e.engine,t,r)})),c=s.filter(e=>e.cls!==`model`),l=c.filter(e=>e.cls===`session`),u=c.filter(e=>e.cls===`weekly`),y=_(l),b=_(u),x=y?.window.usedPercent??null,S=b?.window.usedPercent??null,C=e.observedAt?Date.parse(e.observedAt):NaN,w=Number.isFinite(C)?r-C:null,T=w===null||w>a,E=x!==null||S!==null,D=c.find(e=>e.window.usedPercent===null&&!e.window.limitReached),O=100-t.reservePercent,k=t.maxSessionWindowPercent??100,A=u.length===0&&O<k,j=A?O:k,M=null,N=null;S!==null&&(M=O-S),x!==null&&(N=j-x);let P=null,F=null;M!==null&&(N===null||M<=N)?(P=`weekly`,F=M):N!==null&&(P=`session`,F=N);let I=P===`weekly`?b:P===`session`?y:null,L=null,R=c.filter(e=>m(e.window)),z=R.length>0,B=!E||T||D!==void 0;t.enabled||o.push({kind:`switched-off`,text:`Autonomy is switched off for this seat.`}),e.signedOut&&o.push({kind:`signed-out`,text:`Signed out — reconnect this account before anything can run on it.`});let V=[];if(z){for(let t of R){let n=t.window.limitReached?`limit reached`:`${h(t.window.usedPercent)} used`;V.push({kind:`spent`,text:`The ${f(e.engine,t.window,t.cls)} is spent — ${n}.`,...p(t.window)})}o.push(...V),L=v(R)}E?T?o.push({kind:`unknown-usage`,text:w===null?`The usage reading has no timestamp — too uncertain to spend against.`:`The usage reading is ${g(w)} old — too stale to spend against (limit ${g(a)}).`}):D&&o.push({kind:`unknown-usage`,text:`The ${f(e.engine,D.window,D.cls)} carried no percentage — unknown usage is not headroom.`}):o.push({kind:`unknown-usage`,text:c.length===0?`No usage reading for this seat — unknown usage is not headroom, so autonomy stays off it.`:`Its usage windows carried no percentage — unknown usage is not headroom, so autonomy stays off it.`});let H=t.dailyUsdCap,U=!1;if(H!==void 0&&(e.spentTodayUsd===null?(U=!0,o.push({kind:`spend-cap`,text:`A $${H.toFixed(2)} daily cap is set but today's spend on this seat is unknown.`})):e.spentTodayUsd>=H&&(U=!0,o.push({kind:`spend-cap`,text:`Spent $${e.spentTodayUsd.toFixed(2)} of its $${H.toFixed(2)} daily cap.`}))),!z&&!B&&F!==null&&F<=0&&I){let n=f(e.engine,I.window,I.cls),r=h(I.window.usedPercent);P===`session`&&!A?o.push({kind:`session-ceiling`,text:`The ${n} is ${r} used; autonomy stops at ${h(j)} to protect your live session.`,...p(I.window)}):o.push({kind:`reserve`,text:`The ${n} is ${r} used; ${h(t.reservePercent)} is kept for you, so autonomy stops at ${h(O)}.`,...p(I.window)}),L=I.window.resetsAt}for(let t of s)t.cls===`model`&&m(t.window)&&o.push({kind:`model-window`,text:`The ${f(e.engine,t.window,t.cls)} is spent — it limits that model only, not the account.`});let W=t.enabled&&!e.signedOut&&!z&&!B&&!U&&F!==null&&F>0;if(W&&I){let n=f(e.engine,I.window,I.cls),r=P===`weekly`||A?t.reservePercent>0?` (${h(t.reservePercent)} kept for you)`:``:j<100?` (autonomy stops at ${h(j)} to protect your live session)`:``;o.unshift({kind:`headroom`,text:`${h(F)} of the ${n} is left for autonomy${r}.`})}return{headroom:{seatId:e.seatId,sessionUsedPercent:x,weeklyUsedPercent:S,bindingWindow:P,autonomyHeadroomPercent:F===null?null:Math.max(0,Math.round(F)),resetAt:I?.window.resetsAt??null,eligibleForAutonomy:W,reasons:i(o)},reopensAt:!t.enabled||e.signedOut||B||U?null:L,exhausted:z,unknownUsage:B,spentReasons:i(V),details:o,spentDetails:V}}export{a,d as i,y as n,i as o,s as r,o as t};
|
|
2
|
+
//# sourceMappingURL=headroom-C4dyfw7P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headroom-C4dyfw7P.js","names":[],"sources":["../../../../../../src/core/routing/seat-reasons.ts","../../../../../../src/core/routing/headroom.ts"],"sourcesContent":["/**\n * Seat reasons as data (3.10.1) — the one place a `SeatReason` becomes the\n * sentence the CLI, the logs and pre-3.10.1 readers print.\n *\n * Why this exists: 3.10.0 built each reason as ONE string with its reset\n * baked in (\"… is spent — limit reached (resets 2026-09-26T03:46:56.000Z).\")\n * and readers joined those strings with \"; \". The Fleet surface then showed\n * \".;\" joins, raw UTC instants and nested parentheses, and could not say when\n * a seat would be eligible again without parsing prose. Producers now build\n * `{ kind, text, resetsAt | resetDescription }` and derive the legacy\n * sentence here, byte-for-byte what 3.10.0 wrote, so nothing that prints\n * `reasons` changes.\n *\n * BROWSER-SAFE and PURE: type-only imports.\n */\nimport type { SeatReason } from './types.js';\n\n/**\n * The legacy sentence for one reason: its text with the reset clause put back\n * before the final period — \"(resets <ISO>)\" for a machine instant,\n * \"(resets <provider words>)\" for Claude's prose.\n */\nexport function reasonSentence(reason: SeatReason): string {\n const reset = reason.resetsAt ?? reason.resetDescription ?? null;\n if (!reset) return reason.text;\n const body = reason.text.replace(/\\.\\s*$/, '');\n return `${body} (resets ${reset}).`;\n}\n\n/** Sentences for a reason list (`SeatExclusion.reasons` from `details`). */\nexport function reasonSentences(reasons: readonly SeatReason[]): string[] {\n return reasons.map(reasonSentence);\n}\n\n/**\n * Seat ids for a one-line log sentence: all of them up to four, else the first\n * three and \"and N more\" — never a bare \"…\".\n */\nexport function listSeatIds(ids: readonly string[]): string {\n if (ids.length <= 4) return ids.join(', ');\n return `${ids.slice(0, 3).join(', ')} and ${ids.length - 3} more`;\n}\n\n/**\n * Bound and clean `details` for a persisted record (runtime journal, shadow\n * decision log). `clean` is the caller's secret scrubber; kept a parameter so\n * this module stays browser-safe.\n */\nexport function boundSeatReasons(\n details: readonly SeatReason[] | undefined,\n clean: (text: string) => string,\n max = 6,\n): SeatReason[] | undefined {\n if (!Array.isArray(details)) return undefined;\n return details.slice(0, max).map((r) => {\n const out: SeatReason = { kind: r.kind, text: clean(String(r.text)).slice(0, 300) };\n // Absent stays absent (a compact journal line); present-but-null keeps its null.\n if (typeof r.resetsAt === 'string' && Number.isFinite(Date.parse(r.resetsAt))) out.resetsAt = r.resetsAt;\n else if (r.resetsAt !== undefined) out.resetsAt = null;\n if (typeof r.resetDescription === 'string') out.resetDescription = clean(r.resetDescription).slice(0, 160);\n else if (r.resetDescription !== undefined) out.resetDescription = null;\n return out;\n });\n}\n","/**\n * Live headroom per seat — how much of each seat autonomy may still use under\n * its budget policy (V3.10 unit A9).\n *\n * INPUT is a `SeatCapacity`: the public Verse seat projection (the same\n * windows `GET /api/verse/accounts` serves — Claude `five_hour`/`seven_day`,\n * Codex `codex_<bucket>_{primary,secondary}`, Grok's billing period) reduced to\n * what budgeting needs. OUTPUT is the contract's `SeatHeadroom`, plus the\n * reopening time the router needs for `SeatExclusion.nextEligibleAt`.\n *\n * HONESTY RULES (docs/VERSE-TELEMETRY-V2.md, and Mason's decision):\n * - Unknown usage is NOT headroom. A paid seat with no reading, a reported\n * account window with a null percent, or a reading older than\n * `readingMaxAgeMs` is ineligible for autonomy. This is the fix for the old\n * Claude fail-open, where \"no signal\" was treated as \"go ahead\".\n * - A spent PER-MODEL window is not a spent account. Claude's\n * `seven_day_fable` can read 100% while `five_hour` reads 15%; only the\n * account-wide windows bind (seats.ts `seatUsability` has the same rule).\n * - Claude publishes no machine-readable reset. Its reset is quoted in the\n * provider's own words and never turned into a timestamp or a countdown.\n * - Codex credits are paid overage. Autonomy never spends them, so a spent\n * Codex window blocks autonomy even when a balance exists.\n *\n * WINDOW SEMANTICS\n * - `reservePercent` keeps that share of the LONG (weekly / billing-period)\n * window for Mason: autonomy stops at `100 − reserve` used. A seat that\n * reports only a short window applies the reserve to that one.\n * - `maxSessionWindowPercent` is the ceiling on the SHORT (5-hour) window, so\n * a live interactive session is never starved (\"never touch Claude while\n * its 5-hour window is above 70%\").\n * - The binding window is whichever of the two leaves autonomy LESS room.\n *\n * BROWSER-SAFE and PURE: type-only imports, no clock reads (callers pass\n * `nowMs`), no I/O.\n */\nimport type { VerseSeat, VerseSeatCapacity } from '../verse/types.js';\nimport type { BudgetEngine } from './policy.js';\nimport { costBasisOf, isWindowlessEngine, seatTier, type CostBasis, type ResourceTier } from './tiers.js';\nimport { reasonSentences } from './seat-reasons.js';\nimport type { SeatBudgetPolicy, SeatHeadroom, SeatReason } from './types.js';\n\n/** A reading older than this is too stale to spend against (the collector polls every 30 s when active). */\nexport const HEADROOM_READING_MAX_AGE_MS = 15 * 60_000;\n\n/**\n * A window whose reset is further away than this cannot be a 5-hour window,\n * whatever its id says. Codex's `primary` bucket is USUALLY the 5-hour window,\n * but on 2026-09-24 both accounts reported a `primary` resetting ~42 h out —\n * so the reset distance, when known, overrides the id.\n */\nexport const SESSION_WINDOW_MAX_MS = 5 * 60 * 60_000 + 15 * 60_000;\n\nexport type SeatWindowClass = 'session' | 'weekly' | 'model';\n\nexport interface CapacityWindow {\n id: string;\n /** Provider percent; null = NO SIGNAL (not zero). */\n usedPercent: number | null;\n /** Machine reset; always null for Claude. */\n resetsAt: string | null;\n /** The provider's own reset wording (Claude), verbatim. */\n resetDescription: string | null;\n /** Provider explicitly flagged the limit (a denial, not a measurement). */\n limitReached: boolean;\n}\n\n/** What the budget layer needs to know about one seat. JSON-safe; persisted in the capacity snapshot. */\nexport interface SeatCapacity {\n seatId: string;\n /**\n * The seat's engine. A `devin` seat only ever reaches the router from an\n * INTERACTIVE caller (the Auto seat, handoff alternatives): the capacity\n * snapshot the fleet reads refuses a Devin row (budget-store.ts), and the\n * router refuses one for autonomous work.\n */\n engine: BudgetEngine;\n label: string;\n /** True for local runtime seats: $0 and no provider window. */\n free: boolean;\n windows: CapacityWindow[];\n /** The account reports no usable login. */\n signedOut: boolean;\n /** Can a turn reach this seat at all? Null when unknown. */\n reachable: boolean | null;\n /** Default model's context window in tokens; null when unknown. */\n contextWindow: number | null;\n /** When the windows were read; null when never. */\n observedAt: string | null;\n /** Today's metered spend in USD; null when unknown or not metered. */\n spentTodayUsd: number | null;\n /**\n * 3.15 ADDITIVE (routing/tiers.ts). The seat's tier FOR THE MODEL it would\n * run — the same Devin CLI seat is elite on its default model and fast on\n * SWE. Absent = the engine's own tier (older snapshots, hand-built lists).\n */\n tier?: ResourceTier;\n /** 3.15 ADDITIVE. What one more turn costs; absent = the engine's default basis. */\n costBasis?: CostBasis;\n /**\n * 3.15 ADDITIVE. The provider exposes NO usage window by design (Devin\n * meters in ACUs / plan usage, not windows). Interactive ranking then scores\n * its headroom as neutral instead of the worst — \"no window\" is not \"no\n * room\". Autonomy never reads this: unknown usage is still not headroom.\n */\n windowless?: boolean;\n}\n\n/** `SeatHeadroom` plus the facts the router needs but the wire shape does not carry. */\nexport interface SeatAssessment {\n headroom: SeatHeadroom;\n /** When the blocking condition is expected to lift; null when unknown / never / not blocked. */\n reopensAt: string | null;\n /** True when usage is known to be spent (limit flagged or ≥ 100%) on an account window. */\n exhausted: boolean;\n /** True when usage evidence is missing, partial or stale. */\n unknownUsage: boolean;\n /** The sentences naming each spent account window (a subset of `headroom.reasons`). */\n spentReasons: string[];\n /** `headroom.reasons` as data (same order): each sentence without its reset clause, plus the reset. */\n details: SeatReason[];\n /** `spentReasons` as data. */\n spentDetails: SeatReason[];\n}\n\nexport interface AssessOptions {\n nowMs: number;\n readingMaxAgeMs?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Projection from the public seat shape\n// ---------------------------------------------------------------------------\n\n/**\n * Reduce a public `VerseSeat` to a `SeatCapacity`. `liveCapacity`, when given,\n * replaces the seat's own (possibly cached) capacity — the caller re-reads\n * telemetry per request exactly as verse-api's `liveSeats` does.\n */\nexport function capacityFromSeat(seat: VerseSeat, liveCapacity?: VerseSeatCapacity | null, modelId?: string | null): SeatCapacity {\n // Tier and cost basis follow the model the turn would run (default: the\n // seat's first runnable one) — see routing/tiers.ts.\n const model = modelId ?? defaultModelId(seat);\n const free = seat.engine === 'local';\n const capacity = liveCapacity === undefined ? seat.capacity ?? null : liveCapacity;\n // A failed account check may retain a verified window for display until its\n // original expiry. Autonomy cannot spend against that prior reading.\n const current = !free && capacity &&\n (capacity.usability === 'ready' || capacity.usability === 'tight' || capacity.usability === 'exhausted')\n ? capacity : null;\n const windows: CapacityWindow[] = current === null ? [] : current.windows.map((w) => ({\n id: w.id,\n usedPercent: typeof w.usedPercent === 'number' && Number.isFinite(w.usedPercent)\n ? Math.max(0, Math.min(100, w.usedPercent))\n : null,\n resetsAt: w.resetsAt,\n resetDescription: w.resetDescription,\n limitReached: w.limitReached === true,\n }));\n const signedOut = !free && capacity?.usability === 'signed-out';\n return {\n seatId: seat.id,\n // 3.15: a Devin CHAT seat (verse/devin-seats.ts) projects like any\n // other for Mason's own routing; the fleet's capacity snapshot refuses\n // it (budget-store.ts) and the router refuses it for autonomous work.\n engine: seat.engine,\n label: seat.label,\n free,\n windows,\n signedOut,\n // A local seat is only listed when the runtime answered discovery. A\n // native seat is reachable unless signed out; \"no reading\" is a usage\n // question, not a reachability one.\n reachable: free ? true : signedOut ? false : null,\n contextWindow: typeof seat.contextWindow === 'number' && seat.contextWindow > 0 ? seat.contextWindow : null,\n observedAt: current === null ? null : current.observedAt ?? seat.health.observedAt ?? null,\n spentTodayUsd: null,\n ...tierFields(seat, model),\n };\n}\n\n/** The first runnable model's id (the one a new chat would use), else the first listed. */\nfunction defaultModelId(seat: VerseSeat): string | null {\n const runnable = seat.models.find((m) => !(m as { unavailableReason?: unknown }).unavailableReason) ?? seat.models[0];\n return runnable?.id ?? null;\n}\n\nfunction tierFields(seat: VerseSeat, model: string | null): Pick<SeatCapacity, 'tier' | 'costBasis' | 'windowless'> {\n const out: Pick<SeatCapacity, 'tier' | 'costBasis' | 'windowless'> = {\n tier: seatTier(seat.engine, model),\n costBasis: seat.costBasis ?? costBasisOf(seat.engine, { modelId: model }),\n };\n if (isWindowlessEngine(seat.engine)) out.windowless = true;\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Window classification\n// ---------------------------------------------------------------------------\n\nfunction resetDistanceMs(window: CapacityWindow, nowMs: number): number | null {\n if (!window.resetsAt) return null;\n const at = Date.parse(window.resetsAt);\n return Number.isFinite(at) ? at - nowMs : null;\n}\n\n/** Which role a window plays for budgeting. Per-model windows never bind. */\nexport function classifyWindow(engine: BudgetEngine, window: CapacityWindow, nowMs: number): SeatWindowClass {\n const id = window.id;\n if (engine === 'claude') {\n if (id === 'five_hour') return 'session';\n if (id === 'seven_day') return 'weekly';\n if (id.startsWith('seven_day_')) return 'model';\n }\n if (engine === 'grok') return 'weekly';\n const distance = resetDistanceMs(window, nowMs);\n if (engine === 'codex') {\n if (id.endsWith('_secondary')) return 'weekly';\n if (id.endsWith('_primary')) return distance !== null && distance > SESSION_WINDOW_MAX_MS ? 'weekly' : 'session';\n }\n // Unknown id: only a reset we can SEE inside five hours makes it short.\n return distance !== null && distance <= SESSION_WINDOW_MAX_MS ? 'session' : 'weekly';\n}\n\n/** Human name for a window, for reasons. */\nexport function windowName(engine: BudgetEngine, window: CapacityWindow, cls: SeatWindowClass): string {\n if (cls === 'session') return '5-hour window';\n if (cls === 'model') {\n const model = window.id.startsWith('seven_day_') ? window.id.slice('seven_day_'.length) : window.id;\n return `${model.charAt(0).toUpperCase()}${model.slice(1)}-only weekly window`;\n }\n if (engine === 'grok' || window.id.endsWith('_monthly')) {\n return window.id.endsWith('_monthly') ? 'monthly billing window' : window.id.endsWith('_weekly') ? 'weekly window' : 'billing-period window';\n }\n return 'weekly window';\n}\n\n/**\n * A window's reset as data: the machine instant when there is one, else\n * Claude's own words, verbatim — never a synthesized time. `reasonSentence`\n * turns it back into the \" (resets …)\" clause the string form has always had.\n */\nfunction resetOf(window: CapacityWindow): Pick<SeatReason, 'resetsAt' | 'resetDescription'> {\n if (window.resetsAt) return { resetsAt: window.resetsAt, resetDescription: null };\n return { resetsAt: null, resetDescription: window.resetDescription ?? null };\n}\n\nfunction isSpent(window: CapacityWindow): boolean {\n return window.limitReached || (window.usedPercent !== null && window.usedPercent >= 100);\n}\n\nfunction pct(value: number): string {\n return `${Math.round(value)}%`;\n}\n\nfunction formatAge(ms: number): string {\n const minutes = Math.round(ms / 60_000);\n if (minutes < 120) return `${minutes} min`;\n const hours = Math.round(minutes / 60);\n return hours < 48 ? `${hours} h` : `${Math.round(hours / 24)} days`;\n}\n\n// ---------------------------------------------------------------------------\n// Assessment\n// ---------------------------------------------------------------------------\n\ninterface ClassedWindow {\n window: CapacityWindow;\n cls: SeatWindowClass;\n}\n\n/** The highest reading among `rows`, with its window; null when none carried a percent. */\nfunction peak(rows: ClassedWindow[]): ClassedWindow | null {\n let best: ClassedWindow | null = null;\n for (const row of rows) {\n if (row.window.usedPercent === null) continue;\n if (best === null || row.window.usedPercent > best.window.usedPercent!) best = row;\n }\n return best;\n}\n\n/**\n * When EVERY spent window in `rows` has reset — the seat is blocked until the\n * last of them does, so this is the latest reset. Null unless every row has a\n * machine-readable reset (one unknown reset makes the reopening unknown).\n */\nfunction lastReset(rows: ClassedWindow[]): string | null {\n const times: string[] = [];\n for (const row of rows) {\n const at = row.window.resetsAt;\n if (!at || !Number.isFinite(Date.parse(at))) return null;\n times.push(at);\n }\n times.sort((a, b) => Date.parse(b) - Date.parse(a));\n return times[0] ?? null;\n}\n\n/** Full assessment of one seat for AUTONOMOUS use under `policy`. Pure. */\nexport function assessSeat(capacity: SeatCapacity, policy: SeatBudgetPolicy, opts: AssessOptions): SeatAssessment {\n const { nowMs } = opts;\n const maxAge = opts.readingMaxAgeMs ?? HEADROOM_READING_MAX_AGE_MS;\n // Reasons are built as data; `headroom.reasons` is derived from them.\n const details: SeatReason[] = [];\n\n // ── Local: free, windowless, bounded only by reachability ──────────────\n if (capacity.free) {\n const reachable = capacity.reachable !== false;\n if (!policy.enabled) details.push({ kind: 'switched-off', text: 'Autonomy is switched off for this seat.' });\n if (!reachable) details.push({ kind: 'unreachable', text: 'The local model runtime is not reachable.' });\n const eligible = policy.enabled && reachable;\n if (eligible) details.push({ kind: 'headroom', text: 'Local model — free, with no usage window to protect.' });\n return {\n headroom: {\n seatId: capacity.seatId,\n sessionUsedPercent: null,\n weeklyUsedPercent: null,\n bindingWindow: null,\n // No window binds a local seat; \"all of it\" is the honest number while\n // the runtime answers, and unknown while it does not.\n autonomyHeadroomPercent: reachable ? 100 : null,\n resetAt: null,\n eligibleForAutonomy: eligible,\n reasons: reasonSentences(details),\n },\n reopensAt: null,\n exhausted: false,\n unknownUsage: false,\n spentReasons: [],\n details,\n spentDetails: [],\n };\n }\n\n // ── Paid seat ──────────────────────────────────────────────────────────\n const classed: ClassedWindow[] = capacity.windows.map((window) => ({\n window,\n cls: classifyWindow(capacity.engine, window, nowMs),\n }));\n const account = classed.filter((row) => row.cls !== 'model');\n const sessionRows = account.filter((row) => row.cls === 'session');\n const weeklyRows = account.filter((row) => row.cls === 'weekly');\n const sessionPeak = peak(sessionRows);\n const weeklyPeak = peak(weeklyRows);\n const sessionUsed = sessionPeak?.window.usedPercent ?? null;\n const weeklyUsed = weeklyPeak?.window.usedPercent ?? null;\n\n // Evidence quality.\n const observedMs = capacity.observedAt ? Date.parse(capacity.observedAt) : NaN;\n const ageMs = Number.isFinite(observedMs) ? nowMs - observedMs : null;\n const stale = ageMs === null || ageMs > maxAge;\n const hasReading = sessionUsed !== null || weeklyUsed !== null;\n const nullWindow = account.find((row) => row.window.usedPercent === null && !row.window.limitReached);\n\n // Ceilings. The reserve protects the LONG window; with no long window it\n // protects the short one. The session ceiling protects a live session.\n const reserveCeiling = 100 - policy.reservePercent;\n const sessionCeiling = policy.maxSessionWindowPercent ?? 100;\n // With no long window the short one carries BOTH limits; say which one bit.\n const sessionLimitIsReserve = weeklyRows.length === 0 && reserveCeiling < sessionCeiling;\n const sessionLimit = sessionLimitIsReserve ? reserveCeiling : sessionCeiling;\n let weeklyRoom: number | null = null;\n let sessionRoom: number | null = null;\n if (weeklyUsed !== null) weeklyRoom = reserveCeiling - weeklyUsed;\n if (sessionUsed !== null) sessionRoom = sessionLimit - sessionUsed;\n let bindingWindow: SeatHeadroom['bindingWindow'] = null;\n let room: number | null = null;\n if (weeklyRoom !== null && (sessionRoom === null || weeklyRoom <= sessionRoom)) {\n bindingWindow = 'weekly';\n room = weeklyRoom;\n } else if (sessionRoom !== null) {\n bindingWindow = 'session';\n room = sessionRoom;\n }\n const bindingRow = bindingWindow === 'weekly' ? weeklyPeak : bindingWindow === 'session' ? sessionPeak : null;\n\n // Blockers, most fundamental first. Every one gets a plain sentence.\n let reopensAt: string | null = null;\n const spentRows = account.filter((row) => isSpent(row.window));\n const exhausted = spentRows.length > 0;\n const unknownUsage = !hasReading || stale || nullWindow !== undefined;\n\n if (!policy.enabled) details.push({ kind: 'switched-off', text: 'Autonomy is switched off for this seat.' });\n if (capacity.signedOut) {\n details.push({ kind: 'signed-out', text: 'Signed out — reconnect this account before anything can run on it.' });\n }\n\n const spentDetails: SeatReason[] = [];\n if (exhausted) {\n for (const row of spentRows) {\n const used = row.window.limitReached ? 'limit reached' : `${pct(row.window.usedPercent!)} used`;\n spentDetails.push({\n kind: 'spent',\n text: `The ${windowName(capacity.engine, row.window, row.cls)} is spent — ${used}.`,\n ...resetOf(row.window),\n });\n }\n details.push(...spentDetails);\n reopensAt = lastReset(spentRows);\n }\n\n if (!hasReading) {\n details.push({\n kind: 'unknown-usage',\n text: account.length === 0\n ? 'No usage reading for this seat — unknown usage is not headroom, so autonomy stays off it.'\n : 'Its usage windows carried no percentage — unknown usage is not headroom, so autonomy stays off it.',\n });\n } else if (stale) {\n details.push({\n kind: 'unknown-usage',\n text: ageMs === null\n ? 'The usage reading has no timestamp — too uncertain to spend against.'\n : `The usage reading is ${formatAge(ageMs)} old — too stale to spend against (limit ${formatAge(maxAge)}).`,\n });\n } else if (nullWindow) {\n details.push({\n kind: 'unknown-usage',\n text: `The ${windowName(capacity.engine, nullWindow.window, nullWindow.cls)} carried no percentage — `\n + 'unknown usage is not headroom.',\n });\n }\n\n const usdCap = policy.dailyUsdCap;\n let overUsd = false;\n if (usdCap !== undefined) {\n if (capacity.spentTodayUsd === null) {\n overUsd = true;\n details.push({ kind: 'spend-cap', text: `A $${usdCap.toFixed(2)} daily cap is set but today's spend on this seat is unknown.` });\n } else if (capacity.spentTodayUsd >= usdCap) {\n overUsd = true;\n details.push({ kind: 'spend-cap', text: `Spent $${capacity.spentTodayUsd.toFixed(2)} of its $${usdCap.toFixed(2)} daily cap.` });\n }\n }\n\n // Ceiling reasons only matter when the reading itself is trustworthy.\n const ceilingBlocked = !exhausted && !unknownUsage && room !== null && room <= 0;\n if (ceilingBlocked && bindingRow) {\n const name = windowName(capacity.engine, bindingRow.window, bindingRow.cls);\n const used = pct(bindingRow.window.usedPercent!);\n if (bindingWindow === 'session' && !sessionLimitIsReserve) {\n details.push({\n kind: 'session-ceiling',\n text: `The ${name} is ${used} used; autonomy stops at ${pct(sessionLimit)} to protect your live session.`,\n ...resetOf(bindingRow.window),\n });\n } else {\n details.push({\n kind: 'reserve',\n text: `The ${name} is ${used} used; ${pct(policy.reservePercent)} is kept for you, so autonomy `\n + `stops at ${pct(reserveCeiling)}.`,\n ...resetOf(bindingRow.window),\n });\n }\n reopensAt = bindingRow.window.resetsAt;\n }\n\n // Model-scoped windows are facts worth showing, never blockers.\n for (const row of classed) {\n if (row.cls === 'model' && isSpent(row.window)) {\n details.push({\n kind: 'model-window',\n text: `The ${windowName(capacity.engine, row.window, row.cls)} is spent — it limits that model only, not the account.`,\n });\n }\n }\n\n const eligible = policy.enabled && !capacity.signedOut && !exhausted && !unknownUsage && !overUsd\n && room !== null && room > 0;\n if (eligible && bindingRow) {\n const name = windowName(capacity.engine, bindingRow.window, bindingRow.cls);\n const kept = bindingWindow === 'weekly' || sessionLimitIsReserve\n ? policy.reservePercent > 0 ? ` (${pct(policy.reservePercent)} kept for you)` : ''\n : sessionLimit < 100 ? ` (autonomy stops at ${pct(sessionLimit)} to protect your live session)` : '';\n details.unshift({ kind: 'headroom', text: `${pct(room!)} of the ${name} is left for autonomy${kept}.` });\n }\n\n return {\n headroom: {\n seatId: capacity.seatId,\n sessionUsedPercent: sessionUsed,\n weeklyUsedPercent: weeklyUsed,\n bindingWindow,\n autonomyHeadroomPercent: room === null ? null : Math.max(0, Math.round(room)),\n resetAt: bindingRow?.window.resetsAt ?? null,\n eligibleForAutonomy: eligible,\n reasons: reasonSentences(details),\n },\n // A seat that is merely switched off, signed out, or unknown has no\n // known reopening — only a window reset is a date we can name.\n reopensAt: !policy.enabled || capacity.signedOut || unknownUsage || overUsd ? null : reopensAt,\n exhausted,\n unknownUsage,\n spentReasons: reasonSentences(spentDetails),\n details,\n spentDetails,\n };\n}\n\n/** The contract's `SeatHeadroom` for one seat. */\nexport function computeHeadroom(capacity: SeatCapacity, policy: SeatBudgetPolicy, opts: AssessOptions): SeatHeadroom {\n return assessSeat(capacity, policy, opts).headroom;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{C as e,M as t,W as n,a as r,i}from"./global-CYfRwH6t.js";import{r as a}from"./VerseShared-CFE5B-IY.js";var o=`verse-health`,s=`/api/verse/health`,c={key:o,fetch:e=>i(s,e)};function l(e,t){let n=!1;return()=>n?t():(n=!0,e())}async function u(n,i){let o=e();if(!o)throw new a;let s=await r(n,i,o);return t(),s}async function d(){let e=await u(`${s}/refresh`,{});return await n(o,l(()=>Promise.resolve(e),()=>c.fetch()),!0),e}async function f(e){await u(`${s}/reconnect`,{seatId:e})}export{c as a,d as i,l as n,f as r,o as t};
|
|
2
|
+
//# sourceMappingURL=health-queries-BHoSyIcL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-queries-BHoSyIcL.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/health/health-queries.ts"],"sourcesContent":["/**\n * routes/verse/health/health-queries.ts — the `/api/verse/health*` calls\n * (V3.10, unit A2). Server: core/verse/health-api.ts.\n *\n * Nothing here ever carries a launcher, a profile path or a credential: the\n * server withholds them, and Reconnect sends only the seat id — the server\n * resolves the seat's own login command privately and opens it in Terminal.\n */\nimport type { VerseHealthResponse } from '../../../../core/verse/health-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { refetchQuery } from '../../../data/cache.js';\nimport { apiGet, apiPost } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const VERSE_HEALTH_KEY = 'verse-health';\nexport const VERSE_HEALTH_URL = '/api/verse/health';\n\nexport const verseHealthQuery: QueryDef<VerseHealthResponse> = {\n key: VERSE_HEALTH_KEY,\n fetch: (signal) => apiGet<VerseHealthResponse>(VERSE_HEALTH_URL, signal),\n};\n\n/**\n * A fetcher that answers ONCE with `first`, then behaves like `fallback`.\n *\n * The cache (data/cache.ts) remembers the last fetcher it ran for a key and\n * re-runs it on every later invalidation. Writing a value we already hold\n * through a constant fetcher would freeze the key on that value forever;\n * this hands the cache the value now and the real read afterwards.\n */\nexport function oneShotFetcher<T>(first: () => Promise<T>, fallback: () => Promise<T>): () => Promise<T> {\n let used = false;\n return () => {\n if (used) return fallback();\n used = true;\n return first();\n };\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/** Run a health sweep now and publish its result to every health reader. */\nexport async function refreshSeatHealth(): Promise<VerseHealthResponse> {\n const body = await post<VerseHealthResponse>(`${VERSE_HEALTH_URL}/refresh`, {});\n await refetchQuery(VERSE_HEALTH_KEY, oneShotFetcher(() => Promise.resolve(body), () => verseHealthQuery.fetch()), true);\n return body;\n}\n\n/**\n * Open the seat's own sign-in in Terminal (macOS). Resolves once the window\n * was asked to open; the sign-in itself is the operator's, in that window.\n */\nexport async function reconnectSeat(seatId: string): Promise<void> {\n await post<{ ok: true; seatId: string }>(`${VERSE_HEALTH_URL}/reconnect`, { seatId });\n}\n"],"mappings":"8GAeA,IAAa,EAAmB,eACnB,EAAmB,oBAEnB,EAAkD,CAC7D,IAAK,EACL,MAAQ,GAAW,EAA4B,EAAkB,CAAM,CACzE,EAUA,SAAgB,EAAkB,EAAyB,EAA8C,CACvG,IAAI,EAAO,GACX,UACM,EAAa,EAAS,GAC1B,EAAO,GACA,EAAM,EAEjB,CAEA,eAAe,EAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAGA,eAAsB,GAAkD,CACtE,IAAM,EAAO,MAAM,EAA0B,GAAG,EAAiB,UAAW,CAAC,CAAC,EAE9E,OADA,MAAM,EAAa,EAAkB,MAAqB,QAAQ,QAAQ,CAAI,MAAS,EAAiB,MAAM,CAAC,EAAG,EAAI,EAC/G,CACT,CAMA,eAAsB,EAAc,EAA+B,CACjE,MAAM,EAAmC,GAAG,EAAiB,YAAa,CAAE,QAAO,CAAC,CACtF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./index-_izD07R9.js";import{r as t}from"./verse-bootstrap-query-ANtL2OPN.js";var n=e(),r=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`path`,{d:`M2.2 11.5a6.4 6.4 0 1 1 11.6 0`}),(0,n.jsx)(`path`,{d:`M8 11 10.8 6.6`}),(0,n.jsx)(`circle`,{cx:`8`,cy:`11.6`,r:`0.9`,fill:`currentColor`,stroke:`none`})]}),i=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`path`,{d:`M2.5 4.5h4M9.5 4.5h4M2.5 11.5h2M7.5 11.5h6`}),(0,n.jsx)(`circle`,{cx:`8`,cy:`4.5`,r:`1.6`}),(0,n.jsx)(`circle`,{cx:`6`,cy:`11.5`,r:`1.6`})]}),a=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`rect`,{x:`4.5`,y:`4.5`,width:`7`,height:`7`,rx:`1.5`}),(0,n.jsx)(`path`,{d:`M6.5 1.5v3M9.5 1.5v3M6.5 11.5v3M9.5 11.5v3M1.5 6.5h3M1.5 9.5h3M11.5 6.5h3M11.5 9.5h3`})]}),o=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`path`,{d:`m3 8.5 3.2 3.2L13 5`})}),s=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`circle`,{cx:`8`,cy:`8`,r:`6`}),(0,n.jsx)(`path`,{d:`m5.2 8.2 1.9 1.9 3.7-4`})]}),c=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`path`,{d:`m4 4 8 8M12 4l-8 8`})}),l=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`path`,{d:`M5.5 3.4 12 8l-6.5 4.6V3.4Z`})}),u=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`rect`,{x:`4`,y:`4`,width:`8`,height:`8`,rx:`1.2`})}),d=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`path`,{d:`M6 3.5v9M10 3.5v9`})}),f=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`path`,{d:`M8 2.6 14.2 13H1.8L8 2.6Z`}),(0,n.jsx)(`path`,{d:`M8 6.6v3`}),(0,n.jsx)(`circle`,{cx:`8`,cy:`11.3`,r:`0.75`,fill:`currentColor`,stroke:`none`})]}),p=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`circle`,{cx:`8`,cy:`8`,r:`6`}),(0,n.jsx)(`path`,{d:`M8 7.4v3.4`}),(0,n.jsx)(`circle`,{cx:`8`,cy:`5.4`,r:`0.75`,fill:`currentColor`,stroke:`none`})]}),m=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`path`,{d:`M8 3.2v9.6M3.2 8h9.6`})}),h=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`circle`,{cx:`7.2`,cy:`7.2`,r:`4.2`}),(0,n.jsx)(`path`,{d:`m10.4 10.4 3.1 3.1`})]}),g=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`rect`,{x:`5.5`,y:`5.5`,width:`8`,height:`8`,rx:`1.5`}),(0,n.jsx)(`path`,{d:`M10.5 3.5a1.5 1.5 0 0 0-1.5-1.5H4A1.5 1.5 0 0 0 2.5 3.5v5A1.5 1.5 0 0 0 4 10`})]}),_=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`path`,{d:`m4 6.2 4 4 4-4`})}),v=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`path`,{d:`m4 9.8 4-4 4 4`})}),y=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`path`,{d:`m6.2 4 4 4-4 4`})}),b=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`path`,{d:`M14 2 7.2 8.8M14 2l-4.4 12-2.4-5.2L2 6.4 14 2Z`})}),x=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`path`,{d:`M9.5 2.5H13.5v4M13.5 2.5 7.8 8.2`}),(0,n.jsx)(`path`,{d:`M12.5 9.6v2.9a1.5 1.5 0 0 1-1.5 1.5H3.5A1.5 1.5 0 0 1 2 12.5V5a1.5 1.5 0 0 1 1.5-1.5h2.9`})]}),S=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`path`,{d:`M13.2 7.2a5.2 5.2 0 1 0-.7 3.5`}),(0,n.jsx)(`path`,{d:`M13.5 3.4v3.9h-3.9`})]}),C=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`rect`,{x:`3`,y:`7`,width:`10`,height:`6.5`,rx:`1.5`}),(0,n.jsx)(`path`,{d:`M5.5 7V5.2a2.5 2.5 0 0 1 5 0V7`})]}),w=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`circle`,{cx:`8`,cy:`8`,r:`3.1`}),(0,n.jsx)(`path`,{d:`M8 1.5v1.6M8 12.9v1.6M1.5 8h1.6M12.9 8h1.6M3.4 3.4l1.1 1.1M11.5 11.5l1.1 1.1M12.6 3.4l-1.1 1.1M4.5 11.5l-1.1 1.1`})]}),T=e=>(0,n.jsx)(t,{...e,children:(0,n.jsx)(`path`,{d:`M13 9.8A5.6 5.6 0 0 1 6.2 3a5.6 5.6 0 1 0 6.8 6.8Z`})}),E=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`rect`,{x:`1.8`,y:`2.8`,width:`12.4`,height:`8.4`,rx:`1.5`}),(0,n.jsx)(`path`,{d:`M5.8 14h4.4M8 11.2V14`})]}),D=e=>(0,n.jsxs)(t,{...e,children:[(0,n.jsx)(`rect`,{x:`1.5`,y:`4`,width:`13`,height:`8`,rx:`1.5`}),(0,n.jsx)(`path`,{d:`M4.2 6.6h.01M6.8 6.6h.01M9.4 6.6h.01M12 6.6h.01M4.2 9.4h.01M12 9.4h.01M6.4 9.4h3.2`})]});export{u as C,i as S,c as T,l as _,y as a,h as b,a as c,p as d,D as f,d as g,T as h,_ as i,x as l,E as m,o as n,v as o,C as p,s as r,g as s,f as t,r as u,m as v,w,b as x,S as y};
|
|
2
|
+
//# sourceMappingURL=icons-BBm_Cy62.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons-BBm_Cy62.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/icons.tsx"],"sourcesContent":["/**\n * components/primitives/icons.tsx — the console's icon set.\n *\n * Hand-drawn inline SVG rather than an icon package: the design language\n * fixes one geometry (16px box, 1.5px stroke, round caps/joins, currentColor)\n * and the app ships zero runtime dependencies for presentation. Adding a\n * library here would import hundreds of icons drawn to someone else's stroke\n * weight for the six we actually need per section.\n *\n * Every icon is decorative by default (`aria-hidden`), because it sits next\n * to a label or inside a control that already has an accessible name. Pass\n * `title` ONLY when the icon is the sole carrier of meaning; it then becomes\n * `role=\"img\"` with an accessible name.\n */\nimport { Icon, type IconProps } from './icon-base.js';\n\n// The glyphs the Verse rail draws at first paint live in icon-base.tsx so\n// the rail does not pull this whole set into the chat first-paint critical\n// JS; they are re-exported so this stays the one import site.\nexport { IconChat, IconInbox, type IconProps } from './icon-base.js';\n\n/** Gauge — usage / spend. */\nexport const IconGauge = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M2.2 11.5a6.4 6.4 0 1 1 11.6 0\" />\n <path d=\"M8 11 10.8 6.6\" />\n <circle cx=\"8\" cy=\"11.6\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\" />\n </Icon>\n);\n\n/** Sliders — settings. */\nexport const IconSliders = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M2.5 4.5h4M9.5 4.5h4M2.5 11.5h2M7.5 11.5h6\" />\n <circle cx=\"8\" cy=\"4.5\" r=\"1.6\" />\n <circle cx=\"6\" cy=\"11.5\" r=\"1.6\" />\n </Icon>\n);\n\n/** CPU — autonomy / the daemon loop. */\nexport const IconCpu = (p: IconProps) => (\n <Icon {...p}>\n <rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <path d=\"M6.5 1.5v3M9.5 1.5v3M6.5 11.5v3M9.5 11.5v3M1.5 6.5h3M1.5 9.5h3M11.5 6.5h3M11.5 9.5h3\" />\n </Icon>\n);\n\nexport const IconCheck = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"m3 8.5 3.2 3.2L13 5\" />\n </Icon>\n);\n\nexport const IconCheckCircle = (p: IconProps) => (\n <Icon {...p}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"m5.2 8.2 1.9 1.9 3.7-4\" />\n </Icon>\n);\n\nexport const IconX = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"m4 4 8 8M12 4l-8 8\" />\n </Icon>\n);\n\nexport const IconPlay = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M5.5 3.4 12 8l-6.5 4.6V3.4Z\" />\n </Icon>\n);\n\nexport const IconStop = (p: IconProps) => (\n <Icon {...p}>\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.2\" />\n </Icon>\n);\n\nexport const IconPause = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M6 3.5v9M10 3.5v9\" />\n </Icon>\n);\n\n/** Alert — a warning that is paired with text, never used alone for state. */\nexport const IconAlert = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M8 2.6 14.2 13H1.8L8 2.6Z\" />\n <path d=\"M8 6.6v3\" />\n <circle cx=\"8\" cy=\"11.3\" r=\"0.75\" fill=\"currentColor\" stroke=\"none\" />\n </Icon>\n);\n\nexport const IconInfo = (p: IconProps) => (\n <Icon {...p}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M8 7.4v3.4\" />\n <circle cx=\"8\" cy=\"5.4\" r=\"0.75\" fill=\"currentColor\" stroke=\"none\" />\n </Icon>\n);\n\nexport const IconPlus = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M8 3.2v9.6M3.2 8h9.6\" />\n </Icon>\n);\n\nexport const IconSearch = (p: IconProps) => (\n <Icon {...p}>\n <circle cx=\"7.2\" cy=\"7.2\" r=\"4.2\" />\n <path d=\"m10.4 10.4 3.1 3.1\" />\n </Icon>\n);\n\nexport const IconCopy = (p: IconProps) => (\n <Icon {...p}>\n <rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8\" rx=\"1.5\" />\n <path d=\"M10.5 3.5a1.5 1.5 0 0 0-1.5-1.5H4A1.5 1.5 0 0 0 2.5 3.5v5A1.5 1.5 0 0 0 4 10\" />\n </Icon>\n);\n\nexport const IconChevronDown = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"m4 6.2 4 4 4-4\" />\n </Icon>\n);\n\nexport const IconChevronUp = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"m4 9.8 4-4 4 4\" />\n </Icon>\n);\n\nexport const IconChevronRight = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"m6.2 4 4 4-4 4\" />\n </Icon>\n);\n\nexport const IconChevronLeft = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"m9.8 4-4 4 4 4\" />\n </Icon>\n);\n\nexport const IconMic = (p: IconProps) => (\n <Icon {...p}>\n <rect x=\"6\" y=\"1.8\" width=\"4\" height=\"7.4\" rx=\"2\" />\n <path d=\"M3.6 7.6a4.4 4.4 0 0 0 8.8 0M8 11.9v2.3\" />\n </Icon>\n);\n\nexport const IconSend = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M14 2 7.2 8.8M14 2l-4.4 12-2.4-5.2L2 6.4 14 2Z\" />\n </Icon>\n);\n\nexport const IconTrash = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M2.8 4.2h10.4M6.4 4.2V2.8h3.2v1.4M4.2 4.2l.6 8.2a1.3 1.3 0 0 0 1.3 1.2h3.8a1.3 1.3 0 0 0 1.3-1.2l.6-8.2\" />\n </Icon>\n);\n\nexport const IconExternalLink = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M9.5 2.5H13.5v4M13.5 2.5 7.8 8.2\" />\n <path d=\"M12.5 9.6v2.9a1.5 1.5 0 0 1-1.5 1.5H3.5A1.5 1.5 0 0 1 2 12.5V5a1.5 1.5 0 0 1 1.5-1.5h2.9\" />\n </Icon>\n);\n\nexport const IconFolder = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M2 4.6A1.6 1.6 0 0 1 3.6 3h2.3l1.4 1.8h5.1A1.6 1.6 0 0 1 14 6.4v5A1.6 1.6 0 0 1 12.4 13H3.6A1.6 1.6 0 0 1 2 11.4V4.6Z\" />\n </Icon>\n);\n\nexport const IconRefresh = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M13.2 7.2a5.2 5.2 0 1 0-.7 3.5\" />\n <path d=\"M13.5 3.4v3.9h-3.9\" />\n </Icon>\n);\n\nexport const IconLock = (p: IconProps) => (\n <Icon {...p}>\n <rect x=\"3\" y=\"7\" width=\"10\" height=\"6.5\" rx=\"1.5\" />\n <path d=\"M5.5 7V5.2a2.5 2.5 0 0 1 5 0V7\" />\n </Icon>\n);\n\nexport const IconKey = (p: IconProps) => (\n <Icon {...p}>\n <circle cx=\"5.4\" cy=\"10.6\" r=\"2.6\" />\n <path d=\"m7.4 8.7 5.3-5.3M10.6 5.5l1.4 1.4M12.2 3.9l1.4 1.4\" />\n </Icon>\n);\n\nexport const IconSun = (p: IconProps) => (\n <Icon {...p}>\n <circle cx=\"8\" cy=\"8\" r=\"3.1\" />\n <path d=\"M8 1.5v1.6M8 12.9v1.6M1.5 8h1.6M12.9 8h1.6M3.4 3.4l1.1 1.1M11.5 11.5l1.1 1.1M12.6 3.4l-1.1 1.1M4.5 11.5l-1.1 1.1\" />\n </Icon>\n);\n\nexport const IconMoon = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M13 9.8A5.6 5.6 0 0 1 6.2 3a5.6 5.6 0 1 0 6.8 6.8Z\" />\n </Icon>\n);\n\nexport const IconMonitor = (p: IconProps) => (\n <Icon {...p}>\n <rect x=\"1.8\" y=\"2.8\" width=\"12.4\" height=\"8.4\" rx=\"1.5\" />\n <path d=\"M5.8 14h4.4M8 11.2V14\" />\n </Icon>\n);\n\nexport const IconDrag = (p: IconProps) => (\n <Icon {...p}>\n <circle cx=\"6\" cy=\"4\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"10\" cy=\"4\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"6\" cy=\"8\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"10\" cy=\"8\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"6\" cy=\"12\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"10\" cy=\"12\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n </Icon>\n);\n\nexport const IconKeyboard = (p: IconProps) => (\n <Icon {...p}>\n <rect x=\"1.5\" y=\"4\" width=\"13\" height=\"8\" rx=\"1.5\" />\n <path d=\"M4.2 6.6h.01M6.8 6.6h.01M9.4 6.6h.01M12 6.6h.01M4.2 9.4h.01M12 9.4h.01M6.4 9.4h3.2\" />\n </Icon>\n);\n"],"mappings":"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"}
|