@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,2 @@
|
|
|
1
|
+
import{O as e}from"./verse-model-DAOz9LrY.js";import{n as t}from"./tool-semantics-DtFU7rvB.js";import{i as n}from"./sidebar-model-COzIPSiP.js";function r(n){let r=0;for(let e=n.length-1;e>=0;--e)if(n[e].kind===`user`){r=e;break}let i=[],a=[];for(let o=r;o<n.length;o+=1){let r=n[o];if(r.kind!==`tool`)continue;let s={toolUseId:r.toolUseId,kind:t(r.name)===`task`?`subagent`:`tool`,name:r.name,detail:e(r.input)||r.name,startedAt:r.at,status:r.result===null?`running`:r.result.isError?`failed`:`done`,durationMs:r.durationMs};(s.status===`running`?i:a).push(s)}return[...i,...a.reverse()]}function i(e,t,r){let i=new Map;for(let e of t?.running??[])e.sessionId!==r&&i.set(e.sessionId,{sessionId:e.sessionId,title:e.title,engine:e.engine,startedAt:e.startedAt,live:n(e.live)});for(let t of e)t.id===r||t.status!==`running`||i.has(t.id)||i.set(t.id,{sessionId:t.id,title:t.title,engine:t.engine,startedAt:null,live:null});return[...i.values()]}function a(e,t){let n=e.filter(e=>e.status===`running`);return{turn:n.length,subagents:n.filter(e=>e.kind===`subagent`).length,chats:t.length,total:n.length+t.length}}function o(e){let t=`${e.total} running task${e.total===1?``:`s`}`,n=[];return e.turn>0&&n.push(`${e.turn} in this chat`),e.chats>0&&n.push(`${e.chats} other chat${e.chats===1?``:`s`}`),n.length>0?`${t}: ${n.join(`, `)}`:t}export{a as countTasks,r as currentTurnTasks,o as describeTaskCounts,i as otherRunningChats};
|
|
2
|
+
//# sourceMappingURL=tasks-model-CbmPgWL8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks-model-CbmPgWL8.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/tasks-model.ts"],"sourcesContent":["/**\n * routes/verse/chat/tasks-model.ts — what is running right now, for the\n * \"◌ 3 running tasks\" chip and the dock's Tasks pane (SPEC-310C §2–§3, C2).\n *\n * Two kinds of task, because the operator is waiting on both:\n * - THIS TURN: the open chat's tool calls and subagents since its last ask\n * (a running `Task` is a subagent; everything else is a tool);\n * - OTHER CHATS: every other chat with a turn in flight, from activity\n * (C1) when it answers, else from the session list's `status`.\n *\n * Pure over transcript items and the session / activity lists.\n */\nimport type { VerseEngine, VerseSession } from '../../../data/api-types.js';\nimport type { VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { TranscriptItem } from '../verse-store.js';\nimport { summarizeToolInput } from '../verse-model.js';\nimport { liveLine } from './sidebar-model.js';\nimport { actionForName } from './tool-semantics.js';\n\nexport type TurnTaskStatus = 'running' | 'done' | 'failed';\n\nexport interface TurnTask {\n toolUseId: string;\n kind: 'subagent' | 'tool';\n /** Tool name as the CLI spelled it. */\n name: string;\n /** What it is doing: the command, the path, the subagent's description. */\n detail: string;\n /** ISO time the call started. */\n startedAt: string;\n status: TurnTaskStatus;\n durationMs: number | null;\n}\n\nexport interface ChatTask {\n sessionId: string;\n title: string;\n engine: VerseEngine;\n /** ISO start of the running turn when activity knows it; null = unknown. */\n startedAt: string | null;\n /** The muted \"what it is doing\" line; null when unknown. */\n live: string | null;\n}\n\n/** The last turn's tool calls, running first (in start order), then finished (newest first). */\nexport function currentTurnTasks(items: readonly TranscriptItem[]): TurnTask[] {\n let start = 0;\n for (let i = items.length - 1; i >= 0; i -= 1) {\n if (items[i]!.kind === 'user') {\n start = i;\n break;\n }\n }\n const running: TurnTask[] = [];\n const finished: TurnTask[] = [];\n for (let i = start; i < items.length; i += 1) {\n const item = items[i]!;\n if (item.kind !== 'tool') continue;\n const task: TurnTask = {\n toolUseId: item.toolUseId,\n kind: actionForName(item.name) === 'task' ? 'subagent' : 'tool',\n name: item.name,\n detail: summarizeToolInput(item.input) || item.name,\n startedAt: item.at,\n status: item.result === null ? 'running' : item.result.isError ? 'failed' : 'done',\n durationMs: item.durationMs,\n };\n (task.status === 'running' ? running : finished).push(task);\n }\n return [...running, ...finished.reverse()];\n}\n\nexport function otherRunningChats(\n sessions: readonly VerseSession[],\n activity: VerseActivityResponse | null,\n currentId: string | null,\n): ChatTask[] {\n const out = new Map<string, ChatTask>();\n for (const row of activity?.running ?? []) {\n if (row.sessionId === currentId) continue;\n out.set(row.sessionId, {\n sessionId: row.sessionId,\n title: row.title,\n engine: row.engine,\n startedAt: row.startedAt,\n live: liveLine(row.live),\n });\n }\n // The session list can know about a run activity has not reported (a\n // server without C1's route, or the few seconds between polls).\n for (const session of sessions) {\n if (session.id === currentId || session.status !== 'running' || out.has(session.id)) continue;\n out.set(session.id, { sessionId: session.id, title: session.title, engine: session.engine, startedAt: null, live: null });\n }\n return [...out.values()];\n}\n\nexport interface TaskCounts {\n /** Running calls in this turn. */\n turn: number;\n /** Of which subagents. */\n subagents: number;\n /** Other chats running. */\n chats: number;\n total: number;\n}\n\nexport function countTasks(turn: readonly TurnTask[], chats: readonly ChatTask[]): TaskCounts {\n const running = turn.filter((t) => t.status === 'running');\n return {\n turn: running.length,\n subagents: running.filter((t) => t.kind === 'subagent').length,\n chats: chats.length,\n total: running.length + chats.length,\n };\n}\n\n/** \"3 running tasks\" — and what they are, for the chip's accessible name. */\nexport function describeTaskCounts(counts: TaskCounts): string {\n const head = `${counts.total} running task${counts.total === 1 ? '' : 's'}`;\n const parts: string[] = [];\n if (counts.turn > 0) parts.push(`${counts.turn} in this chat`);\n if (counts.chats > 0) parts.push(`${counts.chats} other chat${counts.chats === 1 ? '' : 's'}`);\n return parts.length > 0 ? `${head}: ${parts.join(', ')}` : head;\n}\n"],"mappings":"+IA6CA,SAAgB,EAAiB,EAA8C,CAC7E,IAAI,EAAQ,EACZ,IAAK,IAAI,EAAI,EAAM,OAAS,EAAG,GAAK,EAAG,IACrC,GAAI,EAAM,EAAE,CAAE,OAAS,OAAQ,CAC7B,EAAQ,EACR,KACF,CAEF,IAAM,EAAsB,CAAC,EACvB,EAAuB,CAAC,EAC9B,IAAK,IAAI,EAAI,EAAO,EAAI,EAAM,OAAQ,GAAK,EAAG,CAC5C,IAAM,EAAO,EAAM,GACnB,GAAI,EAAK,OAAS,OAAQ,SAC1B,IAAM,EAAiB,CACrB,UAAW,EAAK,UAChB,KAAM,EAAc,EAAK,IAAI,IAAM,OAAS,WAAa,OACzD,KAAM,EAAK,KACX,OAAQ,EAAmB,EAAK,KAAK,GAAK,EAAK,KAC/C,UAAW,EAAK,GAChB,OAAQ,EAAK,SAAW,KAAO,UAAY,EAAK,OAAO,QAAU,SAAW,OAC5E,WAAY,EAAK,UACnB,GACC,EAAK,SAAW,UAAY,EAAU,EAAA,CAAU,KAAK,CAAI,CAC5D,CACA,MAAO,CAAC,GAAG,EAAS,GAAG,EAAS,QAAQ,CAAC,CAC3C,CAEA,SAAgB,EACd,EACA,EACA,EACY,CACZ,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAO,GAAU,SAAW,CAAC,EAClC,EAAI,YAAc,GACtB,EAAI,IAAI,EAAI,UAAW,CACrB,UAAW,EAAI,UACf,MAAO,EAAI,MACX,OAAQ,EAAI,OACZ,UAAW,EAAI,UACf,KAAM,EAAS,EAAI,IAAI,CACzB,CAAC,EAIH,IAAK,IAAM,KAAW,EAChB,EAAQ,KAAO,GAAa,EAAQ,SAAW,WAAa,EAAI,IAAI,EAAQ,EAAE,GAClF,EAAI,IAAI,EAAQ,GAAI,CAAE,UAAW,EAAQ,GAAI,MAAO,EAAQ,MAAO,OAAQ,EAAQ,OAAQ,UAAW,KAAM,KAAM,IAAK,CAAC,EAE1H,MAAO,CAAC,GAAG,EAAI,OAAO,CAAC,CACzB,CAYA,SAAgB,EAAW,EAA2B,EAAwC,CAC5F,IAAM,EAAU,EAAK,OAAQ,GAAM,EAAE,SAAW,SAAS,EACzD,MAAO,CACL,KAAM,EAAQ,OACd,UAAW,EAAQ,OAAQ,GAAM,EAAE,OAAS,UAAU,CAAC,CAAC,OACxD,MAAO,EAAM,OACb,MAAO,EAAQ,OAAS,EAAM,MAChC,CACF,CAGA,SAAgB,EAAmB,EAA4B,CAC7D,IAAM,EAAO,GAAG,EAAO,MAAM,eAAe,EAAO,QAAU,EAAI,GAAK,MAChE,EAAkB,CAAC,EAGzB,OAFI,EAAO,KAAO,GAAG,EAAM,KAAK,GAAG,EAAO,KAAK,cAAc,EACzD,EAAO,MAAQ,GAAG,EAAM,KAAK,GAAG,EAAO,MAAM,aAAa,EAAO,QAAU,EAAI,GAAK,KAAK,EACtF,EAAM,OAAS,EAAI,GAAG,EAAK,IAAI,EAAM,KAAK,IAAI,IAAM,CAC7D"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{C as e,M as t,a as n,i as r}from"./global-CYfRwH6t.js";import{ot as i}from"./VerseShared-CFE5B-IY.js";var a=class extends Error{constructor(){super(`Unlock actions with the mutation token to use the terminal.`),this.name=`TerminalLockedError`}};async function o(r,i){let o=e();if(!o)throw new a;let s=await n(r,i,o);return t(),s}function s(e,t){return`${i}/${encodeURIComponent(e)}/${t}`}var c={list:e=>r(i,e),create:async e=>(await o(i,e)).tab,input:(e,t)=>o(s(e,`input`),{dataBase64:t}),resize:(e,t,n)=>o(s(e,`resize`),{cols:t,rows:n}),kill:async e=>{await o(s(e,`kill`),{})},openExternal:async(e,t)=>{await o(`${i}/open-external`,t===void 0?{sessionId:e}:{sessionId:e,root:t})}};function l(e,t){let n=Number.isSafeInteger(t)&&t>0?`?after=${t}`:``;return`${s(e,`stream`)}${n}`}function u(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function d(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function f(e){let t=e.replace(/\s+$/,``),n=Math.max(0,...Array.from(t.matchAll(/`+/g),e=>e[0].length)),r="`".repeat(Math.max(3,n+1));return`${r}\n${t}\n${r}`}export{c as a,f as i,d as n,l as o,u as r,a as t};
|
|
2
|
+
//# sourceMappingURL=terminal-client-DTXAf2-x.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-client-DTXAf2-x.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-client.ts"],"sourcesContent":["/**\n * dock/terminal/terminal-client.ts — the Terminal pane's HTTP calls (unit C4).\n *\n * Writes carry the held mutation token (auth-store), exactly like\n * verse-queries' writes; the stream is read with fetch() + the read-client\n * header rather than EventSource (see terminal-stream.ts for why).\n */\nimport type {\n VerseTerminalCreateRequest,\n VerseTerminalListResponse,\n VerseTerminalTab,\n} from '../../../../data/api-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../../data/auth-store.js';\nimport { apiGet, apiPost } from '../../../../data/client.js';\nimport { VERSE_TERMINAL_PATH } from '../../../../../core/verse/workbench-types.js';\n\n/** Raised when a write is attempted with no mutation token held. */\nexport class TerminalLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token to use the terminal.');\n this.name = 'TerminalLockedError';\n }\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new TerminalLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nfunction tabPath(id: string, action: 'input' | 'resize' | 'kill' | 'stream'): string {\n return `${VERSE_TERMINAL_PATH}/${encodeURIComponent(id)}/${action}`;\n}\n\nexport interface TerminalApi {\n list(signal?: AbortSignal): Promise<VerseTerminalListResponse>;\n create(req: VerseTerminalCreateRequest): Promise<VerseTerminalTab>;\n input(id: string, dataBase64: string): Promise<void>;\n resize(id: string, cols: number, rows: number): Promise<void>;\n kill(id: string): Promise<void>;\n openExternal(sessionId: string, root?: string): Promise<void>;\n}\n\nexport const terminalApi: TerminalApi = {\n list: (signal) => apiGet<VerseTerminalListResponse>(VERSE_TERMINAL_PATH, signal),\n create: async (req) => (await post<{ tab: VerseTerminalTab }>(VERSE_TERMINAL_PATH, req)).tab,\n input: (id, dataBase64) => post<void>(tabPath(id, 'input'), { dataBase64 }),\n resize: (id, cols, rows) => post<void>(tabPath(id, 'resize'), { cols, rows }),\n kill: async (id) => { await post<unknown>(tabPath(id, 'kill'), {}); },\n openExternal: async (sessionId, root) => {\n await post<unknown>(`${VERSE_TERMINAL_PATH}/open-external`, root === undefined ? { sessionId } : { sessionId, root });\n },\n};\n\nexport function terminalStreamPath(id: string, after: number): string {\n const cursor = Number.isSafeInteger(after) && after > 0 ? `?after=${after}` : '';\n return `${tabPath(id, 'stream')}${cursor}`;\n}\n\n// ---------------------------------------------------------------------------\n// Bytes\n// ---------------------------------------------------------------------------\n\n/** Standard base64 of bytes (btoa over a binary string, chunked to stay off the arg-count limit). */\nexport function bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(binary);\n}\n\nexport function base64ToBytes(b64: string): Uint8Array {\n const binary = atob(b64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n return out;\n}\n\n/**\n * The fence for \"Send selection to chat\": one backtick longer than the\n * longest run inside the text (at least three), so a selection that itself\n * contains a fenced block cannot close ours early.\n */\nexport function fenceSelection(text: string): string {\n const trimmed = text.replace(/\\s+$/, '');\n const longest = Math.max(0, ...Array.from(trimmed.matchAll(/`+/g), (m) => m[0].length));\n const fence = '`'.repeat(Math.max(3, longest + 1));\n return `${fence}\\n${trimmed}\\n${fence}`;\n}\n"],"mappings":"6GAiBA,IAAa,EAAb,cAAyC,KAAM,CAC7C,aAAc,CACZ,MAAM,6DAA6D,EACnE,KAAK,KAAO,qBACd,CACF,EAEA,eAAe,EAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAEA,SAAS,EAAQ,EAAY,EAAwD,CACnF,MAAO,GAAG,EAAoB,GAAG,mBAAmB,CAAE,EAAE,GAAG,GAC7D,CAWA,IAAa,EAA2B,CACtC,KAAO,GAAW,EAAkC,EAAqB,CAAM,EAC/E,OAAQ,KAAO,KAAS,MAAM,EAAgC,EAAqB,CAAG,EAAA,CAAG,IACzF,OAAQ,EAAI,IAAe,EAAW,EAAQ,EAAI,OAAO,EAAG,CAAE,YAAW,CAAC,EAC1E,QAAS,EAAI,EAAM,IAAS,EAAW,EAAQ,EAAI,QAAQ,EAAG,CAAE,OAAM,MAAK,CAAC,EAC5E,KAAM,KAAO,IAAO,CAAE,MAAM,EAAc,EAAQ,EAAI,MAAM,EAAG,CAAC,CAAC,CAAG,EACpE,aAAc,MAAO,EAAW,IAAS,CACvC,MAAM,EAAc,GAAG,EAAoB,gBAAiB,IAAS,IAAA,GAAY,CAAE,WAAU,EAAI,CAAE,YAAW,MAAK,CAAC,CACtH,CACF,EAEA,SAAgB,EAAmB,EAAY,EAAuB,CACpE,IAAM,EAAS,OAAO,cAAc,CAAK,GAAK,EAAQ,EAAI,UAAU,IAAU,GAC9E,MAAO,GAAG,EAAQ,EAAI,QAAQ,IAAI,GACpC,CAOA,SAAgB,EAAc,EAA2B,CACvD,IAAI,EAAS,GACb,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,GAAK,MACrC,GAAU,OAAO,aAAa,GAAG,EAAM,SAAS,EAAG,EAAI,KAAM,CAAC,EAEhE,OAAO,KAAK,CAAM,CACpB,CAEA,SAAgB,EAAc,EAAyB,CACrD,IAAM,EAAS,KAAK,CAAG,EACjB,EAAM,IAAI,WAAW,EAAO,MAAM,EACxC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,EAAI,GAAK,EAAO,WAAW,CAAC,EACpE,OAAO,CACT,CAOA,SAAgB,EAAe,EAAsB,CACnD,IAAM,EAAU,EAAK,QAAQ,OAAQ,EAAE,EACjC,EAAU,KAAK,IAAI,EAAG,GAAG,MAAM,KAAK,EAAQ,SAAS,KAAK,EAAI,GAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAChF,EAAQ,IAAI,OAAO,KAAK,IAAI,EAAG,EAAU,CAAC,CAAC,EACjD,MAAO,GAAG,EAAM,IAAI,EAAQ,IAAI,GAClC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./index-_izD07R9.js";var t=e();function n({size:e=16,children:n,...r}){return(0,t.jsx)(`svg`,{width:e,height:e,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,...r,children:n})}function r(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`m4.5 6.25 2 1.75-2 1.75M8.25 10h3`})]})}function i(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01`})]})}function a(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`m4.5 6.5 3.5 3.5 3.5-3.5`})})}function o(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M2.5 6v4h2.5l3.5 3V3L5 6H2.5Z`}),(0,t.jsx)(`path`,{d:`M11 5.5a3.5 3.5 0 0 1 0 5M12.75 3.75a6 6 0 0 1 0 8.5`})]})}function s(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M13 8H3.5M7.5 4 3.5 8l4 4`})})}function c(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M3 8h9.5M8.5 4l4 4-4 4`})})}function l(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M13 8a5 5 0 1 1-1.46-3.54`}),(0,t.jsx)(`path`,{d:`M13 2.75v2.5h-2.5`})]})}function u(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`8.5`,rx:`1.25`}),(0,t.jsx)(`path`,{d:`M6 13.75h4M8 11.25v2.5`})]})}function d(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`4.75`,y:`1.75`,width:`6.5`,height:`12.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M7.25 12h1.5`})]})}function f(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M5 3.5v9l7-4.5-7-4.5Z`})})}function p(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M9 1.75H4.25a1 1 0 0 0-1 1v10.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5.5L9 1.75Z`}),(0,t.jsx)(`path`,{d:`M9 1.75V5.5h3.75`})]})}function m(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`2.25`,y:`2.25`,width:`11.5`,height:`4.5`,rx:`1`}),(0,t.jsx)(`rect`,{x:`2.25`,y:`9.25`,width:`11.5`,height:`4.5`,rx:`1`}),(0,t.jsx)(`path`,{d:`M4.75 4.5h.01M4.75 11.5h.01`})]})}export{p as a,i as c,m as d,r as f,u as i,l,c as n,d as o,a as r,f as s,s as t,o as u};
|
|
2
|
+
//# sourceMappingURL=terminal-icons-qBCOwqu-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-icons-qBCOwqu-.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-icons.tsx"],"sourcesContent":["/**\n * dock/terminal/terminal-icons.tsx — the Terminal / Preview panes' own 16px\n * glyphs (unit C4). Same grammar as components/primitives/icons.tsx (16-unit\n * box, 1.5 stroke, round caps, currentColor, decorative) so they sit beside\n * the shared set; kept here because the shared set is not this unit's file.\n */\nimport type { ReactNode, SVGProps } from 'react';\n\nexport interface GlyphProps extends Omit<SVGProps<SVGSVGElement>, 'children' | 'viewBox'> {\n size?: number;\n}\n\nfunction Glyph({ size = 16, children, ...rest }: GlyphProps & { children: ReactNode }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}\n strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\" {...rest}>\n {children}\n </svg>\n );\n}\n\nexport function TerminalGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"m4.5 6.25 2 1.75-2 1.75M8.25 10h3\" /></Glyph>;\n}\n\nexport function PreviewGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01\" /></Glyph>;\n}\n\nexport function ChevronDownGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m4.5 6.5 3.5 3.5 3.5-3.5\" /></Glyph>;\n}\n\n/** Screen-reader mode: a speaker with sound lines. */\nexport function ScreenReaderGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.5 6v4h2.5l3.5 3V3L5 6H2.5Z\" /><path d=\"M11 5.5a3.5 3.5 0 0 1 0 5M12.75 3.75a6 6 0 0 1 0 8.5\" /></Glyph>;\n}\n\nexport function ArrowLeftGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M13 8H3.5M7.5 4 3.5 8l4 4\" /></Glyph>;\n}\n\nexport function ArrowRightGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M3 8h9.5M8.5 4l4 4-4 4\" /></Glyph>;\n}\n\nexport function ReloadGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M13 8a5 5 0 1 1-1.46-3.54\" /><path d=\"M13 2.75v2.5h-2.5\" /></Glyph>;\n}\n\nexport function DesktopGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"8.5\" rx=\"1.25\" /><path d=\"M6 13.75h4M8 11.25v2.5\" /></Glyph>;\n}\n\nexport function PhoneGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"4.75\" y=\"1.75\" width=\"6.5\" height=\"12.5\" rx=\"1.5\" /><path d=\"M7.25 12h1.5\" /></Glyph>;\n}\n\nexport function PlayGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M5 3.5v9l7-4.5-7-4.5Z\" /></Glyph>;\n}\n\nexport function FileGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M9 1.75H4.25a1 1 0 0 0-1 1v10.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5.5L9 1.75Z\" /><path d=\"M9 1.75V5.5h3.75\" /></Glyph>;\n}\n\nexport function ServerGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"2.25\" y=\"2.25\" width=\"11.5\" height=\"4.5\" rx=\"1\" /><rect x=\"2.25\" y=\"9.25\" width=\"11.5\" height=\"4.5\" rx=\"1\" /><path d=\"M4.75 4.5h.01M4.75 11.5h.01\" /></Glyph>;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/xterm-B1njb2Cr.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./index-_izD07R9.js";import{D as t,w as n}from"./global-CYfRwH6t.js";import"./VerseShared-CFE5B-IY.js";import{o as r,r as i}from"./terminal-client-DTXAf2-x.js";function a(e,t={}){let n=t.maxBytes??16384,r=new TextEncoder,a=[],o=0,s=null,c=!1,l=()=>{let e=new Uint8Array(o),t=0;for(let n of a)e.set(n,t),t+=n.length;let r=e.subarray(0,Math.min(n,e.length)),i=e.subarray(r.length);return a=i.length>0?[i]:[],o=i.length,r},u=async()=>{for(;!c&&o>0;){let n=l();try{await e(i(n))}catch(e){a=[],o=0,t.onError?.(e)}}s=null},d=e=>{c||e.length===0||(a.push(e),o+=e.length,s||=u())};return{pushText(e){d(r.encode(e))},pushBinary(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;d(t)},idle(){return s??Promise.resolve()},dispose(){c=!0,a=[],o=0}}}function o(e){return Math.min(250*2**e,8e3)}function s(e){let t=``;for(let n of e.split(`
|
|
3
|
+
`))n.startsWith(`data:`)&&(t+=n.slice(n.startsWith(`data: `)?6:5));if(!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(typeof n!=`object`||!n)return null;let r=n;return r.type===`output`&&typeof r.seq==`number`&&typeof r.dataBase64==`string`?{type:`output`,seq:r.seq,dataBase64:r.dataBase64}:r.type===`title`&&typeof r.title==`string`?{type:`title`,title:r.title}:r.type===`exit`?{type:`exit`,code:typeof r.code==`number`?r.code:null,signal:typeof r.signal==`string`?r.signal:null}:null}function c(e,i,a,c={}){let l=c.fetch??((e,t)=>fetch(e,t)),u=c.renew??t,d=c.proof??n,f=c.backoffMs??o,p=!1,m=null,h=null,g=0,_=!1,v=e=>{(!p||e===`closed`)&&a.onState?.(e)},y=()=>{p||(v(`reconnecting`),h=setTimeout(()=>{h=null,b()},f(g++)))};async function b(){if(p)return;m=new AbortController;let t;try{t=await l(r(e,i()),{method:`GET`,credentials:`same-origin`,headers:{"x-ashlr-read-client":d(),Accept:`text/event-stream`},signal:m.signal,cache:`no-store`})}catch{y();return}if(p)return;if(t.status===404){v(`gone`),p=!0;return}if(t.status===401){if(!_&&await u().catch(()=>!1)){_=!0,b();return}v(`expired`),p=!0;return}if(!t.ok||!t.body){y();return}_=!1,v(`open`);let n=t.body.getReader(),o=new TextDecoder,c=``;try{for(;;){let{value:e,done:t}=await n.read();if(t)break;g=0,c+=o.decode(e,{stream:!0});let r;for(;(r=c.indexOf(`
|
|
4
|
+
|
|
5
|
+
`))!==-1;){let e=c.slice(0,r);c=c.slice(r+2);let t=s(e);t&&!p&&a.onFrame(t)}}}catch{}y()}return v(`connecting`),b(),{close(){p||(p=!0,h&&clearTimeout(h),m?.abort(),a.onState?.(`closed`))}}}var l=5e3,u=null;function d(){return u||(u=Promise.all([e(()=>import(`./xterm-ScmBfeDI.js`),[]),e(()=>import(`./addon-fit-DIOBYJe3.js`),[]),e(()=>Promise.resolve({}),__vite__mapDeps([0]))]).then(([e,t])=>[e,t]),u.catch(()=>{u=null})),u}var f=async e=>{let[{Terminal:t},{FitAddon:n}]=await d(),r=new t({fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:1.2,cursorBlink:!0,cursorStyle:`bar`,scrollback:l,theme:e.theme,screenReaderMode:e.screenReaderMode,macOptionIsMeta:!0,minimumContrastRatio:3,allowProposedApi:!1}),i=new n;r.loadAddon(i);let a=!1;return{get cols(){return r.cols},get rows(){return r.rows},open(e){a||(a=!0,r.open(e))},write(e){r.write(e)},reset(){r.reset()},focus(){r.focus()},fit(){let e=i.proposeDimensions();return!e||!Number.isFinite(e.cols)||!Number.isFinite(e.rows)||e.cols<2||e.rows<2?null:(i.fit(),{cols:r.cols,rows:r.rows})},onData:e=>r.onData(e),onBinary:e=>r.onBinary(e),onSelectionChange:e=>r.onSelectionChange(e),hasSelection:()=>r.hasSelection(),getSelection:()=>r.getSelection(),paste(e){r.paste(e)},bracketedPaste:()=>r.modes.bracketedPasteMode,setTheme(e){r.options.theme=e},setScreenReaderMode(e){r.options.screenReaderMode=e},setKeyFilter(e){r.attachCustomKeyEventHandler(e)},dispose(){r.dispose()}}},p={foreground:`--term-fg`,background:`--term-bg`,cursor:`--term-cursor`,cursorAccent:`--term-bg`,selectionBackground:`--term-selection`,selectionForeground:`--term-fg`,selectionInactiveBackground:`--term-selection-inactive`,scrollbarSliderBackground:`--term-scrollbar`,scrollbarSliderHoverBackground:`--term-scrollbar-hover`,scrollbarSliderActiveBackground:`--term-scrollbar-hover`,overviewRulerBorder:`--term-bg`,black:`--term-black`,red:`--term-red`,green:`--term-green`,yellow:`--term-yellow`,blue:`--term-blue`,magenta:`--term-magenta`,cyan:`--term-cyan`,white:`--term-white`,brightBlack:`--term-bright-black`,brightRed:`--term-bright-red`,brightGreen:`--term-bright-green`,brightYellow:`--term-bright-yellow`,brightBlue:`--term-bright-blue`,brightMagenta:`--term-bright-magenta`,brightCyan:`--term-bright-cyan`,brightWhite:`--term-bright-white`},m;function h(e){if(typeof document>`u`)return e;if(m===void 0)try{let e=document.createElement(`canvas`);e.width=1,e.height=1,m=e.getContext(`2d`,{willReadFrequently:!0})}catch{m=null}let t=m;if(!t)return e;try{t.clearRect(0,0,1,1),t.fillStyle=e,t.fillRect(0,0,1,1);let[n,r,i,a]=t.getImageData(0,0,1,1).data;return a===void 0?e:a===255?`rgb(${n}, ${r}, ${i})`:`rgba(${n}, ${r}, ${i}, ${(a/255).toFixed(3)})`}catch{return e}}function g(e){let t=document.createElement(`span`);t.style.display=`none`,e.appendChild(t);let n={};try{for(let[r,i]of Object.entries(p)){if(!getComputedStyle(e).getPropertyValue(i).trim())continue;t.style.color=``,t.style.color=`var(${i})`;let a=getComputedStyle(t).color;a&&(n[r]=h(a))}}finally{t.remove()}return n}function _(e){let t=getComputedStyle(e),n=Number.parseFloat(t.fontSize);return{fontFamily:t.fontFamily||`ui-monospace, Menlo, monospace`,fontSize:Number.isFinite(n)&&n>=11?n:13}}function v(e){if(typeof window>`u`)return()=>{};let t=document.documentElement,n=typeof MutationObserver==`function`?new MutationObserver(()=>e()):null;n?.observe(t,{attributes:!0,attributeFilter:[`data-theme`,`data-accent`,`class`,`style`]});let r=typeof window.matchMedia==`function`?window.matchMedia(`(prefers-color-scheme: dark)`):null,i=()=>e();return r?.addEventListener?.(`change`,i),()=>{n?.disconnect(),r?.removeEventListener?.(`change`,i)}}export{c as a,v as i,_ as n,s as o,g as r,a as s,f as t};
|
|
6
|
+
//# sourceMappingURL=terminal-view-CksH3CsK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/input-queue.ts","../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-stream.ts","../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-view.ts"],"sourcesContent":["/**\n * dock/terminal/input-queue.ts — keystrokes to the shell, in order (unit C4).\n *\n * Every keystroke is a POST. Two POSTs in flight at once may arrive in either\n * order, and a shell that receives `sl` for `ls` runs the wrong command. So\n * input is SINGLE-FLIGHT: while one request is out, everything typed after it\n * accumulates and goes as the next request — in order, and coalesced (a burst\n * of typing or a paste becomes one or a few requests, not hundreds). The\n * server takes at most 16 KB per request, so a long paste is sent in 16 KB\n * slices, one after another.\n */\nimport { VERSE_TERMINAL_INPUT_MAX_BYTES } from '../../../../../core/verse/workbench-types.js';\nimport { bytesToBase64 } from './terminal-client.js';\n\nexport interface InputQueue {\n /** Text as xterm reports it (a JS string — encoded as UTF-8). */\n pushText(text: string): void;\n /** xterm `onBinary` data: one char per byte (0–255). */\n pushBinary(binary: string): void;\n /** Resolves once everything pushed so far has been sent (or dropped on error). */\n idle(): Promise<void>;\n /** Stop sending; anything queued is dropped. */\n dispose(): void;\n}\n\nexport function createInputQueue(\n send: (dataBase64: string) => Promise<void>,\n opts: { maxBytes?: number; onError?: (err: unknown) => void } = {},\n): InputQueue {\n const maxBytes = opts.maxBytes ?? VERSE_TERMINAL_INPUT_MAX_BYTES;\n const encoder = new TextEncoder();\n let pending: Uint8Array[] = [];\n let pendingBytes = 0;\n let running: Promise<void> | null = null;\n let disposed = false;\n\n const take = (): Uint8Array => {\n const all = new Uint8Array(pendingBytes);\n let offset = 0;\n for (const chunk of pending) {\n all.set(chunk, offset);\n offset += chunk.length;\n }\n const head = all.subarray(0, Math.min(maxBytes, all.length));\n const rest = all.subarray(head.length);\n pending = rest.length > 0 ? [rest] : [];\n pendingBytes = rest.length;\n return head;\n };\n\n const pump = async (): Promise<void> => {\n while (!disposed && pendingBytes > 0) {\n const slice = take();\n try {\n await send(bytesToBase64(slice));\n } catch (err) {\n // A failed keystroke is not retried: replaying it later, after newer\n // input, is exactly the reordering this queue exists to prevent.\n pending = [];\n pendingBytes = 0;\n opts.onError?.(err);\n }\n }\n running = null;\n };\n\n const push = (bytes: Uint8Array): void => {\n if (disposed || bytes.length === 0) return;\n pending.push(bytes);\n pendingBytes += bytes.length;\n if (!running) running = pump();\n };\n\n return {\n pushText(text) {\n push(encoder.encode(text));\n },\n pushBinary(binary) {\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i) & 0xff;\n push(bytes);\n },\n idle() {\n return running ?? Promise.resolve();\n },\n dispose() {\n disposed = true;\n pending = [];\n pendingBytes = 0;\n },\n };\n}\n","/**\n * dock/terminal/terminal-stream.ts — one terminal tab's live output (unit C4).\n *\n * WHY fetch() AND NOT EventSource. The server's read boundary accepts the\n * per-tab client proof as a query parameter ONLY on the three EventSource\n * paths it knows (read-session.ts); everywhere else it must be the\n * `x-ashlr-read-client` header, which EventSource cannot send. fetch() can,\n * and a streamed body reads the same `text/event-stream` frames. It also\n * lets the pane keep exactly ONE connection open — the visible tab's — which\n * matters because a browser allows about six per origin and Verse already\n * holds two (the app events and the open chat).\n *\n * RESUME. Each (re)connect asks for `?after=<the last seq written>`; the\n * server replays only newer frames from its 256 KB scrollback. A dropped\n * connection reconnects with backoff; a 401 renews the read session once;\n * a 404 means the tab is gone (killed, idle-closed, server restarted).\n */\nimport type { VerseTerminalFrame } from '../../../../data/api-types.js';\nimport { getReadClientProof, renewReadSession } from '../../../../data/auth-store.js';\nimport { terminalStreamPath } from './terminal-client.js';\n\nexport type TerminalStreamState = 'connecting' | 'open' | 'reconnecting' | 'gone' | 'expired' | 'closed';\n\nexport interface TerminalStreamHandlers {\n onFrame: (frame: VerseTerminalFrame) => void;\n onState?: (state: TerminalStreamState) => void;\n}\n\nexport interface TerminalStreamDeps {\n fetch?: typeof fetch;\n renew?: () => Promise<boolean>;\n proof?: () => string;\n /** Backoff before reconnect attempt `n` (0-based). */\n backoffMs?: (attempt: number) => number;\n}\n\nexport interface TerminalStream {\n close(): void;\n}\n\nfunction defaultBackoff(attempt: number): number {\n return Math.min(250 * 2 ** attempt, 8_000);\n}\n\n/** Parse one SSE block (`event:` / `data:` lines) into a frame; null for comments and junk. */\nexport function parseTerminalSseBlock(block: string): VerseTerminalFrame | null {\n let data = '';\n for (const line of block.split('\\n')) {\n if (line.startsWith('data:')) data += line.slice(line.startsWith('data: ') ? 6 : 5);\n }\n if (!data) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n if (parsed === null || typeof parsed !== 'object') return null;\n const frame = parsed as Record<string, unknown>;\n if (frame['type'] === 'output' && typeof frame['seq'] === 'number' && typeof frame['dataBase64'] === 'string') {\n return { type: 'output', seq: frame['seq'], dataBase64: frame['dataBase64'] };\n }\n if (frame['type'] === 'title' && typeof frame['title'] === 'string') return { type: 'title', title: frame['title'] };\n if (frame['type'] === 'exit') {\n return {\n type: 'exit',\n code: typeof frame['code'] === 'number' ? frame['code'] : null,\n signal: typeof frame['signal'] === 'string' ? frame['signal'] : null,\n };\n }\n return null;\n}\n\n/**\n * Stream `tabId`'s frames, resuming after `after()` on every (re)connect.\n * Returns a handle whose close() aborts the request and stops reconnecting.\n */\nexport function openTerminalStream(\n tabId: string,\n after: () => number,\n handlers: TerminalStreamHandlers,\n deps: TerminalStreamDeps = {},\n): TerminalStream {\n const doFetch = deps.fetch ?? ((input: RequestInfo | URL, init?: RequestInit) => fetch(input, init));\n const renew = deps.renew ?? renewReadSession;\n const proof = deps.proof ?? getReadClientProof;\n const backoff = deps.backoffMs ?? defaultBackoff;\n let closed = false;\n let controller: AbortController | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempt = 0;\n let renewedOnce = false;\n\n const setState = (state: TerminalStreamState): void => {\n if (!closed || state === 'closed') handlers.onState?.(state);\n };\n\n const schedule = (): void => {\n if (closed) return;\n setState('reconnecting');\n timer = setTimeout(() => {\n timer = null;\n void connect();\n }, backoff(attempt++));\n };\n\n async function connect(): Promise<void> {\n if (closed) return;\n controller = new AbortController();\n let res: Response;\n try {\n res = await doFetch(terminalStreamPath(tabId, after()), {\n method: 'GET',\n credentials: 'same-origin',\n headers: { 'x-ashlr-read-client': proof(), Accept: 'text/event-stream' },\n signal: controller.signal,\n cache: 'no-store',\n });\n } catch {\n schedule();\n return;\n }\n if (closed) return;\n if (res.status === 404) {\n setState('gone');\n closed = true;\n return;\n }\n if (res.status === 401) {\n if (!renewedOnce && (await renew().catch(() => false))) {\n renewedOnce = true;\n void connect();\n return;\n }\n setState('expired');\n closed = true;\n return;\n }\n if (!res.ok || !res.body) {\n schedule();\n return;\n }\n renewedOnce = false;\n setState('open');\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n attempt = 0;\n buffer += decoder.decode(value, { stream: true });\n let idx: number;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n const frame = parseTerminalSseBlock(block);\n if (frame && !closed) handlers.onFrame(frame);\n }\n }\n } catch {\n /* aborted, or the connection dropped: reconnect below unless closed */\n }\n // The server ends the stream when the tab is removed; the next connect\n // then answers 404 and reports 'gone'.\n schedule();\n }\n\n setState('connecting');\n void connect();\n\n return {\n close() {\n if (closed) return;\n closed = true;\n if (timer) clearTimeout(timer);\n controller?.abort();\n handlers.onState?.('closed');\n },\n };\n}\n","/**\n * dock/terminal/terminal-view.ts — the one seam between the Terminal pane and\n * xterm.js (unit C4).\n *\n * LAZY. `@xterm/xterm` (≈ 345 KB minified) and its stylesheet load only when\n * a terminal is first shown, as their own chunk — never on the chat's\n * critical path (SPEC-310C budget: chat critical JS ≤ 350 KB). The pane talks\n * to a small `TerminalView` interface, so tests inject a fake (jsdom has no\n * layout or canvas for xterm) and the pane never imports xterm itself.\n *\n * THEME FROM TOKENS. xterm wants concrete colours; the design system forbids\n * raw hex in new UI files and wants every colour to follow the theme. So the\n * palette is declared as CSS custom properties on the pane\n * (TerminalPane.module.css, mapped to design tokens for both themes) and\n * resolved here at runtime — a probe element turns `var(--x)` into a computed\n * colour, a 1×1 canvas normalises any colour syntax to rgb — and re-resolved\n * when the theme changes.\n */\nimport type { ITheme, Terminal as XtermTerminal } from '@xterm/xterm';\n\nexport interface TerminalViewDisposable {\n dispose(): void;\n}\n\nexport interface TerminalView {\n readonly cols: number;\n readonly rows: number;\n open(host: HTMLElement): void;\n write(data: Uint8Array): void;\n reset(): void;\n focus(): void;\n /** Fit to the host; returns the new size (or null when the host has no size — hidden). */\n fit(): { cols: number; rows: number } | null;\n onData(cb: (data: string) => void): TerminalViewDisposable;\n onBinary(cb: (data: string) => void): TerminalViewDisposable;\n onSelectionChange(cb: () => void): TerminalViewDisposable;\n hasSelection(): boolean;\n getSelection(): string;\n /** Paste as if typed (bracketed when the program asked for it). Never adds Enter. */\n paste(text: string): void;\n /** True while the program in the terminal has bracketed paste on (shells at a prompt do). */\n bracketedPaste(): boolean;\n setTheme(theme: TerminalTheme): void;\n setScreenReaderMode(on: boolean): void;\n /** Return false from `filter` to let a key pass to the page (app shortcuts). */\n setKeyFilter(filter: (event: KeyboardEvent) => boolean): void;\n dispose(): void;\n}\n\nexport type TerminalTheme = ITheme;\n\nexport interface TerminalViewOptions {\n fontFamily: string;\n fontSize: number;\n theme: TerminalTheme;\n screenReaderMode: boolean;\n}\n\nexport type TerminalViewFactory = (opts: TerminalViewOptions) => Promise<TerminalView>;\n\n/** Scrollback kept by the VIEW (lines). The server keeps its own 256 KB for reattach. */\nconst VIEW_SCROLLBACK_LINES = 5_000;\n\nlet xtermModules: Promise<[typeof import('@xterm/xterm'), typeof import('@xterm/addon-fit')]> | null = null;\n\nfunction loadXtermModules() {\n if (!xtermModules) {\n xtermModules = Promise.all([\n import('@xterm/xterm'),\n import('@xterm/addon-fit'),\n import('@xterm/xterm/css/xterm.css'),\n ]).then(([xterm, fit]) => [xterm, fit] as [typeof import('@xterm/xterm'), typeof import('@xterm/addon-fit')]);\n // A failed chunk load must be retryable (the pane offers \"Try again\").\n xtermModules.catch(() => { xtermModules = null; });\n }\n return xtermModules;\n}\n\n/** The real xterm.js view. */\nexport const createXtermView: TerminalViewFactory = async (opts) => {\n const [{ Terminal }, { FitAddon }] = await loadXtermModules();\n const term: XtermTerminal = new Terminal({\n fontFamily: opts.fontFamily,\n fontSize: opts.fontSize,\n lineHeight: 1.2,\n cursorBlink: true,\n cursorStyle: 'bar',\n scrollback: VIEW_SCROLLBACK_LINES,\n theme: opts.theme,\n screenReaderMode: opts.screenReaderMode,\n // ⌥ as Meta: word motions (⌥←/⌥→ → ESC b / ESC f) work as in Terminal.app\n // with \"Use Option as Meta key\".\n macOptionIsMeta: true,\n // Keep dim ANSI text legible on our surfaces in both themes.\n minimumContrastRatio: 3,\n allowProposedApi: false,\n });\n const fit = new FitAddon();\n term.loadAddon(fit);\n let opened = false;\n\n return {\n get cols() { return term.cols; },\n get rows() { return term.rows; },\n open(host) {\n if (opened) return;\n opened = true;\n term.open(host);\n },\n write(data) { term.write(data); },\n reset() { term.reset(); },\n focus() { term.focus(); },\n fit() {\n const dims = fit.proposeDimensions();\n if (!dims || !Number.isFinite(dims.cols) || !Number.isFinite(dims.rows) || dims.cols < 2 || dims.rows < 2) return null;\n fit.fit();\n return { cols: term.cols, rows: term.rows };\n },\n onData: (cb) => term.onData(cb),\n onBinary: (cb) => term.onBinary(cb),\n onSelectionChange: (cb) => term.onSelectionChange(cb),\n hasSelection: () => term.hasSelection(),\n getSelection: () => term.getSelection(),\n paste(text) { term.paste(text); },\n bracketedPaste: () => term.modes.bracketedPasteMode,\n setTheme(theme) { term.options.theme = theme; },\n setScreenReaderMode(on) { term.options.screenReaderMode = on; },\n setKeyFilter(filter) { term.attachCustomKeyEventHandler(filter); },\n dispose() { term.dispose(); },\n };\n};\n\n// ---------------------------------------------------------------------------\n// Theme resolution\n// ---------------------------------------------------------------------------\n\n/** ITheme key → the custom property TerminalPane.module.css declares for it. */\nexport const TERMINAL_THEME_VARS: Readonly<Record<keyof Omit<ITheme, 'extendedAnsi'>, string>> = {\n foreground: '--term-fg',\n background: '--term-bg',\n cursor: '--term-cursor',\n cursorAccent: '--term-bg',\n selectionBackground: '--term-selection',\n selectionForeground: '--term-fg',\n selectionInactiveBackground: '--term-selection-inactive',\n scrollbarSliderBackground: '--term-scrollbar',\n scrollbarSliderHoverBackground: '--term-scrollbar-hover',\n scrollbarSliderActiveBackground: '--term-scrollbar-hover',\n overviewRulerBorder: '--term-bg',\n black: '--term-black',\n red: '--term-red',\n green: '--term-green',\n yellow: '--term-yellow',\n blue: '--term-blue',\n magenta: '--term-magenta',\n cyan: '--term-cyan',\n white: '--term-white',\n brightBlack: '--term-bright-black',\n brightRed: '--term-bright-red',\n brightGreen: '--term-bright-green',\n brightYellow: '--term-bright-yellow',\n brightBlue: '--term-bright-blue',\n brightMagenta: '--term-bright-magenta',\n brightCyan: '--term-bright-cyan',\n brightWhite: '--term-bright-white',\n};\n\nlet canvasCtx: CanvasRenderingContext2D | null | undefined;\n\n/**\n * Any CSS colour → `rgb(r, g, b)` / `rgba(…)`, by painting one pixel. Canvas\n * accepts every syntax the browser does (hsl, color-mix, oklch) and the pixel\n * is plain sRGB, which is what xterm parses. Falls back to the input.\n */\nexport function normalizeCssColor(value: string): string {\n if (typeof document === 'undefined') return value;\n if (canvasCtx === undefined) {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n canvasCtx = canvas.getContext('2d', { willReadFrequently: true });\n } catch {\n canvasCtx = null;\n }\n }\n const ctx = canvasCtx;\n if (!ctx) return value;\n try {\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === undefined) return value;\n return a === 255 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${(a! / 255).toFixed(3)})`;\n } catch {\n return value;\n }\n}\n\n/**\n * Read the pane's `--term-*` properties as concrete colours. A probe child\n * with `color: var(--x)` makes the browser resolve every var() and\n * color-mix() for us; unset properties are left out (xterm keeps its default).\n */\nexport function resolveTerminalTheme(host: HTMLElement): TerminalTheme {\n const probe = document.createElement('span');\n probe.style.display = 'none';\n host.appendChild(probe);\n const theme: Record<string, string> = {};\n try {\n for (const [key, prop] of Object.entries(TERMINAL_THEME_VARS)) {\n const declared = getComputedStyle(host).getPropertyValue(prop).trim();\n if (!declared) continue;\n probe.style.color = '';\n probe.style.color = `var(${prop})`;\n const computed = getComputedStyle(probe).color;\n if (computed) theme[key] = normalizeCssColor(computed);\n }\n } finally {\n probe.remove();\n }\n return theme as TerminalTheme;\n}\n\n/** The host's computed monospace family and size (so the display-size setting reaches the terminal). */\nexport function resolveTerminalFont(host: HTMLElement): { fontFamily: string; fontSize: number } {\n const style = getComputedStyle(host);\n const size = Number.parseFloat(style.fontSize);\n return {\n fontFamily: style.fontFamily || 'ui-monospace, Menlo, monospace',\n fontSize: Number.isFinite(size) && size >= 11 ? size : 13,\n };\n}\n\n/** Call `onChange` when the effective colour theme changes (explicit toggle or OS appearance). */\nexport function watchThemeChanges(onChange: () => void): () => void {\n if (typeof window === 'undefined') return () => {};\n const root = document.documentElement;\n const observer = typeof MutationObserver === 'function'\n ? new MutationObserver(() => onChange())\n : null;\n observer?.observe(root, { attributes: true, attributeFilter: ['data-theme', 'data-accent', 'class', 'style'] });\n const media = typeof window.matchMedia === 'function' ? window.matchMedia('(prefers-color-scheme: dark)') : null;\n const onMedia = () => onChange();\n media?.addEventListener?.('change', onMedia);\n return () => {\n observer?.disconnect();\n media?.removeEventListener?.('change', onMedia);\n };\n}\n"],"file":"terminal-view-CksH3CsK.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{C as e,M as t,V as n,a as r,i,r as a}from"./global-CYfRwH6t.js";import{O as o}from"./VerseShared-CFE5B-IY.js";import{n as s}from"./control-queries-C5uQTzJi.js";import{n as c,u as l}from"./surface-data-NFl_uS--.js";import{a as u,i as d,n as f,o as p,r as m,s as h}from"./leader-thread-types-CDb-VPPO.js";function g(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var _=e=>typeof e==`string`&&e.length>0?e:null;function v(e){if(!g(e))return null;let{id:t,at:n,from:r,channel:i,kind:a,text:o}=e;if(typeof t!=`string`||t.length===0||typeof n!=`string`||!Number.isFinite(Date.parse(n))||r!==`mason`&&r!==`leader`||typeof o!=`string`)return null;let s={id:t,at:n,from:r,channel:f.includes(i)?i:`verse`,kind:m.includes(a)?a:`message`,text:o},c=_(e.replyTo),l=_(e.memoId),u=_(e.questionId);c&&(s.replyTo=c),l&&(s.memoId=l),u&&(s.questionId=u);let d=Array.isArray(e.actionIds)?e.actionIds.filter(e=>typeof e==`string`&&e.length>0):[];d.length&&(s.actionIds=d);let p=e.delivery;if(g(p)){let e=p.telegram;(e===`pending`||e===`sent`||e===`failed`)&&(s.delivery={telegram:e,..._(p.sentAt)?{sentAt:p.sentAt}:{}})}return s}function y(e){let t=Array.isArray(e)?e:g(e)&&Array.isArray(e.messages)?e.messages:null;return t?{messages:t.flatMap(e=>v(e)??[])}:null}function b(e){if(!g(e))return null;let{id:t,text:n}=e;if(typeof t!=`string`||t.length===0||typeof n!=`string`||n.trim().length===0||_(e.retiredAt)!==null)return null;let r=f.includes(e.channel)?e.channel:null;return{id:t,text:n.trim(),createdAt:_(e.createdAt),channel:r}}function x(e){let t=g(e)&&Array.isArray(e.directives)?e.directives:null;return t?t.flatMap(e=>b(e)??[]).sort((e,t)=>(Date.parse(e.createdAt??``)||0)-(Date.parse(t.createdAt??``)||0)):null}function S(e){if(!g(e))return null;let t=v(e.message);return t?{message:t,reply:v(e.reply),directive:b(e.directive)}:null}var C=12e4,w=e=>e.replace(/\s+/g,` `).trim();function T(e,t){return e.from!==`mason`||w(e.text)!==w(t.text)||t.kind===`answer`&&t.questionId&&e.questionId&&e.questionId!==t.questionId?!1:Date.parse(e.at)>=Date.parse(t.at)-C}var E=(e,t)=>Date.parse(e.at)-Date.parse(t.at)||0;function D(e,t=[],n=[]){let r=new Map;for(let e of t)r.set(e.id,e);for(let t of e)for(let e of t)r.set(e.id,e);let i=[...r.values()],a=new Set,o=[];for(let e of n){let t=e.state===`sending`?i.find(t=>!a.has(t.id)&&T(t,e)):void 0;t?a.add(t.id):o.push(e)}return[...i.map(e=>({type:`message`,key:e.id,at:e.at,message:e})),...o.map(e=>({type:`pending`,key:e.clientId,at:e.at,pending:e}))].map((e,t)=>({e,i:t})).sort((e,t)=>E(e.e,t.e)||e.i-t.i).map(({e})=>e)}function O(e){return e.type===`pending`?`mason`:e.message.from}function k(e){return e.type===`pending`?`verse`:e.message.channel}function A(e){return e.type===`message`&&(e.message.kind===`memo`||e.message.kind===`directive`)}function j(e){let t=new Date(e);return`${t.getFullYear()}-${t.getMonth()}-${t.getDate()}`}function M(e,t=Date.now()){let n=Date.parse(e);if(!Number.isFinite(n))return`—`;if(j(n)===j(t))return`Today`;if(j(n)===j(t-864e5))return`Yesterday`;let r=new Date(n),i=r.getFullYear()===new Date(t).getFullYear();return r.toLocaleDateString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`,...i?{}:{year:`numeric`}})}function N(e,t=Date.now()){let n=[],r=null,i=null,a=0;for(let o of e){let e=Date.parse(o.at),s=j(e);if(s!==r&&(r=s,n.push({type:`day`,key:`day-${s}`,label:M(o.at,t)}),i=null),o.type===`message`&&o.message.channel===`system`){n.push({type:`system`,key:o.key,entry:o}),i=null;continue}let c=O(o),l=k(o);i!==null&&!A(o)&&!A(i.entries[i.entries.length-1])&&i.from===c&&i.channel===l&&e-a<=3e5&&i?i.entries.push(o):(i={type:`group`,key:`g-${o.key}`,from:c,channel:l,at:o.at,entries:[o]},n.push(i)),a=e}return n}function P(e){let t=e.filter(e=>e.kind===`question`),n=new Map;for(let r of e){if(r.from!==`mason`||r.kind!==`answer`&&!r.replyTo)continue;let e=t.find(e=>r.questionId&&e.questionId===r.questionId||r.replyTo&&e.id===r.replyTo);e&&!n.has(e.id)&&n.set(e.id,r)}return n}function F(e,t){return t.questionId?e.find(e=>e.kind===`question`&&e.questionId===t.questionId)??null:null}var I=18e4;function L(e,t,n=Date.now()){if(e.some(e=>e.type===`pending`&&e.pending.state===`sending`))return!0;for(let r=e.length-1;r>=0;--r){let i=e[r];if(i.type===`message`&&i.message.channel!==`system`){if(i.message.from===`leader`)return!1;if(t.has(i.message.id))return n-Date.parse(i.message.at)<I}}return!1}var R={verse:`Verse`,telegram:`Telegram`,cli:`CLI`,system:`System`};function z(e){let t=null;for(let n of e)n.from===`leader`&&n.channel!==`system`&&(!t||Date.parse(n.at)>=Date.parse(t.at))&&(t=n);return t}function B(e,t=140){let n=e.replace(/```[\s\S]*?(```|$)/g,` `).replace(/!?\[([^\]]*)\]\([^)]*\)/g,`$1`).replace(/^\s{0,3}(#{1,6}|>|[-*+]|\d+\.)\s+/gm,``).replace(/[*_`~]+/g,``).replace(/\s+/g,` `).trim();if(n.length<=t)return n;let r=n.slice(0,t-1),i=r.lastIndexOf(` `);return`${(i>t*.6?r.slice(0,i):r).replace(/[\s,.;:–—-]+$/,``)}…`}function V(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`}):``}var H=4e3,U=Object.freeze({thread:`verse-leader-thread`,directives:`verse-leader-directives`}),W=l(U.thread,`${h}?limit=50`,`The Leader conversation`,y),G=l(U.directives,u,`Leader directives`,x);async function K(e,t){return y(await i(`${h}?limit=50&before=${encodeURIComponent(e)}`,t))?.messages??[]}function q(e){return encodeURIComponent(e).replace(/%3A/gi,`:`)}function J(){let t=e();if(!t)throw new s;return t}async function Y(e,n){let i=await r(e,n,J());return t(),i}async function X(e,t=null){let r=S(await Y(h,t?{text:e,replyTo:t}:{text:e}));return r?.directive&&n(U.directives),r}async function Z(e,t){let n=S(await Y(`${p}/${q(e)}/answer`,{text:t}));return o(),n}async function Q(e){let t=await Y(`${d}/${q(e)}/approve`,{});return n(c.leader),n(U.thread),o(),t}async function $(e){let t=await Y(u,{text:e});return n(U.directives),n(U.thread),b(typeof t==`object`&&t&&`directive`in t?t.directive:t)}async function ee(e){await a(`${u}/${q(e)}`,J()),t(),n(U.directives),n(U.thread)}export{D as _,G as a,X as c,P as d,L as f,z as g,N as h,K as i,R as l,F as m,Z as n,W as o,V as p,Q as r,ee as s,$ as t,H as u,B as v};
|
|
2
|
+
//# sourceMappingURL=thread-data-C8z55msn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-data-C8z55msn.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/leader/thread-model.ts","../../../../../../src/web-ui/routes/verse/leader/thread-data.ts"],"sourcesContent":["/**\n * routes/verse/leader/thread-model.ts — pure helpers behind the Leader\n * conversation on Mind (and its one-line preview on Command).\n *\n * narrow* every body the page reads, checked field by field: a\n * message the page cannot read is dropped, never guessed;\n * mergeThread server pages + replies this tab already received + the\n * optimistic sends still in flight, in time order, each\n * message once (an optimistic send disappears as soon as its\n * server copy is in any of the lists);\n * groupThread day separators and runs of consecutive messages from one\n * sender on one channel (Linear-style: one header per run);\n * questions which question messages are answered, and which one a\n * Needs-you item means;\n * awaitingReply \"Leader is thinking…\" — honest: only for a message THIS\n * tab sent that the server said it would answer later.\n *\n * Framework-free; tested directly (thread-model.test.ts).\n */\nimport {\n LEADER_THREAD_CHANNELS,\n LEADER_THREAD_KINDS,\n type LeaderSendResult,\n type LeaderThreadChannel,\n type LeaderThreadKind,\n type LeaderThreadMessage,\n type LeaderThreadPage,\n type DirectiveChip,\n} from './thread-types.js';\n\n// ---------------------------------------------------------------------------\n// Narrowing\n// ---------------------------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst optString = (v: unknown): string | null => (typeof v === 'string' && v.length > 0 ? v : null);\n\n/** One message, or null when a required field is missing or out of vocabulary. */\nexport function narrowMessage(raw: unknown): LeaderThreadMessage | null {\n if (!isRecord(raw)) return null;\n const { id, at, from, channel, kind, text } = raw;\n if (typeof id !== 'string' || id.length === 0) return null;\n if (typeof at !== 'string' || !Number.isFinite(Date.parse(at))) return null;\n if (from !== 'mason' && from !== 'leader') return null;\n if (typeof text !== 'string') return null;\n // An unknown channel or kind from a newer server still reads as a message.\n const ch = LEADER_THREAD_CHANNELS.includes(channel as LeaderThreadChannel) ? (channel as LeaderThreadChannel) : 'verse';\n const k = LEADER_THREAD_KINDS.includes(kind as LeaderThreadKind) ? (kind as LeaderThreadKind) : 'message';\n const out: LeaderThreadMessage = { id, at, from, channel: ch, kind: k, text };\n // Optional fields are present only when the server sent a usable value.\n const replyTo = optString(raw['replyTo']);\n const memoId = optString(raw['memoId']);\n const questionId = optString(raw['questionId']);\n if (replyTo) out.replyTo = replyTo;\n if (memoId) out.memoId = memoId;\n if (questionId) out.questionId = questionId;\n const actionIds = Array.isArray(raw['actionIds']) ? raw['actionIds'].filter((a): a is string => typeof a === 'string' && a.length > 0) : [];\n if (actionIds.length) out.actionIds = actionIds;\n const delivery = raw['delivery'];\n if (isRecord(delivery)) {\n const telegram = delivery['telegram'];\n if (telegram === 'pending' || telegram === 'sent' || telegram === 'failed') {\n out.delivery = { telegram, ...(optString(delivery['sentAt']) ? { sentAt: delivery['sentAt'] as string } : {}) };\n }\n }\n return out;\n}\n\n/** `{ messages: [...] }` (or a bare array); null when neither. Unreadable messages are dropped. */\nexport function narrowThreadPage(raw: unknown): LeaderThreadPage | null {\n const list = Array.isArray(raw) ? raw : isRecord(raw) && Array.isArray(raw['messages']) ? raw['messages'] : null;\n if (!list) return null;\n return { messages: list.flatMap((m) => narrowMessage(m) ?? []) };\n}\n\n/** An OperatorDirective in force, as a chip; null when unreadable or retired (`retiredAt` set). */\nexport function narrowDirective(raw: unknown): DirectiveChip | null {\n if (!isRecord(raw)) return null;\n const { id, text } = raw;\n if (typeof id !== 'string' || id.length === 0 || typeof text !== 'string' || text.trim().length === 0) return null;\n // A retired directive is history, not a chip.\n if (optString(raw['retiredAt']) !== null) return null;\n const channel = LEADER_THREAD_CHANNELS.includes(raw['channel'] as LeaderThreadChannel) ? (raw['channel'] as LeaderThreadChannel) : null;\n return { id, text: text.trim(), createdAt: optString(raw['createdAt']), channel };\n}\n\n/** GET /directives `{ directives, retired }` → the ones in force, oldest first (`retired` is history). */\nexport function narrowDirectives(raw: unknown): DirectiveChip[] | null {\n const list = isRecord(raw) && Array.isArray(raw['directives']) ? raw['directives'] : null;\n if (!list) return null;\n const out = list.flatMap((d) => narrowDirective(d) ?? []);\n return out.sort((a, b) => (Date.parse(a.createdAt ?? '') || 0) - (Date.parse(b.createdAt ?? '') || 0));\n}\n\nexport function narrowSendResult(raw: unknown): LeaderSendResult | null {\n if (!isRecord(raw)) return null;\n const message = narrowMessage(raw['message']);\n if (!message) return null;\n return { message, reply: narrowMessage(raw['reply']), directive: narrowDirective(raw['directive']) };\n}\n\n/**\n * POST /actions/<id>/approve → the approval's thread messages (Mason's\n * approval and the Leader's acknowledgement), readable ones only.\n */\nexport function narrowApprovalThread(raw: unknown): LeaderThreadMessage[] {\n if (!isRecord(raw) || !isRecord(raw['thread'])) return [];\n const t = raw['thread'];\n return [narrowMessage(t['message']), narrowMessage(t['reply'])].filter((m): m is LeaderThreadMessage => m !== null);\n}\n\n// ---------------------------------------------------------------------------\n// Optimistic sends and the merge\n// ---------------------------------------------------------------------------\n\nexport interface PendingMessage {\n /** Local id (\"local-3\"); never a server id. */\n clientId: string;\n kind: 'message' | 'answer';\n text: string;\n /** Local ISO time the send started. */\n at: string;\n replyTo: string | null;\n /** For an answer: the question it answers. */\n questionId: string | null;\n state: 'sending' | 'failed';\n /** Operator sentence for a failed send. */\n error: string | null;\n}\n\nexport type ThreadEntry =\n | { type: 'message'; key: string; at: string; message: LeaderThreadMessage }\n | { type: 'pending'; key: string; at: string; pending: PendingMessage };\n\n/**\n * A server message that is the delivered copy of an optimistic send: from\n * Mason, the same words, not older than the send (allowing CLOCK_SLACK_MS\n * for a server clock a little behind this tab's).\n */\nconst CLOCK_SLACK_MS = 2 * 60_000;\nconst norm = (t: string) => t.replace(/\\s+/g, ' ').trim();\n\nfunction isCopyOf(m: LeaderThreadMessage, p: PendingMessage): boolean {\n if (m.from !== 'mason') return false;\n if (norm(m.text) !== norm(p.text)) return false;\n if (p.kind === 'answer' && p.questionId && m.questionId && m.questionId !== p.questionId) return false;\n return Date.parse(m.at) >= Date.parse(p.at) - CLOCK_SLACK_MS;\n}\n\nconst byTime = (a: { at: string; key: string }, b: { at: string; key: string }) => Date.parse(a.at) - Date.parse(b.at) || 0;\n\n/**\n * Everything known, oldest first, each message once. `pages` are server\n * reads (newest page first or last — order does not matter); `received` are\n * messages this tab got back from a send (its own message and the reply)\n * before the next read; `pending` are sends still in flight or failed.\n */\nexport function mergeThread(\n pages: readonly (readonly LeaderThreadMessage[])[],\n received: readonly LeaderThreadMessage[] = [],\n pending: readonly PendingMessage[] = [],\n): ThreadEntry[] {\n const byId = new Map<string, LeaderThreadMessage>();\n // Server reads win over a send's echo: they are newer (a status may have moved).\n for (const m of received) byId.set(m.id, m);\n for (const page of pages) for (const m of page) byId.set(m.id, m);\n const messages = [...byId.values()];\n const claimed = new Set<string>();\n const live: PendingMessage[] = [];\n for (const p of pending) {\n // A failed send stays until retried or discarded: its words never arrived.\n const copy = p.state === 'sending' ? messages.find((m) => !claimed.has(m.id) && isCopyOf(m, p)) : undefined;\n if (copy) claimed.add(copy.id);\n else live.push(p);\n }\n // Stable: equal times keep server order, and pending sends sit after the messages of their instant.\n const entries: ThreadEntry[] = [\n ...messages.map((message) => ({ type: 'message' as const, key: message.id, at: message.at, message })),\n ...live.map((p) => ({ type: 'pending' as const, key: p.clientId, at: p.at, pending: p })),\n ];\n return entries.map((e, i) => ({ e, i })).sort((x, y) => byTime(x.e, y.e) || x.i - y.i).map(({ e }) => e);\n}\n\n// ---------------------------------------------------------------------------\n// Grouping\n// ---------------------------------------------------------------------------\n\nexport const GROUP_GAP_MS = 5 * 60_000;\n\nexport type ThreadRow =\n | { type: 'day'; key: string; label: string }\n | { type: 'group'; key: string; from: 'mason' | 'leader'; channel: LeaderThreadChannel; at: string; entries: ThreadEntry[] }\n /** A system line (a channel note, an update from `system`), centred and quiet. */\n | { type: 'system'; key: string; entry: ThreadEntry & { type: 'message' } };\n\nfunction entryFrom(e: ThreadEntry): 'mason' | 'leader' {\n return e.type === 'pending' ? 'mason' : e.message.from;\n}\nfunction entryChannel(e: ThreadEntry): LeaderThreadChannel {\n return e.type === 'pending' ? 'verse' : e.message.channel;\n}\n/** Memos and directives are cards and chips: each stands alone, never folded into a run. */\nfunction standsAlone(e: ThreadEntry): boolean {\n return e.type === 'message' && (e.message.kind === 'memo' || e.message.kind === 'directive');\n}\n\nfunction dayKey(t: number): string {\n const d = new Date(t);\n return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n}\n\n/** \"Today\", \"Yesterday\", \"Thu, Sep 24\" (local). */\nexport function dayLabel(iso: string, now: number = Date.now()): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return '—';\n if (dayKey(t) === dayKey(now)) return 'Today';\n if (dayKey(t) === dayKey(now - 86_400_000)) return 'Yesterday';\n const d = new Date(t);\n const sameYear = d.getFullYear() === new Date(now).getFullYear();\n return d.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric', ...(sameYear ? {} : { year: 'numeric' }) });\n}\n\nexport function groupThread(entries: readonly ThreadEntry[], now: number = Date.now()): ThreadRow[] {\n const rows: ThreadRow[] = [];\n let day: string | null = null;\n let run: Extract<ThreadRow, { type: 'group' }> | null = null;\n let lastAt = 0;\n for (const e of entries) {\n const t = Date.parse(e.at);\n const k = dayKey(t);\n if (k !== day) {\n day = k;\n rows.push({ type: 'day', key: `day-${k}`, label: dayLabel(e.at, now) });\n run = null;\n }\n if (e.type === 'message' && e.message.channel === 'system') {\n rows.push({ type: 'system', key: e.key, entry: e });\n run = null;\n continue;\n }\n const from = entryFrom(e);\n const channel = entryChannel(e);\n const joins = run !== null && !standsAlone(e) && !standsAlone(run.entries[run.entries.length - 1]!) && run.from === from && run.channel === channel && t - lastAt <= GROUP_GAP_MS;\n if (joins && run) run.entries.push(e);\n else {\n run = { type: 'group', key: `g-${e.key}`, from, channel, at: e.at, entries: [e] };\n rows.push(run);\n }\n lastAt = t;\n }\n return rows;\n}\n\n// ---------------------------------------------------------------------------\n// Questions\n// ---------------------------------------------------------------------------\n\n/** question message id → the answer that closed it. */\nexport function answeredQuestions(messages: readonly LeaderThreadMessage[]): Map<string, LeaderThreadMessage> {\n const questions = messages.filter((m) => m.kind === 'question');\n const out = new Map<string, LeaderThreadMessage>();\n for (const a of messages) {\n if (a.from !== 'mason' || (a.kind !== 'answer' && !a.replyTo)) continue;\n const q = questions.find((q) => (a.questionId && q.questionId === a.questionId) || (a.replyTo && q.id === a.replyTo));\n if (q && !out.has(q.id)) out.set(q.id, a);\n }\n return out;\n}\n\nexport interface QuestionTarget {\n /** The thread's questionId, `<memoId>:<index>` (question-id.ts derives it from a Needs-you item). */\n questionId: string | null;\n}\n\n/**\n * The question message a target means: the one whose questionId is exactly\n * the target's (the server keys both off `<memoId>:<index>`). Null when the\n * thread does not carry it — the caller then answers as a quoted message.\n */\nexport function findQuestion(messages: readonly LeaderThreadMessage[], target: QuestionTarget): LeaderThreadMessage | null {\n if (!target.questionId) return null;\n return messages.find((m) => m.kind === 'question' && m.questionId === target.questionId) ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Waiting, previews, words\n// ---------------------------------------------------------------------------\n\n/** How long \"Leader is thinking…\" may show for a send the server said it would answer later. */\nexport const AWAIT_REPLY_MS = 3 * 60_000;\n\n/**\n * True while a send is in flight, or while a message this tab sent (with no\n * inline reply) is still the newest thing Mason said and nothing from the\n * Leader has come after it — for at most AWAIT_REPLY_MS.\n */\nexport function awaitingReply(entries: readonly ThreadEntry[], awaiting: ReadonlySet<string>, now: number = Date.now()): boolean {\n if (entries.some((e) => e.type === 'pending' && e.pending.state === 'sending')) return true;\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const e = entries[i]!;\n if (e.type !== 'message' || e.message.channel === 'system') continue;\n if (e.message.from === 'leader') return false;\n if (awaiting.has(e.message.id)) return now - Date.parse(e.message.at) < AWAIT_REPLY_MS;\n }\n return false;\n}\n\nexport const CHANNEL_LABEL: Readonly<Record<LeaderThreadChannel, string>> = {\n verse: 'Verse',\n telegram: 'Telegram',\n cli: 'CLI',\n system: 'System',\n};\n\n/** The newest message from the Leader (Command's preview line). */\nexport function latestLeaderMessage(messages: readonly LeaderThreadMessage[]): LeaderThreadMessage | null {\n let best: LeaderThreadMessage | null = null;\n for (const m of messages) {\n if (m.from !== 'leader' || m.channel === 'system') continue;\n if (!best || Date.parse(m.at) >= Date.parse(best.at)) best = m;\n }\n return best;\n}\n\n/**\n * One line of plain text from a message that may be Markdown: fences, marks\n * and link targets dropped, whitespace collapsed, clipped on a word.\n */\nexport function previewText(text: string, max = 140): string {\n const plain = text\n .replace(/```[\\s\\S]*?(```|$)/g, ' ')\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/^\\s{0,3}(#{1,6}|>|[-*+]|\\d+\\.)\\s+/gm, '')\n .replace(/[*_`~]+/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n if (plain.length <= max) return plain;\n const cut = plain.slice(0, max - 1);\n const space = cut.lastIndexOf(' ');\n return `${(space > max * 0.6 ? cut.slice(0, space) : cut).replace(/[\\s,.;:–—-]+$/, '')}…`;\n}\n\n/** \"9:14 AM\" */\nexport function clockTime(iso: string): string {\n const t = Date.parse(iso);\n return Number.isFinite(t) ? new Date(t).toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' }) : '';\n}\n\n/** Longest message the composer sends (the server may cap lower and say so). */\nexport const LEADER_MESSAGE_MAX = 4_000;\n","/**\n * routes/verse/leader/thread-data.ts — every read and write behind the\n * Leader conversation (Mind) and its preview line (Command). Paths and\n * shapes: thread-types.ts.\n *\n * Reads are OPTIONAL reads (command/surface-data.ts optionalQuery): a server\n * without the conversation routes answers 404, which is \"not in this build\n * yet\" on the card — never a broken Mind. Writes pull the held mutation\n * token (VerseControlLockedError without one; the panel opens the token\n * dialog first) and invalidate exactly what they change.\n */\nimport { apiDelete, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { optionalQuery, SURFACE_KEYS } from '../command/surface-data.js';\nimport { refreshActivity } from '../shell/useActivity.js';\nimport { narrowDirective, narrowDirectives, narrowSendResult, narrowThreadPage } from './thread-model.js';\nimport {\n LEADER_ACTIONS_PATH,\n LEADER_DIRECTIVES_PATH,\n LEADER_QUESTIONS_PATH,\n LEADER_THREAD_PATH,\n type LeaderSendResult,\n type LeaderThreadMessage,\n type DirectiveChip,\n} from './thread-types.js';\n\n/** One page: enough for a day of conversation; older pages load on request. */\nexport const THREAD_PAGE_SIZE = 50;\n\nexport const LEADER_THREAD_KEYS = Object.freeze({\n thread: 'verse-leader-thread',\n directives: 'verse-leader-directives',\n});\n\nexport const leaderThreadQuery = optionalQuery(LEADER_THREAD_KEYS.thread, `${LEADER_THREAD_PATH}?limit=${THREAD_PAGE_SIZE}`, 'The Leader conversation', narrowThreadPage);\nexport const leaderDirectivesQuery = optionalQuery(LEADER_THREAD_KEYS.directives, LEADER_DIRECTIVES_PATH, 'Leader directives', narrowDirectives);\n\n/** The page before `beforeId` (the oldest message on screen). Throws like any read. */\nexport async function fetchOlderThread(beforeId: string, signal?: AbortSignal): Promise<LeaderThreadMessage[]> {\n const raw = await apiGet<unknown>(`${LEADER_THREAD_PATH}?limit=${THREAD_PAGE_SIZE}&before=${encodeURIComponent(beforeId)}`, signal);\n return narrowThreadPage(raw)?.messages ?? [];\n}\n\n/**\n * One path segment. The server matches ids on the RAW path (no decoding), so\n * a questionId's `:` (`<memoId>:<index>`) must go as-is — `:` is legal in a\n * path segment; anything else unusual is still escaped.\n */\nexport function pathSegment(id: string): string {\n return encodeURIComponent(id).replace(/%3A/gi, ':');\n}\n\nfunction token(): string {\n const t = getMutationToken();\n if (!t) throw new VerseControlLockedError();\n return t;\n}\n\nasync function post(path: string, body: unknown): Promise<unknown> {\n const result = await apiPost<unknown>(path, body, token());\n touchMutationHold();\n return result;\n}\n\n/**\n * A send the server accepted but answered in a shape this page cannot read\n * is still a send: the next read shows it. Null tells the caller \"refetch\".\n */\nexport async function sendLeaderMessage(text: string, replyTo: string | null = null): Promise<LeaderSendResult | null> {\n const result = narrowSendResult(await post(LEADER_THREAD_PATH, replyTo ? { text, replyTo } : { text }));\n if (result?.directive) invalidate(LEADER_THREAD_KEYS.directives);\n return result;\n}\n\nexport async function answerLeaderQuestion(questionId: string, text: string): Promise<LeaderSendResult | null> {\n const result = narrowSendResult(await post(`${LEADER_QUESTIONS_PATH}/${pathSegment(questionId)}/answer`, { text }));\n // The question's Needs-you row closes with its answer.\n void refreshActivity();\n return result;\n}\n\n/**\n * Approve a class-B action now (skip the window) or a class-C ask.\n * `{ ok, code, outcome, message, action, thread }`: a 409 (nothing to\n * approve, or refused now) throws with the server's `message` as its reason\n * (client.ts readRefusal); the approval and the Leader's acknowledgement\n * reach the conversation through the thread refetch.\n */\nexport async function approveLeaderAction(actionId: string): Promise<unknown> {\n const result = await post(`${LEADER_ACTIONS_PATH}/${pathSegment(actionId)}/approve`, {});\n invalidate(SURFACE_KEYS.leader);\n invalidate(LEADER_THREAD_KEYS.thread);\n void refreshActivity();\n return result;\n}\n\n/**\n * POST /directives → `{ directive, duplicate }` (201 new, 200 when the same\n * words are already in force — either way the chip is there after the refetch).\n */\nexport async function addLeaderDirective(text: string): Promise<DirectiveChip | null> {\n const raw = await post(LEADER_DIRECTIVES_PATH, { text });\n invalidate(LEADER_THREAD_KEYS.directives);\n invalidate(LEADER_THREAD_KEYS.thread);\n const record = raw !== null && typeof raw === 'object' && 'directive' in raw ? (raw as { directive: unknown }).directive : raw;\n return narrowDirective(record);\n}\n\n/** DELETE /directives/<id> → `{ directive }` (now retired). */\nexport async function retireLeaderDirective(id: string): Promise<void> {\n await apiDelete<unknown>(`${LEADER_DIRECTIVES_PATH}/${pathSegment(id)}`, token());\n touchMutationHold();\n invalidate(LEADER_THREAD_KEYS.directives);\n invalidate(LEADER_THREAD_KEYS.thread);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-_izD07R9.js";import{c as r,o as i,r as a,s as o}from"./VerseMobileApp-CrCDQcw5.js";import{t as s}from"./parts.module-CBkHcD6w.js";var c=e(n(),1),l=t(),u={...o,...s},d=u;function f({title:e,trailing:t,footer:n,children:r,flat:i=!1}){let a=(0,c.useId)();return(0,l.jsxs)(`section`,{className:d.section,"aria-labelledby":e?a:void 0,children:[e?(0,l.jsxs)(`div`,{className:d.sectionHeader,children:[(0,l.jsx)(`h2`,{id:a,style:{margin:0,font:`inherit`},children:e}),t]}):null,i?r:(0,l.jsx)(`div`,{className:d.group,children:r}),n?(0,l.jsx)(`p`,{className:d.sectionFooter,children:n}):null]})}function p({title:e,subtitle:t,leading:n,trailing:i,onClick:a,chevron:o=!!a,label:s}){let c=(0,l.jsxs)(l.Fragment,{children:[n?(0,l.jsx)(`span`,{className:d.rowLead,children:n}):null,(0,l.jsxs)(`span`,{className:d.rowBody,children:[(0,l.jsx)(`span`,{className:d.rowTitle,children:e}),t?(0,l.jsx)(`span`,{className:d.rowSub,children:t}):null]}),i||o?(0,l.jsxs)(`span`,{className:d.rowTrail,children:[i,o?(0,l.jsx)(r,{size:14,className:d.chevron}):null]}):null]});return a?(0,l.jsx)(`button`,{type:`button`,className:d.row,onClick:a,"aria-label":s,children:c}):(0,l.jsx)(`div`,{className:d.row,children:c})}function m({tone:e=`neutral`,dot:t=!1,pulse:n=!1,children:r}){return(0,l.jsxs)(`span`,{className:i(d.badge,d[`tone-${e}`]),children:[t?(0,l.jsx)(`span`,{className:i(d.dot,n&&d.pulse),"aria-hidden":`true`}):null,r]})}function h(e){return e===null?`unknown`:e>=90?`danger`:e>=70?`warning`:`ok`}function g({label:e,percent:t,valueText:n,note:r}){let i=t===null?null:Math.max(0,Math.min(100,t)),a=n??(i===null?`unknown`:`${Math.round(i)}% used`);return(0,l.jsxs)(`div`,{className:d.meter,children:[(0,l.jsxs)(`div`,{className:d.meterHead,children:[(0,l.jsx)(`span`,{className:d.meterLabel,children:e}),(0,l.jsx)(`span`,{className:d.meterValue,children:a})]}),(0,l.jsx)(`div`,{className:d.meterTrack,role:`meter`,"aria-label":typeof e==`string`?e:void 0,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":i??void 0,"aria-valuetext":a,children:(0,l.jsx)(`div`,{className:d.meterFill,"data-tone":h(i),style:{width:`${i??0}%`}})}),r?(0,l.jsx)(`span`,{className:d.meterNote,children:r}):null]})}function _({tone:e=`warning`,children:t}){return(0,l.jsx)(`div`,{className:d.banner,"data-tone":e,role:e===`danger`?`alert`:`status`,children:t})}function v({title:e,body:t,action:n}){return(0,l.jsxs)(`div`,{className:d.empty,children:[(0,l.jsx)(`p`,{className:d.emptyTitle,children:e}),t?(0,l.jsx)(`p`,{className:d.emptyBody,children:t}):null,n]})}function y({title:e,reason:t,onRetry:n}){return(0,l.jsxs)(`div`,{className:d.empty,role:`alert`,children:[(0,l.jsx)(`p`,{className:d.emptyTitle,children:e}),t?(0,l.jsx)(`p`,{className:d.emptyBody,children:t}):null,n?(0,l.jsx)(a,{variant:`tinted`,onClick:n,children:`Try again`}):null]})}export{g as a,u as c,y as i,_ as n,p as o,v as r,f as s,m as t};
|
|
2
|
+
//# sourceMappingURL=ui-parts-CcpmRBwj.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-parts-CcpmRBwj.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/ui-parts.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/ui-parts.tsx — inset-grouped lists, badges, meters,\n * banners and the empty / error states every phone screen shares (styling:\n * ui.module.css). Off the first paint: the Home frame needs none of them.\n */\nimport { useId, type ReactNode } from 'react';\nimport { ChevronGlyph } from './mobile-icons.js';\nimport partStyles from './parts.module.css';\nimport { Button, cx, ui as coreStyles } from './ui.js';\n\n/** Every phone class: the frame's (ui.module.css) and the parts' (parts.module.css). */\nexport const ui: Readonly<Record<string, string>> = { ...coreStyles, ...partStyles };\nconst styles = ui;\n\n// ---------------------------------------------------------------------------\n// Lists\n// ---------------------------------------------------------------------------\n\nexport function Section({ title, trailing, footer, children, flat = false }: { title?: ReactNode; trailing?: ReactNode; footer?: ReactNode; children: ReactNode; flat?: boolean }) {\n const id = useId();\n return (\n <section className={styles.section} aria-labelledby={title ? id : undefined}>\n {title ? (\n <div className={styles.sectionHeader}>\n <h2 id={id} style={{ margin: 0, font: 'inherit' }}>{title}</h2>\n {trailing}\n </div>\n ) : null}\n {flat ? children : <div className={styles.group}>{children}</div>}\n {footer ? <p className={styles.sectionFooter}>{footer}</p> : null}\n </section>\n );\n}\n\nexport interface RowProps {\n title: ReactNode;\n subtitle?: ReactNode;\n leading?: ReactNode;\n trailing?: ReactNode;\n onClick?: () => void;\n chevron?: boolean;\n /** Accessible name when the visible title is not enough. */\n label?: string;\n}\n\nexport function Row({ title, subtitle, leading, trailing, onClick, chevron = Boolean(onClick), label }: RowProps) {\n const body = (\n <>\n {leading ? <span className={styles.rowLead}>{leading}</span> : null}\n <span className={styles.rowBody}>\n <span className={styles.rowTitle}>{title}</span>\n {subtitle ? <span className={styles.rowSub}>{subtitle}</span> : null}\n </span>\n {trailing || chevron ? (\n <span className={styles.rowTrail}>\n {trailing}\n {chevron ? <ChevronGlyph size={14} className={styles.chevron} /> : null}\n </span>\n ) : null}\n </>\n );\n if (!onClick) return <div className={styles.row}>{body}</div>;\n return (\n <button type=\"button\" className={styles.row} onClick={onClick} aria-label={label}>\n {body}\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Status\n// ---------------------------------------------------------------------------\n\nexport type Tone = 'running' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';\n\nexport function Badge({ tone = 'neutral', dot = false, pulse = false, children }: { tone?: Tone; dot?: boolean; pulse?: boolean; children: ReactNode }) {\n return (\n <span className={cx(styles.badge, styles[`tone-${tone}`])}>\n {dot ? <span className={cx(styles.dot, pulse && styles.pulse)} aria-hidden=\"true\" /> : null}\n {children}\n </span>\n );\n}\n\nexport interface MeterProps {\n label: ReactNode;\n /** 0–100; null = unknown (an empty track and \"unknown\", never 0%). */\n percent: number | null;\n /** Right-hand text; defaults to the percent. */\n valueText?: string;\n note?: ReactNode;\n}\n\nexport function meterTone(percent: number | null): 'ok' | 'warning' | 'danger' | 'unknown' {\n if (percent === null) return 'unknown';\n if (percent >= 90) return 'danger';\n if (percent >= 70) return 'warning';\n return 'ok';\n}\n\nexport function Meter({ label, percent, valueText, note }: MeterProps) {\n const clamped = percent === null ? null : Math.max(0, Math.min(100, percent));\n const text = valueText ?? (clamped === null ? 'unknown' : `${Math.round(clamped)}% used`);\n return (\n <div className={styles.meter}>\n <div className={styles.meterHead}>\n <span className={styles.meterLabel}>{label}</span>\n <span className={styles.meterValue}>{text}</span>\n </div>\n <div\n className={styles.meterTrack}\n role=\"meter\"\n aria-label={typeof label === 'string' ? label : undefined}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={clamped ?? undefined}\n aria-valuetext={text}\n >\n <div className={styles.meterFill} data-tone={meterTone(clamped)} style={{ width: `${clamped ?? 0}%` }} />\n </div>\n {note ? <span className={styles.meterNote}>{note}</span> : null}\n </div>\n );\n}\n\nexport function Banner({ tone = 'warning', children }: { tone?: 'warning' | 'danger' | 'info'; children: ReactNode }) {\n return (\n <div className={styles.banner} data-tone={tone} role={tone === 'danger' ? 'alert' : 'status'}>\n {children}\n </div>\n );\n}\n\nexport function EmptyState({ title, body, action }: { title: string; body?: ReactNode; action?: ReactNode }) {\n return (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>{title}</p>\n {body ? <p className={styles.emptyBody}>{body}</p> : null}\n {action}\n </div>\n );\n}\n\nexport function ErrorState({ title, reason, onRetry }: { title: string; reason: string | null; onRetry?: () => void }) {\n return (\n <div className={styles.empty} role=\"alert\">\n <p className={styles.emptyTitle}>{title}</p>\n {reason ? <p className={styles.emptyBody}>{reason}</p> : null}\n {onRetry ? <Button variant=\"tinted\" onClick={onRetry}>Try again</Button> : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e,t}from"./global-CYfRwH6t.js";var n=`2.1.280`;function r(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function i(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:null}function a(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function o(e,t,n=!1){let r=e[t];return typeof r==`boolean`?r:n}function s(e){return Array.isArray(e)?e:[]}var c=/(launcher\.mjs|native-profiles|account-connections|console-startup|\/\.ashlr\b|Bearer\s|--token\b)/i;function l(e){if(typeof e!=`string`)return null;let t=e.trim();return t.length===0||t.length>200||c.test(t)||/[\r\n]/.test(t)?null:t}function u(e){return e===null?null:Math.max(0,Math.min(100,e))}function d(e){let t=r(e);if(!t)return null;let n=i(t,`id`)??i(t,`label`);if(n===null)return null;let s=r(t.nativeReport),c=o(t,`limitReached`)||o(t,`rateLimitReached`),l=t.measured;return{id:n,label:i(t,`label`),usedPercent:u(a(t,`usedPercent`)??a(t,`used_percent`)),resetsAt:i(t,`resetsAt`)??i(t,`resets_at`),resetDescription:(s?i(s,`resetDescription`):null)??i(t,`resetDescription`),limitReached:c,measured:typeof l==`boolean`?l:!c}}function f(e){let t=r(e);if(!t)return null;let n=i(t,`balance`),s=n===null?a(t,`balance`):Number.parseFloat(n);return{hasCredits:o(t,`hasCredits`)||o(t,`has_credits`),unlimited:o(t,`unlimited`),balance:n,balanceValue:typeof s==`number`&&Number.isFinite(s)?s:null}}var p=[`claude`,`codex`,`grok`];function m(e){let t=r(e);if(!t)return null;let n=i(t,`id`),a=i(t,`provider`);if(n===null||a===null||!p.includes(a))return null;let o=s(t.windows).map(d).filter(e=>e!==null),c=i(t,`state`),u=i(t,`authentication`),m=r(t.unsupported);return{id:n,label:i(t,`label`)??n,provider:a,state:c===`checking`||c===`observed`||c===`signed-out`||c===`unavailable`?c:`unavailable`,authentication:u===`signed-in`||u===`signed-out`?u:`unknown`,health:i(t,`health`),planType:i(t,`planType`)??i(t,`plan_type`),observedAt:i(t,`observedAt`),windows:o,binding:d(t.binding),credits:f(t.credits),reason:i(t,`reason`),unsupported:h(t,m),reconnectCommand:l(t.reconnectCommand),notes:s(t.notes).filter(e=>typeof e==`string`)}}function h(e,t){if(t)return{code:i(t,`code`)??`usage-version-unsupported`,pinnedVersion:i(t,`pinnedVersion`)??i(t,`version`)};let r=i(e,`reason`);return r===`usage-version-unsupported`?{code:r,pinnedVersion:n}:null}function g(e){let t=i(e,`collectorNote`);if(t)return t;let n=r(e.collector);return!n||i(n,`owner`)!==`another-collector`?null:i(n,`note`)??`Another collector process owns the quota-refresh lease, so these readings are read-only and may be staler than this server’s poll interval.`}function _(e){let t=r(e);if(!t)return null;let n=Array.isArray(t.accounts)?t.accounts:Array.isArray(e)?e:null;return n===null?null:{sampledAt:i(t,`sampledAt`),refreshing:o(t,`refreshing`),accounts:n.map(m).filter(e=>e!==null),collectorNote:g(t)}}function v(e){let t=r(e);if(!t)return null;let n=i(t,`day`);return n===null||!/^\d{4}-\d{2}-\d{2}$/.test(n)?null:{day:n,tokensIn:a(t,`tokensIn`)??0,tokensOut:a(t,`tokensOut`)??0,estCostUsd:a(t,`estCostUsd`)??0,sessions:a(t,`sessions`)??0,cacheRead:a(t,`cacheRead`),cacheWrite:a(t,`cacheWrite`),cacheHitRate:a(t,`cacheHitRate`)}}function y(e,t){let n=r(e),a=n?Array.isArray(n.byDay)?n.byDay:Array.isArray(n.days)?n.days:null:Array.isArray(e)?e:null;if(a===null)return null;let c=n?i(n,`window`):null;return{window:c===`7d`||c===`30d`?c:t,days:a.map(v).filter(e=>e!==null).sort((e,t)=>e.day.localeCompare(t.day)),generatedAt:n?i(n,`generatedAt`):null,estimated:!n||o(n,`estimated`,!0),caveats:n?s(n.caveats).filter(e=>typeof e==`string`):[]}}function b(e,t){let n=r(e);if(!n)return null;let s=i(n,`label`)??i(n,`id`)??i(n,`name`)??i(n,`model`);if(s===null)return null;let c=n.capabilities,l=i(n,`state`),d=n.supportsTools,f=a(n,`nativeContextLength`)??a(n,`nativeContext`),p=a(n,`contextLength`)??a(n,`configuredContext`),m=i(n,`placement`);return{name:s,runtime:t,loaded:l===null?o(n,`loaded`)||o(n,`resident`):l===`loaded`,sizeBytes:a(n,`sizeBytes`)??a(n,`size`),sizeVramBytes:a(n,`sizeVramBytes`)??a(n,`size_vram`),placement:m===`gpu`||m===`cpu`||m===`split`?m:`unknown`,gpuPercent:u(a(n,`gpuPercent`)),memoryPercent:u(a(n,`memoryPercent`)),family:i(n,`family`),arch:i(n,`arch`),expiresAt:i(n,`expiresAt`)??i(n,`expires_at`),parameterSize:i(n,`parameterSize`)??i(n,`parameter_size`),quantization:i(n,`quantization`)??i(n,`quantization_level`),nativeContext:f,configuredContext:p!==null&&f!==null&&p===f?null:p,capabilities:Array.isArray(c)?c.filter(e=>typeof e==`string`):null,supportsTools:typeof d==`boolean`?d:null}}function x(e,t){let n=r(e);if(!n)return null;let s=Array.isArray(n.models)?n.models:null;if(s===null)return null;let c=s.map(e=>b(e,t)).filter(e=>e!==null),l=o(n,`stale`);return{models:c,status:{runtime:t,reachable:o(n,`reachable`),reason:i(n,`reason`),stale:l,staleForMs:l?a(n,`staleForMs`):null,modelCount:c.length}}}function S(e){let t=r(e);if(!t)return null;let n=x(t.ollama,`ollama`),c=x(t.lmStudio??t.lmstudio,`lmstudio`);if(n!==null||c!==null){let e=[n,c].filter(e=>e!==null),o=e.some(e=>e.status.reachable),l=r(t.machine);return{reachable:o,models:e.flatMap(e=>e.models),memoryBudgetBytes:(l?a(l,`totalMemoryBytes`):null)??a(t,`memoryBudgetBytes`)??a(t,`memoryBudget`),freeMemoryBytes:l?a(l,`freeMemoryBytes`):null,reason:o?null:e.map(e=>e.status.reason).find(e=>e!==null)??null,runtimes:e.map(e=>e.status),notes:s(t.notes).filter(e=>typeof e==`string`),sampledAt:i(t,`sampledAt`)}}let l=Array.isArray(t.models)?t.models:null;return l===null?null:{reachable:o(t,`reachable`,!0),models:l.map(e=>b(e,null)).filter(e=>e!==null),memoryBudgetBytes:a(t,`memoryBudgetBytes`)??a(t,`memoryBudget`),freeMemoryBytes:a(t,`freeMemoryBytes`),reason:i(t,`reason`),runtimes:[],notes:s(t.notes).filter(e=>typeof e==`string`),sampledAt:i(t,`sampledAt`)}}var C=`verse-usage-frontier`,w=`verse-usage-control`,T={key:C,fetch:t=>e(`/api/usage`,t)};function E(e){return e instanceof t?e.status===404?`This server does not expose /api/verse/control, so configured caps and today’s spend are unavailable here.`:`Configured caps unavailable (HTTP ${e.status}).`:`Configured caps unavailable: the request failed.`}var D={key:w,fetch:async n=>{try{return{raw:await e(`/api/verse/control`,n),available:!0,reason:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{raw:null,available:!1,reason:E(e)}}}},O=`verse-usage-accounts`,k=`verse-usage-local-models`,A=`verse-usage-series`;function j(e,n){return n instanceof t?n.status===404?`This server does not expose ${e} yet, so this panel has no source.`:`${e} answered HTTP ${n.status}.`:`${e} could not be reached.`}function M(n){return async r=>{try{return{raw:await e(n,r),available:!0,reason:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{raw:null,available:!1,reason:j(n,e)}}}}var N={key:O,fetch:M(`/api/verse/accounts`)},P=[350,1200],F=M(`/api/verse/local-models`);function I(e){if(!e.available)return!1;let t=S(e.raw);return t!==null&&!t.reachable}function L(e,t){return new Promise((n,r)=>{if(t?.aborted){r(new DOMException(`Aborted`,`AbortError`));return}let i=()=>{clearTimeout(a),r(new DOMException(`Aborted`,`AbortError`))},a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e);t?.addEventListener(`abort`,i,{once:!0})})}var R={key:k,fetch:async e=>{let t=await F(e);for(let n of P){if(!I(t))return t;await L(n,e),t=await F(e)}return t}},z={"7d":{key:`${A}:7d`,fetch:M(`/api/verse/usage-series?window=7d`)},"30d":{key:`${A}:30d`,fetch:M(`/api/verse/usage-series?window=30d`)}};function B(e){return z[e]}export{R as a,y as c,D as i,B as n,_ as o,N as r,S as s,T as t};
|
|
2
|
+
//# sourceMappingURL=usage-queries-BxrTLCaJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-queries-BxrTLCaJ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/usage/usage-contract.ts","../../../../../../src/web-ui/routes/verse/usage/usage-queries.ts"],"sourcesContent":["/**\n * routes/verse/usage/usage-contract.ts\n *\n * ┌───────────────────────────────────────────────────────────────────────┐\n * │ INTEGRATION — RECONCILED AGAINST OWNER T'S REAL ROUTES (V2.1) │\n * │ │\n * │ GET /api/verse/accounts → VerseAccountsSnapshot │\n * │ GET /api/verse/usage-series → {window, byDay, estimated, caveats} │\n * │ GET /api/verse/local-models → VerseLocalModelsSnapshot │\n * │ │\n * │ T's types now exist and are imported below as the WIRE shapes. The │\n * │ interfaces in this file are no longer stand-ins for them: they are │\n * │ the DISPLAY shapes this section renders, and they differ from the │\n * │ wire on purpose in three places the seam actually required — │\n * │ │\n * │ 1. local-models arrives as TWO runtime reports (ollama, lmStudio) │\n * │ plus a `machine` budget. This section shows one list of models │\n * │ against one budget, so `projectLocalModels` flattens them. │\n * │ 2. usage-series arrives as `{byDay}`, not `{days}` (T's documented │\n * │ deviation 1). The projector reads `byDay` and still accepts │\n * │ `days`/a bare array so an older server degrades rather than dies. │\n * │ 3. `unsupported` is not a wire field. T reports the version-pin │\n * │ failure in `reason` as the verbatim probe code, so it is DERIVED │\n * │ here from that code plus T's exported pin constant rather than │\n * │ being added to T's contract late in the run. │\n * │ │\n * │ The `WIRE_*_KEYS` blocks below are the executable seam contract: │\n * │ every canonical field name this module reads is pinned to `keyof` the │\n * │ corresponding core type, so a rename in src/core/verse breaks THIS │\n * │ build instead of silently degrading the panel to \"unknown\" at run │\n * │ time — which is exactly how this seam was broken when integration │\n * │ started. │\n * └───────────────────────────────────────────────────────────────────────┘\n *\n * Why every read goes through a structural narrower instead of a cast:\n *\n * - This section must render correctly against a server that does NOT have\n * T's routes (404) and against one that has an earlier spelling of them.\n * A cast would turn a field-name drift into `undefined.something` at\n * render time; a narrower turns it into an honest \"unknown\" with a reason.\n * - Nothing here is ever coerced. A missing percentage stays `null`, never\n * 0 — `usedPercent: 0` and \"no reading\" are different facts and the UI\n * draws them differently (docs/VERSE-TELEMETRY-V2.md, closing rules).\n *\n * SECURITY (docs/VERSE-CONTRACT-V2.md ground rules): a native-profile\n * launcher command must never reach a surface. `sanitizeCommand` below is a\n * client-side backstop on top of the server's own stripping — if a payload\n * ever carries a launcher path, this module drops it rather than printing it.\n *\n * Pure: no React, no I/O.\n */\n// EVERY import from src/core here MUST be type-only.\n//\n// `core/verse/accounts.ts` is the server's collector: it pulls node:fs,\n// node:child_process, the quota lease and the connection monitor. A VALUE\n// import of even a one-word constant from it drags that entire graph into the\n// browser bundle — `vite build` externalizes the node built-ins and the build\n// fails. Type-only imports are erased, so the seam guards below cost nothing\n// at runtime. The two constants this module needs are therefore re-declared\n// locally and PINNED TO CORE'S LITERAL TYPES (see below), which gives the same\n// drift protection with no emitted import.\nimport type {\n VerseAccountRecord,\n VerseAccountWindow,\n VerseAccountsCollectorStatus,\n VerseAccountsSnapshot,\n VerseCodexCredits,\n} from '../../../../core/verse/accounts.js';\nimport type {\n VerseLocalModel,\n VerseLocalModelsSnapshot,\n VerseLocalRuntimeReport,\n} from '../../../../core/verse/local-models.js';\nimport type { DailyUsage as CoreDailyUsage } from '../../../../core/types.js';\n\n// ---------------------------------------------------------------------------\n// Seam contract — compile-time only, zero runtime cost.\n//\n// Each entry pins a field name this module reads off the wire to `keyof` the\n// core type that produces it. Renaming a field in src/core/verse now fails\n// `npm run typecheck:web` here, at the seam, rather than turning a live panel\n// into a silent \"unknown\".\n// ---------------------------------------------------------------------------\n\nconst WIRE_ACCOUNT_KEYS = {\n id: 'id',\n label: 'label',\n provider: 'provider',\n state: 'state',\n authentication: 'authentication',\n health: 'health',\n planType: 'planType',\n observedAt: 'observedAt',\n windows: 'windows',\n binding: 'binding',\n credits: 'credits',\n reason: 'reason',\n notes: 'notes',\n} as const satisfies Record<string, keyof VerseAccountRecord>;\n\nconst WIRE_WINDOW_KEYS = {\n id: 'id',\n usedPercent: 'usedPercent',\n resetsAt: 'resetsAt',\n nativeReport: 'nativeReport',\n limitReached: 'limitReached',\n measured: 'measured',\n} as const satisfies Record<string, keyof VerseAccountWindow>;\n\nconst WIRE_CREDITS_KEYS = {\n hasCredits: 'hasCredits',\n unlimited: 'unlimited',\n balance: 'balance',\n} as const satisfies Record<string, keyof VerseCodexCredits>;\n\nconst WIRE_ACCOUNTS_SNAPSHOT_KEYS = {\n sampledAt: 'sampledAt',\n refreshing: 'refreshing',\n accounts: 'accounts',\n collector: 'collector',\n notes: 'notes',\n} as const satisfies Record<string, keyof VerseAccountsSnapshot>;\n\nconst WIRE_COLLECTOR_KEYS = {\n owner: 'owner',\n note: 'note',\n} as const satisfies Record<string, keyof VerseAccountsCollectorStatus>;\n\nconst WIRE_LOCAL_SNAPSHOT_KEYS = {\n machine: 'machine',\n ollama: 'ollama',\n lmStudio: 'lmStudio',\n} as const satisfies Record<string, keyof VerseLocalModelsSnapshot>;\n\nconst WIRE_LOCAL_RUNTIME_KEYS = {\n reachable: 'reachable',\n models: 'models',\n reason: 'reason',\n // V2.1: a RETAINED known-good reading rather than a fresh probe. Both must\n // be projected — a stale reading presented as fresh is the exact failure\n // this seam exists to prevent.\n stale: 'stale',\n staleForMs: 'staleForMs',\n} as const satisfies Record<string, keyof VerseLocalRuntimeReport>;\n\nconst WIRE_LOCAL_MODEL_KEYS = {\n id: 'id',\n label: 'label',\n state: 'state',\n sizeBytes: 'sizeBytes',\n sizeVramBytes: 'sizeVramBytes',\n placement: 'placement',\n gpuPercent: 'gpuPercent',\n memoryPercent: 'memoryPercent',\n family: 'family',\n arch: 'arch',\n expiresAt: 'expiresAt',\n contextLength: 'contextLength',\n nativeContextLength: 'nativeContextLength',\n parameterSize: 'parameterSize',\n quantization: 'quantization',\n capabilities: 'capabilities',\n supportsTools: 'supportsTools',\n} as const satisfies Record<string, keyof VerseLocalModel>;\n\n/**\n * Claude's version-pin constants, re-declared rather than imported.\n *\n * The annotations are the drift guard: `typeof import(...)` is a TYPE position,\n * so it is erased at build time, but it resolves to core's literal type\n * (`'2.1.257'`, `'usage-version-unsupported'`). Change either constant in\n * `core/verse/accounts.ts` and this file stops compiling — the same protection\n * a value import would give, without pulling node:fs into the browser.\n */\ntype CoreAccountsModule = typeof import('../../../../core/verse/accounts.js');\n\nexport const CLAUDE_VERSION_REASON: CoreAccountsModule['VERSE_CLAUDE_VERSION_REASON'] =\n 'usage-version-unsupported';\n\nexport const CLAUDE_USAGE_PINNED_VERSION: CoreAccountsModule['VERSE_CLAUDE_USAGE_PINNED_VERSION'] =\n '2.1.280';\n\n/** `byDay` is the wire key (T's deviation 1); `DailyUsage` below mirrors core. */\nconst WIRE_DAILY_USAGE_KEYS = {\n day: 'day',\n tokensIn: 'tokensIn',\n tokensOut: 'tokensOut',\n estCostUsd: 'estCostUsd',\n sessions: 'sessions',\n cacheRead: 'cacheRead',\n cacheWrite: 'cacheWrite',\n cacheHitRate: 'cacheHitRate',\n} as const satisfies Record<string, keyof CoreDailyUsage>;\n\n// Referenced so the guards are not dead code under `noUnusedLocals`.\nexport const WIRE_CONTRACT_KEYS = {\n account: WIRE_ACCOUNT_KEYS,\n window: WIRE_WINDOW_KEYS,\n credits: WIRE_CREDITS_KEYS,\n accountsSnapshot: WIRE_ACCOUNTS_SNAPSHOT_KEYS,\n collector: WIRE_COLLECTOR_KEYS,\n localSnapshot: WIRE_LOCAL_SNAPSHOT_KEYS,\n localRuntime: WIRE_LOCAL_RUNTIME_KEYS,\n localModel: WIRE_LOCAL_MODEL_KEYS,\n dailyUsage: WIRE_DAILY_USAGE_KEYS,\n} as const;\n\n// ---------------------------------------------------------------------------\n// GET /api/verse/accounts\n// ---------------------------------------------------------------------------\n\n/** Provider ids this surface knows how to describe. */\nexport type AccountProvider = 'claude' | 'codex' | 'grok';\n\n/**\n * One quota window on an account.\n *\n * `resetsAt` is an ISO string when the provider gave a real timestamp (Codex\n * publishes an epoch the server normalizes). Claude's is STRUCTURALLY always\n * null and the human sentence lives in `nativeReport.resetDescription`, which\n * is rendered verbatim and never turned into a countdown.\n */\nexport interface AccountWindow {\n id: string;\n /** Human label when the server supplies one; otherwise `id` is shown. */\n label: string | null;\n /** 0–100. `null` is \"no reading\", never 0. */\n usedPercent: number | null;\n /** ISO 8601, or null. */\n resetsAt: string | null;\n /** Verbatim provider prose, e.g. \"resets Sep 25 at 7pm (America/New_York)\". */\n resetDescription: string | null;\n /**\n * True when the provider signalled `rateLimitReachedType` — the upstream\n * writes the SENTINEL 100, which is a flag, not a measurement. Rendered as\n * \"limit reached\", never as \"100% used\".\n */\n limitReached: boolean;\n /**\n * False when `usedPercent` is a FLAGGED SENTINEL rather than a reading.\n *\n * Codex writes `rateLimitReachedType` upstream as the value 100, so a bare\n * 100 is indistinguishable from a genuinely measured 100 by the time it\n * arrives. The server distinguishes them; this surface must not collapse\n * them back together. Absent on the wire → assumed measured UNLESS the\n * limit flag is set, which is the only case where the sentinel is written.\n */\n measured: boolean;\n}\n\n/**\n * Codex credits. Independent of the window: a 100%-used week with a spendable\n * balance is NOT blocked, and this surface must not say it is.\n */\nexport interface AccountCredits {\n hasCredits: boolean;\n unlimited: boolean;\n /** Raw decimal string from the provider, kept verbatim for the title text. */\n balance: string | null;\n /** `balance` parsed, or null when it was absent/unparseable. */\n balanceValue: number | null;\n}\n\nexport interface Account {\n id: string;\n label: string;\n provider: AccountProvider;\n state: 'checking' | 'observed' | 'signed-out' | 'unavailable';\n authentication: 'signed-in' | 'signed-out' | 'unknown';\n /**\n * The connection monitor's own health verdict. Claude's is ALWAYS `unknown`\n * by construction (docs/VERSE-TELEMETRY-V2.md) — that is not a fault and is\n * never rendered as one.\n */\n health: string | null;\n planType: string | null;\n observedAt: string | null;\n windows: AccountWindow[];\n /**\n * The server's computed binding window (highest used percent). Kept as its\n * own field rather than recomputed blindly, but `accounts-model.ts` verifies\n * it against `windows` and falls back to computing it when absent.\n */\n binding: AccountWindow | null;\n credits: AccountCredits | null;\n /** Plain-language reason for a non-observed state. */\n reason: string | null;\n /**\n * Present when a probe failed CLOSED on a version pin (Claude's probe is\n * pinned to a specific Claude Code build). The fix is a one-line constant\n * bump, so the UI names it instead of showing a silent \"unknown\".\n */\n unsupported: { code: string; pinnedVersion: string | null } | null;\n /** Already sanitized — see `sanitizeCommand`. Null when nothing safe to show. */\n reconnectCommand: string | null;\n /**\n * The server's plain-language facts for this account (`VerseAccountRecord.\n * notes`). Grok's \"reconnect through `ashlr resources`, profile path withheld\n * on purpose\" lives here, which is why this surface shows notes rather than\n * only the machine-readable `reason`.\n */\n notes: string[];\n}\n\nexport interface AccountsSnapshot {\n sampledAt: string | null;\n refreshing: boolean;\n accounts: Account[];\n /**\n * Set when another collector process owns the quota-refresh lease, so these\n * readings are read-only and may be staler than this server's poll interval.\n */\n collectorNote: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// GET /api/verse/usage-series?window=7d|30d\n// ---------------------------------------------------------------------------\n\nexport type SeriesWindow = '7d' | '30d';\n\n/** `buildRollup(window, cfg).byDay` — see docs/VERSE-TELEMETRY-V2.md. */\nexport interface DailyUsage {\n /** YYYY-MM-DD. */\n day: string;\n tokensIn: number;\n tokensOut: number;\n /** ESTIMATED from a static price table. Never a billed figure. */\n estCostUsd: number;\n sessions: number;\n /** Optional: absent means the rollup carried no cache columns for that day. */\n cacheRead: number | null;\n cacheWrite: number | null;\n /** 0–1 fraction, or null. */\n cacheHitRate: number | null;\n}\n\nexport interface UsageSeries {\n window: SeriesWindow;\n days: DailyUsage[];\n generatedAt: string | null;\n /**\n * The server states outright that every cost column here is estimated.\n * Carried through rather than re-asserted locally so the disclosure the UI\n * prints is the one the producer actually made.\n */\n estimated: boolean;\n /** The server's own caveats, rendered verbatim beside the charts. */\n caveats: string[];\n}\n\n// ---------------------------------------------------------------------------\n// GET /api/verse/local-models\n// ---------------------------------------------------------------------------\n\nexport interface LocalModel {\n name: string;\n /** Which runtime reported it, so a flattened list stays attributable. */\n runtime: 'ollama' | 'lmstudio' | null;\n /** Resident in memory right now (Ollama /api/ps), vs merely installed. */\n loaded: boolean;\n /** Total resident bytes, or null when not reported. */\n sizeBytes: number | null;\n /** Of `sizeBytes`, how much sits in VRAM. null = not reported. */\n sizeVramBytes: number | null;\n /**\n * Where the weights actually sit. `split` is the one that matters: a model\n * that only half-fits the GPU runs at a fraction of the speed of one that\n * fits, and that is the difference between usable and not.\n */\n placement: 'gpu' | 'cpu' | 'split' | 'unknown';\n /** The runtime's own GPU share, 0–100. Preferred over recomputing it. */\n gpuPercent: number | null;\n /** Resident size against total machine memory, 0–100, else null. */\n memoryPercent: number | null;\n family: string | null;\n arch: string | null;\n /** Keep-alive expiry (ISO). Only meaningful while `loaded`. */\n expiresAt: string | null;\n /** e.g. \"79.7B\". Provider string, never parsed into a number for display. */\n parameterSize: string | null;\n /** e.g. \"Q4_K_M\". */\n quantization: string | null;\n /** Native context from model_info[\"<arch>.context_length\"]. */\n nativeContext: number | null;\n /** Context Ashlr actually configures for this seat, when it differs. */\n configuredContext: number | null;\n /**\n * `capabilities` from /api/show. `null` means the capability list was not\n * reported — which is NOT the same as \"does not support tools\".\n */\n capabilities: string[] | null;\n /**\n * The runtime's own answer to \"can this drive an agentic session\", which is\n * AUTHORITATIVE over `capabilities` and must be preferred when non-null.\n *\n * This matters: owner T sends `capabilities: []` when a runtime reported no\n * capability list, and reading that array alone would render \"no tools\" —\n * a hard, wrong gate — where T's `supportsTools: null` correctly means\n * \"unknown\". Deriving tool support from the array alone was a real defect\n * at this seam, not a cosmetic one.\n */\n supportsTools: boolean | null;\n}\n\n/**\n * One runtime's own reachability, kept per-runtime rather than folded into the\n * flattened list, because STALENESS is per-runtime and must be stated.\n *\n * `stale` means the server served a RETAINED known-good reading after a probe\n * TIMED OUT (core `VERSE_LOCAL_LAST_GOOD_TTL_MS`). That is the honest choice\n * server-side — a timeout is \"no answer yet\", not \"the runtime is gone\" — but\n * it obliges this surface to say plainly that the numbers are N seconds old\n * rather than presenting them as fresh.\n */\nexport interface LocalRuntimeStatus {\n runtime: 'ollama' | 'lmstudio';\n reachable: boolean;\n /** Machine-readable degradation code; never rendered as a sentence. */\n reason: string | null;\n /** True when this report is a retained reading rather than a fresh probe. */\n stale: boolean;\n /** Age of that retained reading in ms. Null when `stale` is false. */\n staleForMs: number | null;\n modelCount: number;\n}\n\nexport interface LocalModelsSnapshot {\n reachable: boolean;\n models: LocalModel[];\n /** Machine memory budget in bytes, or null when the server did not say. */\n memoryBudgetBytes: number | null;\n /** Machine memory reported free right now, or null. */\n freeMemoryBytes: number | null;\n reason: string | null;\n /** Per-runtime reachability and staleness. Empty on a flat legacy body. */\n runtimes: LocalRuntimeStatus[];\n /** The server's own plain-language caveats for this snapshot. */\n notes: string[];\n sampledAt: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Narrowing helpers\n// ---------------------------------------------------------------------------\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction str(source: Record<string, unknown>, key: string): string | null {\n const v = source[key];\n return typeof v === 'string' && v.length > 0 ? v : null;\n}\n\nfunction num(source: Record<string, unknown>, key: string): number | null {\n const v = source[key];\n return typeof v === 'number' && Number.isFinite(v) ? v : null;\n}\n\nfunction bool(source: Record<string, unknown>, key: string, fallback = false): boolean {\n const v = source[key];\n return typeof v === 'boolean' ? v : fallback;\n}\n\nfunction list(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\n/**\n * Drop anything that looks like a native-profile launcher invocation or an\n * absolute path into the private account store. The server is supposed to\n * strip these; this is the client-side backstop, because the cost of printing\n * one is unacceptable and the cost of showing \"no command\" is a sentence.\n */\nconst FORBIDDEN_COMMAND = /(launcher\\.mjs|native-profiles|account-connections|console-startup|\\/\\.ashlr\\b|Bearer\\s|--token\\b)/i;\n\nexport function sanitizeCommand(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n if (trimmed.length === 0 || trimmed.length > 200) return null;\n if (FORBIDDEN_COMMAND.test(trimmed)) return null;\n // A newline would let a payload smuggle a second command onto the surface.\n if (/[\\r\\n]/.test(trimmed)) return null;\n return trimmed;\n}\n\nfunction clampPercent(value: number | null): number | null {\n if (value === null) return null;\n return Math.max(0, Math.min(100, value));\n}\n\nfunction projectWindow(raw: unknown): AccountWindow | null {\n const r = record(raw);\n if (!r) return null;\n const id = str(r, 'id') ?? str(r, 'label');\n if (id === null) return null;\n const native = record(r['nativeReport']);\n const limitReached = bool(r, 'limitReached') || bool(r, 'rateLimitReached');\n const measuredRaw = r['measured'];\n return {\n id,\n label: str(r, 'label'),\n usedPercent: clampPercent(num(r, 'usedPercent') ?? num(r, 'used_percent')),\n resetsAt: str(r, 'resetsAt') ?? str(r, 'resets_at'),\n resetDescription:\n (native ? str(native, 'resetDescription') : null) ?? str(r, 'resetDescription'),\n limitReached,\n // Absent → measured, EXCEPT under a limit flag, which is the one case the\n // upstream writes the sentinel 100. Defaulting a flagged window to\n // `measured: true` would let a denial print as \"100% used\".\n measured: typeof measuredRaw === 'boolean' ? measuredRaw : !limitReached,\n };\n}\n\nfunction projectCredits(raw: unknown): AccountCredits | null {\n const r = record(raw);\n if (!r) return null;\n const balance = str(r, 'balance');\n const parsed = balance === null ? num(r, 'balance') : Number.parseFloat(balance);\n return {\n hasCredits: bool(r, 'hasCredits') || bool(r, 'has_credits'),\n unlimited: bool(r, 'unlimited'),\n balance,\n balanceValue: typeof parsed === 'number' && Number.isFinite(parsed) ? parsed : null,\n };\n}\n\nconst PROVIDERS: readonly string[] = ['claude', 'codex', 'grok'];\n\nfunction projectAccount(raw: unknown): Account | null {\n const r = record(raw);\n if (!r) return null;\n const id = str(r, 'id');\n const provider = str(r, 'provider');\n if (id === null || provider === null || !PROVIDERS.includes(provider)) return null;\n\n const windows = list(r['windows'])\n .map(projectWindow)\n .filter((w): w is AccountWindow => w !== null);\n\n const state = str(r, 'state');\n const auth = str(r, 'authentication');\n const unsupportedRaw = record(r['unsupported']);\n\n return {\n id,\n label: str(r, 'label') ?? id,\n provider: provider as AccountProvider,\n state:\n state === 'checking' || state === 'observed' || state === 'signed-out' || state === 'unavailable'\n ? state\n : 'unavailable',\n authentication: auth === 'signed-in' || auth === 'signed-out' ? auth : 'unknown',\n health: str(r, 'health'),\n planType: str(r, 'planType') ?? str(r, 'plan_type'),\n observedAt: str(r, 'observedAt'),\n windows,\n binding: projectWindow(r['binding']),\n credits: projectCredits(r['credits']),\n reason: str(r, 'reason'),\n unsupported: projectUnsupported(r, unsupportedRaw),\n reconnectCommand: sanitizeCommand(r['reconnectCommand']),\n notes: list(r['notes']).filter((n): n is string => typeof n === 'string'),\n };\n}\n\n/**\n * A version-pinned probe that failed CLOSED, named rather than swallowed.\n *\n * `unsupported` is not a field on the wire. Owner T reports the failure as the\n * verbatim probe code in `reason` (`usage-version-unsupported`) and states the\n * pin in `notes`, so this derives the structured form from those rather than\n * requiring a late contract change. An explicit `unsupported` object is still\n * honoured first, so a server that grows one later wins without a client edit.\n */\nfunction projectUnsupported(\n r: Record<string, unknown>,\n explicit: Record<string, unknown> | null,\n): Account['unsupported'] {\n if (explicit) {\n return {\n code: str(explicit, 'code') ?? CLAUDE_VERSION_REASON,\n pinnedVersion: str(explicit, 'pinnedVersion') ?? str(explicit, 'version'),\n };\n }\n const reason = str(r, 'reason');\n if (reason !== CLAUDE_VERSION_REASON) return null;\n return { code: reason, pinnedVersion: CLAUDE_USAGE_PINNED_VERSION };\n}\n\n/**\n * The read-only banner. Owner T reports lease ownership as a structured\n * `collector` status, not a flat `collectorNote`, so the note is derived from\n * it — and ONLY when another process owns the lease, because that is the one\n * case where these readings may be staler than this server's poll interval.\n * A stray `collectorNote` string is still accepted for forward compatibility.\n */\nfunction projectCollectorNote(root: Record<string, unknown>): string | null {\n const flat = str(root, 'collectorNote');\n if (flat) return flat;\n const collector = record(root['collector']);\n if (!collector) return null;\n if (str(collector, 'owner') !== 'another-collector') return null;\n return (\n str(collector, 'note') ??\n 'Another collector process owns the quota-refresh lease, so these readings are read-only and may be staler than this server’s poll interval.'\n );\n}\n\nexport function projectAccountsSnapshot(raw: unknown): AccountsSnapshot | null {\n const root = record(raw);\n if (!root) return null;\n const rawAccounts = Array.isArray(root['accounts']) ? root['accounts'] : Array.isArray(raw) ? raw : null;\n if (rawAccounts === null) return null;\n return {\n sampledAt: str(root, 'sampledAt'),\n refreshing: bool(root, 'refreshing'),\n accounts: rawAccounts.map(projectAccount).filter((a): a is Account => a !== null),\n collectorNote: projectCollectorNote(root),\n };\n}\n\nfunction projectDay(raw: unknown): DailyUsage | null {\n const r = record(raw);\n if (!r) return null;\n const day = str(r, 'day');\n if (day === null || !/^\\d{4}-\\d{2}-\\d{2}$/.test(day)) return null;\n return {\n day,\n tokensIn: num(r, 'tokensIn') ?? 0,\n tokensOut: num(r, 'tokensOut') ?? 0,\n estCostUsd: num(r, 'estCostUsd') ?? 0,\n sessions: num(r, 'sessions') ?? 0,\n cacheRead: num(r, 'cacheRead'),\n cacheWrite: num(r, 'cacheWrite'),\n cacheHitRate: num(r, 'cacheHitRate'),\n };\n}\n\n/**\n * `byDay` is the wire key. Owner T wraps the series as\n * `{window, byDay, estimated, caveats}` rather than returning a bare array\n * (documented deviation 1), so `byDay` is read FIRST. `days` and a bare array\n * remain accepted so an older or differently-shaped server degrades to a\n * rendered series instead of a dead panel.\n */\nexport function projectUsageSeries(raw: unknown, requested: SeriesWindow): UsageSeries | null {\n const root = record(raw);\n const rawDays = root\n ? Array.isArray(root['byDay'])\n ? root['byDay']\n : Array.isArray(root['days'])\n ? root['days']\n : null\n : Array.isArray(raw)\n ? raw\n : null;\n if (rawDays === null) return null;\n const windowValue = root ? str(root, 'window') : null;\n return {\n window: windowValue === '7d' || windowValue === '30d' ? windowValue : requested,\n days: rawDays\n .map(projectDay)\n .filter((d): d is DailyUsage => d !== null)\n .sort((a, b) => a.day.localeCompare(b.day)),\n generatedAt: root ? str(root, 'generatedAt') : null,\n // The producer asserts estimation explicitly. Absent → still true: every\n // cost column on this route is price-table derived, and defaulting the\n // disclosure OFF would drop it exactly when the server is older.\n estimated: root ? bool(root, 'estimated', true) : true,\n caveats: root ? list(root['caveats']).filter((c): c is string => typeof c === 'string') : [],\n };\n}\n\nfunction projectLocalModel(raw: unknown, runtime: LocalModel['runtime']): LocalModel | null {\n const r = record(raw);\n if (!r) return null;\n // `label`/`id` are owner T's spellings; `name`/`model` are the Ollama-native\n // ones a differently-shaped server might send.\n const name = str(r, 'label') ?? str(r, 'id') ?? str(r, 'name') ?? str(r, 'model');\n if (name === null) return null;\n const caps = r['capabilities'];\n const state = str(r, 'state');\n const supportsTools = r['supportsTools'];\n\n // `nativeContextLength` is the architecture maximum; `contextLength` is what\n // the runtime actually configured for the loaded instance. They are two\n // different facts and the panel shows the gap between them, so they must not\n // collapse onto one field.\n const nativeContext = num(r, 'nativeContextLength') ?? num(r, 'nativeContext');\n const configuredContext = num(r, 'contextLength') ?? num(r, 'configuredContext');\n\n const placement = str(r, 'placement');\n\n return {\n name,\n runtime,\n loaded: state !== null ? state === 'loaded' : bool(r, 'loaded') || bool(r, 'resident'),\n sizeBytes: num(r, 'sizeBytes') ?? num(r, 'size'),\n sizeVramBytes: num(r, 'sizeVramBytes') ?? num(r, 'size_vram'),\n placement:\n placement === 'gpu' || placement === 'cpu' || placement === 'split' ? placement : 'unknown',\n gpuPercent: clampPercent(num(r, 'gpuPercent')),\n memoryPercent: clampPercent(num(r, 'memoryPercent')),\n family: str(r, 'family'),\n arch: str(r, 'arch'),\n expiresAt: str(r, 'expiresAt') ?? str(r, 'expires_at'),\n parameterSize: str(r, 'parameterSize') ?? str(r, 'parameter_size'),\n quantization: str(r, 'quantization') ?? str(r, 'quantization_level'),\n nativeContext,\n // Only a genuine narrowing is worth showing. When the runtime reports the\n // same number twice there is no truncation to report.\n configuredContext:\n configuredContext !== null && nativeContext !== null && configuredContext === nativeContext\n ? null\n : configuredContext,\n capabilities: Array.isArray(caps) ? caps.filter((c): c is string => typeof c === 'string') : null,\n supportsTools: typeof supportsTools === 'boolean' ? supportsTools : null,\n };\n}\n\nfunction projectRuntimeReport(\n raw: unknown,\n runtime: NonNullable<LocalModel['runtime']>,\n): { status: LocalRuntimeStatus; models: LocalModel[] } | null {\n const r = record(raw);\n if (!r) return null;\n const rawModels = Array.isArray(r['models']) ? r['models'] : null;\n if (rawModels === null) return null;\n const models = rawModels\n .map((m) => projectLocalModel(m, runtime))\n .filter((m): m is LocalModel => m !== null);\n const stale = bool(r, 'stale');\n return {\n models,\n status: {\n runtime,\n reachable: bool(r, 'reachable'),\n reason: str(r, 'reason'),\n stale,\n // Only meaningful under `stale`. A staleForMs on a fresh report would be\n // a contradiction, and printing it would age a current reading.\n staleForMs: stale ? num(r, 'staleForMs') : null,\n modelCount: models.length,\n },\n };\n}\n\n/**\n * Owner T reports local availability per RUNTIME (`ollama`, `lmStudio`) with a\n * shared `machine` budget. This panel answers one question — \"what can I run\n * right now, and against how much memory\" — so the runtimes are flattened into\n * one list, each row keeping its `runtime` so it stays attributable.\n *\n * Reachability is the OR of the runtimes: one dead runtime is not an unreachable\n * local stack. `reason` is only carried when NOTHING is reachable, because a\n * degradation note beside a working list would misdescribe what is on screen.\n *\n * A flat `{reachable, models, memoryBudgetBytes}` body is still accepted, so an\n * older or differently-shaped server degrades rather than rendering nothing.\n */\nexport function projectLocalModels(raw: unknown): LocalModelsSnapshot | null {\n const root = record(raw);\n if (!root) return null;\n\n const ollama = projectRuntimeReport(root['ollama'], 'ollama');\n const lmStudio = projectRuntimeReport(root['lmStudio'] ?? root['lmstudio'], 'lmstudio');\n\n if (ollama !== null || lmStudio !== null) {\n const reports = [ollama, lmStudio].filter((x): x is NonNullable<typeof x> => x !== null);\n const reachable = reports.some((x) => x.status.reachable);\n const machine = record(root['machine']);\n return {\n reachable,\n models: reports.flatMap((x) => x.models),\n memoryBudgetBytes:\n (machine ? num(machine, 'totalMemoryBytes') : null) ??\n num(root, 'memoryBudgetBytes') ??\n num(root, 'memoryBudget'),\n freeMemoryBytes: machine ? num(machine, 'freeMemoryBytes') : null,\n reason: reachable\n ? null\n : (reports.map((x) => x.status.reason).find((x) => x !== null) ?? null),\n runtimes: reports.map((x) => x.status),\n notes: list(root['notes']).filter((n): n is string => typeof n === 'string'),\n sampledAt: str(root, 'sampledAt'),\n };\n }\n\n const rawModels = Array.isArray(root['models']) ? root['models'] : null;\n if (rawModels === null) return null;\n return {\n reachable: bool(root, 'reachable', true),\n models: rawModels.map((m) => projectLocalModel(m, null)).filter((m): m is LocalModel => m !== null),\n memoryBudgetBytes: num(root, 'memoryBudgetBytes') ?? num(root, 'memoryBudget'),\n freeMemoryBytes: num(root, 'freeMemoryBytes'),\n reason: str(root, 'reason'),\n // A flat legacy body carries no per-runtime reachability, so there is\n // nothing to attribute and nothing to call stale. An empty list says that\n // honestly; a fabricated entry would not.\n runtimes: [],\n notes: list(root['notes']).filter((n): n is string => typeof n === 'string'),\n sampledAt: str(root, 'sampledAt'),\n };\n}\n","/**\n * routes/verse/usage/usage-queries.ts — the reads behind the Usage section.\n *\n * `/api/control` is fetched through the shared `controlSnapshotQuery` so this\n * section rides the same cache (and the same SSE invalidation) as every other\n * view rather than opening a second copy of a large snapshot.\n *\n * `/api/verse/control` is owner B's new route. It is fetched through a\n * NON-throwing wrapper because this section must still render when the route\n * is absent (server started without --allow-dispatch, or B's route not landed\n * yet): a missing configured-caps source is a degraded panel, not a dead\n * section. 401 is the one error that still propagates — an expired read\n * session is an unauthorized state for the whole surface, not a degraded one.\n *\n * The cache key is deliberately NOT shared with the Autonomy section's own\n * read of the same route: this module stores a wrapper shape, and two owners\n * writing different value types under one key would be a real bug.\n */\nimport type { FrontierUsage } from '../../../../core/usage/frontier-usage.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { projectLocalModels, type SeriesWindow } from './usage-contract.js';\n\nexport const USAGE_FRONTIER_KEY = 'verse-usage-frontier';\nexport const USAGE_VERSE_CONTROL_KEY = 'verse-usage-control';\n\n/** GET /api/usage — per-engine frontier usage (see core/usage/frontier-usage.ts). */\nexport const frontierUsageQuery: QueryDef<FrontierUsage> = {\n key: USAGE_FRONTIER_KEY,\n fetch: (signal) => apiGet<FrontierUsage>('/api/usage', signal),\n};\n\nexport interface VerseControlRead {\n /** Raw body; narrowed by `projectVerseControl` (owner B's types are not landed). */\n raw: unknown;\n available: boolean;\n reason: string | null;\n}\n\nfunction describeControlFailure(err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return 'This server does not expose /api/verse/control, so configured caps and today’s spend are unavailable here.';\n }\n return `Configured caps unavailable (HTTP ${err.status}).`;\n }\n return 'Configured caps unavailable: the request failed.';\n}\n\nexport const verseControlQuery: QueryDef<VerseControlRead> = {\n key: USAGE_VERSE_CONTROL_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>('/api/verse/control', signal);\n return { raw, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { raw: null, available: false, reason: describeControlFailure(err) };\n }\n },\n};\n\n// ---------------------------------------------------------------------------\n// Owner T's routes (GET /api/verse/{accounts,usage-series,local-models})\n// ---------------------------------------------------------------------------\n//\n// These three are fetched through the SAME non-throwing wrapper pattern as\n// /api/verse/control, for the same reason and one more: they are landing in\n// parallel with this section. A server that predates them answers 404, and a\n// 404 here means \"this panel is degraded\", not \"the Usage view is broken\".\n// 401 still propagates, because an expired read session is an unauthorized\n// state for the whole surface.\n//\n// The bodies are narrowed structurally by usage-contract.ts rather than cast,\n// so a field-name drift between T's route and this client degrades to an\n// honest \"unknown\" instead of throwing at render time.\n\nexport const USAGE_ACCOUNTS_KEY = 'verse-usage-accounts';\nexport const USAGE_LOCAL_MODELS_KEY = 'verse-usage-local-models';\nexport const USAGE_SERIES_KEY_PREFIX = 'verse-usage-series';\n\n/** A read that is allowed to be absent. `raw` is null when it was. */\nexport interface OptionalRead {\n raw: unknown;\n available: boolean;\n reason: string | null;\n}\n\nfunction describeOptionalFailure(path: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return `This server does not expose ${path} yet, so this panel has no source.`;\n }\n return `${path} answered HTTP ${err.status}.`;\n }\n return `${path} could not be reached.`;\n}\n\nfunction optionalGet(path: string): (signal?: AbortSignal) => Promise<OptionalRead> {\n return async (signal) => {\n try {\n const raw = await apiGet<unknown>(path, signal);\n return { raw, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { raw: null, available: false, reason: describeOptionalFailure(path, err) };\n }\n };\n}\n\n/** GET /api/verse/accounts — per-account state, windows, credits, plan. */\nexport const verseAccountsQuery: QueryDef<OptionalRead> = {\n key: USAGE_ACCOUNTS_KEY,\n fetch: optionalGet('/api/verse/accounts'),\n};\n\n// ---------------------------------------------------------------------------\n// GET /api/verse/local-models — and why this one read retries\n// ---------------------------------------------------------------------------\n//\n// `/api/verse/local-models` probes the runtimes live on every request, with a\n// 2s per-probe timeout (core/verse/local-models.ts\n// VERSE_LOCAL_PROBE_TIMEOUT_MS). A probe that times out is reported as\n// `{reachable: false, reason: 'ollama-unreachable'}` in a perfectly ordinary\n// HTTP 200 — which is correct on the server's terms (it genuinely did not get\n// an answer) but is NOT the same fact as \"Ollama is not running\", and nothing\n// in the payload distinguishes the two.\n//\n// That distinction matters here because this section is the thing that causes\n// the timeout. Mounting Usage, and every press of its Refresh button, fires\n// seven reads at once, several of which spawn short-lived account-probe\n// processes server-side; measured against a live Ollama with twelve models,\n// roughly one burst in ten starves the 2s probe and comes back\n// `ollama-unreachable`. Nothing re-reads this route afterwards — it has no SSE\n// invalidation key — so that one false negative is what the operator stares\n// at, and pressing Refresh re-creates the very burst that produced it.\n//\n// So a reported-unreachable local stack is RE-READ, up to twice, with a short\n// gap for the burst to drain. This is not \"ignore the failure\": the retries\n// are bounded, each one is a real request, and whatever the last read says is\n// what this section renders — a runtime that is genuinely down answers fast\n// (connection refused, not a timeout) and still reports unreachable, three\n// times, in well under a second.\n//\n// Only an AVAILABLE read is retried. A 404/500 (`available: false`) is a\n// statement about the route, not about the runtime, and re-asking cannot\n// change it.\n\n/** Two extra reads at most, spaced so the section's own request burst drains. */\nconst LOCAL_MODELS_RETRY_DELAYS_MS = [350, 1200] as const;\n\nconst readLocalModels = optionalGet('/api/verse/local-models');\n\nfunction reportsNothingReachable(read: OptionalRead): boolean {\n if (!read.available) return false;\n const snapshot = projectLocalModels(read.raw);\n return snapshot !== null && !snapshot.reachable;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new DOMException('Aborted', 'AbortError'));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/** GET /api/verse/local-models — resident vs installed, VRAM split, tools. */\nexport const verseLocalModelsQuery: QueryDef<OptionalRead> = {\n key: USAGE_LOCAL_MODELS_KEY,\n fetch: async (signal) => {\n let read = await readLocalModels(signal);\n for (const delayMs of LOCAL_MODELS_RETRY_DELAYS_MS) {\n if (!reportsNothingReachable(read)) return read;\n await sleep(delayMs, signal);\n read = await readLocalModels(signal);\n }\n return read;\n },\n};\n\n// One QueryDef per window, created once at module scope: useQuery keys on\n// `def.key`, and minting a fresh object per render would be harmless but\n// useRefresh/useRefetch's useCallback deps would churn for no reason.\nconst SERIES_QUERIES: Record<SeriesWindow, QueryDef<OptionalRead>> = {\n '7d': {\n key: `${USAGE_SERIES_KEY_PREFIX}:7d`,\n fetch: optionalGet('/api/verse/usage-series?window=7d'),\n },\n '30d': {\n key: `${USAGE_SERIES_KEY_PREFIX}:30d`,\n fetch: optionalGet('/api/verse/usage-series?window=30d'),\n },\n};\n\nexport function usageSeriesQuery(window: SeriesWindow): QueryDef<OptionalRead> {\n return SERIES_QUERIES[window];\n}\n"],"mappings":"2CAmLA,IAAa,EACX,UA0QF,SAAS,EAAO,EAAgD,CAC9D,OAAO,OAAO,GAAU,UAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,EACrE,EACD,IACN,CAEA,SAAS,EAAI,EAAiC,EAA4B,CACxE,IAAM,EAAI,EAAO,GACjB,OAAO,OAAO,GAAM,UAAY,EAAE,OAAS,EAAI,EAAI,IACrD,CAEA,SAAS,EAAI,EAAiC,EAA4B,CACxE,IAAM,EAAI,EAAO,GACjB,OAAO,OAAO,GAAM,UAAY,OAAO,SAAS,CAAC,EAAI,EAAI,IAC3D,CAEA,SAAS,EAAK,EAAiC,EAAa,EAAW,GAAgB,CACrF,IAAM,EAAI,EAAO,GACjB,OAAO,OAAO,GAAM,UAAY,EAAI,CACtC,CAEA,SAAS,EAAK,EAA2B,CACvC,OAAO,MAAM,QAAQ,CAAK,EAAI,EAAQ,CAAC,CACzC,CAQA,IAAM,EAAoB,sGAE1B,SAAgB,EAAgB,EAA+B,CAC7D,GAAI,OAAO,GAAU,SAAU,OAAO,KACtC,IAAM,EAAU,EAAM,KAAK,EAK3B,OAJI,EAAQ,SAAW,GAAK,EAAQ,OAAS,KACzC,EAAkB,KAAK,CAAO,GAE9B,SAAS,KAAK,CAAO,EAAU,KAC5B,CACT,CAEA,SAAS,EAAa,EAAqC,CAEzD,OADI,IAAU,KAAa,KACpB,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,CAAK,CAAC,CACzC,CAEA,SAAS,EAAc,EAAoC,CACzD,IAAM,EAAI,EAAO,CAAG,EACpB,GAAI,CAAC,EAAG,OAAO,KACf,IAAM,EAAK,EAAI,EAAG,IAAI,GAAK,EAAI,EAAG,OAAO,EACzC,GAAI,IAAO,KAAM,OAAO,KACxB,IAAM,EAAS,EAAO,EAAE,YAAe,EACjC,EAAe,EAAK,EAAG,cAAc,GAAK,EAAK,EAAG,kBAAkB,EACpE,EAAc,EAAE,SACtB,MAAO,CACL,KACA,MAAO,EAAI,EAAG,OAAO,EACrB,YAAa,EAAa,EAAI,EAAG,aAAa,GAAK,EAAI,EAAG,cAAc,CAAC,EACzE,SAAU,EAAI,EAAG,UAAU,GAAK,EAAI,EAAG,WAAW,EAClD,kBACG,EAAS,EAAI,EAAQ,kBAAkB,EAAI,OAAS,EAAI,EAAG,kBAAkB,EAChF,eAIA,SAAU,OAAO,GAAgB,UAAY,EAAc,CAAC,CAC9D,CACF,CAEA,SAAS,EAAe,EAAqC,CAC3D,IAAM,EAAI,EAAO,CAAG,EACpB,GAAI,CAAC,EAAG,OAAO,KACf,IAAM,EAAU,EAAI,EAAG,SAAS,EAC1B,EAAS,IAAY,KAAO,EAAI,EAAG,SAAS,EAAI,OAAO,WAAW,CAAO,EAC/E,MAAO,CACL,WAAY,EAAK,EAAG,YAAY,GAAK,EAAK,EAAG,aAAa,EAC1D,UAAW,EAAK,EAAG,WAAW,EAC9B,UACA,aAAc,OAAO,GAAW,UAAY,OAAO,SAAS,CAAM,EAAI,EAAS,IACjF,CACF,CAEA,IAAM,EAA+B,CAAC,SAAU,QAAS,MAAM,EAE/D,SAAS,EAAe,EAA8B,CACpD,IAAM,EAAI,EAAO,CAAG,EACpB,GAAI,CAAC,EAAG,OAAO,KACf,IAAM,EAAK,EAAI,EAAG,IAAI,EAChB,EAAW,EAAI,EAAG,UAAU,EAClC,GAAI,IAAO,MAAQ,IAAa,MAAQ,CAAC,EAAU,SAAS,CAAQ,EAAG,OAAO,KAE9E,IAAM,EAAU,EAAK,EAAE,OAAU,CAAC,CAC/B,IAAI,CAAa,CAAC,CAClB,OAAQ,GAA0B,IAAM,IAAI,EAEzC,EAAQ,EAAI,EAAG,OAAO,EACtB,EAAO,EAAI,EAAG,gBAAgB,EAC9B,EAAiB,EAAO,EAAE,WAAc,EAE9C,MAAO,CACL,KACA,MAAO,EAAI,EAAG,OAAO,GAAK,EAChB,WACV,MACE,IAAU,YAAc,IAAU,YAAc,IAAU,cAAgB,IAAU,cAChF,EACA,cACN,eAAgB,IAAS,aAAe,IAAS,aAAe,EAAO,UACvE,OAAQ,EAAI,EAAG,QAAQ,EACvB,SAAU,EAAI,EAAG,UAAU,GAAK,EAAI,EAAG,WAAW,EAClD,WAAY,EAAI,EAAG,YAAY,EAC/B,UACA,QAAS,EAAc,EAAE,OAAU,EACnC,QAAS,EAAe,EAAE,OAAU,EACpC,OAAQ,EAAI,EAAG,QAAQ,EACvB,YAAa,EAAmB,EAAG,CAAc,EACjD,iBAAkB,EAAgB,EAAE,gBAAmB,EACvD,MAAO,EAAK,EAAE,KAAQ,CAAC,CAAC,OAAQ,GAAmB,OAAO,GAAM,QAAQ,CAC1E,CACF,CAWA,SAAS,EACP,EACA,EACwB,CACxB,GAAI,EACF,MAAO,CACL,KAAM,EAAI,EAAU,MAAM,GAAA,4BAC1B,cAAe,EAAI,EAAU,eAAe,GAAK,EAAI,EAAU,SAAS,CAC1E,EAEF,IAAM,EAAS,EAAI,EAAG,QAAQ,EAE9B,OADI,IAAA,4BACG,CAAE,KAAM,EAAQ,cAAe,CAA4B,EADrB,IAE/C,CASA,SAAS,EAAqB,EAA8C,CAC1E,IAAM,EAAO,EAAI,EAAM,eAAe,EACtC,GAAI,EAAM,OAAO,EACjB,IAAM,EAAY,EAAO,EAAK,SAAY,EAG1C,MAFI,CAAC,GACD,EAAI,EAAW,OAAO,IAAM,oBAA4B,KAE1D,EAAI,EAAW,MAAM,GACrB,6IAEJ,CAEA,SAAgB,EAAwB,EAAuC,CAC7E,IAAM,EAAO,EAAO,CAAG,EACvB,GAAI,CAAC,EAAM,OAAO,KAClB,IAAM,EAAc,MAAM,QAAQ,EAAK,QAAW,EAAI,EAAK,SAAc,MAAM,QAAQ,CAAG,EAAI,EAAM,KAEpG,OADI,IAAgB,KAAa,KAC1B,CACL,UAAW,EAAI,EAAM,WAAW,EAChC,WAAY,EAAK,EAAM,YAAY,EACnC,SAAU,EAAY,IAAI,CAAc,CAAC,CAAC,OAAQ,GAAoB,IAAM,IAAI,EAChF,cAAe,EAAqB,CAAI,CAC1C,CACF,CAEA,SAAS,EAAW,EAAiC,CACnD,IAAM,EAAI,EAAO,CAAG,EACpB,GAAI,CAAC,EAAG,OAAO,KACf,IAAM,EAAM,EAAI,EAAG,KAAK,EAExB,OADI,IAAQ,MAAQ,CAAC,sBAAsB,KAAK,CAAG,EAAU,KACtD,CACL,MACA,SAAU,EAAI,EAAG,UAAU,GAAK,EAChC,UAAW,EAAI,EAAG,WAAW,GAAK,EAClC,WAAY,EAAI,EAAG,YAAY,GAAK,EACpC,SAAU,EAAI,EAAG,UAAU,GAAK,EAChC,UAAW,EAAI,EAAG,WAAW,EAC7B,WAAY,EAAI,EAAG,YAAY,EAC/B,aAAc,EAAI,EAAG,cAAc,CACrC,CACF,CASA,SAAgB,EAAmB,EAAc,EAA6C,CAC5F,IAAM,EAAO,EAAO,CAAG,EACjB,EAAU,EACZ,MAAM,QAAQ,EAAK,KAAQ,EACzB,EAAK,MACL,MAAM,QAAQ,EAAK,IAAO,EACxB,EAAK,KACL,KACJ,MAAM,QAAQ,CAAG,EACf,EACA,KACN,GAAI,IAAY,KAAM,OAAO,KAC7B,IAAM,EAAc,EAAO,EAAI,EAAM,QAAQ,EAAI,KACjD,MAAO,CACL,OAAQ,IAAgB,MAAQ,IAAgB,MAAQ,EAAc,EACtE,KAAM,EACH,IAAI,CAAU,CAAC,CACf,OAAQ,GAAuB,IAAM,IAAI,CAAC,CAC1C,MAAM,EAAG,IAAM,EAAE,IAAI,cAAc,EAAE,GAAG,CAAC,EAC5C,YAAa,EAAO,EAAI,EAAM,aAAa,EAAI,KAI/C,UAAW,IAAO,EAAK,EAAM,YAAa,EAAI,EAC9C,QAAS,EAAO,EAAK,EAAK,OAAU,CAAC,CAAC,OAAQ,GAAmB,OAAO,GAAM,QAAQ,EAAI,CAAC,CAC7F,CACF,CAEA,SAAS,EAAkB,EAAc,EAAmD,CAC1F,IAAM,EAAI,EAAO,CAAG,EACpB,GAAI,CAAC,EAAG,OAAO,KAGf,IAAM,EAAO,EAAI,EAAG,OAAO,GAAK,EAAI,EAAG,IAAI,GAAK,EAAI,EAAG,MAAM,GAAK,EAAI,EAAG,OAAO,EAChF,GAAI,IAAS,KAAM,OAAO,KAC1B,IAAM,EAAO,EAAE,aACT,EAAQ,EAAI,EAAG,OAAO,EACtB,EAAgB,EAAE,cAMlB,EAAgB,EAAI,EAAG,qBAAqB,GAAK,EAAI,EAAG,eAAe,EACvE,EAAoB,EAAI,EAAG,eAAe,GAAK,EAAI,EAAG,mBAAmB,EAEzE,EAAY,EAAI,EAAG,WAAW,EAEpC,MAAO,CACL,OACA,UACA,OAAQ,IAAU,KAA4B,EAAK,EAAG,QAAQ,GAAK,EAAK,EAAG,UAAU,EAA5D,IAAU,SACnC,UAAW,EAAI,EAAG,WAAW,GAAK,EAAI,EAAG,MAAM,EAC/C,cAAe,EAAI,EAAG,eAAe,GAAK,EAAI,EAAG,WAAW,EAC5D,UACE,IAAc,OAAS,IAAc,OAAS,IAAc,QAAU,EAAY,UACpF,WAAY,EAAa,EAAI,EAAG,YAAY,CAAC,EAC7C,cAAe,EAAa,EAAI,EAAG,eAAe,CAAC,EACnD,OAAQ,EAAI,EAAG,QAAQ,EACvB,KAAM,EAAI,EAAG,MAAM,EACnB,UAAW,EAAI,EAAG,WAAW,GAAK,EAAI,EAAG,YAAY,EACrD,cAAe,EAAI,EAAG,eAAe,GAAK,EAAI,EAAG,gBAAgB,EACjE,aAAc,EAAI,EAAG,cAAc,GAAK,EAAI,EAAG,oBAAoB,EACnE,gBAGA,kBACE,IAAsB,MAAQ,IAAkB,MAAQ,IAAsB,EAC1E,KACA,EACN,aAAc,MAAM,QAAQ,CAAI,EAAI,EAAK,OAAQ,GAAmB,OAAO,GAAM,QAAQ,EAAI,KAC7F,cAAe,OAAO,GAAkB,UAAY,EAAgB,IACtE,CACF,CAEA,SAAS,EACP,EACA,EAC6D,CAC7D,IAAM,EAAI,EAAO,CAAG,EACpB,GAAI,CAAC,EAAG,OAAO,KACf,IAAM,EAAY,MAAM,QAAQ,EAAE,MAAS,EAAI,EAAE,OAAY,KAC7D,GAAI,IAAc,KAAM,OAAO,KAC/B,IAAM,EAAS,EACZ,IAAK,GAAM,EAAkB,EAAG,CAAO,CAAC,CAAC,CACzC,OAAQ,GAAuB,IAAM,IAAI,EACtC,EAAQ,EAAK,EAAG,OAAO,EAC7B,MAAO,CACL,SACA,OAAQ,CACN,UACA,UAAW,EAAK,EAAG,WAAW,EAC9B,OAAQ,EAAI,EAAG,QAAQ,EACvB,QAGA,WAAY,EAAQ,EAAI,EAAG,YAAY,EAAI,KAC3C,WAAY,EAAO,MACrB,CACF,CACF,CAeA,SAAgB,EAAmB,EAA0C,CAC3E,IAAM,EAAO,EAAO,CAAG,EACvB,GAAI,CAAC,EAAM,OAAO,KAElB,IAAM,EAAS,EAAqB,EAAK,OAAW,QAAQ,EACtD,EAAW,EAAqB,EAAK,UAAe,EAAK,SAAa,UAAU,EAEtF,GAAI,IAAW,MAAQ,IAAa,KAAM,CACxC,IAAM,EAAU,CAAC,EAAQ,CAAQ,CAAC,CAAC,OAAQ,GAAkC,IAAM,IAAI,EACjF,EAAY,EAAQ,KAAM,GAAM,EAAE,OAAO,SAAS,EAClD,EAAU,EAAO,EAAK,OAAU,EACtC,MAAO,CACL,YACA,OAAQ,EAAQ,QAAS,GAAM,EAAE,MAAM,EACvC,mBACG,EAAU,EAAI,EAAS,kBAAkB,EAAI,OAC9C,EAAI,EAAM,mBAAmB,GAC7B,EAAI,EAAM,cAAc,EAC1B,gBAAiB,EAAU,EAAI,EAAS,iBAAiB,EAAI,KAC7D,OAAQ,EACJ,KACC,EAAQ,IAAK,GAAM,EAAE,OAAO,MAAM,CAAC,CAAC,KAAM,GAAM,IAAM,IAAI,GAAK,KACpE,SAAU,EAAQ,IAAK,GAAM,EAAE,MAAM,EACrC,MAAO,EAAK,EAAK,KAAQ,CAAC,CAAC,OAAQ,GAAmB,OAAO,GAAM,QAAQ,EAC3E,UAAW,EAAI,EAAM,WAAW,CAClC,CACF,CAEA,IAAM,EAAY,MAAM,QAAQ,EAAK,MAAS,EAAI,EAAK,OAAY,KAEnE,OADI,IAAc,KAAa,KACxB,CACL,UAAW,EAAK,EAAM,YAAa,EAAI,EACvC,OAAQ,EAAU,IAAK,GAAM,EAAkB,EAAG,IAAI,CAAC,CAAC,CAAC,OAAQ,GAAuB,IAAM,IAAI,EAClG,kBAAmB,EAAI,EAAM,mBAAmB,GAAK,EAAI,EAAM,cAAc,EAC7E,gBAAiB,EAAI,EAAM,iBAAiB,EAC5C,OAAQ,EAAI,EAAM,QAAQ,EAI1B,SAAU,CAAC,EACX,MAAO,EAAK,EAAK,KAAQ,CAAC,CAAC,OAAQ,GAAmB,OAAO,GAAM,QAAQ,EAC3E,UAAW,EAAI,EAAM,WAAW,CAClC,CACF,CChxBA,IAAa,EAAqB,uBACrB,EAA0B,sBAG1B,EAA8C,CACzD,IAAK,EACL,MAAQ,GAAW,EAAsB,aAAc,CAAM,CAC/D,EASA,SAAS,EAAuB,EAAsB,CAOpD,OANI,aAAe,EACb,EAAI,SAAW,IACV,6GAEF,qCAAqC,EAAI,OAAO,IAElD,kDACT,CAEA,IAAa,EAAgD,CAC3D,IAAK,EACL,MAAO,KAAO,IAAW,CACvB,GAAI,CAEF,MAAO,CAAE,IAAA,MADS,EAAgB,qBAAsB,CAAM,EAChD,UAAW,GAAM,OAAQ,IAAK,CAC9C,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EACpE,MAAO,CAAE,IAAK,KAAM,UAAW,GAAO,OAAQ,EAAuB,CAAG,CAAE,CAC5E,CACF,CACF,EAiBa,EAAqB,uBACrB,EAAyB,2BACzB,EAA0B,qBASvC,SAAS,EAAwB,EAAc,EAAsB,CAOnE,OANI,aAAe,EACb,EAAI,SAAW,IACV,+BAA+B,EAAK,oCAEtC,GAAG,EAAK,iBAAiB,EAAI,OAAO,GAEtC,GAAG,EAAK,uBACjB,CAEA,SAAS,EAAY,EAA+D,CAClF,OAAO,KAAO,IAAW,CACvB,GAAI,CAEF,MAAO,CAAE,IAAA,MADS,EAAgB,EAAM,CAAM,EAChC,UAAW,GAAM,OAAQ,IAAK,CAC9C,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EACpE,MAAO,CAAE,IAAK,KAAM,UAAW,GAAO,OAAQ,EAAwB,EAAM,CAAG,CAAE,CACnF,CACF,CACF,CAGA,IAAa,EAA6C,CACxD,IAAK,EACL,MAAO,EAAY,qBAAqB,CAC1C,EAmCM,EAA+B,CAAC,IAAK,IAAI,EAEzC,EAAkB,EAAY,yBAAyB,EAE7D,SAAS,EAAwB,EAA6B,CAC5D,GAAI,CAAC,EAAK,UAAW,MAAO,GAC5B,IAAM,EAAW,EAAmB,EAAK,GAAG,EAC5C,OAAO,IAAa,MAAQ,CAAC,EAAS,SACxC,CAEA,SAAS,EAAM,EAAY,EAAqC,CAC9D,OAAO,IAAI,SAAe,EAAS,IAAW,CAC5C,GAAI,GAAQ,QAAS,CACnB,EAAO,IAAI,aAAa,UAAW,YAAY,CAAC,EAChD,MACF,CACA,IAAM,MAAsB,CAC1B,aAAa,CAAK,EAClB,EAAO,IAAI,aAAa,UAAW,YAAY,CAAC,CAClD,EACM,EAAQ,eAAiB,CAC7B,GAAQ,oBAAoB,QAAS,CAAO,EAC5C,EAAQ,CACV,EAAG,CAAE,EACL,GAAQ,iBAAiB,QAAS,EAAS,CAAE,KAAM,EAAK,CAAC,CAC3D,CAAC,CACH,CAGA,IAAa,EAAgD,CAC3D,IAAK,EACL,MAAO,KAAO,IAAW,CACvB,IAAI,EAAO,MAAM,EAAgB,CAAM,EACvC,IAAK,IAAM,KAAW,EAA8B,CAClD,GAAI,CAAC,EAAwB,CAAI,EAAG,OAAO,EAC3C,MAAM,EAAM,EAAS,CAAM,EAC3B,EAAO,MAAM,EAAgB,CAAM,CACrC,CACA,OAAO,CACT,CACF,EAKM,EAA+D,CACnE,KAAM,CACJ,IAAK,GAAG,EAAwB,KAChC,MAAO,EAAY,mCAAmC,CACxD,EACA,MAAO,CACL,IAAK,GAAG,EAAwB,MAChC,MAAO,EAAY,oCAAoC,CACzD,CACF,EAEA,SAAgB,EAAiB,EAA8C,CAC7E,OAAO,EAAe,EACxB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-_izD07R9.js";import{N as n,S as r,l as i,o as a,u as o,w as s}from"./global-CYfRwH6t.js";import{S as c,b as l,d as u,f as d,j as f}from"./VerseShared-CFE5B-IY.js";var p=[`user-message`,`turn-started`,`text-delta`,`assistant-message`,`thinking`,`tool-use`,`tool-result`,`usage`,`turn-done`,`error`,`cancelled`,`compaction`,`context`,`thinking-delta`,`thinking-progress`,`progress`,`status`,`recovered`,`history-truncated`,`source`,`remote-status`,`remote-pr`];function m(e){return Math.min(1e3*2**e,15e3)}var h=e=>e===null||typeof e==`number`&&Number.isFinite(e)&&e>=0;function g(e){return e.type===`context`?typeof e.contextTokens==`number`&&Number.isFinite(e.contextTokens)&&e.contextTokens>=0&&typeof e.exact==`boolean`&&h(e.contextWindow)&&(e.autoCompactAt===void 0||h(e.autoCompactAt)):e.type!==`compaction`||(e.trigger===`auto`||e.trigger===`manual`)&&h(e.preTokens)&&h(e.postTokens)&&h(e.durationMs)}var _=e=>e===void 0||typeof e==`number`&&Number.isFinite(e)&&e>=0;function v(e){switch(e.type){case`thinking-delta`:return typeof e.text==`string`;case`thinking-progress`:return e.estimatedTokens!==void 0&&_(e.estimatedTokens);case`progress`:return(e.phase===`thinking`||e.phase===`tool`||e.phase===`writing`||e.phase===`waiting`)&&typeof e.elapsedMs==`number`&&Number.isFinite(e.elapsedMs)&&e.elapsedMs>=0&&(e.tool===void 0||typeof e.tool==`string`)&&_(e.outTokens)&&_(e.tokPerSec);case`status`:return(e.kind===`retry`||e.kind===`preflight`||e.kind===`watchdog`)&&typeof e.message==`string`;case`history-truncated`:return typeof e.droppedBefore==`number`&&Number.isFinite(e.droppedBefore);case`source`:{let t=e.source;return!!t&&typeof t==`object`&&typeof t.kind==`string`&&typeof t.ref==`string`&&t.ref.length>0&&typeof t.title==`string`&&typeof t.origin==`string`}default:return!0}}function y(e){try{let t=JSON.parse(e);if(!t||typeof t!=`object`)return null;let n=t;return typeof n.seq!=`number`||typeof n.type!=`string`||!g(t)||!v(t)?null:t}catch{return null}}var b=`verse-sessions`;function x(e=!0){return n()?`/api/events?topics=${b}`:`/api/events?${e?`topics=${b}&`:``}client=${encodeURIComponent(s())}`}var S=!1;function C(){let e=null,t=null,i=0,a=!1,o=!1,s=()=>{if(a||typeof EventSource>`u`||r().phase!==`authenticated`)return;let c=n()||!S&&!o,l=new EventSource(x(c),{withCredentials:!0}),d=!1;e=l,l.onopen=()=>{d=!0,i=0,o&&=(S=!0,!1)},l.addEventListener(`verse-sessions`,()=>u()),l.onerror=()=>{if(l.close(),e===l&&(e=null),!(a||r().phase!==`authenticated`)){if(!d&&c&&!n()){o=!0,s();return}o=!1,t=setTimeout(()=>{t=null,i+=1,s()},m(i))}}};return s(),()=>{a=!0,t&&clearTimeout(t),t=null,e?.close(),e=null}}var w=e(t(),1),T=5e3,E=new Map,D=new Set;function O(e){return D.add(e),()=>D.delete(e)}function k(){return E}function A(e,t){if(!((E.get(e)??-1)>=t)){E=new Map(E).set(e,t);for(let e of[...D])e();d(e,t)}}function j(){return(0,w.useSyncExternalStore)(O,k,k)}function M(){let e=i(l,{freshMs:4500}),t=i(c),n=o(l),r=(0,w.useCallback)(()=>n(),[n]);f(r,T);let s=j();return{activity:e.data??null,meta:t.data??null,metaError:t.status===`error`?a(t.error):null,localSeen:s}}export{y as a,C as i,M as n,p as r,A as t};
|
|
2
|
+
//# sourceMappingURL=use-chat-activity-O8I0Ho0m.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-chat-activity-O8I0Ho0m.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/verse-events.ts","../../../../../../src/web-ui/routes/verse/chat/use-chat-activity.ts"],"sourcesContent":["/**\n * routes/verse/verse-events.ts — the Verse console's SSE vocabulary and its\n * sidebar channel, since scoped consoles never join data/sse.ts's global feed:\n *\n * - VERSE_EVENT_TYPES + parseVerseEventFrame: every VerseEvent name a\n * session stream can carry, and the frame validation both streams share.\n * The per-session stream itself (resume by `?after=`, one store update\n * per animation frame, ref-counted connections) lives in\n * session-stream.ts (V3.10); the replay-from-zero opener that used to sit\n * here had no callers left and was removed.\n * - openVerseListChannel: one EventSource against /api/events for the\n * `verse-sessions` list digest, which just invalidates the sidebar's\n * cache keys. It subscribes with `?topics=verse-sessions` (V3.10) so the\n * server skips the dashboard snapshot and the other groups this console\n * would only discard.\n *\n * Every URL carries the per-tab client proof as `?client=` — the same\n * construction data/client.ts's eventsUrl() uses, because EventSource cannot\n * send the proof as a header (see read-session.ts readSessionClientProof).\n */\nimport type { VerseEvent, VerseEventType } from '../../data/api-types.js';\nimport { getAuthSnapshot, getReadClientProof } from '../../data/auth-store.js';\nimport { isRemoteMobileMode } from '../../data/remote-mode.js';\nimport { invalidateVerseLists } from './verse-queries.js';\n\n/**\n * Every VerseEvent name the stream can carry. EventSource only dispatches\n * NAMED events to listeners registered by name, so a type missing here is\n * silently dropped — the check below turns a new union member into a compile\n * error in this file instead of a meter that never moves.\n */\nconst EVENT_TYPES = [\n 'user-message',\n 'turn-started',\n 'text-delta',\n 'assistant-message',\n 'thinking',\n 'tool-use',\n 'tool-result',\n 'usage',\n 'turn-done',\n 'error',\n 'cancelled',\n // V3.9 — a server that predates them simply never sends these names.\n 'compaction',\n 'context',\n // V3.10 transient (SSE only, never replayed — see VERSE_TRANSIENT_EVENT_TYPES\n // in core/verse/types.ts). They carry the last PERSISTED seq, so a store that\n // dedupes by seq and does not know them yet simply drops them.\n 'thinking-delta',\n 'thinking-progress',\n 'progress',\n 'status',\n // V3.10 persisted.\n 'recovered',\n 'history-truncated',\n // V3.15 persisted (additive): injected / seat-reported sources.\n 'source',\n // 3.15 persisted (Devin seats).\n 'remote-status',\n 'remote-pr',\n] as const satisfies readonly VerseEventType[];\n\ntype UnlistedEventType = Exclude<VerseEventType, (typeof EVENT_TYPES)[number]>;\n// Fails to compile when VerseEventType gains a member EVENT_TYPES does not list.\nconst EVENT_TYPES_EXHAUSTIVE: [UnlistedEventType] extends [never] ? true : never = true;\nvoid EVENT_TYPES_EXHAUSTIVE;\n\nexport const VERSE_EVENT_TYPES: readonly VerseEventType[] = EVENT_TYPES;\n\nfunction backoffMs(attempt: number): number {\n return Math.min(1000 * 2 ** attempt, 15_000);\n}\n\nconst nullableCount = (v: unknown): boolean => v === null || (typeof v === 'number' && Number.isFinite(v) && v >= 0);\n\n/**\n * The two V3.9 frames feed arithmetic (the meter, the compaction count), so a\n * malformed one is dropped here rather than turning the meter into `NaN`.\n * Older event types keep the original seq/type-only check.\n */\nfunction v39FieldsValid(e: Record<string, unknown>): boolean {\n if (e.type === 'context') {\n return typeof e.contextTokens === 'number' && Number.isFinite(e.contextTokens) && e.contextTokens >= 0 &&\n typeof e.exact === 'boolean' && nullableCount(e.contextWindow) &&\n (e.autoCompactAt === undefined || nullableCount(e.autoCompactAt));\n }\n if (e.type === 'compaction') {\n return (e.trigger === 'auto' || e.trigger === 'manual') &&\n nullableCount(e.preTokens) && nullableCount(e.postTokens) && nullableCount(e.durationMs);\n }\n return true;\n}\n\nconst optionalCount = (v: unknown): boolean => v === undefined || (typeof v === 'number' && Number.isFinite(v) && v >= 0);\n\n/**\n * V3.10 frames that feed arithmetic or a live label (elapsed, tok/s, token\n * estimate) — same rule as v39FieldsValid: malformed → dropped, never NaN.\n */\nfunction v310FieldsValid(e: Record<string, unknown>): boolean {\n switch (e.type) {\n case 'thinking-delta':\n return typeof e.text === 'string';\n case 'thinking-progress':\n return e.estimatedTokens !== undefined && optionalCount(e.estimatedTokens);\n case 'progress':\n return (e.phase === 'thinking' || e.phase === 'tool' || e.phase === 'writing' || e.phase === 'waiting') &&\n typeof e.elapsedMs === 'number' && Number.isFinite(e.elapsedMs) && e.elapsedMs >= 0 &&\n (e.tool === undefined || typeof e.tool === 'string') &&\n optionalCount(e.outTokens) && optionalCount(e.tokPerSec);\n case 'status':\n return (e.kind === 'retry' || e.kind === 'preflight' || e.kind === 'watchdog') && typeof e.message === 'string';\n case 'history-truncated':\n return typeof e.droppedBefore === 'number' && Number.isFinite(e.droppedBefore);\n case 'source': {\n // Kept inline (not core/verse/trace isVerseSource): this file is on the\n // chat's first-paint path and must not pull the trace module in.\n const s = e.source as Record<string, unknown> | null | undefined;\n return !!s && typeof s === 'object' && typeof s.kind === 'string' && typeof s.ref === 'string' && s.ref.length > 0 &&\n typeof s.title === 'string' && typeof s.origin === 'string';\n }\n default:\n return true;\n }\n}\n\n/** Exported for tests: one SSE frame's data → a VerseEvent, or null when malformed. */\nexport function parseVerseEventFrame(raw: string): VerseEvent | null {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object') return null;\n const candidate = parsed as Partial<VerseEvent>;\n if (typeof candidate.seq !== 'number' || typeof candidate.type !== 'string') return null;\n if (!v39FieldsValid(parsed as Record<string, unknown>)) return null;\n if (!v310FieldsValid(parsed as Record<string, unknown>)) return null;\n return parsed as VerseEvent;\n } catch {\n return null;\n }\n}\n\n/** The only /api/events group the Verse console listens to. */\nexport const VERSE_LIST_TOPICS = 'verse-sessions';\n\n/**\n * The sidebar channel's URL. `topics` narrows the server to the one group\n * this console listens to; `client` stays last, as in eventsUrl(). Without\n * `topics` the server sends every group — the historical request, which is\n * also what the refusal fallback below falls back to.\n */\nexport function verseListEventsUrl(withTopics = true): string {\n // The gateway accepts only the scoped topic and adds the Hub client proof\n // on its private hop. A phone must never construct or send that proof.\n if (isRemoteMobileMode()) return `/api/events?topics=${VERSE_LIST_TOPICS}`;\n const topics = withTopics ? `topics=${VERSE_LIST_TOPICS}&` : '';\n return `/api/events?${topics}client=${encodeURIComponent(getReadClientProof())}`;\n}\n\n/**\n * Set once this page has PROVEN that the server refuses `?topics=`: a\n * connection with it failed before it ever opened, and the same channel\n * without it then opened. The read-session boundary on SSE paths used to\n * answer 401 to any parameter besides `client`, and a sidebar that never\n * updates is far worse than one that is sent (and discards) extra groups.\n * Page-lifetime only — the same rule session-stream.ts applies to `?after=`:\n * a server that gains support is used again after a reload.\n */\nlet topicsRefused = false;\n\n/** Tests: forget a proven refusal. */\nexport function resetVerseListChannelCapabilities(): void {\n topicsRefused = false;\n}\n\n/**\n * Sidebar digest channel: listens only for `verse-sessions` on /api/events\n * and refreshes the session list + bootstrap when it fires.\n */\nexport function openVerseListChannel(): () => void {\n let source: EventSource | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempt = 0;\n let disposed = false;\n /** This connection is the no-`topics` retry that tests whether `topics` was refused. */\n let probing = false;\n\n const connect = () => {\n if (disposed || typeof EventSource === 'undefined') return;\n if (getAuthSnapshot().phase !== 'authenticated') return;\n const withTopics = isRemoteMobileMode() || (!topicsRefused && !probing);\n const es = new EventSource(verseListEventsUrl(withTopics), { withCredentials: true });\n let opened = false;\n source = es;\n es.onopen = () => {\n opened = true;\n attempt = 0;\n if (probing) {\n topicsRefused = true;\n probing = false;\n }\n };\n es.addEventListener('verse-sessions', () => invalidateVerseLists());\n es.onerror = () => {\n es.close();\n if (source === es) source = null;\n if (disposed || getAuthSnapshot().phase !== 'authenticated') return;\n if (!opened && withTopics && !isRemoteMobileMode()) {\n // Refused before it opened, with `topics`: find out at once whether\n // the parameter is what was refused (see topicsRefused). One probe,\n // no delay — a real outage fails the probe too and falls through to\n // the ordinary backoff below.\n probing = true;\n connect();\n return;\n }\n probing = false;\n timer = setTimeout(() => {\n timer = null;\n attempt += 1;\n connect();\n }, backoffMs(attempt));\n };\n };\n\n connect();\n\n return () => {\n disposed = true;\n if (timer) clearTimeout(timer);\n timer = null;\n source?.close();\n source = null;\n };\n}\n","/**\n * routes/verse/chat/use-chat-activity.ts — the Chat surface's view of C1's\n * activity + session-meta routes (unit C2).\n *\n * WHY NOT C1's useActivity: that hook runs the shell's CURSOR loop (it owns\n * completions, the rail badges and the native \"Finished:\" notifications).\n * The chat list needs only the present tense — who is running, what they are\n * doing, what needs the operator — so it reads the same route without a\n * cursor, through the shared query cache under VERSE_ACTIVITY_KEY. Any other\n * reader of that key (the rail, a future pane) shares the one request.\n *\n * Polls every 5 s ONLY while the Chat surface and the window are visible\n * (C0's usePollWhileVisible), and catches up the moment it is shown again.\n * Activity answers in < 5 ms from memory (SPEC-310C budget), so this is\n * cheap; it is still never faster than the 2 s floor.\n *\n * Also owns this tab's \"seen\" map: opening a chat clears its unread dot NOW,\n * whether or not the server-side POST can run (it needs a held token).\n */\nimport { useCallback, useSyncExternalStore } from 'react';\nimport { readFailureReason } from '../../../data/client.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { markVerseSessionSeen, verseActivityQuery, verseSessionMetaQuery } from '../verse-queries.js';\n\nexport const CHAT_ACTIVITY_POLL_MS = 5_000;\n\n// ---- local seen map --------------------------------------------------------\n\nlet seen = new Map<string, number>();\nconst seenListeners = new Set<() => void>();\n\nfunction subscribeSeen(listener: () => void): () => void {\n seenListeners.add(listener);\n return () => seenListeners.delete(listener);\n}\n\nfunction getSeen(): ReadonlyMap<string, number> {\n return seen;\n}\n\n/** Record that the operator saw `sessionId` up to `turnCount`, locally and (best-effort) on the server. */\nexport function noteSessionSeen(sessionId: string, turnCount: number): void {\n if ((seen.get(sessionId) ?? -1) >= turnCount) return;\n seen = new Map(seen).set(sessionId, turnCount);\n for (const listener of [...seenListeners]) listener();\n void markVerseSessionSeen(sessionId, turnCount);\n}\n\n/** Test seam. */\nexport function resetLocalSeen(): void {\n seen = new Map();\n for (const listener of [...seenListeners]) listener();\n}\n\nexport function useLocalSeen(): ReadonlyMap<string, number> {\n return useSyncExternalStore(subscribeSeen, getSeen, getSeen);\n}\n\n// ---- queries ---------------------------------------------------------------\n\nexport function useChatActivity() {\n const activity = useQuery(verseActivityQuery, { freshMs: CHAT_ACTIVITY_POLL_MS - 500 });\n const meta = useQuery(verseSessionMetaQuery);\n const refetchActivity = useRefetch(verseActivityQuery);\n const tick = useCallback(() => refetchActivity(), [refetchActivity]);\n usePollWhileVisible(tick, CHAT_ACTIVITY_POLL_MS);\n const localSeen = useLocalSeen();\n return {\n /** null = the route is not mounted on this server (or has not answered yet). */\n activity: activity.data ?? null,\n meta: meta.data ?? null,\n /**\n * Why session-meta could not be read (the route's own sentence, e.g. the\n * chat engine is not answering), or null. A 404 is not an error here — it\n * reads as `meta: null` (\"not on this server\").\n */\n metaError: meta.status === 'error' ? readFailureReason(meta.error) : null,\n localSeen,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-_izD07R9.js";import{T as n,n as r,t as i}from"./global-CYfRwH6t.js";import{y as a}from"./format-V6IiIMAL.js";import{n as o}from"./control-queries-C5uQTzJi.js";var s=e(t(),1);function c(e){return e instanceof r?`This server runs without dispatch, so that action is unavailable.`:e instanceof o?e.message:e instanceof i?e.status===401?"The mutation token was rejected. Unlock again with the token `ashlr verse` printed.":e.detail?a(e.detail):e.status===400?a(e.message):e.status===409?`The server refused the action, and sent no reason.`:a(e.message):e instanceof Error?a(e.message):`That action failed. Try again.`}function l(){let[e,t]=(0,s.useState)(!1),[i,a]=(0,s.useState)(null),[o,l]=(0,s.useState)(!1),[u,d]=(0,s.useState)(!1),[f,p]=(0,s.useState)(``),m=(0,s.useRef)(null),h=(0,s.useCallback)(async(e,n)=>{t(!0),a(null);try{let t=await e();n?.(t)}catch(e){e instanceof r?l(!0):a(c(e))}finally{t(!1)}},[]),g=(0,s.useCallback)((e,t,r)=>{a(null);let i=r;if(n()){h(e,i);return}m.current={fn:e,onResult:i},p(t),d(!0)},[h]),_=(0,s.useCallback)(()=>{d(!1);let e=m.current;m.current=null,e&&n()&&h(e.fn,e.onResult)},[h]);return{request:g,busy:e,error:i,clearError:(0,s.useCallback)(()=>a(null),[]),readOnly:o,tokenOpen:u,tokenReason:f,closeToken:_}}export{l as n,c as t};
|
|
2
|
+
//# sourceMappingURL=use-guarded-action-BZ6Bye9l.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-guarded-action-BZ6Bye9l.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/autonomy/use-guarded-action.ts"],"sourcesContent":["/**\n * routes/verse/autonomy/use-guarded-action.ts — the one place a Verse control\n * surface turns \"the operator clicked something destructive\" into an actual\n * request. Shared by the Autonomy cockpit and the Approvals surface.\n *\n * It folds together the three things every mutating click in this app has to\n * do, which were previously re-implemented per call site:\n *\n * - **Token hand-off.** No mutation hold yet → remember the action, open\n * MutationTokenDialog, and run it once the token lands. The hold is read\n * LIVE on dialog close, never from a render-time snapshot, because\n * MutationTokenDialog's onClose fires before this component re-renders.\n * - **Read-only sessions.** Every POST 404s when the server was started\n * without dispatch. That is a session mode, not a failure, so it flips a\n * `readOnly` flag the surface renders as an explanation — never as an error\n * toast and never as a crash.\n * - **Busy + error state** for exactly one in-flight action at a time.\n */\nimport { useCallback, useRef, useState } from 'react';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { ApiError, DispatchDisabledError } from '../../../data/client.js';\nimport { VerseControlLockedError } from './control-queries.js';\nimport { tidyProse } from './format.js';\n\nexport function describeControlError(err: unknown): string {\n if (err instanceof DispatchDisabledError) return 'This server runs without dispatch, so that action is unavailable.';\n if (err instanceof VerseControlLockedError) return err.message;\n if (err instanceof ApiError) {\n if (err.status === 401) return 'The mutation token was rejected. Unlock again with the token `ashlr verse` printed.';\n // The control plane writes a careful refusal ladder — \"no repositories are\n // enrolled, so the loop would do nothing. Add scope first.\" — and returns\n // it as `note` on the 409 body. A blanket \"something else is already\n // running\" replaced every one of those with a sentence that was usually\n // false and never actionable. Show the server's own words whenever it\n // sent any; the generic line is now only the last resort. `tidyProse`\n // reads any ISO instant in those words as local time.\n if (err.detail) return tidyProse(err.detail);\n if (err.status === 400) return tidyProse(err.message);\n if (err.status === 409) return 'The server refused the action, and sent no reason.';\n return tidyProse(err.message);\n }\n return err instanceof Error ? tidyProse(err.message) : 'That action failed. Try again.';\n}\n\nexport interface GuardedAction {\n /**\n * Run `fn`, prompting for the mutation token first when none is held.\n *\n * `onResult` receives `fn`'s resolved value when it succeeds. It exists\n * because the value was previously dropped on the floor, and for the daemon\n * routes that value carries the server's own account of what just happened\n * (`VerseDaemonActionResult.note` — e.g. that an ordinary stop also engaged\n * the global kill switch). It is not called when `fn` throws.\n */\n request: <T>(fn: () => Promise<T>, reason: string, onResult?: (result: T) => void) => void;\n busy: boolean;\n error: string | null;\n clearError: () => void;\n /** True once a POST 404'd — the server has no dispatch enabled. */\n readOnly: boolean;\n /** Bind these three to <MutationTokenDialog/>. */\n tokenOpen: boolean;\n tokenReason: string;\n closeToken: () => void;\n}\n\nexport function useGuardedAction(): GuardedAction {\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [readOnly, setReadOnly] = useState(false);\n const [tokenOpen, setTokenOpen] = useState(false);\n const [tokenReason, setTokenReason] = useState('');\n // The deferred action and the callback that wants its result travel together\n // — the token dialog may run it a render later, long after `request` returned.\n const pending = useRef<{ fn: () => Promise<unknown>; onResult?: (result: never) => void } | null>(null);\n\n const perform = useCallback(\n async (fn: () => Promise<unknown>, onResult?: (result: never) => void) => {\n setBusy(true);\n setError(null);\n try {\n const result = await fn();\n onResult?.(result as never);\n } catch (err) {\n if (err instanceof DispatchDisabledError) setReadOnly(true);\n else setError(describeControlError(err));\n } finally {\n setBusy(false);\n }\n },\n [],\n );\n\n const request = useCallback(\n <T,>(fn: () => Promise<T>, reason: string, onResult?: (result: T) => void) => {\n setError(null);\n const handler = onResult as ((result: never) => void) | undefined;\n if (hasMutationHold()) {\n void perform(fn, handler);\n return;\n }\n pending.current = { fn, onResult: handler };\n setTokenReason(reason);\n setTokenOpen(true);\n },\n [perform],\n );\n\n const closeToken = useCallback(() => {\n setTokenOpen(false);\n const next = pending.current;\n pending.current = null;\n // Live read: the dialog closes synchronously after setToken().\n if (next && hasMutationHold()) void perform(next.fn, next.onResult);\n }, [perform]);\n\n const clearError = useCallback(() => setError(null), []);\n\n return { request, busy, error, clearError, readOnly, tokenOpen, tokenReason, closeToken };\n}\n"],"mappings":"4PAwBA,SAAgB,EAAqB,EAAsB,CAiBzD,OAhBI,aAAe,EAA8B,oEAC7C,aAAe,EAAgC,EAAI,QACnD,aAAe,EACb,EAAI,SAAW,IAAY,sFAQ3B,EAAI,OAAe,EAAU,EAAI,MAAM,EACvC,EAAI,SAAW,IAAY,EAAU,EAAI,OAAO,EAChD,EAAI,SAAW,IAAY,qDACxB,EAAU,EAAI,OAAO,EAEvB,aAAe,MAAQ,EAAU,EAAI,OAAO,EAAI,gCACzD,CAwBA,SAAgB,GAAkC,CAChD,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAwB,IAAI,EAChD,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAS,EAAK,EACxC,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAAS,EAAK,EAC1C,CAAC,EAAa,IAAA,EAAkB,EAAA,SAAA,CAAS,EAAE,EAG3C,GAAA,EAAU,EAAA,OAAA,CAAkF,IAAI,EAEhG,GAAA,EAAU,EAAA,YAAA,CACd,MAAO,EAA4B,IAAuC,CACxE,EAAQ,EAAI,EACZ,EAAS,IAAI,EACb,GAAI,CACF,IAAM,EAAS,MAAM,EAAG,EACxB,IAAW,CAAe,CAC5B,OAAS,EAAK,CACR,aAAe,EAAuB,EAAY,EAAI,EACrD,EAAS,EAAqB,CAAG,CAAC,CACzC,QAAU,CACR,EAAQ,EAAK,CACf,CACF,EACA,CAAC,CACH,EAEM,GAAA,EAAU,EAAA,YAAA,EACT,EAAsB,EAAgB,IAAmC,CAC5E,EAAS,IAAI,EACb,IAAM,EAAU,EAChB,GAAI,EAAgB,EAAG,CACrB,EAAa,EAAI,CAAO,EACxB,MACF,CACA,EAAQ,QAAU,CAAE,KAAI,SAAU,CAAQ,EAC1C,EAAe,CAAM,EACrB,EAAa,EAAI,CACnB,EACA,CAAC,CAAO,CACV,EAEM,GAAA,EAAa,EAAA,YAAA,KAAkB,CACnC,EAAa,EAAK,EAClB,IAAM,EAAO,EAAQ,QACrB,EAAQ,QAAU,KAEd,GAAQ,EAAgB,GAAG,EAAa,EAAK,GAAI,EAAK,QAAQ,CACpE,EAAG,CAAC,CAAO,CAAC,EAIZ,MAAO,CAAE,UAAS,OAAM,QAAO,YAAA,EAFZ,EAAA,YAAA,KAAkB,EAAS,IAAI,EAAG,CAAC,CAEvB,EAAY,WAAU,YAAW,cAAa,YAAW,CAC1F"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-_izD07R9.js";var n=e(t(),1);function r(e=1e3){let[t,r]=(0,n.useState)(()=>Date.now());return(0,n.useEffect)(()=>{let t=setInterval(()=>r(Date.now()),e);return()=>clearInterval(t)},[e]),t}export{r as t};
|
|
2
|
+
//# sourceMappingURL=use-ticker-CUsNALmP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-ticker-CUsNALmP.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/autonomy/use-ticker.ts"],"sourcesContent":["/**\n * routes/verse/autonomy/use-ticker.ts — a shared 1Hz clock for the countdown\n * and the relative ages in the status header — one interval per consumer\n * rather than a bespoke timer inside each panel.\n *\n * It deliberately keeps ticking under `prefers-reduced-motion`: a countdown is\n * information, not decoration. The design language's quiet-motion rule governs\n * transitions and animation, not numbers that have to stay true.\n */\nimport { useEffect, useState } from 'react';\n\nexport function useNow(intervalMs = 1000): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), intervalMs);\n return () => clearInterval(id);\n }, [intervalMs]);\n return now;\n}\n"],"mappings":"0GAWA,SAAgB,EAAO,EAAa,IAAc,CAChD,GAAM,CAAC,EAAK,IAAA,EAAU,EAAA,SAAA,KAAe,KAAK,IAAI,CAAC,EAK/C,OAJA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAK,gBAAkB,EAAO,KAAK,IAAI,CAAC,EAAG,CAAU,EAC3D,UAAa,cAAc,CAAE,CAC/B,EAAG,CAAC,CAAU,CAAC,EACR,CACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-_izD07R9.js";import{T as n,n as r,t as i}from"./global-CYfRwH6t.js";import{r as a}from"./VerseShared-CFE5B-IY.js";import{y as o}from"./format-V6IiIMAL.js";var s=e(t(),1);function c(){let[e,t]=(0,s.useState)({open:!1,reason:``}),r=(0,s.useRef)(null),i=(0,s.useCallback)((e,i)=>n()?i():(r.current?.cancel(),new Promise((n,a)=>{r.current={run:()=>{i().then(n,a)},cancel:()=>n(null)},t({open:!0,reason:e})})),[]),a=(0,s.useCallback)(()=>{t({open:!1,reason:``});let e=r.current;e&&setTimeout(()=>{r.current===e&&(r.current=null,e.cancel())},0)},[]),o=(0,s.useCallback)(()=>{let e=r.current;r.current=null,e?.run()},[]);return{run:i,dialog:{open:e.open,reason:e.reason,onClose:a,onUnlocked:o}}}function l(e){return e instanceof r?"This server is read-only (started without dispatch — run `ashlr verse`), or older than this console.":e instanceof a?`Unlock actions with the mutation token first.`:e instanceof i?e.status===401?"The mutation token was rejected. Unlock again with the token `ashlr verse` printed.":e.code===`VERSE_SESSION_NOT_FOUND`?`This chat no longer exists on the server — it may have been deleted. Refresh the chat list.`:e.detail?o(e.detail):e.status===404?"This server does not have that route yet — update Ashlr and restart `ashlr verse`.":e.status===409?`A turn is already running in this chat. Wait for it or stop it first.`:o(e.message):e instanceof Error&&e.message?o(e.message):`Something went wrong.`}export{c as n,l as t};
|
|
2
|
+
//# sourceMappingURL=use-token-gate-DgnO9fbv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-token-gate-DgnO9fbv.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/context/use-token-gate.ts"],"sourcesContent":["/**\n * routes/verse/context/use-token-gate.ts — the mutation-token hand-off for\n * the self-contained context surfaces (handoff dialog, memory panel).\n *\n * Same contract as ChatSection's `withToken`, extracted because these\n * components are mounted by OTHER owners (the workspace header, the resources\n * panel) that cannot thread a guard down to them:\n *\n * - a held token → the action runs now;\n * - no token → the action is parked, MutationTokenDialog opens with a reason\n * saying what the click will do, and the action runs once unlocked;\n * - the dialog dismissed → the promise resolves `null`, so the caller can\n * tell \"not done\" from \"done\" without an exception.\n *\n * The hold is read LIVE (`hasMutationHold()`), never from a render snapshot:\n * MutationTokenDialog calls `onClose` before `onUnlocked` in the same tick,\n * so a snapshot taken at render time is always one step behind.\n */\nimport { useCallback, useRef, useState } from 'react';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { ApiError, DispatchDisabledError } from '../../../data/client.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\nimport { tidyProse } from '../autonomy/format.js';\n\nexport interface TokenGateDialogProps {\n open: boolean;\n reason: string;\n onClose: () => void;\n onUnlocked: () => void;\n}\n\nexport interface TokenGate {\n run<T>(reason: string, action: () => Promise<T>): Promise<T | null>;\n /** Spread onto <MutationTokenDialog />. */\n dialog: TokenGateDialogProps;\n}\n\nexport function useTokenGate(): TokenGate {\n const [prompt, setPrompt] = useState<{ open: boolean; reason: string }>({ open: false, reason: '' });\n const pending = useRef<{ run: () => void; cancel: () => void } | null>(null);\n\n const run = useCallback(<T,>(reason: string, action: () => Promise<T>): Promise<T | null> => {\n if (hasMutationHold()) return action();\n // A second click while the prompt is up supersedes the first: the earlier\n // caller is told \"not done\" rather than left waiting forever.\n pending.current?.cancel();\n return new Promise<T | null>((resolve, reject) => {\n pending.current = {\n run: () => { action().then(resolve, reject); },\n cancel: () => resolve(null),\n };\n setPrompt({ open: true, reason });\n });\n }, []);\n\n const onClose = useCallback(() => {\n setPrompt({ open: false, reason: '' });\n // onClose fires BEFORE onUnlocked on a successful submit, so only treat\n // this as a dismissal if nothing claimed the parked action by next tick.\n const parked = pending.current;\n if (!parked) return;\n setTimeout(() => {\n if (pending.current === parked) {\n pending.current = null;\n parked.cancel();\n }\n }, 0);\n }, []);\n\n const onUnlocked = useCallback(() => {\n const parked = pending.current;\n pending.current = null;\n parked?.run();\n }, []);\n\n return { run, dialog: { open: prompt.open, reason: prompt.reason, onClose, onUnlocked } };\n}\n\n/**\n * One sentence for a failed context action. Prefers the server's own words\n * (`ApiError.detail`), which the context routes write for a person.\n */\nexport function describeContextError(err: unknown): string {\n if (err instanceof DispatchDisabledError) {\n // A CODELESS 404 on a write: the dispatch gate, or a server that predates\n // this route — the two answer the same bare body by design (client.ts).\n // A missing chat is NOT this: it carries VERSE_SESSION_NOT_FOUND below.\n return 'This server is read-only (started without dispatch — run `ashlr verse`), or older than this console.';\n }\n if (err instanceof VerseMutationLockedError) return 'Unlock actions with the mutation token first.';\n if (err instanceof ApiError) {\n if (err.status === 401) return 'The mutation token was rejected. Unlock again with the token `ashlr verse` printed.';\n if (err.code === 'VERSE_SESSION_NOT_FOUND') return 'This chat no longer exists on the server — it may have been deleted. Refresh the chat list.';\n // The server's own words, with any ISO instant in them read as local time.\n if (err.detail) return tidyProse(err.detail);\n if (err.status === 404) return 'This server does not have that route yet — update Ashlr and restart `ashlr verse`.';\n if (err.status === 409) return 'A turn is already running in this chat. Wait for it or stop it first.';\n return tidyProse(err.message);\n }\n return err instanceof Error && err.message ? tidyProse(err.message) : 'Something went wrong.';\n}\n"],"mappings":"wPAqCA,SAAgB,GAA0B,CACxC,GAAM,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAA4C,CAAE,KAAM,GAAO,OAAQ,EAAG,CAAC,EAC7F,GAAA,EAAU,EAAA,OAAA,CAAuD,IAAI,EAErE,GAAA,EAAM,EAAA,YAAA,EAAiB,EAAgB,IACvC,EAAgB,EAAU,EAAO,GAGrC,EAAQ,SAAS,OAAO,EACjB,IAAI,SAAmB,EAAS,IAAW,CAChD,EAAQ,QAAU,CAChB,QAAW,CAAE,EAAO,CAAC,CAAC,KAAK,EAAS,CAAM,CAAG,EAC7C,WAAc,EAAQ,IAAI,CAC5B,EACA,EAAU,CAAE,KAAM,GAAM,QAAO,CAAC,CAClC,CAAC,GACA,CAAC,CAAC,EAEC,GAAA,EAAU,EAAA,YAAA,KAAkB,CAChC,EAAU,CAAE,KAAM,GAAO,OAAQ,EAAG,CAAC,EAGrC,IAAM,EAAS,EAAQ,QAClB,GACL,eAAiB,CACX,EAAQ,UAAY,IACtB,EAAQ,QAAU,KAClB,EAAO,OAAO,EAElB,EAAG,CAAC,CACN,EAAG,CAAC,CAAC,EAEC,GAAA,EAAa,EAAA,YAAA,KAAkB,CACnC,IAAM,EAAS,EAAQ,QACvB,EAAQ,QAAU,KAClB,GAAQ,IAAI,CACd,EAAG,CAAC,CAAC,EAEL,MAAO,CAAE,MAAK,OAAQ,CAAE,KAAM,EAAO,KAAM,OAAQ,EAAO,OAAQ,UAAS,YAAW,CAAE,CAC1F,CAMA,SAAgB,EAAqB,EAAsB,CAiBzD,OAhBI,aAAe,EAIV,uGAEL,aAAe,EAAiC,gDAChD,aAAe,EACb,EAAI,SAAW,IAAY,sFAC3B,EAAI,OAAS,0BAAkC,8FAE/C,EAAI,OAAe,EAAU,EAAI,MAAM,EACvC,EAAI,SAAW,IAAY,qFAC3B,EAAI,SAAW,IAAY,wEACxB,EAAU,EAAI,OAAO,EAEvB,aAAe,OAAS,EAAI,QAAU,EAAU,EAAI,OAAO,EAAI,uBACxE"}
|