@ashlr/hub 3.16.0 → 3.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +2 -2
- package/dist/authority-surface.json +5 -5
- package/dist/build-identity.json +2 -2
- package/dist/core/daemon/loop.js +1 -0
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/tick-hooks.d.ts +2 -0
- package/dist/core/daemon/tick-hooks.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +2 -1
- package/dist/core/fleet/tick-hooks-live.js +49 -7
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js +2 -0
- package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js.map +1 -0
- package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js +2 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js +2 -0
- package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js +3 -0
- package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js.map +1 -0
- package/dist/core/web/public/next/assets/App-Uy6lDpKw.js +8 -0
- package/dist/core/web/public/next/assets/App-Uy6lDpKw.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js.map +1 -0
- package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js +2 -0
- package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js.map +1 -0
- package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js.map +1 -0
- package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js +7 -0
- package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js.map +1 -0
- package/dist/core/web/public/next/assets/Button-CMR_Op-0.js +2 -0
- package/dist/core/web/public/next/assets/Button-CMR_Op-0.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js.map +1 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js +16 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js +2 -0
- package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js.map +1 -0
- package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js +5 -0
- package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js +3 -0
- package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js +9 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js +3 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js.map +1 -0
- package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js +4 -0
- package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js.map +1 -0
- package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js +2 -0
- package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js.map +1 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js.map +1 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js +2 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js +2 -0
- package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js.map +1 -0
- package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js.map +1 -0
- package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js +2 -0
- package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js.map +1 -0
- package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js +2 -0
- package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js.map +1 -0
- package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js +2 -0
- package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js +2 -0
- package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js +5 -0
- package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js.map +1 -0
- package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js +2 -0
- package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js +3 -0
- package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js +3 -0
- package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js +2 -0
- package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js.map +1 -0
- package/dist/core/web/public/next/assets/Input-CsSZI8QC.js +2 -0
- package/dist/core/web/public/next/assets/Input-CsSZI8QC.js.map +1 -0
- package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js +9 -0
- package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js +3 -0
- package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js +2 -0
- package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js.map +1 -0
- package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js +2 -0
- package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js.map +1 -0
- package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js +2 -0
- package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js.map +1 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js +2 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js +3 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js +72 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js +2 -0
- package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js.map +1 -0
- package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js +2 -0
- package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js.map +1 -0
- package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js +2 -0
- package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js +2 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js +3 -0
- package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js.map +1 -0
- package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js +2 -0
- package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js.map +1 -0
- package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js +7 -0
- package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js.map +1 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js +2 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js.map +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js +4 -0
- package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js.map +1 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js +9 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js.map +1 -0
- package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js.map +1 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js +2 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js.map +1 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js +2 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js +2 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js.map +1 -0
- package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js +3 -0
- package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js +3 -0
- package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js.map +1 -0
- package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js +2 -0
- package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js.map +1 -0
- package/dist/core/web/public/next/assets/Select-DjQDkPJU.js +2 -0
- package/dist/core/web/public/next/assets/Select-DjQDkPJU.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js +2 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js +2 -0
- package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js.map +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js +2 -0
- package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js.map +1 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js +2 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js.map +1 -0
- package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js.map +1 -0
- package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js +2 -0
- package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js +2 -0
- package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js.map +1 -0
- package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js +2 -0
- package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js.map +1 -0
- package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-BEToBKC3.js +2 -0
- package/dist/core/web/public/next/assets/Surface-BEToBKC3.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js.map +1 -0
- package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js +2 -0
- package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js.map +1 -0
- package/dist/core/web/public/next/assets/Tag-Chqolzxz.js +2 -0
- package/dist/core/web/public/next/assets/Tag-Chqolzxz.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js +3 -0
- package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js +26 -0
- package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js.map +1 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js +2 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js.map +1 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js +2 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js +3 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js +2 -0
- package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js +2 -0
- package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js +2 -0
- package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js.map +1 -0
- package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js +2 -0
- package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js +6 -0
- package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-BPyW8QC-.js +2 -0
- package/dist/core/web/public/next/assets/actions-BPyW8QC-.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js +2 -0
- package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js +7 -0
- package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js.map +1 -0
- package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js +2 -0
- package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js.map +1 -0
- package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js +2 -0
- package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js.map +1 -0
- package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js +2 -0
- package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js.map +1 -0
- package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js +2 -0
- package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js +2 -0
- package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js +2 -0
- package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-Di0_Q980.js +2 -0
- package/dist/core/web/public/next/assets/charts-Di0_Q980.js.map +1 -0
- package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js +2 -0
- package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js.map +1 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js +2 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js +2 -0
- package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js +2 -0
- package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js +2 -0
- package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js.map +1 -0
- package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js +2 -0
- package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js.map +1 -0
- package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js +2 -0
- package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js.map +1 -0
- package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js +3 -0
- package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js.map +1 -0
- package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js +2 -0
- package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js.map +1 -0
- package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js.map +1 -0
- package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js +2 -0
- package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js.map +1 -0
- package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js +2 -0
- package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js.map +1 -0
- package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js +2 -0
- package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js +2 -0
- package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js +2 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js +2 -0
- package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js +3 -0
- package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js.map +1 -0
- package/dist/core/web/public/next/assets/format-V6IiIMAL.js +2 -0
- package/dist/core/web/public/next/assets/format-V6IiIMAL.js.map +1 -0
- package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js +5 -0
- package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js.map +1 -0
- package/dist/core/web/public/next/assets/global-CYfRwH6t.js +3 -0
- package/dist/core/web/public/next/assets/global-CYfRwH6t.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js.map +1 -0
- package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js +2 -0
- package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js.map +1 -0
- package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js +2 -0
- package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-BBm_Cy62.js +2 -0
- package/dist/core/web/public/next/assets/icons-BBm_Cy62.js.map +1 -0
- package/dist/core/web/public/next/assets/index-_izD07R9.js +11 -0
- package/dist/core/web/public/next/assets/index-_izD07R9.js.map +1 -0
- package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js +2 -0
- package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js.map +1 -0
- package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js +2 -0
- package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js.map +1 -0
- package/dist/core/web/public/next/assets/live-model-D97AfBFz.js +2 -0
- package/dist/core/web/public/next/assets/live-model-D97AfBFz.js.map +1 -0
- package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js +2 -0
- package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js +2 -0
- package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js +2 -0
- package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js +7 -0
- package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js +2 -0
- package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js +2 -0
- package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js.map +1 -0
- package/dist/core/web/public/next/assets/nav-DC0ynjdb.js +2 -0
- package/dist/core/web/public/next/assets/nav-DC0ynjdb.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js +2 -0
- package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js.map +1 -0
- package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js +2 -0
- package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js.map +1 -0
- package/dist/core/web/public/next/assets/panes-DOXM13lF.js +3 -0
- package/dist/core/web/public/next/assets/panes-DOXM13lF.js.map +1 -0
- package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js +2 -0
- package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js.map +1 -0
- package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js +2 -0
- package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js +2 -0
- package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js +2 -0
- package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js.map +1 -0
- package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js +2 -0
- package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js.map +1 -0
- package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-Bynv7bPl.js +1 -0
- package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js +2 -0
- package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js +2 -0
- package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js.map +1 -0
- package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js +2 -0
- package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js.map +1 -0
- package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js +3 -0
- package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js.map +1 -0
- package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js +2 -0
- package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js.map +1 -0
- package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js +2 -0
- package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js.map +1 -0
- package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js.map +1 -0
- package/dist/core/web/public/next/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js +2 -0
- package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js.map +1 -0
- package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js +2 -0
- package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js.map +1 -0
- package/dist/core/web/public/next/assets/sheet-BxZSmdad.js +2 -0
- package/dist/core/web/public/next/assets/sheet-BxZSmdad.js.map +1 -0
- package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js +2 -0
- package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js.map +1 -0
- package/dist/core/web/public/next/assets/slots-BJc3RJkV.js +3 -0
- package/dist/core/web/public/next/assets/slots-BJc3RJkV.js.map +1 -0
- package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js +4 -0
- package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js.map +1 -0
- package/dist/core/web/public/next/assets/sse-It4xa040.js +2 -0
- package/dist/core/web/public/next/assets/sse-It4xa040.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js.map +1 -0
- package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js +2 -0
- package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js +2 -0
- package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js +2 -0
- package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js +6 -0
- package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js.map +1 -0
- package/dist/core/web/public/next/assets/thread-data-C8z55msn.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-C8z55msn.js.map +1 -0
- package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js +2 -0
- package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js.map +1 -0
- package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js +2 -0
- package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js.map +1 -0
- package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js +2 -0
- package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js.map +1 -0
- package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js +2 -0
- package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js.map +1 -0
- package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js.map +1 -0
- package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js +2 -0
- package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js.map +1 -0
- package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js +2 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js +2 -0
- package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js +2 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js +3 -0
- package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js.map +1 -0
- package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js +2 -0
- package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js.map +1 -0
- package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js +2 -0
- package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js.map +1 -0
- package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js +2 -0
- package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js.map +1 -0
- package/dist/core/web/public/next/index.html +2 -1
- package/dist/core/web/remote-gateway-policy.js +5 -0
- package/dist/core/web/remote-gateway-policy.js.map +1 -1
- package/dist/core/web/static.d.ts +4 -3
- package/dist/core/web/static.js +8 -5
- package/dist/core/web/static.js.map +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/node_modules/fast-uri/index.js +20 -5
- package/node_modules/fast-uri/lib/utils.js +8 -1
- package/node_modules/fast-uri/package.json +1 -1
- package/node_modules/fast-uri/test/component-safe-serialization.test.js +58 -0
- package/node_modules/fast-uri/test/ipv6-validation.test.js +34 -0
- package/node_modules/ip-address/README.md +134 -134
- package/node_modules/ip-address/dist/address-error.d.ts +11 -0
- package/node_modules/ip-address/dist/address-error.js.map +1 -1
- package/node_modules/ip-address/dist/ipv4.d.ts +22 -6
- package/node_modules/ip-address/dist/ipv4.js +22 -6
- package/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/ip-address/dist/ipv6.d.ts +26 -8
- package/node_modules/ip-address/dist/ipv6.js +46 -29
- package/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/ip-address/dist/v6/constants.js +1 -0
- package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/ip-address/package.json +1 -1
- package/package.json +5 -4
- package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js +0 -2
- package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js +0 -2
- package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js +0 -2
- package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js +0 -3
- package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js.map +0 -1
- package/dist/core/web/public/next/assets/App-DebYuj1v.js +0 -8
- package/dist/core/web/public/next/assets/App-DebYuj1v.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js.map +0 -1
- package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js +0 -2
- package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js +0 -3
- package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js.map +0 -1
- package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js +0 -7
- package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js.map +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js.map +0 -1
- package/dist/core/web/public/next/assets/Button-DP2ImS5n.js +0 -2
- package/dist/core/web/public/next/assets/Button-DP2ImS5n.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js.map +0 -1
- package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js +0 -16
- package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js +0 -2
- package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js.map +0 -1
- package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js +0 -5
- package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js +0 -9
- package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js +0 -3
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js.map +0 -1
- package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js +0 -4
- package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js.map +0 -1
- package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js +0 -2
- package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js.map +0 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js +0 -2
- package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js.map +0 -1
- package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js +0 -2
- package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js.map +0 -1
- package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js +0 -2
- package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js.map +0 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js +0 -2
- package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js.map +0 -1
- package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js +0 -2
- package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js +0 -2
- package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js +0 -5
- package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-Cc14h572.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-Cc14h572.js.map +0 -1
- package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js +0 -2
- package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js +0 -3
- package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js +0 -3
- package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js +0 -2
- package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js.map +0 -1
- package/dist/core/web/public/next/assets/Input-BEF-ScuG.js +0 -2
- package/dist/core/web/public/next/assets/Input-BEF-ScuG.js.map +0 -1
- package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js +0 -9
- package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js +0 -3
- package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js +0 -2
- package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js.map +0 -1
- package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js +0 -2
- package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js.map +0 -1
- package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js +0 -2
- package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js.map +0 -1
- package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js +0 -2
- package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js +0 -72
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js +0 -2
- package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js.map +0 -1
- package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js +0 -2
- package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js.map +0 -1
- package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js +0 -2
- package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js +0 -2
- package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js +0 -3
- package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js.map +0 -1
- package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js +0 -2
- package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js.map +0 -1
- package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js +0 -7
- package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js.map +0 -1
- package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js +0 -2
- package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js +0 -4
- package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js.map +0 -1
- package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js +0 -9
- package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js.map +0 -1
- package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js +0 -2
- package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js.map +0 -1
- package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js.map +0 -1
- package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js +0 -2
- package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js +0 -2
- package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js.map +0 -1
- package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js +0 -3
- package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js +0 -3
- package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js.map +0 -1
- package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js +0 -2
- package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js.map +0 -1
- package/dist/core/web/public/next/assets/Select-zXMdgblm.js +0 -2
- package/dist/core/web/public/next/assets/Select-zXMdgblm.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js.map +0 -1
- package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js +0 -2
- package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js.map +0 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js +0 -3
- package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js +0 -2
- package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js.map +0 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js.map +0 -1
- package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js +0 -2
- package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js +0 -2
- package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js +0 -2
- package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js.map +0 -1
- package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js +0 -2
- package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js.map +0 -1
- package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js +0 -2
- package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js +0 -26
- package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js.map +0 -1
- package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js +0 -2
- package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js.map +0 -1
- package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js +0 -2
- package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js +0 -3
- package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js +0 -2
- package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js +0 -2
- package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js +0 -2
- package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js +0 -2
- package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js +0 -6
- package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-CyO4R-IO.js +0 -2
- package/dist/core/web/public/next/assets/actions-CyO4R-IO.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js +0 -2
- package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js +0 -7
- package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js.map +0 -1
- package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js +0 -2
- package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js.map +0 -1
- package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js +0 -2
- package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js.map +0 -1
- package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js +0 -2
- package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js.map +0 -1
- package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js +0 -2
- package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js.map +0 -1
- package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js +0 -2
- package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js +0 -2
- package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-D3I0q4hG.js +0 -2
- package/dist/core/web/public/next/assets/charts-D3I0q4hG.js.map +0 -1
- package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js +0 -2
- package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js.map +0 -1
- package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js +0 -2
- package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js +0 -2
- package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js +0 -2
- package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js +0 -2
- package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js.map +0 -1
- package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js +0 -2
- package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js +0 -2
- package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js.map +0 -1
- package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js +0 -3
- package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js.map +0 -1
- package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js.map +0 -1
- package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js.map +0 -1
- package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js +0 -2
- package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js.map +0 -1
- package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js +0 -2
- package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js.map +0 -1
- package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js +0 -2
- package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js +0 -2
- package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js +0 -2
- package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js +0 -3
- package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js.map +0 -1
- package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js +0 -2
- package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js.map +0 -1
- package/dist/core/web/public/next/assets/format-CcEKjUou.js +0 -2
- package/dist/core/web/public/next/assets/format-CcEKjUou.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-DL3MwN93.js +0 -5
- package/dist/core/web/public/next/assets/git-model-DL3MwN93.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BWc2NPzv.js +0 -3
- package/dist/core/web/public/next/assets/global-BWc2NPzv.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js.map +0 -1
- package/dist/core/web/public/next/assets/headroom-CP99UxyV.js +0 -2
- package/dist/core/web/public/next/assets/headroom-CP99UxyV.js.map +0 -1
- package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js +0 -2
- package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-U34oiN9M.js +0 -2
- package/dist/core/web/public/next/assets/icons-U34oiN9M.js.map +0 -1
- package/dist/core/web/public/next/assets/index-BbDqdepe.js +0 -11
- package/dist/core/web/public/next/assets/index-BbDqdepe.js.map +0 -1
- package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js +0 -2
- package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js.map +0 -1
- package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js +0 -2
- package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js.map +0 -1
- package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js +0 -2
- package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js +0 -2
- package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js.map +0 -1
- package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js +0 -2
- package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js +0 -2
- package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js +0 -2
- package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js +0 -7
- package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js +0 -2
- package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js +0 -2
- package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js.map +0 -1
- package/dist/core/web/public/next/assets/nav-CM-mJcSq.js +0 -2
- package/dist/core/web/public/next/assets/nav-CM-mJcSq.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js.map +0 -1
- package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js.map +0 -1
- package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js +0 -2
- package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js.map +0 -1
- package/dist/core/web/public/next/assets/panes-BjUzIDw6.js +0 -3
- package/dist/core/web/public/next/assets/panes-BjUzIDw6.js.map +0 -1
- package/dist/core/web/public/next/assets/path-display-HyxETV-f.js +0 -2
- package/dist/core/web/public/next/assets/path-display-HyxETV-f.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js +0 -2
- package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js +0 -2
- package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js.map +0 -1
- package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js +0 -2
- package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js.map +0 -1
- package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-BEXDE-HP.js +0 -1
- package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js +0 -2
- package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js.map +0 -1
- package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js +0 -2
- package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js.map +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js +0 -2
- package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js.map +0 -1
- package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js +0 -3
- package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js.map +0 -1
- package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js +0 -2
- package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js.map +0 -1
- package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js +0 -2
- package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js.map +0 -1
- package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js +0 -2
- package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js.map +0 -1
- package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js +0 -2
- package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js.map +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js +0 -2
- package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js.map +0 -1
- package/dist/core/web/public/next/assets/sheet-D0ciShoy.js +0 -2
- package/dist/core/web/public/next/assets/sheet-D0ciShoy.js.map +0 -1
- package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js +0 -2
- package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-m3L6Ints.js +0 -3
- package/dist/core/web/public/next/assets/slots-m3L6Ints.js.map +0 -1
- package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js +0 -4
- package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js.map +0 -1
- package/dist/core/web/public/next/assets/sse-CK65-Cun.js +0 -2
- package/dist/core/web/public/next/assets/sse-CK65-Cun.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js.map +0 -1
- package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js +0 -2
- package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js +0 -2
- package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js +0 -2
- package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js +0 -6
- package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js.map +0 -1
- package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js +0 -2
- package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js.map +0 -1
- package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js +0 -2
- package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js.map +0 -1
- package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js +0 -2
- package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js.map +0 -1
- package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js +0 -2
- package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js.map +0 -1
- package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js +0 -2
- package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js.map +0 -1
- package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js +0 -2
- package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js.map +0 -1
- package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js +0 -2
- package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js +0 -2
- package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js +0 -2
- package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js +0 -2
- package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js +0 -2
- package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js +0 -3
- package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js.map +0 -1
- package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js +0 -2
- package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js.map +0 -1
- package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js +0 -2
- package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js.map +0 -1
- package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js +0 -2
- package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js.map +0 -1
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ChecksPanel-B6T2sjc_.js","assets/MutationTokenDialog-D522NXsm.js","assets/Dialog-BYIKNPcH.js","assets/focus-trap-C8MiYlLZ.js","assets/use-token-gate-_JPjMD5z.js","assets/format-CcEKjUou.js","assets/format-D7nBg2bn.js","assets/verse-model-CkF3q2IH.js","assets/compaction-point-VL9oegWS.js","assets/seat-readiness-CvEmMBol.js","assets/Switch-BtEo9Cku.js","assets/global-1SED_aTT.css","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/Button-DrnKsvnQ.css","assets/Switch-CU044EaE.css","assets/ChecksPanel-Ds7trwso.css","assets/dock-panes-C98u13Bi.js","assets/tool-semantics-DtFU7rvB.js","assets/line-diff-B5Eonif2.js","assets/sources-queries-DeIlxb3A.js","assets/diff-parser-BnW_HiQm.js","assets/verse-transcript-Dc-bk9l2.js","assets/verse-store-DAqqNIyD.js","assets/transient-events-nTLhMBND.js","assets/useVerseTranscript-B6wLDOv8.js","assets/useVerseSession-0MnfpcHg.js","assets/use-chat-activity-BaNWmI2A.js","assets/SourcesPanel-CCSdY5Os.js","assets/path-display-HyxETV-f.js","assets/ThinkingBlock-Db8qnuKz.js","assets/ChatSection-DV9smoPe.js","assets/preloaded-CLDUOHXJ.js","assets/EmptyState-B3YUPGaa.css","assets/ThinkingBlock-C1hAYcr3.css","assets/SourcesPanel-0z9q5i9l.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/SkipToContent-c02H5dmz.css","assets/VerseConsoleApp-C5481fH5.css","assets/ChatSection-77pZka90.css","assets/TerminalPane-BCjlhc3t.js","assets/ActionMenu-Bia8Re6u.js","assets/icons-U34oiN9M.js","assets/verse-icons-BQxBZk9k.js","assets/composer-queries-BEYuD6Qr.js","assets/ansi-B9NbRwnU.js","assets/agent-tools-client-FgVNokGh.js","assets/chat-pane-data-DIDV7uIU.js","assets/multimodel-flows-C377w9oZ.js","assets/context-queries-Cgb_XvRv.js","assets/composer-state-B4KVc2ZZ.js","assets/multimodel-queries-_Y1QXAqq.js","assets/ask-seat-zMpqJABI.js","assets/terminal-icons-COMoAiDd.js","assets/terminal-client-DO0eRhRi.js","assets/terminal-view-DkVXx7Xk.js","assets/useAutoSeat-CkyqgwX9.js","assets/budget-queries-q7mCG9Ek.js","assets/policy-CEIamUKN.js","assets/headroom-CP99UxyV.js","assets/CommandPalette.module-DqfCnLbZ.js","assets/ActionMenu-DPjsLU1g.css","assets/CommandPalette-C37YxUrr.css","assets/TerminalPane-CiO79zlq.css","assets/BrowserPanel-D02omBK0.js","assets/Segmented-CtwuFlbY.js","assets/Segmented-BnjHbKzH.css","assets/BrowserPanel-CQO8rUsR.css","assets/ChangesPaneHost-C53_94Kn.js","assets/highlight-BCNIvJ85.js","assets/git-model-DL3MwN93.js","assets/GitDialogs-BSTlyNJR.js","assets/checkpoint-queries-DjrDEsN-.js","assets/DiffPane.module-CTk5rZn3.js","assets/pane-chrome.module-D7o-fVd0.js","assets/GitDialogs-ChreZUPG.css","assets/DiffPane-BAvvbBsf.css","assets/pane-chrome-8JmEhHVD.css","assets/ChangesPaneHost-IBUW2bXU.css","assets/ChatPanes-CyAK9VAi.js","assets/ProviderLogo-CWrojWjI.js","assets/context-model-C9EIuPJ_.js","assets/context-model-DU3OPiBC.js","assets/workspace-model-DRGckE8q.js","assets/LiveTimer-c18lVIBC.js","assets/command-catalog-BzHSIzIS.js","assets/tasks-model-BueAhEAf.js","assets/sidebar-model-BZ9Wh1lR.js","assets/context.module-BijAfoJw.js","assets/LiveTimer-1w9hA2-h.css","assets/context-DiToyj6s.css","assets/ChatPanes-DtD218pR.css","assets/FilesPane-BQBcWyxr.js","assets/stub-panes.module-aBfJsf41.js","assets/stub-panes-ZSndIabX.css","assets/SourcesPane-D7Raaor0.js","assets/ReasoningPane-M7ZfvEc5.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{l as e,n as t,s as n,t as r,u as i}from"./index-BbDqdepe.js";import{Bt as a,Et as o,Ft as s,I as ee,Mt as te,Pt as c,Rt as l,T as u,Wt as d,Y as ne,ct as re,jt as ie,lt as f,p}from"./VerseConsoleApp-kFOEmnGC.js";import{a as m,f as h,g,h as ae,p as _,r as oe,u as se,v as ce,y as v}from"./dock-icons-CRHjXBWm.js";import{a as le,n as ue,o as y,r as b}from"./slots-m3L6Ints.js";var x=i(n(),1);function de(){let e=ie.composer,t=new Map;for(let[n,r]of Object.entries(o))if(e.includes(r.scope))for(let e of r.keys)t.set(c(e),n);return t}var fe=new Set(te.map(c));function S(e,t,n=I()){let r;try{r=d(e.trim().toLowerCase())}catch{return`"${e}" is not a chord`}let i=e.toLowerCase().split(`+`).slice(0,-1);if(!r.key||i.some(e=>![`mod`,`ctrl`,`shift`,`alt`].includes(e)))return`"${e}" is not a chord`;if(!r.mod&&!r.ctrl)return`"${e}" needs mod or ctrl — a bare key would eat typing`;let a=c(r);if(fe.has(a))return`"${e}" belongs to the system`;let s=de().get(a);if(s)return`"${e}" is already ${s}`;for(let r of n){if(r.id===t)continue;if(r.shortcut&&c(r.shortcut)===a)return`"${e}" is already the ${r.title} pane's`;let n=r.command?o[r.command]?.keys[0]:void 0;if(n&&c(n)===a)return`"${e}" is already the ${r.title} pane's`}return null}function C(e){let t=[];if(typeof e!=`object`||!e)return[`a pane definition must be an object`];(typeof e.id!=`string`||!f.test(e.id))&&t.push(`id "${String(e.id)}" must be lower-case letters, numbers and dashes`),(typeof e.title!=`string`||e.title.trim()===``)&&t.push(`title is required`);let n=e=>typeof e==`function`||typeof e==`object`&&!!e;return n(e.component)||t.push(`component must be a React component (lazy() is fine)`),n(e.icon)||t.push(`icon must be a React component`),e.command!==void 0&&!o[e.command]&&t.push(`command "${e.command}" has no key in shell/command-keys.ts`),t}var w=new Map,T=[],E=new Map,D=[],O=new Set,k=new Set;function A(e){k.has(e)||(k.add(e),typeof console<`u`&&console.warn(`[verse panes] ${e}`))}var j=e=>e.trim().toLowerCase();function pe(e,t){let n=null;for(let{def:r}of e){let e=r.command??n?.command??null,i=n?.shortcut??null;if(r.shortcut!==void 0){let n=e?o[e]?.keys[0]:void 0;if(n&&c(d(j(r.shortcut)))===c(n))i=null;else if(e)A(`pane "${r.id}": shortcut "${r.shortcut}" ignored — it opens with ${e}'s key`),i=null;else{let e=S(r.shortcut,r.id,t);e&&A(`pane "${r.id}": shortcut refused — ${e}`),i=e?null:d(j(r.shortcut))}}n=Object.freeze({id:r.id,title:r.title.trim(),icon:r.icon,component:r.component,command:e,shortcut:i,when:r.when??null,needsSession:r.needsSession??n?.needsSession??!0,order:r.order??n?.order??100,description:r.description??n?.description??null,toggle:r.toggle??n?.toggle??!1})}return n}function M(){let e=new Map;for(let t of T){let n=w.get(t);n&&n.length>0&&e.set(t,pe(n,e.values()))}E=e,D=Object.freeze([...e.values()].sort((e,t)=>e.order-t.order||T.indexOf(e.id)-T.indexOf(t.id)));for(let e of[...O])e()}function N(e,t){let n=C(e);if(n.length>0)return A(`pane "${String(e?.id)}" not registered: ${n.join(`; `)}`),()=>void 0;let r={def:e,builtin:t},i=w.get(e.id)??[];if(t){let e=i.findIndex(e=>!e.builtin);i.splice(e===-1?i.length:e,0,r)}else i.push(r);return w.set(e.id,i),T.includes(e.id)||T.push(e.id),M(),()=>{let t=w.get(e.id),n=t?.indexOf(r)??-1;t&&n!==-1&&(t.splice(n,1),t.length===0&&w.delete(e.id),M())}}function P(e){return N(e,!1)}function F(e){return N(e,!0)}function I(){return D}function L(e){return E.get(e)??null}function R(e,t){if(!e.when)return!0;try{return e.when(t)===!0}catch(t){return A(`pane "${e.id}": when() threw — ${t?.message??String(t)}`),!1}}function z(e){return D.filter(t=>R(t,e))}function B(e,t){let n=L(e);return n!==null&&R(n,t)}function V(e){return e.command?o[e.command]?.keys[0]??null:e.shortcut}function H(e,t=l()){let n=V(e);return n?a(n,t):null}function me(e,t=l()){for(let n of D)if(n.shortcut&&s(e,n.shortcut,t))return n;return null}function U(e){return O.add(e),()=>O.delete(e)}function W(){return(0,x.useSyncExternalStore)(U,I,I)}function G(e){let t=null,n=null,r=()=>(n??=e().then(e=>t=e,e=>{throw n=null,e}),n);function i(e){let[n]=(0,x.useState)(()=>t),[i]=(0,x.useState)(()=>(0,x.lazy)(()=>r().then(e=>({default:e}))));return(0,x.createElement)(n??i,e)}return Object.assign(i,{preload:r})}function K(e=D){for(let t of e){let e=t.component.preload;typeof e==`function`&&e().catch(()=>void 0)}}function he(e){K(e.map(e=>L(e)).filter(e=>e!==null))}var q=t();function ge({size:e=16}){return(0,q.jsx)(`svg`,{viewBox:`0 0 16 16`,width:e,height:e,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,children:(0,q.jsx)(`path`,{d:`M3 4.5 4.5 6 7 3.5M3 10.5 4.5 12 7 9.5M9 5h4.5M9 11h4.5`})})}P({id:`checks`,title:`Checks`,icon:ge,order:55,description:`Git status, the PR, each CI check and review comments — with Auto-fix CI and Auto-merge for an agent.`,component:G(()=>r(()=>import(`./ChecksPanel-B6T2sjc_.js`).then(e=>e.n).then(e=>function(t){return(0,q.jsx)(e.ChecksDockPane,{sessionId:t.sessionId,visible:t.visible,host:t.host})}),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])))}),P({id:`sources`,title:`Sources`,icon:g,description:`Every file, page, search and doc this chat drew on — numbered, with the turns that cited each.`,component:G(()=>r(()=>import(`./dock-panes-C98u13Bi.js`).then(e=>e.SourcesDockPane),__vite__mapDeps([17,18,19,20,21,22,23,8,24,25,26,27,28,29,30,31,32,11,33,34,35,36,37,38,39])))}),P({id:`reasoning`,title:`Reasoning`,icon:_,description:`The model's reasoning, turn by turn, with what each turn did.`,component:G(()=>r(()=>import(`./dock-panes-C98u13Bi.js`).then(e=>e.ReasoningDockPane),__vite__mapDeps([17,18,19,20,21,22,23,8,24,25,26,27,28,29,30,31,32,11,33,34,35,36,37,38,39])))}),P({id:`terminal`,title:`Terminal`,icon:v,component:G(()=>r(()=>import(`./TerminalPane-BCjlhc3t.js`).then(e=>e.TerminalRegistryPane),__vite__mapDeps([40,3,2,7,8,23,24,5,6,9,41,18,19,42,43,44,45,25,22,26,27,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,11,12,37,36,38,14,61,33,62,63])))});function J(e){u().section!==`chat`&&ee(`chat`),ne(e)}p(`terminal.generate`,()=>J({assist:!0})),p(`terminal.history`,()=>J({history:!0}));var _e=e({BROWSER_PANE:()=>ve}),ve={id:`browser`,label:`Browser`,commandId:`pane.browser`,keywords:[`browser`,`web`,`preview`,`localhost`,`devtools`,`console`,`screenshot`],defaultSlot:`dock`,chatScoped:!0,load:()=>r(()=>import(`./BrowserPanel-D02omBK0.js`).then(e=>({default:e.BrowserPanel})),__vite__mapDeps([64,1,2,3,65,42,44,4,5,6,7,8,9,10,31,32,23,24,27,26,11,12,13,66,14,15,36,37,38,39,67]))},ye=e({CHANGES_PANE:()=>be}),be={id:`changes`,label:`Changes`,commandId:`dock.diff`,keywords:[`changes`,`diff`,`review`,`checkpoint`,`undo`,`rewind`,`revert`,`git`],defaultSlot:`dock`,chatScoped:!0,description:`What each turn changed, reviewed hunk by hunk, with Undo turn — plus the uncommitted and branch diff.`,load:()=>r(()=>import(`./ChangesPaneHost-C53_94Kn.js`).then(e=>({default:e.ChangesPaneHost})),__vite__mapDeps([68,2,3,1,21,69,65,70,42,4,5,6,7,8,9,47,48,23,24,49,50,22,51,52,71,72,73,74,12,11,13,37,66,14,33,36,38,75,76,77,78]))};function xe({sessionId:e,roots:t,requests:n,host:r,visible:i}){return(0,q.jsx)(le,{sessionId:e??``,roots:t,request:n.terminal,onSendToChat:r.sendToChat,visible:i})}function Se({sessionId:e,roots:t,requests:n,host:r,visible:i}){return(0,q.jsx)(b,{sessionId:e??``,roots:t,request:n.preview,visible:i,onOpenTerminal:r.openTerminalBelow})}function Y({sessionId:e,roots:t,requests:n,turnFiles:r,host:i,visible:a}){return(0,q.jsx)(ue,{sessionId:e??``,roots:t,request:n.diff,turnFiles:r,onAddToMessage:i.addToMessage,visible:a})}var Ce=G(()=>r(()=>import(`./ChatPanes-CyAK9VAi.js`).then(e=>e.TasksPaneBody),__vite__mapDeps([79,1,2,3,80,7,8,5,6,9,49,23,24,81,82,83,18,19,29,84,85,86,87,4,25,22,26,27,10,47,88,31,32,11,12,13,37,36,38,89,15,90,39,91]))),X=G(()=>r(()=>import(`./ChatPanes-CyAK9VAi.js`).then(e=>e.ContextPaneBody),__vite__mapDeps([79,1,2,3,80,7,8,5,6,9,49,23,24,81,82,83,18,19,29,84,85,86,87,4,25,22,26,27,10,47,88,31,32,11,12,13,37,36,38,89,15,90,39,91]))),we=G(()=>r(()=>import(`./FilesPane-BQBcWyxr.js`).then(e=>e.FilesPane),__vite__mapDeps([92,7,8,18,19,29,25,22,23,24,26,27,93,11,33,94]))),Te=G(()=>r(()=>import(`./SourcesPane-D7Raaor0.js`).then(e=>e.SourcesPane),__vite__mapDeps([95,7,8,29,18,19,43,42,25,22,23,24,26,27,93,11,36,37,38,33,94]))),Ee=G(()=>r(()=>import(`./ReasoningPane-M7ZfvEc5.js`).then(e=>e.ReasoningPane),__vite__mapDeps([96,30,25,22,23,8,24,26,27,93,18,19,33,34,11,94]))),Z=e=>()=>y(e),De={terminal:{icon:v,component:xe,order:10,toggle:!0,when:Z(`terminal-pane`),description:`A shell in this chat's folders. Commands the chat suggests paste here — you press Enter.`},browser:{icon:h,component:Se,order:20,toggle:!0,when:Z(`preview-pane`),description:`Your dev server or a page the chat made, live beside the conversation.`},diff:{icon:ae,component:Y,order:30,toggle:!0,when:Z(`diff-pane`),description:`What changed — this turn, uncommitted, or the whole branch — with notes you can send back.`},files:{icon:m,component:we,order:40,description:`The chat's folders, and every file it has read or changed.`},sources:{icon:g,component:Te,order:50,description:`The pages, searches and files an answer rests on.`},reasoning:{icon:_,component:Ee,order:60,description:`The model's thinking, turn by turn, beside the answer.`},tasks:{icon:ce,component:Ce,order:70,needsSession:!1,description:`This turn's tool calls, and every other chat that is running.`},context:{icon:oe,component:X,order:80,needsSession:!1,description:`How full this chat's context is, its folders, memory and handoff.`}},Q=[];function Oe(){for(let e of Q)e();Q=re.map(e=>{let t=De[e.id];return F({id:e.id,title:e.label,...e.commandId?{command:e.commandId}:{},...t})})}Oe();var ke={changes:`diff`,review:`diff`,preview:`browser`};function Ae(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&f.test(t.id)&&typeof t.label==`string`&&t.label.trim()!==``&&typeof t.load==`function`}function je(e){let t=[];for(let n of Object.keys(e).sort()){let r=e[n];if(typeof r==`object`&&r)for(let e of Object.values(r)){if(!Ae(e))continue;let n=ke[e.id]??e.id,r=L(n),i=e.load;P({id:n,title:e.label.trim(),icon:e.icon??r?.icon??se,component:G(()=>i().then(e=>e.default)),needsSession:!1,...e.shortcut?{shortcut:e.shortcut}:{},...e.description?{description:e.description}:{}}),t.push(n)}}return t}var Me=e({UNIT_PANE_MODULES:()=>$,definitionProblems:()=>C,getPane:()=>L,isPaneAvailable:()=>B,lazyPane:()=>G,listPanes:()=>I,matchPaneShortcut:()=>me,paneApplies:()=>R,paneChord:()=>V,paneChordLabel:()=>H,panesFor:()=>z,preloadPaneIds:()=>he,preloadPanes:()=>K,registerBuiltinPane:()=>F,registerPane:()=>P,shortcutProblem:()=>S,subscribePanes:()=>U,usePanes:()=>W}),$=Object.assign({"../browser/register.ts":_e,"../changes/register.ts":ye});je($);export{R as a,K as c,B as i,W as l,Y as n,H as o,L as r,z as s,Me as t};
|
|
3
|
-
//# sourceMappingURL=panes-BjUzIDw6.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/panes/pane-registry.ts","../../../../../../src/web-ui/routes/verse/agents/checks.pane.tsx","../../../../../../src/web-ui/routes/verse/reasoning/reasoning.pane.tsx","../../../../../../src/web-ui/routes/verse/terminal/terminal.pane.tsx","../../../../../../src/web-ui/routes/verse/browser/register.ts","../../../../../../src/web-ui/routes/verse/changes/register.ts","../../../../../../src/web-ui/routes/verse/panes/builtin/SlotPanes.tsx","../../../../../../src/web-ui/routes/verse/panes/builtin-panes.tsx","../../../../../../src/web-ui/routes/verse/panes/register-adapter.ts","../../../../../../src/web-ui/routes/verse/panes/index.ts"],"sourcesContent":["/**\n * routes/verse/panes/pane-registry.ts — THE PANE REGISTRY: how anything\n * becomes a tab in the chat's panel area (the dock), without touching the\n * layout. See ./README.md for the guide; this file is the contract.\n *\n * registerPane({\n * id: 'reasoning',\n * title: 'Reasoning',\n * icon: ReasoningGlyph,\n * component: lazy(() => import('./ReasoningPane.js').then((m) => ({ default: m.ReasoningPane }))),\n * shortcut: 'mod+shift+y', // or `command:` for a catalog key\n * when: ({ session }) => session !== null,\n * });\n *\n * WHAT THE DOCK DOES WITH A PANE. It lists it in \"+ Add a pane\", the split\n * menu and (with `toggle`) the chat header; opens it on its key; renders its\n * component inside an error boundary and a Suspense boundary (so a lazy\n * component is its own chunk and a crash says so without taking the chat\n * down); keeps it MOUNTED while its tab is open (hidden, with\n * `visible: false`, when another tab is on top — stop timers then); and\n * remembers which panes each chat had open.\n *\n * REPLACING a pane. Registering an id that already exists REPLACES it (the\n * newest registration wins) and inherits what it did not say — its catalog\n * command, header toggle and order — so a unit swapping the stub Reasoning\n * pane for the real one writes only what changed. The returned function\n * unregisters that one registration, and the previous definition comes back.\n *\n * KEYS. A pane's chord is either a catalog command's (`command:`, for the\n * first-party panes — the palette and the shortcuts overlay list those) or\n * its own `shortcut:`. An own shortcut must use mod (Cmd/Ctrl) or ctrl, and is REFUSED\n * (with a console warning; the pane still registers, keyless) when it\n * collides with a catalog key live in the chat, a system chord, or another\n * pane's key. A pane can never steal a key.\n *\n * Framework-light: React only for types and the one subscription hook. This\n * module (and the panes it registers) load just after the chat's first\n * paint — never on it (VerseApp.first-paint.test.ts).\n */\nimport { createElement, lazy, useState, useSyncExternalStore, type ComponentType } from 'react';\nimport type { VerseEvent, VerseSession } from '../../../data/api-types.js';\nimport {\n COMMAND_KEYS,\n SCOPE_LAYERS,\n SYSTEM_RESERVED_CHORDS,\n chordId,\n chordMatches,\n detectKeyPlatform,\n formatChord,\n parseChord,\n type KeyChord,\n type KeyedCommandId,\n type KeyEventLike,\n type KeyPlatform,\n} from '../shell/command-keys.js';\nimport { PANE_ID_RE, type DockPresentation } from '../shell/dock-catalog.js';\nimport type { DiffPaneRequest, PreviewOpenRequest, TerminalOpenRequest, TurnFileChange } from '../shell/slots.js';\n\n// ===========================================================================\n// The contract\n// ===========================================================================\n\n/** The one-shot requests other parts of the chat aim at panes (\"Run in terminal\", a ± count, a dev server). */\nexport interface PaneRequests {\n terminal: TerminalOpenRequest | null;\n preview: PreviewOpenRequest | null;\n diff: (DiffPaneRequest & { nonce: number }) | null;\n}\n\n/** What a pane may ask of the workbench. Every call is safe at any time (a no-op when it cannot apply). */\nexport interface PaneHost {\n /** Put `text` in the composer, as its own paragraph (Terminal's \"Send selection to chat\"). */\n sendToChat(text: string): void;\n /** Draft `text` into the composer (\"Add to message\": `path:line: note`). */\n addToMessage(text: string): void;\n /** Open (and show) another pane by id. */\n openPane(id: string): void;\n /** Close this or another pane's tab. */\n closePane(id: string): void;\n /** Open the Terminal pane with a request (a tab at a root; a command PASTED, never run). */\n openTerminal(request: Omit<TerminalOpenRequest, 'nonce'>): void;\n /** The same, with Terminal as the lower half of a split under the pane on top. */\n openTerminalBelow(request: Omit<TerminalOpenRequest, 'nonce'>): void;\n /** Open the Changes pane at a root and scope (optionally one file). */\n openDiff(request: DiffPaneRequest): void;\n /** Switch the chat surface to another chat. */\n openSession(sessionId: string): void;\n}\n\n/**\n * The props every pane component receives. Stable: fields are only ever\n * ADDED. A pane that needs the live transcript subscribes itself\n * (`useVerseTranscript(sessionId)`), so a streamed token re-renders that\n * pane, not the dock.\n */\nexport interface PaneProps {\n /** This pane's id (one component may serve several registrations). */\n paneId: string;\n /** The open chat. Never null for a pane with `needsSession` (the default): the dock shows the empty state instead. */\n sessionId: string | null;\n session: VerseSession | null;\n /** The chat's folders, primary first. */\n roots: readonly string[];\n /** The chat's raw event log (what the transcript is built from). */\n events: readonly VerseEvent[];\n /** Files the chat's latest turn touched. */\n turnFiles: readonly TurnFileChange[];\n /** False while another tab is on top (or the panel is closed with the tab kept): stop timers, skip work. */\n visible: boolean;\n /** How the panel is drawn right now — a pane may choose a denser layout in `bottom`. */\n presentation: DockPresentation;\n requests: PaneRequests;\n host: PaneHost;\n}\n\n/** What `when` sees — enough to decide whether a pane applies to the chat that is open. */\nexport interface PaneContext {\n sessionId: string | null;\n session: VerseSession | null;\n roots: readonly string[];\n}\n\n/** A 16px line glyph (currentColor), like dock/dock-icons.tsx. */\nexport type PaneIcon = ComponentType<{ size?: number }>;\n\nexport interface PaneDefinition {\n /** Stable id: lower-case letters, numbers and dashes (`browser`, `test-runner`). Persisted in layouts. */\n id: string;\n /** Tab label and menu name: one or two words. */\n title: string;\n icon: PaneIcon;\n /** Usually `lazy(() => import(…))`, so the pane's code is its own chunk and loads on first open. */\n component: ComponentType<PaneProps>;\n /** Your own chord, as the key table writes it: 'mod+shift+y', 'ctrl+alt+p'. Refused on any collision. */\n shortcut?: string;\n /** First-party: the catalog command whose key opens this pane (its chord then comes from the catalog). */\n command?: KeyedCommandId;\n /** Whether the pane applies right now (e.g. only for a chat with a web seat). False hides its tab and menu entry. */\n when?: (context: PaneContext) => boolean;\n /** Needs an open chat (default true): without one the dock shows \"Open a chat to use …\" instead. */\n needsSession?: boolean;\n /** Menu / header order, ascending (first-party panes use 10…80; default 100). */\n order?: number;\n /** One sentence: what the pane is for. The empty state and the \"+\" menu teach with it. */\n description?: string;\n /** Show a toggle for it in the chat header (keep it to the few everyone uses). */\n toggle?: boolean;\n}\n\n/** A pane as the registry holds it: defaults applied, the chord resolved and vetted. */\nexport interface RegisteredPane {\n readonly id: string;\n readonly title: string;\n readonly icon: PaneIcon;\n readonly component: ComponentType<PaneProps>;\n readonly command: KeyedCommandId | null;\n /** The pane's OWN chord (not a catalog command's), after the collision check; null = none or refused. */\n readonly shortcut: KeyChord | null;\n readonly when: ((context: PaneContext) => boolean) | null;\n readonly needsSession: boolean;\n readonly order: number;\n readonly description: string | null;\n readonly toggle: boolean;\n}\n\n// ===========================================================================\n// Validation\n// ===========================================================================\n\n/** Every chord that is live while a pane's key would be (the composer layer: composer + chat + global). */\nfunction catalogChords(): Map<string, string> {\n const live = SCOPE_LAYERS.composer;\n const out = new Map<string, string>();\n for (const [id, spec] of Object.entries(COMMAND_KEYS)) {\n if (!live.includes(spec.scope)) continue;\n for (const chord of spec.keys) out.set(chordId(chord), id);\n }\n return out;\n}\n\nconst RESERVED = new Set(SYSTEM_RESERVED_CHORDS.map(chordId));\n\n/**\n * Why `text` cannot be pane `paneId`'s own shortcut, or null when it can.\n * Exported for tests and for units that want to check a chord up front.\n */\nexport function shortcutProblem(text: string, paneId: string, panes: Iterable<RegisteredPane> = listPanes()): string | null {\n let chord: KeyChord;\n try {\n chord = parseChord(text.trim().toLowerCase());\n } catch {\n return `\"${text}\" is not a chord`;\n }\n const modifiers = text.toLowerCase().split('+').slice(0, -1);\n if (!chord.key || modifiers.some((m) => !['mod', 'ctrl', 'shift', 'alt'].includes(m))) return `\"${text}\" is not a chord`;\n if (!chord.mod && !chord.ctrl) return `\"${text}\" needs mod or ctrl — a bare key would eat typing`;\n const id = chordId(chord);\n if (RESERVED.has(id)) return `\"${text}\" belongs to the system`;\n const owner = catalogChords().get(id);\n if (owner) return `\"${text}\" is already ${owner}`;\n for (const pane of panes) {\n if (pane.id === paneId) continue;\n if (pane.shortcut && chordId(pane.shortcut) === id) return `\"${text}\" is already the ${pane.title} pane's`;\n const command = pane.command ? COMMAND_KEYS[pane.command]?.keys[0] : undefined;\n if (command && chordId(command) === id) return `\"${text}\" is already the ${pane.title} pane's`;\n }\n return null;\n}\n\n/** Problems that make a definition unregistrable (an empty list = fine). */\nexport function definitionProblems(def: PaneDefinition): string[] {\n const problems: string[] = [];\n if (typeof def !== 'object' || def === null) return ['a pane definition must be an object'];\n if (typeof def.id !== 'string' || !PANE_ID_RE.test(def.id)) problems.push(`id \"${String(def.id)}\" must be lower-case letters, numbers and dashes`);\n if (typeof def.title !== 'string' || def.title.trim() === '') problems.push('title is required');\n const isComponent = (c: unknown) => typeof c === 'function' || (typeof c === 'object' && c !== null);\n if (!isComponent(def.component)) problems.push('component must be a React component (lazy() is fine)');\n if (!isComponent(def.icon)) problems.push('icon must be a React component');\n if (def.command !== undefined && !COMMAND_KEYS[def.command]) problems.push(`command \"${def.command}\" has no key in shell/command-keys.ts`);\n return problems;\n}\n\n// ===========================================================================\n// The registry\n// ===========================================================================\n\n/** Each id's registrations, oldest first; the LAST is the active one. */\n/** One registration. `builtin` ones sit UNDER every other registration of their id, whatever the load order. */\ninterface Layer {\n def: PaneDefinition;\n builtin: boolean;\n}\n\n/** Each id's registrations, bottom first; the effective pane folds them upward. */\nconst stacks = new Map<string, Layer[]>();\n/** Ids in first-registration order (the tie-break for equal `order`s). */\nconst firstSeen: string[] = [];\nlet effective = new Map<string, RegisteredPane>();\nlet snapshot: readonly RegisteredPane[] = [];\nconst listeners = new Set<() => void>();\nconst warned = new Set<string>();\n\nfunction warn(message: string): void {\n if (warned.has(message)) return;\n warned.add(message);\n if (typeof console !== 'undefined') console.warn(`[verse panes] ${message}`);\n}\n\nconst normalizeChordText = (text: string) => text.trim().toLowerCase();\n\n/**\n * Fold one id's layers: each registration inherits what it leaves unsaid\n * (command, toggle, order, needsSession, description) from the one below.\n * The own shortcut is vetted against the catalog and the panes resolved so\n * far — `resolved`, in first-registration order, so the older pane keeps a\n * contested key.\n */\nfunction fold(layers: readonly Layer[], resolved: Iterable<RegisteredPane>): RegisteredPane {\n let below = null as RegisteredPane | null;\n for (const { def } of layers) {\n const command: KeyedCommandId | null = def.command ?? below?.command ?? null;\n let shortcut: KeyChord | null = below?.shortcut ?? null;\n if (def.shortcut !== undefined) {\n const commandChord = command ? COMMAND_KEYS[command]?.keys[0] : undefined;\n if (commandChord && chordId(parseChord(normalizeChordText(def.shortcut))) === chordId(commandChord)) {\n shortcut = null; // the catalog already serves this key for this pane\n } else if (command) {\n warn(`pane \"${def.id}\": shortcut \"${def.shortcut}\" ignored — it opens with ${command}'s key`);\n shortcut = null;\n } else {\n const problem = shortcutProblem(def.shortcut, def.id, resolved);\n if (problem) warn(`pane \"${def.id}\": shortcut refused — ${problem}`);\n shortcut = problem ? null : parseChord(normalizeChordText(def.shortcut));\n }\n }\n below = Object.freeze({\n id: def.id,\n title: def.title.trim(),\n icon: def.icon,\n component: def.component,\n command,\n shortcut,\n when: def.when ?? null,\n needsSession: def.needsSession ?? below?.needsSession ?? true,\n order: def.order ?? below?.order ?? 100,\n description: def.description ?? below?.description ?? null,\n toggle: def.toggle ?? below?.toggle ?? false,\n });\n }\n return below!;\n}\n\nfunction publish(): void {\n const next = new Map<string, RegisteredPane>();\n for (const id of firstSeen) {\n const layers = stacks.get(id);\n if (layers && layers.length > 0) next.set(id, fold(layers, next.values()));\n }\n effective = next;\n // Order, then first registration: a stable menu no matter which module loaded first.\n snapshot = Object.freeze([...next.values()].sort((a, b) => a.order - b.order || firstSeen.indexOf(a.id) - firstSeen.indexOf(b.id)));\n for (const listener of [...listeners]) listener();\n}\n\nfunction addLayer(def: PaneDefinition, builtin: boolean): () => void {\n const problems = definitionProblems(def);\n if (problems.length > 0) {\n warn(`pane \"${String((def as Partial<PaneDefinition> | null)?.id)}\" not registered: ${problems.join('; ')}`);\n return () => undefined;\n }\n const layer: Layer = { def, builtin };\n const stack = stacks.get(def.id) ?? [];\n if (builtin) {\n // Under every non-builtin registration: a unit's replacement wins even if its module evaluated first.\n const firstOther = stack.findIndex((l) => !l.builtin);\n stack.splice(firstOther === -1 ? stack.length : firstOther, 0, layer);\n } else {\n stack.push(layer);\n }\n stacks.set(def.id, stack);\n if (!firstSeen.includes(def.id)) firstSeen.push(def.id);\n publish();\n return () => {\n const current = stacks.get(def.id);\n const index = current?.indexOf(layer) ?? -1;\n if (!current || index === -1) return;\n current.splice(index, 1);\n if (current.length === 0) stacks.delete(def.id);\n publish();\n };\n}\n\n/**\n * Add a pane — or replace the one with the same id. Returns a function that\n * removes THIS registration (the previous one, if any, comes back).\n *\n * Never throws: a malformed definition is reported on the console and\n * ignored, so one unit's mistake cannot take the other panes down.\n */\nexport function registerPane(def: PaneDefinition): () => void {\n return addLayer(def, false);\n}\n\n/**\n * The workbench's own panes (builtin-panes.tsx). Always UNDER any other\n * registration of the same id, so a unit's `registerPane` replaces the\n * first-party stub no matter which module evaluated first.\n */\nexport function registerBuiltinPane(def: PaneDefinition): () => void {\n return addLayer(def, true);\n}\n\n/** Every registered pane, in menu order (applicability NOT checked — see panesFor). */\nexport function listPanes(): readonly RegisteredPane[] {\n return snapshot;\n}\n\n/** The effective registration for `id`, or null. */\nexport function getPane(id: string): RegisteredPane | null {\n return effective.get(id) ?? null;\n}\n\n/** Does `pane` apply in `context`? A `when` that throws counts as no (and says so once). */\nexport function paneApplies(pane: RegisteredPane, context: PaneContext): boolean {\n if (!pane.when) return true;\n try {\n return pane.when(context) === true;\n } catch (err) {\n warn(`pane \"${pane.id}\": when() threw — ${(err as Error)?.message ?? String(err)}`);\n return false;\n }\n}\n\n/** The panes that apply in `context`, in menu order. */\nexport function panesFor(context: PaneContext): RegisteredPane[] {\n return snapshot.filter((pane) => paneApplies(pane, context));\n}\n\n/** Is `id` registered, and does it apply in `context`? */\nexport function isPaneAvailable(id: string, context: PaneContext): boolean {\n const pane = getPane(id);\n return pane !== null && paneApplies(pane, context);\n}\n\n/** The chord that opens `pane` — its catalog command's, else its own — or null. */\nexport function paneChord(pane: RegisteredPane): KeyChord | null {\n if (pane.command) return COMMAND_KEYS[pane.command]?.keys[0] ?? null;\n return pane.shortcut;\n}\n\n/** `paneChord`, printed for this platform (\"⇧⌘Y\" / \"Ctrl+Shift+Y\"). */\nexport function paneChordLabel(pane: RegisteredPane, platform: KeyPlatform = detectKeyPlatform()): string | null {\n const chord = paneChord(pane);\n return chord ? formatChord(chord, platform) : null;\n}\n\n/**\n * The pane whose OWN shortcut `event` presses, or null. Catalog-command\n * chords are not matched here — the catalog's key handling runs those.\n */\nexport function matchPaneShortcut(event: KeyEventLike, platform: KeyPlatform = detectKeyPlatform()): RegisteredPane | null {\n for (const pane of snapshot) {\n if (pane.shortcut && chordMatches(event, pane.shortcut, platform)) return pane;\n }\n return null;\n}\n\nexport function subscribePanes(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Every registered pane, re-rendering when one is added, replaced or removed. */\nexport function usePanes(): readonly RegisteredPane[] {\n return useSyncExternalStore(subscribePanes, listPanes, listPanes);\n}\n\n// ===========================================================================\n// lazyPane — a pane component that is its own chunk, without the flash\n// ===========================================================================\n\n/** A pane component whose code loads on first use; `preload()` fetches it ahead of time. */\nexport type LazyPaneComponent = ComponentType<PaneProps> & { preload: () => Promise<unknown> };\n\n/**\n * Like `React.lazy`, for panes — and preferred to it:\n * - once the chunk is in, a NEW mount renders the pane in the same frame\n * (React.lazy suspends every fresh wrapper once, which flashes the\n * skeleton when a second tab of an already-loaded chunk opens);\n * - the dock calls `preload()` when it opens, so a tab's first click\n * usually finds its code already here;\n * - a failed download is not cached: \"Try again\" really tries again.\n *\n * component: lazyPane(() => import('./ReasoningPane.js').then((m) => m.ReasoningPane))\n */\nexport function lazyPane(load: () => Promise<ComponentType<PaneProps>>): LazyPaneComponent {\n let loaded: ComponentType<PaneProps> | null = null;\n let pending: Promise<ComponentType<PaneProps>> | null = null;\n const preload = (): Promise<ComponentType<PaneProps>> => {\n pending ??= load().then((c) => (loaded = c), (err: unknown) => { pending = null; throw err; });\n return pending;\n };\n function LazyPane(props: PaneProps) {\n // Chosen once per mount: swapping the component type later would remount the pane and drop its state.\n const [Ready] = useState<ComponentType<PaneProps> | null>(() => loaded);\n const [Deferred] = useState(() => lazy(() => preload().then((c) => ({ default: c }))));\n return createElement(Ready ?? Deferred, props);\n }\n return Object.assign(LazyPane, { preload });\n}\n\n/** Fetch the code of every registered pane that can be preloaded (the dock calls this when it opens). */\nexport function preloadPanes(panes: readonly RegisteredPane[] = snapshot): void {\n for (const pane of panes) {\n const preload = (pane.component as Partial<LazyPaneComponent>).preload;\n if (typeof preload === 'function') void preload().catch(() => undefined);\n }\n}\n\n/** `preloadPanes` for just these ids (the chat surface warms the tabs a chat is likely to open). */\nexport function preloadPaneIds(ids: readonly string[]): void {\n preloadPanes(ids.map((id) => getPane(id)).filter((p): p is RegisteredPane => p !== null));\n}\n\n/** Test seam: forget every registration (builtin-panes' `registerBuiltinPanes()` puts the first-party ones back). */\nexport function resetPaneRegistry(): void {\n stacks.clear();\n firstSeen.length = 0;\n warned.clear();\n publish();\n}\n","/**\n * routes/verse/agents/checks.pane.tsx — the chat dock's \"Checks\" pane: the\n * open chat's git status, PR, CI, review comments, Auto-fix CI and\n * Auto-merge (3.16 agents). Only the registration lives here — panes/index.ts\n * imports every `*.pane.tsx` eagerly after first paint — and the body is its\n * own lazy chunk (ChecksPanel.tsx).\n */\nimport type { PaneProps } from '../panes/pane-registry.js';\nimport { lazyPane, registerPane } from '../panes/pane-registry.js';\n\nfunction ChecksGlyph({ size = 16 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 16 16\" width={size} height={size} fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M3 4.5 4.5 6 7 3.5M3 10.5 4.5 12 7 9.5M9 5h4.5M9 11h4.5\" />\n </svg>\n );\n}\n\nregisterPane({\n id: 'checks',\n title: 'Checks',\n icon: ChecksGlyph,\n order: 55,\n description: 'Git status, the PR, each CI check and review comments — with Auto-fix CI and Auto-merge for an agent.',\n component: lazyPane(() =>\n import('./ChecksPanel.js').then((m) => function ChecksPane(props: PaneProps) {\n return <m.ChecksDockPane sessionId={props.sessionId} visible={props.visible} host={props.host} />;\n }),\n ),\n});\n","/**\n * routes/verse/reasoning/reasoning.pane.tsx — the Sources and Reasoning\n * panes, registered with the workbench pane registry (panes/README.md).\n *\n * Same ids as the first-party stubs, so these REPLACE them and inherit their\n * keys (⇧⌘S Sources, ⇧⌘Y Reasoning), order and catalog commands. Only the\n * registration lives here — panes/index.ts imports every `*.pane.tsx` eagerly\n * after first paint — and each body is its own lazy chunk.\n */\nimport { ReasoningGlyph, SourcesGlyph } from '../dock/dock-icons.js';\nimport { lazyPane, registerPane } from '../panes/pane-registry.js';\n\nregisterPane({\n id: 'sources',\n title: 'Sources',\n icon: SourcesGlyph,\n description: 'Every file, page, search and doc this chat drew on — numbered, with the turns that cited each.',\n component: lazyPane(() => import('./dock-panes.js').then((m) => m.SourcesDockPane)),\n});\n\nregisterPane({\n id: 'reasoning',\n title: 'Reasoning',\n icon: ReasoningGlyph,\n description: \"The model's reasoning, turn by turn, with what each turn did.\",\n component: lazyPane(() => import('./dock-panes.js').then((m) => m.ReasoningDockPane)),\n});\n","/**\n * terminal/terminal.pane.tsx — the 3.15 Terminal's registration in the pane\n * registry (panes/README.md). panes/index.ts discovers every `*.pane.tsx`\n * under routes/verse and imports it (after first paint).\n *\n * Id `terminal` REPLACES the first-party stub and inherits what this leaves\n * unsaid: the ⌃` key (dock.terminal), the header toggle, the first place in\n * the panel, `needsSession` (without a chat the dock says \"Open a chat to use\n * Terminal\") and the stub's description. ⌃⇧` (a new tab) and every\n * `requests.terminal` — Run in terminal, Apps [Launch ▸], a dev-server Start —\n * reach the panel as before.\n *\n * TINY ON PURPOSE: a registration and a lazy import. The panel — xterm, its\n * addons, the block view — is its own chunk, loaded when the pane first shows\n * (terminal-lazy.test.ts).\n *\n * 3.15: it also serves ⌘K \"Generate command…\" and \"Search terminal history…\"\n * (catalog ids terminal.generate / terminal.history) — here rather than in\n * ChatSection, so the chat's first paint carries none of it. Both go to Chat\n * and ask the panel for its prompt; the panel does the rest (nothing runs).\n */\nimport { requestTerminal } from '../dock/dock-store.js';\nimport { TerminalGlyph } from '../dock/dock-icons.js';\nimport { lazyPane, registerPane } from '../panes/pane-registry.js';\nimport { registerCommandHandler } from '../shell/command-bus.js';\nimport { getVerseUiState, setVerseSection } from '../verse-ui-store.js';\n\nexport const TERMINAL_PANE_ID = 'terminal';\n\nregisterPane({\n id: TERMINAL_PANE_ID,\n title: 'Terminal',\n icon: TerminalGlyph,\n component: lazyPane(() => import('./TerminalPane.js').then((m) => m.TerminalRegistryPane)),\n});\n\nfunction openTerminalPrompt(request: { assist: true } | { history: true }): void {\n if (getVerseUiState().section !== 'chat') setVerseSection('chat');\n requestTerminal(request);\n}\nregisterCommandHandler('terminal.generate', () => openTerminalPrompt({ assist: true }));\nregisterCommandHandler('terminal.history', () => openTerminalPrompt({ history: true }));\n","/**\n * routes/verse/browser/register.ts — the Browser pane's registration for the\n * workbench pane registry (routes/verse/panes/**, landing separately).\n *\n * This file is deliberately tiny and import-free apart from a LAZY import:\n * the registry can list the pane (id, label, command, where it docks) on\n * first paint without pulling the pane's code — BrowserPanel and everything\n * behind it (Button, icons, the token dialog) load only when it is opened\n * (VerseApp.first-paint.test.ts keeps those out of the first-paint graph).\n *\n * Until the registry lands, a host mounts it with:\n * const Browser = lazy(BROWSER_PANE.load);\n * <Suspense fallback={null}><Browser sessionId={id} visible={shown} /></Suspense>\n */\nimport type { ComponentType } from 'react';\nimport type { BrowserPanelProps } from './BrowserPanel.js';\n\nexport interface VersePaneRegistration<P> {\n /** Stable id (layout persistence, commands). */\n id: string;\n label: string;\n /** Command palette id that opens the pane. */\n commandId: string;\n /** Palette search words. */\n keywords: readonly string[];\n /** Where the pane prefers to dock when first opened. */\n defaultSlot: 'dock' | 'side' | 'main';\n /** Needs a chat to be useful (it still browses without one). */\n chatScoped: boolean;\n load: () => Promise<{ default: ComponentType<P> }>;\n}\n\nexport type { BrowserPanelProps };\n\nexport const BROWSER_PANE: VersePaneRegistration<BrowserPanelProps> = {\n id: 'browser',\n label: 'Browser',\n commandId: 'pane.browser',\n keywords: ['browser', 'web', 'preview', 'localhost', 'devtools', 'console', 'screenshot'],\n defaultSlot: 'dock',\n chatScoped: true,\n load: () => import('./BrowserPanel.js').then((m) => ({ default: m.BrowserPanel })),\n};\n","/**\n * routes/verse/changes/register.ts — the Changes pane's registration for the\n * workbench pane registry (routes/verse/panes/README.md, \"a self-describing\n * register.ts\"). panes/index.ts discovers this file; register-adapter.ts maps\n * the id `changes` onto the first-party `diff` pane and REPLACES it, keeping\n * its key (⇧⌘D), order, icon and header toggle.\n *\n * Import-free apart from a LAZY import, so listing the pane costs nothing on\n * first paint: ChangesPaneHost and everything behind it (the checkpoint\n * client, the diff grid, the git dialogs) is its own chunk, loaded when the\n * pane opens.\n */\nimport type { ComponentType } from 'react';\nimport type { PaneProps } from '../panes/pane-registry.js';\n\nexport const CHANGES_PANE: {\n id: string;\n label: string;\n commandId: string;\n keywords: readonly string[];\n defaultSlot: 'dock';\n chatScoped: boolean;\n description: string;\n load: () => Promise<{ default: ComponentType<PaneProps> }>;\n} = {\n id: 'changes',\n label: 'Changes',\n commandId: 'dock.diff',\n keywords: ['changes', 'diff', 'review', 'checkpoint', 'undo', 'rewind', 'revert', 'git'],\n defaultSlot: 'dock',\n chatScoped: true,\n description: 'What each turn changed, reviewed hunk by hunk, with Undo turn — plus the uncommitted and branch diff.',\n load: () => import('./ChangesPaneHost.js').then((m) => ({ default: m.ChangesPaneHost })),\n};\n","/**\n * routes/verse/panes/builtin/SlotPanes.tsx — the first-party Terminal,\n * Browser and Changes panes: thin adapters from PaneProps to the C0 slot\n * each renders through (shell/slots.tsx), so xterm, the page preview and the\n * diff viewer stay in their owners' lazy chunks.\n *\n * A unit replacing one of these (the Terminal, Browser or Harness agent)\n * registers its own component under the same id — see ../README.md — and\n * this adapter simply stops being used.\n */\nimport type { PaneProps } from '../pane-registry.js';\nimport { DiffPaneSlot, PreviewPaneSlot, TerminalPaneSlot } from '../../shell/slots.js';\n\nexport function TerminalPaneBody({ sessionId, roots, requests, host, visible }: PaneProps) {\n return <TerminalPaneSlot sessionId={sessionId ?? ''} roots={roots} request={requests.terminal} onSendToChat={host.sendToChat} visible={visible} />;\n}\n\nexport function BrowserPaneBody({ sessionId, roots, requests, host, visible }: PaneProps) {\n // Dev-server Start: Terminal opens BELOW the browser, so the page appears\n // on top when its port answers (SPEC-310C acceptance step 3).\n return <PreviewPaneSlot sessionId={sessionId ?? ''} roots={roots} request={requests.preview} visible={visible} onOpenTerminal={host.openTerminalBelow} />;\n}\n\nexport function ChangesPaneBody({ sessionId, roots, requests, turnFiles, host, visible }: PaneProps) {\n return <DiffPaneSlot sessionId={sessionId ?? ''} roots={roots} request={requests.diff} turnFiles={turnFiles} onAddToMessage={host.addToMessage} visible={visible} />;\n}\n","/**\n * routes/verse/panes/builtin-panes.tsx — the workbench's first-party panes,\n * registered UNDER any unit's registration of the same id (so a unit's\n * `registerPane({ id: 'reasoning', … })` replaces the stub whatever the\n * module order). Metadata comes from shell/dock-catalog.ts DOCK_PANES;\n * bodies are lazy, so each loads the first time its tab opens.\n *\n * id title key body\n * terminal Terminal ⌃` C4's TerminalPane through its slot\n * browser Browser ⇧⌘B C4's PreviewPane through its slot\n * diff Changes ⇧⌘D C5's DiffPane through its slot\n * files Files ⇧⌘O stub: folders + files read / changed\n * sources Sources ⇧⌘S stub: pages, searches, files read\n * reasoning Reasoning ⇧⌘Y stub: the chat's thinking, by turn\n * tasks Tasks — this turn's calls + other running chats\n * context Context — usage, roots, memory, handoff\n */\nimport type { ComponentType } from 'react';\nimport {\n ContextGlyph,\n FilesGlyph,\n PreviewGlyph,\n ReasoningGlyph,\n ReviewGlyph,\n SourcesGlyph,\n TasksGlyph,\n TerminalGlyph,\n} from '../dock/dock-icons.js';\nimport { DOCK_PANES, type BuiltinPaneId } from '../shell/dock-catalog.js';\nimport { isSlotAvailable } from '../shell/slots.js';\nimport { BrowserPaneBody, ChangesPaneBody, TerminalPaneBody } from './builtin/SlotPanes.js';\nimport { lazyPane, registerBuiltinPane, type PaneDefinition, type PaneIcon, type PaneProps } from './pane-registry.js';\n\ntype Body = ComponentType<PaneProps>;\n\nconst TasksBody = lazyPane(() => import('./builtin/ChatPanes.js').then((m) => m.TasksPaneBody));\nconst ContextBody = lazyPane(() => import('./builtin/ChatPanes.js').then((m) => m.ContextPaneBody));\nconst FilesBody = lazyPane(() => import('./builtin/FilesPane.js').then((m) => m.FilesPane));\nconst SourcesBody = lazyPane(() => import('./builtin/SourcesPane.js').then((m) => m.SourcesPane));\nconst ReasoningBody = lazyPane(() => import('./builtin/ReasoningPane.js').then((m) => m.ReasoningPane));\n\ninterface BuiltinExtras {\n icon: PaneIcon;\n component: Body;\n description: string;\n order: number;\n toggle?: boolean;\n needsSession?: boolean;\n when?: PaneDefinition['when'];\n}\n\n/** A slot pane exists once its owner's file is in the build (shell/slots.tsx). */\nconst slotLanded = (slot: Parameters<typeof isSlotAvailable>[0]) => () => isSlotAvailable(slot);\n\nconst EXTRAS: Readonly<Record<BuiltinPaneId, BuiltinExtras>> = {\n terminal: {\n icon: TerminalGlyph, component: TerminalPaneBody, order: 10, toggle: true, when: slotLanded('terminal-pane'),\n description: \"A shell in this chat's folders. Commands the chat suggests paste here — you press Enter.\",\n },\n browser: {\n icon: PreviewGlyph, component: BrowserPaneBody, order: 20, toggle: true, when: slotLanded('preview-pane'),\n description: 'Your dev server or a page the chat made, live beside the conversation.',\n },\n diff: {\n icon: ReviewGlyph, component: ChangesPaneBody, order: 30, toggle: true, when: slotLanded('diff-pane'),\n description: 'What changed — this turn, uncommitted, or the whole branch — with notes you can send back.',\n },\n files: {\n icon: FilesGlyph, component: FilesBody, order: 40,\n description: \"The chat's folders, and every file it has read or changed.\",\n },\n sources: {\n icon: SourcesGlyph, component: SourcesBody, order: 50,\n description: 'The pages, searches and files an answer rests on.',\n },\n reasoning: {\n icon: ReasoningGlyph, component: ReasoningBody, order: 60,\n description: \"The model's thinking, turn by turn, beside the answer.\",\n },\n tasks: {\n icon: TasksGlyph, component: TasksBody, order: 70, needsSession: false,\n description: \"This turn's tool calls, and every other chat that is running.\",\n },\n context: {\n icon: ContextGlyph, component: ContextBody, order: 80, needsSession: false,\n description: \"How full this chat's context is, its folders, memory and handoff.\",\n },\n};\n\nlet disposers: Array<() => void> = [];\n\n/** Register (or re-register, after a registry reset) every first-party pane. Idempotent. */\nexport function registerBuiltinPanes(): void {\n for (const dispose of disposers) dispose();\n disposers = DOCK_PANES.map((meta) => {\n const extra = EXTRAS[meta.id];\n return registerBuiltinPane({\n id: meta.id,\n title: meta.label,\n ...(meta.commandId ? { command: meta.commandId } : {}),\n ...extra,\n });\n });\n}\n\nregisterBuiltinPanes();\n","/**\n * routes/verse/panes/register-adapter.ts — panes that describe themselves\n * in a unit's `register.ts` (the shape the Browser, Terminal, Reasoning +\n * Sources and Changes units ship while the registry was landing):\n *\n * export const BROWSER_PANE = {\n * id: 'browser', label: 'Browser', commandId: 'pane.browser',\n * keywords: […], defaultSlot: 'dock', chatScoped: true,\n * load: () => import('./BrowserPanel.js').then((m) => ({ default: m.BrowserPanel })),\n * };\n *\n * panes/index.ts discovers every `routes/verse/<unit>/register.ts` and hands\n * its exports here. Each export of that shape becomes a registered pane —\n * REPLACING the first-party one with the same id (so it keeps that pane's\n * key, order and header toggle) — and anything else in the file is ignored.\n *\n * The unit's component gets the full PaneProps. Components written against\n * the smaller `{ sessionId, visible }` contract simply ignore the rest; they\n * are handed `sessionId: null` when no chat is open (these panes accept it),\n * so `needsSession` is false for them.\n */\nimport type { ComponentType } from 'react';\nimport { PanelRightGlyph } from '../dock/dock-icons.js';\nimport { PANE_ID_RE } from '../shell/dock-catalog.js';\nimport { getPane, lazyPane, registerPane, type PaneIcon, type PaneProps } from './pane-registry.js';\n\n/** The self-description a unit's `register.ts` exports. */\nexport interface UnitPaneRegistration {\n id: string;\n label: string;\n commandId?: string;\n keywords?: readonly string[];\n defaultSlot?: 'dock' | 'side' | 'main';\n chatScoped?: boolean;\n /** Optional: a 16px glyph; the first-party pane's icon (or a generic panel glyph) otherwise. */\n icon?: PaneIcon;\n /** Optional: its own chord ('mod+alt+t'); vetted like any pane shortcut. */\n shortcut?: string;\n description?: string;\n load: () => Promise<{ default: ComponentType<never> }>;\n}\n\n/** Ids a unit may use for a first-party pane under another name. */\nconst ID_ALIASES: Readonly<Record<string, string>> = { changes: 'diff', review: 'diff', preview: 'browser' };\n\nexport function isUnitPaneRegistration(value: unknown): value is UnitPaneRegistration {\n if (value === null || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n return typeof v['id'] === 'string' && PANE_ID_RE.test(v['id']) && typeof v['label'] === 'string' && v['label'].trim() !== ''\n && typeof v['load'] === 'function';\n}\n\n/**\n * Register every pane the given modules describe. Returns the ids registered\n * (for tests) — duplicates across modules: the later module wins, like any\n * replacement.\n */\nexport function registerUnitPanes(modules: Record<string, unknown>): string[] {\n const ids: string[] = [];\n for (const path of Object.keys(modules).sort()) {\n const mod = modules[path];\n if (mod === null || typeof mod !== 'object') continue;\n for (const value of Object.values(mod as Record<string, unknown>)) {\n if (!isUnitPaneRegistration(value)) continue;\n const id = ID_ALIASES[value.id] ?? value.id;\n const existing = getPane(id);\n const load = value.load;\n registerPane({\n id,\n title: value.label.trim(),\n icon: value.icon ?? existing?.icon ?? PanelRightGlyph,\n component: lazyPane(() => load().then((m) => m.default as unknown as ComponentType<PaneProps>)),\n needsSession: false,\n ...(value.shortcut ? { shortcut: value.shortcut } : {}),\n ...(value.description ? { description: value.description } : {}),\n });\n ids.push(id);\n }\n }\n return ids;\n}\n","/**\n * routes/verse/panes/index.ts — the pane system's entry: the registry API,\n * the first-party panes, and every other unit's panes, DISCOVERED.\n *\n * DISCOVERY. Any file named `*.pane.ts` / `*.pane.tsx` under routes/verse/\n * is imported here (eagerly — it only registers; its component stays a\n * `lazy()` import of its own chunk). So a unit adds a pane by adding ONE\n * file in its own directory, e.g. routes/verse/reasoning/reasoning.pane.tsx:\n *\n * import { lazyPane, registerPane } from '../panes/pane-registry.js';\n * registerPane({ id: 'reasoning', title: 'Reasoning', icon: ReasoningGlyph,\n * component: lazyPane(() => import('./ReasoningPane.js').then((m) => m.ReasoningPane)) });\n *\n * Load order does not matter: first-party panes always sit under a unit's\n * registration of the same id (pane-registry.ts registerBuiltinPane).\n *\n * The chat loads this module just after first paint (preloaded), never on\n * it — keep `*.pane.tsx` files to a registration and a lazy import.\n */\nimport './builtin-panes.js';\nimport { registerUnitPanes } from './register-adapter.js';\n\n/**\n * Every `*.pane.ts(x)` under routes/verse — keyed by path, evaluated for\n * their registrations. Exported so the registry test can check discovery.\n */\nexport const DISCOVERED_PANE_MODULES: Record<string, unknown> = import.meta.glob(['../**/*.pane.ts', '../**/*.pane.tsx'], { eager: true });\n\n/**\n * Every unit's `register.ts` (routes/verse/<unit>/register.ts) — the\n * self-describing form (`export const BROWSER_PANE = { id, label, load, … }`)\n * units shipped while the registry was landing. Each such export becomes a\n * registered pane (register-adapter.ts); a unit whose file has not landed is\n * simply an absent key. Registered AFTER the first-party panes (this body\n * runs once every import above has evaluated), so they replace the stubs.\n */\nexport const UNIT_PANE_MODULES: Record<string, unknown> = import.meta.glob('../*/register.ts', { eager: true });\nexport const UNIT_PANE_IDS: readonly string[] = registerUnitPanes(UNIT_PANE_MODULES);\n\nexport * from './pane-registry.js';\nexport { isUnitPaneRegistration, registerUnitPanes, type UnitPaneRegistration } from './register-adapter.js';\nexport { registerBuiltinPanes } from './builtin-panes.js';\n"],"file":"panes-BjUzIDw6.js"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{s as e,u as t}from"./index-BbDqdepe.js";import{a as n}from"./tool-semantics-DtFU7rvB.js";var r=t(e(),1),i=[],a=(0,r.createContext)(i);function o(e){return e}function s(e){return e.replace(/\\/g,`/`).replace(/\/+$/,``).replace(/^\/private(?=\/(?:tmp|var|etc)(?:\/|$))/,``).replace(/^[A-Z](?=:)/,e=>e.toLowerCase())}function c(e,t=i){let n=s(e),r=``;for(let e of t){let t=s(e);t.length>r.length&&!/^(?:[a-z]:)?$/.test(t)&&(n===t||n.startsWith(`${t}/`))&&(r=t)}let a=e.replace(/[\\/]+$/,``);if(r){let e=n.length-r.length-1;return e>0?a.slice(a.length-e):a.slice(Math.max(a.lastIndexOf(`/`),a.lastIndexOf(`\\`))+1)}if(!/^(?:[\\/]|[A-Za-z]:[\\/])/.test(e))return e.replace(/^\.[\\/]/,``);let o=e.includes(`/`)?`/`:`\\`,c=e.replace(/^[A-Za-z]:/,``).split(/[\\/]/).filter(Boolean);return c.length>4?`…${o}${c.slice(-3).join(o)}`:e}function l(e){let t=typeof e==`object`&&e?e:null;return t&&typeof t.command!=`string`&&typeof t.cmd!=`string`?n(t)[0]??null:null}function u(){let e=(0,r.useContext)(a);return(0,r.useCallback)(t=>c(t,e),[e])}export{u as a,l as i,o as n,c as r,a as t};
|
|
2
|
-
//# sourceMappingURL=path-display-HyxETV-f.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"path-display-HyxETV-f.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/path-display.ts"],"sourcesContent":["/**\n * routes/verse/chat/path-display.ts — how a file path READS in the chat.\n *\n * Tool payloads carry whatever path the CLI used, and that is usually\n * absolute: `/private/tmp/…/scratchpad/e2e-proj-39/math.ts` for a file the\n * operator knows as `math.ts`. Shown raw, the one part that identifies the\n * file is what the row's ellipsis clips. So every path the transcript draws\n * goes through `displayPath`:\n *\n * 1. relative to the chat's roots (the longest root that contains it wins —\n * a worktree nested in its repo is its own root). Paths and roots are\n * compared as `keyOf`s, so `\\` vs `/`, a trailing separator, macOS's\n * `/private/tmp` for `/tmp` and `c:` for `C:` all still match; the rest\n * is sliced out of the ORIGINAL path, in the CLI's own separators;\n * 2. otherwise as the hub sent it when it is relative or `~/…`;\n * 3. otherwise, when it is long, its last three segments behind `…/`.\n *\n * HOME. The hub rewrites the operator's OWN home to `~` on every payload\n * (sanitizePublicJson) and is the only side that knows which home that is —\n * so a `~/…` path or root already says it, and matches as-is. Nothing here\n * guesses a home from `/Users/<x>`, `/home/<x>` or `C:\\Users\\<x>`: one that\n * reaches the browser is another account's or /Users/Shared, and drawing it\n * as `~` (or as in-project, via a `~` root) passes it off as the operator's.\n *\n * Display only. The full path stays in the tooltip and is never rewritten in\n * anything handed back to a tool, a search or a jump anchor. (It is in the\n * chat's first-paint chunk, hence the terse body.)\n */\nimport { createContext, useCallback, useContext } from 'react';\nimport { pathsIn } from './tool-semantics.js';\n\nconst NO_ROOTS: readonly string[] = [];\n\n/** The chat's roots, primary first (Workspace provides them; Transcript can override). */\nexport const PathRootsContext = createContext<readonly string[]>(NO_ROOTS);\n\n/**\n * A path as the operator's home reads: unchanged. The hub already spelled\n * that home `~`; any other `/Users/<x>` is someone else's (see HOME above).\n * Kept as the one seam home display goes through (SessionRoots uses it).\n */\nexport function abbreviateHome(path: string): string {\n return path;\n}\n\n/**\n * One folder's comparable form: `/` separators, no trailing one, the\n * `/private` alias folded (/tmp, /var and /etc are symlinks into it and roots\n * are not realpath'd), a lower-case drive letter. Only the fold changes the\n * length, and only at the head — so a matched tail maps back onto the original.\n */\nfunction keyOf(path: string): string {\n return path.replace(/\\\\/g, '/').replace(/\\/+$/, '')\n .replace(/^\\/private(?=\\/(?:tmp|var|etc)(?:\\/|$))/, '')\n .replace(/^[A-Z](?=:)/, (d) => d.toLowerCase());\n}\n\n/** What the transcript draws for `path`; the full path belongs in the tooltip. */\nexport function displayPath(path: string, roots: readonly string[] = NO_ROOTS): string {\n const key = keyOf(path);\n let root = '';\n for (const raw of roots) {\n const r = keyOf(raw);\n // A bare `/`, `C:` or `\\\\` root would claim every path on the machine.\n if (r.length > root.length && !/^(?:[a-z]:)?$/.test(r) && (key === r || key.startsWith(`${r}/`))) root = r;\n }\n const own = path.replace(/[\\\\/]+$/, '');\n // Inside a root: the rest of the path, or — for the root itself — its name.\n if (root) {\n const rest = key.length - root.length - 1;\n return rest > 0 ? own.slice(own.length - rest) : own.slice(Math.max(own.lastIndexOf('/'), own.lastIndexOf('\\\\')) + 1);\n }\n if (!/^(?:[\\\\/]|[A-Za-z]:[\\\\/])/.test(path)) return path.replace(/^\\.[\\\\/]/, '');\n const sep = path.includes('/') ? '/' : '\\\\';\n const parts = path.replace(/^[A-Za-z]:/, '').split(/[\\\\/]/).filter(Boolean);\n return parts.length > 4 ? `…${sep}${parts.slice(-3).join(sep)}` : path;\n}\n\n/**\n * The file a tool call names, when it runs no command — a shell call keeps\n * its command line verbatim (rewriting a command is not display).\n */\nexport function inputPath(input: unknown): string | null {\n const rec = input !== null && typeof input === 'object' ? input as Record<string, unknown> : null;\n return rec && typeof rec.command !== 'string' && typeof rec.cmd !== 'string' ? pathsIn(rec)[0] ?? null : null;\n}\n\n/** `displayPath` bound to the roots in context. */\nexport function useDisplayPath(): (path: string) => string {\n const roots = useContext(PathRootsContext);\n return useCallback((path: string) => displayPath(path, roots), [roots]);\n}\n"],"mappings":"+GA+BM,EAA8B,CAAC,EAGxB,GAAA,EAAmB,EAAA,cAAA,CAAiC,CAAQ,EAOzE,SAAgB,EAAe,EAAsB,CACnD,OAAO,CACT,CAQA,SAAS,EAAM,EAAsB,CACnC,OAAO,EAAK,QAAQ,MAAO,GAAG,CAAC,CAAC,QAAQ,OAAQ,EAAE,CAAC,CAChD,QAAQ,0CAA2C,EAAE,CAAC,CACtD,QAAQ,cAAgB,GAAM,EAAE,YAAY,CAAC,CAClD,CAGA,SAAgB,EAAY,EAAc,EAA2B,EAAkB,CACrF,IAAM,EAAM,EAAM,CAAI,EAClB,EAAO,GACX,IAAK,IAAM,KAAO,EAAO,CACvB,IAAM,EAAI,EAAM,CAAG,EAEf,EAAE,OAAS,EAAK,QAAU,CAAC,gBAAgB,KAAK,CAAC,IAAM,IAAQ,GAAK,EAAI,WAAW,GAAG,EAAE,EAAE,KAAI,EAAO,EAC3G,CACA,IAAM,EAAM,EAAK,QAAQ,UAAW,EAAE,EAEtC,GAAI,EAAM,CACR,IAAM,EAAO,EAAI,OAAS,EAAK,OAAS,EACxC,OAAO,EAAO,EAAI,EAAI,MAAM,EAAI,OAAS,CAAI,EAAI,EAAI,MAAM,KAAK,IAAI,EAAI,YAAY,GAAG,EAAG,EAAI,YAAY,IAAI,CAAC,EAAI,CAAC,CACtH,CACA,GAAI,CAAC,4BAA4B,KAAK,CAAI,EAAG,OAAO,EAAK,QAAQ,WAAY,EAAE,EAC/E,IAAM,EAAM,EAAK,SAAS,GAAG,EAAI,IAAM,KACjC,EAAQ,EAAK,QAAQ,aAAc,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,OAAO,OAAO,EAC1E,OAAO,EAAM,OAAS,EAAI,IAAI,IAAM,EAAM,MAAM,EAAE,CAAC,CAAC,KAAK,CAAG,IAAM,CACpE,CAMA,SAAgB,EAAU,EAA+B,CACvD,IAAM,EAAwB,OAAO,GAAU,UAAnC,EAA8C,EAAmC,KAC7F,OAAO,GAAO,OAAO,EAAI,SAAY,UAAY,OAAO,EAAI,KAAQ,SAAW,EAAQ,CAAG,CAAC,CAAC,IAAM,KAAO,IAC3G,CAGA,SAAgB,GAA2C,CACzD,IAAM,GAAA,EAAQ,EAAA,WAAA,CAAW,CAAgB,EACzC,OAAA,EAAO,EAAA,YAAA,CAAa,GAAiB,EAAY,EAAM,CAAK,EAAG,CAAC,CAAK,CAAC,CACxE"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{I as e}from"./VerseConsoleApp-kFOEmnGC.js";import{n as t}from"./composer-draft-DB025_AW.js";var n=/(^|\s)![a-z0-9][a-z0-9-]{1,47}(?:@v?\d{1,6})?(?=\s|$)/g;function r(e,t){let r=e.replace(n,(e,t)=>t).replace(/^\s+/,``);return r?`${t} ${r}`:`${t} `}function i(e,t){let n=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,`value`)?.set;n?n.call(e,t):e.value=t,e.dispatchEvent(new Event(`input`,{bubbles:!0})),e.focus();let r=e.value.length;try{e.setSelectionRange(r,r)}catch{}}function a(e,n){let a=t(n);return!a||a.disabled?!1:(i(a,r(a.value,e)),!0)}async function o(t,n={}){e(`chat`);let r=Date.now()+(n.waitMs??3e3);for(;;){if(a(t,n.root))return!0;if(Date.now()>=r)return!1;await new Promise(e=>setTimeout(e,60))}}export{a as n,o as t};
|
|
2
|
-
//# sourceMappingURL=playbook-composer-DwuBBP4I.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"playbook-composer-DwuBBP4I.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/playbooks/playbook-composer.ts"],"sourcesContent":["/**\n * routes/verse/playbooks/playbook-composer.ts — put a playbook's `!macro`\n * into the chat composer (never send it).\n *\n * A playbook reaches a task through its text: `!fix-bug` in the message is\n * resolved by whichever lane runs it (the chat itself on any seat, Run in\n * cloud, Run in Devin, a fleet goal). So \"Use playbook…\" and \"Run…\" only\n * WRITE the macro at the front of the draft — the operator still describes\n * the task and picks the lane.\n *\n * Like cloud/composer-draft.ts, this goes through the box itself (native\n * setter + `input` event), which React's controlled textarea treats as the\n * operator's own edit, so draft persistence sees it too.\n */\nimport { findComposerBox } from '../cloud/composer-draft.js';\nimport { setVerseSection } from '../verse-ui-store.js';\n\n/** `!name` tokens anywhere in prose (the server's rule, simplified: whitespace or start before `!`). */\nconst MACRO_TOKEN = /(^|\\s)![a-z0-9][a-z0-9-]{1,47}(?:@v?\\d{1,6})?(?=\\s|$)/g;\n\n/**\n * The draft with `macro` at its front. A draft that already names a\n * playbook has that one replaced (one playbook per task); an empty draft\n * becomes `!macro ` ready for the task text. Pure.\n */\nexport function withMacro(draft: string, macro: string): string {\n const stripped = draft.replace(MACRO_TOKEN, (_m, lead: string) => lead).replace(/^\\s+/, '');\n return stripped ? `${macro} ${stripped}` : `${macro} `;\n}\n\nfunction write(box: HTMLTextAreaElement, value: string): void {\n const setter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set;\n if (setter) setter.call(box, value);\n else box.value = value;\n box.dispatchEvent(new Event('input', { bubbles: true }));\n box.focus();\n const end = box.value.length;\n try {\n box.setSelectionRange(end, end);\n } catch {\n /* a hidden box has no selection; the text is in either way */\n }\n}\n\n/** Write the macro into the composer on screen. False when there is no usable box. */\nexport function putMacroInComposerNow(macro: string, root?: ParentNode): boolean {\n const box = findComposerBox(root);\n if (!box || box.disabled) return false;\n write(box, withMacro(box.value, macro));\n return true;\n}\n\n/**\n * Go to Chat and write the macro once its composer is mounted (the Chat\n * section may be a chunk that is still loading). False when no chat composer\n * appeared in time — the caller says so (open a chat first).\n */\nexport async function putMacroInComposer(macro: string, opts: { waitMs?: number; root?: ParentNode } = {}): Promise<boolean> {\n setVerseSection('chat');\n const deadline = Date.now() + (opts.waitMs ?? 3_000);\n for (;;) {\n if (putMacroInComposerNow(macro, opts.root)) return true;\n if (Date.now() >= deadline) return false;\n await new Promise((resolve) => setTimeout(resolve, 60));\n }\n}\n"],"mappings":"mGAkBA,IAAM,EAAc,yDAOpB,SAAgB,EAAU,EAAe,EAAuB,CAC9D,IAAM,EAAW,EAAM,QAAQ,GAAc,EAAI,IAAiB,CAAI,CAAC,CAAC,QAAQ,OAAQ,EAAE,EAC1F,OAAO,EAAW,GAAG,EAAM,GAAG,IAAa,GAAG,EAAM,EACtD,CAEA,SAAS,EAAM,EAA0B,EAAqB,CAC5D,IAAM,EAAS,OAAO,yBAAyB,oBAAoB,UAAW,OAAO,CAAC,EAAE,IACpF,EAAQ,EAAO,KAAK,EAAK,CAAK,EAC7B,EAAI,MAAQ,EACjB,EAAI,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CAAC,EACvD,EAAI,MAAM,EACV,IAAM,EAAM,EAAI,MAAM,OACtB,GAAI,CACF,EAAI,kBAAkB,EAAK,CAAG,CAChC,MAAQ,CAER,CACF,CAGA,SAAgB,EAAsB,EAAe,EAA4B,CAC/E,IAAM,EAAM,EAAgB,CAAI,EAGhC,MAFI,CAAC,GAAO,EAAI,SAAiB,IACjC,EAAM,EAAK,EAAU,EAAI,MAAO,CAAK,CAAC,EAC/B,GACT,CAOA,eAAsB,EAAmB,EAAe,EAA+C,CAAC,EAAqB,CAC3H,EAAgB,MAAM,EACtB,IAAM,EAAW,KAAK,IAAI,GAAK,EAAK,QAAU,KAC9C,OAAS,CACP,GAAI,EAAsB,EAAO,EAAK,IAAI,EAAG,MAAO,GACpD,GAAI,KAAK,IAAI,GAAK,EAAU,MAAO,GACnC,MAAM,IAAI,QAAS,GAAY,WAAW,EAAS,EAAE,CAAC,CACxD,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{l as e}from"./index-BbDqdepe.js";import{I as t}from"./VerseConsoleApp-kFOEmnGC.js";var n=e({REQUEST_TTL_MS:()=>r,getPlaybookFocus:()=>l,isPlaybookFocusLive:()=>u,requestPlaybookFocus:()=>c,subscribePlaybookFocus:()=>f,takePlaybookFocus:()=>d}),r=2e4,i=null,a=0,o=new Set;function s(){for(let e of[...o])e()}function c(e){a+=1,i={...e,seq:a,at:Date.now()},t(`playbooks`),s()}function l(){return i}function u(e,t=Date.now()){return t-e.at<=r}function d(e){i?.seq===e&&(i=null,s())}function f(e){return o.add(e),()=>o.delete(e)}export{d as a,f as i,u as n,n as r,l as t};
|
|
2
|
-
//# sourceMappingURL=playbook-focus-B9xzeUMw.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"playbook-focus-B9xzeUMw.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/playbooks/playbook-focus.ts"],"sourcesContent":["/**\n * routes/verse/playbooks/playbook-focus.ts — ⌘K \"Run playbook…\" → the lazily\n * mounted Playbooks section, in \"choose one to run\" mode (the same shape as\n * wiki/wiki-focus.ts). A request waits (up to REQUEST_TTL_MS) until the\n * section mounts and takes it. Tiny and framework-free.\n */\nimport { setVerseSection } from '../verse-ui-store.js';\n\n/**\n * `run`: ⌘K \"Run playbook…\" — pick any playbook to run.\n * `workflows`: ⌘K \"Run command workflow…\" when no terminal panel served it —\n * the list narrows to command workflows (kind: command).\n */\nexport type PlaybookFocusTarget = { kind: 'run' } | { kind: 'workflows' };\nexport type PlaybookFocusRequest = PlaybookFocusTarget & { seq: number; at: number };\n\nexport const REQUEST_TTL_MS = 20_000;\n\nlet current: PlaybookFocusRequest | null = null;\nlet seq = 0;\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\nexport function requestPlaybookFocus(target: PlaybookFocusTarget): void {\n seq += 1;\n current = { ...target, seq, at: Date.now() };\n setVerseSection('playbooks');\n emit();\n}\n\nexport function getPlaybookFocus(): PlaybookFocusRequest | null {\n return current;\n}\n\nexport function isPlaybookFocusLive(request: PlaybookFocusRequest, now: number = Date.now()): boolean {\n return now - request.at <= REQUEST_TTL_MS;\n}\n\n/** Clear request `requestSeq` (only that one — a newer ask survives). */\nexport function takePlaybookFocus(requestSeq: number): void {\n if (current?.seq !== requestSeq) return;\n current = null;\n emit();\n}\n\nexport function subscribePlaybookFocus(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Test hygiene. */\nexport function resetPlaybookFocus(): void {\n current = null;\n emit();\n}\n"],"mappings":"2PAgBa,EAAiB,IAE1B,EAAuC,KACvC,EAAM,EACJ,EAAY,IAAI,IAEtB,SAAS,GAAa,CACpB,IAAK,IAAM,IAAK,CAAC,GAAG,CAAS,EAAG,EAAE,CACpC,CAEA,SAAgB,EAAqB,EAAmC,CACtE,GAAO,EACP,EAAU,CAAE,GAAG,EAAQ,MAAK,GAAI,KAAK,IAAI,CAAE,EAC3C,EAAgB,WAAW,EAC3B,EAAK,CACP,CAEA,SAAgB,GAAgD,CAC9D,OAAO,CACT,CAEA,SAAgB,EAAoB,EAA+B,EAAc,KAAK,IAAI,EAAY,CACpG,OAAO,EAAM,EAAQ,IAAM,CAC7B,CAGA,SAAgB,EAAkB,EAA0B,CACtD,GAAS,MAAQ,IACrB,EAAU,KACV,EAAK,EACP,CAEA,SAAgB,EAAuB,EAAkC,CAEvE,OADA,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{C as e,M as t,V as n,a as r,i,t as a}from"./global-BWc2NPzv.js";import{r as o}from"./VerseShared-_pMXKs8m.js";var s=`/api/verse/playbooks`,c=[`Outcome`,`Procedure`,`Specifications`,`Advice`,`Forbidden actions`,`Required from user`],l=[`Outcome`,`Procedure`],u=[`agent`,`command`],d=`Command`,f=/^[a-z0-9][a-z0-9-]{1,47}$/,p=/^![a-z0-9][a-z0-9-]{1,47}$/,m=12288;function h(e){return e?.kind===`command`?`command`:`agent`}var g=`verse-playbooks`,_=(e,t)=>`verse-playbook:${e}:${t??`latest`}`;function v(e){if(!e||typeof e!=`object`)return null;let t=e.playbooks;return Array.isArray(t)?t:null}var y={key:g,fetch:async e=>{try{let t=v(await i(s,e));return t?{value:t,available:!0,reason:null}:{value:null,available:!0,reason:`Unrecognized response — update Ashlr.`}}catch(e){if(e instanceof a&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{value:null,available:!1,reason:e instanceof a&&e.status===404?`Playbooks are not in this build yet.`:`Playbooks could not be read.`}}}};function b(e,t){let n=t===null?``:`?version=${t}`;return{key:_(e,t),fetch:t=>i(`${s}/${encodeURIComponent(e)}${n}`,t)}}async function x(i){let a=e();if(!a)throw new o;let c=await r(s,i,a);return t(),c.ok&&(n(g),n(_(c.playbook.meta.id,null))),c}export{f as a,m as c,h as d,d as i,c as l,y as n,u as o,x as r,p as s,b as t,l as u};
|
|
2
|
-
//# sourceMappingURL=playbooks-queries-C8j1Aswo.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"playbooks-queries-C8j1Aswo.js","names":[],"sources":["../../../../../../src/core/playbooks/types.ts","../../../../../../src/web-ui/routes/verse/playbooks/playbooks-queries.ts"],"sourcesContent":["/**\n * Versioned playbooks — the vocabulary (3.15).\n *\n * A PLAYBOOK is a reusable, versioned task template every lane can run under:\n * fleet goals, the cloud lane, the Devin lane, the Leader's work.dispatch and\n * the interactive \"Run in cloud / Run in Devin\". Modelled on Devin playbooks:\n * a markdown body with fixed sections (Outcome, Procedure, Specifications,\n * Advice, Forbidden actions, Required from user) under a small front-matter\n * (id, name, `!macro`, where it applies, done-when checks, default budget).\n *\n * Versions are IMMUTABLE: an edit writes v<N+1>; v<N> is never rewritten, so\n * a task that ran under `fix-issue@v3` can always be traced to the exact text\n * it was given, and retros attribute outcomes per version.\n *\n * Guidance only: a playbook changes what the brief SAYS, never a route, gate,\n * budget cap or authority. A task with no playbook gets a byte-identical prompt.\n *\n * BROWSER-SAFE: the Playbooks view imports this — type-only imports, plain consts.\n */\nimport type { TaskKind } from '../learn/retro/types.js';\nimport type { CommandParam } from './command-template.js';\n\nexport type { TaskKind, CommandParam };\n\nexport const VERSE_PLAYBOOKS_PATH = '/api/verse/playbooks';\n\n/** The body sections, in render order. Headings are `## <name>` (case-insensitive). */\nexport const PLAYBOOK_SECTIONS = [\n 'Outcome',\n 'Procedure',\n 'Specifications',\n 'Advice',\n 'Forbidden actions',\n 'Required from user',\n] as const;\nexport type PlaybookSectionName = (typeof PLAYBOOK_SECTIONS)[number];\n\n/** A playbook without these is rejected: an engine needs a goal and a way there. */\nexport const REQUIRED_PLAYBOOK_SECTIONS: readonly PlaybookSectionName[] = ['Outcome', 'Procedure'];\n\n/**\n * What a playbook is (the `kind` front-matter key):\n * agent guidance an engine follows — every playbook before this key\n * existed, and the default when it is absent.\n * command a COMMAND WORKFLOW: a shell command template with\n * `{{param:default}}` holes (command-template.ts). The operator\n * fills a form and the command is pasted at a terminal prompt —\n * never run, never sent to an engine. No lane resolves one: not\n * by `!macro`, not explicitly, not by auto-match (resolve.ts).\n */\nexport const PLAYBOOK_KINDS = ['agent', 'command'] as const;\nexport type PlaybookKind = (typeof PLAYBOOK_KINDS)[number];\n\n/** A command workflow's body: the `## Command` code block and its holes. */\nexport interface PlaybookCommandSpec {\n /** The command template, exactly as in the code block (no trailing newline). */\n template: string;\n /** Distinct `{{name[:default]}}` holes, in first-appearance order. */\n params: CommandParam[];\n}\n\n/** The one section of a `kind: command` playbook (its code block is the template). */\nexport const COMMAND_SECTION = 'Command';\n\n/** Ids are path segments: lowercase, digits, dashes; 2–48 chars. */\nexport const PLAYBOOK_ID_PATTERN = /^[a-z0-9][a-z0-9-]{1,47}$/;\n/** Macros are `!` + an id-shaped name. */\nexport const PLAYBOOK_MACRO_PATTERN = /^![a-z0-9][a-z0-9-]{1,47}$/;\n\n/** A playbook's markdown source never exceeds this (UTF-8 bytes). */\nexport const PLAYBOOK_MAX_BYTES = 12 * 1024;\n/** The rendered block injected into a prompt never exceeds this (Devin's AGENTS.md cap). */\nexport const PLAYBOOK_INJECT_CAP_BYTES = 16 * 1024;\n\nexport interface PlaybookBudget {\n /** Default spend ceiling for one run, in USD; null = the lane's own default. */\n usd: number | null;\n /** Default wall-clock ceiling for one run, in minutes; null = the lane's own default. */\n minutes: number | null;\n}\n\n/** Front-matter. */\nexport interface PlaybookMeta {\n id: string;\n name: string;\n /** `!fix-bug`. Defaults to `!<id>`. */\n macro: string;\n /** One line for lists and the ⌘K palette. */\n description: string;\n /** Where it applies. Empty lists mean \"any\". */\n appliesTo: {\n /** GitHub `owner/name`, case-insensitive. */\n repos: string[];\n /** Repo-relative globs (`src/**`, `*.md`). */\n globs: string[];\n };\n /** Task kinds it is written for; [] = any. */\n taskKinds: TaskKind[];\n /** Checks the engine must see pass before it calls the task done. */\n doneWhen: string[];\n budget: PlaybookBudget;\n /**\n * Auto-match: attach this playbook to tasks that did not name one when the\n * task's kind (and repo / globs) match. Off by default — a playbook reaches\n * a task only when asked for, until Mason turns this on.\n */\n auto: boolean;\n /**\n * `agent` or `command` (see PLAYBOOK_KINDS). The parser always sets it;\n * absent (a record from an older build, a hand-built meta) means `agent`.\n */\n kind?: PlaybookKind;\n /** kind `command` only: the template and its holes. */\n command?: PlaybookCommandSpec;\n}\n\n/** A playbook's kind; absent ⇒ `agent` (every playbook written before 3.15's command workflows). Pure. */\nexport function playbookKindOf(meta: { kind?: PlaybookKind } | null | undefined): PlaybookKind {\n return meta?.kind === 'command' ? 'command' : 'agent';\n}\n\nexport type PlaybookSections = Partial<Record<PlaybookSectionName, string>>;\n\n/** A parsed, validated playbook version. */\nexport interface PlaybookV1 {\n v: 1;\n meta: PlaybookMeta;\n sections: PlaybookSections;\n version: number;\n /** First 12 hex of sha256(source) — pins the exact text a task ran under. */\n sha: string;\n /** The canonical markdown stored on disk. */\n source: string;\n createdAt: string;\n /** Shipped with ashlr and never edited on this machine (v1 lives in code). */\n builtin: boolean;\n}\n\n/** What a task / proposal / retro records: the exact playbook version it ran under. */\nexport interface PlaybookRef {\n id: string;\n version: number;\n sha: string;\n}\n\n/** How a playbook reached a task. */\nexport type PlaybookMatch = 'explicit' | 'macro' | 'auto';\n\nexport interface PlaybookVersionInfo {\n version: number;\n sha: string;\n createdAt: string;\n /** Optional change note written with the edit. */\n note: string | null;\n /** Who wrote this version (`mason`, `leader`, `cli`, `ashlr` for a built-in); null = not recorded. */\n author: string | null;\n}\n\n/** One row of the playbook list. */\nexport interface PlaybookSummary {\n id: string;\n name: string;\n macro: string;\n description: string;\n taskKinds: TaskKind[];\n auto: boolean;\n latest: number;\n builtin: boolean;\n updatedAt: string;\n /** `agent` | `command`; absent (an older server) ⇒ `agent`. */\n kind?: PlaybookKind;\n /** kind `command` only: the template and its holes, so a picker fills without a second read. */\n command?: PlaybookCommandSpec;\n}\n\n/** Outcomes per version, counted from retros that carry this playbook. */\nexport interface PlaybookOutcomeCounts {\n merged: number;\n /** gate-refused, owner-laned, closed, vetoed. */\n refused: number;\n reverted: number;\n /** verify-failed, failed, expired. */\n failed: number;\n total: number;\n}\n\nexport interface PlaybookValidationIssue {\n field: string;\n message: string;\n}\n\nexport type PlaybookParseResult =\n | { ok: true; meta: PlaybookMeta; sections: PlaybookSections; warnings: PlaybookValidationIssue[] }\n | { ok: false; errors: PlaybookValidationIssue[] };\n\n// ---------------------------------------------------------------------------\n// Verse contract\n// ---------------------------------------------------------------------------\n\n/** GET /api/verse/playbooks */\nexport interface PlaybooksListResponse {\n v: 1;\n playbooks: PlaybookSummary[];\n}\n\n/** GET /api/verse/playbooks/<id>[?version=N] */\nexport interface PlaybookDetailResponse {\n v: 1;\n playbook: PlaybookV1;\n /**\n * Rendered as an engine sees it. A command workflow never reaches an\n * engine: for one this is its command block and parameters, for reading.\n */\n rendered: string;\n versions: (PlaybookVersionInfo & { outcomes: PlaybookOutcomeCounts })[];\n}\n\n/** POST /api/verse/playbooks — create (id must be new) or edit (id exists ⇒ v<N+1>). */\nexport interface PlaybookSaveRequest {\n source: string;\n /** Edit guard: the version the editor started from; a newer latest refuses the save. */\n baseVersion?: number;\n note?: string;\n}\n\nexport type PlaybookSaveResponse =\n | { ok: true; playbook: PlaybookV1 }\n | { ok: false; errors: PlaybookValidationIssue[] };\n\nexport function formatPlaybookRef(ref: Pick<PlaybookRef, 'id' | 'version'>): string {\n return `${ref.id}@v${ref.version}`;\n}\n\n/** Parse `id@vN` / `id@N` / `id`. null when malformed. Pure. */\nexport function parsePlaybookRefText(text: string): { id: string; version: number | null } | null {\n const m = /^([a-z0-9][a-z0-9-]{1,47})(?:@v?(\\d{1,6}))?$/.exec(text.trim().replace(/^!/, ''));\n if (!m) return null;\n return { id: m[1]!, version: m[2] ? Number(m[2]) : null };\n}\n\n/** Is this a well-formed PlaybookRef? (Records are read back from disk.) */\nexport function isPlaybookRef(value: unknown): value is PlaybookRef {\n if (!value || typeof value !== 'object') return false;\n const r = value as Record<string, unknown>;\n return typeof r['id'] === 'string' && PLAYBOOK_ID_PATTERN.test(r['id'])\n && typeof r['version'] === 'number' && Number.isInteger(r['version']) && r['version'] >= 1\n && typeof r['sha'] === 'string' && /^[0-9a-f]{12}$/.test(r['sha']);\n}\n","/**\n * routes/verse/playbooks/playbooks-queries.ts — the reads and the one write\n * behind the Playbooks section (core/verse/playbooks-api.ts).\n *\n * GET /api/verse/playbooks → PlaybooksListResponse\n * GET /api/verse/playbooks/<id>[?version=N] → PlaybookDetailResponse\n * POST /api/verse/playbooks → PlaybookSaveResponse (a NEW version)\n *\n * The list read is optional (an older server has no route: the composer's\n * `!` menu and the ⋯ sheet then say so instead of failing). Writes pull the\n * held mutation token, touch the hold, and invalidate what they change.\n */\nimport {\n VERSE_PLAYBOOKS_PATH,\n type PlaybookDetailResponse,\n type PlaybookSaveRequest,\n type PlaybookSaveResponse,\n type PlaybooksListResponse,\n type PlaybookSummary,\n} from '../../../../core/playbooks/types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const PLAYBOOKS_KEY = 'verse-playbooks';\nconst detailKeyOf = (id: string, version: number | null) => `verse-playbook:${id}:${version ?? 'latest'}`;\n\n/** The list, or why there is none. `value: null` ⇒ `reason` says why. */\nexport interface PlaybooksRead {\n value: PlaybookSummary[] | null;\n available: boolean;\n reason: string | null;\n}\n\nfunction narrowList(raw: unknown): PlaybookSummary[] | null {\n if (!raw || typeof raw !== 'object') return null;\n const rows = (raw as { playbooks?: unknown }).playbooks;\n return Array.isArray(rows) ? (rows as PlaybookSummary[]) : null;\n}\n\n/**\n * The list as an optional read: a 404 (no route in this build) or an\n * unreachable server resolves with a reason instead of throwing. Kept free\n * of the command surface's helpers: the composer's `!` menu imports this,\n * and the composer is on the chat's first paint.\n */\nexport const playbooksQuery: QueryDef<PlaybooksRead> = {\n key: PLAYBOOKS_KEY,\n fetch: async (signal) => {\n try {\n const value = narrowList(await apiGet<unknown>(VERSE_PLAYBOOKS_PATH, signal));\n return value ? { value, available: true, reason: null } : { value: null, available: true, reason: 'Unrecognized response — update Ashlr.' };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n const missing = err instanceof ApiError && err.status === 404;\n return { value: null, available: false, reason: missing ? 'Playbooks are not in this build yet.' : 'Playbooks could not be read.' };\n }\n },\n};\n\nexport function playbookDetailQuery(id: string, version: number | null): QueryDef<PlaybookDetailResponse> {\n const suffix = version === null ? '' : `?version=${version}`;\n return {\n key: detailKeyOf(id, version),\n fetch: (signal) => apiGet<PlaybookDetailResponse>(`${VERSE_PLAYBOOKS_PATH}/${encodeURIComponent(id)}${suffix}`, signal),\n };\n}\n\n/** Save = create (new id) or a new version (existing id). Never rewrites a version. */\nexport async function savePlaybookSource(request: PlaybookSaveRequest): Promise<PlaybookSaveResponse> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const res = await apiPost<PlaybookSaveResponse>(VERSE_PLAYBOOKS_PATH, request, token);\n touchMutationHold();\n if (res.ok) {\n invalidate(PLAYBOOKS_KEY);\n invalidate(detailKeyOf(res.playbook.meta.id, null));\n }\n return res;\n}\n\nexport type { PlaybooksListResponse };\n"],"mappings":"qHAwBA,IAAa,EAAuB,uBAGvB,EAAoB,CAC/B,UACA,YACA,iBACA,SACA,oBACA,oBACF,EAIa,EAA6D,CAAC,UAAW,WAAW,EAYpF,EAAiB,CAAC,QAAS,SAAS,EAYpC,EAAkB,UAGlB,EAAsB,4BAEtB,EAAyB,6BAGzB,EAAqB,MA+ClC,SAAgB,EAAe,EAAgE,CAC7F,OAAO,GAAM,OAAS,UAAY,UAAY,OAChD,CC7FA,IAAa,EAAgB,kBACvB,GAAe,EAAY,IAA2B,kBAAkB,EAAG,GAAG,GAAW,WAS/F,SAAS,EAAW,EAAwC,CAC1D,GAAI,CAAC,GAAO,OAAO,GAAQ,SAAU,OAAO,KAC5C,IAAM,EAAQ,EAAgC,UAC9C,OAAO,MAAM,QAAQ,CAAI,EAAK,EAA6B,IAC7D,CAQA,IAAa,EAA0C,CACrD,IAAK,EACL,MAAO,KAAO,IAAW,CACvB,GAAI,CACF,IAAM,EAAQ,EAAW,MAAM,EAAgB,EAAsB,CAAM,CAAC,EAC5E,OAAO,EAAQ,CAAE,QAAO,UAAW,GAAM,OAAQ,IAAK,EAAI,CAAE,MAAO,KAAM,UAAW,GAAM,OAAQ,uCAAwC,CAC5I,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EAEpE,MAAO,CAAE,MAAO,KAAM,UAAW,GAAO,OADxB,aAAe,GAAY,EAAI,SAAW,IACA,uCAAyC,8BAA+B,CACpI,CACF,CACF,EAEA,SAAgB,EAAoB,EAAY,EAA0D,CACxG,IAAM,EAAS,IAAY,KAAO,GAAK,YAAY,IACnD,MAAO,CACL,IAAK,EAAY,EAAI,CAAO,EAC5B,MAAQ,GAAW,EAA+B,GAAG,EAAqB,GAAG,mBAAmB,CAAE,IAAI,IAAU,CAAM,CACxH,CACF,CAGA,eAAsB,EAAmB,EAA6D,CACpG,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAM,MAAM,EAA8B,EAAsB,EAAS,CAAK,EAMpF,OALA,EAAkB,EACd,EAAI,KACN,EAAW,CAAa,EACxB,EAAW,EAAY,EAAI,SAAS,KAAK,GAAI,IAAI,CAAC,GAE7C,CACT"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e,s as t,u as n}from"./index-BbDqdepe.js";var r=n(t(),1),i=e();function a(e){let t=null,n=null,a=()=>(n??=e().then(e=>t=e,e=>{throw n=null,e}),n),o=(0,r.lazy)(()=>a().then(e=>({default:e})));function s(e){let[n]=(0,r.useState)(()=>t);return n?(0,i.jsx)(n,{...e}):(0,i.jsx)(o,{...e})}return typeof window<`u`&&a().catch(()=>void 0),{Slot:s,ready:a}}function o(e){let t=null,n=null,i=()=>(n??=e().then(e=>t=e,e=>{throw n=null,e}),n);function a(){let[e,n]=(0,r.useState)(()=>({current:t}));return(0,r.useEffect)(()=>{if(e.current)return;let t=!0;return i().then(e=>{t&&n({current:e})},()=>void 0),()=>{t=!1}},[e]),e.current}return typeof window<`u`&&i().catch(()=>void 0),{ready:i,useLoaded:a}}export{o as n,a as t};
|
|
2
|
-
//# sourceMappingURL=preloaded-CLDUOHXJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preloaded-CLDUOHXJ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/preloaded.tsx"],"sourcesContent":["/**\n * routes/verse/shell/preloaded.tsx — chunks that start downloading when the\n * module DECLARING them evaluates, and render synchronously once they are in.\n *\n * Moved out of sections/ChatSection.tsx so the shell (guarded-action.tsx)\n * can keep its dialogs off the chat first-paint path the same way the Chat\n * section keeps its workspace, chat list and dialogs off it. A preloaded\n * dialog that has landed mounts in the same render that opens it, exactly as\n * a static import would; one opened in the few milliseconds before its chunk\n * lands shows a moment later.\n */\nimport { lazy, useEffect, useState, type ComponentType } from 'react';\n\n/**\n * A component in its own chunk whose download starts the moment the module\n * declaring it evaluates — not when React first renders it — so it streams in\n * parallel with the chat's first paint instead of after it.\n *\n * WHY (SPEC-310A §1: chat first-paint critical JS ≤ 350 KB, measured by\n * scripts/check-first-paint-budget.mjs). React + react-dom alone are ~220 KB\n * of that; the chat list, the transcript, the composer and the markdown\n * renderer were another ~290 KB in this chunk. The section's frame (its\n * grid, the banners, every mutation and key handler) paints from this chunk;\n * the workspace and the chat list paint a beat later from theirs, over\n * skeletons in their own shape so nothing jumps.\n *\n * Once the module is in, every later mount renders it synchronously (no\n * Suspense flash when you come back to Chat). Which of the two a mount uses\n * is fixed for that mount's life: swapping the lazy wrapper for the loaded\n * component mid-life would remount the subtree and drop its state — the\n * composer's draft, the transcript's scroll.\n */\nexport function preloadedLazy<P extends object>(load: () => Promise<ComponentType<P>>): { Slot: ComponentType<P>; ready: () => Promise<ComponentType<P>> } {\n let loaded: ComponentType<P> | null = null;\n let pending: Promise<ComponentType<P>> | null = null;\n const ready = (): Promise<ComponentType<P>> => {\n // A failed download is not cached: the next mount (or retry) asks again.\n pending ??= load().then((c) => (loaded = c), (err: unknown) => { pending = null; throw err; });\n return pending;\n };\n const Lazy = lazy(() => ready().then((c) => ({ default: c })));\n function Slot(props: P) {\n const [Ready] = useState<ComponentType<P> | null>(() => loaded);\n return Ready ? <Ready {...props} /> : <Lazy {...props} />;\n }\n if (typeof window !== 'undefined') void ready().catch(() => undefined);\n return { Slot, ready };\n}\n\n/**\n * A module (not a component) on the same terms as preloadedLazy: fetched when\n * the declaring module evaluates, read synchronously once in. useLoaded() re-renders\n * its caller once, when it lands; a failed load leaves it null (the values it\n * would have computed stay empty) and is retried on the next mount.\n */\nexport function preloadedModule<M>(load: () => Promise<M>): { ready: () => Promise<M>; useLoaded: () => M | null } {\n let loaded: M | null = null;\n let pending: Promise<M> | null = null;\n const ready = (): Promise<M> => {\n pending ??= load().then((m) => (loaded = m), (err: unknown) => { pending = null; throw err; });\n return pending;\n };\n function useLoaded(): M | null {\n const [mod, setMod] = useState<{ current: M | null }>(() => ({ current: loaded }));\n useEffect(() => {\n if (mod.current) return undefined;\n let live = true;\n ready().then((m) => { if (live) setMod({ current: m }); }, () => undefined);\n return () => { live = false; };\n }, [mod]);\n return mod.current;\n }\n if (typeof window !== 'undefined') void ready().catch(() => undefined);\n return { ready, useLoaded };\n}\n"],"mappings":"2EAgCA,SAAgB,EAAgC,EAA2G,CACzJ,IAAI,EAAkC,KAClC,EAA4C,KAC1C,OAEJ,IAAY,EAAK,CAAC,CAAC,KAAM,GAAO,EAAS,EAAK,GAAiB,CAAkB,KAAhB,GAAU,KAAY,CAAK,CAAC,EACtF,GAEH,GAAA,EAAO,EAAA,KAAA,KAAW,EAAM,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,CAAE,EAAE,CAAC,EAC7D,SAAS,EAAK,EAAU,CACtB,GAAM,CAAC,IAAA,EAAS,EAAA,SAAA,KAAwC,CAAM,EAC9D,OAAO,GAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,GAAI,CAAQ,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,CAAQ,CAAA,CAC1D,CAEA,OADI,OAAO,OAAW,KAAa,EAAW,CAAC,CAAC,UAAY,IAAA,EAAS,EAC9D,CAAE,OAAM,OAAM,CACvB,CAQA,SAAgB,EAAmB,EAAgF,CACjH,IAAI,EAAmB,KACnB,EAA6B,KAC3B,OACJ,IAAY,EAAK,CAAC,CAAC,KAAM,GAAO,EAAS,EAAK,GAAiB,CAAkB,KAAhB,GAAU,KAAY,CAAK,CAAC,EACtF,GAET,SAAS,GAAsB,CAC7B,GAAM,CAAC,EAAK,IAAA,EAAU,EAAA,SAAA,MAAuC,CAAE,QAAS,CAAO,EAAE,EAOjF,OANA,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,EAAI,QAAS,OACjB,IAAI,EAAO,GAEX,OADA,EAAM,CAAC,CAAC,KAAM,GAAM,CAAM,GAAM,EAAO,CAAE,QAAS,CAAE,CAAC,CAAG,MAAS,IAAA,EAAS,MAC7D,CAAE,EAAO,EAAO,CAC/B,EAAG,CAAC,CAAG,CAAC,EACD,EAAI,OACb,CAEA,OADI,OAAO,OAAW,KAAa,EAAW,CAAC,CAAC,UAAY,IAAA,EAAS,EAC9D,CAAE,QAAO,WAAU,CAC5B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./focus-trap-C8MiYlLZ.js";import"./Dialog-BYIKNPcH.js";import"./Epistemic-BPBAmLNh.js";import"./StatusBadge-CJbb9DhR.js";import"./RouteErrorBoundary-Cc9GsjZz.js";import"./RefreshIndicator-CEMRNruu.js";import"./SkipToContent-C7UObcP2.js";import"./VerseConsoleApp-kFOEmnGC.js";import"./Segmented-CtwuFlbY.js";import"./Tag-CMFqY2MP.js";import"./Button-DP2ImS5n.js";import"./EmptyState-BEXDoNZd.js";import"./Meter-dMqKBaVV.js";import"./Sheet-D72WH4mP.js";import"./Switch-BtEo9Cku.js";import"./Slider-Bi5q-21C.js";import"./Select-zXMdgblm.js";import"./Input-BEF-ScuG.js";
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./index-BbDqdepe.js";var t=`${e}sw.js`,n=e,r=`/next/verse-m/`,i=`${r}manifest.webmanifest`,a=`${r}apple-touch-icon.png`,o=Object.freeze({light:`rgb(250 250 250)`,dark:`rgb(11 11 13)`}),s=`width=device-width, initial-scale=1, viewport-fit=cover`;function c(e,t,n,r){let i=e.head.querySelector(t);i||(i=n(),e.head.append(i));for(let[e,t]of Object.entries(r))i.setAttribute(e,t)}function l(e,t,n,r={}){c(e,`meta[name="${t}"]${r.media?`[media="${r.media}"]`:``}`,()=>e.createElement(`meta`),{name:t,content:n,...r})}function u(e,t,n){c(e,`link[rel="${t}"]`,()=>e.createElement(`link`),{rel:t,href:n})}function d(e=document){e.head&&(e.title=`Ashlr Verse`,l(e,`viewport`,s),u(e,`manifest`,i),u(e,`apple-touch-icon`,a),l(e,`apple-mobile-web-app-capable`,`yes`),l(e,`mobile-web-app-capable`,`yes`),l(e,`apple-mobile-web-app-status-bar-style`,`black-translucent`),l(e,`apple-mobile-web-app-title`,`Verse`),l(e,`theme-color`,o.light,{media:`(prefers-color-scheme: light)`}),l(e,`theme-color`,o.dark,{media:`(prefers-color-scheme: dark)`}),l(e,`format-detection`,`telephone=no`))}async function f(e=typeof navigator>`u`?void 0:navigator){let r=e?.serviceWorker;if(!r||typeof r.register!=`function`)return`unsupported`;try{return await r.register(t,{scope:n,type:`classic`,updateViaCache:`none`}),`registered`}catch{return`failed`}}function p(e=window){return e.navigator.standalone===!0||typeof e.matchMedia==`function`&&e.matchMedia(`(display-mode: standalone)`).matches}function m(e=navigator,t=window){return e.standalone===!0&&`serviceWorker`in e&&`PushManager`in t&&`Notification`in t}async function h(e){if(!m())throw Error(`Notifications require Verse installed on an iPhone Home Screen with Web Push support.`);if(Notification.permission===`denied`)throw Error(`Notifications are blocked in this phone’s settings.`);if((Notification.permission===`granted`?`granted`:await Notification.requestPermission())!==`granted`)throw Error(`Notification permission was not granted.`);let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t.padEnd(Math.ceil(t.length/4)*4,`=`)),r=new Uint8Array(n.length);for(let e=0;e<n.length;e+=1)r[e]=n.charCodeAt(e);let i=await navigator.serviceWorker.ready;return await i.pushManager.getSubscription()??i.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:r})}export{h as enableRemotePush,d as installMobileHead,p as isStandalone,f as registerMobileServiceWorker,m as supportsIphoneHomeScreenPush};
|
|
2
|
-
//# sourceMappingURL=pwa-lVT_VRkK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pwa-lVT_VRkK.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/pwa.ts"],"sourcesContent":["/**\n * routes/verse/mobile/pwa.ts — what makes /verse/m installable and launch\n * like an app: the head tags iOS and Android read, and the service worker.\n *\n * WHY THE HEAD IS WRITTEN AT RUNTIME: index.html is shared by every console.\n * A manifest link or `viewport-fit=cover` there would make the desktop Verse,\n * Universe and Resources pages installable, and let the workbench draw under\n * a phone's notch without the safe-area padding only this app has. So the\n * phone app adds them when it mounts — iOS reads them when \"Add to Home\n * Screen\" is tapped, which is always after that.\n *\n * WHY THE WORKER LIVES AT /verse/m/sw.js: a worker controls only paths under\n * its own script's directory (core/web/static.ts maps the path to the built\n * file in next/verse-m/). What it caches is in public/verse-m/sw.js: the app\n * shell and hashed assets — never an /api/ response, so no read data is left\n * on the phone.\n */\nimport { VERSE_MOBILE_PATH } from '../../../app/console-mode.js';\n\nexport const VERSE_MOBILE_SW_URL = `${VERSE_MOBILE_PATH}sw.js`;\nexport const VERSE_MOBILE_SW_SCOPE = VERSE_MOBILE_PATH;\n\n/**\n * Built by Vite from src/web-ui/public/verse-m/ into /next/verse-m/ (the\n * build's base). Literal, like the manifest's own icon paths, so the two can\n * never disagree.\n */\nconst ASSET_BASE = '/next/verse-m/';\nexport const VERSE_MOBILE_MANIFEST_HREF = `${ASSET_BASE}manifest.webmanifest`;\nexport const VERSE_MOBILE_TOUCH_ICON_HREF = `${ASSET_BASE}apple-touch-icon.png`;\n\n/** The canvas colour of each theme (design/tokens.css --bg-canvas), for the status bar. */\nexport const THEME_COLORS = Object.freeze({ light: 'rgb(250 250 250)', dark: 'rgb(11 11 13)' });\n\nconst VIEWPORT = 'width=device-width, initial-scale=1, viewport-fit=cover';\n\nfunction upsert(doc: Document, selector: string, create: () => HTMLElement, attrs: Record<string, string>): void {\n let el = doc.head.querySelector<HTMLElement>(selector);\n if (!el) {\n el = create();\n doc.head.append(el);\n }\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\n}\n\nfunction meta(doc: Document, name: string, content: string, extra: Record<string, string> = {}): void {\n const media = extra.media ? `[media=\"${extra.media}\"]` : '';\n upsert(doc, `meta[name=\"${name}\"]${media}`, () => doc.createElement('meta'), { name, content, ...extra });\n}\n\nfunction link(doc: Document, rel: string, href: string): void {\n upsert(doc, `link[rel=\"${rel}\"]`, () => doc.createElement('link'), { rel, href });\n}\n\n/** Idempotent: safe to call on every mount. */\nexport function installMobileHead(doc: Document = document): void {\n if (!doc.head) return;\n doc.title = 'Ashlr Verse';\n meta(doc, 'viewport', VIEWPORT);\n link(doc, 'manifest', VERSE_MOBILE_MANIFEST_HREF);\n link(doc, 'apple-touch-icon', VERSE_MOBILE_TOUCH_ICON_HREF);\n meta(doc, 'apple-mobile-web-app-capable', 'yes');\n meta(doc, 'mobile-web-app-capable', 'yes');\n // Content runs under the status bar; the shell pads by env(safe-area-inset-top).\n meta(doc, 'apple-mobile-web-app-status-bar-style', 'black-translucent');\n meta(doc, 'apple-mobile-web-app-title', 'Verse');\n meta(doc, 'theme-color', THEME_COLORS.light, { media: '(prefers-color-scheme: light)' });\n meta(doc, 'theme-color', THEME_COLORS.dark, { media: '(prefers-color-scheme: dark)' });\n // Phone numbers and dates in agent output are not links to dial.\n meta(doc, 'format-detection', 'telephone=no');\n}\n\nexport type ServiceWorkerOutcome = 'registered' | 'unsupported' | 'failed';\n\n/**\n * Register the shell cache. Never throws and never blocks the app: a phone\n * with no worker (private mode, an http:// tunnel that is not localhost) is\n * the same app minus the offline screen.\n */\nexport async function registerMobileServiceWorker(\n nav: Pick<Navigator, 'serviceWorker'> | undefined = typeof navigator === 'undefined' ? undefined : navigator,\n): Promise<ServiceWorkerOutcome> {\n const container = nav?.serviceWorker;\n if (!container || typeof container.register !== 'function') return 'unsupported';\n try {\n await container.register(VERSE_MOBILE_SW_URL, { scope: VERSE_MOBILE_SW_SCOPE, type: 'classic', updateViaCache: 'none' });\n return 'registered';\n } catch {\n return 'failed';\n }\n}\n\n/** Whether the app is running from the home screen (no browser chrome). */\nexport function isStandalone(win: Window = window): boolean {\n const iosStandalone = (win.navigator as Navigator & { standalone?: boolean }).standalone === true;\n return iosStandalone || (typeof win.matchMedia === 'function' && win.matchMedia('(display-mode: standalone)').matches);\n}\n\n/** This gateway's push sender accepts Apple Web Push subscriptions only. */\nexport function supportsIphoneHomeScreenPush(\n nav: Navigator = navigator,\n win: Window = window,\n): boolean {\n return (nav as Navigator & { standalone?: boolean }).standalone === true\n && 'serviceWorker' in nav && 'PushManager' in win && 'Notification' in win;\n}\n\n/** Only called from an explicit tap after the paired gateway advertises push. */\nexport async function enableRemotePush(publicKey: string): Promise<PushSubscription> {\n if (!supportsIphoneHomeScreenPush()) {\n throw new Error('Notifications require Verse installed on an iPhone Home Screen with Web Push support.');\n }\n if (Notification.permission === 'denied') throw new Error('Notifications are blocked in this phone’s settings.');\n const permission = Notification.permission === 'granted' ? 'granted' : await Notification.requestPermission();\n if (permission !== 'granted') throw new Error('Notification permission was not granted.');\n const normalized = publicKey.replace(/-/g, '+').replace(/_/g, '/');\n const decoded = atob(normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '='));\n const key = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i += 1) key[i] = decoded.charCodeAt(i);\n const registration = await navigator.serviceWorker.ready;\n const existing = await registration.pushManager.getSubscription();\n return existing ?? registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./global-BWc2NPzv.js";var t={key:`dashboard-snapshot`,fetch:t=>e(`/api/snapshot`,t)},n={key:`control-snapshot`,fetch:t=>e(`/api/control`,t)},r={key:`agent-os-snapshot`,fetch:t=>e(`/api/agent-os`,t)},i={key:`universe-overview`,fetch:t=>e(`/api/universe`,t)};function a(t){return{key:`universe-graph-${t}`,fetch:n=>e(`/api/universe/graph?universeId=${encodeURIComponent(t)}`,n)}}var o={key:`runs`,fetch:t=>e(`/api/runs`,t)};function s(t){return{key:`run-detail-${t}`,fetch:n=>e(`/api/run/${encodeURIComponent(t)}`,n)}}var c={key:`swarms`,fetch:t=>e(`/api/swarms`,t)};function l(t){return{key:`swarm-detail-${t}`,fetch:n=>e(`/api/swarm/${encodeURIComponent(t)}`,n)}}var u={key:`daemon`,fetch:t=>e(`/api/daemon-observation`,t)},d={key:`fleet`,fetch:t=>e(`/api/fleet`,t)},f={key:`fleet-activity`,fetch:t=>e(`/api/fleet-activity`,t)},p={key:`goals`,fetch:t=>e(`/api/goals`,t)},m={key:`vision-mission`,fetch:t=>e(`/api/vision/mission`,t)},h={key:`inbox`,fetch:t=>e(`/api/inbox`,t)};function g(t={}){let n=new URLSearchParams;t.status!==void 0&&n.set(`status`,t.status),t.since!==void 0&&n.set(`since`,t.since),t.limit!==void 0&&n.set(`limit`,String(t.limit));let r=n.toString();return{key:`inbox-list:${t.status??`pending`}:${t.since??``}:${t.limit??``}`,fetch:t=>e(`/api/inbox${r?`?${r}`:``}`,t)}}function _(t){return{key:`proposal-detail-${t}`,fetch:n=>e(`/api/inbox/${encodeURIComponent(t)}`,n)}}var v={key:`control-logs-observation`,fetch:t=>e(`/api/logs-observation?tail=200`,t)};function y(t){return{key:`pulse-${t}`,fetch:n=>e(`/api/pulse?window=${t}`,n)}}function b(e){return typeof e==`object`&&!!e&&`entry`in e&&`score`in e}function x(t){let n=t.trim();return{key:n?`genome-search-${n}`:`genome-list`,fetch:t=>e(n?`/api/genome?q=${encodeURIComponent(n)}`:`/api/genome`,t)}}function S(t){return{key:`models-${t}`,fetch:n=>e(`/api/models?window=${t}`,n)}}var C={key:`portfolio`,fetch:t=>e(`/api/portfolio`,t)};export{m as C,i as S,s as _,t as a,c as b,x as c,h as d,b as f,y as g,_ as h,u as i,p as l,C as m,v as n,f as o,S as p,n as r,d as s,r as t,g as u,o as v,a as x,l as y};
|
|
2
|
-
//# sourceMappingURL=queries-T7ZUVqyA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queries-T7ZUVqyA.js","names":[],"sources":["../../../../../../src/web-ui/data/queries.ts"],"sourcesContent":["/**\n * data/queries.ts — one typed accessor per backend resource. Each pairs a\n * stable cache key (also the SSE invalidation target — see sse.ts's\n * EVENT_TO_CACHE_KEYS) with the exact GET call and response type. Views\n * never call apiGet directly; they call these through useQuery (hooks.ts)\n * so caching, de-dupe, and SSE-driven refresh are automatic.\n */\nimport { apiGet } from './client.js';\nimport type { UniverseGraph } from '../../core/universe/graph-types.js';\nimport type {\n AgentOsSnapshotResponse,\n UniverseOverview,\n ControlLogEntry,\n ControlSnapshot,\n DashboardSnapshot,\n DecisionEntry,\n FleetActivitySnapshot,\n FleetStatus,\n Proposal,\n ProposalStatus,\n PublicDaemonObservation,\n RunState,\n SwarmRun,\n ActivityRollup,\n GenomeEntry,\n RecallHit,\n PortfolioSummary,\n ModelStatsReadResult,\n} from './api-types.js';\nimport type { SourceQuality } from './api-types.js';\n\nexport interface QueryDef<T> {\n key: string;\n fetch: (signal?: AbortSignal) => Promise<T>;\n}\n\nexport const dashboardSnapshotQuery: QueryDef<DashboardSnapshot> = {\n key: 'dashboard-snapshot',\n fetch: (signal) => apiGet<DashboardSnapshot>('/api/snapshot', signal),\n};\n\nexport const controlSnapshotQuery: QueryDef<ControlSnapshot> = {\n key: 'control-snapshot',\n fetch: (signal) => apiGet<ControlSnapshot>('/api/control', signal),\n};\n\nexport const agentOsSnapshotQuery: QueryDef<AgentOsSnapshotResponse> = {\n key: 'agent-os-snapshot',\n fetch: (signal) => apiGet<AgentOsSnapshotResponse>('/api/agent-os', signal),\n};\n\nexport const universeOverviewQuery: QueryDef<UniverseOverview> = {\n key: 'universe-overview',\n fetch: (signal) => apiGet<UniverseOverview>('/api/universe', signal),\n};\n\n/** Read only on demand; never invalidate this alongside the overview poll. */\nexport function universeGraphQuery(universeId: string): QueryDef<UniverseGraph> {\n return {\n key: `universe-graph-${universeId}`,\n fetch: (signal) => apiGet<UniverseGraph>(`/api/universe/graph?universeId=${encodeURIComponent(universeId)}`, signal),\n };\n}\n\n// NOTE: there is no standalone GET /api/visibility route — VisibilitySnapshot\n// is an optional field on DashboardSnapshot (`.visibility`), populated by\n// buildSnapshot() server-side. Read it off dashboardSnapshotQuery's data\n// rather than issuing a second request for it.\n\n/**\n * GET /api/runs returns the bare array (see src/core/web/api.ts:1121-1125,\n * `listRuns({limit:200})` -> `RunState[]`) — NOT `{runs: [...]}`. The prior\n * `RunSummary`/`runsQuery` pair here was speculative and didn't match the\n * real response shape; it was unused (FleetDashboardView reads its compact\n * run summaries off `DashboardSnapshot['runs']` instead, a different,\n * deliberately-thin shape). Replaced with the real, fully-typed contract.\n */\nexport const runsQuery: QueryDef<RunState[]> = {\n key: 'runs',\n fetch: (signal) => apiGet<RunState[]>('/api/runs', signal),\n};\n\nexport function runDetailQuery(id: string): QueryDef<RunState> {\n return {\n key: `run-detail-${id}`,\n fetch: (signal) => apiGet<RunState>(`/api/run/${encodeURIComponent(id)}`, signal),\n };\n}\n\nexport const swarmsQuery: QueryDef<SwarmRun[]> = {\n key: 'swarms',\n fetch: (signal) => apiGet<SwarmRun[]>('/api/swarms', signal),\n};\n\nexport function swarmDetailQuery(id: string): QueryDef<SwarmRun> {\n return {\n key: `swarm-detail-${id}`,\n fetch: (signal) => apiGet<SwarmRun>(`/api/swarm/${encodeURIComponent(id)}`, signal),\n };\n}\n\n/**\n * Same PublicDaemonObservation the backend embeds at ControlSnapshot.daemonObservation\n * — fetched standalone here because /control/daemon renders a fuller detail page\n * than DaemonPanel's dashboard-compact view and wants the raw observation\n * (including `ticks`) independent of whether the rest of /api/control succeeds.\n * Cache key 'daemon' deliberately matches sse.ts's existing (previously orphaned)\n * `daemon` / `daemon-observation` -> ['daemon'] mapping so this now actually\n * live-updates.\n */\nexport const daemonObservationQuery: QueryDef<PublicDaemonObservation> = {\n key: 'daemon',\n fetch: (signal) => apiGet<PublicDaemonObservation>('/api/daemon-observation', signal),\n};\n\nexport const fleetStatusQuery: QueryDef<FleetStatus> = {\n key: 'fleet',\n fetch: (signal) => apiGet<FleetStatus>('/api/fleet', signal),\n};\n\nexport const fleetActivityQuery: QueryDef<FleetActivitySnapshot> = {\n key: 'fleet-activity',\n fetch: (signal) => apiGet<FleetActivitySnapshot>('/api/fleet-activity', signal),\n};\n\n/**\n * GET /api/goals returns a bare array of ad-hoc per-goal projections built\n * inline in src/core/web/api.ts (`path === '/api/goals'`, ~line 1654) — there\n * is no exported backend type for this shape (unlike every other resource\n * here), so this interface is hand-written to match that handler exactly\n * rather than re-exported. Keep it in sync with api.ts if that handler's\n * shape changes.\n */\nexport interface GoalMilestoneSummary {\n title: string;\n status: string;\n order: number;\n}\n\nexport interface GoalSummary {\n id: string;\n objective: string;\n status: string;\n milestones: GoalMilestoneSummary[];\n progress: {\n fractionDone: number;\n counts: Record<string, number>;\n nextActionableId: string | null;\n };\n}\n\nexport const goalsQuery: QueryDef<GoalSummary[]> = {\n key: 'goals',\n fetch: (signal) => apiGet<GoalSummary[]>('/api/goals', signal),\n};\n\n/**\n * GET /api/vision/mission — buildVisionMissionSnapshot() in src/core/web/api.ts\n * is itself typed `Promise<Record<string, unknown>>` on the backend (no\n * exported interface to import), so this is a narrow hand-written contract\n * covering only the fields the Goals view actually reads: top-level `state`\n * (mirrors the SourceQuality.sourceState vocabulary) and the per-source\n * epistemic breakdown under `sources`. `briefing`/`preview`/`shadow` are\n * deliberately left as `unknown` — the view does not render briefing prose.\n */\nexport interface VisionMissionSourceStatus {\n sourceState: 'healthy' | 'degraded' | 'missing' | 'unknown';\n sourcePresent?: boolean;\n complete: boolean;\n reason?: string;\n}\n\nexport interface VisionMissionSnapshot {\n schemaVersion: number;\n state: string;\n authority: string;\n briefing: unknown;\n sources: {\n briefing: VisionMissionSourceStatus | null;\n goals: VisionMissionSourceStatus | null;\n enrollment: VisionMissionSourceStatus | null;\n proposals: VisionMissionSourceStatus | null;\n };\n}\n\nexport const visionMissionQuery: QueryDef<VisionMissionSnapshot> = {\n key: 'vision-mission',\n fetch: (signal) => apiGet<VisionMissionSnapshot>('/api/vision/mission', signal),\n};\n\nexport interface InboxProposal {\n id: string;\n title: string;\n kind: string;\n repo: string;\n origin: string;\n createdAt: string;\n}\n\nexport const inboxQuery: QueryDef<{ pending: number; proposals: InboxProposal[] }> = {\n key: 'inbox',\n fetch: (signal) => apiGet('/api/inbox', signal),\n};\n\n/**\n * `?status=&since=&limit=` view over GET /api/inbox (src/core/web/api.ts\n * INBOX_STATUS_QUERY_VALUES) — the history surface `inboxQuery` above never\n * had: it's hardcoded pending-only. `status: undefined` = server default\n * (pending); `'all'` = every status. Keyed per filter combo so switching\n * status/since/limit doesn't fight over one cache entry, and so sse.ts can\n * sweep every live combo (`invalidatePrefix('inbox-list:')`) on the 'inbox'\n * SSE event without knowing which combos are mounted.\n */\nexport type InboxHistoryStatus = ProposalStatus | 'all';\n\nexport interface InboxListFilters {\n status?: InboxHistoryStatus;\n /** ISO timestamp or YYYY-MM-DD, passed straight through to the server. */\n since?: string;\n limit?: number;\n}\n\nexport interface InboxListResponse {\n pending: number;\n total: number;\n /**\n * Full `Proposal[]`, not the narrow `InboxProposal` shape above — the\n * server has always sent full sanitized Proposal records here\n * (`listProposals()`); `InboxProposal` just under-typed it for the\n * original pending-badge use case. The history view needs `status` and\n * `decisionReason` per row (triage: \"why was this rejected\") without an\n * N+1 decisions-ledger read per row, and both live directly on Proposal.\n */\n proposals: Proposal[];\n /** True when more rows matched than were returned (hit the server cap). */\n truncated: boolean;\n filters: { status: InboxHistoryStatus; since: string | null; limit: number | null };\n}\n\nexport function inboxListQuery(filters: InboxListFilters = {}): QueryDef<InboxListResponse> {\n const params = new URLSearchParams();\n if (filters.status !== undefined) params.set('status', filters.status);\n if (filters.since !== undefined) params.set('since', filters.since);\n if (filters.limit !== undefined) params.set('limit', String(filters.limit));\n const qs = params.toString();\n return {\n key: `inbox-list:${filters.status ?? 'pending'}:${filters.since ?? ''}:${filters.limit ?? ''}`,\n fetch: (signal) => apiGet<InboxListResponse>(`/api/inbox${qs ? `?${qs}` : ''}`, signal),\n };\n}\n\n/**\n * Evidence behind a judge's verdict for one proposal — joined server-side\n * (src/core/web/api.ts GET /api/inbox/:id) from the decisions ledger, which\n * is the ONLY place `judgeReasonCode` lives (Proposal itself never carries\n * it). `judge-parse-failure`/`judge-network-failure` are infra failures,\n * never a considered `judge-review` — render them distinctly, never folded\n * together. When the ledger read is degraded or no row matches this\n * proposal, `sourceQuality` says so; render \"unknown\" via <Epistemic/>\n * rather than treating an empty `decisions` array as \"never judged\".\n */\nexport interface InboxDecisionEvidence {\n sourceQuality: SourceQuality;\n decisions: DecisionEntry[];\n}\n\n/**\n * GET /api/inbox/:id — full proposal detail including diff/taste/verdict\n * (src/core/web/api.ts:1240-1255, `loadProposal(id)`) plus `decisionEvidence`\n * (readDecisionsDetailed({proposalId}), added alongside the inbox history\n * view). Used by the work journal's \"why did it do that\" drill-in (M416) —\n * `/api/inbox` only ever returns pending proposals, but a decided\n * proposal's id (surfaced via fleet-activity's recentMerges/recentActions,\n * or via inboxListQuery's history view) still resolves here as long as its\n * on-disk record hasn't been pruned.\n */\nexport function proposalDetailQuery(id: string): QueryDef<Proposal & { decisionEvidence: InboxDecisionEvidence }> {\n return {\n key: `proposal-detail-${id}`,\n fetch: (signal) =>\n apiGet<Proposal & { decisionEvidence: InboxDecisionEvidence }>(`/api/inbox/${encodeURIComponent(id)}`, signal),\n };\n}\n\n/**\n * GET /api/logs-observation?tail=200 — the provenance-bearing sibling of\n * GET /api/logs (src/core/web/api.ts:~1543-1560): same daemon tick/merge\n * log, plus `sourceQuality` so a degraded/incomplete log can be rendered\n * honestly via <Epistemic/> instead of silently showing a truncated or\n * stale list as complete. `entries` is `null` when the source itself is not\n * healthy+complete (server-side contract, not a client guess). Used by the\n * work journal (M416) as one of several merged history sources — NOT a\n * substitute for full on-disk history: this is capped at 200 entries\n * server-side and only carries daemon tick/merge/info/dispatch events, not\n * raw run stdout or the ~672 historical proposals living only on disk.\n */\nexport interface ControlLogsObservation {\n entries: ControlLogEntry[] | null;\n sourceQuality: SourceQuality;\n}\n\nexport const controlLogsObservationQuery: QueryDef<ControlLogsObservation> = {\n key: 'control-logs-observation',\n fetch: (signal) => apiGet<ControlLogsObservation>('/api/logs-observation?tail=200', signal),\n};\n\n// ---------------------------------------------------------------------------\n// Intelligence + Portfolio (charts/dataviz work)\n// ---------------------------------------------------------------------------\n\nexport type PulseWindow = '1d' | '7d' | '30d';\n\n/** GET /api/pulse?window= — buildRollup() (src/core/observability/rollup.ts).\n * Parameterized like runDetailQuery/swarmDetailQuery above: a distinct cache\n * key per window so switching windows doesn't fight over one cache entry. */\nexport function pulseQuery(window: PulseWindow): QueryDef<ActivityRollup> {\n return {\n key: `pulse-${window}`,\n fetch: (signal) => apiGet<ActivityRollup>(`/api/pulse?window=${window}`, signal),\n };\n}\n\n/**\n * GET /api/genome[?q=] — src/core/web/api.ts:1189-1201. Two response shapes\n * depending on `q`: empty/absent `q` returns `GenomeEntry[]` (list mode,\n * `loadGenome()`); a non-empty `q` returns `RecallHit[]` (query mode,\n * `recall()`, `{entry, score, method}`). Use `isRecallHit` to discriminate —\n * the view can't know which shape it got from the type alone since both are\n * arrays. Keyed per query string so a debounced search doesn't stomp the\n * browse-mode cache entry.\n */\nexport type GenomeResult = GenomeEntry[] | RecallHit[];\n\nexport function isRecallHit(item: GenomeEntry | RecallHit): item is RecallHit {\n return typeof item === 'object' && item !== null && 'entry' in item && 'score' in item;\n}\n\nexport function genomeQuery(q: string): QueryDef<GenomeResult> {\n const trimmed = q.trim();\n return {\n key: trimmed ? `genome-search-${trimmed}` : 'genome-list',\n fetch: (signal) =>\n apiGet<GenomeResult>(trimmed ? `/api/genome?q=${encodeURIComponent(trimmed)}` : '/api/genome', signal),\n };\n}\n\nexport type ModelStatsWindow = '7d' | '30d' | 'all';\n\n/** GET /api/models?window= — computeModelStatsDetailed() joined per-model\n * economics (src/core/fleet/model-stats.ts). NOTE: a second, dead\n * `/api/models` handler later in api.ts's if-chain (local-model provider\n * probe off ControlSnapshot.models) is unreachable — this one always wins\n * since route matching is first-match. */\nexport function modelsQuery(window: ModelStatsWindow): QueryDef<ModelStatsReadResult & { window: ModelStatsWindow }> {\n return {\n key: `models-${window}`,\n fetch: (signal) => apiGet(`/api/models?window=${window}`, signal),\n };\n}\n\n/**\n * GET /api/portfolio — src/core/web/api.ts:1105-1109. Returns\n * `DashboardSnapshot.portfolio ?? null`: `null` on an older producer or\n * empty enrollment, not an error — render that as an honest \"not available\"\n * state, never as a zeroed chart.\n */\nexport const portfolioQuery: QueryDef<PortfolioSummary | null> = {\n key: 'portfolio',\n fetch: (signal) => apiGet<PortfolioSummary | null>('/api/portfolio', signal),\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{s as e,u as t}from"./index-BbDqdepe.js";var n=t(e(),1),r=[`collapsed`,`expanded`,`hidden`],i={collapsed:`Collapsed`,expanded:`Expanded`,hidden:`Hidden`},a=`ashlr.verse.reasoning.v1`,o=`collapsed`;function s(e){return typeof e==`string`&&r.includes(e)}function c(){try{let e=localStorage.getItem(a);return s(e)?e:o}catch{return o}}var l=null,u=new Set;function d(){return l===null&&(l=c()),l}function f(e){if(s(e)&&e!==d()){l=e;try{localStorage.setItem(a,e)}catch{}for(let e of[...u])e()}}function p(e){return u.add(e),()=>u.delete(e)}function m(){return(0,n.useSyncExternalStore)(p,d,d)}export{m as i,i as n,f as r,r as t};
|
|
2
|
-
//# sourceMappingURL=reasoning-pref-CWEri5xB.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning-pref-CWEri5xB.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/reasoning-pref.ts"],"sourcesContent":["/**\n * routes/verse/chat/reasoning-pref.ts — how the transcript shows the model's\n * reasoning (SPEC-310C §2 \"Settings offers Expanded, Collapsed or Hidden\";\n * unit C2 owns the behaviour, C1's Settings ▸ Chat panel renders the control).\n *\n * collapsed (default) a block streams in a three-line window while the\n * model thinks, then folds to \"Thought 12s · ~1.8k tok ▸\";\n * expanded the same stream, but a finished block stays open;\n * hidden no reasoning in the transcript at all — the live status line\n * still says \"Thinking · 12s\", so a long think is never mistaken\n * for a hang.\n *\n * A per-device preference, so it lives in this browser's storage under its\n * own key (the precedent of resources-collapse / chat-panel-sizing: display\n * preferences that are not part of the shell's v3 blob). Framework-free store\n * + one hook; every read and write is try/catch'd because storage can be\n * absent (private window, blocked site data).\n */\nimport { useSyncExternalStore } from 'react';\n\nexport const REASONING_DISPLAYS = ['collapsed', 'expanded', 'hidden'] as const;\nexport type ReasoningDisplay = (typeof REASONING_DISPLAYS)[number];\n\nexport const REASONING_DISPLAY_LABEL: Readonly<Record<ReasoningDisplay, string>> = {\n collapsed: 'Collapsed',\n expanded: 'Expanded',\n hidden: 'Hidden',\n};\n\nexport const REASONING_DISPLAY_KEY = 'ashlr.verse.reasoning.v1';\nexport const DEFAULT_REASONING_DISPLAY: ReasoningDisplay = 'collapsed';\n\nexport function isReasoningDisplay(value: unknown): value is ReasoningDisplay {\n return typeof value === 'string' && (REASONING_DISPLAYS as readonly string[]).includes(value);\n}\n\nfunction read(): ReasoningDisplay {\n try {\n const raw = localStorage.getItem(REASONING_DISPLAY_KEY);\n return isReasoningDisplay(raw) ? raw : DEFAULT_REASONING_DISPLAY;\n } catch {\n return DEFAULT_REASONING_DISPLAY;\n }\n}\n\nlet current: ReasoningDisplay | null = null;\nconst listeners = new Set<() => void>();\n\nexport function getReasoningDisplay(): ReasoningDisplay {\n if (current === null) current = read();\n return current;\n}\n\nexport function setReasoningDisplay(next: ReasoningDisplay): void {\n if (!isReasoningDisplay(next) || next === getReasoningDisplay()) return;\n current = next;\n try {\n localStorage.setItem(REASONING_DISPLAY_KEY, next);\n } catch {\n /* the choice still holds for this page */\n }\n for (const listener of [...listeners]) listener();\n}\n\nexport function subscribeReasoningDisplay(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Test seam: forget the in-memory value so the next read re-reads storage. */\nexport function resetReasoningDisplay(): void {\n current = null;\n for (const listener of [...listeners]) listener();\n}\n\nexport function useReasoningDisplay(): ReasoningDisplay {\n return useSyncExternalStore(subscribeReasoningDisplay, getReasoningDisplay, getReasoningDisplay);\n}\n"],"mappings":"8DAoBa,EAAqB,CAAC,YAAa,WAAY,QAAQ,EAGvD,EAAsE,CACjF,UAAW,YACX,SAAU,WACV,OAAQ,QACV,EAEa,EAAwB,2BACxB,EAA8C,YAE3D,SAAgB,EAAmB,EAA2C,CAC5E,OAAO,OAAO,GAAU,UAAa,EAAyC,SAAS,CAAK,CAC9F,CAEA,SAAS,GAAyB,CAChC,GAAI,CACF,IAAM,EAAM,aAAa,QAAQ,CAAqB,EACtD,OAAO,EAAmB,CAAG,EAAI,EAAM,CACzC,MAAQ,CACN,OAAO,CACT,CACF,CAEA,IAAI,EAAmC,KACjC,EAAY,IAAI,IAEtB,SAAgB,GAAwC,CAEtD,OADI,IAAY,OAAM,EAAU,EAAK,GAC9B,CACT,CAEA,SAAgB,EAAoB,EAA8B,CAC5D,GAAC,EAAmB,CAAI,GAAK,IAAS,EAAoB,EAC9D,GAAU,EACV,GAAI,CACF,aAAa,QAAQ,EAAuB,CAAI,CAClD,MAAQ,CAER,CACA,IAAK,IAAM,IAAY,CAAC,GAAG,CAAS,EAAG,EAAS,CANtC,CAOZ,CAEA,SAAgB,EAA0B,EAAkC,CAE1E,OADA,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC,CAQA,SAAgB,GAAwC,CACtD,OAAA,EAAO,EAAA,qBAAA,CAAqB,EAA2B,EAAqB,CAAmB,CACjG"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/global-1SED_aTT.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{t as e}from"./index-BbDqdepe.js";import{t}from"./global-BWc2NPzv.js";var n=class extends Error{status;constructor(e,t=null){super(e),this.status=t,this.name=`RemoteClientError`}},r=null;function i(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function a(e){if(!i(e)||typeof e.authenticated!=`boolean`||typeof e.csrfToken!=`string`||e.csrfToken.length<16||e.csrfToken.length>256||!i(e.capabilities)||e.capabilities.writes!==!0&&e.capabilities.writes!==!1)throw new n(`The phone session answer was incomplete. Nothing was sent.`);if(!e.authenticated)return{authenticated:!1,csrfToken:e.csrfToken,capabilities:{writes:!1,pairing:e.capabilities.pairing===!0,push:e.capabilities.push===!0}};let t=e.scopes;if(typeof e.deviceId!=`string`||!e.deviceId||typeof e.label!=`string`||!i(t)||t.read!==!0||typeof t.act!=`boolean`||typeof e.expiresAt!=`number`||!Number.isFinite(e.expiresAt)||e.expiresAt<=Date.now())throw new n(`The paired device session could not be verified. Nothing was sent.`);return{authenticated:!0,csrfToken:e.csrfToken,capabilities:{writes:e.capabilities.writes===!0,pairing:e.capabilities.pairing===!0,push:e.capabilities.push===!0},deviceId:e.deviceId,label:e.label,scopes:{read:!0,act:t.act},expiresAt:e.expiresAt}}async function o(t){if(t.type===`opaqueredirect`||t.status>=300&&t.status<400||t.headers.get(`content-type`)?.includes(`text/html`))throw r=null,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-BWc2NPzv.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired(),new n(`Cloudflare Access sign-in expired. Reload this page to sign in again.`,401);if(t.status===401)throw r=null,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-BWc2NPzv.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired(),new n(`Phone sign-in expired. Reload to sign in again.`,401);let a;try{a=await t.json()}catch{throw new n(`The phone gateway did not return JSON.`,t.status)}if(!t.ok)throw new n(i(a)&&typeof a.error==`string`?a.error.slice(0,240):`The phone gateway refused the request.`,t.status);return a}async function s(e){return o(await fetch(e,{method:`GET`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`}))}async function c(n,i){let a=await fetch(n,{method:`GET`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`,signal:i});if(a.type===`opaqueredirect`||a.status>=300&&a.status<400||a.headers.get(`content-type`)?.includes(`text/html`))throw r=null,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-BWc2NPzv.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired(),new t(`Cloudflare Access sign-in expired. Reload to sign in again.`,401,n);if(a.status===401)throw(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-BWc2NPzv.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired(),new t(`Phone session expired.`,401,n);if(!a.ok){let e=null,r=null;try{let t=await a.json();typeof t.error==`string`&&(e=t.error),typeof t.code==`string`&&(r=t.code)}catch{}throw new t(`GET ${n} failed (HTTP ${a.status}).`,a.status,n,e,r)}return await a.json()}async function l(e,t){let i=r?.csrfToken;if(!i)throw new n(`Connect this phone to the gateway before continuing.`);let a=await fetch(e,{method:`POST`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`,headers:{"Content-Type":`application/json`,"x-ashlr-remote-csrf":i},body:JSON.stringify(t??{})});return a.status===204?null:o(a)}async function u(e){let t=r?.csrfToken;if(!t)throw new n(`Connect this phone to the gateway before continuing.`);let i=await fetch(e,{method:`DELETE`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`,headers:{"x-ashlr-remote-csrf":t}});if(i.status!==204)throw new n(`The Mac could not remove this phone’s push subscription.`,i.status)}async function d(){r=null;let e=a(await s(`/remote/session`));return r=e,e}function f(){return r?.authenticated===!0&&r.scopes?.act===!0&&r.capabilities.writes&&typeof r.expiresAt==`number`&&Date.now()+5e3<r.expiresAt}function p(){return r}function m(e){if(!i(e)||typeof e.challengeId!=`string`||!e.challengeId||!i(e.options)||typeof e.options.challenge!=`string`)throw new n(`The passkey challenge was incomplete. Nothing was sent.`);return{challengeId:e.challengeId,options:e.options}}async function h(t,r){let a=await l(`/remote/pair/claim`,{code:t.trim(),label:r.trim()});if(!i(a)||typeof a.pendingId!=`string`||!a.pendingId||!i(a.options)||typeof a.options.challenge!=`string`)throw new n(`The pairing challenge was incomplete. Nothing was sent.`);let{startRegistration:o}=await e(async()=>{let{startRegistration:e}=await import(`./esm-BFCrCNMJ.js`);return{startRegistration:e}},[]),s=await o({optionsJSON:a.options}),c=await l(`/remote/pair/complete`,{pendingId:a.pendingId,response:s});if(!i(c)||c.pendingApproval!==!0)throw new n(`Pairing still needs approval on your Mac.`);return{pendingId:a.pendingId}}async function g(e){let t=await s(`/remote/pair/status?pendingId=${encodeURIComponent(e)}`);if(!i(t)||t.state!==`pending`&&t.state!==`approved`&&t.state!==`denied`)throw new n(`The pairing status was incomplete.`);if(t.state===`approved`){if(typeof t.deviceId!=`string`||!t.deviceId)throw new n(`The approved device ID was missing.`);return{state:`approved`,deviceId:t.deviceId}}return{state:t.state}}async function _(t){let i=m(await l(`/remote/auth/begin`,{deviceId:t})),{startAuthentication:o}=await e(async()=>{let{startAuthentication:e}=await import(`./esm-BFCrCNMJ.js`);return{startAuthentication:e}},[]),s=await o({optionsJSON:i.options}),c=a(await l(`/remote/auth/finish`,{challengeId:i.challengeId,response:s}));if(!c.authenticated||c.deviceId!==t)throw new n(`The passkey sign-in did not complete.`);return r=c,c}async function v(){try{if(r?.authenticated&&r.capabilities.push)try{await u(`/remote/push/subscribe`)}catch{}await l(`/remote/logout`,{})}finally{r=null}}async function y(e){if(r?.authenticated!==!0||r.capabilities.push!==!0)throw new n(`Phone notifications are not enabled by this gateway.`);await l(`/remote/push/subscribe`,e.toJSON())}async function b(){if(r?.authenticated!==!0||r.capabilities.push!==!0)throw new n(`Phone notifications are not enabled by this gateway.`);let e=await s(`/remote/push/config`);if(!i(e)||typeof e.publicKey!=`string`||!/^[A-Za-z0-9_-]{80,120}$/.test(e.publicKey))throw new n(`The gateway push key is unavailable.`);return e.publicKey}async function x(t,i,a){if(!f())throw new n(r?.authenticated&&typeof r.expiresAt==`number`&&r.expiresAt<=Date.now()+5e3?`The phone session is refreshing. No action was sent.`:`This gateway is read-only. No action was sent.`);if(t===`POST`&&S(i))return await l(i,a);let o={method:t,path:i,body:JSON.stringify(a??{})},s=m(await l(`/remote/step-up/begin`,o)),{startAuthentication:c}=await e(async()=>{let{startAuthentication:e}=await import(`./esm-BFCrCNMJ.js`);return{startAuthentication:e}},[]),u=await c({optionsJSON:s.options});return await l(`/remote/step-up/finish`,{...o,challengeId:s.challengeId,response:u})}function S(e){return e===`/api/verse/activity/seen`||e===`/api/verse/sessions`||e===`/api/verse/leader/thread`||e===`/api/verse/leader/directives`||/^\/api\/verse\/sessions\/[^/?#]+\/turns$/.test(e)||/^\/api\/verse\/queue\/[^/?#]+$/.test(e)||/^\/api\/verse\/leader\/questions\/[^/?#]+\/answer$/.test(e)||/^\/api\/verse\/(cloud|devin)\/tasks\/[^/?#]+\/dismiss$/.test(e)}export{n as RemoteClientError,_ as authenticateRemoteDevice,h as claimRemotePairing,p as currentRemoteSession,v as logoutRemoteDevice,d as probeRemoteSession,c as remoteApiGet,x as remoteMutate,g as remotePairStatus,b as remotePushPublicKey,y as subscribeRemotePush};
|
|
3
|
-
//# sourceMappingURL=remote-session-BPULIfdG.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/data/remote-session.ts"],"sourcesContent":["/** Cookie-bound phone session. No Hub read or mutation token enters this module. */\nimport type {\n PublicKeyCredentialCreationOptionsJSON,\n PublicKeyCredentialRequestOptionsJSON,\n} from '@simplewebauthn/browser';\nimport { ApiError } from './client.js';\n\nexport interface RemoteSession {\n authenticated: boolean;\n csrfToken: string;\n capabilities: { writes: boolean; pairing: boolean; push: boolean };\n deviceId?: string;\n label?: string;\n scopes?: { read: boolean; act: boolean };\n expiresAt?: number;\n}\n\nexport class RemoteClientError extends Error {\n constructor(message: string, readonly status: number | null = null) {\n super(message);\n this.name = 'RemoteClientError';\n }\n}\n\nlet session: RemoteSession | null = null;\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction parseSession(value: unknown): RemoteSession {\n if (!record(value) || typeof value.authenticated !== 'boolean'\n || typeof value.csrfToken !== 'string' || value.csrfToken.length < 16 || value.csrfToken.length > 256\n || !record(value.capabilities) || value.capabilities.writes !== true && value.capabilities.writes !== false) {\n throw new RemoteClientError('The phone session answer was incomplete. Nothing was sent.');\n }\n if (!value.authenticated) return {\n authenticated: false, csrfToken: value.csrfToken,\n capabilities: { writes: false, pairing: value.capabilities.pairing === true, push: value.capabilities.push === true },\n };\n const scopes = value.scopes;\n if (typeof value.deviceId !== 'string' || !value.deviceId || typeof value.label !== 'string'\n || !record(scopes) || scopes.read !== true || typeof scopes.act !== 'boolean'\n || typeof value.expiresAt !== 'number' || !Number.isFinite(value.expiresAt) || value.expiresAt <= Date.now()) {\n throw new RemoteClientError('The paired device session could not be verified. Nothing was sent.');\n }\n return {\n authenticated: true, csrfToken: value.csrfToken,\n capabilities: { writes: value.capabilities.writes === true, pairing: value.capabilities.pairing === true, push: value.capabilities.push === true },\n deviceId: value.deviceId, label: value.label, scopes: { read: true, act: scopes.act }, expiresAt: value.expiresAt,\n };\n}\n\nasync function jsonResponse(res: Response): Promise<unknown> {\n if (res.type === 'opaqueredirect' || res.status >= 300 && res.status < 400\n || res.headers.get('content-type')?.includes('text/html')) {\n session = null;\n (await import('./auth-store.js')).reportSessionExpired();\n throw new RemoteClientError('Cloudflare Access sign-in expired. Reload this page to sign in again.', 401);\n }\n if (res.status === 401) {\n session = null;\n (await import('./auth-store.js')).reportSessionExpired();\n throw new RemoteClientError('Phone sign-in expired. Reload to sign in again.', 401);\n }\n let value: unknown;\n try { value = await res.json(); } catch { throw new RemoteClientError('The phone gateway did not return JSON.', res.status); }\n if (!res.ok) {\n const message = record(value) && typeof value.error === 'string' ? value.error.slice(0, 240) : 'The phone gateway refused the request.';\n throw new RemoteClientError(message, res.status);\n }\n return value;\n}\n\nasync function remoteGet(path: string): Promise<unknown> {\n const res = await fetch(path, { method: 'GET', credentials: 'same-origin', cache: 'no-store', redirect: 'manual' });\n return jsonResponse(res);\n}\n\n/** Remote API reads use only the paired cookie; Access HTML/redirect locks UI. */\nexport async function remoteApiGet<T>(path: string, signal?: AbortSignal): Promise<T> {\n const res = await fetch(path, { method: 'GET', credentials: 'same-origin', cache: 'no-store', redirect: 'manual', signal });\n if (res.type === 'opaqueredirect' || res.status >= 300 && res.status < 400\n || res.headers.get('content-type')?.includes('text/html')) {\n session = null;\n (await import('./auth-store.js')).reportSessionExpired();\n throw new ApiError('Cloudflare Access sign-in expired. Reload to sign in again.', 401, path);\n }\n if (res.status === 401) {\n (await import('./auth-store.js')).reportSessionExpired();\n throw new ApiError('Phone session expired.', 401, path);\n }\n if (!res.ok) {\n let detail: string | null = null;\n let code: string | null = null;\n try {\n const value = await res.json() as { error?: unknown; code?: unknown };\n if (typeof value.error === 'string') detail = value.error;\n if (typeof value.code === 'string') code = value.code;\n } catch { /* a non-JSON refusal */ }\n throw new ApiError(`GET ${path} failed (HTTP ${res.status}).`, res.status, path, detail, code);\n }\n return await res.json() as T;\n}\n\nasync function remotePost(path: string, body: unknown): Promise<unknown> {\n const csrf = session?.csrfToken;\n if (!csrf) throw new RemoteClientError('Connect this phone to the gateway before continuing.');\n const res = await fetch(path, {\n method: 'POST', credentials: 'same-origin', cache: 'no-store', redirect: 'manual',\n headers: { 'Content-Type': 'application/json', 'x-ashlr-remote-csrf': csrf },\n body: JSON.stringify(body ?? {}),\n });\n if (res.status === 204) return null;\n return jsonResponse(res);\n}\n\nasync function remoteDelete(path: string): Promise<void> {\n const csrf = session?.csrfToken;\n if (!csrf) throw new RemoteClientError('Connect this phone to the gateway before continuing.');\n const res = await fetch(path, {\n method: 'DELETE', credentials: 'same-origin', cache: 'no-store', redirect: 'manual',\n headers: { 'x-ashlr-remote-csrf': csrf },\n });\n if (res.status !== 204) throw new RemoteClientError('The Mac could not remove this phone’s push subscription.', res.status);\n}\n\n/** A fresh cookie and CSRF token come from the gateway, never browser storage. */\nexport async function probeRemoteSession(): Promise<RemoteSession> {\n session = null;\n const next = parseSession(await remoteGet('/remote/session'));\n session = next;\n return next;\n}\n\nexport function canRemoteWrite(): boolean {\n return session?.authenticated === true && session.scopes?.act === true && session.capabilities.writes\n && typeof session.expiresAt === 'number' && Date.now() + 5_000 < session.expiresAt;\n}\n\nexport function currentRemoteSession(): RemoteSession | null { return session; }\n\nexport function clearRemoteSessionForTest(): void { session = null; }\n\nfunction challenge(value: unknown): { challengeId: string; options: PublicKeyCredentialRequestOptionsJSON } {\n if (!record(value) || typeof value.challengeId !== 'string' || !value.challengeId || !record(value.options)\n || typeof value.options.challenge !== 'string') {\n throw new RemoteClientError('The passkey challenge was incomplete. Nothing was sent.');\n }\n return { challengeId: value.challengeId, options: value.options as unknown as PublicKeyCredentialRequestOptionsJSON };\n}\n\nexport async function claimRemotePairing(code: string, label: string): Promise<{ pendingId: string }> {\n const started = await remotePost('/remote/pair/claim', { code: code.trim(), label: label.trim() });\n if (!record(started) || typeof started.pendingId !== 'string' || !started.pendingId || !record(started.options)\n || typeof started.options.challenge !== 'string') {\n throw new RemoteClientError('The pairing challenge was incomplete. Nothing was sent.');\n }\n const { startRegistration } = await import('@simplewebauthn/browser');\n const response = await startRegistration({ optionsJSON: started.options as unknown as PublicKeyCredentialCreationOptionsJSON });\n const completed = await remotePost('/remote/pair/complete', { pendingId: started.pendingId, response });\n if (!record(completed) || completed.pendingApproval !== true) {\n throw new RemoteClientError('Pairing still needs approval on your Mac.');\n }\n return { pendingId: started.pendingId };\n}\n\nexport async function remotePairStatus(pendingId: string): Promise<{ state: 'pending' | 'approved' | 'denied'; deviceId?: string }> {\n const value = await remoteGet(`/remote/pair/status?pendingId=${encodeURIComponent(pendingId)}`);\n if (!record(value) || value.state !== 'pending' && value.state !== 'approved' && value.state !== 'denied') {\n throw new RemoteClientError('The pairing status was incomplete.');\n }\n if (value.state === 'approved') {\n if (typeof value.deviceId !== 'string' || !value.deviceId) throw new RemoteClientError('The approved device ID was missing.');\n return { state: 'approved', deviceId: value.deviceId };\n }\n return { state: value.state };\n}\n\nexport async function authenticateRemoteDevice(deviceId: string): Promise<RemoteSession> {\n const started = challenge(await remotePost('/remote/auth/begin', { deviceId }));\n const { startAuthentication } = await import('@simplewebauthn/browser');\n const response = await startAuthentication({ optionsJSON: started.options });\n const next = parseSession(await remotePost('/remote/auth/finish', { challengeId: started.challengeId, response }));\n if (!next.authenticated || next.deviceId !== deviceId) throw new RemoteClientError('The passkey sign-in did not complete.');\n session = next;\n return next;\n}\n\nexport async function logoutRemoteDevice(): Promise<void> {\n try {\n // Stop this device's generic alerts before dropping the cookie. Failure\n // must not prevent sign-out; Mac-side device revocation is the authority\n // when a lost or offline phone cannot complete either request.\n if (session?.authenticated && session.capabilities.push) {\n try { await remoteDelete('/remote/push/subscribe'); }\n catch { /* continue with logout even if push is unavailable */ }\n }\n await remotePost('/remote/logout', {});\n } finally {\n // The server may be offline, but this page must immediately lose its\n // in-memory session and act capability. The HttpOnly cookie is only\n // cleared by a successful server response or by Mac-side revocation.\n session = null;\n }\n}\n\n/** Push is dormant until the gateway explicitly advertises and mounts it. */\nexport async function subscribeRemotePush(subscription: PushSubscription): Promise<void> {\n if (session?.authenticated !== true || session.capabilities.push !== true) {\n throw new RemoteClientError('Phone notifications are not enabled by this gateway.');\n }\n await remotePost('/remote/push/subscribe', subscription.toJSON());\n}\n\nexport async function remotePushPublicKey(): Promise<string> {\n if (session?.authenticated !== true || session.capabilities.push !== true) {\n throw new RemoteClientError('Phone notifications are not enabled by this gateway.');\n }\n const value = await remoteGet('/remote/push/config');\n if (!record(value) || typeof value.publicKey !== 'string' || !/^[A-Za-z0-9_-]{80,120}$/.test(value.publicKey)) {\n throw new RemoteClientError('The gateway push key is unavailable.');\n }\n return value.publicKey;\n}\n\n/** A server capability enables this later; stage 3 returns writes:false. */\nexport async function remoteMutate<T>(method: 'POST' | 'DELETE', path: string, body: unknown): Promise<T> {\n if (!canRemoteWrite()) throw new RemoteClientError(session?.authenticated && typeof session.expiresAt === 'number'\n && session.expiresAt <= Date.now() + 5_000\n ? 'The phone session is refreshing. No action was sent.'\n : 'This gateway is read-only. No action was sent.');\n if (method === 'POST' && directCsrfWrite(path)) return await remotePost(path, body) as T;\n const bytes = JSON.stringify(body ?? {});\n const operation = { method, path, body: bytes };\n const started = challenge(await remotePost('/remote/step-up/begin', operation));\n const { startAuthentication } = await import('@simplewebauthn/browser');\n const response = await startAuthentication({ optionsJSON: started.options });\n const result = await remotePost('/remote/step-up/finish', { ...operation, challengeId: started.challengeId, response });\n return result as T;\n}\n\n/** Mirrors only gateway routes classified low-risk; unknown paths step up. */\nexport function directCsrfWrite(path: string): boolean {\n return path === '/api/verse/activity/seen'\n || path === '/api/verse/sessions'\n || path === '/api/verse/leader/thread'\n || path === '/api/verse/leader/directives'\n || /^\\/api\\/verse\\/sessions\\/[^/?#]+\\/turns$/.test(path)\n || /^\\/api\\/verse\\/queue\\/[^/?#]+$/.test(path)\n || /^\\/api\\/verse\\/leader\\/questions\\/[^/?#]+\\/answer$/.test(path)\n || /^\\/api\\/verse\\/(cloud|devin)\\/tasks\\/[^/?#]+\\/dismiss$/.test(path);\n}\n"],"file":"remote-session-BPULIfdG.js"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{s as e,u as t}from"./index-BbDqdepe.js";var n=t(e(),1),r=new Map,i=new Set;function a(){for(let e of[...i])e()}function o(e,t=Date.now()){r=new Map(r).set(e,t),a()}function s(e,t=Date.now()){let n=!1,i=new Map(r);for(let[r,a]of i)(!e.has(r)||t-a>6e4)&&(i.delete(r),n=!0);n&&(r=i,a())}function c(){return(0,n.useSyncExternalStore)(e=>(i.add(e),()=>i.delete(e)),()=>r,()=>r)}export{s as n,c as r,o as t};
|
|
2
|
-
//# sourceMappingURL=resolved-store-Ba-W6Uhy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolved-store-Ba-W6Uhy.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/resolved-store.ts"],"sourcesContent":["/**\n * routes/verse/shell/resolved-store.ts — which Needs-you items were just\n * acted on, so every list hides them at once (optimistic) until a poll no\n * longer lists them, or 60 s pass.\n *\n * Split out of needs-you-actions.ts, which re-exports all of it, so a\n * surface that only COUNTS what is waiting (the phone app's tab badge, at\n * first paint) does not download the action runner and the row model.\n */\nimport { useSyncExternalStore } from 'react';\n\n/** How long an acted-on item stays hidden while the server catches up. */\nexport const RESOLVED_HIDE_MS = 60_000;\n\nlet resolved = new Map<string, number>();\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\nexport function markResolved(id: string, at: number = Date.now()): void {\n resolved = new Map(resolved).set(id, at);\n emit();\n}\n\n/** Drop marks the server has caught up with (the id is gone) or that are too old. */\nexport function pruneResolved(liveIds: ReadonlySet<string>, now: number = Date.now()): void {\n let changed = false;\n const next = new Map(resolved);\n for (const [id, at] of next) {\n if (!liveIds.has(id) || now - at > RESOLVED_HIDE_MS) {\n next.delete(id);\n changed = true;\n }\n }\n if (changed) {\n resolved = next;\n emit();\n }\n}\n\nexport function useResolvedIds(): ReadonlyMap<string, number> {\n return useSyncExternalStore(\n (l) => {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n () => resolved,\n () => resolved,\n );\n}\n\nexport function resetResolvedForTest(): void {\n resolved = new Map();\n emit();\n}\n"],"mappings":"8DAcI,EAAW,IAAI,IACb,EAAY,IAAI,IAEtB,SAAS,GAAa,CACpB,IAAK,IAAM,IAAK,CAAC,GAAG,CAAS,EAAG,EAAE,CACpC,CAEA,SAAgB,EAAa,EAAY,EAAa,KAAK,IAAI,EAAS,CACtE,EAAW,IAAI,IAAI,CAAQ,CAAC,CAAC,IAAI,EAAI,CAAE,EACvC,EAAK,CACP,CAGA,SAAgB,EAAc,EAA8B,EAAc,KAAK,IAAI,EAAS,CAC1F,IAAI,EAAU,GACR,EAAO,IAAI,IAAI,CAAQ,EAC7B,IAAK,GAAM,CAAC,EAAI,KAAO,GACjB,CAAC,EAAQ,IAAI,CAAE,GAAK,EAAM,EAAA,OAC5B,EAAK,OAAO,CAAE,EACd,EAAU,IAGV,IACF,EAAW,EACX,EAAK,EAET,CAEA,SAAgB,GAA8C,CAC5D,OAAA,EAAO,EAAA,qBAAA,CACJ,IACC,EAAU,IAAI,CAAC,MACF,EAAU,OAAO,CAAC,OAE3B,MACA,CACR,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,t}from"./global-BWc2NPzv.js";import{H as n,R as r,V as i,s as a}from"./verse-model-CkF3q2IH.js";import{n as o,t as s}from"./capacity-strip-model-pdIEweaZ.js";import{l as c,t as l}from"./types-IYKrYLku.js";import{o as u}from"./local-model-C9xNi9fN.js";var d=`/api/verse/budget/readiness`,f=new Set([`spent`,`signed-out`,`unavailable`]),p=[[`usable`,`usable`],[`low`,`running low`],[`spent`,`spent`],[`signed-out`,`signed out`],[`unavailable`,`unavailable`]];function m(e,t){let n=e.filter(e=>e.kind===`subscription`).map(e=>s(e,{healthRead:t.healthRead,...t.now===void 0?{}:{now:t.now}}).kind),r=new Map;for(let e of n)r.set(e,(r.get(e)??0)+1);let i=p.filter(([e])=>r.has(e)).map(([e,t])=>`${r.get(e)} ${t}`).join(` · `),a=`unknown`;return n.some(e=>f.has(e))?a=`alert`:n.includes(`low`)?a=`tight`:n.includes(`usable`)&&(a=`ok`),{tone:a,spoken:i||(n.length===0?`no accounts connected`:`not read yet`)}}function h(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function g(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function _(e){return typeof e==`string`&&e.trim().length>0?e.trim():null}var v=`An estimate from the sessions Verse launched — the real balance is on claude.ai.`;function y(e){let t=h(e),n=h(t?.budget);if(!t||!n)return null;let r=g(n.creditsTotalUsd),i=g(n.estimatedSpentUsd),a=g(n.estimatedRemainingUsd);if(r===null||i===null&&a===null)return null;let o=Math.max(0,a??r-(i??0)),s=h(t.seat),c=h(n.canLaunch),u=_(n.balanceUrl),d=h(n.budget);return{totalUsd:r,spentUsd:i??Math.max(0,r-o),remainingUsd:o,remainingPercent:r>0?Math.max(0,Math.min(100,o/r*100)):0,running:Math.max(0,g(n.running)??0),sessionsToday:Math.max(0,g(n.sessionsToday)??0),maxSessionsPerDay:g(d?.maxSessionsPerDay),seatReady:s?.ready!==!1,seatReason:_(s?.reason),canLaunch:c?.ok!==!1,canLaunchReason:_(c?.reason),estimateNote:_(n.estimateNote)??v,balanceUrl:u!==null&&u.startsWith(`https://claude.ai/`)?u:l}}function b(e){let t=Math.max(0,e);return t>=100||Number.isInteger(t)?`$${Math.round(t)}`:`$${t.toFixed(2)}`}var x={"llama-server":`llama-server`,ollama:`Ollama`,vllm:`vLLM`,unknown:`Serving runtime`},S={running:`Running`,starting:`Starting…`,stopping:`Stopping…`,stopped:`Stopped`,unknown:`State not reported`};function C(e){if(!e)return null;let t=[];e.model&&t.push(u(e.model)),e.contextTokens!==null&&t.push(`${a(e.contextTokens)} context per agent`),e.slotsTotal!==null&&e.slotsTotal>0&&t.push(e.slotsBusy===null?`${e.slotsTotal} slots`:`${e.slotsBusy} of ${e.slotsTotal} slots busy`);let n=e.state;return{name:x[e.kind]??x.unknown,state:n,word:S[n]??S.unknown,tone:n===`running`?`success`:n===`starting`||n===`stopping`?`warning`:`neutral`,detail:t.length>0?t.join(` · `):null,canStart:e.supervised&&n===`stopped`,canStop:e.supervised&&n===`running`,managedElsewhere:!e.supervised}}function w(e){let t=e.configuredContext,n=e.nativeContext;return t!==null&&e.contextTruncated&&n!==null?`${a(t)} of ${a(n)} context`:t===null?n===null?null:`${a(n)} context`:`${a(t)} context`}function T(e){if(typeof e!=`string`)return``;try{let t=new URL(e);return t.port?`:${t.port}`:t.host}catch{return``}}function E(e){let t=Array.isArray(e.models)?e.models:[],n=0;for(let e of t){let t=h(e);(t?.state===`loaded`||t?.loaded===!0)&&(n+=1)}return{installed:t.length,loaded:n}}function D(e,t,n){let r=h(n);if(!r)return null;let i=T(r.baseUrl);if(r.reachable!==!0)return{id:e,name:t,tone:`neutral`,word:`Not running`,detail:i?`nothing answering on ${i}`:`nothing answering`};let{installed:a,loaded:o}=E(r),s=r.stale===!0?` · last known`:``;return{id:e,name:t,tone:o>0?`success`:`neutral`,word:`Answering`,detail:`${a} installed · ${o>0?`${o} loaded`:`none loaded`}${s}`}}function O(e){let t=h(e);if(!t)return null;let n=T(t.baseUrl),r=t.status,i=t.reason,a=`llama-server`;if(r===`ok`){let e=typeof t.modelCount==`number`?t.modelCount:null,n=typeof t.slots==`number`?t.slots:null;return{id:`llama-server`,name:a,tone:`success`,word:`Answering`,detail:[e===null?`serving`:`${e} model${e===1?``:`s`} served`,n===null?null:`${n} slots`].filter(e=>e!==null).join(` · `)}}return r===`loading`?{id:`llama-server`,name:a,tone:`warning`,word:`Loading…`,detail:`mapping weights on ${n}`}:r===`error`?{id:`llama-server`,name:a,tone:`danger`,word:`Error`,detail:`answering on ${n} with an error`}:i===`llama-server-timeout`?{id:`llama-server`,name:a,tone:`danger`,word:`Not answering`,detail:`listening on ${n} but not answering — restart it`}:{id:`llama-server`,name:a,tone:`neutral`,word:`Not running`,detail:n?`nothing answering on ${n}`:`nothing answering`}}function k(e){let t=h(e);return t?[D(`ollama`,`Ollama`,t.ollama),D(`lmstudio`,`LM Studio`,t.lmStudio),O(t.llamaServer)].filter(e=>e!==null):[]}function A(e,t=3){let n=[...new Set(e.filter(e=>e.trim().length>0))];if(n.length===0)return null;let r=n.slice(0,t).join(`, `);return n.length>t?`${r} +${n.length-t} more`:r}function j(e){let t=e.models.filter(e=>!e.unavailableReason);return t.length>0?t:e.models.slice(0,1)}function M(e){let t=j(e),n=t[0]?.id??null;return{tier:i(e.engine,n),basis:e.costBasis??r(e.engine,{modelId:n}),models:t.map(e=>e.label),reserve:null}}function N(e){if(e.length===0)return null;let t=e.map(M);return{tier:t.reduce((e,t)=>n(t.tier)<n(e)?t.tier:e,t[0].tier),basis:t[0].basis,models:t.flatMap(e=>e.models),reserve:null}}function P(e){return[...new Set(e.map(e=>M(e).basis))]}function F(e){return[`elite`,`fast`,`free`].map(t=>({tier:t,entries:e.filter(e=>e.tier===t).sort((e,t)=>e.statusRank-t.statusRank||e.marginal-t.marginal||e.index-t.index)})).filter(e=>e.entries.length>0)}function I(e){return o(e===null?`not-checked`:e?`usable`:`unavailable`)}var L={key:`verse-resources-cloud`,fetch:async n=>{try{return{available:!0,credits:y(await e(c,n))}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{available:!1,credits:null}}}},R=`verse-resources-readiness`;function z(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.v===1&&Array.isArray(t.resources)&&typeof t.autonomy==`object`&&t.autonomy!==null}var B={key:R,fetch:async n=>{try{let t=await e(d,n);return{available:!0,value:z(t)?t:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{available:!1,value:null}}}},V={cloud:6e4,local:3e4,runtime:15e3,readiness:3e4};export{b as a,N as c,I as d,C as f,P as i,w as l,m,L as n,F as o,M as p,B as r,k as s,V as t,A as u};
|
|
2
|
-
//# sourceMappingURL=resources-queries-CKyXyaDY.js.map
|