@ashlr/hub 3.17.1 → 3.17.2
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 +21 -0
- package/README.md +12 -6
- package/dist/authority-surface.json +7 -7
- package/dist/build-identity.json +2 -2
- package/dist/core/knowledge/wiki/citations.d.ts +2 -0
- package/dist/core/knowledge/wiki/citations.js +13 -4
- package/dist/core/knowledge/wiki/citations.js.map +1 -1
- package/dist/core/knowledge/wiki/facts.d.ts +13 -0
- package/dist/core/knowledge/wiki/facts.js +46 -9
- package/dist/core/knowledge/wiki/facts.js.map +1 -1
- package/dist/core/knowledge/wiki/graph.d.ts +1 -1
- package/dist/core/knowledge/wiki/graph.js +54 -7
- package/dist/core/knowledge/wiki/graph.js.map +1 -1
- package/dist/core/knowledge/wiki/types.d.ts +20 -6
- package/dist/core/web/public/next/assets/ActionMenu-DmHRxr1Q.js +2 -0
- package/dist/core/web/public/next/assets/ActionMenu-DmHRxr1Q.js.map +1 -0
- package/dist/core/web/public/next/assets/Advanced-DmCUyCfm.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-DmCUyCfm.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-l_rcOysR.js +2 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-l_rcOysR.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-CX08doSS.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-CX08doSS.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip-CPS_iuTz.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip-CPS_iuTz.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsScreen-D14Wm6WC.js +2 -0
- package/dist/core/web/public/next/assets/AgentsScreen-D14Wm6WC.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsSection-BIPpbKGT.js +3 -0
- package/dist/core/web/public/next/assets/AgentsSection-BIPpbKGT.js.map +1 -0
- package/dist/core/web/public/next/assets/App-CI3iqvqx.js +8 -0
- package/dist/core/web/public/next/assets/App-CI3iqvqx.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-B_Htu4Ha.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-B_Htu4Ha.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-C8t1e_iz.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-C8t1e_iz.js.map +1 -0
- package/dist/core/web/public/next/assets/AutomationsSection-CdU1kFGD.js +2 -0
- package/dist/core/web/public/next/assets/AutomationsSection-CdU1kFGD.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-kEIQ45VE.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-kEIQ45VE.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-u1Bw9EWH.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-u1Bw9EWH.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-CLcACbD6.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-CLcACbD6.js.map +1 -0
- package/dist/core/web/public/next/assets/BranchBar-_RoWU_JS.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-_RoWU_JS.js.map +1 -0
- package/dist/core/web/public/next/assets/BrowserPanel-DcZzLVJ0.js +7 -0
- package/dist/core/web/public/next/assets/BrowserPanel-DcZzLVJ0.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-BDx4fvRS.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-BDx4fvRS.js.map +1 -0
- package/dist/core/web/public/next/assets/Button-BKA5M-tJ.js +2 -0
- package/dist/core/web/public/next/assets/Button-BKA5M-tJ.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-DwWrB6l8.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-DwWrB6l8.js.map +1 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-jmWhj4z0.js +16 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-jmWhj4z0.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-BqXHRCDs.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-BqXHRCDs.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatPanes-Cvee66BN.js +2 -0
- package/dist/core/web/public/next/assets/ChatPanes-Cvee66BN.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-DW87PAMm.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-DW87PAMm.js.map +1 -0
- package/dist/core/web/public/next/assets/ChecksPanel-C5hBYh2c.js +5 -0
- package/dist/core/web/public/next/assets/ChecksPanel-C5hBYh2c.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-d7_TF6P4.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-d7_TF6P4.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-B8t8W8Qh.js +3 -0
- package/dist/core/web/public/next/assets/CommandPalette-B8t8W8Qh.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-BHCc65AZ.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-BHCc65AZ.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-DtMTY_QW.js +9 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-DtMTY_QW.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-L7d1Jdq6.js +3 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-L7d1Jdq6.js.map +1 -0
- package/dist/core/web/public/next/assets/CompareDialog-jR3SHebZ.js +4 -0
- package/dist/core/web/public/next/assets/CompareDialog-jR3SHebZ.js.map +1 -0
- package/dist/core/web/public/next/assets/ComputerControl-CtR9iyrl.js +2 -0
- package/dist/core/web/public/next/assets/ComputerControl-CtR9iyrl.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-BLa9SQCD.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-BLa9SQCD.js.map +1 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-C0_9RguO.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-C0_9RguO.js.map +1 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-DY-VC_Bu.js +2 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-DY-VC_Bu.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-kQIBpFXz.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-kQIBpFXz.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffPane-DmsgpucH.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-DmsgpucH.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-CwFSlxK-.js +2 -0
- package/dist/core/web/public/next/assets/DiffViewer-CwFSlxK-.js.map +1 -0
- package/dist/core/web/public/next/assets/DockHost-DBcYCg-w.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-DBcYCg-w.js.map +1 -0
- package/dist/core/web/public/next/assets/EmptyState-CtcWT61K.js +2 -0
- package/dist/core/web/public/next/assets/EmptyState-CtcWT61K.js.map +1 -0
- package/dist/core/web/public/next/assets/Epistemic-Cu1zgz4Q.js +2 -0
- package/dist/core/web/public/next/assets/Epistemic-Cu1zgz4Q.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-DiJQpO-t.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-DiJQpO-t.js.map +1 -0
- package/dist/core/web/public/next/assets/FilesPane-Ce6RAzbo.js +2 -0
- package/dist/core/web/public/next/assets/FilesPane-Ce6RAzbo.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetScreen-fubswj5A.js +2 -0
- package/dist/core/web/public/next/assets/FleetScreen-fubswj5A.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetSection-DWxpkefM.js +5 -0
- package/dist/core/web/public/next/assets/FleetSection-DWxpkefM.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-E6icZQgx.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-E6icZQgx.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-ODBhoI9j.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-ODBhoI9j.js.map +1 -0
- package/dist/core/web/public/next/assets/GitDialogs-DjpWtBzX.js +2 -0
- package/dist/core/web/public/next/assets/GitDialogs-DjpWtBzX.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-Cf50Ly0u.js +3 -0
- package/dist/core/web/public/next/assets/GrowthSection-Cf50Ly0u.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-DlUjSuxs.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-DlUjSuxs.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeBody-DYnEbH-_.js +3 -0
- package/dist/core/web/public/next/assets/HomeBody-DYnEbH-_.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeSeats-BDWMFY7Q.js +2 -0
- package/dist/core/web/public/next/assets/HomeSeats-BDWMFY7Q.js.map +1 -0
- package/dist/core/web/public/next/assets/Input-CJnHvtwe.js +2 -0
- package/dist/core/web/public/next/assets/Input-CJnHvtwe.js.map +1 -0
- package/dist/core/web/public/next/assets/LaunchDialog-DyX6d-h-.js +9 -0
- package/dist/core/web/public/next/assets/LaunchDialog-DyX6d-h-.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-BDAKrxHa.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-BDAKrxHa.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DHI2fjhw.js +3 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DHI2fjhw.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderScreen-_PwOiKas.js +2 -0
- package/dist/core/web/public/next/assets/LeaderScreen-_PwOiKas.js.map +1 -0
- package/dist/core/web/public/next/assets/LessonsPanel-Sh5Hx51J.js +2 -0
- package/dist/core/web/public/next/assets/LessonsPanel-Sh5Hx51J.js.map +1 -0
- package/dist/core/web/public/next/assets/LiveTimer-CdTqqC-y.js +2 -0
- package/dist/core/web/public/next/assets/LiveTimer-CdTqqC-y.js.map +1 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-bCbEkJgv.js +2 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-bCbEkJgv.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BB22t9cL.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BB22t9cL.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-BpV1z4P5.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-BpV1z4P5.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-B_EEMPZ6.js +3 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-B_EEMPZ6.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-B6bFE970.js +72 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-B6bFE970.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-Cm15WZWf.js +2 -0
- package/dist/core/web/public/next/assets/Meter-Cm15WZWf.js.map +1 -0
- package/dist/core/web/public/next/assets/MicButton-33E5Ppnu.js +2 -0
- package/dist/core/web/public/next/assets/MicButton-33E5Ppnu.js.map +1 -0
- package/dist/core/web/public/next/assets/MindSection-GBqYaZLx.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-GBqYaZLx.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileComposer-DrSwZPIn.js +2 -0
- package/dist/core/web/public/next/assets/MobileComposer-DrSwZPIn.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BnAxk-ae.js +2 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BnAxk-ae.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileRuntime-Cusn1BWx.js +3 -0
- package/dist/core/web/public/next/assets/MobileRuntime-Cusn1BWx.js.map +1 -0
- package/dist/core/web/public/next/assets/MoreScreen-Cu0xtG6f.js +2 -0
- package/dist/core/web/public/next/assets/MoreScreen-Cu0xtG6f.js.map +1 -0
- package/dist/core/web/public/next/assets/MultiModelBar-_qyTHa1F.js +7 -0
- package/dist/core/web/public/next/assets/MultiModelBar-_qyTHa1F.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-uyP-k0p1.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-uyP-k0p1.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-X_RbeWMF.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-X_RbeWMF.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-B1SUdYu6.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-B1SUdYu6.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-DpSxoqCc.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-DpSxoqCc.js.map +1 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BoVhP7uR.js +2 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BoVhP7uR.js.map +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-Ch_TBnim.js +4 -0
- package/dist/core/web/public/next/assets/NewChatDialog-Ch_TBnim.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-D5eqnjr0.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-D5eqnjr0.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-Dzx97k2x.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-Dzx97k2x.js.map +1 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-D2oX2sL3.js +9 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-D2oX2sL3.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-AxOJgJQm.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-AxOJgJQm.js.map +1 -0
- package/dist/core/web/public/next/assets/ProviderLogo-CDw9LZmh.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-CDw9LZmh.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-DW2ceuC0.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-DW2ceuC0.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningPane-C9jRpr8d.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningPane-C9jRpr8d.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-uc3BnfVA.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-uc3BnfVA.js.map +1 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-Di6IeZNh.js +2 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-Di6IeZNh.js.map +1 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-H0YSq55U.js +2 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-H0YSq55U.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CHDEHAnq.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CHDEHAnq.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-DIle5rXp.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-DIle5rXp.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DbTLNuGQ.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DbTLNuGQ.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CbAyWP7h.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CbAyWP7h.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-HD1AX0SJ.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-HD1AX0SJ.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BkzQlbO3.js +2 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BkzQlbO3.js.map +1 -0
- package/dist/core/web/public/next/assets/ScreenHost-BPtOP6LJ.js +3 -0
- package/dist/core/web/public/next/assets/ScreenHost-BPtOP6LJ.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-D8EZXz9a.js +3 -0
- package/dist/core/web/public/next/assets/SeatSelector-D8EZXz9a.js.map +1 -0
- package/dist/core/web/public/next/assets/Segmented-pAErxjR4.js +2 -0
- package/dist/core/web/public/next/assets/Segmented-pAErxjR4.js.map +1 -0
- package/dist/core/web/public/next/assets/Select-Css6V7wH.js +2 -0
- package/dist/core/web/public/next/assets/Select-Css6V7wH.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-DgvYLkfM.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-DgvYLkfM.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DwPsk2Kl.js +2 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DwPsk2Kl.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionSearch-CHpNzY8i.js +2 -0
- package/dist/core/web/public/next/assets/SessionSearch-CHpNzY8i.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-p79CGbgs.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-p79CGbgs.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-1gybss1n.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-1gybss1n.js.map +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-NL2qNt90.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-NL2qNt90.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-1ENtyVoT.js +2 -0
- package/dist/core/web/public/next/assets/Sheet-1ENtyVoT.js.map +1 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-Beq9s8p4.js +2 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-Beq9s8p4.js.map +1 -0
- package/dist/core/web/public/next/assets/Sidebar-BuMV-ulX.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-BuMV-ulX.js.map +1 -0
- package/dist/core/web/public/next/assets/SkipToContent-DxOcfOLL.js +2 -0
- package/dist/core/web/public/next/assets/SkipToContent-DxOcfOLL.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-DY1bch2c.js +2 -0
- package/dist/core/web/public/next/assets/Slider-DY1bch2c.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPane-D1RA-tY4.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPane-D1RA-tY4.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPanel-WitD82Au.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPanel-WitD82Au.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-BE2HnwNG.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-BE2HnwNG.js.map +1 -0
- package/dist/core/web/public/next/assets/StatusBadge-RjXOZERa.js +2 -0
- package/dist/core/web/public/next/assets/StatusBadge-RjXOZERa.js.map +1 -0
- package/dist/core/web/public/next/assets/StepBand-iT1eplJ_.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-iT1eplJ_.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-B1n3X1cF.js +2 -0
- package/dist/core/web/public/next/assets/Surface-B1n3X1cF.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-B2q7tuCp.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-B2q7tuCp.js.map +1 -0
- package/dist/core/web/public/next/assets/Switch-B6Jn8y6M.js +2 -0
- package/dist/core/web/public/next/assets/Switch-B6Jn8y6M.js.map +1 -0
- package/dist/core/web/public/next/assets/Tag-ils_o3n7.js +2 -0
- package/dist/core/web/public/next/assets/Tag-ils_o3n7.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-BhQiOFqe.js +26 -0
- package/dist/core/web/public/next/assets/TerminalPane-BhQiOFqe.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-D2L17_-J.js +3 -0
- package/dist/core/web/public/next/assets/TerminalPane-D2L17_-J.js.map +1 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DgBPlHBO.js +2 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DgBPlHBO.js.map +1 -0
- package/dist/core/web/public/next/assets/Transcript-DZ96MnR7.css +1 -0
- package/dist/core/web/public/next/assets/Transcript.module-DD0MFIIy.js +2 -0
- package/dist/core/web/public/next/assets/Transcript.module-DD0MFIIy.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CJXF3bKW.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CJXF3bKW.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-Cbfp6Daj.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-Cbfp6Daj.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-DHbdb-S3.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-DHbdb-S3.js.map +1 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B3on-MuD.js +2 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B3on-MuD.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CyRa9lh1.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CyRa9lh1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-DdL64BfN.js +3 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-DdL64BfN.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseShared-8n7hxr-e.js +2 -0
- package/dist/core/web/public/next/assets/VerseShared-8n7hxr-e.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceHud-BXfe23my.js +2 -0
- package/dist/core/web/public/next/assets/VoiceHud-BXfe23my.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceInput-D191210j.js +2 -0
- package/dist/core/web/public/next/assets/VoiceInput-D191210j.js.map +1 -0
- package/dist/core/web/public/next/assets/WikiSection-D-aTEDA2.css +1 -0
- package/dist/core/web/public/next/assets/WikiSection-DFvGhkF6.js +2 -0
- package/dist/core/web/public/next/assets/WikiSection-DFvGhkF6.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-Bcz74TPB.js +6 -0
- package/dist/core/web/public/next/assets/Workspace-Bcz74TPB.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-C0D3tGtQ.js +2 -0
- package/dist/core/web/public/next/assets/actions-C0D3tGtQ.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-tools-client-Mgwa14ux.js +2 -0
- package/dist/core/web/public/next/assets/agent-tools-client-Mgwa14ux.js.map +1 -0
- package/dist/core/web/public/next/assets/agents-focus-D2fGa_4z.js +2 -0
- package/dist/core/web/public/next/assets/agents-focus-D2fGa_4z.js.map +1 -0
- package/dist/core/web/public/next/assets/app-version-DINpmCFl.js +2 -0
- package/dist/core/web/public/next/assets/app-version-DINpmCFl.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-BuxJ4qXU.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-BuxJ4qXU.js.map +1 -0
- package/dist/core/web/public/next/assets/ask-seat-Dcpk0CIF.js +2 -0
- package/dist/core/web/public/next/assets/ask-seat-Dcpk0CIF.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-DiQlAl6i.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-DiQlAl6i.js.map +1 -0
- package/dist/core/web/public/next/assets/automations-focus-Drncwmjo.js +2 -0
- package/dist/core/web/public/next/assets/automations-focus-Drncwmjo.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-Bq8E10-x.js +2 -0
- package/dist/core/web/public/next/assets/budget-queries-Bq8E10-x.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-w-CrM5cb.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-w-CrM5cb.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-Df70a5lC.js +2 -0
- package/dist/core/web/public/next/assets/charts-Df70a5lC.js.map +1 -0
- package/dist/core/web/public/next/assets/chat-pane-data-DTU9zx7p.js +2 -0
- package/dist/core/web/public/next/assets/chat-pane-data-DTU9zx7p.js.map +1 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-CnVckizB.js +2 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-CnVckizB.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-CcwKDQQR.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-CcwKDQQR.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-BVXehx9p.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-BVXehx9p.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-queries-kl4Qu4ov.js +2 -0
- package/dist/core/web/public/next/assets/composer-queries-kl4Qu4ov.js.map +1 -0
- package/dist/core/web/public/next/assets/connectivity-BPumEJvI.js +2 -0
- package/dist/core/web/public/next/assets/connectivity-BPumEJvI.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-D9KmusOQ.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-D9KmusOQ.js.map +1 -0
- package/dist/core/web/public/next/assets/control-queries-CWyOtMUt.js +2 -0
- package/dist/core/web/public/next/assets/control-queries-CWyOtMUt.js.map +1 -0
- package/dist/core/web/public/next/assets/copy-setup-BZ1iT71M.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-BZ1iT71M.js.map +1 -0
- package/dist/core/web/public/next/assets/deep-link-DS0fbWVh.js +2 -0
- package/dist/core/web/public/next/assets/deep-link-DS0fbWVh.js.map +1 -0
- package/dist/core/web/public/next/assets/device-permissions-D09Bt0Pq.js +2 -0
- package/dist/core/web/public/next/assets/device-permissions-D09Bt0Pq.js.map +1 -0
- package/dist/core/web/public/next/assets/devin-queries-DURIM9b4.js +2 -0
- package/dist/core/web/public/next/assets/devin-queries-DURIM9b4.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-CgxRg9PW.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-CgxRg9PW.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-k9k0Nb7F.js +2 -0
- package/dist/core/web/public/next/assets/dock-panes-k9k0Nb7F.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-B5itt_Zs.js +2 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-B5itt_Zs.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-BfG7HzPg.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-BfG7HzPg.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-state-C3cbNM2V.js +3 -0
- package/dist/core/web/public/next/assets/fleet-state-C3cbNM2V.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-BZrKstmG.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-BZrKstmG.js.map +1 -0
- package/dist/core/web/public/next/assets/git-model-Cifb_Fej.js +5 -0
- package/dist/core/web/public/next/assets/git-model-Cifb_Fej.js.map +1 -0
- package/dist/core/web/public/next/assets/global-7hs7NyAO.js +3 -0
- package/dist/core/web/public/next/assets/global-7hs7NyAO.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-B436fLZM.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-B436fLZM.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-BKW2AzKm.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-BKW2AzKm.js.map +1 -0
- package/dist/core/web/public/next/assets/health-queries-BIrXejEb.js +2 -0
- package/dist/core/web/public/next/assets/health-queries-BIrXejEb.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-D-25SVjm.js +2 -0
- package/dist/core/web/public/next/assets/icons-D-25SVjm.js.map +1 -0
- package/dist/core/web/public/next/assets/index-BMfejJ9u.js +11 -0
- package/dist/core/web/public/next/assets/index-BMfejJ9u.js.map +1 -0
- package/dist/core/web/public/next/assets/jev-queries-C0e3k0w_.js +2 -0
- package/dist/core/web/public/next/assets/jev-queries-C0e3k0w_.js.map +1 -0
- package/dist/core/web/public/next/assets/ladder-queries-D0IO6okB.js +2 -0
- package/dist/core/web/public/next/assets/ladder-queries-D0IO6okB.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-focus-By_cVWdr.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-By_cVWdr.js.map +1 -0
- package/dist/core/web/public/next/assets/live-model-D9KHB4SV.js +2 -0
- package/dist/core/web/public/next/assets/live-model-D9KHB4SV.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-actions-B2vI7Rp-.js +2 -0
- package/dist/core/web/public/next/assets/mobile-actions-B2vI7Rp-.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-toast-BiBjw1hY.js +2 -0
- package/dist/core/web/public/next/assets/mobile-toast-BiBjw1hY.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-flows-D4rRL-nu.js +7 -0
- package/dist/core/web/public/next/assets/multimodel-flows-D4rRL-nu.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-queries-B3ZY2aWQ.js +2 -0
- package/dist/core/web/public/next/assets/multimodel-queries-B3ZY2aWQ.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-MOivZTO7.js +2 -0
- package/dist/core/web/public/next/assets/mutations-MOivZTO7.js.map +1 -0
- package/dist/core/web/public/next/assets/nav-BlWTsG_5.js +2 -0
- package/dist/core/web/public/next/assets/nav-BlWTsG_5.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-actions-BzoGPu4Q.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-actions-BzoGPu4Q.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-model-BOm7eJaQ.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-model-BOm7eJaQ.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-CAuSMTFo.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-CAuSMTFo.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-request-D3jNbBOp.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-request-D3jNbBOp.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-DpCYfw0d.js +2 -0
- package/dist/core/web/public/next/assets/overnight-queries-DpCYfw0d.js.map +1 -0
- package/dist/core/web/public/next/assets/palette-handoff-Hqp9I68R.js +2 -0
- package/dist/core/web/public/next/assets/palette-handoff-Hqp9I68R.js.map +1 -0
- package/dist/core/web/public/next/assets/panes-AG63rhpM.js +3 -0
- package/dist/core/web/public/next/assets/panes-AG63rhpM.js.map +1 -0
- package/dist/core/web/public/next/assets/path-display-Dv94FG1y.js +2 -0
- package/dist/core/web/public/next/assets/path-display-Dv94FG1y.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-composer-BxEtjsIW.js +2 -0
- package/dist/core/web/public/next/assets/playbook-composer-BxEtjsIW.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-focus-BB1SYpsW.js +2 -0
- package/dist/core/web/public/next/assets/playbook-focus-BB1SYpsW.js.map +1 -0
- package/dist/core/web/public/next/assets/playbooks-queries-DtWLQrwZ.js +2 -0
- package/dist/core/web/public/next/assets/playbooks-queries-DtWLQrwZ.js.map +1 -0
- package/dist/core/web/public/next/assets/preloaded-D89lETD0.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-D89lETD0.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-DXJl-rSe.js +1 -0
- package/dist/core/web/public/next/assets/pwa-CFctEg6F.js +2 -0
- package/dist/core/web/public/next/assets/pwa-CFctEg6F.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-BLmYe69g.js +2 -0
- package/dist/core/web/public/next/assets/queries-BLmYe69g.js.map +1 -0
- package/dist/core/web/public/next/assets/reasoning-pref-D4t6eFBc.js +2 -0
- package/dist/core/web/public/next/assets/reasoning-pref-D4t6eFBc.js.map +1 -0
- package/dist/core/web/public/next/assets/remote-session-BdCVlRRZ.js +3 -0
- package/dist/core/web/public/next/assets/remote-session-BdCVlRRZ.js.map +1 -0
- package/dist/core/web/public/next/assets/resolved-store-B1xwZl7x.js +2 -0
- package/dist/core/web/public/next/assets/resolved-store-B1xwZl7x.js.map +1 -0
- package/dist/core/web/public/next/assets/resources-queries-BaSf2hP1.js +2 -0
- package/dist/core/web/public/next/assets/resources-queries-BaSf2hP1.js.map +1 -0
- package/dist/core/web/public/next/assets/reveal-anchor-zUWG9d5W.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-zUWG9d5W.js.map +1 -0
- package/dist/core/web/public/next/assets/sheet-PQfgBlM5.js +2 -0
- package/dist/core/web/public/next/assets/sheet-PQfgBlM5.js.map +1 -0
- package/dist/core/web/public/next/assets/slots-DJafWFZK.js +3 -0
- package/dist/core/web/public/next/assets/slots-DJafWFZK.js.map +1 -0
- package/dist/core/web/public/next/assets/sources-queries-BcB711fd.js +4 -0
- package/dist/core/web/public/next/assets/sources-queries-BcB711fd.js.map +1 -0
- package/dist/core/web/public/next/assets/sse-Cp2z2nU_.js +2 -0
- package/dist/core/web/public/next/assets/sse-Cp2z2nU_.js.map +1 -0
- package/dist/core/web/public/next/assets/stub-panes.module-blrN0yxn.js +3 -0
- package/dist/core/web/public/next/assets/stub-panes.module-blrN0yxn.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-data-D-fFBmZZ.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-D-fFBmZZ.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-Q1iAxBuz.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-Q1iAxBuz.js.map +1 -0
- package/dist/core/web/public/next/assets/tasks-model-Larlwtqy.js +2 -0
- package/dist/core/web/public/next/assets/tasks-model-Larlwtqy.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-client-kp1CT3x-.js +2 -0
- package/dist/core/web/public/next/assets/terminal-client-kp1CT3x-.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-icons-BxToOayr.js +2 -0
- package/dist/core/web/public/next/assets/terminal-icons-BxToOayr.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-view-CSxX-xjM.js +6 -0
- package/dist/core/web/public/next/assets/terminal-view-CSxX-xjM.js.map +1 -0
- package/dist/core/web/public/next/assets/thread-data-bh8JfvXs.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-bh8JfvXs.js.map +1 -0
- package/dist/core/web/public/next/assets/tool-semantics-xF0Fw2Ck.js +8 -0
- package/dist/core/web/public/next/assets/tool-semantics-xF0Fw2Ck.js.map +1 -0
- package/dist/core/web/public/next/assets/turn-files-fJGOtf4K.js +2 -0
- package/dist/core/web/public/next/assets/turn-files-fJGOtf4K.js.map +1 -0
- package/dist/core/web/public/next/assets/ui-parts-C9HJZZ3G.js +2 -0
- package/dist/core/web/public/next/assets/ui-parts-C9HJZZ3G.js.map +1 -0
- package/dist/core/web/public/next/assets/usage-queries-7aq_WIzn.js +2 -0
- package/dist/core/web/public/next/assets/usage-queries-7aq_WIzn.js.map +1 -0
- package/dist/core/web/public/next/assets/use-chat-activity-C1AfctzC.js +2 -0
- package/dist/core/web/public/next/assets/use-chat-activity-C1AfctzC.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DtO48djT.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DtO48djT.js.map +1 -0
- package/dist/core/web/public/next/assets/use-ticker-C_3x5IxG.js +2 -0
- package/dist/core/web/public/next/assets/use-ticker-C_3x5IxG.js.map +1 -0
- package/dist/core/web/public/next/assets/use-token-gate-CVck1ObW.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-CVck1ObW.js.map +1 -0
- package/dist/core/web/public/next/assets/useAutoSeat-DEuUBq8A.js +2 -0
- package/dist/core/web/public/next/assets/useAutoSeat-DEuUBq8A.js.map +1 -0
- package/dist/core/web/public/next/assets/useOnboarding-4DaPslDU.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-4DaPslDU.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatHealth-BztO2ijd.js +2 -0
- package/dist/core/web/public/next/assets/useSeatHealth-BztO2ijd.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DrYcVtb0.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DrYcVtb0.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseSession-8gkt9BrB.js +2 -0
- package/dist/core/web/public/next/assets/useVerseSession-8gkt9BrB.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-8DMWuHY_.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-8DMWuHY_.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-CarqaoBI.js +2 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-CarqaoBI.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-CqAqHAJV.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-CqAqHAJV.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-D7Q3XM98.js +3 -0
- package/dist/core/web/public/next/assets/warmup-D7Q3XM98.js.map +1 -0
- package/dist/core/web/public/next/assets/wiki-focus-cER8-UuY.js +2 -0
- package/dist/core/web/public/next/assets/wiki-focus-cER8-UuY.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/docs/QUICKSTART.md +7 -7
- package/package.json +2 -2
- package/dist/core/web/public/next/assets/ActionMenu--8HwMEm-.js +0 -2
- package/dist/core/web/public/next/assets/ActionMenu--8HwMEm-.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-CI3lDlNx.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-CI3lDlNx.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentDetailScreen-DR9Mt6p3.js +0 -2
- package/dist/core/web/public/next/assets/AgentDetailScreen-DR9Mt6p3.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsSheet-B9NRMObI.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsSheet-B9NRMObI.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsStrip-Di-IPkGx.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsStrip-Di-IPkGx.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsScreen-nWyL2bRO.js +0 -2
- package/dist/core/web/public/next/assets/AgentsScreen-nWyL2bRO.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsSection-C0_0UI3x.js +0 -3
- package/dist/core/web/public/next/assets/AgentsSection-C0_0UI3x.js.map +0 -1
- package/dist/core/web/public/next/assets/App-CilLfKCx.js +0 -8
- package/dist/core/web/public/next/assets/App-CilLfKCx.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-CfSTk7HH.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-CfSTk7HH.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-CxOhY1UF.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-CxOhY1UF.js.map +0 -1
- package/dist/core/web/public/next/assets/AutomationsSection-DuW15eMu.js +0 -2
- package/dist/core/web/public/next/assets/AutomationsSection-DuW15eMu.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-CcBeGaDE.js +0 -3
- package/dist/core/web/public/next/assets/AutonomyOffState-CcBeGaDE.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-DhPlr1lu.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-DhPlr1lu.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-BjcxejFk.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyStatus-BjcxejFk.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-CnUx6S00.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-CnUx6S00.js.map +0 -1
- package/dist/core/web/public/next/assets/BrowserPanel-BGT_M1U1.js +0 -7
- package/dist/core/web/public/next/assets/BrowserPanel-BGT_M1U1.js.map +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-BrNZT9Zl.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-BrNZT9Zl.js.map +0 -1
- package/dist/core/web/public/next/assets/Button-BiWLAmtW.js +0 -2
- package/dist/core/web/public/next/assets/Button-BiWLAmtW.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-DOgdqmgX.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-DOgdqmgX.js.map +0 -1
- package/dist/core/web/public/next/assets/ChangesPaneHost-B8Q4Pyuy.js +0 -16
- package/dist/core/web/public/next/assets/ChangesPaneHost-B8Q4Pyuy.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-167_NcWd.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-167_NcWd.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatPanes-DfvfHTCR.js +0 -2
- package/dist/core/web/public/next/assets/ChatPanes-DfvfHTCR.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DYWOyKNd.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DYWOyKNd.js.map +0 -1
- package/dist/core/web/public/next/assets/ChecksPanel-_yhpFLzc.js +0 -5
- package/dist/core/web/public/next/assets/ChecksPanel-_yhpFLzc.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-CpA4WRlB.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-CpA4WRlB.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-CggT1MRe.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-CggT1MRe.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-BT6spVer.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-BT6spVer.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowForm-D0UA0Tgb.js +0 -9
- package/dist/core/web/public/next/assets/CommandWorkflowForm-D0UA0Tgb.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-DnhAyun2.js +0 -3
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-DnhAyun2.js.map +0 -1
- package/dist/core/web/public/next/assets/CompareDialog-D_k5fpTZ.js +0 -4
- package/dist/core/web/public/next/assets/CompareDialog-D_k5fpTZ.js.map +0 -1
- package/dist/core/web/public/next/assets/ComputerControl-DehWe5qQ.js +0 -2
- package/dist/core/web/public/next/assets/ComputerControl-DehWe5qQ.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-CZhofva3.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-CZhofva3.js.map +0 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-C3pjjZ_M.js +0 -2
- package/dist/core/web/public/next/assets/DeleteChatDialog-C3pjjZ_M.js.map +0 -1
- package/dist/core/web/public/next/assets/DevinStopDialog-DAruALIH.js +0 -2
- package/dist/core/web/public/next/assets/DevinStopDialog-DAruALIH.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-CH48_F95.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-CH48_F95.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-CnW8cKzV.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-CnW8cKzV.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-C33LbmiF.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-C33LbmiF.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-D7EdSe5a.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-D7EdSe5a.js.map +0 -1
- package/dist/core/web/public/next/assets/EmptyState-7g6XvSCX.js +0 -2
- package/dist/core/web/public/next/assets/EmptyState-7g6XvSCX.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-CCymco01.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-CCymco01.js.map +0 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-BFb9JIYV.js +0 -2
- package/dist/core/web/public/next/assets/EvidenceTimeline-BFb9JIYV.js.map +0 -1
- package/dist/core/web/public/next/assets/FilesPane-iRh6nDlh.js +0 -2
- package/dist/core/web/public/next/assets/FilesPane-iRh6nDlh.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetScreen-_GPa48bL.js +0 -2
- package/dist/core/web/public/next/assets/FleetScreen-_GPa48bL.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-Bon8yQlk.js +0 -5
- package/dist/core/web/public/next/assets/FleetSection-Bon8yQlk.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-BVKqU0yd.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-BVKqU0yd.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-DqiVGoID.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-DqiVGoID.js.map +0 -1
- package/dist/core/web/public/next/assets/GitDialogs-Da1EB6vD.js +0 -2
- package/dist/core/web/public/next/assets/GitDialogs-Da1EB6vD.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-jz_5brSm.js +0 -3
- package/dist/core/web/public/next/assets/GrowthSection-jz_5brSm.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-Ciy556L3.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-Ciy556L3.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeBody-CAZjhdMC.js +0 -3
- package/dist/core/web/public/next/assets/HomeBody-CAZjhdMC.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeSeats-Bhmc1sIJ.js +0 -2
- package/dist/core/web/public/next/assets/HomeSeats-Bhmc1sIJ.js.map +0 -1
- package/dist/core/web/public/next/assets/Input-VOFXiCWT.js +0 -2
- package/dist/core/web/public/next/assets/Input-VOFXiCWT.js.map +0 -1
- package/dist/core/web/public/next/assets/LaunchDialog-ByJkKheq.js +0 -9
- package/dist/core/web/public/next/assets/LaunchDialog-ByJkKheq.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderCard-Dam6IfzD.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-Dam6IfzD.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderConversation-DduNJP6H.js +0 -3
- package/dist/core/web/public/next/assets/LeaderConversation-DduNJP6H.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderScreen-_3YeG61Z.js +0 -2
- package/dist/core/web/public/next/assets/LeaderScreen-_3YeG61Z.js.map +0 -1
- package/dist/core/web/public/next/assets/LessonsPanel-CbEleQtG.js +0 -2
- package/dist/core/web/public/next/assets/LessonsPanel-CbEleQtG.js.map +0 -1
- package/dist/core/web/public/next/assets/LiveTimer-DMKMewTd.js +0 -2
- package/dist/core/web/public/next/assets/LiveTimer-DMKMewTd.js.map +0 -1
- package/dist/core/web/public/next/assets/LocalSeatBadge-Dk5OYc6Y.js +0 -2
- package/dist/core/web/public/next/assets/LocalSeatBadge-Dk5OYc6Y.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-1ksZeI4v.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-1ksZeI4v.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-CeIjaqve.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-CeIjaqve.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-BpTPmenE.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-BpTPmenE.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-BeSS9Pdl.js +0 -72
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-BeSS9Pdl.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-CqaHFpQN.js +0 -2
- package/dist/core/web/public/next/assets/Meter-CqaHFpQN.js.map +0 -1
- package/dist/core/web/public/next/assets/MicButton-DYO5NOwU.js +0 -2
- package/dist/core/web/public/next/assets/MicButton-DYO5NOwU.js.map +0 -1
- package/dist/core/web/public/next/assets/MindSection-CQ9_IS2g.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-CQ9_IS2g.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileComposer-BK-mI_X6.js +0 -2
- package/dist/core/web/public/next/assets/MobileComposer-BK-mI_X6.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileGuardSheet-B7P3q2I3.js +0 -2
- package/dist/core/web/public/next/assets/MobileGuardSheet-B7P3q2I3.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileRuntime-PLoWSQGn.js +0 -3
- package/dist/core/web/public/next/assets/MobileRuntime-PLoWSQGn.js.map +0 -1
- package/dist/core/web/public/next/assets/MoreScreen-DLfPso-M.js +0 -2
- package/dist/core/web/public/next/assets/MoreScreen-DLfPso-M.js.map +0 -1
- package/dist/core/web/public/next/assets/MultiModelBar-Mrm1444h.js +0 -7
- package/dist/core/web/public/next/assets/MultiModelBar-Mrm1444h.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-ChtiRDO6.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-ChtiRDO6.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BMccNeTi.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BMccNeTi.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-J39veXX_.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-J39veXX_.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouScreen-C4uPKnl5.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouScreen-C4uPKnl5.js.map +0 -1
- package/dist/core/web/public/next/assets/NewAgentScreen-ME05-nh6.js +0 -2
- package/dist/core/web/public/next/assets/NewAgentScreen-ME05-nh6.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-Bl3XJx7p.js +0 -4
- package/dist/core/web/public/next/assets/NewChatDialog-Bl3XJx7p.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-9Dfw74WI.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-9Dfw74WI.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DmWHBqkN.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-DmWHBqkN.js.map +0 -1
- package/dist/core/web/public/next/assets/PlaybooksSection-Bmmw9ea2.js +0 -9
- package/dist/core/web/public/next/assets/PlaybooksSection-Bmmw9ea2.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-B3V-S2wt.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-B3V-S2wt.js.map +0 -1
- package/dist/core/web/public/next/assets/ProviderLogo-C1Ap7oXI.js +0 -2
- package/dist/core/web/public/next/assets/ProviderLogo-C1Ap7oXI.js.map +0 -1
- package/dist/core/web/public/next/assets/RailStatus-D8G4G_Vd.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-D8G4G_Vd.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningPane-Ch4eEqfN.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningPane-Ch4eEqfN.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningSheet-zW3qNqGs.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningSheet-zW3qNqGs.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-5WVbQPUt.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-5WVbQPUt.js.map +0 -1
- package/dist/core/web/public/next/assets/RemoteMobileApp-Bb_ls1jo.js +0 -2
- package/dist/core/web/public/next/assets/RemoteMobileApp-Bb_ls1jo.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-DjqkkBOW.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-DjqkkBOW.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-Dg2-MDWW.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-Dg2-MDWW.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-DbDOCW04.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesDrawer-DbDOCW04.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DvarlJu6.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-DvarlJu6.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-pqIPQwgD.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-pqIPQwgD.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInDevinAction-D1zIEZEQ.js +0 -2
- package/dist/core/web/public/next/assets/RunInDevinAction-D1zIEZEQ.js.map +0 -1
- package/dist/core/web/public/next/assets/ScreenHost-B4MLcKr9.js +0 -3
- package/dist/core/web/public/next/assets/ScreenHost-B4MLcKr9.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-BknWe_wy.js +0 -3
- package/dist/core/web/public/next/assets/SeatSelector-BknWe_wy.js.map +0 -1
- package/dist/core/web/public/next/assets/Segmented-wjds-ulG.js +0 -2
- package/dist/core/web/public/next/assets/Segmented-wjds-ulG.js.map +0 -1
- package/dist/core/web/public/next/assets/Select-B5GTnXoL.js +0 -2
- package/dist/core/web/public/next/assets/Select-B5GTnXoL.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionGate-B3FUSg4M.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-B3FUSg4M.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-C4wouctG.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-C4wouctG.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionSearch-B-2yHMw6.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-B-2yHMw6.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-D8v6WRFJ.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-D8v6WRFJ.js.map +0 -1
- package/dist/core/web/public/next/assets/SetupChecklist-63CBlXs1.js +0 -2
- package/dist/core/web/public/next/assets/SetupChecklist-63CBlXs1.js.map +0 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-eybo7qqr.js +0 -3
- package/dist/core/web/public/next/assets/ShadowDecisions-eybo7qqr.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-BrHMpj4g.js +0 -2
- package/dist/core/web/public/next/assets/Sheet-BrHMpj4g.js.map +0 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-C-ED7Euh.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-C-ED7Euh.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-Dyn6lGvZ.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-Dyn6lGvZ.js.map +0 -1
- package/dist/core/web/public/next/assets/SkipToContent-DTxWH085.js +0 -2
- package/dist/core/web/public/next/assets/SkipToContent-DTxWH085.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-DwEchMza.js +0 -2
- package/dist/core/web/public/next/assets/Slider-DwEchMza.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPane-BWVWIGt1.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPane-BWVWIGt1.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPanel-DfYLq-I7.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPanel-DfYLq-I7.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-BThhgW4d.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-BThhgW4d.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-BkY2iVa1.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-BkY2iVa1.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-0bqINoll.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-0bqINoll.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-DGE1hA8U.js +0 -2
- package/dist/core/web/public/next/assets/Surface-DGE1hA8U.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-DqSkrO7I.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-DqSkrO7I.js.map +0 -1
- package/dist/core/web/public/next/assets/Switch-DzbwFVJF.js +0 -2
- package/dist/core/web/public/next/assets/Switch-DzbwFVJF.js.map +0 -1
- package/dist/core/web/public/next/assets/Tag-NKPvC6WH.js +0 -2
- package/dist/core/web/public/next/assets/Tag-NKPvC6WH.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-B6GVYldA.js +0 -26
- package/dist/core/web/public/next/assets/TerminalPane-B6GVYldA.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-C9CCjTDB.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-C9CCjTDB.js.map +0 -1
- package/dist/core/web/public/next/assets/ThinkingBlock-D1tflrrI.js +0 -2
- package/dist/core/web/public/next/assets/ThinkingBlock-D1tflrrI.js.map +0 -1
- package/dist/core/web/public/next/assets/Transcript-DLeoLRca.css +0 -1
- package/dist/core/web/public/next/assets/Transcript.module-CzROOZJo.js +0 -2
- package/dist/core/web/public/next/assets/Transcript.module-CzROOZJo.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-DDCdtE8A.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-DDCdtE8A.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-BbBO21O2.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-BbBO21O2.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-BuPJIMcf.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-BuPJIMcf.js.map +0 -1
- package/dist/core/web/public/next/assets/UsePlaybookAction-BOGWdnK7.js +0 -2
- package/dist/core/web/public/next/assets/UsePlaybookAction-BOGWdnK7.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-wPGkVkCc.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-wPGkVkCc.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseMobileApp-C86LA4dg.js +0 -3
- package/dist/core/web/public/next/assets/VerseMobileApp-C86LA4dg.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseShared-CCeoBq-8.js +0 -2
- package/dist/core/web/public/next/assets/VerseShared-CCeoBq-8.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceHud-BSuRemsd.js +0 -2
- package/dist/core/web/public/next/assets/VoiceHud-BSuRemsd.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceInput-CSSoqpN8.js +0 -2
- package/dist/core/web/public/next/assets/VoiceInput-CSSoqpN8.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-BBWGCTA8.js +0 -2
- package/dist/core/web/public/next/assets/WikiSection-BBWGCTA8.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-BV3l3wGW.css +0 -1
- package/dist/core/web/public/next/assets/Workspace-BLAINcPl.js +0 -6
- package/dist/core/web/public/next/assets/Workspace-BLAINcPl.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-DW8372S_.js +0 -2
- package/dist/core/web/public/next/assets/actions-DW8372S_.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-tools-client-DOdeIAlB.js +0 -2
- package/dist/core/web/public/next/assets/agent-tools-client-DOdeIAlB.js.map +0 -1
- package/dist/core/web/public/next/assets/agents-focus-CPywc_la.js +0 -2
- package/dist/core/web/public/next/assets/agents-focus-CPywc_la.js.map +0 -1
- package/dist/core/web/public/next/assets/app-version-CAMoNgqJ.js +0 -2
- package/dist/core/web/public/next/assets/app-version-CAMoNgqJ.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-ozrnE6z2.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-ozrnE6z2.js.map +0 -1
- package/dist/core/web/public/next/assets/ask-seat-C24LQctL.js +0 -2
- package/dist/core/web/public/next/assets/ask-seat-C24LQctL.js.map +0 -1
- package/dist/core/web/public/next/assets/authority-model-C924ixlm.js +0 -2
- package/dist/core/web/public/next/assets/authority-model-C924ixlm.js.map +0 -1
- package/dist/core/web/public/next/assets/automations-focus-GzNObBH4.js +0 -2
- package/dist/core/web/public/next/assets/automations-focus-GzNObBH4.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-queries-wnFwZf0d.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-wnFwZf0d.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-DGqnhrIN.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-DGqnhrIN.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-DVzJTfES.js +0 -2
- package/dist/core/web/public/next/assets/charts-DVzJTfES.js.map +0 -1
- package/dist/core/web/public/next/assets/chat-pane-data-R55DITMC.js +0 -2
- package/dist/core/web/public/next/assets/chat-pane-data-R55DITMC.js.map +0 -1
- package/dist/core/web/public/next/assets/checkpoint-queries-CK9Sc-ew.js +0 -2
- package/dist/core/web/public/next/assets/checkpoint-queries-CK9Sc-ew.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-C99COqh-.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-C99COqh-.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-Crgyl-5F.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-Crgyl-5F.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-queries-QT9sqpYt.js +0 -2
- package/dist/core/web/public/next/assets/composer-queries-QT9sqpYt.js.map +0 -1
- package/dist/core/web/public/next/assets/connectivity-Ow2TCpN2.js +0 -2
- package/dist/core/web/public/next/assets/connectivity-Ow2TCpN2.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-CBHkEGWm.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-CBHkEGWm.js.map +0 -1
- package/dist/core/web/public/next/assets/control-queries-DpgKLZZ7.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-DpgKLZZ7.js.map +0 -1
- package/dist/core/web/public/next/assets/copy-setup-Pv9zazKp.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-Pv9zazKp.js.map +0 -1
- package/dist/core/web/public/next/assets/deep-link-RA_9gxr7.js +0 -2
- package/dist/core/web/public/next/assets/deep-link-RA_9gxr7.js.map +0 -1
- package/dist/core/web/public/next/assets/device-permissions-CFtizlNI.js +0 -2
- package/dist/core/web/public/next/assets/device-permissions-CFtizlNI.js.map +0 -1
- package/dist/core/web/public/next/assets/devin-queries-BdMbRO0X.js +0 -2
- package/dist/core/web/public/next/assets/devin-queries-BdMbRO0X.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-DAcSkY79.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-DAcSkY79.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-CypuAb32.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-CypuAb32.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-control-queries-CyY4rlLL.js +0 -2
- package/dist/core/web/public/next/assets/fleet-control-queries-CyY4rlLL.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-DhvGhRVd.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-DhvGhRVd.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-state-BXHCR9Z4.js +0 -3
- package/dist/core/web/public/next/assets/fleet-state-BXHCR9Z4.js.map +0 -1
- package/dist/core/web/public/next/assets/focus-trap-DGVye4KY.js +0 -2
- package/dist/core/web/public/next/assets/focus-trap-DGVye4KY.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-CRJidacH.js +0 -5
- package/dist/core/web/public/next/assets/git-model-CRJidacH.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BCRR2nnJ.js +0 -3
- package/dist/core/web/public/next/assets/global-BCRR2nnJ.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-action-BRMXmbT_.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-BRMXmbT_.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-runners-SV5FL41J.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-SV5FL41J.js.map +0 -1
- package/dist/core/web/public/next/assets/health-queries-ulCgM_N-.js +0 -2
- package/dist/core/web/public/next/assets/health-queries-ulCgM_N-.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-pcszdls_.js +0 -2
- package/dist/core/web/public/next/assets/icons-pcszdls_.js.map +0 -1
- package/dist/core/web/public/next/assets/index-BUjFkE-k.js +0 -11
- package/dist/core/web/public/next/assets/index-BUjFkE-k.js.map +0 -1
- package/dist/core/web/public/next/assets/jev-queries-D95PmN18.js +0 -2
- package/dist/core/web/public/next/assets/jev-queries-D95PmN18.js.map +0 -1
- package/dist/core/web/public/next/assets/ladder-queries-DVdVMFWD.js +0 -2
- package/dist/core/web/public/next/assets/ladder-queries-DVdVMFWD.js.map +0 -1
- package/dist/core/web/public/next/assets/leader-focus-DphhDqye.js +0 -2
- package/dist/core/web/public/next/assets/leader-focus-DphhDqye.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model--0BepHTm.js +0 -2
- package/dist/core/web/public/next/assets/live-model--0BepHTm.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-actions-IXVvyQlh.js +0 -2
- package/dist/core/web/public/next/assets/mobile-actions-IXVvyQlh.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-toast-CVOwWiN4.js +0 -2
- package/dist/core/web/public/next/assets/mobile-toast-CVOwWiN4.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-flows-DOil0riK.js +0 -7
- package/dist/core/web/public/next/assets/multimodel-flows-DOil0riK.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-queries-C1J-1wBB.js +0 -2
- package/dist/core/web/public/next/assets/multimodel-queries-C1J-1wBB.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-CrmfkCt7.js +0 -2
- package/dist/core/web/public/next/assets/mutations-CrmfkCt7.js.map +0 -1
- package/dist/core/web/public/next/assets/nav-DNtYaPGH.js +0 -2
- package/dist/core/web/public/next/assets/nav-DNtYaPGH.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-actions-prN6find.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-actions-prN6find.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-model-BEf5boxE.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-model-BEf5boxE.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-CjBhPrPf.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-CjBhPrPf.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-request-C8oTi9ly.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-request-C8oTi9ly.js.map +0 -1
- package/dist/core/web/public/next/assets/overnight-queries-NwxEwM2i.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-NwxEwM2i.js.map +0 -1
- package/dist/core/web/public/next/assets/palette-handoff-CCG7uhBI.js +0 -2
- package/dist/core/web/public/next/assets/palette-handoff-CCG7uhBI.js.map +0 -1
- package/dist/core/web/public/next/assets/panes-DLEh22yn.js +0 -3
- package/dist/core/web/public/next/assets/panes-DLEh22yn.js.map +0 -1
- package/dist/core/web/public/next/assets/path-display-BmDNXLma.js +0 -2
- package/dist/core/web/public/next/assets/path-display-BmDNXLma.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-composer-7rJp3twC.js +0 -2
- package/dist/core/web/public/next/assets/playbook-composer-7rJp3twC.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-focus-B8E3WzHV.js +0 -2
- package/dist/core/web/public/next/assets/playbook-focus-B8E3WzHV.js.map +0 -1
- package/dist/core/web/public/next/assets/playbooks-queries-DQjEIQgH.js +0 -2
- package/dist/core/web/public/next/assets/playbooks-queries-DQjEIQgH.js.map +0 -1
- package/dist/core/web/public/next/assets/preloaded-BDy_vwqB.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-BDy_vwqB.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-C8-XVQKs.js +0 -1
- package/dist/core/web/public/next/assets/pwa-1cEjML6y.js +0 -2
- package/dist/core/web/public/next/assets/pwa-1cEjML6y.js.map +0 -1
- package/dist/core/web/public/next/assets/queries-CHY928bU.js +0 -2
- package/dist/core/web/public/next/assets/queries-CHY928bU.js.map +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-ChmBKsuV.js +0 -2
- package/dist/core/web/public/next/assets/reasoning-pref-ChmBKsuV.js.map +0 -1
- package/dist/core/web/public/next/assets/remote-session-CSFrRCnT.js +0 -3
- package/dist/core/web/public/next/assets/remote-session-CSFrRCnT.js.map +0 -1
- package/dist/core/web/public/next/assets/resolved-store-Cw27MfQ4.js +0 -2
- package/dist/core/web/public/next/assets/resolved-store-Cw27MfQ4.js.map +0 -1
- package/dist/core/web/public/next/assets/resources-queries-DyW4RSn1.js +0 -2
- package/dist/core/web/public/next/assets/resources-queries-DyW4RSn1.js.map +0 -1
- package/dist/core/web/public/next/assets/reveal-anchor-CL5ms09_.js +0 -2
- package/dist/core/web/public/next/assets/reveal-anchor-CL5ms09_.js.map +0 -1
- package/dist/core/web/public/next/assets/sheet-Jmql93Ca.js +0 -2
- package/dist/core/web/public/next/assets/sheet-Jmql93Ca.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-DEG36YxT.js +0 -3
- package/dist/core/web/public/next/assets/slots-DEG36YxT.js.map +0 -1
- package/dist/core/web/public/next/assets/sources-queries-CI0UlBGE.js +0 -4
- package/dist/core/web/public/next/assets/sources-queries-CI0UlBGE.js.map +0 -1
- package/dist/core/web/public/next/assets/sse-CEyzXNma.js +0 -2
- package/dist/core/web/public/next/assets/sse-CEyzXNma.js.map +0 -1
- package/dist/core/web/public/next/assets/stub-panes.module-aBfJsf41.js +0 -3
- package/dist/core/web/public/next/assets/stub-panes.module-aBfJsf41.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-data-CLlkcEWM.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-CLlkcEWM.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-DcKPZWEe.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-DcKPZWEe.js.map +0 -1
- package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js +0 -2
- package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-client-CagF1uyM.js +0 -2
- package/dist/core/web/public/next/assets/terminal-client-CagF1uyM.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-icons-D5DaYLkC.js +0 -2
- package/dist/core/web/public/next/assets/terminal-icons-D5DaYLkC.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-view-Crd7CW9-.js +0 -6
- package/dist/core/web/public/next/assets/terminal-view-Crd7CW9-.js.map +0 -1
- package/dist/core/web/public/next/assets/thread-data-Bom_qVem.js +0 -2
- package/dist/core/web/public/next/assets/thread-data-Bom_qVem.js.map +0 -1
- package/dist/core/web/public/next/assets/tool-semantics-DtFU7rvB.js +0 -8
- package/dist/core/web/public/next/assets/tool-semantics-DtFU7rvB.js.map +0 -1
- package/dist/core/web/public/next/assets/turn-files-BW0SiN39.js +0 -2
- package/dist/core/web/public/next/assets/turn-files-BW0SiN39.js.map +0 -1
- package/dist/core/web/public/next/assets/ui-parts-CLEc9rZw.js +0 -2
- package/dist/core/web/public/next/assets/ui-parts-CLEc9rZw.js.map +0 -1
- package/dist/core/web/public/next/assets/usage-queries-BCactyVH.js +0 -2
- package/dist/core/web/public/next/assets/usage-queries-BCactyVH.js.map +0 -1
- package/dist/core/web/public/next/assets/use-chat-activity-CeNZP1eV.js +0 -2
- package/dist/core/web/public/next/assets/use-chat-activity-CeNZP1eV.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-CvddzFZw.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-CvddzFZw.js.map +0 -1
- package/dist/core/web/public/next/assets/use-ticker-Dn8tdiFx.js +0 -2
- package/dist/core/web/public/next/assets/use-ticker-Dn8tdiFx.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-D0I1qsuh.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-D0I1qsuh.js.map +0 -1
- package/dist/core/web/public/next/assets/useAutoSeat-X5wQjKpa.js +0 -2
- package/dist/core/web/public/next/assets/useAutoSeat-X5wQjKpa.js.map +0 -1
- package/dist/core/web/public/next/assets/useOnboarding-BKfkTSl4.js +0 -2
- package/dist/core/web/public/next/assets/useOnboarding-BKfkTSl4.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatHealth-Ttzd6QkW.js +0 -2
- package/dist/core/web/public/next/assets/useSeatHealth-Ttzd6QkW.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-B7TYzh9s.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-B7TYzh9s.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseSession-BBmZY9hu.js +0 -2
- package/dist/core/web/public/next/assets/useVerseSession-BBmZY9hu.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-Bn_paarS.js +0 -2
- package/dist/core/web/public/next/assets/useVerseTranscript-Bn_paarS.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B-jTQ8nR.js +0 -2
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B-jTQ8nR.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-icons-B64ZcDtc.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-B64ZcDtc.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-CgTjYA0L.js +0 -3
- package/dist/core/web/public/next/assets/warmup-CgTjYA0L.js.map +0 -1
- package/dist/core/web/public/next/assets/wiki-focus-BZQpEuzJ.js +0 -2
- package/dist/core/web/public/next/assets/wiki-focus-BZQpEuzJ.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reveal-anchor-CL5ms09_.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/reveal-anchor.ts"],"sourcesContent":["/**\n * routes/verse/shell/reveal-anchor.ts — \"go to that card\" for any surface\n * (unit C1; C7 cross-unit request 3).\n *\n * Needs-you items, Leader memos and Command cards point INTO a surface\n * (\"memo:m-7\" on Mind, \"seat:claude-a\" on Apps). Whoever raises it calls\n * `setVerseSection(section, anchor)` (or dispatches VERSE_ANCHOR_EVENT); the\n * shell listens once (VerseApp, through shell/anchor-requests.ts) and reveals\n * the element here.\n *\n * WHY WAIT, AND FOR HOW LONG. The target surface may be a lazy chunk that has\n * not loaded, a keep-alive surface un-hiding, or a list still fetching its\n * rows. Two animation frames (C7's own fallback in command/nav.ts) cover the\n * keep-alive case only; a cold chunk takes longer. So this watches the\n * surface's subtree until the element appears, and gives up quietly after\n * ANCHOR_WAIT_MS — a missing anchor is never an error, the operator is\n * already on the right surface.\n *\n * WHICH ELEMENT. C7 stamps `id=\"c7-anchor-<key>\"` (command/nav.ts anchorId);\n * any other owner may stamp `data-verse-anchor=\"<key>\"` instead of adopting\n * C7's id scheme. The search is scoped to `[data-surface=<section>]` so an\n * identically-keyed card on a HIDDEN keep-alive surface never wins.\n */\nimport { anchorId } from '../command/nav.js';\nimport type { VerseAnchorRequest } from '../verse-ui-store.js';\n\nexport const ANCHOR_WAIT_MS = 3_000;\n\nfunction cssEscape(value: string): string {\n return typeof CSS !== 'undefined' && typeof CSS.escape === 'function' ? CSS.escape(value) : value.replace(/[\"\\\\]/g, '\\\\$&');\n}\n\n/** The anchor's element on `section`'s surface, or null when it is not in the DOM (yet). */\nexport function findAnchorElement(section: string, anchor: string, root: ParentNode = document): HTMLElement | null {\n const host = root.querySelector<HTMLElement>(`[data-surface=\"${cssEscape(section)}\"]`);\n if (!host) return null;\n return (\n host.querySelector<HTMLElement>(`#${cssEscape(anchorId(anchor))}`) ??\n host.querySelector<HTMLElement>(`[data-verse-anchor=\"${cssEscape(anchor)}\"]`)\n );\n}\n\nfunction reveal(el: HTMLElement): void {\n if (typeof el.scrollIntoView === 'function') el.scrollIntoView({ block: 'center', behavior: 'smooth' });\n // Keyboard users land ON the card, not just near it. Only an element that\n // can already take focus is focused — the shell never rewrites another\n // unit's tab order to make a div focusable.\n if (el.tabIndex >= 0 || el.matches('a[href],button,input,select,textarea,[tabindex]')) {\n el.focus({ preventScroll: true });\n }\n}\n\n/**\n * Reveal `anchor` on `section`. Resolves true when it was found and scrolled\n * to, false when it did not appear within `waitMs`. Never throws.\n */\nexport function revealAnchor({ section, anchor }: VerseAnchorRequest, waitMs: number = ANCHOR_WAIT_MS): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n const now = findAnchorElement(section, anchor);\n if (now && !now.closest('[hidden]')) {\n reveal(now);\n return Promise.resolve(true);\n }\n return new Promise((resolve) => {\n let done = false;\n const finish = (el: HTMLElement | null) => {\n if (done) return;\n done = true;\n observer.disconnect();\n window.clearTimeout(timer);\n if (el) reveal(el);\n resolve(el !== null);\n };\n const check = () => {\n const el = findAnchorElement(section, anchor);\n // Wait for the surface to be un-hidden too: scrolling a hidden element is a no-op.\n if (el && !el.closest('[hidden]')) finish(el);\n };\n const observer = new MutationObserver(check);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['hidden', 'id', 'data-verse-anchor'] });\n const timer = window.setTimeout(() => finish(null), waitMs);\n check();\n });\n}\n"],"mappings":"sCA0BA,IAAa,EAAiB,IAE9B,SAAS,EAAU,EAAuB,CACxC,OAAO,OAAO,IAAQ,KAAe,OAAO,IAAI,QAAW,WAAa,IAAI,OAAO,CAAK,EAAI,EAAM,QAAQ,SAAU,MAAM,CAC5H,CAGA,SAAgB,EAAkB,EAAiB,EAAgB,EAAmB,SAA8B,CAClH,IAAM,EAAO,EAAK,cAA2B,kBAAkB,EAAU,CAAO,EAAE,GAAG,EAErF,OADK,EAEH,EAAK,cAA2B,IAAI,EAAU,EAAS,CAAM,CAAC,GAAG,GACjE,EAAK,cAA2B,uBAAuB,EAAU,CAAM,EAAE,GAAG,EAH5D,IAKpB,CAEA,SAAS,EAAO,EAAuB,CACjC,OAAO,EAAG,gBAAmB,YAAY,EAAG,eAAe,CAAE,MAAO,SAAU,SAAU,QAAS,CAAC,GAIlG,EAAG,UAAY,GAAK,EAAG,QAAQ,iDAAiD,IAClF,EAAG,MAAM,CAAE,cAAe,EAAK,CAAC,CAEpC,CAMA,SAAgB,EAAa,CAAE,UAAS,UAA8B,EAAiB,EAAkC,CACvH,GAAI,OAAO,SAAa,IAAa,OAAO,QAAQ,QAAQ,EAAK,EACjE,IAAM,EAAM,EAAkB,EAAS,CAAM,EAK7C,OAJI,GAAO,CAAC,EAAI,QAAQ,UAAU,GAChC,EAAO,CAAG,EACH,QAAQ,QAAQ,EAAI,GAEtB,IAAI,QAAS,GAAY,CAC9B,IAAI,EAAO,GACL,EAAU,GAA2B,CACrC,IACJ,EAAO,GACP,EAAS,WAAW,EACpB,OAAO,aAAa,CAAK,EACrB,GAAI,EAAO,CAAE,EACjB,EAAQ,IAAO,IAAI,EACrB,EACM,MAAc,CAClB,IAAM,EAAK,EAAkB,EAAS,CAAM,EAExC,GAAM,CAAC,EAAG,QAAQ,UAAU,GAAG,EAAO,CAAE,CAC9C,EACM,EAAW,IAAI,iBAAiB,CAAK,EAC3C,EAAS,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,QAAS,GAAM,WAAY,GAAM,gBAAiB,CAAC,SAAU,KAAM,mBAAmB,CAAE,CAAC,EAC5I,IAAM,EAAQ,OAAO,eAAiB,EAAO,IAAI,EAAG,CAAM,EAC1D,EAAM,CACR,CAAC,CACH"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,o as n,s as r}from"./index-BUjFkE-k.js";import{t as i}from"./focus-trap-DGVye4KY.js";import{t as a}from"./parts.module-CBkHcD6w.js";var o=e(r(),1),s=e(n(),1),c=t();function l({open:e,onClose:t,title:n,children:r,footer:l,busy:u=!1,role:d=`dialog`}){let f=(0,o.useRef)(null),p=(0,o.useId)(),m=(0,o.useCallback)(()=>{u||t()},[u,t]);return i({open:e,containerRef:f,onClose:m}),e?(0,s.createPortal)((0,c.jsx)(`div`,{className:a.sheetBackdrop,onMouseDown:e=>e.target===e.currentTarget&&m(),children:(0,c.jsxs)(`div`,{ref:f,className:a.sheet,role:d,"aria-modal":`true`,"aria-labelledby":p,tabIndex:-1,children:[(0,c.jsx)(`span`,{className:a.grabber,"aria-hidden":`true`}),(0,c.jsx)(`h2`,{id:p,className:a.sheetTitle,children:n}),(0,c.jsx)(`div`,{className:a.sheetBody,children:r}),l?(0,c.jsx)(`div`,{className:a.sheetFooter,children:l}):null]})}),document.body):null}export{l as t};
|
|
2
|
-
//# sourceMappingURL=sheet-Jmql93Ca.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sheet-Jmql93Ca.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/sheet.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/sheet.tsx — the bottom sheet: grabber, title, a\n * scrolling body and a pinned footer, with the console's focus trap (Escape\n * and the backdrop close it unless it is busy). Off the first paint.\n */\nimport { useCallback, useId, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport styles from './parts.module.css';\n\n// ---------------------------------------------------------------------------\n// Bottom sheet\n// ---------------------------------------------------------------------------\n\nexport interface BottomSheetProps {\n open: boolean;\n onClose: () => void;\n title: ReactNode;\n children: ReactNode;\n footer?: ReactNode;\n /** While busy the backdrop and Escape do not close it. */\n busy?: boolean;\n role?: 'dialog' | 'alertdialog';\n}\n\nexport function BottomSheet({ open, onClose, title, children, footer, busy = false, role = 'dialog' }: BottomSheetProps) {\n const panel = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const close = useCallback(() => {\n if (!busy) onClose();\n }, [busy, onClose]);\n useFocusTrap({ open, containerRef: panel, onClose: close });\n if (!open) return null;\n return createPortal(\n <div className={styles.sheetBackdrop} onMouseDown={(e) => e.target === e.currentTarget && close()}>\n <div ref={panel} className={styles.sheet} role={role} aria-modal=\"true\" aria-labelledby={titleId} tabIndex={-1}>\n <span className={styles.grabber} aria-hidden=\"true\" />\n <h2 id={titleId} className={styles.sheetTitle}>{title}</h2>\n <div className={styles.sheetBody}>{children}</div>\n {footer ? <div className={styles.sheetFooter}>{footer}</div> : null}\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":"qOAyBA,SAAgB,EAAY,CAAE,OAAM,UAAS,QAAO,WAAU,SAAQ,OAAO,GAAO,OAAO,UAA8B,CACvH,IAAM,GAAA,EAAQ,EAAA,OAAA,CAAuB,IAAI,EACnC,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAQ,EAAA,YAAA,KAAkB,CACzB,GAAM,EAAQ,CACrB,EAAG,CAAC,EAAM,CAAO,CAAC,EAGlB,OAFA,EAAa,CAAE,OAAM,aAAc,EAAO,QAAS,CAAM,CAAC,EACrD,GACL,EAAO,EAAA,aAAA,EACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAe,YAAc,GAAM,EAAE,SAAW,EAAE,eAAiB,EAAM,EAC9F,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,IAAK,EAAO,UAAW,EAAO,MAAa,OAAM,aAAW,OAAO,kBAAiB,EAAS,SAAU,GAA5G,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,cAAY,MAAQ,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,WAAa,SAAA,CAAU,CAAA,GAC1D,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UAAY,UAAc,CAAA,EAChD,GAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAc,SAAA,CAAY,CAAA,EAAI,IAC5D,GACF,CAAA,EACL,SAAS,IACX,EAXkB,IAYpB"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PreviewPane-B3V-S2wt.js","assets/global-BCRR2nnJ.js","assets/SkipToContent-DTxWH085.js","assets/VerseConsoleApp-wPGkVkCc.js","assets/RouteErrorBoundary-DvarlJu6.js","assets/percent-text-CSk89zQF.js","assets/VerseShared-CCeoBq-8.js","assets/verse-bootstrap-query-B-jTQ8nR.js","assets/Segmented-wjds-ulG.js","assets/icons-pcszdls_.js","assets/MessageMarkdown-BpTPmenE.js","assets/Transcript.module-CzROOZJo.js","assets/pane-chrome.module-D7o-fVd0.js","assets/terminal-icons-D5DaYLkC.js","assets/global-1SED_aTT.css","assets/SkipToContent-c02H5dmz.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-C5481fH5.css","assets/Segmented-BnjHbKzH.css","assets/Button-DrnKsvnQ.css","assets/EmptyState-B3YUPGaa.css","assets/Transcript-DLeoLRca.css","assets/pane-chrome-8JmEhHVD.css","assets/PreviewPane-DoMsJSG3.css","assets/TerminalPane-C9CCjTDB.js","assets/verse-model-DAOz9LrY.js","assets/compaction-point-VL9oegWS.js","assets/format-V6IiIMAL.js","assets/format-D7nBg2bn.js","assets/seat-readiness-a5B9iqP-.js","assets/ActionMenu--8HwMEm-.js","assets/command-catalog-Crgyl-5F.js","assets/terminal-client-CagF1uyM.js","assets/terminal-view-Crd7CW9-.js","assets/ActionMenu-DPjsLU1g.css","assets/TerminalPane-BwfMbnJz.css","assets/BranchBar-CnUx6S00.js","assets/MutationTokenDialog-ChtiRDO6.js","assets/Dialog-CH48_F95.js","assets/focus-trap-DGVye4KY.js","assets/git-model-CRJidacH.js","assets/use-token-gate-D0I1qsuh.js","assets/GitDialogs-Da1EB6vD.js","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/GitDialogs-ChreZUPG.css","assets/BranchBar-B1I6KeIl.css","assets/DiffPane-CnW8cKzV.js","assets/diff-parser-BnW_HiQm.js","assets/highlight-BCNIvJ85.js","assets/line-diff-B5Eonif2.js","assets/DiffPane.module-CTk5rZn3.js","assets/DiffPane-BAvvbBsf.css","assets/SessionInsightChip-C4wouctG.js","assets/surface-data-CLlkcEWM.js","assets/control-queries-DpgKLZZ7.js","assets/mutations-CrmfkCt7.js","assets/nav-DNtYaPGH.js","assets/mind.module-rVKz51LB.js","assets/colors-DvK0wMHH.js","assets/calendar-day-BxBYHfX1.js","assets/workspace-model-C-q_I8xN.js","assets/mind-B9PzLcl0.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n,t as r}from"./index-BUjFkE-k.js";import{t as i}from"./Button-BiWLAmtW.js";import{t as a}from"./EmptyState-7g6XvSCX.js";var o=e(n(),1),s=t(),c={"branch-bar":{path:`git/BranchBar.tsx`,exportName:`BranchBar`,owner:`C5`,kind:`inline`,label:`Branch bar`},"diff-pane":{path:`git/DiffPane.tsx`,exportName:`DiffPane`,owner:`C5`,kind:`pane`,label:`Review`},"terminal-pane":{path:`dock/terminal/TerminalPane.tsx`,exportName:`TerminalPane`,owner:`C4`,kind:`pane`,label:`Terminal`},"preview-pane":{path:`dock/preview/PreviewPane.tsx`,exportName:`PreviewPane`,owner:`C4`,kind:`pane`,label:`Preview`},"session-insight-chip":{path:`mind/SessionInsightChip.tsx`,exportName:`SessionInsightChip`,owner:`C7`,kind:`inline`,label:`Insight`}};Object.keys(c);var l=Object.assign({"../dock/preview/PreviewPane.tsx":()=>r(()=>import(`./PreviewPane-B3V-S2wt.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23])),"../dock/terminal/TerminalPane.tsx":()=>r(()=>import(`./TerminalPane-C9CCjTDB.js`),__vite__mapDeps([24,1,2,3,4,5,6,7,25,26,27,28,29,30,9,31,12,13,32,33,14,15,16,17,19,34,20,22,35])),"../git/BranchBar.tsx":()=>r(()=>import(`./BranchBar-CnUx6S00.js`),__vite__mapDeps([36,37,1,38,39,3,4,2,5,6,7,27,28,25,26,29,40,9,41,42,14,43,44,16,15,17,19,45,46])),"../git/DiffPane.tsx":()=>r(()=>import(`./DiffPane-CnW8cKzV.js`),__vite__mapDeps([47,2,48,49,8,40,1,6,7,50,9,51,12,15,18,14,19,20,52,22])),"../mind/SessionInsightChip.tsx":()=>r(()=>import(`./SessionInsightChip-C4wouctG.js`),__vite__mapDeps([53,1,27,28,5,25,26,29,54,6,7,55,56,57,3,4,2,58,59,60,61,14,16,15,17,62]))});function u(e,t){return t[`../${c[e].path}`]}function d(e,t=l){return u(e,t)!==void 0}function f(e,t=l){let n=u(e,t);if(!n)return null;let{exportName:r}=c[e];return(0,o.lazy)(async()=>{let t=(await n())[r];if(typeof t!=`function`&&(typeof t!=`object`||!t))throw Error(`${c[e].path} exports no ${r}`);return{default:t}})}var p=new Map;function m(e){return p.has(e)||p.set(e,f(e)),p.get(e)}var h=class extends o.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(e,t){console.error(`[verse] ${this.props.label} failed`,e,t.componentStack)}render(){return this.state.failed?this.props.kind===`inline`?null:(0,s.jsx)(g,{label:this.props.label,onRetry:this.props.onRetry}):this.props.children}};function g({label:e,onRetry:t}){return(0,s.jsx)(a,{compact:!0,tone:`error`,title:`${e} could not load`,body:`The rest of the chat still works.`,action:(0,s.jsx)(i,{variant:`subtle`,size:`sm`,onClick:t,children:`Try again`})})}function _({id:e,props:t,resolve:n=m,forget:r=e=>p.delete(e)}){let[i,a]=(0,o.useState)(0),l=n(e);if(!l)return null;let{kind:u,label:d}=c[e];return(0,s.jsx)(h,{kind:u,label:d,onRetry:()=>{r(e),a(e=>e+1)},children:(0,s.jsx)(o.Suspense,{fallback:null,children:(0,s.jsx)(l,{...t})})},i)}function v(e){return(0,s.jsx)(_,{id:`branch-bar`,props:e})}function y(e){return(0,s.jsx)(_,{id:`diff-pane`,props:e})}function b(e){return(0,s.jsx)(_,{id:`terminal-pane`,props:e})}function x(e){return(0,s.jsx)(_,{id:`preview-pane`,props:e})}function S(e){return(0,s.jsx)(_,{id:`session-insight-chip`,props:e})}export{b as a,S as i,y as n,d as o,x as r,v as t};
|
|
3
|
-
//# sourceMappingURL=slots-DEG36YxT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/slots.tsx"],"sourcesContent":["/**\n * routes/verse/shell/slots.tsx — where Chat mounts other units' UI (unit C0;\n * SPEC-310C §7 \"Slots\").\n *\n * C2 owns the chat, the dock and the header; C4, C5 and C7 own things that\n * render INSIDE them. Rather than C2 importing their files — which would not\n * compile until every one of them landed, and would drag each into C2's\n * chunk — C2 renders these slots. Each resolves ONE fixed file lazily and:\n * - renders nothing until that file lands (and `isSlotAvailable` says so,\n * so C2 can hide the toggle for a pane that does not exist yet);\n * - loads in its own chunk (xterm and the diff viewer stay off the chat's\n * critical path — SPEC-310C budgets: chat critical JS ≤ 350 KB);\n * - is fenced by an error boundary: a crashed inline slot vanishes, a\n * crashed pane says so with a retry — neither takes the chat down.\n *\n * The props below ARE the contract: each owning unit's component takes\n * exactly its slot's props, as a NAMED export (`export function BranchBar`).\n *\n * Resolution uses `import.meta.glob` with literal paths — the same \"absent\n * file is an absent key\" mechanism VerseApp uses for sections.\n */\nimport { Component, Suspense, lazy, useState, type ComponentType, type ErrorInfo, type ReactNode } from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport type { VerseReviewScope, VerseTerminalLaunchVia } from '../../../../core/verse/workbench-types.js';\n\n// ===========================================================================\n// Contracts\n// ===========================================================================\n\n/** Open the Review pane on a root, at a scope (and optionally one file). */\nexport interface DiffPaneRequest {\n root: string;\n scope: VerseReviewScope;\n file?: string;\n}\n\n/** A file the chat's latest turn touched — the Review pane's \"This turn\" scope (C2 derives it from events). */\nexport interface TurnFileChange {\n root: string;\n /** Relative to `root`. */\n path: string;\n}\n\n/** Open the Terminal pane: a tab at `root`, optionally pasting (never running) a command. */\nexport interface TerminalOpenRequest {\n /** Changes on every request, so the same request twice is two opens. */\n nonce: number;\n root?: string;\n /** Force a new tab instead of focusing the root's existing one (⌃⇧`). */\n newTab?: boolean;\n /** \"Run in terminal\": pasted at the prompt, NEVER executed — the operator presses Enter. */\n paste?: string;\n /** Apps [Launch ▸]: the catalog app to launch in the new tab. */\n appId?: string;\n /**\n * With `appId`: HOW to launch it — the app's own CLI (`native`) or through\n * Ollama (`ollama`, with `model` naming the local tag). These mirror\n * VerseTerminalCreateRequest; the page only names the choice, the server\n * resolves the argv from the catalog and the installed binaries\n * (`resolveAppLaunch`) and refuses via/model without an appId.\n */\n via?: VerseTerminalLaunchVia;\n /** With `via: 'ollama'`: the local model tag to launch the app on. */\n model?: string;\n /** Preview's dev-server Start: the server to run in the new tab. */\n devServerId?: string;\n /** 3.15 ⌘K \"Generate command…\": plain words → a command in the focused shell's input editor (never run). */\n assist?: boolean;\n /** 3.15 ⌘K \"Search terminal history…\". */\n history?: boolean;\n /**\n * 3.15: focus this existing tab (a `verse://terminal/<tab>/<block>` link, a\n * notification click, a Needs-you row) and, with `blockId`, show that block.\n */\n tabId?: string;\n blockId?: string;\n /** 3.15: open the launch-configuration dialog (the palette's \"Launch terminal configuration…\"). */\n launch?: boolean;\n}\n\n/** Open the Preview pane on a loopback URL, a chat artifact, or a dev server. */\nexport interface PreviewOpenRequest {\n nonce: number;\n url?: string;\n artifactPath?: string;\n devServerId?: string;\n}\n\n/** C5 `git/BranchBar.tsx` → `export function BranchBar(props: BranchBarProps)` — above the composer. */\nexport interface BranchBarProps {\n sessionId: string;\n /** The chat's roots in priority order; the bar shows one row per root with changes, then \"Show N more\". */\n roots: readonly string[];\n /** The ± counts open the branch diff: C2 opens the dock's Review pane with this. */\n onOpenDiff: (request: DiffPaneRequest) => void;\n}\n\n/** C5 `git/DiffPane.tsx` → `export function DiffPane(props: DiffPaneProps)` — the dock's Review pane. */\nexport interface DiffPaneProps {\n sessionId: string;\n roots: readonly string[];\n /** Latest open request; null = the pane chooses (Uncommitted, first root with changes). */\n request: (DiffPaneRequest & { nonce: number }) | null;\n turnFiles: readonly TurnFileChange[];\n /** \"Add to message\": drafts `path:line: note` into the composer (⌘Enter sends). */\n onAddToMessage: (text: string) => void;\n /** False while the pane is a background tab — stop timers, skip work. */\n visible: boolean;\n}\n\n/** C4 `dock/terminal/TerminalPane.tsx` → `export function TerminalPane(props: TerminalPaneProps)`. */\nexport interface TerminalPaneProps {\n sessionId: string;\n roots: readonly string[];\n request: TerminalOpenRequest | null;\n /** \"Send selection to chat\": the text, already fenced as a code block. */\n onSendToChat: (text: string) => void;\n visible: boolean;\n}\n\n/** C4 `dock/preview/PreviewPane.tsx` → `export function PreviewPane(props: PreviewPaneProps)`. */\nexport interface PreviewPaneProps {\n sessionId: string;\n roots: readonly string[];\n request: PreviewOpenRequest | null;\n /** Dev-server Start runs the server in a terminal tab — through the dock, never directly. */\n onOpenTerminal: (request: Omit<TerminalOpenRequest, 'nonce'>) => void;\n visible: boolean;\n}\n\n/** C7 `mind/SessionInsightChip.tsx` → `export function SessionInsightChip(props)` — the chat header chip. */\nexport interface SessionInsightChipProps {\n sessionId: string;\n}\n\nexport interface SlotPropsMap {\n 'branch-bar': BranchBarProps;\n 'diff-pane': DiffPaneProps;\n 'terminal-pane': TerminalPaneProps;\n 'preview-pane': PreviewPaneProps;\n 'session-insight-chip': SessionInsightChipProps;\n}\n\nexport type SlotId = keyof SlotPropsMap;\n\n/**\n * Each slot's fixed file (relative to routes/verse), its named export, its\n * owner, and how a crash is shown: an INLINE slot vanishes; a PANE fills the\n * dock, so it says it failed and offers a retry.\n */\nexport const SLOTS = {\n 'branch-bar': { path: 'git/BranchBar.tsx', exportName: 'BranchBar', owner: 'C5', kind: 'inline', label: 'Branch bar' },\n 'diff-pane': { path: 'git/DiffPane.tsx', exportName: 'DiffPane', owner: 'C5', kind: 'pane', label: 'Review' },\n 'terminal-pane': { path: 'dock/terminal/TerminalPane.tsx', exportName: 'TerminalPane', owner: 'C4', kind: 'pane', label: 'Terminal' },\n 'preview-pane': { path: 'dock/preview/PreviewPane.tsx', exportName: 'PreviewPane', owner: 'C4', kind: 'pane', label: 'Preview' },\n 'session-insight-chip': { path: 'mind/SessionInsightChip.tsx', exportName: 'SessionInsightChip', owner: 'C7', kind: 'inline', label: 'Insight' },\n} as const satisfies Record<SlotId, { path: string; exportName: string; owner: string; kind: 'inline' | 'pane'; label: string }>;\n\nexport const SLOT_IDS = Object.keys(SLOTS) as SlotId[];\n\n// ===========================================================================\n// Resolution\n// ===========================================================================\n\ntype Importer = () => Promise<unknown>;\n\n/**\n * Every slot file that exists at build time, keyed `../<path>`. Literal\n * patterns (no wildcards): a slot may only ever load its owner's one file.\n * EXPORTED for the slot test, which checks it against SLOTS.\n */\nexport const SLOT_MODULES: Record<string, Importer> = import.meta.glob([\n '../git/BranchBar.tsx',\n '../git/DiffPane.tsx',\n '../dock/terminal/TerminalPane.tsx',\n '../dock/preview/PreviewPane.tsx',\n '../mind/SessionInsightChip.tsx',\n]);\n\nfunction importerFor(id: SlotId, modules: Record<string, Importer>): Importer | undefined {\n return modules[`../${SLOTS[id].path}`];\n}\n\n/** True once the slot's file has landed in this build. */\nexport function isSlotAvailable(id: SlotId, modules: Record<string, Importer> = SLOT_MODULES): boolean {\n return importerFor(id, modules) !== undefined;\n}\n\ntype AnyComponent = ComponentType<Record<string, unknown>>;\n\n/**\n * Build the lazy component for one slot. Absent → renders nothing. Present\n * but exporting no component of the contract name → throws on load, so the\n * boundary shows it (a slot that silently renders nothing because of a typo\n * would look exactly like \"not landed yet\").\n */\nexport function createSlotComponent(id: SlotId, modules: Record<string, Importer> = SLOT_MODULES): AnyComponent | null {\n const importer = importerFor(id, modules);\n if (!importer) return null;\n const { exportName } = SLOTS[id];\n return lazy(async () => {\n const mod = (await importer()) as Record<string, unknown>;\n const exported = mod[exportName];\n if (typeof exported !== 'function' && (typeof exported !== 'object' || exported === null)) {\n throw new Error(`${SLOTS[id].path} exports no ${exportName}`);\n }\n return { default: exported as AnyComponent };\n });\n}\n\n// One lazy component per slot for the life of the page: re-creating it per\n// render would remount the pane (and drop a terminal's scrollback) each time.\nconst RESOLVED = new Map<SlotId, AnyComponent | null>();\nfunction slotComponent(id: SlotId): AnyComponent | null {\n if (!RESOLVED.has(id)) RESOLVED.set(id, createSlotComponent(id));\n return RESOLVED.get(id)!;\n}\n\n// ===========================================================================\n// Rendering\n// ===========================================================================\n\ninterface BoundaryProps {\n kind: 'inline' | 'pane';\n label: string;\n /** Drop the cached module and mount a fresh boundary (a failed lazy import stays failed otherwise). */\n onRetry: () => void;\n children: ReactNode;\n}\n\nclass SlotBoundary extends Component<BoundaryProps, { failed: boolean }> {\n override state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n // The console, not the page: operator copy never carries a stack or a path.\n console.error(`[verse] ${this.props.label} failed`, error, info.componentStack);\n }\n\n override render(): ReactNode {\n if (!this.state.failed) return this.props.children;\n if (this.props.kind === 'inline') return null;\n return <PaneFailed label={this.props.label} onRetry={this.props.onRetry} />;\n }\n}\n\nfunction PaneFailed({ label, onRetry }: { label: string; onRetry: () => void }) {\n return (\n <EmptyState\n compact\n tone=\"error\"\n title={`${label} could not load`}\n body=\"The rest of the chat still works.\"\n action={\n <Button variant=\"subtle\" size=\"sm\" onClick={onRetry}>\n Try again\n </Button>\n }\n />\n );\n}\n\nfunction SlotHost<K extends SlotId>({\n id,\n props,\n resolve = slotComponent,\n forget = (slot: SlotId) => RESOLVED.delete(slot),\n}: {\n id: K;\n props: SlotPropsMap[K];\n resolve?: (id: SlotId) => AnyComponent | null;\n forget?: (id: SlotId) => void;\n}) {\n const [attempt, setAttempt] = useState(0);\n const Resolved = resolve(id);\n if (!Resolved) return null;\n const { kind, label } = SLOTS[id];\n const retry = () => {\n forget(id);\n setAttempt((n) => n + 1);\n };\n return (\n // A new key per attempt: a fresh boundary AND a fresh lazy component.\n <SlotBoundary key={attempt} kind={kind} label={label} onRetry={retry}>\n <Suspense fallback={null}>\n <Resolved {...(props as unknown as Record<string, unknown>)} />\n </Suspense>\n </SlotBoundary>\n );\n}\n\n/** Test seam: render a slot against an injected module map (fake landed / absent / broken files). */\nexport function SlotForTest<K extends SlotId>({ id, props, modules }: { id: K; props: SlotPropsMap[K]; modules: Record<string, Importer> }) {\n const [cache] = useState(() => new Map<SlotId, AnyComponent | null>());\n const resolve = (slot: SlotId) => {\n if (!cache.has(slot)) cache.set(slot, createSlotComponent(slot, modules));\n return cache.get(slot)!;\n };\n return <SlotHost id={id} props={props} resolve={resolve} forget={(slot) => cache.delete(slot)} />;\n}\n\nexport function BranchBarSlot(props: BranchBarProps) {\n return <SlotHost id=\"branch-bar\" props={props} />;\n}\n\nexport function DiffPaneSlot(props: DiffPaneProps) {\n return <SlotHost id=\"diff-pane\" props={props} />;\n}\n\nexport function TerminalPaneSlot(props: TerminalPaneProps) {\n return <SlotHost id=\"terminal-pane\" props={props} />;\n}\n\nexport function PreviewPaneSlot(props: PreviewPaneProps) {\n return <SlotHost id=\"preview-pane\" props={props} />;\n}\n\nexport function SessionInsightChipSlot(props: SessionInsightChipProps) {\n return <SlotHost id=\"session-insight-chip\" props={props} />;\n}\n"],"file":"slots-DEG36YxT.js"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{C as e,M as t,a as n}from"./global-BCRR2nnJ.js";import{t as r}from"./diff-parser-BnW_HiQm.js";import{r as i}from"./VerseShared-CCeoBq-8.js";import{c as a,l as o,o as s,u as c}from"./tool-semantics-DtFU7rvB.js";function l(){return{facts:new Map,counts:new Map,toolText:new Map}}function u(e,t){let n=t?.facts.get(e.toolUseId);if(n&&!(n.pending&&e.result!==null))return n;let r=s({name:e.name,input:e.input,result:e.result});return t&&(t.facts.set(e.toolUseId,r),t.counts.delete(e.toolUseId),t.toolText.delete(e.toolUseId)),r}function d(e){return`verse-note-${e.replace(/[^A-Za-z0-9_-]/g,``)}`}function f(e){return`verse-turn-${e.replace(/[^A-Za-z0-9_-]/g,``)}`}var p={read:0,edit:1,create:2,delete:3};function m(e){let t=0,n=0;for(let i of r(e).files)t+=i.additions,n+=i.deletions;return{additions:t,deletions:n}}function h(e,t,n){let r=n?.counts.get(e);if(r)return r;let i=m(t);return n?.counts.set(e,i),i}function g(e){return e.kind===`thinking`?[e]:e.kind===`toolGroup`?e.items.filter(e=>e.kind===`thinking`):[]}function _(e){return e.kind===`tool`?[e]:e.kind===`toolGroup`?e.items.filter(e=>e.kind===`tool`):[]}function v(e,t=null){let n=new Map,r=[],i=[],a=[],o=()=>{a.length!==0&&(i.push(y(a,n,r,t)),a=[])},s;for(let t of e){let e=`turnId`in t?t.turnId:null;(t.kind===`user`||s!==void 0&&e!==null&&e!==s)&&o(),(t.kind===`user`||s===void 0||e!==null)&&(s=e),a.push(t)}return o(),{turns:i,facts:n,errorAnchors:r}}function y(e,t,n,r){let i=e[0],s=new Map,l=0,f=0,m=0,v=null,y=`running`,x=null,S=null,C=[],w=c(),T={shown:0,hidden:0,durationMs:null,tokens:null},E=e=>{m++,v||=e,n.push(e)};for(let n of e){n.kind===`user`&&S===null&&(S=n.text);for(let e of g(n)){let t=e.redacted||e.text.trim().length===0;t?T.hidden++:T.shown++,e.durationMs!==null&&(T.durationMs=(T.durationMs??0)+e.durationMs);let n=e.estimatedTokens??(t?null:Math.ceil(e.text.trim().length/4));n!==null&&(T.tokens=(T.tokens??0)+n)}n.kind===`source`&&n.turnId!==null&&C.push(n.source);for(let e of _(n)){l++;let n=u(e,r);t.set(e.toolUseId,n),n.action===`command`&&f++,n.failed&&E(`verse-tool-${e.toolUseId.replace(/[^A-Za-z0-9_-]/g,``)}`);for(let t of n.sources)C.push(t.toolUseId?t:{...t,toolUseId:e.toolUseId});b(w,n);let i=n.action;if(i!==`read`&&i!==`edit`&&i!==`create`&&i!==`delete`)continue;let a=n.diff?h(e.toolUseId,n.diff.text,r):{additions:0,deletions:0};for(let t of n.paths){let r=s.get(t)??{path:t,reads:0,edits:0,creates:0,deletes:0,action:i,anchorToolUseId:e.toolUseId,additions:0,deletions:0,failed:!1};i===`read`?r.reads++:i===`edit`?r.edits++:i===`create`?r.creates++:r.deletes++,p[i]>p[r.action]&&(r.action=i,r.anchorToolUseId=e.toolUseId),i!==`read`&&(r.additions+=a.additions,r.deletions+=a.deletions),n.failed&&(r.failed=!0),s.set(t,r)}}switch(n.kind){case`error`:E(d(n.key)),y=`error`;break;case`cancelled`:y=`stopped`;break;case`turn-done`:x=n.durationMs>0?n.durationMs:x,n.ok?y=y===`running`?`ok`:y:y===`running`&&(y=`error`,E(d(n.key)))}}let D=0,O=0;for(let e of s.values())e.action===`read`?w.filesRead++:e.action===`edit`?w.filesEdited++:e.action===`create`?w.filesCreated++:w.filesDeleted++,D+=e.additions,O+=e.deletions;(D>0||O>0)&&(w.additions=D,w.deletions=O);let k=a(C);return w.sources=k.length,w.thoughts=T.shown,w.hiddenThoughts=T.hidden,{key:i.key,turnId:`turnId`in i?i.turnId:null,items:e,prompt:S,at:i.at,citations:k,stats:w,work:o(w),reasoning:T,files:[...s.values()].sort((e,t)=>p[t.action]-p[e.action]||t.additions+t.deletions-(e.additions+e.deletions)||e.path.localeCompare(t.path)),toolCount:l,commandCount:f,errorCount:m,firstErrorAnchor:v,status:y,durationMs:x}}function b(e,t){switch(t.action){case`command`:e.commands++,t.failed&&e.commandsFailed++;break;case`search`:e.codeSearches++;break;case`web`:e.webLookups++;break;case`task`:e.subagents++;break;case`other`:e.otherTools++}t.failed&&e.failed++}function x(e){if(e.length===0)return``;let t={edited:0,created:0,deleted:0,read:0};for(let n of e)n.action===`edit`?t.edited++:n.action===`create`?t.created++:n.action===`delete`?t.deleted++:t.read++;let n=[];return t.created&&n.push(`${t.created} created`),t.edited&&n.push(`${t.edited} edited`),t.deleted&&n.push(`${t.deleted} deleted`),t.read&&n.push(`${t.read} read`),n.join(`, `)}var S=new WeakMap,C=4e3;function w(e,t){let n=t?.toolText.get(e.toolUseId);if(n!==void 0)return n;let r=[e.name];if(typeof e.input==`string`)r.push(e.input.slice(0,C));else if(e.input)try{r.push(JSON.stringify(e.input).slice(0,C))}catch{}e.result&&r.push(e.result.output.slice(0,C));let i=r.join(`
|
|
2
|
-
`);return t&&e.result&&t.toolText.set(e.toolUseId,i),i}function T(e,t=null){let n=S.get(e);if(n!==void 0)return n;let r=[],i=e=>{switch(e.kind){case`user`:case`assistant`:case`thinking`:r.push(e.text);break;case`error`:r.push(e.message);break;case`tool`:r.push(w(e,t));break;case`toolGroup`:for(let t of e.items)i(t)}};for(let t of e.items)i(t);let a=r.join(`
|
|
3
|
-
`);return S.set(e,a),a}var E=48;function D(e,t,n=null){let r=t.trim().toLowerCase();if(r.length===0)return[];let i=[];for(let t of e){let e=T(t,n),a=e.toLowerCase().indexOf(r);if(a===-1)continue;let o=Math.max(0,a-E),s=Math.min(e.length,a+r.length+E),c=`${o>0?`…`:``}${e.slice(o,s).replace(/\s+/g,` `).trim()}${s<e.length?`…`:``}`;i.push({turnKey:t.key,snippet:c})}return i}function O(e,t=72){let n=e.prompt?.replace(/\s+/g,` `).trim();return n?n.length>t?`${n.slice(0,t-1)}…`:n:e.toolCount>0?`${e.toolCount} tool call${e.toolCount===1?``:`s`}`:`Session note`}var k=`/api/verse/sources/open`;function A(){let t=e();if(!t)throw new i;return t}async function j(e,r,i){await n(k,i===void 0?{sessionId:e,path:r}:{sessionId:e,path:r,line:i},A()),t()}export{x as a,f as c,l as i,O as l,v as n,d as o,m as r,D as s,j as t};
|
|
4
|
-
//# sourceMappingURL=sources-queries-CI0UlBGE.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sources-queries-CI0UlBGE.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/turn-model.ts","../../../../../../src/web-ui/routes/verse/reasoning/sources-queries.ts"],"sourcesContent":["/**\n * routes/verse/chat/turn-model.ts — a session as a list of TURNS.\n *\n * `verse-transcript.groupTranscriptItems()` already folds runs of tool calls into\n * one summary row; what it does not do is say where one exchange ends and\n * the next begins. Everything this file exists for needs that boundary: the\n * per-turn file-activity summary (the blast radius of one ask), the outline\n * that makes a fifty-turn session navigable, keyboard movement between\n * turns, and \"jump to the first error in this turn\".\n *\n * Pure over `groupTranscriptItems()`'s output — no React, no DOM, no\n * fetching — so the numbers in the summary can be tested directly against an\n * event log.\n */\nimport type { VerseSource } from '../../../../core/verse/types.js';\nimport { collateSources, describeTurnWork, emptyTurnStats, type VerseCitation, type VerseTurnStats } from '../../../../core/verse/trace.js';\nimport { parseUnifiedDiff } from '../../inbox/diff-parser.js';\nimport type { ToolGroupItem, TranscriptItem, TranscriptRenderItem } from '../verse-store.js';\nimport { readToolFacts, type ToolAction, type ToolFacts } from './tool-semantics.js';\n\nexport type TurnStatus = 'running' | 'ok' | 'error' | 'stopped';\n\n/**\n * Work that survives a transcript rebuild.\n *\n * `buildTurns` runs on EVERY streamed token: `useVerseSession` rebuilds\n * `state.events` per event, `buildTranscript` allocates fresh item objects from\n * it, and both of Transcript's memos therefore miss. Without this, every delta\n * re-derived the semantics of every tool call in the session — including a full\n * LCS diff per Edit payload, which allocates an `Int32Array` up to the 1200-line\n * cap. Fifty moderate edits cost hundreds of milliseconds of main-thread work\n * per frame, on the one surface whose frame budget is already spoken for.\n *\n * Caching is sound because `toolUseId` is a stable identity and a tool call's\n * `{name, input, result}` is immutable ONCE ITS RESULT HAS LANDED\n * (`verse-transcript.buildTranscript` replaces the item object exactly once, when the\n * `tool-result` event arrives). A cached entry derived while the call was still\n * pending is therefore the only one that can go stale, and it is the only one\n * recomputed.\n */\nexport interface TurnCache {\n facts: Map<string, ToolFacts>;\n /** `countDiffLines` over the same immutable diff text. */\n counts: Map<string, { additions: number; deletions: number }>;\n /** Flattened searchable text per tool call — the expensive half of the index. */\n toolText: Map<string, string>;\n}\n\nexport function createTurnCache(): TurnCache {\n return { facts: new Map(), counts: new Map(), toolText: new Map() };\n}\n\n/**\n * Facts for one tool call, reusing the cached instance whenever it is still\n * valid. Exported so a test can assert the second build recomputes nothing.\n */\nexport function cachedToolFacts(\n tool: { toolUseId: string; name: string; input: unknown; result: { output: string; isError: boolean } | null },\n cache: TurnCache | null,\n): ToolFacts {\n const hit = cache?.facts.get(tool.toolUseId);\n // A pending entry must be recomputed once the result lands; anything else is\n // derived from data that can no longer change.\n if (hit && !(hit.pending && tool.result !== null)) return hit;\n const fact = readToolFacts({ name: tool.name, input: tool.input, result: tool.result });\n if (cache) {\n cache.facts.set(tool.toolUseId, fact);\n cache.counts.delete(tool.toolUseId);\n cache.toolText.delete(tool.toolUseId);\n }\n return fact;\n}\n\nexport interface TurnFileEntry {\n path: string;\n reads: number;\n edits: number;\n creates: number;\n deletes: number;\n /** The strongest thing that happened to it: delete > create > edit > read. */\n action: Extract<ToolAction, 'read' | 'edit' | 'create' | 'delete'>;\n /** Tool call to scroll to when the row is clicked. */\n anchorToolUseId: string;\n /** Summed from the diffs the calls carried; 0 when none did. */\n additions: number;\n deletions: number;\n /** At least one call touching this file failed. */\n failed: boolean;\n}\n\nexport interface TurnBlock {\n key: string;\n turnId: string | null;\n items: TranscriptRenderItem[];\n /** The ask that opened the turn, for the outline. */\n prompt: string | null;\n /** ISO stamp of the first item. */\n at: string;\n files: TurnFileEntry[];\n toolCount: number;\n commandCount: number;\n /** Failing tool calls plus logged errors. */\n errorCount: number;\n /** Id of the first failing thing in the turn, for jump-to-error. */\n firstErrorAnchor: string | null;\n status: TurnStatus;\n durationMs: number | null;\n /**\n * V3.15: what this turn drew on, numbered in order of first use — files\n * read (with line ranges), pages fetched, searches run, plus any source the\n * engine or seat reported. De-duplicated within the turn.\n */\n citations: VerseCitation[];\n /** V3.15: counts behind the turn's one-line summary. */\n stats: VerseTurnStats;\n /** V3.15: \"Read 8 files · edited 3 files (+42 −7) · ran 4 commands\" — empty when the turn did no tool work. */\n work: string;\n /** V3.15: the turn's reasoning, totalled. Unknown figures are null, never 0. */\n reasoning: TurnReasoning;\n}\n\nexport interface TurnReasoning {\n /** Blocks with text. */\n shown: number;\n /** Blocks the provider withheld (redacted markers). */\n hidden: number;\n /** Summed over blocks that reported a duration; null when none did. */\n durationMs: number | null;\n /** Summed reasoning tokens (the CLI's estimate, else ~chars/4); null when nothing to count. */\n tokens: number | null;\n}\n\nexport interface TurnModel {\n turns: TurnBlock[];\n /** Facts keyed by toolUseId, so the cards do not re-derive them. */\n facts: Map<string, ToolFacts>;\n /** Every error anchor in document order — the transcript-level jump list. */\n errorAnchors: string[];\n}\n\n/** DOM id for a note (error / stopped / turn-done) so it can be scrolled to. */\nexport function noteAnchorId(key: string): string {\n return `verse-note-${key.replace(/[^A-Za-z0-9_-]/g, '')}`;\n}\n\n/** DOM id for one turn section. */\nexport function turnAnchorId(key: string): string {\n return `verse-turn-${key.replace(/[^A-Za-z0-9_-]/g, '')}`;\n}\n\nconst STRENGTH: Record<TurnFileEntry['action'], number> = { read: 0, edit: 1, create: 2, delete: 3 };\n\n/**\n * Additions/deletions for a unified diff, summed across every file in it.\n *\n * This was a flat scan that skipped any line starting with `---` or `+++` as a\n * file header. Inside a hunk those prefixes are CONTENT, not structure: a\n * deleted line reading `-- a/x` is emitted as `--- a/x`, a Markdown `---` rule\n * deleted is `----`, and a diff of a diff — what editing a `.patch` fixture or\n * running `git diff` over one produces — is made almost entirely of them. Every\n * such line was dropped, so the `+N −M` on the collapsed tool card undercounted\n * exactly the changes that are hardest to eyeball.\n *\n * Delegating to the shared parser (`routes/inbox/diff-parser.ts`) fixes that\n * and retires the second diff dialect: `DiffBlock` renders `file.additions` /\n * `file.deletions` out of this same parse, so the badge on the summary line and\n * the stats in the expanded block are now the same numbers by construction\n * rather than by two implementations happening to agree.\n *\n * Cost is real but bounded and paid once: `cachedDiffCounts` memoizes by\n * `toolUseId`, and the text is capped at `MAX_FACT_TEXT_CHARS` upstream.\n */\nexport function countDiffLines(text: string): { additions: number; deletions: number } {\n let additions = 0;\n let deletions = 0;\n for (const file of parseUnifiedDiff(text).files) {\n additions += file.additions;\n deletions += file.deletions;\n }\n return { additions, deletions };\n}\n\n/** `countDiffLines` over text that cannot change once cached. */\nfunction cachedDiffCounts(\n toolUseId: string,\n text: string,\n cache: TurnCache | null,\n): { additions: number; deletions: number } {\n const hit = cache?.counts.get(toolUseId);\n if (hit) return hit;\n const counts = countDiffLines(text);\n cache?.counts.set(toolUseId, counts);\n return counts;\n}\n\nfunction thinkingMembers(item: TranscriptRenderItem): Array<Extract<TranscriptItem, { kind: 'thinking' }>> {\n if (item.kind === 'thinking') return [item];\n if (item.kind === 'toolGroup') {\n return (item as ToolGroupItem).items.filter((m): m is Extract<TranscriptItem, { kind: 'thinking' }> => m.kind === 'thinking');\n }\n return [];\n}\n\nfunction toolMembers(item: TranscriptRenderItem): Array<Extract<TranscriptItem, { kind: 'tool' }>> {\n if (item.kind === 'tool') return [item];\n if (item.kind === 'toolGroup') {\n return (item as ToolGroupItem).items.filter((m): m is Extract<TranscriptItem, { kind: 'tool' }> => m.kind === 'tool');\n }\n return [];\n}\n\n/**\n * A new turn opens on a `user` item, or on any item whose turnId differs\n * from the one being accumulated. Items that arrive before the first user\n * message (a resumed session's tail, a session-level error with a null\n * turnId) collect into a leading block rather than being dropped.\n */\nexport function buildTurns(\n items: readonly TranscriptRenderItem[],\n cache: TurnCache | null = null,\n): TurnModel {\n const facts = new Map<string, ToolFacts>();\n const errorAnchors: string[] = [];\n const turns: TurnBlock[] = [];\n\n let current: TranscriptRenderItem[] = [];\n const flush = () => {\n if (current.length === 0) return;\n turns.push(makeTurn(current, facts, errorAnchors, cache));\n current = [];\n };\n\n let turnId: string | null | undefined;\n for (const item of items) {\n const itemTurn = 'turnId' in item ? item.turnId : null;\n const boundary = item.kind === 'user' || (turnId !== undefined && itemTurn !== null && itemTurn !== turnId);\n if (boundary) flush();\n if (item.kind === 'user' || turnId === undefined || itemTurn !== null) turnId = itemTurn;\n current.push(item);\n }\n flush();\n\n return { turns, facts, errorAnchors };\n}\n\nfunction makeTurn(\n items: TranscriptRenderItem[],\n facts: Map<string, ToolFacts>,\n errorAnchors: string[],\n cache: TurnCache | null,\n): TurnBlock {\n const first = items[0]!;\n const byPath = new Map<string, TurnFileEntry>();\n let toolCount = 0;\n let commandCount = 0;\n let errorCount = 0;\n let firstErrorAnchor: string | null = null;\n let status: TurnStatus = 'running';\n let durationMs: number | null = null;\n let prompt: string | null = null;\n\n const sources: VerseSource[] = [];\n const stats = emptyTurnStats();\n const reasoning: TurnReasoning = { shown: 0, hidden: 0, durationMs: null, tokens: null };\n\n const noteError = (anchor: string) => {\n errorCount++;\n if (!firstErrorAnchor) firstErrorAnchor = anchor;\n errorAnchors.push(anchor);\n };\n\n for (const item of items) {\n if (item.kind === 'user' && prompt === null) prompt = item.text;\n\n for (const thought of thinkingMembers(item)) {\n const hidden = thought.redacted || thought.text.trim().length === 0;\n if (hidden) reasoning.hidden++;\n else reasoning.shown++;\n if (thought.durationMs !== null) reasoning.durationMs = (reasoning.durationMs ?? 0) + thought.durationMs;\n const tokens = thought.estimatedTokens ?? (hidden ? null : Math.ceil(thought.text.trim().length / 4));\n if (tokens !== null) reasoning.tokens = (reasoning.tokens ?? 0) + tokens;\n }\n if (item.kind === 'source' && item.turnId !== null) sources.push(item.source);\n\n for (const tool of toolMembers(item)) {\n toolCount++;\n const fact = cachedToolFacts(tool, cache);\n facts.set(tool.toolUseId, fact);\n if (fact.action === 'command') commandCount++;\n if (fact.failed) noteError(`verse-tool-${tool.toolUseId.replace(/[^A-Za-z0-9_-]/g, '')}`);\n for (const source of fact.sources) sources.push(source.toolUseId ? source : { ...source, toolUseId: tool.toolUseId });\n tallyAction(stats, fact);\n\n const action = fact.action;\n if (action !== 'read' && action !== 'edit' && action !== 'create' && action !== 'delete') continue;\n const counts = fact.diff ? cachedDiffCounts(tool.toolUseId, fact.diff.text, cache) : { additions: 0, deletions: 0 };\n for (const path of fact.paths) {\n const entry = byPath.get(path) ?? {\n path,\n reads: 0, edits: 0, creates: 0, deletes: 0,\n action,\n anchorToolUseId: tool.toolUseId,\n additions: 0, deletions: 0,\n failed: false,\n };\n if (action === 'read') entry.reads++;\n else if (action === 'edit') entry.edits++;\n else if (action === 'create') entry.creates++;\n else entry.deletes++;\n if (STRENGTH[action] > STRENGTH[entry.action]) {\n entry.action = action;\n // The row should land on the call that CHANGED the file, not on the\n // read that happened to come first.\n entry.anchorToolUseId = tool.toolUseId;\n }\n if (action !== 'read') {\n entry.additions += counts.additions;\n entry.deletions += counts.deletions;\n }\n if (fact.failed) entry.failed = true;\n byPath.set(path, entry);\n }\n }\n\n switch (item.kind) {\n case 'error':\n noteError(noteAnchorId(item.key));\n status = 'error';\n break;\n case 'cancelled':\n status = 'stopped';\n break;\n case 'turn-done':\n durationMs = item.durationMs > 0 ? item.durationMs : durationMs;\n // A stop already explained itself; `ok:false` after it is not a\n // second failure (the same rule Transcript's `explained` set uses).\n if (item.ok) status = status === 'running' ? 'ok' : status;\n else if (status === 'running') {\n status = 'error';\n noteError(noteAnchorId(item.key));\n }\n break;\n default:\n break;\n }\n }\n\n let additions = 0;\n let deletions = 0;\n for (const entry of byPath.values()) {\n if (entry.action === 'read') stats.filesRead++;\n else if (entry.action === 'edit') stats.filesEdited++;\n else if (entry.action === 'create') stats.filesCreated++;\n else stats.filesDeleted++;\n additions += entry.additions;\n deletions += entry.deletions;\n }\n if (additions > 0 || deletions > 0) {\n stats.additions = additions;\n stats.deletions = deletions;\n }\n const citations = collateSources(sources);\n stats.sources = citations.length;\n stats.thoughts = reasoning.shown;\n stats.hiddenThoughts = reasoning.hidden;\n\n return {\n key: first.key,\n turnId: 'turnId' in first ? first.turnId : null,\n items,\n prompt,\n at: first.at,\n citations,\n stats,\n work: describeTurnWork(stats),\n reasoning,\n // Strongest action first. The map is in first-touch order, and an agentic\n // turn reads widely before editing narrowly — so in read order the three\n // edits in a 40-file turn sit behind \"Show 35 more files\", hiding exactly\n // the rows whose `+N −M` justified the summary in the first place.\n files: [...byPath.values()].sort(\n (a, b) =>\n STRENGTH[b.action] - STRENGTH[a.action] ||\n b.additions + b.deletions - (a.additions + a.deletions) ||\n a.path.localeCompare(b.path),\n ),\n toolCount,\n commandCount,\n errorCount,\n firstErrorAnchor,\n status,\n durationMs,\n };\n}\n\n/** Count one tool call into the turn's summary (files are counted from the per-path map). */\nfunction tallyAction(stats: VerseTurnStats, fact: ToolFacts): void {\n switch (fact.action) {\n case 'command':\n stats.commands++;\n if (fact.failed) stats.commandsFailed++;\n break;\n case 'search':\n stats.codeSearches++;\n break;\n case 'web':\n stats.webLookups++;\n break;\n case 'task':\n stats.subagents++;\n break;\n case 'other':\n stats.otherTools++;\n break;\n default:\n break;\n }\n if (fact.failed) stats.failed++;\n}\n\n/** `12 files · 4 edited, 8 read` — the one-line form for a collapsed summary. */\nexport function describeFiles(files: readonly TurnFileEntry[]): string {\n if (files.length === 0) return '';\n const counts = { edited: 0, created: 0, deleted: 0, read: 0 };\n for (const file of files) {\n if (file.action === 'edit') counts.edited++;\n else if (file.action === 'create') counts.created++;\n else if (file.action === 'delete') counts.deleted++;\n else counts.read++;\n }\n const parts: string[] = [];\n if (counts.created) parts.push(`${counts.created} created`);\n if (counts.edited) parts.push(`${counts.edited} edited`);\n if (counts.deleted) parts.push(`${counts.deleted} deleted`);\n if (counts.read) parts.push(`${counts.read} read`);\n return parts.join(', ');\n}\n\n// ---------------------------------------------------------------------------\n// In-session search\n// ---------------------------------------------------------------------------\n\n/**\n * Everything in a turn that is worth searching, flattened once and cached on\n * the turn object. A rebuilt transcript produces new objects, so the WeakMap\n * lets the old strings go with them.\n */\nconst SEARCH_TEXT = new WeakMap<TurnBlock, string>();\n\n/** Per tool call — a build log should not make one turn megabytes of index. */\nconst TOOL_TEXT_LIMIT = 4000;\n\n/**\n * One tool call flattened for search. Cached by `toolUseId` under the same\n * immutability rule as the facts: `JSON.stringify` of a 4000-char payload per\n * call per keystroke is what made an active query cost the whole session.\n */\nfunction toolSearchText(\n item: Extract<TranscriptItem, { kind: 'tool' }>,\n cache: TurnCache | null,\n): string {\n const hit = cache?.toolText.get(item.toolUseId);\n if (hit !== undefined) return hit;\n const parts: string[] = [item.name];\n if (typeof item.input === 'string') parts.push(item.input.slice(0, TOOL_TEXT_LIMIT));\n else if (item.input) {\n try {\n parts.push(JSON.stringify(item.input).slice(0, TOOL_TEXT_LIMIT));\n } catch {\n /* a payload that will not stringify simply is not searchable */\n }\n }\n if (item.result) parts.push(item.result.output.slice(0, TOOL_TEXT_LIMIT));\n const text = parts.join('\\n');\n // Only cache a finished call: a pending one's output is still to come.\n if (cache && item.result) cache.toolText.set(item.toolUseId, text);\n return text;\n}\n\nexport function turnSearchText(turn: TurnBlock, cache: TurnCache | null = null): string {\n const cached = SEARCH_TEXT.get(turn);\n if (cached !== undefined) return cached;\n const parts: string[] = [];\n const visit = (item: TranscriptRenderItem | TranscriptItem): void => {\n switch (item.kind) {\n case 'user':\n case 'assistant':\n case 'thinking':\n parts.push(item.text);\n break;\n case 'error':\n parts.push(item.message);\n break;\n case 'tool':\n parts.push(toolSearchText(item, cache));\n break;\n case 'toolGroup':\n for (const member of (item as ToolGroupItem).items) visit(member);\n break;\n default:\n break;\n }\n };\n for (const item of turn.items) visit(item);\n const text = parts.join('\\n');\n SEARCH_TEXT.set(turn, text);\n return text;\n}\n\nexport interface TurnMatch {\n turnKey: string;\n /** Text around the first hit, for the outline row. */\n snippet: string;\n}\n\nconst SNIPPET_PAD = 48;\n\n/** Case-insensitive substring search across every turn, in document order. */\nexport function searchTurns(\n turns: readonly TurnBlock[],\n query: string,\n cache: TurnCache | null = null,\n): TurnMatch[] {\n const needle = query.trim().toLowerCase();\n if (needle.length === 0) return [];\n const out: TurnMatch[] = [];\n for (const turn of turns) {\n const haystack = turnSearchText(turn, cache);\n const at = haystack.toLowerCase().indexOf(needle);\n if (at === -1) continue;\n const from = Math.max(0, at - SNIPPET_PAD);\n const to = Math.min(haystack.length, at + needle.length + SNIPPET_PAD);\n const snippet = `${from > 0 ? '…' : ''}${haystack.slice(from, to).replace(/\\s+/g, ' ').trim()}${to < haystack.length ? '…' : ''}`;\n out.push({ turnKey: turn.key, snippet });\n }\n return out;\n}\n\n/** Turn title for the outline: the ask, trimmed to one line. */\nexport function turnTitle(turn: TurnBlock, max = 72): string {\n const source = turn.prompt?.replace(/\\s+/g, ' ').trim();\n if (source) return source.length > max ? `${source.slice(0, max - 1)}…` : source;\n if (turn.toolCount > 0) return `${turn.toolCount} tool call${turn.toolCount === 1 ? '' : 's'}`;\n return 'Session note';\n}\n","/**\n * routes/verse/reasoning/sources-queries.ts — the write behind a transcript\n * turn's \"Sources\" list (core/verse/sources-api.ts).\n *\n * POST /api/verse/sources/open {sessionId, path, line?} → {ok} (editor at a line)\n *\n * The server confines `path` to the chat's own folders; a refusal surfaces as\n * the apiPost error. Pulls the held mutation token and touches the hold.\n */\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { apiPost } from '../../../data/client.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const SOURCES_OPEN_PATH = '/api/verse/sources/open';\n\nfunction token(): string {\n const t = getMutationToken();\n if (!t) throw new VerseMutationLockedError();\n return t;\n}\n\nexport async function openSourceFile(sessionId: string, path: string, line?: number): Promise<void> {\n await apiPost<{ ok: true }>(SOURCES_OPEN_PATH, line === undefined ? { sessionId, path } : { sessionId, path, line }, token());\n touchMutationHold();\n}\n"],"mappings":"yNAgDA,SAAgB,GAA6B,CAC3C,MAAO,CAAE,MAAO,IAAI,IAAO,OAAQ,IAAI,IAAO,SAAU,IAAI,GAAM,CACpE,CAMA,SAAgB,EACd,EACA,EACW,CACX,IAAM,EAAM,GAAO,MAAM,IAAI,EAAK,SAAS,EAG3C,GAAI,GAAO,EAAE,EAAI,SAAW,EAAK,SAAW,MAAO,OAAO,EAC1D,IAAM,EAAO,EAAc,CAAE,KAAM,EAAK,KAAM,MAAO,EAAK,MAAO,OAAQ,EAAK,MAAO,CAAC,EAMtF,OALI,IACF,EAAM,MAAM,IAAI,EAAK,UAAW,CAAI,EACpC,EAAM,OAAO,OAAO,EAAK,SAAS,EAClC,EAAM,SAAS,OAAO,EAAK,SAAS,GAE/B,CACT,CAsEA,SAAgB,EAAa,EAAqB,CAChD,MAAO,cAAc,EAAI,QAAQ,kBAAmB,EAAE,GACxD,CAGA,SAAgB,EAAa,EAAqB,CAChD,MAAO,cAAc,EAAI,QAAQ,kBAAmB,EAAE,GACxD,CAEA,IAAM,EAAoD,CAAE,KAAM,EAAG,KAAM,EAAG,OAAQ,EAAG,OAAQ,CAAE,EAsBnG,SAAgB,EAAe,EAAwD,CACrF,IAAI,EAAY,EACZ,EAAY,EAChB,IAAK,IAAM,KAAQ,EAAiB,CAAI,CAAC,CAAC,MACxC,GAAa,EAAK,UAClB,GAAa,EAAK,UAEpB,MAAO,CAAE,YAAW,WAAU,CAChC,CAGA,SAAS,EACP,EACA,EACA,EAC0C,CAC1C,IAAM,EAAM,GAAO,OAAO,IAAI,CAAS,EACvC,GAAI,EAAK,OAAO,EAChB,IAAM,EAAS,EAAe,CAAI,EAElC,OADA,GAAO,OAAO,IAAI,EAAW,CAAM,EAC5B,CACT,CAEA,SAAS,EAAgB,EAAkF,CAKzG,OAJI,EAAK,OAAS,WAAmB,CAAC,CAAI,EACtC,EAAK,OAAS,YACR,EAAuB,MAAM,OAAQ,GAA0D,EAAE,OAAS,UAAU,EAEvH,CAAC,CACV,CAEA,SAAS,EAAY,EAA8E,CAKjG,OAJI,EAAK,OAAS,OAAe,CAAC,CAAI,EAClC,EAAK,OAAS,YACR,EAAuB,MAAM,OAAQ,GAAsD,EAAE,OAAS,MAAM,EAE/G,CAAC,CACV,CAQA,SAAgB,EACd,EACA,EAA0B,KACf,CACX,IAAM,EAAQ,IAAI,IACZ,EAAyB,CAAC,EAC1B,EAAqB,CAAC,EAExB,EAAkC,CAAC,EACjC,MAAc,CACd,EAAQ,SAAW,IACvB,EAAM,KAAK,EAAS,EAAS,EAAO,EAAc,CAAK,CAAC,EACxD,EAAU,CAAC,EACb,EAEI,EACJ,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAW,WAAY,EAAO,EAAK,OAAS,MACjC,EAAK,OAAS,QAAW,IAAW,IAAA,IAAa,IAAa,MAAQ,IAAa,IACtF,EAAM,GAChB,EAAK,OAAS,QAAU,IAAW,IAAA,IAAa,IAAa,QAAM,EAAS,GAChF,EAAQ,KAAK,CAAI,CACnB,CAGA,OAFA,EAAM,EAEC,CAAE,QAAO,QAAO,cAAa,CACtC,CAEA,SAAS,EACP,EACA,EACA,EACA,EACW,CACX,IAAM,EAAQ,EAAM,GACd,EAAS,IAAI,IACf,EAAY,EACZ,EAAe,EACf,EAAa,EACb,EAAkC,KAClC,EAAqB,UACrB,EAA4B,KAC5B,EAAwB,KAEtB,EAAyB,CAAC,EAC1B,EAAQ,EAAe,EACvB,EAA2B,CAAE,MAAO,EAAG,OAAQ,EAAG,WAAY,KAAM,OAAQ,IAAK,EAEjF,EAAa,GAAmB,CACpC,IACA,AAAuB,IAAmB,EAC1C,EAAa,KAAK,CAAM,CAC1B,EAEA,IAAK,IAAM,KAAQ,EAAO,CACpB,EAAK,OAAS,QAAU,IAAW,OAAM,EAAS,EAAK,MAE3D,IAAK,IAAM,KAAW,EAAgB,CAAI,EAAG,CAC3C,IAAM,EAAS,EAAQ,UAAY,EAAQ,KAAK,KAAK,CAAC,CAAC,SAAW,EAC9D,EAAQ,EAAU,SACjB,EAAU,QACX,EAAQ,aAAe,OAAM,EAAU,YAAc,EAAU,YAAc,GAAK,EAAQ,YAC9F,IAAM,EAAS,EAAQ,kBAAoB,EAAS,KAAO,KAAK,KAAK,EAAQ,KAAK,KAAK,CAAC,CAAC,OAAS,CAAC,GAC/F,IAAW,OAAM,EAAU,QAAU,EAAU,QAAU,GAAK,EACpE,CACI,EAAK,OAAS,UAAY,EAAK,SAAW,MAAM,EAAQ,KAAK,EAAK,MAAM,EAE5E,IAAK,IAAM,KAAQ,EAAY,CAAI,EAAG,CACpC,IACA,IAAM,EAAO,EAAgB,EAAM,CAAK,EACxC,EAAM,IAAI,EAAK,UAAW,CAAI,EAC1B,EAAK,SAAW,WAAW,IAC3B,EAAK,QAAQ,EAAU,cAAc,EAAK,UAAU,QAAQ,kBAAmB,EAAE,GAAG,EACxF,IAAK,IAAM,KAAU,EAAK,QAAS,EAAQ,KAAK,EAAO,UAAY,EAAS,CAAE,GAAG,EAAQ,UAAW,EAAK,SAAU,CAAC,EACpH,EAAY,EAAO,CAAI,EAEvB,IAAM,EAAS,EAAK,OACpB,GAAI,IAAW,QAAU,IAAW,QAAU,IAAW,UAAY,IAAW,SAAU,SAC1F,IAAM,EAAS,EAAK,KAAO,EAAiB,EAAK,UAAW,EAAK,KAAK,KAAM,CAAK,EAAI,CAAE,UAAW,EAAG,UAAW,CAAE,EAClH,IAAK,IAAM,KAAQ,EAAK,MAAO,CAC7B,IAAM,EAAQ,EAAO,IAAI,CAAI,GAAK,CAChC,OACA,MAAO,EAAG,MAAO,EAAG,QAAS,EAAG,QAAS,EACzC,SACA,gBAAiB,EAAK,UACtB,UAAW,EAAG,UAAW,EACzB,OAAQ,EACV,EACI,IAAW,OAAQ,EAAM,QACpB,IAAW,OAAQ,EAAM,QACzB,IAAW,SAAU,EAAM,UAC/B,EAAM,UACP,EAAS,GAAU,EAAS,EAAM,UACpC,EAAM,OAAS,EAGf,EAAM,gBAAkB,EAAK,WAE3B,IAAW,SACb,EAAM,WAAa,EAAO,UAC1B,EAAM,WAAa,EAAO,WAExB,EAAK,SAAQ,EAAM,OAAS,IAChC,EAAO,IAAI,EAAM,CAAK,CACxB,CACF,CAEA,OAAQ,EAAK,KAAb,CACE,IAAK,QACH,EAAU,EAAa,EAAK,GAAG,CAAC,EAChC,EAAS,QACT,MACF,IAAK,YACH,EAAS,UACT,MACF,IAAK,YACH,EAAa,EAAK,WAAa,EAAI,EAAK,WAAa,EAGjD,EAAK,GAAI,EAAS,IAAW,UAAY,KAAO,EAC3C,IAAW,YAClB,EAAS,QACT,EAAU,EAAa,EAAK,GAAG,CAAC,EAKtC,CACF,CAEA,IAAI,EAAY,EACZ,EAAY,EAChB,IAAK,IAAM,KAAS,EAAO,OAAO,EAC5B,EAAM,SAAW,OAAQ,EAAM,YAC1B,EAAM,SAAW,OAAQ,EAAM,cAC/B,EAAM,SAAW,SAAU,EAAM,eACrC,EAAM,eACX,GAAa,EAAM,UACnB,GAAa,EAAM,WAEjB,EAAY,GAAK,EAAY,KAC/B,EAAM,UAAY,EAClB,EAAM,UAAY,GAEpB,IAAM,EAAY,EAAe,CAAO,EAKxC,MAJA,GAAM,QAAU,EAAU,OAC1B,EAAM,SAAW,EAAU,MAC3B,EAAM,eAAiB,EAAU,OAE1B,CACL,IAAK,EAAM,IACX,OAAQ,WAAY,EAAQ,EAAM,OAAS,KAC3C,QACA,SACA,GAAI,EAAM,GACV,YACA,QACA,KAAM,EAAiB,CAAK,EAC5B,YAKA,MAAO,CAAC,GAAG,EAAO,OAAO,CAAC,CAAC,CAAC,MACzB,EAAG,IACF,EAAS,EAAE,QAAU,EAAS,EAAE,SAChC,EAAE,UAAY,EAAE,WAAa,EAAE,UAAY,EAAE,YAC7C,EAAE,KAAK,cAAc,EAAE,IAAI,CAC/B,EACA,YACA,eACA,aACA,mBACA,SACA,YACF,CACF,CAGA,SAAS,EAAY,EAAuB,EAAuB,CACjE,OAAQ,EAAK,OAAb,CACE,IAAK,UACH,EAAM,WACF,EAAK,QAAQ,EAAM,iBACvB,MACF,IAAK,SACH,EAAM,eACN,MACF,IAAK,MACH,EAAM,aACN,MACF,IAAK,OACH,EAAM,YACN,MACF,IAAK,QACH,EAAM,YAIV,CACI,EAAK,QAAQ,EAAM,QACzB,CAGA,SAAgB,EAAc,EAAyC,CACrE,GAAI,EAAM,SAAW,EAAG,MAAO,GAC/B,IAAM,EAAS,CAAE,OAAQ,EAAG,QAAS,EAAG,QAAS,EAAG,KAAM,CAAE,EAC5D,IAAK,IAAM,KAAQ,EACb,EAAK,SAAW,OAAQ,EAAO,SAC1B,EAAK,SAAW,SAAU,EAAO,UACjC,EAAK,SAAW,SAAU,EAAO,UACrC,EAAO,OAEd,IAAM,EAAkB,CAAC,EAKzB,OAJI,EAAO,SAAS,EAAM,KAAK,GAAG,EAAO,QAAQ,SAAS,EACtD,EAAO,QAAQ,EAAM,KAAK,GAAG,EAAO,OAAO,QAAQ,EACnD,EAAO,SAAS,EAAM,KAAK,GAAG,EAAO,QAAQ,SAAS,EACtD,EAAO,MAAM,EAAM,KAAK,GAAG,EAAO,KAAK,MAAM,EAC1C,EAAM,KAAK,IAAI,CACxB,CAWA,IAAM,EAAc,IAAI,QAGlB,EAAkB,IAOxB,SAAS,EACP,EACA,EACQ,CACR,IAAM,EAAM,GAAO,SAAS,IAAI,EAAK,SAAS,EAC9C,GAAI,IAAQ,IAAA,GAAW,OAAO,EAC9B,IAAM,EAAkB,CAAC,EAAK,IAAI,EAClC,GAAI,OAAO,EAAK,OAAU,SAAU,EAAM,KAAK,EAAK,MAAM,MAAM,EAAG,CAAe,CAAC,OAC9E,GAAI,EAAK,MACZ,GAAI,CACF,EAAM,KAAK,KAAK,UAAU,EAAK,KAAK,CAAC,CAAC,MAAM,EAAG,CAAe,CAAC,CACjE,MAAQ,CAER,CAEE,EAAK,QAAQ,EAAM,KAAK,EAAK,OAAO,OAAO,MAAM,EAAG,CAAe,CAAC,EACxE,IAAM,EAAO,EAAM,KAAK;CAAI,EAG5B,OADI,GAAS,EAAK,QAAQ,EAAM,SAAS,IAAI,EAAK,UAAW,CAAI,EAC1D,CACT,CAEA,SAAgB,EAAe,EAAiB,EAA0B,KAAc,CACtF,IAAM,EAAS,EAAY,IAAI,CAAI,EACnC,GAAI,IAAW,IAAA,GAAW,OAAO,EACjC,IAAM,EAAkB,CAAC,EACnB,EAAS,GAAsD,CACnE,OAAQ,EAAK,KAAb,CACE,IAAK,OACL,IAAK,YACL,IAAK,WACH,EAAM,KAAK,EAAK,IAAI,EACpB,MACF,IAAK,QACH,EAAM,KAAK,EAAK,OAAO,EACvB,MACF,IAAK,OACH,EAAM,KAAK,EAAe,EAAM,CAAK,CAAC,EACtC,MACF,IAAK,YACH,IAAK,IAAM,KAAW,EAAuB,MAAO,EAAM,CAAM,CAIpE,CACF,EACA,IAAK,IAAM,KAAQ,EAAK,MAAO,EAAM,CAAI,EACzC,IAAM,EAAO,EAAM,KAAK;CAAI,EAE5B,OADA,EAAY,IAAI,EAAM,CAAI,EACnB,CACT,CAQA,IAAM,EAAc,GAGpB,SAAgB,EACd,EACA,EACA,EAA0B,KACb,CACb,IAAM,EAAS,EAAM,KAAK,CAAC,CAAC,YAAY,EACxC,GAAI,EAAO,SAAW,EAAG,MAAO,CAAC,EACjC,IAAM,EAAmB,CAAC,EAC1B,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAW,EAAe,EAAM,CAAK,EACrC,EAAK,EAAS,YAAY,CAAC,CAAC,QAAQ,CAAM,EAChD,GAAI,IAAO,GAAI,SACf,IAAM,EAAO,KAAK,IAAI,EAAG,EAAK,CAAW,EACnC,EAAK,KAAK,IAAI,EAAS,OAAQ,EAAK,EAAO,OAAS,CAAW,EAC/D,EAAU,GAAG,EAAO,EAAI,IAAM,KAAK,EAAS,MAAM,EAAM,CAAE,CAAC,CAAC,QAAQ,OAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,EAAK,EAAS,OAAS,IAAM,KAC7H,EAAI,KAAK,CAAE,QAAS,EAAK,IAAK,SAAQ,CAAC,CACzC,CACA,OAAO,CACT,CAGA,SAAgB,EAAU,EAAiB,EAAM,GAAY,CAC3D,IAAM,EAAS,EAAK,QAAQ,QAAQ,OAAQ,GAAG,CAAC,CAAC,KAAK,EAGtD,OAFI,EAAe,EAAO,OAAS,EAAM,GAAG,EAAO,MAAM,EAAG,EAAM,CAAC,EAAE,GAAK,EACtE,EAAK,UAAY,EAAU,GAAG,EAAK,UAAU,YAAY,EAAK,YAAc,EAAI,GAAK,MAClF,cACT,CCnhBA,IAAa,EAAoB,0BAEjC,SAAS,GAAgB,CACvB,IAAM,EAAI,EAAiB,EAC3B,GAAI,CAAC,EAAG,MAAM,IAAI,EAClB,OAAO,CACT,CAEA,eAAsB,EAAe,EAAmB,EAAc,EAA8B,CAClG,MAAM,EAAsB,EAAmB,IAAS,IAAA,GAAY,CAAE,YAAW,MAAK,EAAI,CAAE,YAAW,OAAM,MAAK,EAAG,EAAM,CAAC,EAC5H,EAAkB,CACpB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./index-BUjFkE-k.js";import{H as t,O as n,S as r,V as i,j as a,w as o}from"./global-BCRR2nnJ.js";var s=[`runs`,`swarms`,`inbox`,`daemon`,`daemon-observation`,`fleet-activity-ping`,`fleet-activity-observation`,`snapshot`,`session-expired`],c={runs:[`runs`],swarms:[`swarms`],inbox:[`inbox`],daemon:[`daemon`,`control-snapshot`,`verse-control`,`verse-usage-control`,`verse-caps`],"daemon-observation":[`daemon`,`control-snapshot`,`verse-control`,`verse-usage-control`,`verse-caps`],"fleet-activity-ping":[`fleet-activity`,`fleet`],"fleet-activity-observation":[`fleet-activity`,`fleet`],snapshot:[`dashboard-snapshot`,`agent-os-snapshot`],"session-expired":[]},l=new Map,u=null,d=null,f=0;function p(){return Math.min(1e3*2**f,15e3)}function m(){u&&=(u.close(),null),d&&=(clearTimeout(d),null)}function h(){d||=setTimeout(()=>{d=null,f+=1,g()},p())}function g(){if(e()){m();return}if(r().phase!==`authenticated`)return;m();let a=`/api/events?client=${encodeURIComponent(o())}`,d=new EventSource(a,{withCredentials:!0});u=d,d.onopen=()=>{f=0};for(let e of s)d.addEventListener(e,r=>{let a=r,o;try{o=JSON.parse(a.data)}catch{o=void 0}for(let t of c[e])i(t);e===`inbox`&&(t(`inbox-list:`),t(`proposal-detail-`)),e===`session-expired`&&n();let s=l.get(e);if(s)for(let e of s)e(o)});d.onerror=()=>{d.close(),u===d&&(u=null),r().phase===`authenticated`&&h()}}function _(e,t){let n=l.get(e);return n||(n=new Set,l.set(e,n)),n.add(t),()=>n.delete(t)}a(()=>{r().phase===`authenticated`?(f=0,g()):m()}),r().phase===`authenticated`&&g();export{s as SSE_EVENT_NAMES,_ as onSseEvent};
|
|
2
|
-
//# sourceMappingURL=sse-CEyzXNma.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse-CEyzXNma.js","names":[],"sources":["../../../../../../src/web-ui/data/sse.ts"],"sourcesContent":["/**\n * data/sse.ts — the live channel. One EventSource against /api/events for\n * the whole app, fanning out NAMED events (see api.ts handleSseEvents:\n * 'runs' | 'swarms' | 'inbox' | 'daemon' | 'daemon-observation' |\n * 'fleet-activity-ping' | 'fleet-activity-observation' | 'snapshot') to\n * subscribers, and invalidating the matching cache key so any mounted\n * useQuery(key) re-fetches in the background.\n *\n * The server polls disk at a fixed interval (api.ts SSE_POLL_MS, ~1.5s at\n * time of writing) — that is the real latency floor for \"live\". This layer\n * does not, and should not, try to beat that; it just makes sure the UI\n * never polls MORE often than the server already pushes.\n */\nimport { getReadClientProof, getAuthSnapshot, reportSessionExpired, subscribeAuth } from './auth-store.js';\nimport { invalidate, invalidatePrefix } from './cache.js';\nimport { isScopedConsolePath } from '../app/console-mode.js';\n\nexport const SSE_EVENT_NAMES = [\n 'runs',\n 'swarms',\n 'inbox',\n 'daemon',\n 'daemon-observation',\n 'fleet-activity-ping',\n 'fleet-activity-observation',\n 'snapshot',\n 'session-expired',\n] as const;\nexport type SseEventName = (typeof SSE_EVENT_NAMES)[number];\n\n/** Cache keys (see data/queries.ts) invalidated when a given SSE event fires. */\nconst EVENT_TO_CACHE_KEYS: Record<SseEventName, string[]> = {\n runs: ['runs'],\n swarms: ['swarms'],\n inbox: ['inbox'],\n // 'daemon' was previously mapped but nothing subscribed to a 'daemon'-keyed\n // query (control/daemon didn't exist yet) — now daemonObservationQuery\n // (data/queries.ts) does. Also refreshing 'control-snapshot' here so\n // /control/daemon and /control/security (both read off controlSnapshotQuery)\n // stay live on the same daemon-tick cadence instead of only on page load.\n // `/api/verse/control` and `/api/verse/audit` ARE the daemon projection, so\n // they ride the same signal. Without this the Autonomy cockpit — running\n // state, last tick outcome, today's spend against the cap — was frozen at\n // whatever was true when the section mounted, and DEFAULT_QUERY_FRESH_MS\n // then made a rail switch away and back inside 10s a no-op too.\n //\n // Deliberately NOT a coarse `verse-` prefix sweep: `verse-usage-accounts`\n // and `verse-usage-local-models` spawn provider probes, and firing those on\n // every daemon tick would turn a liveness fix into a process storm. Those\n // two poll on their own visibility-gated 30s cadence in UsageSection,\n // matching the collector's cycle.\n daemon: ['daemon', 'control-snapshot', 'verse-control', 'verse-usage-control', 'verse-caps'],\n 'daemon-observation': ['daemon', 'control-snapshot', 'verse-control', 'verse-usage-control', 'verse-caps'],\n // fleet-activity pings are the closest live signal fleet state changed;\n // 'fleet' (fleetStatusQuery, /control/fleet's queue depth + lease health)\n // has no dedicated SSE event of its own, so it rides these instead of only\n // refreshing on mount.\n 'fleet-activity-ping': ['fleet-activity', 'fleet'],\n 'fleet-activity-observation': ['fleet-activity', 'fleet'],\n // Agent OS snapshots are immutable records but their current authenticated\n // projection advances alongside the server's general snapshot signal.\n snapshot: ['dashboard-snapshot', 'agent-os-snapshot'],\n 'session-expired': [],\n};\n\ntype RawListener = (payload: unknown) => void;\nconst rawListeners = new Map<SseEventName, Set<RawListener>>();\n\nlet source: EventSource | null = null;\nlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet reconnectAttempt = 0;\n\nfunction backoffMs(): number {\n // 1s, 2s, 4s, 8s, capped at 15s — the server's own poll floor is ~1.5s so\n // there is no benefit reconnecting faster than that even on attempt 0.\n return Math.min(1000 * 2 ** reconnectAttempt, 15_000);\n}\n\nfunction teardown(): void {\n if (source) {\n source.close();\n source = null;\n }\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n}\n\nfunction scheduleReconnect(): void {\n if (reconnectTimer) return;\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n reconnectAttempt += 1;\n connect();\n }, backoffMs());\n}\n\nfunction connect(): void {\n // Shared hooks import this module, but the dedicated console has no global\n // Hub event channel. Check on every reconnect, not just the initial import.\n if (isScopedConsolePath()) { teardown(); return; }\n if (getAuthSnapshot().phase !== 'authenticated') return;\n teardown();\n\n const url = `/api/events?client=${encodeURIComponent(getReadClientProof())}`;\n const es = new EventSource(url, { withCredentials: true });\n source = es;\n\n es.onopen = () => {\n reconnectAttempt = 0;\n };\n\n for (const name of SSE_EVENT_NAMES) {\n es.addEventListener(name, (evt) => {\n const messageEvent = evt as MessageEvent<string>;\n let payload: unknown = undefined;\n try {\n payload = JSON.parse(messageEvent.data);\n } catch {\n payload = undefined;\n }\n for (const key of EVENT_TO_CACHE_KEYS[name]) invalidate(key);\n if (name === 'inbox') {\n // Parameterized inbox queries (one cache key per filter combo / per\n // proposal id) aren't in EVENT_TO_CACHE_KEYS's static map — sweep\n // both prefixes so the list (any filter) and any open detail view\n // (proposalDetailQuery, data/queries.ts) live-update on the same\n // 'inbox' event as the unfiltered badge.\n invalidatePrefix('inbox-list:');\n invalidatePrefix('proposal-detail-');\n }\n if (name === 'session-expired') reportSessionExpired();\n const listeners = rawListeners.get(name);\n if (listeners) for (const l of listeners) l(payload);\n });\n }\n\n es.onerror = () => {\n // EventSource auto-retries on its own, but its built-in retry delay is\n // opaque and can hammer a server that just lost its read session. Close\n // it and drive reconnection ourselves so we stop entirely once\n // auth-store reports the session as expired (see the subscribeAuth\n // wiring at the bottom of this file).\n es.close();\n if (source === es) source = null;\n if (getAuthSnapshot().phase === 'authenticated') scheduleReconnect();\n };\n}\n\n/** Subscribe to one named SSE event's raw payload (rarely needed directly —\n * most views should prefer useQuery + the cache-key mapping above). */\nexport function onSseEvent(name: SseEventName, listener: RawListener): () => void {\n let set = rawListeners.get(name);\n if (!set) {\n set = new Set();\n rawListeners.set(name, set);\n }\n set.add(listener);\n return () => set!.delete(listener);\n}\n\n// Connect once authenticated; disconnect the instant the session drops so a\n// stale connection never masks a 401 the rest of the app needs to react to.\nsubscribeAuth(() => {\n const phase = getAuthSnapshot().phase;\n if (phase === 'authenticated') {\n reconnectAttempt = 0;\n connect();\n } else {\n teardown();\n }\n});\n\n// Dynamic loading may finish after the session probe. Join the live feed in\n// that case too; otherwise it would wait for the next auth state change.\nif (getAuthSnapshot().phase === 'authenticated') connect();\n"],"mappings":"oHAiBA,IAAa,EAAkB,CAC7B,OACA,SACA,QACA,SACA,qBACA,sBACA,6BACA,WACA,iBACF,EAIM,EAAsD,CAC1D,KAAM,CAAC,MAAM,EACb,OAAQ,CAAC,QAAQ,EACjB,MAAO,CAAC,OAAO,EAiBf,OAAQ,CAAC,SAAU,mBAAoB,gBAAiB,sBAAuB,YAAY,EAC3F,qBAAsB,CAAC,SAAU,mBAAoB,gBAAiB,sBAAuB,YAAY,EAKzG,sBAAuB,CAAC,iBAAkB,OAAO,EACjD,6BAA8B,CAAC,iBAAkB,OAAO,EAGxD,SAAU,CAAC,qBAAsB,mBAAmB,EACpD,kBAAmB,CAAC,CACtB,EAGM,EAAe,IAAI,IAErB,EAA6B,KAC7B,EAAuD,KACvD,EAAmB,EAEvB,SAAS,GAAoB,CAG3B,OAAO,KAAK,IAAI,IAAO,GAAK,EAAkB,IAAM,CACtD,CAEA,SAAS,GAAiB,CACxB,AAEE,KADA,EAAO,MAAM,EACJ,MAEX,AAEE,KADA,aAAa,CAAc,EACV,KAErB,CAEA,SAAS,GAA0B,CAC7B,AACJ,IAAiB,eAAiB,CAChC,EAAiB,KACjB,GAAoB,EACpB,EAAQ,CACV,EAAG,EAAU,CAAC,CAChB,CAEA,SAAS,GAAgB,CAGvB,GAAI,EAAoB,EAAG,CAAE,EAAS,EAAG,MAAQ,CACjD,GAAI,EAAgB,CAAC,CAAC,QAAU,gBAAiB,OACjD,EAAS,EAET,IAAM,EAAM,sBAAsB,mBAAmB,EAAmB,CAAC,IACnE,EAAK,IAAI,YAAY,EAAK,CAAE,gBAAiB,EAAK,CAAC,EACzD,EAAS,EAET,EAAG,WAAe,CAChB,EAAmB,CACrB,EAEA,IAAK,IAAM,KAAQ,EACjB,EAAG,iBAAiB,EAAO,GAAQ,CACjC,IAAM,EAAe,EACjB,EACJ,GAAI,CACF,EAAU,KAAK,MAAM,EAAa,IAAI,CACxC,MAAQ,CACN,EAAU,IAAA,EACZ,CACA,IAAK,IAAM,KAAO,EAAoB,GAAO,EAAW,CAAG,EACvD,IAAS,UAMX,EAAiB,aAAa,EAC9B,EAAiB,kBAAkB,GAEjC,IAAS,mBAAmB,EAAqB,EACrD,IAAM,EAAY,EAAa,IAAI,CAAI,EACvC,GAAI,EAAW,IAAK,IAAM,KAAK,EAAW,EAAE,CAAO,CACrD,CAAC,EAGH,EAAG,YAAgB,CAMjB,EAAG,MAAM,EACL,IAAW,IAAI,EAAS,MACxB,EAAgB,CAAC,CAAC,QAAU,iBAAiB,EAAkB,CACrE,CACF,CAIA,SAAgB,EAAW,EAAoB,EAAmC,CAChF,IAAI,EAAM,EAAa,IAAI,CAAI,EAM/B,OALK,IACH,EAAM,IAAI,IACV,EAAa,IAAI,EAAM,CAAG,GAE5B,EAAI,IAAI,CAAQ,MACH,EAAK,OAAO,CAAQ,CACnC,CAIA,MAAoB,CACJ,EAAgB,CAAC,CAAC,QAClB,iBACZ,EAAmB,EACnB,EAAQ,GAER,EAAS,CAEb,CAAC,EAIG,EAAgB,CAAC,CAAC,QAAU,iBAAiB,EAAQ"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{a as e,n as t}from"./tool-semantics-DtFU7rvB.js";var n={create:`created`,edit:`edited`,delete:`deleted`,read:`read`},r={created:3,edited:2,deleted:1,read:0};function i(i){let a=new Map;for(let o of i){if(o.kind!==`tool`)continue;let i=n[t(o.name)];if(i&&!(i!==`read`&&o.result?.isError))for(let t of e(o.input)){let e=a.get(t);if(!e){a.set(t,{path:t,touch:i,count:1,lastAt:o.at});continue}e.count+=1,o.at>e.lastAt&&(e.lastAt=o.at),r[i]>r[e.touch]&&(e.touch=i)}}let o=e=>+(e.touch===`read`);return[...a.values()].sort((e,t)=>o(e)-o(t)||(e.lastAt<t.lastAt?1:e.lastAt>t.lastAt?-1:0))}function a(e){return typeof e==`string`&&e.trim()!==``?e.trim():null}function o(e){let t=typeof e==`object`&&e?e:null;if(!t)return null;let n=a(t.url)??a(t.uri);if(n)return{target:n,href:/^https?:\/\//i.test(n)?n:null,kind:`web`};let r=a(t.query)??a(t.q)??a(t.search_query);return r?{target:r,href:null,kind:`search`}:null}function s(n){let r=new Map,i=e=>{let t=`${e.kind}:${e.target}`,n=r.get(t);(!n||e.at>n.at)&&r.set(t,{...e,key:t})};for(let r of n){if(r.kind!==`tool`)continue;let n=t(r.name),a=r.result?.isError===!0;if(n===`web`){let e=o(r.input);e&&i({key:``,kind:e.kind,target:e.target,href:e.href,at:r.at,failed:a})}else if(n===`read`)for(let t of e(r.input))i({key:``,kind:`file`,target:t,href:null,at:r.at,failed:a})}return[...r.values()].sort((e,t)=>e.at<t.at?1:e.at>t.at?-1:0)}function c(e){let t=new Map,n=new Map;for(let r of e){if(r.kind===`user`&&n.set(r.turnId,r.text.split(`
|
|
2
|
-
`,1)[0].slice(0,140)),r.kind!==`thinking`)continue;let e=t.get(r.turnId)??{turnId:r.turnId,ask:null,blocks:[]};e.blocks.push(r),t.set(r.turnId,e)}return[...t.values()].reverse().map(e=>({...e,ask:n.get(e.turnId)??null}))}var l={pane:`_pane_1l87i_6`,section:`_section_1l87i_12`,sectionTitle:`_sectionTitle_1l87i_18`,count:`_count_1l87i_30`,list:`_list_1l87i_36`,row:`_row_1l87i_43`,mark:`_mark_1l87i_65`,name:`_name_1l87i_78`,meta:`_meta_1l87i_85`,link:`_link_1l87i_91`,chip:`_chip_1l87i_94`,rowAction:`_rowAction_1l87i_95`,chips:`_chips_1l87i_108`,muted:`_muted_1l87i_124`,turn:`_turn_1l87i_127`,ask:`_ask_1l87i_128`,thought:`_thought_1l87i_137`,thoughtMeta:`_thoughtMeta_1l87i_148`};export{i,s as n,c as r,l as t};
|
|
3
|
-
//# sourceMappingURL=stub-panes.module-aBfJsf41.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stub-panes.module-aBfJsf41.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/panes/builtin/pane-models.ts","../../../../../../src/web-ui/routes/verse/panes/builtin/stub-panes.module.css"],"sourcesContent":["/**\n * routes/verse/panes/builtin/pane-models.ts — what the first-party Files,\n * Sources and Reasoning panes show, derived from the chat's transcript.\n * Pure (no React), so each is tested on its own.\n *\n * These are the STUB panes' models: the Reasoning + Sources unit and the\n * Files work replace the panes through the registry, and may keep or drop\n * these derivations.\n */\nimport type { TranscriptItem } from '../../verse-transcript.js';\nimport { actionForName, pathsIn, type ToolAction } from '../../chat/tool-semantics.js';\n\ntype ThinkingItem = Extract<TranscriptItem, { kind: 'thinking' }>;\n\n// ---------------------------------------------------------------------------\n// Files\n// ---------------------------------------------------------------------------\n\nexport type FileTouch = 'created' | 'edited' | 'deleted' | 'read';\n\nexport interface TouchedFile {\n path: string;\n /** The strongest thing done to it: created > edited > deleted > read. */\n touch: FileTouch;\n /** Tool calls that named it. */\n count: number;\n lastAt: string;\n}\n\nconst TOUCH_FOR: Partial<Record<ToolAction, FileTouch>> = { create: 'created', edit: 'edited', delete: 'deleted', read: 'read' };\nconst TOUCH_RANK: Record<FileTouch, number> = { created: 3, edited: 2, deleted: 1, read: 0 };\n\n/** Every file the chat's tool calls read or changed, changed ones first, then most recent. */\nexport function touchedFiles(items: readonly TranscriptItem[]): TouchedFile[] {\n const byPath = new Map<string, TouchedFile>();\n for (const item of items) {\n if (item.kind !== 'tool') continue;\n const touch = TOUCH_FOR[actionForName(item.name)];\n if (!touch) continue;\n // A failed edit changed nothing; a failed read still says where it looked.\n if (touch !== 'read' && item.result?.isError) continue;\n for (const path of pathsIn(item.input)) {\n const seen = byPath.get(path);\n if (!seen) {\n byPath.set(path, { path, touch, count: 1, lastAt: item.at });\n continue;\n }\n seen.count += 1;\n if (item.at > seen.lastAt) seen.lastAt = item.at;\n if (TOUCH_RANK[touch] > TOUCH_RANK[seen.touch]) seen.touch = touch;\n }\n }\n const changed = (f: TouchedFile) => (f.touch === 'read' ? 1 : 0);\n return [...byPath.values()].sort((a, b) => changed(a) - changed(b) || (a.lastAt < b.lastAt ? 1 : a.lastAt > b.lastAt ? -1 : 0));\n}\n\n// ---------------------------------------------------------------------------\n// Sources\n// ---------------------------------------------------------------------------\n\nexport type SourceKind = 'web' | 'search' | 'file';\n\nexport interface Source {\n key: string;\n kind: SourceKind;\n /** A URL, a query, or a path. */\n target: string;\n /** http(s) only — the one kind a link is drawn for. */\n href: string | null;\n at: string;\n failed: boolean;\n}\n\nfunction str(value: unknown): string | null {\n return typeof value === 'string' && value.trim() !== '' ? value.trim() : null;\n}\n\nfunction webTarget(input: unknown): { target: string; href: string | null; kind: SourceKind } | null {\n const rec = input !== null && typeof input === 'object' ? (input as Record<string, unknown>) : null;\n if (!rec) return null;\n const url = str(rec['url']) ?? str(rec['uri']);\n if (url) return { target: url, href: /^https?:\\/\\//i.test(url) ? url : null, kind: 'web' };\n const query = str(rec['query']) ?? str(rec['q']) ?? str(rec['search_query']);\n return query ? { target: query, href: null, kind: 'search' } : null;\n}\n\n/**\n * What the chat looked at to answer: pages fetched, web searches, files\n * read — newest first, one row per distinct target.\n */\nexport function chatSources(items: readonly TranscriptItem[]): Source[] {\n const out = new Map<string, Source>();\n const add = (source: Source) => {\n const id = `${source.kind}:${source.target}`;\n const seen = out.get(id);\n if (!seen || source.at > seen.at) out.set(id, { ...source, key: id });\n };\n for (const item of items) {\n if (item.kind !== 'tool') continue;\n const action = actionForName(item.name);\n const failed = item.result?.isError === true;\n if (action === 'web') {\n const web = webTarget(item.input);\n if (web) add({ key: '', kind: web.kind, target: web.target, href: web.href, at: item.at, failed });\n } else if (action === 'read') {\n for (const path of pathsIn(item.input)) add({ key: '', kind: 'file', target: path, href: null, at: item.at, failed });\n }\n }\n return [...out.values()].sort((a, b) => (a.at < b.at ? 1 : a.at > b.at ? -1 : 0));\n}\n\n// ---------------------------------------------------------------------------\n// Reasoning\n// ---------------------------------------------------------------------------\n\nexport interface ReasoningTurn {\n turnId: string;\n /** The operator's message that started the turn (first line), when it is in the log. */\n ask: string | null;\n blocks: ThinkingItem[];\n}\n\n/** The chat's thinking, turn by turn, newest turn first (blocks in the order they streamed). */\nexport function reasoningByTurn(items: readonly TranscriptItem[]): ReasoningTurn[] {\n const turns = new Map<string, ReasoningTurn>();\n const asks = new Map<string, string>();\n for (const item of items) {\n if (item.kind === 'user') asks.set(item.turnId, item.text.split('\\n', 1)[0]!.slice(0, 140));\n if (item.kind !== 'thinking') continue;\n const turn = turns.get(item.turnId) ?? { turnId: item.turnId, ask: null, blocks: [] };\n turn.blocks.push(item);\n turns.set(item.turnId, turn);\n }\n return [...turns.values()].reverse().map((t) => ({ ...t, ask: asks.get(t.turnId) ?? null }));\n}\n","/**\n * panes/builtin/stub-panes.module.css — Files, Sources and Reasoning.\n * The dock's section grammar (dock/panes.module.css): micro-label headings,\n * 16px gutters, hairline separators, 28px rows. Tokens only.\n */\n.pane {\n display: flex;\n flex-direction: column;\n min-height: 0;\n padding-bottom: var(--space-6);\n}\n.section { padding: var(--space-4) var(--space-4) 0; }\n.section + .section {\n margin-top: var(--space-3);\n padding-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n}\n.sectionTitle {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n margin: 0 0 var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.count {\n font-variant-numeric: tabular-nums;\n text-transform: none;\n letter-spacing: 0;\n color: var(--text-secondary);\n}\n.list {\n display: flex;\n flex-direction: column;\n margin: 0 calc(var(--space-2) * -1);\n padding: 0;\n list-style: none;\n}\n.row {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--density-row, 28px);\n padding: 0 var(--space-2);\n border-radius: var(--radius-sm);\n color: var(--text-primary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.row:hover { background: var(--bg-hover); }\nbutton.row {\n width: 100%;\n border: 0;\n background: none;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\nbutton.row:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n.mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--space-5);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n}\n.mark[data-touch='created'] { color: var(--status-success-fg); }\n.mark[data-touch='edited'] { color: var(--status-warning-fg); }\n.mark[data-touch='deleted'] { color: var(--status-danger-fg); }\n.name {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n}\n.meta {\n color: var(--text-tertiary);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.row[data-failed] .name { color: var(--text-tertiary); text-decoration: line-through; }\n.link { color: var(--text-link); text-decoration: none; }\n.link:hover { text-decoration: underline; }\n.link:focus-visible,\n.chip:focus-visible,\n.rowAction:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); border-radius: var(--radius-sm); }\n.rowAction {\n opacity: 0;\n padding: 0 var(--space-1);\n border: 0;\n background: none;\n color: var(--text-secondary);\n font: inherit;\n cursor: pointer;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.row:hover .rowAction,\n.rowAction:focus-visible { opacity: 1; }\n.chips { display: flex; flex-wrap: wrap; gap: var(--space-2); }\n.chip {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n min-height: var(--control-h-sm);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n color: var(--text-primary);\n font-size: var(--text-xs-size);\n cursor: pointer;\n transition: background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);\n}\n.chip:hover { background: var(--bg-hover); border-color: var(--border-strong); }\n.muted { margin: 0; color: var(--text-tertiary); font-size: var(--text-xs-size); line-height: var(--text-xs-line); }\n\n/* Reasoning */\n.turn + .turn { margin-top: var(--space-4); }\n.ask {\n margin: 0 0 var(--space-2);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.thought {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border-left: 2px solid var(--border-default);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed, var(--text-sm-line));\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n.thought + .thought { margin-top: var(--space-2); }\n.thoughtMeta {\n display: block;\n margin-bottom: var(--space-1);\n color: var(--text-tertiary);\n font-size: var(--text-2xs-size);\n font-variant-numeric: tabular-nums;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .rowAction, .chip { transition: none; }\n}\n"],"mappings":"wDA6BA,IAAM,EAAoD,CAAE,OAAQ,UAAW,KAAM,SAAU,OAAQ,UAAW,KAAM,MAAO,EACzH,EAAwC,CAAE,QAAS,EAAG,OAAQ,EAAG,QAAS,EAAG,KAAM,CAAE,EAG3F,SAAgB,EAAa,EAAiD,CAC5E,IAAM,EAAS,IAAI,IACnB,IAAK,IAAM,KAAQ,EAAO,CACxB,GAAI,EAAK,OAAS,OAAQ,SAC1B,IAAM,EAAQ,EAAU,EAAc,EAAK,IAAI,GAC1C,MAED,MAAU,QAAU,EAAK,QAAQ,SACrC,IAAK,IAAM,KAAQ,EAAQ,EAAK,KAAK,EAAG,CACtC,IAAM,EAAO,EAAO,IAAI,CAAI,EAC5B,GAAI,CAAC,EAAM,CACT,EAAO,IAAI,EAAM,CAAE,OAAM,QAAO,MAAO,EAAG,OAAQ,EAAK,EAAG,CAAC,EAC3D,QACF,CACA,EAAK,OAAS,EACV,EAAK,GAAK,EAAK,SAAQ,EAAK,OAAS,EAAK,IAC1C,EAAW,GAAS,EAAW,EAAK,SAAQ,EAAK,MAAQ,EAC/D,CACF,CACA,IAAM,EAAW,GAAoB,IAAE,QAAU,QACjD,MAAO,CAAC,GAAG,EAAO,OAAO,CAAC,CAAC,CAAC,MAAM,EAAG,IAAM,EAAQ,CAAC,EAAI,EAAQ,CAAC,IAAM,EAAE,OAAS,EAAE,OAAS,EAAI,EAAE,OAAS,EAAE,OAAS,GAAK,EAAE,CAChI,CAmBA,SAAS,EAAI,EAA+B,CAC1C,OAAO,OAAO,GAAU,UAAY,EAAM,KAAK,IAAM,GAAK,EAAM,KAAK,EAAI,IAC3E,CAEA,SAAS,EAAU,EAAkF,CACnG,IAAM,EAAwB,OAAO,GAAU,UAAnC,EAA+C,EAAoC,KAC/F,GAAI,CAAC,EAAK,OAAO,KACjB,IAAM,EAAM,EAAI,EAAI,GAAM,GAAK,EAAI,EAAI,GAAM,EAC7C,GAAI,EAAK,MAAO,CAAE,OAAQ,EAAK,KAAM,gBAAgB,KAAK,CAAG,EAAI,EAAM,KAAM,KAAM,KAAM,EACzF,IAAM,EAAQ,EAAI,EAAI,KAAQ,GAAK,EAAI,EAAI,CAAI,GAAK,EAAI,EAAI,YAAe,EAC3E,OAAO,EAAQ,CAAE,OAAQ,EAAO,KAAM,KAAM,KAAM,QAAS,EAAI,IACjE,CAMA,SAAgB,EAAY,EAA4C,CACtE,IAAM,EAAM,IAAI,IACV,EAAO,GAAmB,CAC9B,IAAM,EAAK,GAAG,EAAO,KAAK,GAAG,EAAO,SAC9B,EAAO,EAAI,IAAI,CAAE,GACnB,CAAC,GAAQ,EAAO,GAAK,EAAK,KAAI,EAAI,IAAI,EAAI,CAAE,GAAG,EAAQ,IAAK,CAAG,CAAC,CACtE,EACA,IAAK,IAAM,KAAQ,EAAO,CACxB,GAAI,EAAK,OAAS,OAAQ,SAC1B,IAAM,EAAS,EAAc,EAAK,IAAI,EAChC,EAAS,EAAK,QAAQ,UAAY,GACxC,GAAI,IAAW,MAAO,CACpB,IAAM,EAAM,EAAU,EAAK,KAAK,EAC5B,GAAK,EAAI,CAAE,IAAK,GAAI,KAAM,EAAI,KAAM,OAAQ,EAAI,OAAQ,KAAM,EAAI,KAAM,GAAI,EAAK,GAAI,QAAO,CAAC,CACnG,MAAO,GAAI,IAAW,OACpB,IAAK,IAAM,KAAQ,EAAQ,EAAK,KAAK,EAAG,EAAI,CAAE,IAAK,GAAI,KAAM,OAAQ,OAAQ,EAAM,KAAM,KAAM,GAAI,EAAK,GAAI,QAAO,CAAC,CAExH,CACA,MAAO,CAAC,GAAG,EAAI,OAAO,CAAC,CAAC,CAAC,MAAM,EAAG,IAAO,EAAE,GAAK,EAAE,GAAK,EAAI,EAAE,GAAK,EAAE,GAAK,GAAK,CAAE,CAClF,CAcA,SAAgB,EAAgB,EAAmD,CACjF,IAAM,EAAQ,IAAI,IACZ,EAAO,IAAI,IACjB,IAAK,IAAM,KAAQ,EAAO,CAExB,GADI,EAAK,OAAS,QAAQ,EAAK,IAAI,EAAK,OAAQ,EAAK,KAAK,MAAM;EAAM,CAAC,CAAC,CAAC,EAAE,CAAE,MAAM,EAAG,GAAG,CAAC,EACtF,EAAK,OAAS,WAAY,SAC9B,IAAM,EAAO,EAAM,IAAI,EAAK,MAAM,GAAK,CAAE,OAAQ,EAAK,OAAQ,IAAK,KAAM,OAAQ,CAAC,CAAE,EACpF,EAAK,OAAO,KAAK,CAAI,EACrB,EAAM,IAAI,EAAK,OAAQ,CAAI,CAC7B,CACA,MAAO,CAAC,GAAG,EAAM,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAK,IAAO,CAAE,GAAG,EAAG,IAAK,EAAK,IAAI,EAAE,MAAM,GAAK,IAAK,EAAE,CAC7F"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{C as e,M as t,V as n,a as r,i,t as a}from"./global-BCRR2nnJ.js";import{O as o}from"./VerseShared-CCeoBq-8.js";import{n as s}from"./control-queries-DpgKLZZ7.js";var c=`/api/verse/authority`,l=`/api/verse/authority/draft`,u=`/api/verse/fleet/live`,d=`/api/verse/leader`,f=`/api/verse/learning`,p=`/api/verse/fleet/history?days=90`;function m(e=new Date){return`${p}&tz=${e.getTimezoneOffset()}`}var h=`/api/reasoning/digest?days=30`,g=`/api/verse/budget/history?days=8`,_=Object.freeze({authority:`verse-authority`,authorityDraft:`verse-authority-draft`,authorityEliteDraft:`verse-authority-draft-elite`,fleetLive:`verse-fleet-live`,leader:`verse-leader`,learning:`verse-learning`,fleetHistory:`verse-fleet-history-90d`,reasoningDigest:`verse-reasoning-digest-30d`,seatHistory:`verse-seat-history-8d`});function v(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var y={authority(e){return v(e)&&e.v===1&&typeof e.switch==`string`&&v(e.grant)?e:null},draft(e){return v(e)&&v(e.payload)&&typeof e.digest==`string`?e:null},fleetLive(e){return v(e)&&e.v===1&&Array.isArray(e.runs)&&Array.isArray(e.repos)&&Array.isArray(e.lanes)&&v(e.summary)?e:null},leader(e){return v(e)&&e.v===1&&Array.isArray(e.timeline)&&Array.isArray(e.actions)&&v(e.hitRate)?e:null},learning(e){return v(e)&&e.v===1&&Array.isArray(e.versions)&&Array.isArray(e.experiments)?e:null},activity(e){return v(e)&&Array.isArray(e.needsYou)&&Array.isArray(e.running)&&v(e.sources)?e:null},fleetHistory(e){return v(e)&&Array.isArray(e.days)&&v(e.sources)&&v(e.funnel)?e:null},reasoningDigest(e){return v(e)&&Array.isArray(e.insights)&&Array.isArray(e.trends)&&v(e.totals)?e:null},seatHistory(e){return v(e)&&e.v===1&&Array.isArray(e.series)?e:null}};function b(e,t){return t instanceof a?t.status===404?`${e} is not in this build yet, so this card has no source.`:t.status===503?`${e} failed to load on the server.`:t.detail&&t.status<500?/[.!?]$/.test(t.detail)?t.detail:`${t.detail}.`:`${e} answered HTTP ${t.status}.`:`${e} could not be reached.`}function x(e,t,n,r){return{key:e,fetch:async e=>{try{let n=r(await i(typeof t==`function`?t():t,e));return n===null?{value:null,available:!0,reason:`Unrecognized response — update Ashlr.`}:{value:n,available:!0,reason:null}}catch(e){if(e instanceof a&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{value:null,available:!1,reason:b(n,e),code:e instanceof a?e.code:null}}}}}var S=x(_.authority,c,`The authority service`,y.authority),C=x(_.authorityDraft,l,`The grant draft`,y.draft),w=x(_.authorityEliteDraft,`${l}?eliteDirect=1`,`The elite-direct grant draft`,y.draft),T=x(_.fleetLive,u,`The live fleet view`,y.fleetLive),E=x(_.leader,d,`The Leader`,y.leader),D=x(_.learning,f,`Self-improvement`,y.learning),O=x(_.fleetHistory,()=>m(),`Fleet history`,y.fleetHistory),k=x(_.reasoningDigest,h,`The reasoning digest`,y.reasoningDigest),A=x(_.seatHistory,g,`Seat history`,y.seatHistory);async function j(n,i){let a=e();if(!a)throw new s;let o=await r(n,i,a);return t(),o}async function M(e){let t=await j(c,e);return n(_.authority),n(_.fleetLive),o(),(e.action===`grant`||e.action===`re-approve`)&&(n(_.authorityDraft),n(_.authorityEliteDraft)),y.authority(t)}async function N(e){let t=await j(u,e);return n(_.fleetLive),o(),t}async function P(e){let t=await j(d,e);return n(_.leader),o(),t}async function F(e,t){if(!/^\/api\/[^\s\\]*$/.test(e)||e.startsWith(`//`)||e.includes(`..`))throw Error(`That action points outside this app, so it was not sent.`);let r=await j(e,t);return o(),n(_.fleetLive),n(_.leader),n(_.authority),r}export{S as a,E as c,M as d,N as f,A as g,k as h,w as i,D as l,F as m,_ as n,O as o,P as p,C as r,T as s,l as t,x as u};
|
|
2
|
-
//# sourceMappingURL=surface-data-CLlkcEWM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surface-data-CLlkcEWM.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface-data.ts"],"sourcesContent":["/**\n * routes/verse/command/surface-data.ts — every read and write behind the\n * four 3.10 surfaces (Command, Fleet, Growth, Mind), in one place (unit C7).\n *\n * GET /api/verse/authority AuthorityStatusV1 (B-U1)\n * GET /api/verse/authority/draft AuthorityGrantDraft (B-U1)\n * POST /api/verse/authority AuthorityActionRequest\n * GET /api/verse/fleet/live FleetLiveSnapshotV1 (B-U5)\n * POST /api/verse/fleet/live FleetLiveActionRequest\n * GET /api/verse/leader LeaderStateV1 (B-U8)\n * POST /api/verse/leader LeaderActionRequest\n * GET /api/verse/learning LearningStateV1 (B-U9)\n * GET /api/verse/activity VerseActivityResponse (C1 — read through\n * the shell's ONE useActivity poll, never a\n * second loop from here)\n * GET /api/verse/fleet/history FleetHistoryResponse (A8)\n * GET /api/reasoning/digest ReasoningDigest (A7)\n * GET /api/verse/budget BudgetView (A9 — budget-queries.ts)\n * GET /api/verse/budget/history CapacityHistoryResponse (3.10.1 — recorded\n * seat window history for the burn-downs)\n * GET /api/models per-model ROI (data/queries.ts)\n *\n * WHY every read is OPTIONAL: Track B's modules land in parallel with these\n * surfaces (SPEC-310BC-COORD), and C0's mount answers 404 for a family that\n * has not landed. A 404 is \"this card has no source yet\", never \"Command is\n * broken\" — so a read resolves to `{ value: null, available: false, reason }`\n * and the card renders a designed not-available state from `reason`. A body\n * this client cannot narrow is treated the same way (available, but nothing\n * shown rather than guessed). 401 and aborts still propagate: an expired\n * read session is the whole app's state, not one card's.\n *\n * Writes pull the held mutation token (VerseControlLockedError without one —\n * the surfaces route every write through useGuardedAction, which opens the\n * token dialog first) and invalidate exactly the keys they change.\n */\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { refreshActivity } from '../shell/useActivity.js';\nimport type { OptionalFleetRead } from '../autonomy/fleet-contract.js';\nimport type {\n AuthorityActionRequest,\n AuthorityGrantDraft,\n AuthorityStatusV1,\n} from '../../../../core/authority/types.js';\nimport type { FleetLiveActionRequest, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { LeaderActionRequest, LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport type { LearningStateV1 } from '../../../../core/learn/harness-types.js';\nimport type { VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { FleetHistoryResponse } from '../../../../core/verse/fleet-history-types.js';\nimport type { ReasoningDigest } from '../../../../core/reasoning/types.js';\nimport type { CapacityHistoryResponse } from '../../../../core/routing/capacity-history-types.js';\n\n/** A read that is allowed to be absent (the autonomy folder's shape, reused). */\nexport type OptionalRead<T> = OptionalFleetRead<T>;\n\nexport const AUTHORITY_PATH = '/api/verse/authority';\nexport const AUTHORITY_DRAFT_PATH = '/api/verse/authority/draft';\nexport const FLEET_LIVE_PATH = '/api/verse/fleet/live';\nexport const LEADER_PATH = '/api/verse/leader';\nexport const LEARNING_PATH = '/api/verse/learning';\nexport const FLEET_HISTORY_PATH = '/api/verse/fleet/history?days=90';\n\n/**\n * FLEET_HISTORY_PATH plus the viewer's zone (`tz`, Date#getTimezoneOffset\n * minutes, which the route accepts). Without it the server bucketed runs by\n * the UTC day (tz defaults to 0), so a Sep 25 evening's runs sat in a\n * \"Sep 26\" column west of UTC. Read at fetch time, so a DST change between\n * polls is picked up.\n */\nexport function fleetHistoryPath(now: Date = new Date()): string {\n return `${FLEET_HISTORY_PATH}&tz=${now.getTimezoneOffset()}`;\n}\nexport const REASONING_DIGEST_PATH = '/api/reasoning/digest?days=30';\n/** Eight days: the whole weekly window plus the day before it opened. */\nexport const SEAT_HISTORY_PATH = '/api/verse/budget/history?days=8';\n\nexport const SURFACE_KEYS = Object.freeze({\n authority: 'verse-authority',\n authorityDraft: 'verse-authority-draft',\n authorityEliteDraft: 'verse-authority-draft-elite',\n fleetLive: 'verse-fleet-live',\n leader: 'verse-leader',\n learning: 'verse-learning',\n fleetHistory: 'verse-fleet-history-90d',\n reasoningDigest: 'verse-reasoning-digest-30d',\n seatHistory: 'verse-seat-history-8d',\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Structural guards: just enough to know the body is the contract's shape\n * (version tag + the arrays the cards iterate), so a mismatched server can\n * never crash a render with `undefined.map`. Field-level honesty (null =\n * unknown) is the cards' job.\n */\nexport const narrow = {\n authority(raw: unknown): AuthorityStatusV1 | null {\n return isRecord(raw) && raw['v'] === 1 && typeof raw['switch'] === 'string' && isRecord(raw['grant']) ? (raw as unknown as AuthorityStatusV1) : null;\n },\n draft(raw: unknown): AuthorityGrantDraft | null {\n return isRecord(raw) && isRecord(raw['payload']) && typeof raw['digest'] === 'string' ? (raw as unknown as AuthorityGrantDraft) : null;\n },\n fleetLive(raw: unknown): FleetLiveSnapshotV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['runs']) && Array.isArray(raw['repos']) && Array.isArray(raw['lanes']) && isRecord(raw['summary'])\n ? (raw as unknown as FleetLiveSnapshotV1)\n : null;\n },\n leader(raw: unknown): LeaderStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['timeline']) && Array.isArray(raw['actions']) && isRecord(raw['hitRate'])\n ? (raw as unknown as LeaderStateV1)\n : null;\n },\n learning(raw: unknown): LearningStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['versions']) && Array.isArray(raw['experiments']) ? (raw as unknown as LearningStateV1) : null;\n },\n activity(raw: unknown): VerseActivityResponse | null {\n return isRecord(raw) && Array.isArray(raw['needsYou']) && Array.isArray(raw['running']) && isRecord(raw['sources']) ? (raw as unknown as VerseActivityResponse) : null;\n },\n fleetHistory(raw: unknown): FleetHistoryResponse | null {\n return isRecord(raw) && Array.isArray(raw['days']) && isRecord(raw['sources']) && isRecord(raw['funnel']) ? (raw as unknown as FleetHistoryResponse) : null;\n },\n reasoningDigest(raw: unknown): ReasoningDigest | null {\n return isRecord(raw) && Array.isArray(raw['insights']) && Array.isArray(raw['trends']) && isRecord(raw['totals']) ? (raw as unknown as ReasoningDigest) : null;\n },\n /** Series and points are re-checked one by one where they are merged (command-model mergeSeatHistory). */\n seatHistory(raw: unknown): CapacityHistoryResponse | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['series']) ? (raw as unknown as CapacityHistoryResponse) : null;\n },\n};\n\n/** Operator words for a source that did not answer (never a path, never a trace). */\nfunction absence(what: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return `${what} is not in this build yet, so this card has no source.`;\n if (err.status === 503) return `${what} failed to load on the server.`;\n // A refusal the route explained (409 with a sentence): say it, not the status.\n if (err.detail && err.status < 500) return /[.!?]$/.test(err.detail) ? err.detail : `${err.detail}.`;\n return `${what} answered HTTP ${err.status}.`;\n }\n return `${what} could not be reached.`;\n}\n\n/** A QueryDef whose value is an OptionalRead: 404 / unreachable / unrecognised all resolve, never throw. */\nexport function optionalQuery<T>(key: string, path: string | (() => string), what: string, guard: (raw: unknown) => T | null): QueryDef<OptionalRead<T>> {\n return {\n key,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(typeof path === 'function' ? path() : path, signal);\n const value = guard(raw);\n if (value === null) {\n // Nothing is shown rather than guessed from an unknown shape.\n return { value: null, available: true, reason: 'Unrecognized response — update Ashlr.' };\n }\n return { value, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { value: null, available: false, reason: absence(what, err), code: err instanceof ApiError ? err.code : null };\n }\n },\n };\n}\n\nexport const authorityQuery = optionalQuery(SURFACE_KEYS.authority, AUTHORITY_PATH, 'The authority service', narrow.authority);\nexport const authorityDraftQuery = optionalQuery(SURFACE_KEYS.authorityDraft, AUTHORITY_DRAFT_PATH, 'The grant draft', narrow.draft);\n/** 3.15: the same draft with the one `elite-direct` rung (elite models land on green tests, no judge). */\nexport const authorityEliteDraftQuery = optionalQuery(SURFACE_KEYS.authorityEliteDraft, `${AUTHORITY_DRAFT_PATH}?eliteDirect=1`, 'The elite-direct grant draft', narrow.draft);\nexport const fleetLiveQuery = optionalQuery(SURFACE_KEYS.fleetLive, FLEET_LIVE_PATH, 'The live fleet view', narrow.fleetLive);\nexport const leaderQuery = optionalQuery(SURFACE_KEYS.leader, LEADER_PATH, 'The Leader', narrow.leader);\nexport const learningQuery = optionalQuery(SURFACE_KEYS.learning, LEARNING_PATH, 'Self-improvement', narrow.learning);\nexport const fleetHistoryQuery = optionalQuery(SURFACE_KEYS.fleetHistory, () => fleetHistoryPath(), 'Fleet history', narrow.fleetHistory);\nexport const reasoningDigestQuery = optionalQuery(SURFACE_KEYS.reasoningDigest, REASONING_DIGEST_PATH, 'The reasoning digest', narrow.reasoningDigest);\n/** Optional like every surface read: a server without the route leaves the burn-downs on this page's own readings. */\nexport const seatHistoryQuery = optionalQuery(SURFACE_KEYS.seatHistory, SEAT_HISTORY_PATH, 'Seat history', narrow.seatHistory);\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/**\n * One authority action. The server answers the new AuthorityStatusV1 for\n * every form; raising past the grant is its 409 `grant-required` (the page\n * opens the Touch ID sheet BEFORE ever sending that, but the server is the\n * authority — a stale page gets the refusal, not a raise).\n */\nexport async function postAuthority(action: AuthorityActionRequest): Promise<AuthorityStatusV1 | null> {\n const result = await post<unknown>(AUTHORITY_PATH, action);\n invalidate(SURFACE_KEYS.authority);\n invalidate(SURFACE_KEYS.fleetLive);\n void refreshActivity();\n if (action.action === 'grant' || action.action === 're-approve') {\n invalidate(SURFACE_KEYS.authorityDraft);\n invalidate(SURFACE_KEYS.authorityEliteDraft);\n }\n return narrow.authority(result);\n}\n\nexport async function postFleetLive(action: FleetLiveActionRequest): Promise<unknown> {\n const result = await post<unknown>(FLEET_LIVE_PATH, action);\n invalidate(SURFACE_KEYS.fleetLive);\n void refreshActivity();\n return result;\n}\n\nexport async function postLeader(action: LeaderActionRequest): Promise<unknown> {\n const result = await post<unknown>(LEADER_PATH, action);\n invalidate(SURFACE_KEYS.leader);\n void refreshActivity();\n return result;\n}\n\n/**\n * A Needs-you item's own action. `path` was validated by the producer\n * (isNeedsYouItem → isSafeApiRoute) and is re-checked here: the mutation\n * token must never be aimed anywhere but this origin's /api/.\n */\nexport async function postNeedsYouAction(path: string, body: Record<string, unknown>): Promise<unknown> {\n if (!/^\\/api\\/[^\\s\\\\]*$/.test(path) || path.startsWith('//') || path.includes('..')) {\n throw new Error('That action points outside this app, so it was not sent.');\n }\n const result = await post<unknown>(path, body);\n void refreshActivity();\n invalidate(SURFACE_KEYS.fleetLive);\n invalidate(SURFACE_KEYS.leader);\n invalidate(SURFACE_KEYS.authority);\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{z as e}from"./global-BCRR2nnJ.js";import{p as t}from"./queries-CHY928bU.js";import{T as n,w as r}from"./VerseShared-CCeoBq-8.js";import{n as i}from"./verse-bootstrap-query-B-jTQ8nR.js";import{n as a,t as o}from"./budget-queries-wnFwZf0d.js";import{r as s}from"./cloud-queries-C99COqh-.js";import{a as c,c as l,h as u,l as d,o as f,s as p}from"./surface-data-CLlkcEWM.js";import{r as m}from"./overnight-queries-NwxEwM2i.js";import{a as h,o as g}from"./thread-data-Bom_qVem.js";import{n as _,r as v}from"./fleet-control-queries-CyY4rlLL.js";var y={command:[c,p,l,d,f,a,s,g,_],fleet:[p,c,m,a,o,_,v],growth:[f,d,t(`30d`),c,p],mind:[l,g,h,u,i,n,c,p],chat:[i,r,n]},b=6e4;async function x(t,n={}){let r=n.ensure??e;for(let e of y[t]??[])try{if(n.beforeEach&&!await n.beforeEach())return;await r(e.key,()=>e.fetch(),b)}catch{}}export{b as PREFETCH_FRESH_MS,y as SURFACE_PREFETCH,x as prefetchSurfaceData};
|
|
2
|
-
//# sourceMappingURL=surface-prefetch-DcKPZWEe.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surface-prefetch-DcKPZWEe.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/surface-prefetch.ts"],"sourcesContent":["/**\n * routes/verse/shell/surface-prefetch.ts — the reads each rail surface opens\n * with, so the shell can warm them while the operator is still reading chat\n * (shell/warmup.ts, once the operator is idle after first paint). A first\n * visit to Command, Fleet, Growth or Mind then paints from the cache instead\n * of a skeleton; the surface's own useQuery still refreshes whatever is older\n * than it accepts.\n *\n * LAZY ONLY. shell/warmup.ts loads this module with import(): these query\n * defs pull in the surfaces' data modules, none of which may cost chat\n * first-paint bytes (VerseApp.first-paint.test.ts pins it). The QueryDefs\n * themselves are the surfaces' own — same keys, same fetchers — so a warmed\n * entry IS the entry the surface reads.\n *\n * Keep each list in step with its surface's useQuery calls:\n * surface-prefetch.test.ts renders Command, Growth and Mind and fails when\n * they read something this table does not warm.\n */\nimport { ensureQuery } from '../../../data/cache.js';\nimport { modelsQuery, type QueryDef } from '../../../data/queries.js';\nimport { overnightQuery } from '../autonomy/overnight-queries.js';\nimport { budgetPreviewQuery, budgetQuery } from '../budget/budget-queries.js';\nimport { cloudQuery } from '../cloud/cloud-queries.js';\nimport {\n authorityQuery,\n fleetHistoryQuery,\n fleetLiveQuery,\n leaderQuery,\n learningQuery,\n reasoningDigestQuery,\n} from '../command/surface-data.js';\nimport { leaderDirectivesQuery, leaderThreadQuery } from '../leader/thread-data.js';\nimport { fleetControlQuery, fleetQueueQuery } from '../fleet/fleet-control-queries.js';\nimport { verseBootstrapQuery, verseSessionsQuery, verseWorkspacesQuery } from '../verse-queries.js';\nimport type { VerseSectionId } from '../verse-ui-store.js';\n\ntype AnyQuery = QueryDef<unknown>;\n\n/** What each rail surface reads the moment it mounts. */\nexport const SURFACE_PREFETCH: Readonly<Partial<Record<VerseSectionId, readonly AnyQuery[]>>> = {\n // No seat history: the burn-downs that drew it moved to Usage (audit 14);\n // Command's seat strip reads the budget and the rail's warm seat caches.\n // cloudQuery (3.11): the Cloud card's overview — without it a first visit\n // paints \"Reading the cloud lane…\" under the seat strip.\n // leaderThreadQuery: the Leader card's latest-message line (leader/LeaderLine).\n // fleetControlQuery (3.15): Command's one line about the fleet (fleet/FleetStatusLink).\n command: [authorityQuery, fleetLiveQuery, leaderQuery, learningQuery, fleetHistoryQuery, budgetQuery, cloudQuery, leaderThreadQuery, fleetControlQuery],\n // authorityQuery + fleetLiveQuery on Fleet, Growth and Mind: the shared\n // \"Autonomy is off\" state (autonomy/AutonomyOffState) reads both.\n // fleetControlQuery + fleetQueueQuery (3.15): the control surface and the steer panel.\n fleet: [fleetLiveQuery, authorityQuery, overnightQuery, budgetQuery, budgetPreviewQuery, fleetControlQuery, fleetQueueQuery],\n growth: [fleetHistoryQuery, learningQuery, modelsQuery('30d'), authorityQuery, fleetLiveQuery],\n // The conversation (leader/LeaderConversation) reads the thread and the directives.\n mind: [leaderQuery, leaderThreadQuery, leaderDirectivesQuery, reasoningDigestQuery, verseBootstrapQuery, verseWorkspacesQuery, authorityQuery, fleetLiveQuery],\n chat: [verseBootstrapQuery, verseSessionsQuery, verseWorkspacesQuery],\n};\n\n/**\n * A cached answer younger than this is left alone. The surfaces accept 10–60 s\n * old data on mount, so anything fresher than a minute is already as good as\n * a warm-up can make it.\n */\nexport const PREFETCH_FRESH_MS = 60_000;\n\ntype Ensure = (key: string, fetcher: () => Promise<unknown>, maxAgeMs: number) => Promise<void>;\n\nexport interface PrefetchOptions {\n /** The cache's mount path (a seam for tests). */\n ensure?: Ensure;\n /**\n * Awaited before EACH read (the warm-up's idle gate). Resolving false stops\n * the warm-up there — the gate was cancelled.\n */\n beforeEach?: () => Promise<boolean> | boolean;\n}\n\n/**\n * Warm one surface's reads through the shared cache (joins an in-flight read,\n * skips a fresh one, and goes through the cache's concurrency gate).\n *\n * ONE AT A TIME: each read is awaited before the next is even considered, so\n * the warm-up never holds more than one of the gate's slots, and the operator\n * (who gets the other three, and whose reads the next `beforeEach` waits out)\n * is never queued behind a burst of it.\n *\n * Never rejects: a read that fails leaves the surface to load it as it always did.\n */\nexport async function prefetchSurfaceData(id: VerseSectionId, options: PrefetchOptions = {}): Promise<void> {\n const ensure = options.ensure ?? ensureQuery;\n for (const def of SURFACE_PREFETCH[id] ?? []) {\n try {\n if (options.beforeEach && !(await options.beforeEach())) return;\n await ensure(def.key, () => def.fetch(), PREFETCH_FRESH_MS);\n } catch {\n // A warm-up read that fails (or cannot even start) is not worth surfacing.\n }\n }\n}\n"],"mappings":"kiBAuCA,IAAa,EAAmF,CAO9F,QAAS,CAAC,EAAgB,EAAgB,EAAa,EAAe,EAAmB,EAAa,EAAY,EAAmB,CAAiB,EAItJ,MAAO,CAAC,EAAgB,EAAgB,EAAgB,EAAa,EAAoB,EAAmB,CAAe,EAC3H,OAAQ,CAAC,EAAmB,EAAe,EAAY,KAAK,EAAG,EAAgB,CAAc,EAE7F,KAAM,CAAC,EAAa,EAAmB,EAAuB,EAAsB,EAAqB,EAAsB,EAAgB,CAAc,EAC7J,KAAM,CAAC,EAAqB,EAAoB,CAAoB,CACtE,EAOa,EAAoB,IAyBjC,eAAsB,EAAoB,EAAoB,EAA2B,CAAC,EAAkB,CAC1G,IAAM,EAAS,EAAQ,QAAU,EACjC,IAAK,IAAM,KAAO,EAAiB,IAAO,CAAC,EACzC,GAAI,CACF,GAAI,EAAQ,YAAc,CAAE,MAAM,EAAQ,WAAW,EAAI,OACzD,MAAM,EAAO,EAAI,QAAW,EAAI,MAAM,EAAG,CAAiB,CAC5D,MAAQ,CAER,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{O as e}from"./verse-model-DAOz9LrY.js";import{n as t}from"./tool-semantics-DtFU7rvB.js";import{i as n}from"./sidebar-model-COzIPSiP.js";function r(n){let r=0;for(let e=n.length-1;e>=0;--e)if(n[e].kind===`user`){r=e;break}let i=[],a=[];for(let o=r;o<n.length;o+=1){let r=n[o];if(r.kind!==`tool`)continue;let s={toolUseId:r.toolUseId,kind:t(r.name)===`task`?`subagent`:`tool`,name:r.name,detail:e(r.input)||r.name,startedAt:r.at,status:r.result===null?`running`:r.result.isError?`failed`:`done`,durationMs:r.durationMs};(s.status===`running`?i:a).push(s)}return[...i,...a.reverse()]}function i(e,t,r){let i=new Map;for(let e of t?.running??[])e.sessionId!==r&&i.set(e.sessionId,{sessionId:e.sessionId,title:e.title,engine:e.engine,startedAt:e.startedAt,live:n(e.live)});for(let t of e)t.id===r||t.status!==`running`||i.has(t.id)||i.set(t.id,{sessionId:t.id,title:t.title,engine:t.engine,startedAt:null,live:null});return[...i.values()]}function a(e,t){let n=e.filter(e=>e.status===`running`);return{turn:n.length,subagents:n.filter(e=>e.kind===`subagent`).length,chats:t.length,total:n.length+t.length}}function o(e){let t=`${e.total} running task${e.total===1?``:`s`}`,n=[];return e.turn>0&&n.push(`${e.turn} in this chat`),e.chats>0&&n.push(`${e.chats} other chat${e.chats===1?``:`s`}`),n.length>0?`${t}: ${n.join(`, `)}`:t}export{a as countTasks,r as currentTurnTasks,o as describeTaskCounts,i as otherRunningChats};
|
|
2
|
-
//# sourceMappingURL=tasks-model-CbmPgWL8.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-model-CbmPgWL8.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/tasks-model.ts"],"sourcesContent":["/**\n * routes/verse/chat/tasks-model.ts — what is running right now, for the\n * \"◌ 3 running tasks\" chip and the dock's Tasks pane (SPEC-310C §2–§3, C2).\n *\n * Two kinds of task, because the operator is waiting on both:\n * - THIS TURN: the open chat's tool calls and subagents since its last ask\n * (a running `Task` is a subagent; everything else is a tool);\n * - OTHER CHATS: every other chat with a turn in flight, from activity\n * (C1) when it answers, else from the session list's `status`.\n *\n * Pure over transcript items and the session / activity lists.\n */\nimport type { VerseEngine, VerseSession } from '../../../data/api-types.js';\nimport type { VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { TranscriptItem } from '../verse-store.js';\nimport { summarizeToolInput } from '../verse-model.js';\nimport { liveLine } from './sidebar-model.js';\nimport { actionForName } from './tool-semantics.js';\n\nexport type TurnTaskStatus = 'running' | 'done' | 'failed';\n\nexport interface TurnTask {\n toolUseId: string;\n kind: 'subagent' | 'tool';\n /** Tool name as the CLI spelled it. */\n name: string;\n /** What it is doing: the command, the path, the subagent's description. */\n detail: string;\n /** ISO time the call started. */\n startedAt: string;\n status: TurnTaskStatus;\n durationMs: number | null;\n}\n\nexport interface ChatTask {\n sessionId: string;\n title: string;\n engine: VerseEngine;\n /** ISO start of the running turn when activity knows it; null = unknown. */\n startedAt: string | null;\n /** The muted \"what it is doing\" line; null when unknown. */\n live: string | null;\n}\n\n/** The last turn's tool calls, running first (in start order), then finished (newest first). */\nexport function currentTurnTasks(items: readonly TranscriptItem[]): TurnTask[] {\n let start = 0;\n for (let i = items.length - 1; i >= 0; i -= 1) {\n if (items[i]!.kind === 'user') {\n start = i;\n break;\n }\n }\n const running: TurnTask[] = [];\n const finished: TurnTask[] = [];\n for (let i = start; i < items.length; i += 1) {\n const item = items[i]!;\n if (item.kind !== 'tool') continue;\n const task: TurnTask = {\n toolUseId: item.toolUseId,\n kind: actionForName(item.name) === 'task' ? 'subagent' : 'tool',\n name: item.name,\n detail: summarizeToolInput(item.input) || item.name,\n startedAt: item.at,\n status: item.result === null ? 'running' : item.result.isError ? 'failed' : 'done',\n durationMs: item.durationMs,\n };\n (task.status === 'running' ? running : finished).push(task);\n }\n return [...running, ...finished.reverse()];\n}\n\nexport function otherRunningChats(\n sessions: readonly VerseSession[],\n activity: VerseActivityResponse | null,\n currentId: string | null,\n): ChatTask[] {\n const out = new Map<string, ChatTask>();\n for (const row of activity?.running ?? []) {\n if (row.sessionId === currentId) continue;\n out.set(row.sessionId, {\n sessionId: row.sessionId,\n title: row.title,\n engine: row.engine,\n startedAt: row.startedAt,\n live: liveLine(row.live),\n });\n }\n // The session list can know about a run activity has not reported (a\n // server without C1's route, or the few seconds between polls).\n for (const session of sessions) {\n if (session.id === currentId || session.status !== 'running' || out.has(session.id)) continue;\n out.set(session.id, { sessionId: session.id, title: session.title, engine: session.engine, startedAt: null, live: null });\n }\n return [...out.values()];\n}\n\nexport interface TaskCounts {\n /** Running calls in this turn. */\n turn: number;\n /** Of which subagents. */\n subagents: number;\n /** Other chats running. */\n chats: number;\n total: number;\n}\n\nexport function countTasks(turn: readonly TurnTask[], chats: readonly ChatTask[]): TaskCounts {\n const running = turn.filter((t) => t.status === 'running');\n return {\n turn: running.length,\n subagents: running.filter((t) => t.kind === 'subagent').length,\n chats: chats.length,\n total: running.length + chats.length,\n };\n}\n\n/** \"3 running tasks\" — and what they are, for the chip's accessible name. */\nexport function describeTaskCounts(counts: TaskCounts): string {\n const head = `${counts.total} running task${counts.total === 1 ? '' : 's'}`;\n const parts: string[] = [];\n if (counts.turn > 0) parts.push(`${counts.turn} in this chat`);\n if (counts.chats > 0) parts.push(`${counts.chats} other chat${counts.chats === 1 ? '' : 's'}`);\n return parts.length > 0 ? `${head}: ${parts.join(', ')}` : head;\n}\n"],"mappings":"+IA6CA,SAAgB,EAAiB,EAA8C,CAC7E,IAAI,EAAQ,EACZ,IAAK,IAAI,EAAI,EAAM,OAAS,EAAG,GAAK,EAAG,IACrC,GAAI,EAAM,EAAE,CAAE,OAAS,OAAQ,CAC7B,EAAQ,EACR,KACF,CAEF,IAAM,EAAsB,CAAC,EACvB,EAAuB,CAAC,EAC9B,IAAK,IAAI,EAAI,EAAO,EAAI,EAAM,OAAQ,GAAK,EAAG,CAC5C,IAAM,EAAO,EAAM,GACnB,GAAI,EAAK,OAAS,OAAQ,SAC1B,IAAM,EAAiB,CACrB,UAAW,EAAK,UAChB,KAAM,EAAc,EAAK,IAAI,IAAM,OAAS,WAAa,OACzD,KAAM,EAAK,KACX,OAAQ,EAAmB,EAAK,KAAK,GAAK,EAAK,KAC/C,UAAW,EAAK,GAChB,OAAQ,EAAK,SAAW,KAAO,UAAY,EAAK,OAAO,QAAU,SAAW,OAC5E,WAAY,EAAK,UACnB,GACC,EAAK,SAAW,UAAY,EAAU,EAAA,CAAU,KAAK,CAAI,CAC5D,CACA,MAAO,CAAC,GAAG,EAAS,GAAG,EAAS,QAAQ,CAAC,CAC3C,CAEA,SAAgB,EACd,EACA,EACA,EACY,CACZ,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAO,GAAU,SAAW,CAAC,EAClC,EAAI,YAAc,GACtB,EAAI,IAAI,EAAI,UAAW,CACrB,UAAW,EAAI,UACf,MAAO,EAAI,MACX,OAAQ,EAAI,OACZ,UAAW,EAAI,UACf,KAAM,EAAS,EAAI,IAAI,CACzB,CAAC,EAIH,IAAK,IAAM,KAAW,EAChB,EAAQ,KAAO,GAAa,EAAQ,SAAW,WAAa,EAAI,IAAI,EAAQ,EAAE,GAClF,EAAI,IAAI,EAAQ,GAAI,CAAE,UAAW,EAAQ,GAAI,MAAO,EAAQ,MAAO,OAAQ,EAAQ,OAAQ,UAAW,KAAM,KAAM,IAAK,CAAC,EAE1H,MAAO,CAAC,GAAG,EAAI,OAAO,CAAC,CACzB,CAYA,SAAgB,EAAW,EAA2B,EAAwC,CAC5F,IAAM,EAAU,EAAK,OAAQ,GAAM,EAAE,SAAW,SAAS,EACzD,MAAO,CACL,KAAM,EAAQ,OACd,UAAW,EAAQ,OAAQ,GAAM,EAAE,OAAS,UAAU,CAAC,CAAC,OACxD,MAAO,EAAM,OACb,MAAO,EAAQ,OAAS,EAAM,MAChC,CACF,CAGA,SAAgB,EAAmB,EAA4B,CAC7D,IAAM,EAAO,GAAG,EAAO,MAAM,eAAe,EAAO,QAAU,EAAI,GAAK,MAChE,EAAkB,CAAC,EAGzB,OAFI,EAAO,KAAO,GAAG,EAAM,KAAK,GAAG,EAAO,KAAK,cAAc,EACzD,EAAO,MAAQ,GAAG,EAAM,KAAK,GAAG,EAAO,MAAM,aAAa,EAAO,QAAU,EAAI,GAAK,KAAK,EACtF,EAAM,OAAS,EAAI,GAAG,EAAK,IAAI,EAAM,KAAK,IAAI,IAAM,CAC7D"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{C as e,M as t,a as n,i as r}from"./global-BCRR2nnJ.js";import{ot as i}from"./VerseShared-CCeoBq-8.js";var a=class extends Error{constructor(){super(`Unlock actions with the mutation token to use the terminal.`),this.name=`TerminalLockedError`}};async function o(r,i){let o=e();if(!o)throw new a;let s=await n(r,i,o);return t(),s}function s(e,t){return`${i}/${encodeURIComponent(e)}/${t}`}var c={list:e=>r(i,e),create:async e=>(await o(i,e)).tab,input:(e,t)=>o(s(e,`input`),{dataBase64:t}),resize:(e,t,n)=>o(s(e,`resize`),{cols:t,rows:n}),kill:async e=>{await o(s(e,`kill`),{})},openExternal:async(e,t)=>{await o(`${i}/open-external`,t===void 0?{sessionId:e}:{sessionId:e,root:t})}};function l(e,t){let n=Number.isSafeInteger(t)&&t>0?`?after=${t}`:``;return`${s(e,`stream`)}${n}`}function u(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function d(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function f(e){let t=e.replace(/\s+$/,``),n=Math.max(0,...Array.from(t.matchAll(/`+/g),e=>e[0].length)),r="`".repeat(Math.max(3,n+1));return`${r}\n${t}\n${r}`}export{c as a,f as i,d as n,l as o,u as r,a as t};
|
|
2
|
-
//# sourceMappingURL=terminal-client-CagF1uyM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-client-CagF1uyM.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-client.ts"],"sourcesContent":["/**\n * dock/terminal/terminal-client.ts — the Terminal pane's HTTP calls (unit C4).\n *\n * Writes carry the held mutation token (auth-store), exactly like\n * verse-queries' writes; the stream is read with fetch() + the read-client\n * header rather than EventSource (see terminal-stream.ts for why).\n */\nimport type {\n VerseTerminalCreateRequest,\n VerseTerminalListResponse,\n VerseTerminalTab,\n} from '../../../../data/api-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../../data/auth-store.js';\nimport { apiGet, apiPost } from '../../../../data/client.js';\nimport { VERSE_TERMINAL_PATH } from '../../../../../core/verse/workbench-types.js';\n\n/** Raised when a write is attempted with no mutation token held. */\nexport class TerminalLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token to use the terminal.');\n this.name = 'TerminalLockedError';\n }\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new TerminalLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nfunction tabPath(id: string, action: 'input' | 'resize' | 'kill' | 'stream'): string {\n return `${VERSE_TERMINAL_PATH}/${encodeURIComponent(id)}/${action}`;\n}\n\nexport interface TerminalApi {\n list(signal?: AbortSignal): Promise<VerseTerminalListResponse>;\n create(req: VerseTerminalCreateRequest): Promise<VerseTerminalTab>;\n input(id: string, dataBase64: string): Promise<void>;\n resize(id: string, cols: number, rows: number): Promise<void>;\n kill(id: string): Promise<void>;\n openExternal(sessionId: string, root?: string): Promise<void>;\n}\n\nexport const terminalApi: TerminalApi = {\n list: (signal) => apiGet<VerseTerminalListResponse>(VERSE_TERMINAL_PATH, signal),\n create: async (req) => (await post<{ tab: VerseTerminalTab }>(VERSE_TERMINAL_PATH, req)).tab,\n input: (id, dataBase64) => post<void>(tabPath(id, 'input'), { dataBase64 }),\n resize: (id, cols, rows) => post<void>(tabPath(id, 'resize'), { cols, rows }),\n kill: async (id) => { await post<unknown>(tabPath(id, 'kill'), {}); },\n openExternal: async (sessionId, root) => {\n await post<unknown>(`${VERSE_TERMINAL_PATH}/open-external`, root === undefined ? { sessionId } : { sessionId, root });\n },\n};\n\nexport function terminalStreamPath(id: string, after: number): string {\n const cursor = Number.isSafeInteger(after) && after > 0 ? `?after=${after}` : '';\n return `${tabPath(id, 'stream')}${cursor}`;\n}\n\n// ---------------------------------------------------------------------------\n// Bytes\n// ---------------------------------------------------------------------------\n\n/** Standard base64 of bytes (btoa over a binary string, chunked to stay off the arg-count limit). */\nexport function bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(binary);\n}\n\nexport function base64ToBytes(b64: string): Uint8Array {\n const binary = atob(b64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n return out;\n}\n\n/**\n * The fence for \"Send selection to chat\": one backtick longer than the\n * longest run inside the text (at least three), so a selection that itself\n * contains a fenced block cannot close ours early.\n */\nexport function fenceSelection(text: string): string {\n const trimmed = text.replace(/\\s+$/, '');\n const longest = Math.max(0, ...Array.from(trimmed.matchAll(/`+/g), (m) => m[0].length));\n const fence = '`'.repeat(Math.max(3, longest + 1));\n return `${fence}\\n${trimmed}\\n${fence}`;\n}\n"],"mappings":"6GAiBA,IAAa,EAAb,cAAyC,KAAM,CAC7C,aAAc,CACZ,MAAM,6DAA6D,EACnE,KAAK,KAAO,qBACd,CACF,EAEA,eAAe,EAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAEA,SAAS,EAAQ,EAAY,EAAwD,CACnF,MAAO,GAAG,EAAoB,GAAG,mBAAmB,CAAE,EAAE,GAAG,GAC7D,CAWA,IAAa,EAA2B,CACtC,KAAO,GAAW,EAAkC,EAAqB,CAAM,EAC/E,OAAQ,KAAO,KAAS,MAAM,EAAgC,EAAqB,CAAG,EAAA,CAAG,IACzF,OAAQ,EAAI,IAAe,EAAW,EAAQ,EAAI,OAAO,EAAG,CAAE,YAAW,CAAC,EAC1E,QAAS,EAAI,EAAM,IAAS,EAAW,EAAQ,EAAI,QAAQ,EAAG,CAAE,OAAM,MAAK,CAAC,EAC5E,KAAM,KAAO,IAAO,CAAE,MAAM,EAAc,EAAQ,EAAI,MAAM,EAAG,CAAC,CAAC,CAAG,EACpE,aAAc,MAAO,EAAW,IAAS,CACvC,MAAM,EAAc,GAAG,EAAoB,gBAAiB,IAAS,IAAA,GAAY,CAAE,WAAU,EAAI,CAAE,YAAW,MAAK,CAAC,CACtH,CACF,EAEA,SAAgB,EAAmB,EAAY,EAAuB,CACpE,IAAM,EAAS,OAAO,cAAc,CAAK,GAAK,EAAQ,EAAI,UAAU,IAAU,GAC9E,MAAO,GAAG,EAAQ,EAAI,QAAQ,IAAI,GACpC,CAOA,SAAgB,EAAc,EAA2B,CACvD,IAAI,EAAS,GACb,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,GAAK,MACrC,GAAU,OAAO,aAAa,GAAG,EAAM,SAAS,EAAG,EAAI,KAAM,CAAC,EAEhE,OAAO,KAAK,CAAM,CACpB,CAEA,SAAgB,EAAc,EAAyB,CACrD,IAAM,EAAS,KAAK,CAAG,EACjB,EAAM,IAAI,WAAW,EAAO,MAAM,EACxC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,EAAI,GAAK,EAAO,WAAW,CAAC,EACpE,OAAO,CACT,CAOA,SAAgB,EAAe,EAAsB,CACnD,IAAM,EAAU,EAAK,QAAQ,OAAQ,EAAE,EACjC,EAAU,KAAK,IAAI,EAAG,GAAG,MAAM,KAAK,EAAQ,SAAS,KAAK,EAAI,GAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAChF,EAAQ,IAAI,OAAO,KAAK,IAAI,EAAG,EAAU,CAAC,CAAC,EACjD,MAAO,GAAG,EAAM,IAAI,EAAQ,IAAI,GAClC"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./index-BUjFkE-k.js";var t=e();function n({size:e=16,children:n,...r}){return(0,t.jsx)(`svg`,{width:e,height:e,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,...r,children:n})}function r(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`m4.5 6.25 2 1.75-2 1.75M8.25 10h3`})]})}function i(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01`})]})}function a(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`m4.5 6.5 3.5 3.5 3.5-3.5`})})}function o(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M2.5 6v4h2.5l3.5 3V3L5 6H2.5Z`}),(0,t.jsx)(`path`,{d:`M11 5.5a3.5 3.5 0 0 1 0 5M12.75 3.75a6 6 0 0 1 0 8.5`})]})}function s(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M13 8H3.5M7.5 4 3.5 8l4 4`})})}function c(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M3 8h9.5M8.5 4l4 4-4 4`})})}function l(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M13 8a5 5 0 1 1-1.46-3.54`}),(0,t.jsx)(`path`,{d:`M13 2.75v2.5h-2.5`})]})}function u(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`8.5`,rx:`1.25`}),(0,t.jsx)(`path`,{d:`M6 13.75h4M8 11.25v2.5`})]})}function d(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`4.75`,y:`1.75`,width:`6.5`,height:`12.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M7.25 12h1.5`})]})}function f(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M5 3.5v9l7-4.5-7-4.5Z`})})}function p(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M9 1.75H4.25a1 1 0 0 0-1 1v10.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5.5L9 1.75Z`}),(0,t.jsx)(`path`,{d:`M9 1.75V5.5h3.75`})]})}function m(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`2.25`,y:`2.25`,width:`11.5`,height:`4.5`,rx:`1`}),(0,t.jsx)(`rect`,{x:`2.25`,y:`9.25`,width:`11.5`,height:`4.5`,rx:`1`}),(0,t.jsx)(`path`,{d:`M4.75 4.5h.01M4.75 11.5h.01`})]})}export{p as a,i as c,m as d,r as f,u as i,l,c as n,d as o,a as r,f as s,s as t,o as u};
|
|
2
|
-
//# sourceMappingURL=terminal-icons-D5DaYLkC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-icons-D5DaYLkC.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-icons.tsx"],"sourcesContent":["/**\n * dock/terminal/terminal-icons.tsx — the Terminal / Preview panes' own 16px\n * glyphs (unit C4). Same grammar as components/primitives/icons.tsx (16-unit\n * box, 1.5 stroke, round caps, currentColor, decorative) so they sit beside\n * the shared set; kept here because the shared set is not this unit's file.\n */\nimport type { ReactNode, SVGProps } from 'react';\n\nexport interface GlyphProps extends Omit<SVGProps<SVGSVGElement>, 'children' | 'viewBox'> {\n size?: number;\n}\n\nfunction Glyph({ size = 16, children, ...rest }: GlyphProps & { children: ReactNode }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}\n strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\" {...rest}>\n {children}\n </svg>\n );\n}\n\nexport function TerminalGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"m4.5 6.25 2 1.75-2 1.75M8.25 10h3\" /></Glyph>;\n}\n\nexport function PreviewGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01\" /></Glyph>;\n}\n\nexport function ChevronDownGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m4.5 6.5 3.5 3.5 3.5-3.5\" /></Glyph>;\n}\n\n/** Screen-reader mode: a speaker with sound lines. */\nexport function ScreenReaderGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.5 6v4h2.5l3.5 3V3L5 6H2.5Z\" /><path d=\"M11 5.5a3.5 3.5 0 0 1 0 5M12.75 3.75a6 6 0 0 1 0 8.5\" /></Glyph>;\n}\n\nexport function ArrowLeftGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M13 8H3.5M7.5 4 3.5 8l4 4\" /></Glyph>;\n}\n\nexport function ArrowRightGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M3 8h9.5M8.5 4l4 4-4 4\" /></Glyph>;\n}\n\nexport function ReloadGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M13 8a5 5 0 1 1-1.46-3.54\" /><path d=\"M13 2.75v2.5h-2.5\" /></Glyph>;\n}\n\nexport function DesktopGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"8.5\" rx=\"1.25\" /><path d=\"M6 13.75h4M8 11.25v2.5\" /></Glyph>;\n}\n\nexport function PhoneGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"4.75\" y=\"1.75\" width=\"6.5\" height=\"12.5\" rx=\"1.5\" /><path d=\"M7.25 12h1.5\" /></Glyph>;\n}\n\nexport function PlayGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M5 3.5v9l7-4.5-7-4.5Z\" /></Glyph>;\n}\n\nexport function FileGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M9 1.75H4.25a1 1 0 0 0-1 1v10.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5.5L9 1.75Z\" /><path d=\"M9 1.75V5.5h3.75\" /></Glyph>;\n}\n\nexport function ServerGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"2.25\" y=\"2.25\" width=\"11.5\" height=\"4.5\" rx=\"1\" /><rect x=\"2.25\" y=\"9.25\" width=\"11.5\" height=\"4.5\" rx=\"1\" /><path d=\"M4.75 4.5h.01M4.75 11.5h.01\" /></Glyph>;\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/xterm-B1njb2Cr.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{t as e}from"./index-BUjFkE-k.js";import{D as t,w as n}from"./global-BCRR2nnJ.js";import"./VerseShared-CCeoBq-8.js";import{o as r,r as i}from"./terminal-client-CagF1uyM.js";function a(e,t={}){let n=t.maxBytes??16384,r=new TextEncoder,a=[],o=0,s=null,c=!1,l=()=>{let e=new Uint8Array(o),t=0;for(let n of a)e.set(n,t),t+=n.length;let r=e.subarray(0,Math.min(n,e.length)),i=e.subarray(r.length);return a=i.length>0?[i]:[],o=i.length,r},u=async()=>{for(;!c&&o>0;){let n=l();try{await e(i(n))}catch(e){a=[],o=0,t.onError?.(e)}}s=null},d=e=>{c||e.length===0||(a.push(e),o+=e.length,s||=u())};return{pushText(e){d(r.encode(e))},pushBinary(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;d(t)},idle(){return s??Promise.resolve()},dispose(){c=!0,a=[],o=0}}}function o(e){return Math.min(250*2**e,8e3)}function s(e){let t=``;for(let n of e.split(`
|
|
3
|
-
`))n.startsWith(`data:`)&&(t+=n.slice(n.startsWith(`data: `)?6:5));if(!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(typeof n!=`object`||!n)return null;let r=n;return r.type===`output`&&typeof r.seq==`number`&&typeof r.dataBase64==`string`?{type:`output`,seq:r.seq,dataBase64:r.dataBase64}:r.type===`title`&&typeof r.title==`string`?{type:`title`,title:r.title}:r.type===`exit`?{type:`exit`,code:typeof r.code==`number`?r.code:null,signal:typeof r.signal==`string`?r.signal:null}:null}function c(e,i,a,c={}){let l=c.fetch??((e,t)=>fetch(e,t)),u=c.renew??t,d=c.proof??n,f=c.backoffMs??o,p=!1,m=null,h=null,g=0,_=!1,v=e=>{(!p||e===`closed`)&&a.onState?.(e)},y=()=>{p||(v(`reconnecting`),h=setTimeout(()=>{h=null,b()},f(g++)))};async function b(){if(p)return;m=new AbortController;let t;try{t=await l(r(e,i()),{method:`GET`,credentials:`same-origin`,headers:{"x-ashlr-read-client":d(),Accept:`text/event-stream`},signal:m.signal,cache:`no-store`})}catch{y();return}if(p)return;if(t.status===404){v(`gone`),p=!0;return}if(t.status===401){if(!_&&await u().catch(()=>!1)){_=!0,b();return}v(`expired`),p=!0;return}if(!t.ok||!t.body){y();return}_=!1,v(`open`);let n=t.body.getReader(),o=new TextDecoder,c=``;try{for(;;){let{value:e,done:t}=await n.read();if(t)break;g=0,c+=o.decode(e,{stream:!0});let r;for(;(r=c.indexOf(`
|
|
4
|
-
|
|
5
|
-
`))!==-1;){let e=c.slice(0,r);c=c.slice(r+2);let t=s(e);t&&!p&&a.onFrame(t)}}}catch{}y()}return v(`connecting`),b(),{close(){p||(p=!0,h&&clearTimeout(h),m?.abort(),a.onState?.(`closed`))}}}var l=5e3,u=null;function d(){return u||(u=Promise.all([e(()=>import(`./xterm-ScmBfeDI.js`),[]),e(()=>import(`./addon-fit-DIOBYJe3.js`),[]),e(()=>Promise.resolve({}),__vite__mapDeps([0]))]).then(([e,t])=>[e,t]),u.catch(()=>{u=null})),u}var f=async e=>{let[{Terminal:t},{FitAddon:n}]=await d(),r=new t({fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:1.2,cursorBlink:!0,cursorStyle:`bar`,scrollback:l,theme:e.theme,screenReaderMode:e.screenReaderMode,macOptionIsMeta:!0,minimumContrastRatio:3,allowProposedApi:!1}),i=new n;r.loadAddon(i);let a=!1;return{get cols(){return r.cols},get rows(){return r.rows},open(e){a||(a=!0,r.open(e))},write(e){r.write(e)},reset(){r.reset()},focus(){r.focus()},fit(){let e=i.proposeDimensions();return!e||!Number.isFinite(e.cols)||!Number.isFinite(e.rows)||e.cols<2||e.rows<2?null:(i.fit(),{cols:r.cols,rows:r.rows})},onData:e=>r.onData(e),onBinary:e=>r.onBinary(e),onSelectionChange:e=>r.onSelectionChange(e),hasSelection:()=>r.hasSelection(),getSelection:()=>r.getSelection(),paste(e){r.paste(e)},bracketedPaste:()=>r.modes.bracketedPasteMode,setTheme(e){r.options.theme=e},setScreenReaderMode(e){r.options.screenReaderMode=e},setKeyFilter(e){r.attachCustomKeyEventHandler(e)},dispose(){r.dispose()}}},p={foreground:`--term-fg`,background:`--term-bg`,cursor:`--term-cursor`,cursorAccent:`--term-bg`,selectionBackground:`--term-selection`,selectionForeground:`--term-fg`,selectionInactiveBackground:`--term-selection-inactive`,scrollbarSliderBackground:`--term-scrollbar`,scrollbarSliderHoverBackground:`--term-scrollbar-hover`,scrollbarSliderActiveBackground:`--term-scrollbar-hover`,overviewRulerBorder:`--term-bg`,black:`--term-black`,red:`--term-red`,green:`--term-green`,yellow:`--term-yellow`,blue:`--term-blue`,magenta:`--term-magenta`,cyan:`--term-cyan`,white:`--term-white`,brightBlack:`--term-bright-black`,brightRed:`--term-bright-red`,brightGreen:`--term-bright-green`,brightYellow:`--term-bright-yellow`,brightBlue:`--term-bright-blue`,brightMagenta:`--term-bright-magenta`,brightCyan:`--term-bright-cyan`,brightWhite:`--term-bright-white`},m;function h(e){if(typeof document>`u`)return e;if(m===void 0)try{let e=document.createElement(`canvas`);e.width=1,e.height=1,m=e.getContext(`2d`,{willReadFrequently:!0})}catch{m=null}let t=m;if(!t)return e;try{t.clearRect(0,0,1,1),t.fillStyle=e,t.fillRect(0,0,1,1);let[n,r,i,a]=t.getImageData(0,0,1,1).data;return a===void 0?e:a===255?`rgb(${n}, ${r}, ${i})`:`rgba(${n}, ${r}, ${i}, ${(a/255).toFixed(3)})`}catch{return e}}function g(e){let t=document.createElement(`span`);t.style.display=`none`,e.appendChild(t);let n={};try{for(let[r,i]of Object.entries(p)){if(!getComputedStyle(e).getPropertyValue(i).trim())continue;t.style.color=``,t.style.color=`var(${i})`;let a=getComputedStyle(t).color;a&&(n[r]=h(a))}}finally{t.remove()}return n}function _(e){let t=getComputedStyle(e),n=Number.parseFloat(t.fontSize);return{fontFamily:t.fontFamily||`ui-monospace, Menlo, monospace`,fontSize:Number.isFinite(n)&&n>=11?n:13}}function v(e){if(typeof window>`u`)return()=>{};let t=document.documentElement,n=typeof MutationObserver==`function`?new MutationObserver(()=>e()):null;n?.observe(t,{attributes:!0,attributeFilter:[`data-theme`,`data-accent`,`class`,`style`]});let r=typeof window.matchMedia==`function`?window.matchMedia(`(prefers-color-scheme: dark)`):null,i=()=>e();return r?.addEventListener?.(`change`,i),()=>{n?.disconnect(),r?.removeEventListener?.(`change`,i)}}export{c as a,v as i,_ as n,s as o,g as r,a as s,f as t};
|
|
6
|
-
//# sourceMappingURL=terminal-view-Crd7CW9-.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/input-queue.ts","../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-stream.ts","../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-view.ts"],"sourcesContent":["/**\n * dock/terminal/input-queue.ts — keystrokes to the shell, in order (unit C4).\n *\n * Every keystroke is a POST. Two POSTs in flight at once may arrive in either\n * order, and a shell that receives `sl` for `ls` runs the wrong command. So\n * input is SINGLE-FLIGHT: while one request is out, everything typed after it\n * accumulates and goes as the next request — in order, and coalesced (a burst\n * of typing or a paste becomes one or a few requests, not hundreds). The\n * server takes at most 16 KB per request, so a long paste is sent in 16 KB\n * slices, one after another.\n */\nimport { VERSE_TERMINAL_INPUT_MAX_BYTES } from '../../../../../core/verse/workbench-types.js';\nimport { bytesToBase64 } from './terminal-client.js';\n\nexport interface InputQueue {\n /** Text as xterm reports it (a JS string — encoded as UTF-8). */\n pushText(text: string): void;\n /** xterm `onBinary` data: one char per byte (0–255). */\n pushBinary(binary: string): void;\n /** Resolves once everything pushed so far has been sent (or dropped on error). */\n idle(): Promise<void>;\n /** Stop sending; anything queued is dropped. */\n dispose(): void;\n}\n\nexport function createInputQueue(\n send: (dataBase64: string) => Promise<void>,\n opts: { maxBytes?: number; onError?: (err: unknown) => void } = {},\n): InputQueue {\n const maxBytes = opts.maxBytes ?? VERSE_TERMINAL_INPUT_MAX_BYTES;\n const encoder = new TextEncoder();\n let pending: Uint8Array[] = [];\n let pendingBytes = 0;\n let running: Promise<void> | null = null;\n let disposed = false;\n\n const take = (): Uint8Array => {\n const all = new Uint8Array(pendingBytes);\n let offset = 0;\n for (const chunk of pending) {\n all.set(chunk, offset);\n offset += chunk.length;\n }\n const head = all.subarray(0, Math.min(maxBytes, all.length));\n const rest = all.subarray(head.length);\n pending = rest.length > 0 ? [rest] : [];\n pendingBytes = rest.length;\n return head;\n };\n\n const pump = async (): Promise<void> => {\n while (!disposed && pendingBytes > 0) {\n const slice = take();\n try {\n await send(bytesToBase64(slice));\n } catch (err) {\n // A failed keystroke is not retried: replaying it later, after newer\n // input, is exactly the reordering this queue exists to prevent.\n pending = [];\n pendingBytes = 0;\n opts.onError?.(err);\n }\n }\n running = null;\n };\n\n const push = (bytes: Uint8Array): void => {\n if (disposed || bytes.length === 0) return;\n pending.push(bytes);\n pendingBytes += bytes.length;\n if (!running) running = pump();\n };\n\n return {\n pushText(text) {\n push(encoder.encode(text));\n },\n pushBinary(binary) {\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i) & 0xff;\n push(bytes);\n },\n idle() {\n return running ?? Promise.resolve();\n },\n dispose() {\n disposed = true;\n pending = [];\n pendingBytes = 0;\n },\n };\n}\n","/**\n * dock/terminal/terminal-stream.ts — one terminal tab's live output (unit C4).\n *\n * WHY fetch() AND NOT EventSource. The server's read boundary accepts the\n * per-tab client proof as a query parameter ONLY on the three EventSource\n * paths it knows (read-session.ts); everywhere else it must be the\n * `x-ashlr-read-client` header, which EventSource cannot send. fetch() can,\n * and a streamed body reads the same `text/event-stream` frames. It also\n * lets the pane keep exactly ONE connection open — the visible tab's — which\n * matters because a browser allows about six per origin and Verse already\n * holds two (the app events and the open chat).\n *\n * RESUME. Each (re)connect asks for `?after=<the last seq written>`; the\n * server replays only newer frames from its 256 KB scrollback. A dropped\n * connection reconnects with backoff; a 401 renews the read session once;\n * a 404 means the tab is gone (killed, idle-closed, server restarted).\n */\nimport type { VerseTerminalFrame } from '../../../../data/api-types.js';\nimport { getReadClientProof, renewReadSession } from '../../../../data/auth-store.js';\nimport { terminalStreamPath } from './terminal-client.js';\n\nexport type TerminalStreamState = 'connecting' | 'open' | 'reconnecting' | 'gone' | 'expired' | 'closed';\n\nexport interface TerminalStreamHandlers {\n onFrame: (frame: VerseTerminalFrame) => void;\n onState?: (state: TerminalStreamState) => void;\n}\n\nexport interface TerminalStreamDeps {\n fetch?: typeof fetch;\n renew?: () => Promise<boolean>;\n proof?: () => string;\n /** Backoff before reconnect attempt `n` (0-based). */\n backoffMs?: (attempt: number) => number;\n}\n\nexport interface TerminalStream {\n close(): void;\n}\n\nfunction defaultBackoff(attempt: number): number {\n return Math.min(250 * 2 ** attempt, 8_000);\n}\n\n/** Parse one SSE block (`event:` / `data:` lines) into a frame; null for comments and junk. */\nexport function parseTerminalSseBlock(block: string): VerseTerminalFrame | null {\n let data = '';\n for (const line of block.split('\\n')) {\n if (line.startsWith('data:')) data += line.slice(line.startsWith('data: ') ? 6 : 5);\n }\n if (!data) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n if (parsed === null || typeof parsed !== 'object') return null;\n const frame = parsed as Record<string, unknown>;\n if (frame['type'] === 'output' && typeof frame['seq'] === 'number' && typeof frame['dataBase64'] === 'string') {\n return { type: 'output', seq: frame['seq'], dataBase64: frame['dataBase64'] };\n }\n if (frame['type'] === 'title' && typeof frame['title'] === 'string') return { type: 'title', title: frame['title'] };\n if (frame['type'] === 'exit') {\n return {\n type: 'exit',\n code: typeof frame['code'] === 'number' ? frame['code'] : null,\n signal: typeof frame['signal'] === 'string' ? frame['signal'] : null,\n };\n }\n return null;\n}\n\n/**\n * Stream `tabId`'s frames, resuming after `after()` on every (re)connect.\n * Returns a handle whose close() aborts the request and stops reconnecting.\n */\nexport function openTerminalStream(\n tabId: string,\n after: () => number,\n handlers: TerminalStreamHandlers,\n deps: TerminalStreamDeps = {},\n): TerminalStream {\n const doFetch = deps.fetch ?? ((input: RequestInfo | URL, init?: RequestInit) => fetch(input, init));\n const renew = deps.renew ?? renewReadSession;\n const proof = deps.proof ?? getReadClientProof;\n const backoff = deps.backoffMs ?? defaultBackoff;\n let closed = false;\n let controller: AbortController | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempt = 0;\n let renewedOnce = false;\n\n const setState = (state: TerminalStreamState): void => {\n if (!closed || state === 'closed') handlers.onState?.(state);\n };\n\n const schedule = (): void => {\n if (closed) return;\n setState('reconnecting');\n timer = setTimeout(() => {\n timer = null;\n void connect();\n }, backoff(attempt++));\n };\n\n async function connect(): Promise<void> {\n if (closed) return;\n controller = new AbortController();\n let res: Response;\n try {\n res = await doFetch(terminalStreamPath(tabId, after()), {\n method: 'GET',\n credentials: 'same-origin',\n headers: { 'x-ashlr-read-client': proof(), Accept: 'text/event-stream' },\n signal: controller.signal,\n cache: 'no-store',\n });\n } catch {\n schedule();\n return;\n }\n if (closed) return;\n if (res.status === 404) {\n setState('gone');\n closed = true;\n return;\n }\n if (res.status === 401) {\n if (!renewedOnce && (await renew().catch(() => false))) {\n renewedOnce = true;\n void connect();\n return;\n }\n setState('expired');\n closed = true;\n return;\n }\n if (!res.ok || !res.body) {\n schedule();\n return;\n }\n renewedOnce = false;\n setState('open');\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n attempt = 0;\n buffer += decoder.decode(value, { stream: true });\n let idx: number;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n const frame = parseTerminalSseBlock(block);\n if (frame && !closed) handlers.onFrame(frame);\n }\n }\n } catch {\n /* aborted, or the connection dropped: reconnect below unless closed */\n }\n // The server ends the stream when the tab is removed; the next connect\n // then answers 404 and reports 'gone'.\n schedule();\n }\n\n setState('connecting');\n void connect();\n\n return {\n close() {\n if (closed) return;\n closed = true;\n if (timer) clearTimeout(timer);\n controller?.abort();\n handlers.onState?.('closed');\n },\n };\n}\n","/**\n * dock/terminal/terminal-view.ts — the one seam between the Terminal pane and\n * xterm.js (unit C4).\n *\n * LAZY. `@xterm/xterm` (≈ 345 KB minified) and its stylesheet load only when\n * a terminal is first shown, as their own chunk — never on the chat's\n * critical path (SPEC-310C budget: chat critical JS ≤ 350 KB). The pane talks\n * to a small `TerminalView` interface, so tests inject a fake (jsdom has no\n * layout or canvas for xterm) and the pane never imports xterm itself.\n *\n * THEME FROM TOKENS. xterm wants concrete colours; the design system forbids\n * raw hex in new UI files and wants every colour to follow the theme. So the\n * palette is declared as CSS custom properties on the pane\n * (TerminalPane.module.css, mapped to design tokens for both themes) and\n * resolved here at runtime — a probe element turns `var(--x)` into a computed\n * colour, a 1×1 canvas normalises any colour syntax to rgb — and re-resolved\n * when the theme changes.\n */\nimport type { ITheme, Terminal as XtermTerminal } from '@xterm/xterm';\n\nexport interface TerminalViewDisposable {\n dispose(): void;\n}\n\nexport interface TerminalView {\n readonly cols: number;\n readonly rows: number;\n open(host: HTMLElement): void;\n write(data: Uint8Array): void;\n reset(): void;\n focus(): void;\n /** Fit to the host; returns the new size (or null when the host has no size — hidden). */\n fit(): { cols: number; rows: number } | null;\n onData(cb: (data: string) => void): TerminalViewDisposable;\n onBinary(cb: (data: string) => void): TerminalViewDisposable;\n onSelectionChange(cb: () => void): TerminalViewDisposable;\n hasSelection(): boolean;\n getSelection(): string;\n /** Paste as if typed (bracketed when the program asked for it). Never adds Enter. */\n paste(text: string): void;\n /** True while the program in the terminal has bracketed paste on (shells at a prompt do). */\n bracketedPaste(): boolean;\n setTheme(theme: TerminalTheme): void;\n setScreenReaderMode(on: boolean): void;\n /** Return false from `filter` to let a key pass to the page (app shortcuts). */\n setKeyFilter(filter: (event: KeyboardEvent) => boolean): void;\n dispose(): void;\n}\n\nexport type TerminalTheme = ITheme;\n\nexport interface TerminalViewOptions {\n fontFamily: string;\n fontSize: number;\n theme: TerminalTheme;\n screenReaderMode: boolean;\n}\n\nexport type TerminalViewFactory = (opts: TerminalViewOptions) => Promise<TerminalView>;\n\n/** Scrollback kept by the VIEW (lines). The server keeps its own 256 KB for reattach. */\nconst VIEW_SCROLLBACK_LINES = 5_000;\n\nlet xtermModules: Promise<[typeof import('@xterm/xterm'), typeof import('@xterm/addon-fit')]> | null = null;\n\nfunction loadXtermModules() {\n if (!xtermModules) {\n xtermModules = Promise.all([\n import('@xterm/xterm'),\n import('@xterm/addon-fit'),\n import('@xterm/xterm/css/xterm.css'),\n ]).then(([xterm, fit]) => [xterm, fit] as [typeof import('@xterm/xterm'), typeof import('@xterm/addon-fit')]);\n // A failed chunk load must be retryable (the pane offers \"Try again\").\n xtermModules.catch(() => { xtermModules = null; });\n }\n return xtermModules;\n}\n\n/** The real xterm.js view. */\nexport const createXtermView: TerminalViewFactory = async (opts) => {\n const [{ Terminal }, { FitAddon }] = await loadXtermModules();\n const term: XtermTerminal = new Terminal({\n fontFamily: opts.fontFamily,\n fontSize: opts.fontSize,\n lineHeight: 1.2,\n cursorBlink: true,\n cursorStyle: 'bar',\n scrollback: VIEW_SCROLLBACK_LINES,\n theme: opts.theme,\n screenReaderMode: opts.screenReaderMode,\n // ⌥ as Meta: word motions (⌥←/⌥→ → ESC b / ESC f) work as in Terminal.app\n // with \"Use Option as Meta key\".\n macOptionIsMeta: true,\n // Keep dim ANSI text legible on our surfaces in both themes.\n minimumContrastRatio: 3,\n allowProposedApi: false,\n });\n const fit = new FitAddon();\n term.loadAddon(fit);\n let opened = false;\n\n return {\n get cols() { return term.cols; },\n get rows() { return term.rows; },\n open(host) {\n if (opened) return;\n opened = true;\n term.open(host);\n },\n write(data) { term.write(data); },\n reset() { term.reset(); },\n focus() { term.focus(); },\n fit() {\n const dims = fit.proposeDimensions();\n if (!dims || !Number.isFinite(dims.cols) || !Number.isFinite(dims.rows) || dims.cols < 2 || dims.rows < 2) return null;\n fit.fit();\n return { cols: term.cols, rows: term.rows };\n },\n onData: (cb) => term.onData(cb),\n onBinary: (cb) => term.onBinary(cb),\n onSelectionChange: (cb) => term.onSelectionChange(cb),\n hasSelection: () => term.hasSelection(),\n getSelection: () => term.getSelection(),\n paste(text) { term.paste(text); },\n bracketedPaste: () => term.modes.bracketedPasteMode,\n setTheme(theme) { term.options.theme = theme; },\n setScreenReaderMode(on) { term.options.screenReaderMode = on; },\n setKeyFilter(filter) { term.attachCustomKeyEventHandler(filter); },\n dispose() { term.dispose(); },\n };\n};\n\n// ---------------------------------------------------------------------------\n// Theme resolution\n// ---------------------------------------------------------------------------\n\n/** ITheme key → the custom property TerminalPane.module.css declares for it. */\nexport const TERMINAL_THEME_VARS: Readonly<Record<keyof Omit<ITheme, 'extendedAnsi'>, string>> = {\n foreground: '--term-fg',\n background: '--term-bg',\n cursor: '--term-cursor',\n cursorAccent: '--term-bg',\n selectionBackground: '--term-selection',\n selectionForeground: '--term-fg',\n selectionInactiveBackground: '--term-selection-inactive',\n scrollbarSliderBackground: '--term-scrollbar',\n scrollbarSliderHoverBackground: '--term-scrollbar-hover',\n scrollbarSliderActiveBackground: '--term-scrollbar-hover',\n overviewRulerBorder: '--term-bg',\n black: '--term-black',\n red: '--term-red',\n green: '--term-green',\n yellow: '--term-yellow',\n blue: '--term-blue',\n magenta: '--term-magenta',\n cyan: '--term-cyan',\n white: '--term-white',\n brightBlack: '--term-bright-black',\n brightRed: '--term-bright-red',\n brightGreen: '--term-bright-green',\n brightYellow: '--term-bright-yellow',\n brightBlue: '--term-bright-blue',\n brightMagenta: '--term-bright-magenta',\n brightCyan: '--term-bright-cyan',\n brightWhite: '--term-bright-white',\n};\n\nlet canvasCtx: CanvasRenderingContext2D | null | undefined;\n\n/**\n * Any CSS colour → `rgb(r, g, b)` / `rgba(…)`, by painting one pixel. Canvas\n * accepts every syntax the browser does (hsl, color-mix, oklch) and the pixel\n * is plain sRGB, which is what xterm parses. Falls back to the input.\n */\nexport function normalizeCssColor(value: string): string {\n if (typeof document === 'undefined') return value;\n if (canvasCtx === undefined) {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n canvasCtx = canvas.getContext('2d', { willReadFrequently: true });\n } catch {\n canvasCtx = null;\n }\n }\n const ctx = canvasCtx;\n if (!ctx) return value;\n try {\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === undefined) return value;\n return a === 255 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${(a! / 255).toFixed(3)})`;\n } catch {\n return value;\n }\n}\n\n/**\n * Read the pane's `--term-*` properties as concrete colours. A probe child\n * with `color: var(--x)` makes the browser resolve every var() and\n * color-mix() for us; unset properties are left out (xterm keeps its default).\n */\nexport function resolveTerminalTheme(host: HTMLElement): TerminalTheme {\n const probe = document.createElement('span');\n probe.style.display = 'none';\n host.appendChild(probe);\n const theme: Record<string, string> = {};\n try {\n for (const [key, prop] of Object.entries(TERMINAL_THEME_VARS)) {\n const declared = getComputedStyle(host).getPropertyValue(prop).trim();\n if (!declared) continue;\n probe.style.color = '';\n probe.style.color = `var(${prop})`;\n const computed = getComputedStyle(probe).color;\n if (computed) theme[key] = normalizeCssColor(computed);\n }\n } finally {\n probe.remove();\n }\n return theme as TerminalTheme;\n}\n\n/** The host's computed monospace family and size (so the display-size setting reaches the terminal). */\nexport function resolveTerminalFont(host: HTMLElement): { fontFamily: string; fontSize: number } {\n const style = getComputedStyle(host);\n const size = Number.parseFloat(style.fontSize);\n return {\n fontFamily: style.fontFamily || 'ui-monospace, Menlo, monospace',\n fontSize: Number.isFinite(size) && size >= 11 ? size : 13,\n };\n}\n\n/** Call `onChange` when the effective colour theme changes (explicit toggle or OS appearance). */\nexport function watchThemeChanges(onChange: () => void): () => void {\n if (typeof window === 'undefined') return () => {};\n const root = document.documentElement;\n const observer = typeof MutationObserver === 'function'\n ? new MutationObserver(() => onChange())\n : null;\n observer?.observe(root, { attributes: true, attributeFilter: ['data-theme', 'data-accent', 'class', 'style'] });\n const media = typeof window.matchMedia === 'function' ? window.matchMedia('(prefers-color-scheme: dark)') : null;\n const onMedia = () => onChange();\n media?.addEventListener?.('change', onMedia);\n return () => {\n observer?.disconnect();\n media?.removeEventListener?.('change', onMedia);\n };\n}\n"],"file":"terminal-view-Crd7CW9-.js"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{C as e,M as t,V as n,a as r,i,r as a}from"./global-BCRR2nnJ.js";import{O as o}from"./VerseShared-CCeoBq-8.js";import{n as s}from"./control-queries-DpgKLZZ7.js";import{n as c,u as l}from"./surface-data-CLlkcEWM.js";import{a as u,i as d,n as f,o as p,r as m,s as h}from"./leader-thread-types-CDb-VPPO.js";function g(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var _=e=>typeof e==`string`&&e.length>0?e:null;function v(e){if(!g(e))return null;let{id:t,at:n,from:r,channel:i,kind:a,text:o}=e;if(typeof t!=`string`||t.length===0||typeof n!=`string`||!Number.isFinite(Date.parse(n))||r!==`mason`&&r!==`leader`||typeof o!=`string`)return null;let s={id:t,at:n,from:r,channel:f.includes(i)?i:`verse`,kind:m.includes(a)?a:`message`,text:o},c=_(e.replyTo),l=_(e.memoId),u=_(e.questionId);c&&(s.replyTo=c),l&&(s.memoId=l),u&&(s.questionId=u);let d=Array.isArray(e.actionIds)?e.actionIds.filter(e=>typeof e==`string`&&e.length>0):[];d.length&&(s.actionIds=d);let p=e.delivery;if(g(p)){let e=p.telegram;(e===`pending`||e===`sent`||e===`failed`)&&(s.delivery={telegram:e,..._(p.sentAt)?{sentAt:p.sentAt}:{}})}return s}function y(e){let t=Array.isArray(e)?e:g(e)&&Array.isArray(e.messages)?e.messages:null;return t?{messages:t.flatMap(e=>v(e)??[])}:null}function b(e){if(!g(e))return null;let{id:t,text:n}=e;if(typeof t!=`string`||t.length===0||typeof n!=`string`||n.trim().length===0||_(e.retiredAt)!==null)return null;let r=f.includes(e.channel)?e.channel:null;return{id:t,text:n.trim(),createdAt:_(e.createdAt),channel:r}}function x(e){let t=g(e)&&Array.isArray(e.directives)?e.directives:null;return t?t.flatMap(e=>b(e)??[]).sort((e,t)=>(Date.parse(e.createdAt??``)||0)-(Date.parse(t.createdAt??``)||0)):null}function S(e){if(!g(e))return null;let t=v(e.message);return t?{message:t,reply:v(e.reply),directive:b(e.directive)}:null}var C=12e4,w=e=>e.replace(/\s+/g,` `).trim();function T(e,t){return e.from!==`mason`||w(e.text)!==w(t.text)||t.kind===`answer`&&t.questionId&&e.questionId&&e.questionId!==t.questionId?!1:Date.parse(e.at)>=Date.parse(t.at)-C}var E=(e,t)=>Date.parse(e.at)-Date.parse(t.at)||0;function D(e,t=[],n=[]){let r=new Map;for(let e of t)r.set(e.id,e);for(let t of e)for(let e of t)r.set(e.id,e);let i=[...r.values()],a=new Set,o=[];for(let e of n){let t=e.state===`sending`?i.find(t=>!a.has(t.id)&&T(t,e)):void 0;t?a.add(t.id):o.push(e)}return[...i.map(e=>({type:`message`,key:e.id,at:e.at,message:e})),...o.map(e=>({type:`pending`,key:e.clientId,at:e.at,pending:e}))].map((e,t)=>({e,i:t})).sort((e,t)=>E(e.e,t.e)||e.i-t.i).map(({e})=>e)}function O(e){return e.type===`pending`?`mason`:e.message.from}function k(e){return e.type===`pending`?`verse`:e.message.channel}function A(e){return e.type===`message`&&(e.message.kind===`memo`||e.message.kind===`directive`)}function j(e){let t=new Date(e);return`${t.getFullYear()}-${t.getMonth()}-${t.getDate()}`}function M(e,t=Date.now()){let n=Date.parse(e);if(!Number.isFinite(n))return`—`;if(j(n)===j(t))return`Today`;if(j(n)===j(t-864e5))return`Yesterday`;let r=new Date(n),i=r.getFullYear()===new Date(t).getFullYear();return r.toLocaleDateString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`,...i?{}:{year:`numeric`}})}function N(e,t=Date.now()){let n=[],r=null,i=null,a=0;for(let o of e){let e=Date.parse(o.at),s=j(e);if(s!==r&&(r=s,n.push({type:`day`,key:`day-${s}`,label:M(o.at,t)}),i=null),o.type===`message`&&o.message.channel===`system`){n.push({type:`system`,key:o.key,entry:o}),i=null;continue}let c=O(o),l=k(o);i!==null&&!A(o)&&!A(i.entries[i.entries.length-1])&&i.from===c&&i.channel===l&&e-a<=3e5&&i?i.entries.push(o):(i={type:`group`,key:`g-${o.key}`,from:c,channel:l,at:o.at,entries:[o]},n.push(i)),a=e}return n}function P(e){let t=e.filter(e=>e.kind===`question`),n=new Map;for(let r of e){if(r.from!==`mason`||r.kind!==`answer`&&!r.replyTo)continue;let e=t.find(e=>r.questionId&&e.questionId===r.questionId||r.replyTo&&e.id===r.replyTo);e&&!n.has(e.id)&&n.set(e.id,r)}return n}function F(e,t){return t.questionId?e.find(e=>e.kind===`question`&&e.questionId===t.questionId)??null:null}var I=18e4;function L(e,t,n=Date.now()){if(e.some(e=>e.type===`pending`&&e.pending.state===`sending`))return!0;for(let r=e.length-1;r>=0;--r){let i=e[r];if(i.type===`message`&&i.message.channel!==`system`){if(i.message.from===`leader`)return!1;if(t.has(i.message.id))return n-Date.parse(i.message.at)<I}}return!1}var R={verse:`Verse`,telegram:`Telegram`,cli:`CLI`,system:`System`};function z(e){let t=null;for(let n of e)n.from===`leader`&&n.channel!==`system`&&(!t||Date.parse(n.at)>=Date.parse(t.at))&&(t=n);return t}function B(e,t=140){let n=e.replace(/```[\s\S]*?(```|$)/g,` `).replace(/!?\[([^\]]*)\]\([^)]*\)/g,`$1`).replace(/^\s{0,3}(#{1,6}|>|[-*+]|\d+\.)\s+/gm,``).replace(/[*_`~]+/g,``).replace(/\s+/g,` `).trim();if(n.length<=t)return n;let r=n.slice(0,t-1),i=r.lastIndexOf(` `);return`${(i>t*.6?r.slice(0,i):r).replace(/[\s,.;:–—-]+$/,``)}…`}function V(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`}):``}var H=4e3,U=Object.freeze({thread:`verse-leader-thread`,directives:`verse-leader-directives`}),W=l(U.thread,`${h}?limit=50`,`The Leader conversation`,y),G=l(U.directives,u,`Leader directives`,x);async function K(e,t){return y(await i(`${h}?limit=50&before=${encodeURIComponent(e)}`,t))?.messages??[]}function q(e){return encodeURIComponent(e).replace(/%3A/gi,`:`)}function J(){let t=e();if(!t)throw new s;return t}async function Y(e,n){let i=await r(e,n,J());return t(),i}async function X(e,t=null){let r=S(await Y(h,t?{text:e,replyTo:t}:{text:e}));return r?.directive&&n(U.directives),r}async function Z(e,t){let n=S(await Y(`${p}/${q(e)}/answer`,{text:t}));return o(),n}async function Q(e){let t=await Y(`${d}/${q(e)}/approve`,{});return n(c.leader),n(U.thread),o(),t}async function $(e){let t=await Y(u,{text:e});return n(U.directives),n(U.thread),b(typeof t==`object`&&t&&`directive`in t?t.directive:t)}async function ee(e){await a(`${u}/${q(e)}`,J()),t(),n(U.directives),n(U.thread)}export{D as _,G as a,X as c,P as d,L as f,z as g,N as h,K as i,R as l,F as m,Z as n,W as o,V as p,Q as r,ee as s,$ as t,H as u,B as v};
|
|
2
|
-
//# sourceMappingURL=thread-data-Bom_qVem.js.map
|