@ashlr/hub 3.22.0 → 3.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +5 -5
- package/dist/authority-surface.json +16 -11
- package/dist/build-identity.json +2 -2
- package/dist/cli/verify-safety-sources.d.ts +4 -0
- package/dist/cli/verify-safety-sources.js +41 -0
- package/dist/cli/verify-safety-sources.js.map +1 -0
- package/dist/cli/verify-safety.js +16 -1
- package/dist/cli/verify-safety.js.map +1 -1
- package/dist/core/decide/needs-you.d.ts +3 -1
- package/dist/core/decide/needs-you.js +52 -28
- package/dist/core/decide/needs-you.js.map +1 -1
- package/dist/core/fleet/fleet-control-model.d.ts +2 -1
- package/dist/core/fleet/fleet-control-model.js +5 -0
- package/dist/core/fleet/fleet-control-model.js.map +1 -1
- package/dist/core/fleet/fleet-control-types.d.ts +11 -1
- package/dist/core/fleet/fleet-control.d.ts +4 -0
- package/dist/core/fleet/fleet-control.js +23 -1
- package/dist/core/fleet/fleet-control.js.map +1 -1
- package/dist/core/fleet/quota.js +1 -1
- package/dist/core/fleet/quota.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
- package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
- package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
- package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
- package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
- package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-hePW80VL.js";import{At as t,Bt as n,Ft as r,Gt as i,Ht as a,It as o,Jt as s,Kt as c,Lt as l,Mt as u,Nt as d,Ot as f,Pt as p,Rt as m,Ut as h,Vt as g,Wt as _,jt as v,kt as y,qt as b,zt as x}from"./VerseConsoleApp-Cj6yPJo3.js";var S=e({AUTONOMY_SETUP_COMMAND:()=>k,COMMAND_KEYS:()=>f,DESKTOP_COMMANDS:()=>y,OPEN_PANE_COMMAND_RE:()=>t,OPEN_SESSION_COMMAND_RE:()=>v,OPEN_TERMINAL_COMMAND_RE:()=>u,PALETTE_GROUPS:()=>C,PALETTE_OPEN_BUDGET_MS:()=>50,PALETTE_PREFIXES:()=>w,PALETTE_RECENT_LIMIT:()=>5,SCOPE_LAYERS:()=>d,SHORTCUT_SECTIONS:()=>T,SYSTEM_RESERVED_CHORDS:()=>p,WORKBENCH_COMMANDS:()=>P,WORKBENCH_COMMAND_EVENT:()=>r,chordId:()=>o,chordMatches:()=>l,commandCatalogLoaded:()=>m,commandChord:()=>x,detectKeyPlatform:()=>n,eventKeyName:()=>g,findCommand:()=>I,formatChord:()=>a,keyBinding:()=>h,loadedCommand:()=>_,matchCommand:()=>z,matchKey:()=>i,paletteCommands:()=>L,parseChord:()=>c,parseDesktopCommand:()=>b,registerCommandCatalog:()=>s,shortcutSections:()=>R}),C=[{id:`needs-you`,label:`Needs you`},{id:`chats`,label:`Chats`},{id:`actions`,label:`Actions`},{id:`go-to`,label:`Go to`},{id:`seats-apps`,label:`Seats & Apps`},{id:`projects`,label:`Projects`}],w={">":`actions`,"#":`chats`},T=[`Surfaces`,`Navigation`,`Chat`,`Dock`,`Composer`,`Needs you`,`Charts`,`App`];function E(e){let t=f[e];return t.native?{id:e,scope:t.scope,keys:t.keys,native:t.native}:{id:e,scope:t.scope,keys:t.keys}}var D={confirm:{title:`Stop every running chat?`,body:`Each running turn is cancelled. Queued follow-ups are held, not sent.`,confirmLabel:`Stop chats`,destructive:!0},token:!0},O={confirm:{title:`Stop the fleet?`,body:`Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.`,confirmLabel:`Stop fleet`,destructive:!0},token:!0},k=`ashlr authority setup`,A=(e,t,n,r)=>({id:e,title:t,scope:`global`,keys:[],group:`actions`,section:`App`,keywords:n,...r?{surface:r}:{}}),j=(e,t,n)=>A(`autonomy.${e}`,`Autonomy: ${t}`,[`autonomy`,`switch`,...n],`command`),M=(e,t,n)=>A(`budget.${e}`,`Budget mode: ${t}`,[`budget`,`spend`,...n],`command`),N=(e,t)=>({...E(e),title:`Go to ${t}`,group:`go-to`,section:`Surfaces`,keywords:[t.toLowerCase()]}),P=[{id:`mode.with-me`,title:`Work with me`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`interactive`,`guide`,`ask`,`chat`]},{id:`mode.for-me`,title:`Work for me`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`autonomous`,`fleet`,`delegate`,`background`]},N(`surface.command`,`Command`),N(`surface.fleet`,`Fleet`),N(`surface.growth`,`Growth`),N(`surface.mind`,`Mind`),N(`surface.chat`,`Chat`),N(`surface.agents`,`Agents`),{...E(`section.settings`),title:`Open Settings`,group:`go-to`,section:`Surfaces`,keywords:[`preferences`,`appearance`]},{id:`section.apps`,title:`Open Apps & Accounts`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`mcp`,`accounts`,`seats`,`integrations`,`ollama`]},{id:`section.usage`,title:`Open Usage`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`capacity`,`spend`,`limits`]},{id:`section.wiki`,title:`Open Repo wiki`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`wiki`,`docs`,`architecture`,`deepwiki`,`knowledge`]},{id:`section.playbooks`,title:`Open Playbooks`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`playbook`,`playbooks`,`template`,`macro`,`procedure`,`recipe`]},{id:`section.automations`,title:`Open Automations`,scope:`global`,keys:[],group:`go-to`,section:`Surfaces`,keywords:[`automations`,`triggers`,`schedule`,`cron`,`webhook`,`issues`,`label`,`red main`,`ci`]},{...E(`palette.open`),title:`Command palette`,group:null,section:`Navigation`},{...E(`needs-you.open`),title:`Open Needs you`,group:`actions`,section:`Navigation`,keywords:[`approvals`,`inbox`,`triage`]},{...E(`shortcuts.open`),title:`Keyboard shortcuts`,group:`actions`,section:`Navigation`,keywords:[`keys`,`help`]},{...E(`resources.toggle`),title:`Open Resources`,group:`actions`,section:`Navigation`,note:`stops the running turn instead while one runs`,keywords:[`show resources`,`accounts`,`seats`,`capacity`,`credits`,`cloud`,`local models`]},{id:`resources.bar.toggle`,title:`Show or hide the resource bar`,scope:`global`,keys:[],group:`actions`,section:`Navigation`,keywords:[`battery`,`usage bars`,`accounts`,`capacity`,`rail`,`resources`]},{...E(`history.back`),title:`Back`,group:null,section:`Navigation`,note:`through surfaces and chats`},{...E(`history.forward`),title:`Forward`,group:null,section:`Navigation`,note:`through surfaces and chats`},{...E(`chat.recent-next`),title:`Next recent chat`,group:null,section:`Navigation`},{...E(`chat.recent-prev`),title:`Previous recent chat`,group:null,section:`Navigation`},{...E(`rail.toggle-labels`),title:`Show or hide rail labels`,group:`actions`,section:`Navigation`},{...E(`chat.new`),title:`New chat`,group:`actions`,section:`Chat`},{id:`chat.new-on`,title:`New chat on…`,scope:`global`,keys:[],group:`actions`,section:`Chat`,argument:{kind:`seat`,prompt:`Seat`},keywords:[`seat`,`account`,`engine`]},{id:`agents.new`,title:`New agent in its own workspace…`,scope:`global`,keys:[],group:`actions`,section:`Chat`,note:`⌘N on the Agents board`,keywords:[`agent`,`worktree`,`workspace`,`branch`,`parallel`,`background`,`conductor`]},{...E(`agents.new-multi`),title:`Same task on several seats…`,group:`actions`,section:`Chat`,keywords:[`agents`,`best of n`,`fan out`,`parallel`,`worktrees`,`compare`,`race`]},{...E(`chat.sidebar`),title:`Show or hide the chat list`,group:`actions`,section:`Chat`},{...E(`chat.find`),title:`Find in chat`,group:`actions`,section:`Chat`,keywords:[`search`]},{...E(`chat.turn-prev`),title:`Previous turn`,group:null,section:`Chat`},{...E(`chat.turn-next`),title:`Next turn`,group:null,section:`Chat`},{id:`chats.stop-all`,title:`Stop running chats…`,scope:`global`,keys:[],group:`actions`,section:`Chat`,guard:D,keywords:[`cancel`,`halt`]},{id:`composer.cloud`,title:`Run in cloud…`,scope:`chat`,keys:[],group:`actions`,section:`Composer`,keywords:[`cloud`,`remote`,`launch`,`draft pr`]},{id:`composer.devin`,title:`Run in Devin…`,scope:`chat`,keys:[],group:`actions`,section:`Composer`,keywords:[`devin`,`cognition`,`remote`,`launch`,`pr`,`acu`]},{id:`git.create-pr`,title:`Create pull request…`,scope:`chat`,keys:[],group:`actions`,section:`Chat`,keywords:[`pr`,`github`,`git`,`open pull request`]},{id:`git.merge-pr`,title:`Merge pull request…`,scope:`chat`,keys:[],group:`actions`,section:`Chat`,keywords:[`pr`,`github`,`git`,`land`,`ship`]},{...E(`chat.focus-mode`),title:`Focus mode`,group:`actions`,section:`Chat`,keywords:[`zen`,`distraction free`,`hide panels`]},{...E(`dock.toggle`),title:`Show or hide the panel`,group:`actions`,section:`Dock`,keywords:[`dock`]},{id:`dock.placement`,title:`Move the panel (beside or below the chat)`,scope:`chat`,keys:[],group:`actions`,section:`Dock`,keywords:[`bottom`,`right`,`layout`,`dock position`]},{...E(`dock.terminal`),title:`Terminal`,group:`actions`,section:`Dock`,keywords:[`shell`,`console`]},{...E(`dock.terminal-new`),title:`New terminal tab`,group:`actions`,section:`Dock`},{id:`terminal.generate`,title:`Generate command…`,scope:`chat`,keys:[],group:`actions`,section:`Dock`,keywords:[`terminal`,`shell`,`command`,`plain english`,`natural language`,`ai`,`bash`,`how do i`]},{id:`terminal.history`,title:`Search terminal history…`,scope:`chat`,keys:[],group:`actions`,section:`Dock`,keywords:[`terminal`,`shell`,`history`,`ctrl r`,`reverse search`,`previous command`]},{...E(`dock.preview`),title:`Browser`,group:`actions`,section:`Dock`,keywords:[`preview`,`dev server`,`localhost`,`web`]},{...E(`dock.diff`),title:`Changes`,group:`actions`,section:`Dock`,keywords:[`diff`,`git`,`review`]},{...E(`dock.files`),title:`Files`,group:`actions`,section:`Dock`,keywords:[`explorer`,`tree`,`touched`]},{...E(`dock.sources`),title:`Sources`,group:`actions`,section:`Dock`,keywords:[`citations`,`references`,`read`,`fetched`]},{...E(`dock.reasoning`),title:`Reasoning`,group:`actions`,section:`Dock`,keywords:[`thinking`,`why`,`chain of thought`]},{...E(`composer.permission`),title:`Permission mode…`,group:`actions`,section:`Composer`,keywords:[`plan`,`bypass`,`auto`]},{...E(`composer.model`),title:`Model…`,group:`actions`,section:`Composer`},{...E(`composer.effort`),title:`Effort…`,group:`actions`,section:`Composer`,keywords:[`reasoning`,`thinking`]},{...E(`composer.attach`),title:`Attach files…`,group:`actions`,section:`Composer`,keywords:[`upload`,`image`]},{...E(`composer.send`),title:`Send`,group:null,section:`Composer`,note:`queues while a turn runs (up to 3)`},{...E(`composer.stop-and-send`),title:`Stop and send`,group:null,section:`Composer`},{...E(`composer.stop`),title:`Stop the running turn`,group:null,section:`Composer`,note:`only from an empty composer with no overlay open`},{...E(`drawer.next`),title:`Next item`,group:null,section:`Needs you`},{...E(`drawer.prev`),title:`Previous item`,group:null,section:`Needs you`},{...E(`drawer.open`),title:`Open item`,group:null,section:`Needs you`},{...E(`drawer.approve`),title:`Approve`,group:null,section:`Needs you`,note:`confirms, then asks for the token`},{...E(`drawer.reject`),title:`Reject`,group:null,section:`Needs you`,note:`confirms, then asks for the token`},{...E(`drawer.veto`),title:`Veto`,group:null,section:`Needs you`,note:`confirms, then asks for the token`},{...E(`drawer.done`),title:`Mark done`,group:null,section:`Needs you`},{...E(`drawer.select`),title:`Select item`,group:null,section:`Needs you`,note:`A / R / E then act on every selected item`},{...E(`drawer.split-prev`),title:`Previous split`,group:null,section:`Needs you`},{...E(`drawer.split-next`),title:`Next split`,group:null,section:`Needs you`},{...E(`chart.table`),title:`Show as a table`,group:null,section:`Charts`,note:`when a chart card has focus`},{...E(`appearance.toggle-theme`),title:`Toggle light / dark`,group:`actions`,section:`App`,keywords:[`theme`,`dark mode`]},{...E(`app.summon`),title:`Show Verse and focus the composer`,group:null,section:`App`,note:`system-wide; turn on in Settings ▸ Desktop`},{id:`fleet.stop`,title:`Stop the fleet…`,scope:`global`,keys:[],group:`actions`,section:`App`,guard:O,keywords:[`kill`,`halt`,`autonomy`]},{...E(`fleet.start`),title:`Start the fleet…`,group:`actions`,section:`App`,surface:`fleet`,keywords:[`run`,`go`,`turn on`,`autonomy`,`daemon`]},{...E(`fleet.pause`),title:`Pause the fleet`,group:`actions`,section:`App`,surface:`fleet`,keywords:[`hold`,`finish in-flight`,`dispatch`,`autonomy`],note:`runs in flight finish; nothing new starts`},{...E(`fleet.resume`),title:`Resume the fleet`,group:`actions`,section:`App`,surface:`fleet`,keywords:[`continue`,`unpause`,`dispatch`,`autonomy`]},{...E(`fleet.halt`),title:`Stop the fleet (asks first)`,group:null,section:`App`,surface:`fleet`},A(`fleet.restart-daemon`,`Restart the fleet daemon…`,[`resident`,`launchd`,`service`,`reload`,`new release`,`daemon`],`fleet`),A(`fleet.edit-grant`,`Edit the grant scope…`,[`grant scope`,`repos`,`engines`,`leader classes`,`caps`,`narrow`,`widen`],`fleet`),A(`fleet.install-custody`,`Install the custody helper…`,[`custody`,`sudo`,`admin`,`secure enclave`,`upgrade`,`helper`],`fleet`),j(`off`,`Off`,[`disable`,`lower`]),j(`propose`,`Propose`,[`proposals`,`review`]),j(`autonomous`,`Autonomous`,[`auto`,`turn on`,`enable`]),A(`autonomy.grant`,`Approve grant…`,[`touch id`,`re-approve`,`renew`,`authority`,`autonomy`],`command`),A(`autonomy.reapprove`,`Re-approve grant…`,[`renew`,`extend`,`touch id`,`expiry`,`authority`,`autonomy`],`command`),A(`autonomy.status`,`Autonomy status`,[`ladder`,`rollout`,`stage`,`shadow`,`progress`,`would merge`,`autonomy`]),M(`all-in`,`All-in`,[`all in`,`max`]),M(`balanced`,`Balanced`,[`default`]),M(`reserve`,`Reserve`,[`save`,`conserve`]),{id:`leader.message`,title:`Message the Leader…`,scope:`global`,keys:[],group:`actions`,section:`App`,surface:`mind`,keywords:[`leader`,`ask`,`chat`,`strategy`,`memo`,`talk`,`telegram`]},{id:`leader.directive`,title:`Add Leader directive…`,scope:`global`,keys:[],group:`actions`,section:`App`,surface:`mind`,keywords:[`leader`,`directive`,`instruction`,`rule`,`standing order`]},{id:`wiki.open`,title:`Open repo wiki…`,scope:`global`,keys:[],group:`actions`,section:`App`,argument:{kind:`project`,prompt:`Repo`},keywords:[`wiki`,`docs`,`architecture`,`deepwiki`,`modules`,`overview`]},{id:`playbook.run`,title:`Run playbook…`,scope:`global`,keys:[],group:`actions`,section:`App`,keywords:[`playbook`,`macro`,`template`,`run`,`fix bug`,`bump deps`,`add tests`,`docs sync`,`security fix`]},{id:`terminal.workflows`,title:`Run command workflow…`,scope:`global`,keys:[],group:`actions`,section:`Dock`,keywords:[`command workflow`,`workflow`,`terminal`,`shell`,`command`,`snippet`,`template`,`paste`,`params`,`playbook`]},{id:`terminal.launch`,title:`Launch terminal configuration…`,scope:`global`,keys:[],group:`actions`,section:`Dock`,keywords:[`launch`,`launch.json`,`layout`,`terminal`,`dev server`,`test watcher`,`tabs`,`splits`,`claude code`]},{id:`automations.new`,title:`New automation…`,scope:`global`,keys:[],group:`actions`,section:`App`,keywords:[`automation`,`trigger`,`schedule`,`nightly`,`weekly`,`webhook`,`issues labeled`,`fix red main`,`rrule`]},{id:`wiki.ask`,title:`Ask the codebase…`,scope:`global`,keys:[],group:`actions`,section:`App`,keywords:[`ask`,`question`,`codebase`,`where`,`how`,`explain`,`wiki`,`search code`]},A(`autonomy.copy-setup`,`Copy autonomy setup command`,[k,`autonomy`,`turn on`,`clipboard`])],F=new Map(P.map(e=>[e.id,e]));function I(e){return F.get(e)??null}s(I);function L(e){return P.filter(t=>t.group===e)}function R(){let e=P.filter(e=>e.keys.length>0);return T.map(t=>({section:t,commands:e.filter(e=>e.section===t)})).filter(e=>e.commands.length>0)}function z(e,t,r=n()){let a=i(e,t,r);return a?I(a.id):null}export{I as a,R as c,S as i,C as n,z as o,w as r,L as s,k as t};
|
|
2
|
-
//# sourceMappingURL=command-catalog-Dnx-iMLX.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-catalog-Dnx-iMLX.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/command-catalog.ts"],"sourcesContent":["/**\n * routes/verse/shell/command-catalog.ts — every workbench command, in ONE\n * table (unit C0; SPEC-310C §1).\n *\n * The ⌘K palette (C1), the shortcuts overlay (⌘/), the drawer and every\n * surface's buttons read this table; the key test reads it too, which is how\n * \"no two commands share a key\" and \"no key the native menu already owns\"\n * stay true as units add commands.\n *\n * KEYS are written in ./command-keys.ts, the half of the catalog the chat\n * first paint needs (a key press, a shortcut hint, the desktop menu bridge);\n * a row with keys takes them from there with `bind(id)`, so each key is\n * still written once. This module — titles, palette groups, keywords,\n * guards, the keyless palette actions — loads with the palette's chunk, not\n * with first paint, and re-exports ./command-keys.ts so its importers keep\n * one import site.\n *\n * Pure data plus pure helpers — no React, no DOM — so the palette can import\n * it without pulling a surface into its chunk.\n *\n * Adding a command: one entry below (a change request to C0 when another\n * unit needs it), plus its keys in command-keys.ts if it has any. The\n * handler lives with the unit that owns the behaviour and dispatches on the\n * command `id`.\n */\nimport {\n COMMAND_KEYS,\n matchKey,\n detectKeyPlatform,\n registerCommandCatalog,\n type CommandScope,\n type KeyChord,\n type KeyedCommandId,\n type KeyEventLike,\n type KeyPlatform,\n type NativeBinding,\n} from './command-keys.js';\n\nexport * from './command-keys.js';\n\n// ===========================================================================\n// The palette\n// ===========================================================================\n\n/** Result groups, in the order the palette shows them (SPEC-310C §1). */\nexport const PALETTE_GROUPS = [\n { id: 'needs-you', label: 'Needs you' },\n { id: 'chats', label: 'Chats' },\n { id: 'actions', label: 'Actions' },\n { id: 'go-to', label: 'Go to' },\n { id: 'seats-apps', label: 'Seats & Apps' },\n { id: 'projects', label: 'Projects' },\n] as const;\nexport type PaletteGroupId = (typeof PALETTE_GROUPS)[number]['id'];\n\n/** A leading `>` limits results to actions; `#` to chats. */\nexport const PALETTE_PREFIXES: Readonly<Record<'>' | '#', PaletteGroupId>> = { '>': 'actions', '#': 'chats' };\n\n/** An empty query shows the last this-many actions run. */\nexport const PALETTE_RECENT_LIMIT = 5;\n\n/** The palette opens in under this (it lives in the shell chunk). */\nexport const PALETTE_OPEN_BUDGET_MS = 50;\n\n// ===========================================================================\n// Commands\n// ===========================================================================\n\nexport type CommandArgumentKind = 'seat' | 'project' | 'section' | 'session';\n\n/**\n * A guarded command asks for confirmation FIRST, then the mutation token\n * (the palette must never be a shortcut around the confirm step its regular\n * UI requires).\n */\nexport interface CommandGuard {\n confirm: { title: string; body: string; confirmLabel: string; destructive: boolean };\n token: boolean;\n}\n\n/** Sections of the shortcuts overlay (⌘/), in display order. */\nexport const SHORTCUT_SECTIONS = ['Surfaces', 'Navigation', 'Chat', 'Dock', 'Composer', 'Needs you', 'Charts', 'App'] as const;\nexport type ShortcutSection = (typeof SHORTCUT_SECTIONS)[number];\n\nexport interface WorkbenchCommand {\n id: string;\n /** Palette / overlay text: a verb phrase, operator language. */\n title: string;\n scope: CommandScope;\n /** Empty = reachable from the palette (or a button) only. */\n keys: readonly KeyChord[];\n /** Where the palette lists it; null = not a palette entry (drawer and chart keys). */\n group: 'actions' | 'go-to' | null;\n section: ShortcutSection;\n keywords?: readonly string[];\n /** Tab fills this argument (\"New chat on…\" → a seat). */\n argument?: { kind: CommandArgumentKind; prompt: string };\n guard?: CommandGuard;\n native?: NativeBinding;\n /** A qualifier the overlay prints under the title. */\n note?: string;\n /**\n * The surface that serves it. The command's behaviour — and the dialogs it\n * may open (the Touch ID sheet, the token prompt) — live on that surface,\n * so the shell brings it forward and parks the command until the surface\n * registers its handler (run-command.ts). The palette says where it runs.\n */\n surface?: 'command' | 'mind' | 'fleet';\n}\n\n/** A keyed row's id, scope, keys and native binding — from command-keys.ts, never re-declared here. */\nfunction bind<I extends KeyedCommandId>(id: I): { id: I; scope: CommandScope; keys: readonly KeyChord[]; native?: NativeBinding } {\n const spec: { scope: CommandScope; keys: readonly KeyChord[]; native?: NativeBinding } = COMMAND_KEYS[id];\n return spec.native ? { id, scope: spec.scope, keys: spec.keys, native: spec.native } : { id, scope: spec.scope, keys: spec.keys };\n}\n\nconst STOP_CHATS_GUARD: CommandGuard = {\n confirm: {\n title: 'Stop every running chat?',\n body: 'Each running turn is cancelled. Queued follow-ups are held, not sent.',\n confirmLabel: 'Stop chats',\n destructive: true,\n },\n token: true,\n};\n\nconst STOP_FLEET_GUARD: CommandGuard = {\n confirm: {\n title: 'Stop the fleet?',\n body: 'Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.',\n confirmLabel: 'Stop fleet',\n destructive: true,\n },\n token: true,\n};\n\n/** Where the copy-setup command points: the one CLI step that turns autonomy on. */\nexport const AUTONOMY_SETUP_COMMAND = 'ashlr authority setup';\n\n/**\n * A palette-only App action (no key) — shared shape of the autonomy, grant,\n * budget and setup entries below.\n */\nconst appAction = (id: string, title: string, keywords: readonly string[], surface?: 'command' | 'fleet'): WorkbenchCommand => ({\n id,\n title,\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'App',\n keywords,\n ...(surface ? { surface } : {}),\n});\n\n/**\n * The Command surface's autonomy switch, one palette entry per position.\n * Served by AutonomyBar with the switch's own rules: lowering is instant,\n * raising past the installed grant opens the Touch ID sheet instead.\n */\nconst autonomySwitch = (to: 'off' | 'propose' | 'autonomous', label: string, keywords: readonly string[]) =>\n appAction(`autonomy.${to}`, `Autonomy: ${label}`, ['autonomy', 'switch', ...keywords], 'command');\n\n/** A9's budget mode, set from the palette — clamped to the grant's ceiling like the Budget pill. */\nconst budgetMode = (mode: 'all-in' | 'balanced' | 'reserve', label: string, keywords: readonly string[]) =>\n appAction(`budget.${mode}`, `Budget mode: ${label}`, ['budget', 'spend', ...keywords], 'command');\n\nconst surface = <I extends KeyedCommandId>(id: I, name: string) => ({\n ...bind(id),\n title: `Go to ${name}`,\n group: 'go-to',\n section: 'Surfaces',\n keywords: [name.toLowerCase()],\n} as const);\n\nexport const WORKBENCH_COMMANDS = [\n // Intent aliases navigate only. They do not change permissions or start dispatch.\n { id: 'mode.with-me', title: 'Work with me', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['interactive', 'guide', 'ask', 'chat'] },\n { id: 'mode.for-me', title: 'Work for me', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['autonomous', 'fleet', 'delegate', 'background'] },\n // ── Surfaces (⌘1 Command … ⌘5 Chat) and the gear tray ────────────────────\n surface('surface.command', 'Command'),\n surface('surface.fleet', 'Fleet'),\n surface('surface.growth', 'Growth'),\n surface('surface.mind', 'Mind'),\n surface('surface.chat', 'Chat'),\n surface('surface.agents', 'Agents'),\n { ...bind('section.settings'), title: 'Open Settings', group: 'go-to', section: 'Surfaces', keywords: ['preferences', 'appearance'] },\n { id: 'section.apps', title: 'Open Apps & Accounts', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['mcp', 'accounts', 'seats', 'integrations', 'ollama'] },\n { id: 'section.usage', title: 'Open Usage', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['capacity', 'spend', 'limits'] },\n { id: 'section.wiki', title: 'Open Repo wiki', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['wiki', 'docs', 'architecture', 'deepwiki', 'knowledge'] },\n { id: 'section.playbooks', title: 'Open Playbooks', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['playbook', 'playbooks', 'template', 'macro', 'procedure', 'recipe'] },\n { id: 'section.automations', title: 'Open Automations', scope: 'global', keys: [], group: 'go-to', section: 'Surfaces', keywords: ['automations', 'triggers', 'schedule', 'cron', 'webhook', 'issues', 'label', 'red main', 'ci'] },\n\n // ── Navigation ───────────────────────────────────────────────────────────\n { ...bind('palette.open'), title: 'Command palette', group: null, section: 'Navigation' },\n { ...bind('needs-you.open'), title: 'Open Needs you', group: 'actions', section: 'Navigation', keywords: ['approvals', 'inbox', 'triage'] },\n { ...bind('shortcuts.open'), title: 'Keyboard shortcuts', group: 'actions', section: 'Navigation', keywords: ['keys', 'help'] },\n // The Resources drawer (3.11 C6): the key toggles it, the palette opens it.\n {\n ...bind('resources.toggle'),\n title: 'Open Resources',\n group: 'actions',\n section: 'Navigation',\n // The composer claims ⌘. to stop a running turn (Composer.tsx) — say so\n // where the key is listed, so the same chord is never a surprise.\n note: 'stops the running turn instead while one runs',\n keywords: ['show resources', 'accounts', 'seats', 'capacity', 'credits', 'cloud', 'local models'],\n },\n {\n id: 'resources.bar.toggle',\n title: 'Show or hide the resource bar',\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'Navigation',\n keywords: ['battery', 'usage bars', 'accounts', 'capacity', 'rail', 'resources'],\n },\n { ...bind('history.back'), title: 'Back', group: null, section: 'Navigation', note: 'through surfaces and chats' },\n { ...bind('history.forward'), title: 'Forward', group: null, section: 'Navigation', note: 'through surfaces and chats' },\n { ...bind('chat.recent-next'), title: 'Next recent chat', group: null, section: 'Navigation' },\n { ...bind('chat.recent-prev'), title: 'Previous recent chat', group: null, section: 'Navigation' },\n { ...bind('rail.toggle-labels'), title: 'Show or hide rail labels', group: 'actions', section: 'Navigation' },\n\n // ── Chats ────────────────────────────────────────────────────────────────\n { ...bind('chat.new'), title: 'New chat', group: 'actions', section: 'Chat' },\n {\n id: 'chat.new-on',\n title: 'New chat on…',\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'Chat',\n argument: { kind: 'seat', prompt: 'Seat' },\n keywords: ['seat', 'account', 'engine'],\n },\n // ── Agents (3.16): the board serves these; ⌘N on the board is \"New agent\" ──\n {\n id: 'agents.new',\n title: 'New agent in its own workspace…',\n scope: 'global',\n keys: [],\n group: 'actions',\n section: 'Chat',\n note: '⌘N on the Agents board',\n keywords: ['agent', 'worktree', 'workspace', 'branch', 'parallel', 'background', 'conductor'],\n },\n {\n ...bind('agents.new-multi'),\n title: 'Same task on several seats…',\n group: 'actions',\n section: 'Chat',\n keywords: ['agents', 'best of n', 'fan out', 'parallel', 'worktrees', 'compare', 'race'],\n },\n { ...bind('chat.sidebar'), title: 'Show or hide the chat list', group: 'actions', section: 'Chat' },\n { ...bind('chat.find'), title: 'Find in chat', group: 'actions', section: 'Chat', keywords: ['search'] },\n { ...bind('chat.turn-prev'), title: 'Previous turn', group: null, section: 'Chat' },\n { ...bind('chat.turn-next'), title: 'Next turn', group: null, section: 'Chat' },\n { id: 'chats.stop-all', title: 'Stop running chats…', scope: 'global', keys: [], group: 'actions', section: 'Chat', guard: STOP_CHATS_GUARD, keywords: ['cancel', 'halt'] },\n // ── Git (C5's BranchBar serves these) ─────────────────────────────────────\n // Palette-only and unguarded ON PURPOSE: each OPENS BranchBar's own dialog\n // (CreatePrDialog / MergeDialog), which carries the before-click disclosure,\n // and every write inside it still goes through the mutation-token gate —\n // so the palette is never a shortcut around a confirm step. No key: a\n // merge is never one keystroke away. Chat-scoped because the bar lives\n // above the composer; from another surface the shell switches to Chat and\n // parks the command until BranchBar registers (command-bus).\n // ── Cloud (3.11 C3) ──────────────────────────────────────────────────────\n // Opens the composer's Chat settings sheet, where \"Run in cloud\" lives with\n // its own disabled reasons (no GitHub origin, seat not ready, budget gate,\n // empty box) and the token gate — the palette never launches by itself.\n { id: 'composer.cloud', title: 'Run in cloud…', scope: 'chat', keys: [], group: 'actions', section: 'Composer', keywords: ['cloud', 'remote', 'launch', 'draft pr'] },\n // 3.15: the same sheet holds \"Run in Devin\" (its own disabled reasons and token gate).\n { id: 'composer.devin', title: 'Run in Devin…', scope: 'chat', keys: [], group: 'actions', section: 'Composer', keywords: ['devin', 'cognition', 'remote', 'launch', 'pr', 'acu'] },\n { id: 'git.create-pr', title: 'Create pull request…', scope: 'chat', keys: [], group: 'actions', section: 'Chat', keywords: ['pr', 'github', 'git', 'open pull request'] },\n { id: 'git.merge-pr', title: 'Merge pull request…', scope: 'chat', keys: [], group: 'actions', section: 'Chat', keywords: ['pr', 'github', 'git', 'land', 'ship'] },\n\n // ── Dock (the panel area; panes from panes/pane-registry.ts) ─────────────\n { ...bind('chat.focus-mode'), title: 'Focus mode', group: 'actions', section: 'Chat', keywords: ['zen', 'distraction free', 'hide panels'] },\n { ...bind('dock.toggle'), title: 'Show or hide the panel', group: 'actions', section: 'Dock', keywords: ['dock'] },\n { id: 'dock.placement', title: 'Move the panel (beside or below the chat)', scope: 'chat', keys: [], group: 'actions', section: 'Dock', keywords: ['bottom', 'right', 'layout', 'dock position'] },\n { ...bind('dock.terminal'), title: 'Terminal', group: 'actions', section: 'Dock', keywords: ['shell', 'console'] },\n { ...bind('dock.terminal-new'), title: 'New terminal tab', group: 'actions', section: 'Dock' },\n // 3.15: the terminal's input editor. Plain words → a command the operator reviews (never run on its own).\n { id: 'terminal.generate', title: 'Generate command…', scope: 'chat', keys: [], group: 'actions', section: 'Dock', keywords: ['terminal', 'shell', 'command', 'plain english', 'natural language', 'ai', 'bash', 'how do i'] },\n { id: 'terminal.history', title: 'Search terminal history…', scope: 'chat', keys: [], group: 'actions', section: 'Dock', keywords: ['terminal', 'shell', 'history', 'ctrl r', 'reverse search', 'previous command'] },\n { ...bind('dock.preview'), title: 'Browser', group: 'actions', section: 'Dock', keywords: ['preview', 'dev server', 'localhost', 'web'] },\n { ...bind('dock.diff'), title: 'Changes', group: 'actions', section: 'Dock', keywords: ['diff', 'git', 'review'] },\n { ...bind('dock.files'), title: 'Files', group: 'actions', section: 'Dock', keywords: ['explorer', 'tree', 'touched'] },\n { ...bind('dock.sources'), title: 'Sources', group: 'actions', section: 'Dock', keywords: ['citations', 'references', 'read', 'fetched'] },\n { ...bind('dock.reasoning'), title: 'Reasoning', group: 'actions', section: 'Dock', keywords: ['thinking', 'why', 'chain of thought'] },\n\n // ── Composer ─────────────────────────────────────────────────────────────\n { ...bind('composer.permission'), title: 'Permission mode…', group: 'actions', section: 'Composer', keywords: ['plan', 'bypass', 'auto'] },\n { ...bind('composer.model'), title: 'Model…', group: 'actions', section: 'Composer' },\n { ...bind('composer.effort'), title: 'Effort…', group: 'actions', section: 'Composer', keywords: ['reasoning', 'thinking'] },\n { ...bind('composer.attach'), title: 'Attach files…', group: 'actions', section: 'Composer', keywords: ['upload', 'image'] },\n { ...bind('composer.send'), title: 'Send', group: null, section: 'Composer', note: 'queues while a turn runs (up to 3)' },\n { ...bind('composer.stop-and-send'), title: 'Stop and send', group: null, section: 'Composer' },\n { ...bind('composer.stop'), title: 'Stop the running turn', group: null, section: 'Composer', note: 'only from an empty composer with no overlay open' },\n\n // ── Needs-you drawer ─────────────────────────────────────────────────────\n { ...bind('drawer.next'), title: 'Next item', group: null, section: 'Needs you' },\n { ...bind('drawer.prev'), title: 'Previous item', group: null, section: 'Needs you' },\n { ...bind('drawer.open'), title: 'Open item', group: null, section: 'Needs you' },\n { ...bind('drawer.approve'), title: 'Approve', group: null, section: 'Needs you', note: 'confirms, then asks for the token' },\n { ...bind('drawer.reject'), title: 'Reject', group: null, section: 'Needs you', note: 'confirms, then asks for the token' },\n { ...bind('drawer.veto'), title: 'Veto', group: null, section: 'Needs you', note: 'confirms, then asks for the token' },\n { ...bind('drawer.done'), title: 'Mark done', group: null, section: 'Needs you' },\n { ...bind('drawer.select'), title: 'Select item', group: null, section: 'Needs you', note: 'A / R / E then act on every selected item' },\n { ...bind('drawer.split-prev'), title: 'Previous split', group: null, section: 'Needs you' },\n { ...bind('drawer.split-next'), title: 'Next split', group: null, section: 'Needs you' },\n\n // ── Charts ───────────────────────────────────────────────────────────────\n { ...bind('chart.table'), title: 'Show as a table', group: null, section: 'Charts', note: 'when a chart card has focus' },\n\n // ── App ──────────────────────────────────────────────────────────────────\n { ...bind('appearance.toggle-theme'), title: 'Toggle light / dark', group: 'actions', section: 'App', keywords: ['theme', 'dark mode'] },\n { ...bind('app.summon'), title: 'Show Verse and focus the composer', group: null, section: 'App', note: 'system-wide; turn on in Settings ▸ Desktop' },\n { id: 'fleet.stop', title: 'Stop the fleet…', scope: 'global', keys: [], group: 'actions', section: 'App', guard: STOP_FLEET_GUARD, keywords: ['kill', 'halt', 'autonomy'] },\n // ── The fleet's control surface (3.15; the Fleet tab serves these) ──────\n // Start confirms on the Fleet tab (it clears Stop, resumes and raises the\n // switch within the grant); the resident daemon and the custody helper\n // run through the desktop app's native confirm dialog.\n { ...bind('fleet.start'), title: 'Start the fleet…', group: 'actions', section: 'App', surface: 'fleet', keywords: ['run', 'go', 'turn on', 'autonomy', 'daemon'] },\n { ...bind('fleet.pause'), title: 'Pause the fleet', group: 'actions', section: 'App', surface: 'fleet', keywords: ['hold', 'finish in-flight', 'dispatch', 'autonomy'], note: 'runs in flight finish; nothing new starts' },\n { ...bind('fleet.resume'), title: 'Resume the fleet', group: 'actions', section: 'App', surface: 'fleet', keywords: ['continue', 'unpause', 'dispatch', 'autonomy'] },\n // The key for Stop: the Fleet tab's own confirmation (same words as the\n // guarded palette row above), so it is never one keystroke either.\n { ...bind('fleet.halt'), title: 'Stop the fleet (asks first)', group: null, section: 'App', surface: 'fleet' },\n appAction('fleet.restart-daemon', 'Restart the fleet daemon…', ['resident', 'launchd', 'service', 'reload', 'new release', 'daemon'], 'fleet'),\n appAction('fleet.edit-grant', 'Edit the grant scope…', ['grant scope', 'repos', 'engines', 'leader classes', 'caps', 'narrow', 'widen'], 'fleet'),\n appAction('fleet.install-custody', 'Install the custody helper…', ['custody', 'sudo', 'admin', 'secure enclave', 'upgrade', 'helper'], 'fleet'),\n\n // ── Autonomy (Command's AutonomyBar serves these) ────────────────────────\n // No keys on purpose: raising authority is never one keystroke away, and\n // each entry runs the bar's own path (Touch ID sheet, token, read-only).\n autonomySwitch('off', 'Off', ['disable', 'lower']),\n autonomySwitch('propose', 'Propose', ['proposals', 'review']),\n autonomySwitch('autonomous', 'Autonomous', ['auto', 'turn on', 'enable']),\n appAction('autonomy.grant', 'Approve grant…', ['touch id', 're-approve', 'renew', 'authority', 'autonomy'], 'command'),\n // 3.14: renew the ACTIVE grant before it lapses (the bar's sheet, re-approve\n // intent — continues the ladder from the current stage), and jump to the\n // ladder itself. The status entry is the shell's (run-command.ts).\n appAction('autonomy.reapprove', 'Re-approve grant…', ['renew', 'extend', 'touch id', 'expiry', 'authority', 'autonomy'], 'command'),\n appAction('autonomy.status', 'Autonomy status', ['ladder', 'rollout', 'stage', 'shadow', 'progress', 'would merge', 'autonomy']),\n budgetMode('all-in', 'All-in', ['all in', 'max']),\n budgetMode('balanced', 'Balanced', ['default']),\n budgetMode('reserve', 'Reserve', ['save', 'conserve']),\n // ── The Leader (Mind's conversation) ────────────────────────────────────\n // Served by the shell (run-command.ts → leader/leader-focus.ts): it goes to\n // Mind and the conversation panel takes the ask once its chunk mounts.\n { id: 'leader.message', title: 'Message the Leader…', scope: 'global', keys: [], group: 'actions', section: 'App', surface: 'mind', keywords: ['leader', 'ask', 'chat', 'strategy', 'memo', 'talk', 'telegram'] },\n { id: 'leader.directive', title: 'Add Leader directive…', scope: 'global', keys: [], group: 'actions', section: 'App', surface: 'mind', keywords: ['leader', 'directive', 'instruction', 'rule', 'standing order'] },\n // ── The repo wiki (3.15) ────────────────────────────────────────────────\n // Served by the shell (run-command.ts → wiki/wiki-focus.ts): it opens the\n // Wiki section, which takes the request once its chunk mounts. Tab picks a repo.\n { id: 'wiki.open', title: 'Open repo wiki…', scope: 'global', keys: [], group: 'actions', section: 'App', argument: { kind: 'project', prompt: 'Repo' }, keywords: ['wiki', 'docs', 'architecture', 'deepwiki', 'modules', 'overview'] },\n // ── Playbooks (3.15) ──────────────────────────────────────────────────\n // Served by the shell (run-command.ts → playbooks/playbook-focus.ts): opens\n // Playbooks in \"pick one to run\" mode; Run… writes its !macro into the chat.\n { id: 'playbook.run', title: 'Run playbook…', scope: 'global', keys: [], group: 'actions', section: 'App', keywords: ['playbook', 'macro', 'template', 'run', 'fix bug', 'bump deps', 'add tests', 'docs sync', 'security fix'] },\n // Command workflows (kind: command playbooks): fill a command's {{params}}\n // and PASTE it at a terminal prompt — never run. The terminal panel serves\n // it with its picker (CommandWorkflowPicker) when it is mounted; otherwise\n // the shell's fallback (run-command.ts) opens Playbooks narrowed to them.\n { id: 'terminal.workflows', title: 'Run command workflow…', scope: 'global', keys: [], group: 'actions', section: 'Dock', keywords: ['command workflow', 'workflow', 'terminal', 'shell', 'command', 'snippet', 'template', 'paste', 'params', 'playbook'] },\n // Launch configurations (.ashlr/verse/launch.json): named terminal layouts —\n // tabs, splits, cwd, commands. The terminal panel serves it (its dialog);\n // the shell's fallback opens the Terminal pane with the dialog requested.\n // The dialog shows every command; nothing is typed until one is launched.\n { id: 'terminal.launch', title: 'Launch terminal configuration…', scope: 'global', keys: [], group: 'actions', section: 'Dock', keywords: ['launch', 'launch.json', 'layout', 'terminal', 'dev server', 'test watcher', 'tabs', 'splits', 'claude code'] },\n // ── Automations (3.15) ─────────────────────────────────────────────────\n // Served by the shell (run-command.ts → automations/automations-focus.ts).\n { id: 'automations.new', title: 'New automation…', scope: 'global', keys: [], group: 'actions', section: 'App', keywords: ['automation', 'trigger', 'schedule', 'nightly', 'weekly', 'webhook', 'issues labeled', 'fix red main', 'rrule'] },\n { id: 'wiki.ask', title: 'Ask the codebase…', scope: 'global', keys: [], group: 'actions', section: 'App', keywords: ['ask', 'question', 'codebase', 'where', 'how', 'explain', 'wiki', 'search code'] },\n // Served by the shell (run-command.ts → copy-setup.ts), wherever you are.\n appAction('autonomy.copy-setup', 'Copy autonomy setup command', [AUTONOMY_SETUP_COMMAND, 'autonomy', 'turn on', 'clipboard']),\n] as const satisfies readonly WorkbenchCommand[];\n\nexport type CommandId = (typeof WORKBENCH_COMMANDS)[number]['id'];\n\nconst BY_ID: ReadonlyMap<string, WorkbenchCommand> = new Map(WORKBENCH_COMMANDS.map((c) => [c.id, c as WorkbenchCommand]));\n\nexport function findCommand(id: string): WorkbenchCommand | null {\n return BY_ID.get(id) ?? null;\n}\n\n// run-command.ts resolves keyless ids (palette actions, guards, surfaces) through this.\nregisterCommandCatalog(findCommand);\n\n/** Palette entries of one group, in catalog order. */\nexport function paletteCommands(group: 'actions' | 'go-to'): WorkbenchCommand[] {\n return (WORKBENCH_COMMANDS as readonly WorkbenchCommand[]).filter((c) => c.group === group);\n}\n\n/** The shortcuts overlay: every command with keys, grouped by section, in display order. */\nexport function shortcutSections(): Array<{ section: ShortcutSection; commands: WorkbenchCommand[] }> {\n const withKeys = (WORKBENCH_COMMANDS as readonly WorkbenchCommand[]).filter((c) => c.keys.length > 0);\n return SHORTCUT_SECTIONS.map((section) => ({ section, commands: withKeys.filter((c) => c.section === section) })).filter(\n (s) => s.commands.length > 0,\n );\n}\n\n/**\n * The command a key press runs, given the scopes live right now (innermost\n * first, e.g. ['composer', 'chat', 'global']). Null when nothing is bound —\n * the caller must then leave the event alone. The full catalog entry; first\n * paint matches with command-keys.ts matchKey().\n */\nexport function matchCommand(event: KeyEventLike, liveScopes: readonly CommandScope[], platform: KeyPlatform = detectKeyPlatform()): WorkbenchCommand | null {\n const binding = matchKey(event, liveScopes, platform);\n return binding ? findCommand(binding.id) : null;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{C as e,M as t,N as n,O as r,V as i,a,i as o,t as s,w as c}from"./global-BJ_kVFpD.js";import{$ as l,Q as u,Y as d,et as f,n as p,q as m,r as h}from"./VerseShared-CH8mV5ew.js";async function g(e){try{let t=await e.json();return{detail:typeof t.error==`string`&&t.error?t.error:null,code:typeof t.code==`string`&&t.code?t.code:null}}catch{return{detail:null,code:null}}}async function _(e,t){if(n())return o(e,t);let i=await fetch(e,{method:`GET`,credentials:`same-origin`,headers:n()?{}:{"x-ashlr-read-client":c()},...t?{signal:t}:{}});if(i.status===401)throw r(),new s(`Read session expired.`,401,e);if(!i.ok){let{detail:t,code:n}=await g(i);throw new s(`GET ${e} failed (HTTP ${i.status})${t?`: ${t}`:``}.`,i.status,e,t,n)}return await i.json()}async function v(n,r,i){let o=e();if(!o)throw new h;let s=await a(n,r,o,i);return t(),s}var y=encodeURIComponent;function b(e,t){return _(`${l}/${y(e)}`,t)}async function x(e,t){let n=await v(`${l}/${y(e)}`,t);return t.model!==void 0&&i(p),n}function S(e){return _(f,e)}function C(e){return v(f,e)}function w(e,t,n){return v(`${m}/${y(e)}`,t,n)}function T(e,t){return v(`${m}/${y(e)}/${y(t)}/delete`,{})}function E(e,t){return _(`${u}/${y(e)}`,t)}function D(e,t,n={}){return v(`${u}/${y(e)}`,n.sendNow?{text:t,sendNow:!0}:{text:t})}function O(e,t){return v(`${u}/${y(e)}/${y(t)}/delete`,{})}function k(e,t){return v(`${u}/${y(e)}/${y(t)}/send`,{})}function A(e,t,n){let r=new URLSearchParams({sessionId:e,q:t});return _(`${d}?${r.toString()}`,n)}export{b as a,k as c,w as d,E as i,C as l,D as n,O as o,S as r,A as s,T as t,x as u};
|
|
2
|
-
//# sourceMappingURL=composer-queries-DHGJlnFJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"composer-queries-DHGJlnFJ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/composer/composer-queries.ts"],"sourcesContent":["/**\n * routes/verse/composer/composer-queries.ts — every call the 3.10 composer\n * makes (unit C3; core/verse/session-controls-api.ts is the server side).\n *\n * Same conventions as ../context/context-queries.ts:\n * - WRITES pull the held mutation token, throw `VerseMutationLockedError`\n * when none is held (so the caller's token gate can ask for it), and touch\n * the hold on success;\n * - READS carry the read-client proof and keep the server's refusal sentence\n * (`ApiError.detail`), because these routes answer a refused read with a\n * sentence written for a person.\n *\n * Spend: none of these start a model call EXCEPT the two that exist to send —\n * a queued follow-up when nothing is running, and [Send now]. Both go through\n * the engine's one `sendTurn` chokepoint, like POST /sessions/:id/turns.\n */\nimport { getMutationToken, getReadClientProof, reportSessionExpired, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { isRemoteMobileMode } from '../../../data/remote-mode.js';\nimport type {\n VerseAttachment,\n VerseAttachmentUpload,\n VerseFilesResponse,\n VerseQueueResponse,\n VerseSessionControlDefaults,\n VerseSessionControlDefaultsUpdate,\n VerseSessionControlsResponse,\n VerseSessionControlsUpdate,\n} from '../../../../core/verse/workbench-types.js';\nimport {\n VERSE_ATTACHMENTS_PATH,\n VERSE_FILES_PATH,\n VERSE_QUEUE_PATH,\n VERSE_SESSION_CONTROL_DEFAULTS_PATH,\n VERSE_SESSION_CONTROLS_PATH,\n} from '../../../../core/verse/workbench-types.js';\nimport { VERSE_SESSIONS_KEY, VerseMutationLockedError } from '../verse-queries.js';\n\n/** POST /queue and /send answer with the queue plus the turn they started, if any. */\nexport type VerseQueueSendResult = VerseQueueResponse & { sentTurnId: string | null };\n\nasync function refusalDetail(res: Response): Promise<{ detail: string | null; code: string | null }> {\n try {\n const body = (await res.json()) as { error?: unknown; code?: unknown };\n return {\n detail: typeof body.error === 'string' && body.error ? body.error : null,\n code: typeof body.code === 'string' && body.code ? body.code : null,\n };\n } catch {\n return { detail: null, code: null };\n }\n}\n\nasync function getJson<T>(path: string, signal?: AbortSignal): Promise<T> {\n if (isRemoteMobileMode()) return apiGet<T>(path, signal);\n const res = await fetch(path, {\n method: 'GET',\n credentials: 'same-origin',\n headers: isRemoteMobileMode() ? {} : { 'x-ashlr-read-client': getReadClientProof() },\n ...(signal ? { signal } : {}),\n });\n if (res.status === 401) {\n reportSessionExpired();\n throw new ApiError('Read session expired.', 401, path);\n }\n if (!res.ok) {\n const { detail, code } = await refusalDetail(res);\n throw new ApiError(`GET ${path} failed (HTTP ${res.status})${detail ? `: ${detail}` : ''}.`, res.status, path, detail, code);\n }\n return (await res.json()) as T;\n}\n\nasync function post<T>(path: string, body: unknown, signal?: AbortSignal): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token, signal);\n touchMutationHold();\n return result;\n}\n\nconst enc = encodeURIComponent;\n\n// ---------------------------------------------------------------------------\n// Controls\n// ---------------------------------------------------------------------------\n\nexport function fetchSessionControls(sessionId: string, signal?: AbortSignal): Promise<VerseSessionControlsResponse> {\n return getJson(`${VERSE_SESSION_CONTROLS_PATH}/${enc(sessionId)}`, signal);\n}\n\nexport async function updateSessionControls(sessionId: string, update: VerseSessionControlsUpdate): Promise<VerseSessionControlsResponse> {\n const result = await post<VerseSessionControlsResponse>(`${VERSE_SESSION_CONTROLS_PATH}/${enc(sessionId)}`, update);\n // A model switch changes the record the header and the chat list draw.\n if (update.model !== undefined) invalidate(VERSE_SESSIONS_KEY);\n return result;\n}\n\nexport function fetchControlDefaults(signal?: AbortSignal): Promise<VerseSessionControlDefaults> {\n return getJson(VERSE_SESSION_CONTROL_DEFAULTS_PATH, signal);\n}\n\nexport function updateControlDefaults(update: VerseSessionControlDefaultsUpdate): Promise<VerseSessionControlDefaults> {\n return post(VERSE_SESSION_CONTROL_DEFAULTS_PATH, update);\n}\n\n// ---------------------------------------------------------------------------\n// Attachments\n// ---------------------------------------------------------------------------\n\nexport function uploadAttachment(sessionId: string, upload: VerseAttachmentUpload, signal?: AbortSignal): Promise<VerseAttachment> {\n return post(`${VERSE_ATTACHMENTS_PATH}/${enc(sessionId)}`, upload, signal);\n}\n\nexport function deleteAttachment(sessionId: string, attachmentId: string): Promise<{ sessionId: string; items: VerseAttachment[] }> {\n return post(`${VERSE_ATTACHMENTS_PATH}/${enc(sessionId)}/${enc(attachmentId)}/delete`, {});\n}\n\n// ---------------------------------------------------------------------------\n// Queue\n// ---------------------------------------------------------------------------\n\nexport function fetchQueue(sessionId: string, signal?: AbortSignal): Promise<VerseQueueResponse> {\n return getJson(`${VERSE_QUEUE_PATH}/${enc(sessionId)}`, signal);\n}\n\nexport function enqueueFollowUp(sessionId: string, text: string, opts: { sendNow?: boolean } = {}): Promise<VerseQueueSendResult> {\n return post(`${VERSE_QUEUE_PATH}/${enc(sessionId)}`, opts.sendNow ? { text, sendNow: true } : { text });\n}\n\nexport function removeFollowUp(sessionId: string, queueId: string): Promise<VerseQueueResponse> {\n return post(`${VERSE_QUEUE_PATH}/${enc(sessionId)}/${enc(queueId)}/delete`, {});\n}\n\nexport function sendFollowUpNow(sessionId: string, queueId: string): Promise<VerseQueueSendResult> {\n return post(`${VERSE_QUEUE_PATH}/${enc(sessionId)}/${enc(queueId)}/send`, {});\n}\n\n// ---------------------------------------------------------------------------\n// Files (`@`)\n// ---------------------------------------------------------------------------\n\n/** The chat's cwd root rides along (additive), so a match there is written relative. */\nexport type VerseFilesResult = VerseFilesResponse & { primaryRoot?: string | null };\n\nexport function searchSessionFiles(sessionId: string, query: string, signal?: AbortSignal): Promise<VerseFilesResult> {\n const params = new URLSearchParams({ sessionId, q: query });\n return getJson(`${VERSE_FILES_PATH}?${params.toString()}`, signal);\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-DOAOxiKl.js";var n=e(t(),1);function r(e,t){if(!e)return`offline`;switch(t.status){case`ready`:return`live`;case`stale`:return`unreachable`;case`unavailable`:return t.error?`unreachable`:`live`;default:return`connecting`}}function i(e,t=Date.now()){if(e===null)return`No update yet`;let n=Math.max(0,Math.round((t-e)/1e3));if(n<45)return`Updated just now`;let r=Math.round(n/60);if(r<60)return`Updated ${r} min ago`;let i=Math.round(r/60);return i<24?`Updated ${i} h ago`:`Updated ${Math.round(i/24)} d ago`}function a(e){return window.addEventListener(`online`,e),window.addEventListener(`offline`,e),()=>{window.removeEventListener(`online`,e),window.removeEventListener(`offline`,e)}}function o(){return typeof navigator>`u`||navigator.onLine!==!1}function s(){return(0,n.useSyncExternalStore)(a,o,()=>!0)}export{i as n,s as r,r as t};
|
|
2
|
-
//# sourceMappingURL=connectivity-BViMMNcD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connectivity-BViMMNcD.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/connectivity.ts"],"sourcesContent":["/**\n * routes/verse/mobile/connectivity.ts — \"can this phone reach the Mac right\n * now?\", from signals the app already has.\n *\n * offline the phone itself has no network (navigator.onLine false)\n * unreachable the phone is online but the Mac did not answer the last\n * activity poll (asleep, off the relay, tunnel down). The last\n * good data stays on screen, dated — never replaced by zeros\n * live the last poll answered\n * connecting nothing has answered yet\n *\n * The shell's one activity loop (shell/useActivity.ts, 5 s visible / 30 s\n * hidden) is the heartbeat, so this costs no request of its own. Whether the\n * page itself loads offline is the service worker's job (public/verse-m/sw.js).\n */\nimport { useSyncExternalStore } from 'react';\nimport type { ActivityState } from '../shell/useActivity.js';\n\nexport type Reachability = 'live' | 'connecting' | 'offline' | 'unreachable';\n\nexport function reachabilityOf(online: boolean, activity: Pick<ActivityState, 'status' | 'data' | 'error'>): Reachability {\n if (!online) return 'offline';\n switch (activity.status) {\n case 'ready':\n return 'live';\n case 'stale':\n return 'unreachable';\n // A 404 (route not in this build) is 'unavailable' with no error: the Mac\n // answered. With an error and no data, it never answered.\n case 'unavailable':\n return activity.error ? 'unreachable' : 'live';\n default:\n return 'connecting';\n }\n}\n\n/** \"Updated 2 min ago\" — for the banner under a stale screen. */\nexport function sinceText(updatedAt: number | null, now: number = Date.now()): string {\n if (updatedAt === null) return 'No update yet';\n const s = Math.max(0, Math.round((now - updatedAt) / 1000));\n if (s < 45) return 'Updated just now';\n const m = Math.round(s / 60);\n if (m < 60) return `Updated ${m} min ago`;\n const h = Math.round(m / 60);\n return h < 24 ? `Updated ${h} h ago` : `Updated ${Math.round(h / 24)} d ago`;\n}\n\nfunction subscribeOnline(listener: () => void): () => void {\n window.addEventListener('online', listener);\n window.addEventListener('offline', listener);\n return () => {\n window.removeEventListener('online', listener);\n window.removeEventListener('offline', listener);\n };\n}\n\nfunction readOnline(): boolean {\n return typeof navigator === 'undefined' || navigator.onLine !== false;\n}\n\nexport function useOnline(): boolean {\n return useSyncExternalStore(subscribeOnline, readOnline, () => true);\n}\n"],"mappings":"0GAoBA,SAAgB,EAAe,EAAiB,EAA0E,CACxH,GAAI,CAAC,EAAQ,MAAO,UACpB,OAAQ,EAAS,OAAjB,CACE,IAAK,QACH,MAAO,OACT,IAAK,QACH,MAAO,cAGT,IAAK,cACH,OAAO,EAAS,MAAQ,cAAgB,OAC1C,QACE,MAAO,YACX,CACF,CAGA,SAAgB,EAAU,EAA0B,EAAc,KAAK,IAAI,EAAW,CACpF,GAAI,IAAc,KAAM,MAAO,gBAC/B,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,OAAO,EAAM,GAAa,GAAI,CAAC,EAC1D,GAAI,EAAI,GAAI,MAAO,mBACnB,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAC3B,GAAI,EAAI,GAAI,MAAO,WAAW,EAAE,UAChC,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAC3B,OAAO,EAAI,GAAK,WAAW,EAAE,QAAU,WAAW,KAAK,MAAM,EAAI,EAAE,EAAE,OACvE,CAEA,SAAS,EAAgB,EAAkC,CAGzD,OAFA,OAAO,iBAAiB,SAAU,CAAQ,EAC1C,OAAO,iBAAiB,UAAW,CAAQ,MAC9B,CACX,OAAO,oBAAoB,SAAU,CAAQ,EAC7C,OAAO,oBAAoB,UAAW,CAAQ,CAChD,CACF,CAEA,SAAS,GAAsB,CAC7B,OAAO,OAAO,UAAc,KAAe,UAAU,SAAW,EAClE,CAEA,SAAgB,GAAqB,CACnC,OAAA,EAAO,EAAA,qBAAA,CAAqB,EAAiB,MAAkB,EAAI,CACrE"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{C as e,H as t,M as n,O as r,V as i,a,t as o,w as s}from"./global-BJ_kVFpD.js";import{C as c,d as l,n as u,r as d}from"./VerseShared-CH8mV5ew.js";import{l as f}from"./verse-store-DAqqNIyD.js";import{t as p}from"./format-V6IiIMAL.js";var m=`verse-preferences`,h=`verse-memory:`;async function g(e){try{let t=await e.json();if(typeof t.error==`string`&&t.error)return t.error;if(typeof t.note==`string`&&t.note)return t.note}catch{}return null}async function _(e,t){let n=await fetch(e,{method:`GET`,credentials:`same-origin`,headers:{"x-ashlr-read-client":s()},signal:t});if(n.status===401)throw r(),new o(`Read session expired.`,401,e);if(!n.ok){let t=await g(n);throw new o(`GET ${e} failed (HTTP ${n.status})${t?`: ${p(t)}`:``}.`,n.status,e,t)}return await n.json()}async function v(t,r){let i=e();if(!i)throw new d;let o=await a(t,r,i);return n(),o}function y(e,t){let n=t.toString();return n?`${e}?${n}`:e}async function b(e,t){let n={mode:t},r=await v(c(e,`/context-mode`),n);return f(e,r),i(u),r}async function x(e,t={}){let n={};t.includeLastAssistant===!0&&(n.includeLastAssistant=!0);let r=typeof t.focus==`string`?t.focus.trim().slice(0,500):``;return r&&(n.focus=r),v(c(e,`/handoff-preview`),n)}async function S(e){let{source:t}=e,n={projectPath:t.projectPath,seatId:e.seatId,handoffFromSessionId:t.id},r=(t.extraRoots??[]).filter(e=>typeof e==`string`&&e.length>0&&e!==t.projectPath);r.length>0&&(n.extraRoots=r),e.model&&(n.model=e.model),e.contextMode&&(n.contextMode=e.contextMode);let i=e.title?.trim();i&&(n.title=i);let a=await v(`/api/verse/sessions`,n);return l(),a}function C(e){return _(`/api/verse/preferences`,e)}var w={key:m,fetch:e=>C(e)};async function T(e){let n=await v(`/api/verse/preferences`,e);return i(m),t(h),n}function E(e){let t=new URLSearchParams,n=e.workspaceId?.trim()??``,r=e.projectPath?.trim()??``,i=(e.extraRoots??[]).map(e=>e.trim()).filter(e=>e.length>0);if(n){if(r||i.length>0)throw Error(`Estimate a workspace or a folder set, not both.`);t.set(`workspaceId`,n)}else if(r){t.set(`projectPath`,r);for(let e of i)t.append(`extraRoots`,e)}else throw Error(`Pick a project or a workspace to estimate.`);return y(`/api/verse/context-fit`,t)}function D(e,t){return _(E(e),t)}function O(e,t,n){let r=new URLSearchParams({q:e});return typeof t==`number`&&Number.isFinite(t)&&r.set(`limit`,String(Math.max(1,Math.min(50,Math.floor(t))))),_(y(`/api/verse/search`,r),n)}function k(e){return`${h}${e}`}function A(e,t){return _(y(`/api/verse/memory`,new URLSearchParams({projectPath:e})),t)}function j(e){return{key:k(e),fetch:t=>A(e,t)}}async function M(e,t){let n=await v(`/api/verse/memory`,{projectPath:e,content:t});return i(k(e)),n}export{A as a,T as c,M as d,C as i,w as l,D as n,O as o,x as r,b as s,S as t,j as u};
|
|
2
|
-
//# sourceMappingURL=context-queries-Bsl-w0q-.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-queries-Bsl-w0q-.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/context/context-queries.ts"],"sourcesContent":["/**\n * routes/verse/context/context-queries.ts — every V3.9 context-orchestration\n * call the Verse console makes (docs/VERSE-CONTEXT.md): context mode, handoff\n * preview + handoff creation, preferences, context fit, session search and\n * shared project memory.\n *\n * Same conventions as ../verse-queries.ts, deliberately:\n *\n * - WRITES pull the held mutation token from auth-store, throw\n * `VerseMutationLockedError` (the SAME class, so ChatSection's `fail`\n * recognises it) when none is held, touch the hold on success, and\n * invalidate exactly the cache keys they obviously change.\n * - READS carry the per-tab read-client proof and report an expired read\n * session, exactly like `apiGet`. They are written out here rather than\n * routed through `apiGet` for one reason: `apiGet` discards the response\n * body on a non-2xx, and the routes below answer a refused read (\"path is\n * not a directory\", \"q must be at least 2 characters\") with a sentence\n * written for a person. Those sentences travel as `ApiError.detail`, the\n * field `describeControlError` already prefers.\n *\n * NOTHING HERE SPENDS. Every route below is deterministic server work\n * (preferences file, git ls-files, events.jsonl scans, a memory file). The\n * one model call a context feature can cause — \"ask this seat to summarize\"\n * — goes through the ordinary `sendVerseTurn`, i.e. through the engine's\n * `startTurn` chokepoint and the local-only policy, never through this file.\n *\n * `handoff-preview` is a POST although it only reads: it spawns\n * `git diff --stat` per root, and the API keeps every spawning route behind\n * the dispatch flag and the mutation token. It therefore needs the token like\n * any write, and the dialog says so.\n */\nimport type { VerseCreateSessionRequest, VerseSession } from '../../../data/api-types.js';\nimport type {\n VerseContextFit,\n VerseContextMode,\n VerseContextModeRequest,\n VerseHandoffPreview,\n VerseHandoffPreviewRequest,\n VersePreferences,\n VersePreferencesUpdate,\n VerseProjectMemory,\n VerseProjectMemoryWrite,\n VerseSearchResponse,\n} from '../../../../core/verse/types.js';\nimport { getMutationToken, reportSessionExpired, getReadClientProof, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate, invalidatePrefix } from '../../../data/cache.js';\nimport { ApiError, apiPost } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { invalidateVerseLists, verseSessionPath, VERSE_SESSIONS_KEY, VerseMutationLockedError } from '../verse-queries.js';\nimport { setVerseSession } from '../verse-store.js';\nimport { asClause } from '../autonomy/format.js';\n\nexport const VERSE_PREFERENCES_KEY = 'verse-preferences';\n/** Prefix of every per-project memory key; `invalidatePrefix` reaches all of them. */\nexport const VERSE_MEMORY_KEY_PREFIX = 'verse-memory:';\n/** Prefix of every context-fit key (one per root set). */\nexport const VERSE_CONTEXT_FIT_KEY_PREFIX = 'verse-context-fit:';\n\n// ---------------------------------------------------------------------------\n// Transport\n// ---------------------------------------------------------------------------\n\n/** The server's own refusal sentence, when the body carried one. */\nasync function refusalDetail(res: Response): Promise<string | null> {\n try {\n const body = (await res.json()) as { error?: unknown; note?: unknown };\n if (typeof body.error === 'string' && body.error) return body.error;\n if (typeof body.note === 'string' && body.note) return body.note;\n } catch {\n /* not JSON — the status alone has to do */\n }\n return null;\n}\n\n/**\n * GET with the read-client proof. Behaves like `apiGet` (401 reports the\n * expired read session) but keeps the server's refusal sentence.\n */\nasync function getJson<T>(path: string, signal?: AbortSignal): Promise<T> {\n const res = await fetch(path, {\n method: 'GET',\n credentials: 'same-origin',\n headers: { 'x-ashlr-read-client': getReadClientProof() },\n signal,\n });\n if (res.status === 401) {\n reportSessionExpired();\n throw new ApiError('Read session expired.', 401, path);\n }\n if (!res.ok) {\n const detail = await refusalDetail(res);\n // asClause: a detail ending in its own period would otherwise read \"…..\".\n throw new ApiError(`GET ${path} failed (HTTP ${res.status})${detail ? `: ${asClause(detail)}` : ''}.`, res.status, path, detail);\n }\n return (await res.json()) as T;\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nfunction withQuery(path: string, params: URLSearchParams): string {\n const query = params.toString();\n return query ? `${path}?${query}` : path;\n}\n\n// ---------------------------------------------------------------------------\n// Context mode\n// ---------------------------------------------------------------------------\n\n/**\n * Switch a session between `standard` and `expansive`. Applies from the next\n * turn (it only changes CLI flags, never prompt content, so the provider's\n * prompt cache survives the switch).\n *\n * The returned record is also written into verse-store, so the meter, the\n * mode chip and the composer hint all move on this response rather than on\n * the next list refresh — whichever component made the call.\n */\nexport async function setSessionContextMode(sessionId: string, mode: VerseContextMode): Promise<VerseSession> {\n const body: VerseContextModeRequest = { mode };\n const session = await post<VerseSession>(verseSessionPath(sessionId, '/context-mode'), body);\n setVerseSession(sessionId, session);\n invalidate(VERSE_SESSIONS_KEY);\n return session;\n}\n\n// ---------------------------------------------------------------------------\n// Handoff\n// ---------------------------------------------------------------------------\n\n/** Longest focus line the API accepts (types.ts VerseHandoffPreviewRequest). */\nexport const HANDOFF_FOCUS_MAX_CHARS = 500;\n\n/**\n * Build the deterministic handoff note for a session. Zero spend: the server\n * reads events.jsonl and a bounded `git diff --stat` per root.\n *\n * Only keys that carry a value are sent — the route rejects unknown keys, and\n * `includeLastAssistant: false` is the default anyway, so omitting it keeps\n * the body minimal and the server's validation the single authority.\n */\nexport async function fetchHandoffPreview(sessionId: string, req: VerseHandoffPreviewRequest = {}): Promise<VerseHandoffPreview> {\n const body: VerseHandoffPreviewRequest = {};\n if (req.includeLastAssistant === true) body.includeLastAssistant = true;\n const focus = typeof req.focus === 'string' ? req.focus.trim().slice(0, HANDOFF_FOCUS_MAX_CHARS) : '';\n if (focus) body.focus = focus;\n return post<VerseHandoffPreview>(verseSessionPath(sessionId, '/handoff-preview'), body);\n}\n\nexport interface HandoffSessionInput {\n /** The session being handed off. Its PINNED roots are reused, see below. */\n source: VerseSession;\n seatId: string;\n model?: string;\n contextMode?: VerseContextMode;\n /** Optional title; absent → the server titles it from the first message. */\n title?: string;\n}\n\n/**\n * Create the session a handoff continues in. FREE: creating a session spawns\n * nothing. The handoff text is NOT sent here — the caller pre-fills the new\n * chat's composer and the operator presses send, so the first (spent) turn is\n * always one the operator read.\n *\n * Roots: the source's PINNED roots (`projectPath` + `extraRoots`), never its\n * `workspaceId`. A session keeps the roots it was created with even if the\n * named workspace was later edited or deleted (types.ts VerseSession\n * `extraRoots`); re-resolving the workspace here would let the continuation\n * silently gain or lose a folder the conversation was about — or fail\n * outright on a deleted workspace. The API also refuses the two spellings\n * mixed, so it is one or the other, and the pinned set is the honest one.\n *\n * The server resolves `handoffFrom.title` from `handoffFromSessionId` itself;\n * nothing about provenance is taken from this body.\n */\nexport async function createHandoffSession(input: HandoffSessionInput): Promise<VerseSession> {\n const { source } = input;\n const req: VerseCreateSessionRequest = {\n projectPath: source.projectPath,\n seatId: input.seatId,\n handoffFromSessionId: source.id,\n };\n const extras = (source.extraRoots ?? []).filter((root) => typeof root === 'string' && root.length > 0 && root !== source.projectPath);\n if (extras.length > 0) req.extraRoots = extras;\n if (input.model) req.model = input.model;\n if (input.contextMode) req.contextMode = input.contextMode;\n const title = input.title?.trim();\n if (title) req.title = title;\n const session = await post<VerseSession>('/api/verse/sessions', req);\n invalidateVerseLists();\n return session;\n}\n\n// ---------------------------------------------------------------------------\n// Preferences\n// ---------------------------------------------------------------------------\n\nexport function fetchPreferences(signal?: AbortSignal): Promise<VersePreferences> {\n return getJson<VersePreferences>('/api/verse/preferences', signal);\n}\n\nexport const versePreferencesQuery: QueryDef<VersePreferences> = {\n key: VERSE_PREFERENCES_KEY,\n fetch: (signal) => fetchPreferences(signal),\n};\n\n/**\n * Change ONE standing preference (the three request forms are exclusive, so a\n * body never changes more than the operator clicked). Memory records carry an\n * `enabled` flag derived from these preferences, so every cached memory read\n * is refreshed too.\n */\nexport async function updatePreferences(update: VersePreferencesUpdate): Promise<VersePreferences> {\n const prefs = await post<VersePreferences>('/api/verse/preferences', update);\n invalidate(VERSE_PREFERENCES_KEY);\n invalidatePrefix(VERSE_MEMORY_KEY_PREFIX);\n return prefs;\n}\n\n// ---------------------------------------------------------------------------\n// Context fit\n// ---------------------------------------------------------------------------\n\nexport interface ContextFitQuery {\n workspaceId?: string;\n projectPath?: string;\n extraRoots?: string[];\n}\n\n/**\n * The query string for a fit request: a workspace id ALONE, or a project path\n * with each extra root as its own repeated `extraRoots` parameter (a path may\n * contain a comma, so a joined list could not be split back honestly). The\n * API refuses the two spellings mixed — refused here first, with the reason.\n */\nexport function contextFitPath(q: ContextFitQuery): string {\n const params = new URLSearchParams();\n const workspaceId = q.workspaceId?.trim() ?? '';\n const projectPath = q.projectPath?.trim() ?? '';\n const extras = (q.extraRoots ?? []).map((r) => r.trim()).filter((r) => r.length > 0);\n if (workspaceId) {\n if (projectPath || extras.length > 0) throw new Error('Estimate a workspace or a folder set, not both.');\n params.set('workspaceId', workspaceId);\n } else if (projectPath) {\n params.set('projectPath', projectPath);\n for (const root of extras) params.append('extraRoots', root);\n } else {\n throw new Error('Pick a project or a workspace to estimate.');\n }\n return withQuery('/api/verse/context-fit', params);\n}\n\n/** How big the reachable code is, in estimated tokens. Zero spend (git ls-files + stat). */\nexport function fetchContextFit(q: ContextFitQuery, signal?: AbortSignal): Promise<VerseContextFit> {\n return getJson<VerseContextFit>(contextFitPath(q), signal);\n}\n\n/** Cache-backed form, keyed by the exact root set, for pickers that re-render often. */\nexport function verseContextFitQuery(q: ContextFitQuery): QueryDef<VerseContextFit> {\n const path = contextFitPath(q);\n return { key: `${VERSE_CONTEXT_FIT_KEY_PREFIX}${path}`, fetch: (signal) => getJson<VerseContextFit>(path, signal) };\n}\n\n// ---------------------------------------------------------------------------\n// Session search\n// ---------------------------------------------------------------------------\n\n/** The API caps `limit` at 50 (session-search.ts); asking for more is refused, so clamp. */\nexport const SEARCH_LIMIT_MAX = 50;\n\n/** Keyword search over past sessions' messages. Zero spend — a bounded scan of events.jsonl. */\nexport function searchSessions(q: string, limit?: number, signal?: AbortSignal): Promise<VerseSearchResponse> {\n const params = new URLSearchParams({ q });\n if (typeof limit === 'number' && Number.isFinite(limit)) {\n params.set('limit', String(Math.max(1, Math.min(SEARCH_LIMIT_MAX, Math.floor(limit)))));\n }\n return getJson<VerseSearchResponse>(withQuery('/api/verse/search', params), signal);\n}\n\n// ---------------------------------------------------------------------------\n// Shared project memory\n// ---------------------------------------------------------------------------\n\n/**\n * The memory record as the browser receives it. The server's public-JSON\n * sanitizer rewrites the home folder as `~` and secret-shaped text as\n * `[REDACTED]` on the way out, so `content` can differ from the file on disk;\n * the route then adds `contentSanitized: true` (absent otherwise). Declared\n * here, not in types.ts: that contract is frozen and the flag is additive.\n */\nexport type VerseProjectMemoryView = VerseProjectMemory & { contentSanitized?: boolean };\n\nexport function verseProjectMemoryKey(projectPath: string): string {\n return `${VERSE_MEMORY_KEY_PREFIX}${projectPath}`;\n}\n\nexport function fetchProjectMemory(projectPath: string, signal?: AbortSignal): Promise<VerseProjectMemoryView> {\n return getJson<VerseProjectMemoryView>(withQuery('/api/verse/memory', new URLSearchParams({ projectPath })), signal);\n}\n\nexport function verseProjectMemoryQuery(projectPath: string): QueryDef<VerseProjectMemoryView> {\n return { key: verseProjectMemoryKey(projectPath), fetch: (signal) => fetchProjectMemory(projectPath, signal) };\n}\n\n/**\n * Replace MEMORY.md for a project (atomic, 0600 on the server, capped at\n * VERSE_MEMORY_MAX_BYTES). `''` clears it. Chats already open keep the block\n * pinned in their instructions at creation; they see the change when they\n * next read the file.\n */\nexport async function writeProjectMemory(projectPath: string, content: string): Promise<VerseProjectMemoryView> {\n const body: VerseProjectMemoryWrite = { projectPath, content };\n const memory = await post<VerseProjectMemoryView>('/api/verse/memory', body);\n invalidate(verseProjectMemoryKey(projectPath));\n return memory;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-hePW80VL.js";import{C as t,M as n,V as r,a as i,i as a}from"./global-BJ_kVFpD.js";import{i as o,n as s}from"./mutations-BlGALvmG.js";var c={dailyBudgetUsd:{min:0,max:2**53-1},perTickItems:{min:1,max:2**53-1},parallel:{min:1,max:2**53-1},intervalMs:{min:3e4,max:864e5},maxConcurrent:{min:1,max:2**53-1},concurrency:{min:1,max:2**53-1},subscriptionMaxPercent:{min:1,max:100},foundryLimitMax:{min:0,max:1e6}},l=e({VERSE_AUDIT_DEFAULT_LIMIT:()=>200,VERSE_AUDIT_MAX:()=>h,VERSE_AUDIT_PREFIX:()=>m,VERSE_CAPS_KEY:()=>d,VERSE_CONTROL_KEY:()=>u,VERSE_SAFETY_KEY:()=>p,VERSE_SCOPE_KEY:()=>f,VerseControlLockedError:()=>T,engageEmergencyStop:()=>j,invalidateControl:()=>D,normalizeBacklog:()=>C,releaseEmergencyStop:()=>M,runDaemonAction:()=>A,updateVerseCaps:()=>O,updateVerseScope:()=>k,verseAuditQuery:()=>x,verseBacklogQuery:()=>w,verseCapsQuery:()=>_,verseControlQuery:()=>g,verseGoalsQuery:()=>S,verseSafetyQuery:()=>v,verseScopeQuery:()=>b}),u=`verse-control`,d=`verse-caps`,f=`verse-scope`,p=`verse-safety`,m=`verse-audit:`,h=500,g={key:u,fetch:e=>a(`/api/verse/control`,e)},_={key:d,fetch:e=>a(`/api/verse/caps`,e)},v={key:p,fetch:e=>a(`/api/verse/safety`,e)};function y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var b={key:f,fetch:e=>a(`/api/verse/scope`,e)};function x(e={}){let t=Math.min(e.limit??200,h),n=new URLSearchParams;return n.set(`limit`,String(t)),e.action&&n.set(`action`,e.action),e.result&&n.set(`result`,e.result),{key:`${m}${t}:${e.action??``}:${e.result??``}`,fetch:e=>a(`/api/verse/audit?${n.toString()}`,e)}}var S={key:`goals`,fetch:e=>a(`/api/goals`,e)};function C(e){return e==null?{items:[],absent:!0}:Array.isArray(e)?{items:e,absent:!1}:y(e)&&Array.isArray(e.items)?{items:e.items,absent:!1}:{items:[],absent:!0}}var w={key:`backlog`,fetch:e=>a(`/api/backlog`,e).then(C)},T=class extends Error{constructor(){super(`Unlock actions with the mutation token before changing the loop.`),this.name=`VerseControlLockedError`}};async function E(e,r){let a=t();if(!a)throw new T;let o=await i(e,r,a);return n(),o}function D(){r(u)}async function O(e){let t=await E(`/api/verse/caps`,e);return r(d),D(),t}async function k(e){await E(`/api/verse/scope`,e),r(f),D()}async function A(e){let t=await E(`/api/verse/daemon`,{action:e});return D(),r(`daemon`),t}async function j(){await s(),D()}async function M(){await o(),D()}export{M as a,k as c,_ as d,g as f,c as g,b as h,j as i,x as l,v as m,T as n,A as o,S as p,l as r,O as s,u as t,w as u};
|
|
2
|
-
//# sourceMappingURL=control-queries-CUNa6TAx.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"control-queries-CUNa6TAx.js","names":[],"sources":["../../../../../../src/core/verse/control-types.ts","../../../../../../src/web-ui/routes/verse/autonomy/control-queries.ts"],"sourcesContent":["import type { LeaderPreferenceConfig, ResolvedLeaderPreferences } from '../vision/leader-preferences.js';\nexport type { LeaderPreferenceKey } from '../vision/leader-preferences.js';\nexport type VerseLeaderPreferences = ResolvedLeaderPreferences;\nimport type { GoalPreferenceConfig, ResolvedGoalPreferences } from '../goals/preferences.js';\nexport type { GoalPreferenceKey } from '../goals/preferences.js';\nexport type VerseGoalPreferences = ResolvedGoalPreferences;\n\n/**\n * Ashlr Verse — autonomy control-plane contract (V2).\n *\n * V1 (`./types.ts`) is frozen: it describes interactive chat sessions. This\n * module adds the shapes the Autonomy cockpit needs to run the hub's existing\n * autonomous fleet without a terminal — the CONFIGURED caps, the enrollment\n * scope, the audit trail, the kill switch, and the daemon lifecycle.\n *\n * Two hard rules are encoded here rather than left to the UI:\n *\n * 1. The global kill switch (`~/.ashlr/KILL`) is an EMERGENCY STOP, not a\n * pause. It also refuses the agent's own `mcp-native` write tools. Every\n * shape that carries it is named `killSwitch`, and the action that engages\n * it is named `emergencyStop`. It is never called \"pause\".\n *\n * V2.1 adds the control that name was being withheld from: the\n * DAEMON-SCOPED pause (`~/.ashlr/daemon.paused`, see core/daemon/pause.ts).\n * It halts autonomous dispatch and NOTHING else — `assertMayMutate`,\n * `mcp-native`, and `mcp-native-engineer` do not read it. It travels as\n * `pause: VerseDaemonPause`, always a FIELD OF ITS OWN, never merged into\n * `killSwitch`, because the whole point is that the two have different\n * blast radii and the operator must be able to see which one is on.\n * 2. Nothing in this module is a secret. Launcher commands, tokens, and env\n * values never appear in any of these shapes — the daemon lifecycle result\n * carries a pid, never an argv.\n *\n * Everything is a projection of state the hub already computes; nothing here\n * introduces a new source of truth.\n */\n\nimport type { AuditEntry } from '../types.js';\nimport type { PublicDaemonObservation } from '../daemon/public-observation.js';\nimport type { FrontierEngineUsage } from '../usage/frontier-usage.js';\nimport type { SafetyReport } from '../../cli/verify-safety.js';\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\n/**\n * Error codes for `/api/verse/{control,caps,scope,audit,daemon,safety}`.\n * `VERSE_INVALID` / `VERSE_TOO_LARGE` are deliberately the SAME codes V1 uses,\n * so one client error mapper covers both halves of the Verse API.\n */\nexport type VerseControlErrorCode =\n | 'VERSE_INVALID'\n | 'VERSE_REFUSED'\n | 'VERSE_TOO_LARGE'\n | 'VERSE_UNAVAILABLE';\n\n/** Every error body on these routes. */\nexport interface VerseControlError {\n error: string;\n code: VerseControlErrorCode;\n}\n\n// ---------------------------------------------------------------------------\n// Caps — the CONFIGURED limits (GET/POST /api/verse/caps)\n// ---------------------------------------------------------------------------\n\n/** One `cfg.foundry.limits[engine]` entry, flattened for transport. */\nexport interface VerseFoundryLimit {\n /** EngineId key, e.g. 'claude' | 'codex'. */\n engine: string;\n /** Rolling window label, e.g. '1m' | '5m' | '1h' | '1d'. */\n window: string;\n /** Max dispatches per window. 0 means \"no dispatches allowed\". */\n max: number;\n}\n\n/** `cfg.daemon.concurrency` — null per tier means \"not configured, using the default\". */\nexport interface VerseCapsConcurrency {\n local: number | null;\n cloud: number | null;\n total: number | null;\n}\n\n/**\n * The configured autonomy limits. These are the values the daemon actually\n * reads — no route exposed them before V2, which is why the cockpit could not\n * show a cap next to the usage burning against it.\n */\nexport interface VerseCaps {\n /** HARD daily spend ceiling (USD). 0 means the daemon is stopped by budget. */\n dailyBudgetUsd: number;\n /** Backlog items processed per tick. */\n perTickItems: number;\n /** Actual per-tick durable-journal admission; absent on older servers. */\n journalItemCapacity?: number;\n /** Concurrent sandboxed swarms per tick (batch mode). */\n parallel: number;\n /** Tick interval in loop mode (ms). */\n intervalMs: number;\n /** Daemon execution mode. */\n mode: 'batch' | 'continuous';\n /** Ceiling on in-flight dispatches in continuous mode; null when unset. */\n maxConcurrent: number | null;\n /** Per-tier concurrency budgets; null per tier when unset. */\n concurrency: VerseCapsConcurrency;\n /** Subscription-window throttle percentage (1–100). */\n subscriptionMaxPercent: number;\n /** Per-engine dispatch limits, sorted by engine id. */\n foundryLimits: VerseFoundryLimit[];\n /** Present only on servers supporting operator goal preferences. */\n goalPreferences?: VerseGoalPreferences;\n leaderPreferences?: VerseLeaderPreferences;\n /** Separate scheduling preference: defer NEW planning/invention while active work is available. */\n goalFocusMode?: boolean;\n goalFocusActiveThreshold?: number;\n /**\n * HONEST STATE: the cap keys whose value is a built-in default rather than\n * something configured on disk. The UI renders these as \"default\", never as\n * a deliberate choice the operator made. Sorted, stable.\n */\n defaulted: VerseCapKey[];\n}\n\n/** The scalar cap keys a client may update. `foundryLimits` is handled separately. */\nexport type VerseCapKey =\n | 'dailyBudgetUsd'\n | 'perTickItems'\n | 'parallel'\n | 'intervalMs'\n | 'mode'\n | 'maxConcurrent'\n | 'concurrency'\n | 'subscriptionMaxPercent'\n | 'foundryLimits'\n | 'leaderPreferences'\n | 'goalPreferences'\n | 'goalFocusMode'\n | 'goalFocusActiveThreshold';\n\n/** POST /api/verse/caps — a partial update. Unknown keys are rejected. */\nexport interface VerseCapsUpdate {\n dailyBudgetUsd?: number;\n perTickItems?: number;\n parallel?: number;\n intervalMs?: number;\n mode?: 'batch' | 'continuous';\n maxConcurrent?: number;\n concurrency?: { local?: number; cloud?: number; total?: number };\n subscriptionMaxPercent?: number;\n /** Replaces the named engines' limits; engines not listed are left alone. */\n foundryLimits?: VerseFoundryLimit[];\n goalPreferences?: GoalPreferenceConfig;\n leaderPreferences?: LeaderPreferenceConfig;\n goalFocusMode?: boolean;\n}\n\n/**\n * POST /api/verse/caps result. `live: true` is not decoration — the daemon\n * re-reads config at the top of every tick, so a saved cap binds on the next\n * tick without a restart.\n */\nexport interface VerseCapsUpdateResult {\n ok: true;\n /** The cap keys this request actually changed, in request order. */\n applied: VerseCapKey[];\n live: true;\n /** The full caps AFTER the write, re-read from disk. */\n caps: VerseCaps;\n}\n\n// ---------------------------------------------------------------------------\n// Scope — the enrollment registry (GET/POST /api/verse/scope)\n// ---------------------------------------------------------------------------\n\nexport interface VerseScopeRepo {\n path: string;\n name: string;\n /** False when the registry still lists a directory that is gone. */\n exists: boolean;\n}\n\n/**\n * GET /api/verse/scope. An EMPTY `repos` with no `degradedReason` is the\n * valid default state and means the daemon will do nothing at all — the UI\n * must say that plainly rather than rendering an innocuous empty list.\n */\nexport interface VerseScope {\n repos: VerseScopeRepo[];\n /** Present only when enrollment authority could not be read at all. */\n degradedReason?: string;\n}\n\nexport type VerseScopeAction = 'enroll' | 'unenroll';\n\n/** POST /api/verse/scope body. */\nexport interface VerseScopeRequest {\n action: VerseScopeAction;\n path: string;\n}\n\nexport interface VerseScopeResult {\n ok: boolean;\n action: VerseScopeAction;\n /** The canonical (realpath'd) registry path this acted on. */\n path: string;\n /** False when the registry already had the requested state (idempotent). */\n changed: boolean;\n /** Policy reason string, e.g. 'enrolled' | 'already-unenrolled'. */\n reason: string;\n /** The scope AFTER the mutation. */\n scope: VerseScope;\n}\n\n// ---------------------------------------------------------------------------\n// Audit (GET /api/verse/audit)\n// ---------------------------------------------------------------------------\n\nexport type VerseAuditResult = AuditEntry['result'];\n\n/** GET /api/verse/audit?limit=&action=&result= */\nexport interface VerseAuditResponse {\n /** Newest first, already filtered, at most `limit` entries. */\n entries: AuditEntry[];\n /** The effective cap applied to `entries` (never above 500). */\n limit: number;\n /** Echo of the applied filter so the UI cannot drift from what it shows. */\n filter: { action: string | null; result: VerseAuditResult | null };\n /** How many raw entries were scanned before filtering. */\n scanned: number;\n /**\n * True when the scan filled its own ceiling, so older entries MAY exist\n * beyond what was read. Conservative by design: it never claims the reader\n * reached the end of history when it cannot prove that.\n */\n truncated: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Kill switch\n// ---------------------------------------------------------------------------\n\n/**\n * The GLOBAL kill switch (`~/.ashlr/KILL`). `state: 'unknown'` is a real,\n * distinct outcome — the sentinel was uninspectable — and must never be\n * rendered as \"off\".\n */\nexport interface VerseKillSwitch {\n state: 'active' | 'inactive' | 'unknown';\n sourceState: 'healthy' | 'degraded';\n reason: string;\n /**\n * Plain-language statement of blast radius, shipped with the state so no\n * surface can show the switch without the warning.\n */\n note: string;\n}\n\n// ---------------------------------------------------------------------------\n// Daemon pause — the NARROW stop (POST /api/verse/daemon {action:'pause'})\n// ---------------------------------------------------------------------------\n\n/**\n * The DAEMON-SCOPED pause sentinel (`~/.ashlr/daemon.paused`), projected for\n * transport. Shares `VerseKillSwitch`'s shape on purpose — both are sentinels\n * read the same way, and both keep `'unknown'` as a real third state that must\n * never render as \"off\".\n *\n * `state: 'unknown'` is treated by the daemon as PAUSED (fail safe), so the UI\n * must say \"paused — the sentinel could not be read\", not \"running\".\n *\n * The sentinel PATH is deliberately absent: it is machine-local detail the\n * cockpit has no use for, the same omission `VerseKillSwitch` makes.\n */\nexport interface VerseDaemonPause {\n /** 'paused' = dispatch halted. 'running' = proven not paused. */\n state: 'paused' | 'running' | 'unknown';\n sourceState: 'healthy' | 'degraded';\n reason: string;\n /** ISO time the pause was requested; null when not paused or unknown. */\n pausedAt: string | null;\n /** Which surface paused it ('cli' | 'verse-control-plane' | 'unknown'). */\n by: string | null;\n /** Plain-language statement of the NARROW blast radius, shipped with the state. */\n note: string;\n}\n\n// ---------------------------------------------------------------------------\n// Daemon lifecycle (POST /api/verse/daemon)\n// ---------------------------------------------------------------------------\n\n/**\n * 'start' launches the autonomous loop detached (exactly `ashlr daemon start`).\n * 'once' runs a single tick the same way.\n *\n * Three stops, three honestly different scopes:\n * - 'pause' — halts autonomous DISPATCH only. Reversible with 'resume'.\n * Leaves the agent's own write tools alone. The default choice.\n * - 'stop' — the ordinary stop, which today engages the GLOBAL kill switch\n * (`stopDaemon()` is `setKill(true)`), so it is wider than a\n * pause and the result's `note` says so.\n * - emergency stop — not on this route at all (`POST /api/fleet/pause`).\n */\nexport type VerseDaemonAction = 'start' | 'stop' | 'once' | 'pause' | 'resume';\n\n/** Non-secret projection of `~/.ashlr/daemon.json`. */\nexport interface VerseDaemonStateProjection {\n running: boolean;\n pid: number | null;\n startedAt: string | null;\n lastTickAt: string | null;\n todayDate: string | null;\n todaySpentUsd: number;\n itemsProcessed: number;\n}\n\n/**\n * POST /api/verse/daemon result. `pid` is the only thing that ever escapes the\n * spawn — the argv, the env, and the resolved launcher path never do.\n */\nexport interface VerseDaemonActionResult {\n ok: boolean;\n action: VerseDaemonAction;\n /** True when a detached child was launched by this request. */\n spawned: boolean;\n /** The detached child's pid for 'start'/'once'; null otherwise. */\n pid: number | null;\n state: VerseDaemonStateProjection;\n killSwitch: VerseKillSwitch;\n /** The daemon-scoped pause AFTER this action. Never folded into killSwitch. */\n pause: VerseDaemonPause;\n /** One line of plain language about what just happened, for the UI to echo. */\n note: string;\n}\n\n// ---------------------------------------------------------------------------\n// Fleet essentials + control aggregate (GET /api/verse/control)\n// ---------------------------------------------------------------------------\n\n/**\n * The small honest slice of FleetStatus/ControlSnapshot the cockpit needs.\n * Deliberately excludes service file paths and error-log paths: the cockpit\n * does not need them, and keeping them out keeps this payload trivially\n * provable as free of machine-local command detail.\n */\nexport interface VerseFleetEssentials {\n /** Mode the autonomy control loop last directed, when known. */\n directionMode: string | null;\n directionAt: string | null;\n directionReason: string | null;\n autonomyControlLoop: boolean;\n autonomyControlMode: string;\n service: {\n registrationState: 'present' | 'absent' | 'unknown';\n installed: boolean;\n running: boolean;\n runtimeState: string | null;\n };\n /** Freshness of the shared fleet-status cache backing these values. */\n freshness: { stale: boolean; ageMs: number };\n}\n\n/** Today's spend against the configured ceiling. */\nexport interface VerseSpend {\n /** null when the daemon ledger could not be read (NOT zero). */\n todayUsd: number | null;\n /** Calendar day the counter applies to; null before the first tick. */\n todayDate: string | null;\n dailyBudgetUsd: number;\n}\n\n/**\n * GET /api/verse/control — the ONE aggregate the Autonomy view reads.\n * Every field is a projection of an existing snapshot; nothing is recomputed.\n */\nexport interface VerseControlSnapshot {\n generatedAt: string;\n daemon: PublicDaemonObservation;\n fleet: VerseFleetEssentials;\n caps: VerseCaps;\n scope: VerseScope;\n killSwitch: VerseKillSwitch;\n /**\n * The DAEMON-SCOPED pause, as its own field. A cockpit that folded this into\n * `killSwitch` would be back to one control with two names; keeping them\n * separate is what lets the Autonomy view render \"paused\" and \"kill switch\n * engaged\" as the different situations they are.\n */\n pause: VerseDaemonPause;\n /** Pending inbox proposals awaiting a human decision. */\n pendingApprovals: number;\n spend: VerseSpend;\n /** Per-engine quota usage against the configured foundry limits. */\n quota: FrontierEngineUsage[];\n /** False when this server was started without --allow-dispatch: all POSTs 404. */\n dispatchEnabled: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Safety (GET /api/verse/safety)\n// ---------------------------------------------------------------------------\n\n/** GET /api/verse/safety — the `ashlr verify-safety --json` report, unmodified. */\nexport type VerseSafetyReport = SafetyReport;\n\n// ---------------------------------------------------------------------------\n// Bounds (single source of truth — the API validator and the UI share these)\n// ---------------------------------------------------------------------------\n\nexport const VERSE_CAPS_BOUNDS = {\n // Explicit USD preference; zero remains Stop. This never raises a signed\n // spend allowance, and fractional dollar amounts remain supported.\n dailyBudgetUsd: { min: 0, max: Number.MAX_SAFE_INTEGER },\n // These are operator preferences, not provider or hardware capacity. The\n // only numeric ceiling is exact integer representation; launch admission\n // still applies queue, resource, journal, account, and signed-scope limits.\n perTickItems: { min: 1, max: Number.MAX_SAFE_INTEGER },\n parallel: { min: 1, max: Number.MAX_SAFE_INTEGER },\n intervalMs: { min: 30_000, max: 86_400_000 },\n maxConcurrent: { min: 1, max: Number.MAX_SAFE_INTEGER },\n /**\n * DELIBERATE DEVIATION from VERSE-CONTRACT-V2's \"concurrency 0-32 each\".\n *\n * The daemon cannot honour a zero tier. `resolveCfg` (daemon/loop.ts) only\n * adopts a tier when it is `> 0`, and `TieredPool`'s constructor floors\n * every cap at `Math.max(1, …)` on top of that — so a stored 0 came back as\n * the built-in 2/6/8 while the cockpit displayed 0. Teaching the pool to\n * accept 0 is not a fix either: `tieredBounded` would then never start a\n * task on that tier and never resolve, i.e. a hung tick.\n *\n * A floor of 1 is therefore the only value that is true in both places. To\n * stop dispatch entirely, the honest lever is `dailyBudgetUsd: 0`, which the\n * daemon now really does obey.\n */\n concurrency: { min: 1, max: Number.MAX_SAFE_INTEGER },\n subscriptionMaxPercent: { min: 1, max: 100 },\n foundryLimitMax: { min: 0, max: 1_000_000 },\n} as const;\n\n/** Hard ceiling on GET /api/verse/audit `limit`. */\nexport const VERSE_AUDIT_MAX_LIMIT = 500;\n/** Default `limit` when the query omits one. */\nexport const VERSE_AUDIT_DEFAULT_LIMIT = 100;\n/**\n * Hard ceiling on how many raw audit entries a single request will read before\n * filtering. Bounds the work a filtered query can ask of the disk.\n */\nexport const VERSE_AUDIT_MAX_SCAN = 5_000;\n\n/** The kill switch's blast-radius warning — one string, used everywhere. */\nexport const VERSE_KILL_SWITCH_NOTE =\n 'Emergency stop: the global kill switch also refuses the agent\\'s own write tools, not just the daemon. Use the daemon pause action for an ordinary, reversible halt.';\n\n/**\n * The pause's blast-radius statement — the counterpart to\n * VERSE_KILL_SWITCH_NOTE, shipped with every pause projection so no surface\n * can show the state without the scope. Says what it does NOT do, because\n * that is the entire difference from the control next to it.\n */\nexport const VERSE_DAEMON_PAUSE_NOTE =\n 'Pause: halts autonomous dispatch only. Your own write tools keep working, nothing in flight is rolled back, and Resume restores the loop without a restart.';\n","/**\n * routes/verse/autonomy/control-queries.ts — every `/api/verse/{control,caps,\n * scope,audit,daemon,safety}` call the Autonomy cockpit makes, plus the two\n * existing read-only feeds it borrows (`/api/goals`, `/api/backlog`).\n *\n * Same contract as routes/verse/verse-queries.ts: reads are QueryDefs consumed\n * through useQuery (cache-backed, so a background refresh never blanks a\n * populated panel); writes pull the held mutation token from auth-store, touch\n * the hold on success, and invalidate exactly the keys they affect.\n *\n * Two deliberate choices worth knowing before editing:\n *\n * 1. **The envelopes are now fixed, so nothing is normalized.**\n * `/api/verse/scope` and `/api/verse/audit` are declared in\n * `src/core/verse/control-types.ts` (`VerseScope`, `VerseAuditResponse`)\n * and the handlers serialize exactly those, so these fetchers are typed\n * straight through. The speculative bare-array/wrapper normalization that\n * let this surface ship before the routes existed has been deleted.\n * `/api/backlog` keeps its normalizer — that route really does answer\n * `loadBacklog() ?? null` and is not part of the V2 contract.\n * 2. **Emergency stop is not a route of its own.** The global kill switch is\n * `POST /api/fleet/pause` (and `/resume` to clear), already wrapped in\n * data/mutations.ts. It is re-exported here under honest names so no call\n * site in this folder can accidentally call it \"pause\".\n */\nimport { VERSE_AUDIT_MAX_LIMIT } from './control-types.js';\nimport type { GoalSummary, QueryDef } from '../../../data/queries.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport { pauseFleet, resumeFleet } from '../../../data/mutations.js';\nimport type {\n VerseAuditFilters,\n VerseAuditPage,\n VerseCaps,\n VerseCapsApplyResult,\n VerseCapsPatch,\n VerseControlSnapshot,\n VerseDaemonAction,\n VerseDaemonActionResult,\n VerseSafetyReport,\n VerseScope,\n VerseScopePatch,\n} from './control-types.js';\n\nexport const VERSE_CONTROL_KEY = 'verse-control';\nexport const VERSE_CAPS_KEY = 'verse-caps';\nexport const VERSE_SCOPE_KEY = 'verse-scope';\nexport const VERSE_SAFETY_KEY = 'verse-safety';\nexport const VERSE_AUDIT_PREFIX = 'verse-audit:';\n\n/**\n * Server-side cap on `/api/verse/audit`, re-exported from the backend\n * contract module so the client cannot drift from the value the route\n * actually clamps to.\n */\nexport const VERSE_AUDIT_MAX = VERSE_AUDIT_MAX_LIMIT;\n/** Enough rows that the table is the real \"while I was asleep\" view. */\nexport const VERSE_AUDIT_DEFAULT_LIMIT = 200;\n\nexport const verseControlQuery: QueryDef<VerseControlSnapshot> = {\n key: VERSE_CONTROL_KEY,\n fetch: (signal) => apiGet<VerseControlSnapshot>('/api/verse/control', signal),\n};\n\nexport const verseCapsQuery: QueryDef<VerseCaps> = {\n key: VERSE_CAPS_KEY,\n fetch: (signal) => apiGet<VerseCaps>('/api/verse/caps', signal),\n};\n\nexport const verseSafetyQuery: QueryDef<VerseSafetyReport> = {\n key: VERSE_SAFETY_KEY,\n fetch: (signal) => apiGet<VerseSafetyReport>('/api/verse/safety', signal),\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const verseScopeQuery: QueryDef<VerseScope> = {\n key: VERSE_SCOPE_KEY,\n fetch: (signal) => apiGet<VerseScope>('/api/verse/scope', signal),\n};\n\nexport function verseAuditQuery(filters: VerseAuditFilters = {}): QueryDef<VerseAuditPage> {\n const limit = Math.min(filters.limit ?? VERSE_AUDIT_DEFAULT_LIMIT, VERSE_AUDIT_MAX);\n const params = new URLSearchParams();\n params.set('limit', String(limit));\n if (filters.action) params.set('action', filters.action);\n if (filters.result) params.set('result', filters.result);\n return {\n key: `${VERSE_AUDIT_PREFIX}${limit}:${filters.action ?? ''}:${filters.result ?? ''}`,\n fetch: (signal) => apiGet<VerseAuditPage>(`/api/verse/audit?${params.toString()}`, signal),\n };\n}\n\n/**\n * Read-only in V2 — the contract is explicit that no goal-mutation routes get\n * built here. `/api/goals` returns a bare array; `/api/backlog` returns\n * `loadBacklog() ?? null`, i.e. `null` is \"no backlog on disk\", not an error.\n */\nexport const verseGoalsQuery: QueryDef<GoalSummary[]> = {\n key: 'goals',\n fetch: (signal) => apiGet<GoalSummary[]>('/api/goals', signal),\n};\n\n/** One backlog row, narrowed to what the read-only summary renders. */\nexport interface VerseBacklogItem {\n id?: string;\n title?: string;\n repo?: string;\n score?: number;\n source?: string;\n}\n\nexport interface VerseBacklogSummary {\n items: VerseBacklogItem[];\n /** True when the server answered `null` — no backlog has been built yet. */\n absent: boolean;\n}\n\nexport function normalizeBacklog(raw: unknown): VerseBacklogSummary {\n if (raw === null || raw === undefined) return { items: [], absent: true };\n if (Array.isArray(raw)) return { items: raw as VerseBacklogItem[], absent: false };\n if (isRecord(raw) && Array.isArray(raw['items'])) {\n return { items: raw['items'] as VerseBacklogItem[], absent: false };\n }\n return { items: [], absent: true };\n}\n\nexport const verseBacklogQuery: QueryDef<VerseBacklogSummary> = {\n key: 'backlog',\n fetch: (signal) => apiGet<unknown>('/api/backlog', signal).then(normalizeBacklog),\n};\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\n/** Thrown before any network call when no mutation token is held. */\nexport class VerseControlLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token before changing the loop.');\n this.name = 'VerseControlLockedError';\n }\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/** Every panel in the cockpit reads through one of these three. */\nexport function invalidateControl(): void {\n invalidate(VERSE_CONTROL_KEY);\n}\n\nexport async function updateVerseCaps(patch: VerseCapsPatch): Promise<VerseCapsApplyResult> {\n const result = await post<VerseCapsApplyResult>('/api/verse/caps', patch);\n invalidate(VERSE_CAPS_KEY);\n invalidateControl();\n return result;\n}\n\nexport async function updateVerseScope(patch: VerseScopePatch): Promise<void> {\n await post<unknown>('/api/verse/scope', patch);\n invalidate(VERSE_SCOPE_KEY);\n invalidateControl();\n}\n\nexport async function runDaemonAction(action: VerseDaemonAction): Promise<VerseDaemonActionResult> {\n const result = await post<VerseDaemonActionResult>('/api/verse/daemon', { action });\n invalidateControl();\n invalidate('daemon');\n return result;\n}\n\n/**\n * ENGAGE the global kill switch (`~/.ashlr/KILL`). This is `POST\n * /api/fleet/pause` under its honest name: it stops the daemon AND refuses\n * the agent's own mcp-native write tools. Never surface it as \"pause\".\n */\nexport async function engageEmergencyStop(): Promise<void> {\n await pauseFleet();\n invalidateControl();\n}\n\n/** Clear the kill switch — writes become possible again fleet-wide. */\nexport async function releaseEmergencyStop(): Promise<void> {\n await resumeFleet();\n invalidateControl();\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{p as e}from"./VerseConsoleApp-Cj6yPJo3.js";import{t}from"./command-catalog-Dnx-iMLX.js";import{t as n}from"./clipboard-DkZdqlxf.js";async function r(r=t){let i=await n(r),a=r===`ashlr authority setup`?`add --dry-run to see every step first.`:`then rerun \`${t}\`.`;return e(i?`Copied \`${r}\`. Run it in a terminal; ${a}`:`Could not reach the clipboard. Run \`${r}\` in a terminal.`,i?`success`:`neutral`),i}export{r as copyAutonomySetupCommand};
|
|
2
|
-
//# sourceMappingURL=copy-setup-C2goNcTZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"copy-setup-C2goNcTZ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/copy-setup.ts"],"sourcesContent":["/**\n * routes/verse/shell/copy-setup.ts — ⌘K \"Copy autonomy setup command\" and\n * onboarding's Copy button: put `ashlr authority setup` (or the setup\n * checklist's next command) on the clipboard and say what to do with it.\n *\n * Split from run-command.ts for the same reason guarded-runners.ts is:\n * run-command is on the chat first-paint path (the shell's key handler runs\n * through it), and nothing here is needed until someone asks to copy — so\n * run-command loads this module with import() when the command runs.\n */\nimport { copyText } from '../../../components/primitives/clipboard.js';\nimport { AUTONOMY_SETUP_COMMAND } from './command-catalog.js';\nimport { shellNotify } from './run-command.js';\n\n/** Copy the setup command (or the checklist's next one) and toast the outcome; resolves to whether it was copied. */\nexport async function copyAutonomySetupCommand(command: string = AUTONOMY_SETUP_COMMAND): Promise<boolean> {\n const ok = await copyText(command);\n const then = command === AUTONOMY_SETUP_COMMAND\n ? 'add --dry-run to see every step first.'\n : `then rerun \\`${AUTONOMY_SETUP_COMMAND}\\`.`;\n shellNotify(\n ok\n ? `Copied \\`${command}\\`. Run it in a terminal; ${then}`\n : `Could not reach the clipboard. Run \\`${command}\\` in a terminal.`,\n ok ? 'success' : 'neutral',\n );\n return ok;\n}\n"],"mappings":"2IAeA,eAAsB,EAAyB,EAAkB,EAA0C,CACzG,IAAM,EAAK,MAAM,EAAS,CAAO,EAC3B,EAAO,IAAA,wBACT,yCACA,gBAAgB,EAAuB,KAO3C,OANA,EACE,EACI,YAAY,EAAQ,4BAA4B,IAChD,wCAAwC,EAAQ,mBACpD,EAAK,UAAY,SACnB,EACO,CACT"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-hePW80VL.js";import{ht as t}from"./VerseConsoleApp-Cj6yPJo3.js";var n=e({TERMINAL_BLOCK_ID_RE:()=>a,TERMINAL_TAB_ID_RE:()=>i,consumeDeepLink:()=>d,deepLinkUrl:()=>f,hasDeepLink:()=>u,parseDeepLink:()=>l,parseTerminalLink:()=>c}),r=/^[A-Za-z0-9._-]{1,128}$/,i=/^t-[a-z0-9]{1,32}$/,a=/^b-\d{1,9}$/,o=[`chat`,`pane`,`terminal`,`block`],s=/^verse:\/\/terminal\/(t-[a-z0-9]{1,32})(?:\/(b-\d{1,9}))?\/?$/;function c(e){if(typeof e!=`string`)return null;let t=s.exec(e.trim());return t?{tabId:t[1],blockId:t[2]??null}:null}function l(e){let n;try{n=new URLSearchParams(e)}catch{return null}let o=n.get(`chat`),s=o!==null&&r.test(o)?o:null,c=t(n.get(`pane`)),l=n.get(`terminal`);if(l!==null&&i.test(l)){let e=n.get(`block`);return{sessionId:s,paneId:c,terminal:{tabId:l,blockId:e!==null&&a.test(e)?e:null}}}return s===null&&c===null?null:{sessionId:s,paneId:c}}function u(e){return/[?&](?:chat|pane|terminal)=/.test(e)}function d(e=window){let t=l(e.location.search);if(!u(e.location.search))return t;try{let t=new URL(e.location.href);for(let e of o)t.searchParams.delete(e);e.history.replaceState(e.history.state,``,`${t.pathname}${t.search}${t.hash}`)}catch{}return t}function f(e,n=typeof window>`u`?`http://127.0.0.1:7777/verse/`:window.location.href){let s=new URL(n);for(let e of o)s.searchParams.delete(e);s.hash=``,e.sessionId&&r.test(e.sessionId)&&s.searchParams.set(`chat`,e.sessionId);let c=t(e.paneId??null);return c&&s.searchParams.set(`pane`,c),e.terminal&&i.test(e.terminal.tabId)&&(s.searchParams.set(`terminal`,e.terminal.tabId),e.terminal.blockId&&a.test(e.terminal.blockId)&&s.searchParams.set(`block`,e.terminal.blockId)),s.toString()}export{n,c as r,f as t};
|
|
2
|
-
//# sourceMappingURL=deep-link-Dg_zaqAl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deep-link-Dg_zaqAl.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/deep-link.ts"],"sourcesContent":["/**\n * routes/verse/shell/deep-link.ts — links INTO the workbench: a chat, and\n * optionally a pane in its panel area — or a terminal tab.\n *\n * /verse/?chat=<sessionId> open that chat\n * /verse/?chat=<sessionId>&pane=terminal …with its Terminal showing\n * /verse/?pane=reasoning the Chat surface, Reasoning open\n * /verse/?terminal=<tabId>[&block=<id>] a terminal tab, in its chat, with\n * that command block shown (3.15)\n *\n * The desktop app sends the same thing as a command (`open-pane:<paneId>` or\n * `open-pane:<paneId>@<sessionId>`, `open-terminal:<tabId>[/<blockId>]` —\n * command-keys.ts parseDesktopCommand) — a notification can land on the diff\n * or the command it is about. In chat text a terminal tab is written\n * `verse://terminal/<tabId>[/<blockId>]` (parseTerminalLink below).\n *\n * A link is consumed ONCE: read on load, then stripped from the address bar\n * (history.replaceState) so a reload does not re-open it over whatever the\n * operator did since. Anything malformed is ignored, never guessed.\n *\n * Loaded on demand by the shell (only when the URL carries a link), never\n * on the first-paint path.\n */\nimport { normalizePaneId } from './dock-catalog.js';\n\n/** A terminal tab, and optionally one of its command blocks. */\nexport interface TerminalLink {\n tabId: string;\n blockId: string | null;\n}\n\nexport interface VerseDeepLink {\n sessionId: string | null;\n paneId: string | null;\n /** Present only when the link names a terminal tab (`?terminal=`). */\n terminal?: TerminalLink;\n}\n\n/** The same shape `open-session:<id>` accepts. */\nconst SESSION_ID_RE = /^[A-Za-z0-9._-]{1,128}$/;\n/** The server's terminal tab and block ids (workbench-types VERSE_TERMINAL_AGENT_STATE_PATH_RE; blocks are `b-<n>`). */\nexport const TERMINAL_TAB_ID_RE = /^t-[a-z0-9]{1,32}$/;\nexport const TERMINAL_BLOCK_ID_RE = /^b-\\d{1,9}$/;\nconst PARAMS = ['chat', 'pane', 'terminal', 'block'] as const;\n\n/** `verse://terminal/<tabId>` or `verse://terminal/<tabId>/<blockId>` (a trailing slash is tolerated). */\nconst TERMINAL_LINK_RE = /^verse:\\/\\/terminal\\/(t-[a-z0-9]{1,32})(?:\\/(b-\\d{1,9}))?\\/?$/;\n\n/** Read a `verse://terminal/…` link; null for anything else (never guessed). */\nexport function parseTerminalLink(href: string): TerminalLink | null {\n if (typeof href !== 'string') return null;\n const match = TERMINAL_LINK_RE.exec(href.trim());\n return match ? { tabId: match[1]!, blockId: match[2] ?? null } : null;\n}\n\n/** The `verse://terminal/<tab>[/<block>]` link of a tab (a block id that is not one is left off). */\nexport function terminalLinkUrl(tabId: string, blockId?: string | null): string {\n if (!TERMINAL_TAB_ID_RE.test(tabId)) throw new RangeError('not a terminal tab id');\n const block = blockId && TERMINAL_BLOCK_ID_RE.test(blockId) ? `/${blockId}` : '';\n return `verse://terminal/${tabId}${block}`;\n}\n\n/** Read a link from a query string (`?chat=…&pane=…`, `?terminal=…&block=…`); null when it names nothing valid. */\nexport function parseDeepLink(search: string): VerseDeepLink | null {\n let params: URLSearchParams;\n try {\n params = new URLSearchParams(search);\n } catch {\n return null;\n }\n const chat = params.get('chat');\n const sessionId = chat !== null && SESSION_ID_RE.test(chat) ? chat : null;\n const paneId = normalizePaneId(params.get('pane'));\n const tab = params.get('terminal');\n if (tab !== null && TERMINAL_TAB_ID_RE.test(tab)) {\n const block = params.get('block');\n return { sessionId, paneId, terminal: { tabId: tab, blockId: block !== null && TERMINAL_BLOCK_ID_RE.test(block) ? block : null } };\n }\n return sessionId === null && paneId === null ? null : { sessionId, paneId };\n}\n\n/** Does this query string carry a link at all? (The shell's cheap check before loading this module.) */\nexport function hasDeepLink(search: string): boolean {\n return /[?&](?:chat|pane|terminal)=/.test(search);\n}\n\n/**\n * Take the link out of the current URL: parse it, then remove its params\n * (keeping every other param and the hash). Null when there is none.\n */\nexport function consumeDeepLink(win: Pick<Window, 'location' | 'history'> = window): VerseDeepLink | null {\n const link = parseDeepLink(win.location.search);\n if (!hasDeepLink(win.location.search)) return link;\n try {\n const url = new URL(win.location.href);\n for (const name of PARAMS) url.searchParams.delete(name);\n win.history.replaceState(win.history.state, '', `${url.pathname}${url.search}${url.hash}`);\n } catch {\n /* an opaque origin (tests, file://): the link still opens */\n }\n return link;\n}\n\n/** The shareable URL of a chat (and optionally a pane), on this page's origin and path. */\nexport function deepLinkUrl(link: Partial<VerseDeepLink>, base: string = typeof window === 'undefined' ? 'http://127.0.0.1:7777/verse/' : window.location.href): string {\n const url = new URL(base);\n for (const name of PARAMS) url.searchParams.delete(name);\n url.hash = '';\n if (link.sessionId && SESSION_ID_RE.test(link.sessionId)) url.searchParams.set('chat', link.sessionId);\n const pane = normalizePaneId(link.paneId ?? null);\n if (pane) url.searchParams.set('pane', pane);\n if (link.terminal && TERMINAL_TAB_ID_RE.test(link.terminal.tabId)) {\n url.searchParams.set('terminal', link.terminal.tabId);\n if (link.terminal.blockId && TERMINAL_BLOCK_ID_RE.test(link.terminal.blockId)) url.searchParams.set('block', link.terminal.blockId);\n }\n return url.toString();\n}\n"],"mappings":"2QAuCM,EAAgB,0BAET,EAAqB,qBACrB,EAAuB,cAC9B,EAAS,CAAC,OAAQ,OAAQ,WAAY,OAAO,EAG7C,EAAmB,gEAGzB,SAAgB,EAAkB,EAAmC,CACnE,GAAI,OAAO,GAAS,SAAU,OAAO,KACrC,IAAM,EAAQ,EAAiB,KAAK,EAAK,KAAK,CAAC,EAC/C,OAAO,EAAQ,CAAE,MAAO,EAAM,GAAK,QAAS,EAAM,IAAM,IAAK,EAAI,IACnE,CAUA,SAAgB,EAAc,EAAsC,CAClE,IAAI,EACJ,GAAI,CACF,EAAS,IAAI,gBAAgB,CAAM,CACrC,MAAQ,CACN,OAAO,IACT,CACA,IAAM,EAAO,EAAO,IAAI,MAAM,EACxB,EAAY,IAAS,MAAQ,EAAc,KAAK,CAAI,EAAI,EAAO,KAC/D,EAAS,EAAgB,EAAO,IAAI,MAAM,CAAC,EAC3C,EAAM,EAAO,IAAI,UAAU,EACjC,GAAI,IAAQ,MAAQ,EAAmB,KAAK,CAAG,EAAG,CAChD,IAAM,EAAQ,EAAO,IAAI,OAAO,EAChC,MAAO,CAAE,YAAW,SAAQ,SAAU,CAAE,MAAO,EAAK,QAAS,IAAU,MAAQ,EAAqB,KAAK,CAAK,EAAI,EAAQ,IAAK,CAAE,CACnI,CACA,OAAO,IAAc,MAAQ,IAAW,KAAO,KAAO,CAAE,YAAW,QAAO,CAC5E,CAGA,SAAgB,EAAY,EAAyB,CACnD,MAAO,8BAA8B,KAAK,CAAM,CAClD,CAMA,SAAgB,EAAgB,EAA4C,OAA8B,CACxG,IAAM,EAAO,EAAc,EAAI,SAAS,MAAM,EAC9C,GAAI,CAAC,EAAY,EAAI,SAAS,MAAM,EAAG,OAAO,EAC9C,GAAI,CACF,IAAM,EAAM,IAAI,IAAI,EAAI,SAAS,IAAI,EACrC,IAAK,IAAM,KAAQ,EAAQ,EAAI,aAAa,OAAO,CAAI,EACvD,EAAI,QAAQ,aAAa,EAAI,QAAQ,MAAO,GAAI,GAAG,EAAI,WAAW,EAAI,SAAS,EAAI,MAAM,CAC3F,MAAQ,CAER,CACA,OAAO,CACT,CAGA,SAAgB,EAAY,EAA8B,EAAe,OAAO,OAAW,IAAc,+BAAiC,OAAO,SAAS,KAAc,CACtK,IAAM,EAAM,IAAI,IAAI,CAAI,EACxB,IAAK,IAAM,KAAQ,EAAQ,EAAI,aAAa,OAAO,CAAI,EACvD,EAAI,KAAO,GACP,EAAK,WAAa,EAAc,KAAK,EAAK,SAAS,GAAG,EAAI,aAAa,IAAI,OAAQ,EAAK,SAAS,EACrG,IAAM,EAAO,EAAgB,EAAK,QAAU,IAAI,EAMhD,OALI,GAAM,EAAI,aAAa,IAAI,OAAQ,CAAI,EACvC,EAAK,UAAY,EAAmB,KAAK,EAAK,SAAS,KAAK,IAC9D,EAAI,aAAa,IAAI,WAAY,EAAK,SAAS,KAAK,EAChD,EAAK,SAAS,SAAW,EAAqB,KAAK,EAAK,SAAS,OAAO,GAAG,EAAI,aAAa,IAAI,QAAS,EAAK,SAAS,OAAO,GAE7H,EAAI,SAAS,CACtB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-DOAOxiKl.js";import{c as n,s as r}from"./global-BJ_kVFpD.js";import"./VerseMobileApp-BRayqF_2.js";var i=e(t(),1);function a(e){let{authenticated:t,dispatchEnabled:n,holdsMutation:r,scopes:i}=e,a=t&&(i?.read??!0),o={read:a,source:i?`device`:`session`,deviceLabel:i?.label??null};return a?i?.gatewayWritesEnabled===!1?{...o,act:`unavailable`,actReason:`The phone gateway is read-only. Actions are available on your Mac.`}:i&&!i.act?{...o,act:`unavailable`,actReason:`This device was paired read-only. Pair it again with act permission to approve or start work.`}:n===null?{...o,act:`unavailable`,actReason:`Checking whether this Mac allows actions. Wait for it to answer.`}:n===!1?{...o,act:`unavailable`,actReason:"Your Mac started Verse without dispatch, so nothing can be changed from here. Run `ashlr verse` on the Mac to act."}:r?{...o,act:`unlocked`,actReason:null}:{...o,act:`locked`,actReason:"Actions ask for the mutation token `ashlr verse` printed. It stays in memory for 20 idle minutes, never on disk."}:{...o,act:`unavailable`,actReason:`This device is not signed in to your Mac.`}}var o=null,s=new Set;function c(e){o=e;for(let e of[...s])e()}function l(e){return s.add(e),()=>s.delete(e)}function u(){return o}function d(e){let t=r(),o=n(),s=(0,i.useSyncExternalStore)(l,u,u);return a({authenticated:t===`authenticated`,dispatchEnabled:e,holdsMutation:o.hasHold,scopes:s})}async function f(e){return!0}export{f as n,d as r,c as t};
|
|
2
|
-
//# sourceMappingURL=device-permissions-CEXY0Vor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"device-permissions-CEXY0Vor.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/device-permissions.ts"],"sourcesContent":["/**\n * routes/verse/mobile/device-permissions.ts — what THIS device may do, said\n * out loud, and the two seams the remote transport plugs into.\n *\n * The phone app uses exactly the web UI's token model (data/auth-store.ts):\n *\n * READ — the HttpOnly read-session cookie (15 min, silently renewed from\n * the in-memory read token). Every screen needs it.\n * ACT — the raw mutation token, memory-only, in a 20-minute idle hold,\n * sent as `x-ashlr-token` on every POST. Never stored.\n *\n * So \"can this phone act?\" has three answers:\n *\n * 'unavailable' — the server was started without dispatch, or the device's\n * scopes say read-only. Action controls are HIDDEN: showing\n * a button that can only fail is a lie about the device.\n * 'locked' — acting is possible but the token is not held. Controls\n * show; the first one asks for the token (after its\n * confirmation, never before — guard-store.ts).\n * 'unlocked' — the hold is live.\n *\n * TRANSPORT SEAMS (the relay / tunnel / pairing work lands separately):\n *\n * - registerDeviceScopes({ read, act, label }) — a paired device's token\n * scopes. A read-only pairing must make `act` 'unavailable' even on a\n * dispatch-enabled server. Absent (today), scopes come from the session.\n * - registerStepUpProvider(fn) — called before any irreversible or\n * autonomy-widening action (Land, Veto, Start fleet, Stop fleet, Delete).\n * Resolve false to refuse. Absent (today), the held mutation token IS the\n * step-up, exactly as on the desktop.\n *\n * Neither seam can widen anything: scopes only ever REMOVE `act`, and a\n * step-up provider only ever adds a refusal before the unchanged\n * confirm → token → POST path.\n */\nimport { useSyncExternalStore } from 'react';\nimport { useAuthPhase, useMutationHold } from '../../../data/hooks.js';\n\nexport type ActPermission = 'unlocked' | 'locked' | 'unavailable';\n\nexport interface DeviceScopes {\n read: boolean;\n act: boolean;\n /** How the transport names this device (\"Mason's iPhone\"), shown on More. */\n label?: string;\n /** An act grant does not imply the remote gateway has mounted writes. */\n gatewayWritesEnabled?: boolean;\n}\n\nexport interface DevicePermissions {\n read: boolean;\n act: ActPermission;\n /** Why acting is unavailable or locked, in operator language; null when unlocked. */\n actReason: string | null;\n /** Where the answer came from: this browser session, or a paired device's scopes. */\n source: 'session' | 'device';\n deviceLabel: string | null;\n}\n\nexport interface PermissionInput {\n authenticated: boolean;\n /** Bootstrap's `dispatchEnabled`; null while it has not answered. */\n dispatchEnabled: boolean | null;\n holdsMutation: boolean;\n scopes: DeviceScopes | null;\n}\n\nexport function resolveDevicePermissions(input: PermissionInput): DevicePermissions {\n const { authenticated, dispatchEnabled, holdsMutation, scopes } = input;\n const read = authenticated && (scopes?.read ?? true);\n const base = { read, source: scopes ? ('device' as const) : ('session' as const), deviceLabel: scopes?.label ?? null };\n if (!read) return { ...base, act: 'unavailable', actReason: 'This device is not signed in to your Mac.' };\n if (scopes?.gatewayWritesEnabled === false) return { ...base, act: 'unavailable', actReason: 'The phone gateway is read-only. Actions are available on your Mac.' };\n if (scopes && !scopes.act) return { ...base, act: 'unavailable', actReason: 'This device was paired read-only. Pair it again with act permission to approve or start work.' };\n if (dispatchEnabled === null) return { ...base, act: 'unavailable', actReason: 'Checking whether this Mac allows actions. Wait for it to answer.' };\n if (dispatchEnabled === false) return { ...base, act: 'unavailable', actReason: 'Your Mac started Verse without dispatch, so nothing can be changed from here. Run `ashlr verse` on the Mac to act.' };\n if (!holdsMutation) return { ...base, act: 'locked', actReason: 'Actions ask for the mutation token `ashlr verse` printed. It stays in memory for 20 idle minutes, never on disk.' };\n return { ...base, act: 'unlocked', actReason: null };\n}\n\nexport { canShowActions } from './mobile-context.js';\n\n// ---------------------------------------------------------------------------\n// Device scopes (transport seam)\n// ---------------------------------------------------------------------------\n\nlet scopes: DeviceScopes | null = null;\nconst scopeListeners = new Set<() => void>();\n\nexport function registerDeviceScopes(next: DeviceScopes | null): void {\n scopes = next;\n for (const l of [...scopeListeners]) l();\n}\n\nfunction subscribeScopes(listener: () => void): () => void {\n scopeListeners.add(listener);\n return () => scopeListeners.delete(listener);\n}\n\nfunction getScopes(): DeviceScopes | null {\n return scopes;\n}\n\nexport function useDevicePermissions(dispatchEnabled: boolean | null): DevicePermissions {\n const phase = useAuthPhase();\n const hold = useMutationHold();\n const current = useSyncExternalStore(subscribeScopes, getScopes, getScopes);\n return resolveDevicePermissions({ authenticated: phase === 'authenticated', dispatchEnabled, holdsMutation: hold.hasHold, scopes: current });\n}\n\n// ---------------------------------------------------------------------------\n// Step-up (transport seam)\n// ---------------------------------------------------------------------------\n\nexport interface StepUpRequest {\n /** The button the operator pressed: \"Land\", \"Stop the fleet\". */\n action: string;\n /** Cannot be undone from the phone (a merge, a veto, the kill switch). */\n irreversible: boolean;\n}\n\nexport type StepUpProvider = (request: StepUpRequest) => Promise<boolean>;\n\nlet stepUp: StepUpProvider | null = null;\n\nexport function registerStepUpProvider(provider: StepUpProvider | null): void {\n stepUp = provider;\n}\n\n/**\n * Ask the registered provider; true = proceed. With none registered the\n * answer is true: the mutation token (asked for next, if not held) is the\n * step-up this build has. A provider that throws refuses.\n */\nexport async function requestStepUp(request: StepUpRequest): Promise<boolean> {\n if (!stepUp || !request.irreversible) return true;\n try {\n return (await stepUp(request)) === true;\n } catch {\n return false;\n }\n}\n"],"mappings":"+LAmEA,SAAgB,EAAyB,EAA2C,CAClF,GAAM,CAAE,gBAAe,kBAAiB,gBAAe,UAAW,EAC5D,EAAO,IAAkB,GAAQ,MAAQ,IACzC,EAAO,CAAE,OAAM,OAAQ,EAAU,SAAsB,UAAqB,YAAa,GAAQ,OAAS,IAAK,EAOrH,OANK,EACD,GAAQ,uBAAyB,GAAc,CAAE,GAAG,EAAM,IAAK,cAAe,UAAW,oEAAqE,EAC9J,GAAU,CAAC,EAAO,IAAY,CAAE,GAAG,EAAM,IAAK,cAAe,UAAW,+FAAgG,EACxK,IAAoB,KAAa,CAAE,GAAG,EAAM,IAAK,cAAe,UAAW,kEAAmE,EAC9I,IAAoB,GAAc,CAAE,GAAG,EAAM,IAAK,cAAe,UAAW,oHAAqH,EAChM,EACE,CAAE,GAAG,EAAM,IAAK,WAAY,UAAW,IAAK,EADxB,CAAE,GAAG,EAAM,IAAK,SAAU,UAAW,kHAAmH,EALjK,CAAE,GAAG,EAAM,IAAK,cAAe,UAAW,2CAA4C,CAO1G,CAQA,IAAI,EAA8B,KAC5B,EAAiB,IAAI,IAE3B,SAAgB,EAAqB,EAAiC,CACpE,EAAS,EACT,IAAK,IAAM,IAAK,CAAC,GAAG,CAAc,EAAG,EAAE,CACzC,CAEA,SAAS,EAAgB,EAAkC,CAEzD,OADA,EAAe,IAAI,CAAQ,MACd,EAAe,OAAO,CAAQ,CAC7C,CAEA,SAAS,GAAiC,CACxC,OAAO,CACT,CAEA,SAAgB,EAAqB,EAAoD,CACvF,IAAM,EAAQ,EAAa,EACrB,EAAO,EAAgB,EACvB,GAAA,EAAU,EAAA,qBAAA,CAAqB,EAAiB,EAAW,CAAS,EAC1E,OAAO,EAAyB,CAAE,cAAe,IAAU,gBAAiB,kBAAiB,cAAe,EAAK,QAAS,OAAQ,CAAQ,CAAC,CAC7I,CA0BA,eAAsB,EAAc,EAA0C,CACtC,MAAO,EAM/C"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{C as e,M as t,V as n,a as r,i,t as a}from"./global-BJ_kVFpD.js";import{O as o}from"./VerseShared-CH8mV5ew.js";import{a as s,i as c,n as l,o as u,r as d,t as f}from"./types-BGCo0sbt.js";function p(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var m=e=>p(e)&&typeof e.ready==`boolean`&&typeof e.tone==`string`&&typeof e.word==`string`&&typeof e.detail==`string`;function h(e){if(!p(e))return null;let{status:t,budget:n,tasks:r}=e;if(!p(t)||typeof t.enabled!=`boolean`||typeof t.connected!=`boolean`||typeof t.state!=`string`||!m(t.chat)||!m(t.fleet)||!p(n)||!p(n.canLaunch)||!p(n.budget))return null;for(let e of[`acuBudgetTotal`,`acuUsed`,`acuRemaining`,`acuToday`,`acuInFlight`,`estimatedUsdUsed`,`sessionsToday`,`running`])if(typeof n[e]!=`number`||!Number.isFinite(n[e]))return null;return!Array.isArray(r)||!r.every(e=>p(e)&&typeof e.id==`string`&&typeof e.state==`string`)?null:e}function g(e){if(!p(e))return null;let t=Array.isArray(e.freeFamilies)?e.freeFamilies.filter(e=>typeof e==`string`&&e.length>0&&e.length<=120):null,n=e.paidFamilyCount,r=e.defaultModel;if(t===null||typeof n!=`number`||!Number.isInteger(n)||n<0||!p(r)||typeof r.label!=`string`)return null;let i=`Models: ${[t.length>0?t.map(e=>`${e} (free)`).join(`, `):null,n>0?`${n} paid famil${n===1?`y`:`ies`}`:null].filter(Boolean).join(` + `)||`none listed`}`,a=r.free===!0?`Free`:typeof r.price==`string`&&r.price?r.price:null;return{catalog:i,defaultLine:`Default: ${r.label}${a?` (${a})`:``}`,stale:e.source===`fallback`}}function _(e){let t=Math.max(0,Math.round(e*100)/100);return`${t} ACU${t===1?``:`s`}`}function v(e,t){if(typeof e!=`string`||e.length>2048)return null;try{let n=new URL(e);return n.protocol===`https:`&&n.hostname===t?n.toString():null}catch{return null}}var y=d;function b(e){return e.paused||e.acuRemaining<=0||e.acuBudgetTotal<=0?`limit`:e.acuRemaining/e.acuBudgetTotal*100<20?`tight`:`ok`}function x(e){switch(e.state){case`ready`:return{word:`Connected`,tone:`success`};case`unreachable`:return{word:`Key refused`,tone:`danger`};case`not-connected`:return{word:`Not connected`,tone:`warning`};default:return{word:e.connected?`Turned off`:`Not set up`,tone:`neutral`}}}function S(e){return{id:`devin`,label:`Devin`,engine:`devin`,kind:`cloud`,reading:{state:`live`,at:null,note:null},chat:e.chat,fleet:e.fleet}}function C(e){return e.filter(e=>e.state===`blocked`&&e.sessionId!==null).slice(0,5)}var w=new Intl.NumberFormat(`en-US`);function T(e){if(!e.overview)return e.overviewReason??`The Devin lane did not answer.`;let{status:t,budget:n}=e.overview;return t.connected?t.enabled?t.state===`unreachable`?t.reason:e.repo?n.canLaunch.ok?e.prompt.trim()?e.prompt.trim().length>2e4?`The message is over ${w.format(f)} characters — trim it to run it in Devin.`:null:`Type the task in the message box first.`:n.canLaunch.reason??`The Devin budget does not allow another session right now.`:e.rootsLoading?`Reading this chat's project…`:`This chat's project has no GitHub origin, so Devin has nothing to work on.`:"The Devin lane is turned off (`ashlr devin enable`).":"Devin is not connected. Run `ashlr devin connect` in a terminal."}var E=`verse-devin`,D=6e4,O=`The Devin lane is not in this build yet.`,k=class extends Error{constructor(){super(`Unlock actions with the mutation token first.`),this.name=`DevinLockedError`}},A=class extends Error{failure;constructor(e,t){super(e),this.failure=t,this.name=`DevinLaunchRefusedError`}};function j(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function M(e){return e instanceof a?e.status===404?O:e.status===503?`The Devin lane failed to load on the server.`:`The Devin lane answered HTTP ${e.status}.`:`The Devin lane could not be reached.`}var N={key:E,fetch:async e=>{try{let t=h(await i(s,e));return t===null?{value:null,available:!0,reason:`Unrecognized response — update Ashlr.`}:{value:t,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:M(e)}}}};async function P(n,i){let a=e();if(!a)throw new k;let o=await r(n,i,a);return t(),o}function F(){n(E),o()}async function I(e){try{let t=await P(c,e);if(!j(t)||t.ok!==!0||!j(t.task))throw new A(j(t)&&typeof t.error==`string`&&t.error?t.error:`The Devin session was not started, and the server sent no reason.`,j(t)&&typeof t.failure==`string`?t.failure:null);return t}finally{F()}}async function L(e,t){if(!l.test(e))throw Error(`That is not a Devin task id.`);try{return await P(`${u}/${e}/message`,{message:t})}finally{F()}}export{y as a,g as c,T as d,v as f,L as i,S as l,N as n,b as o,C as p,I as r,x as s,D as t,_ as u};
|
|
2
|
-
//# sourceMappingURL=devin-queries-Cu_YYhw2.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"devin-queries-Cu_YYhw2.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/devin/devin-model.ts","../../../../../../src/web-ui/routes/verse/devin/devin-queries.ts"],"sourcesContent":["/**\n * routes/verse/devin/devin-model.ts — pure view logic for the Devin lane\n * (3.15; server: core/devin/devin-api.ts).\n *\n * The overview is narrowed field by field: a server without the route (404)\n * is \"not in this build\", an unknown shape shows nothing rather than a guess.\n * Browser-safe: type-only imports from core.\n */\nimport {\n DEVIN_PROMPT_MAX_CHARS,\n DEVIN_USAGE_URL,\n type DevinBudgetView,\n type DevinOverviewResponse,\n type DevinStatus,\n type DevinTaskV1,\n} from '../../../../core/devin/types.js';\nimport type { ResourceReadinessRow } from '../../../../core/routing/readiness-types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst isVerdict = (value: unknown): boolean =>\n isRecord(value) && typeof value['ready'] === 'boolean' && typeof value['tone'] === 'string' && typeof value['word'] === 'string' && typeof value['detail'] === 'string';\n\n/** Just enough structure that no render can crash; null when it is not a Devin overview. */\nexport function narrowDevinOverview(raw: unknown): DevinOverviewResponse | null {\n if (!isRecord(raw)) return null;\n const { status, budget, tasks } = raw;\n if (!isRecord(status) || typeof status['enabled'] !== 'boolean' || typeof status['connected'] !== 'boolean' || typeof status['state'] !== 'string') return null;\n if (!isVerdict(status['chat']) || !isVerdict(status['fleet'])) return null;\n if (!isRecord(budget) || !isRecord(budget['canLaunch']) || !isRecord(budget['budget'])) return null;\n for (const key of ['acuBudgetTotal', 'acuUsed', 'acuRemaining', 'acuToday', 'acuInFlight', 'estimatedUsdUsed', 'sessionsToday', 'running']) {\n if (typeof budget[key] !== 'number' || !Number.isFinite(budget[key])) return null;\n }\n if (!Array.isArray(tasks) || !tasks.every((t) => isRecord(t) && typeof t['id'] === 'string' && typeof t['state'] === 'string')) return null;\n return raw as unknown as DevinOverviewResponse;\n}\n\n/**\n * 3.15: the Devin CLI's model catalog in one line for the Resources card —\n * \"Models: SWE-2 (free) + 51 paid families\" and \"Default: SWE-2 High (Free)\".\n * Null when the server sent no (or a malformed) summary. Pure.\n */\nexport function devinModelsLines(models: unknown): { catalog: string; defaultLine: string; stale: boolean } | null {\n if (!isRecord(models)) return null;\n const free = Array.isArray(models['freeFamilies']) ? models['freeFamilies'].filter((f): f is string => typeof f === 'string' && f.length > 0 && f.length <= 120) : null;\n const paid = models['paidFamilyCount'];\n const def = models['defaultModel'];\n if (free === null || typeof paid !== 'number' || !Number.isInteger(paid) || paid < 0 || !isRecord(def) || typeof def['label'] !== 'string') return null;\n const freePart = free.length > 0 ? free.map((f) => `${f} (free)`).join(', ') : null;\n const paidPart = paid > 0 ? `${paid} paid famil${paid === 1 ? 'y' : 'ies'}` : null;\n const catalog = `Models: ${[freePart, paidPart].filter(Boolean).join(' + ') || 'none listed'}`;\n const price = def['free'] === true ? 'Free' : typeof def['price'] === 'string' && def['price'] ? def['price'] : null;\n const defaultLine = `Default: ${def['label']}${price ? ` (${price})` : ''}`;\n return { catalog, defaultLine, stale: models['source'] === 'fallback' };\n}\n\n/** \"12 ACUs\", \"1 ACU\", \"2.5 ACUs\". */\nexport function formatAcu(value: number): string {\n const v = Math.max(0, Math.round(value * 100) / 100);\n return `${v} ACU${v === 1 ? '' : 's'}`;\n}\n\n/** https only, on the expected host — a link the page may open. */\nexport function safeDevinHref(url: string | null | undefined, host: 'app.devin.ai' | 'github.com'): string | null {\n if (typeof url !== 'string' || url.length > 2_048) return null;\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'https:' && parsed.hostname === host ? parsed.toString() : null;\n } catch {\n return null;\n }\n}\n\nexport const DEVIN_USAGE_LINK = DEVIN_USAGE_URL;\n\n/** ok / tight / limit for the meter, from what is left. */\nexport function acuLevel(budget: Pick<DevinBudgetView, 'acuBudgetTotal' | 'acuRemaining' | 'paused'>): 'ok' | 'tight' | 'limit' {\n if (budget.paused || budget.acuRemaining <= 0 || budget.acuBudgetTotal <= 0) return 'limit';\n return (budget.acuRemaining / budget.acuBudgetTotal) * 100 < 20 ? 'tight' : 'ok';\n}\n\n/** The card's headline state. */\nexport function devinHeadline(status: Pick<DevinStatus, 'state' | 'enabled' | 'connected'>): { word: string; tone: 'success' | 'warning' | 'danger' | 'neutral' } {\n switch (status.state) {\n case 'ready': return { word: 'Connected', tone: 'success' };\n case 'unreachable': return { word: 'Key refused', tone: 'danger' };\n case 'not-connected': return { word: 'Not connected', tone: 'warning' };\n default: return { word: status.connected ? 'Turned off' : 'Not set up', tone: 'neutral' };\n }\n}\n\n/**\n * The drawer's readiness row for Devin, built from the server's own verdicts\n * (core/devin/service.ts devinStatus) so ReadinessLines lays it out exactly\n * like every other resource. `engine` is not shown by the lines; `kind`\n * 'cloud' keeps the reading caveat hidden (Devin has no usage window).\n */\nexport function devinReadinessRow(status: Pick<DevinStatus, 'chat' | 'fleet'>): ResourceReadinessRow {\n return {\n id: 'devin',\n label: 'Devin',\n engine: 'devin',\n kind: 'cloud',\n reading: { state: 'live', at: null, note: null },\n chat: status.chat,\n fleet: status.fleet,\n };\n}\n\n/** Sessions waiting for Mason (a reply box on the card). */\nexport function waitingTasks(tasks: readonly DevinTaskV1[]): DevinTaskV1[] {\n return tasks.filter((task) => task.state === 'blocked' && task.sessionId !== null).slice(0, 5);\n}\n\nexport interface RunInDevinInputs {\n overview: DevinOverviewResponse | null;\n overviewReason: string | null;\n repo: string | null;\n rootsLoading: boolean;\n prompt: string;\n}\n\nconst COUNT = new Intl.NumberFormat('en-US');\n\n/** Null when \"Run in Devin\" may be pressed; otherwise the sentence saying why not. */\nexport function runInDevinBlock(inputs: RunInDevinInputs): string | null {\n if (!inputs.overview) return inputs.overviewReason ?? 'The Devin lane did not answer.';\n const { status, budget } = inputs.overview;\n if (!status.connected) return 'Devin is not connected. Run `ashlr devin connect` in a terminal.';\n if (!status.enabled) return 'The Devin lane is turned off (`ashlr devin enable`).';\n if (status.state === 'unreachable') return status.reason;\n if (!inputs.repo) {\n return inputs.rootsLoading ? \"Reading this chat's project…\" : \"This chat's project has no GitHub origin, so Devin has nothing to work on.\";\n }\n if (!budget.canLaunch.ok) return budget.canLaunch.reason ?? 'The Devin budget does not allow another session right now.';\n if (!inputs.prompt.trim()) return 'Type the task in the message box first.';\n if (inputs.prompt.trim().length > DEVIN_PROMPT_MAX_CHARS) {\n return `The message is over ${COUNT.format(DEVIN_PROMPT_MAX_CHARS)} characters — trim it to run it in Devin.`;\n }\n return null;\n}\n","/**\n * routes/verse/devin/devin-queries.ts — the read and writes behind the Devin\n * lane's UI (3.15; server: core/devin/devin-api.ts).\n *\n * GET /api/verse/devin DevinOverviewResponse\n * POST /api/verse/devin/launch DevinLaunchRequest → DevinLaunchResponse\n * POST /api/verse/devin/tasks/<id>/message { message } (reply to a waiting session)\n *\n * The read is OPTIONAL: a server without the lane answers 404 — \"not in this\n * build\", a designed state. 401 and aborts propagate. There is no write that\n * carries an API key: the key is entered only in a terminal.\n *\n * LAZY ONLY: everything importing this file sits behind an import().\n */\nimport {\n DEVIN_TASK_ID_PATTERN,\n VERSE_DEVIN_LAUNCH_PATH,\n VERSE_DEVIN_PATH,\n VERSE_DEVIN_TASKS_PATH,\n type DevinFailureCode,\n type DevinLaunchRequest,\n type DevinLaunchResponse,\n type DevinOverviewResponse,\n} from '../../../../core/devin/types.js';\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 { refreshActivity } from '../shell/useActivity.js';\nimport type { OptionalRead } from '../command/surface-data.js';\nimport { narrowDevinOverview } from './devin-model.js';\n\nexport const DEVIN_KEY = 'verse-devin';\nexport const DEVIN_POLL_MS = 60_000;\nexport const DEVIN_NOT_IN_BUILD = 'The Devin lane is not in this build yet.';\n\nexport class DevinLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token first.');\n this.name = 'DevinLockedError';\n }\n}\n\nexport class DevinLaunchRefusedError extends Error {\n constructor(message: string, public readonly failure: DevinFailureCode | null) {\n super(message);\n this.name = 'DevinLaunchRefusedError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction absence(err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return DEVIN_NOT_IN_BUILD;\n if (err.status === 503) return 'The Devin lane failed to load on the server.';\n return `The Devin lane answered HTTP ${err.status}.`;\n }\n return 'The Devin lane could not be reached.';\n}\n\nexport const devinQuery: QueryDef<OptionalRead<DevinOverviewResponse>> = {\n key: DEVIN_KEY,\n fetch: async (signal) => {\n try {\n const value = narrowDevinOverview(await apiGet<unknown>(VERSE_DEVIN_PATH, signal));\n if (value === null) return { value: null, available: true, reason: 'Unrecognized response — update Ashlr.' };\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(err) };\n }\n },\n};\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new DevinLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nfunction settled(): void {\n invalidate(DEVIN_KEY);\n void refreshActivity();\n}\n\n/** Launch one Devin session; resolves only on `ok: true` with a task. */\nexport async function launchDevinTask(request: DevinLaunchRequest): Promise<DevinLaunchResponse & { task: NonNullable<DevinLaunchResponse['task']> }> {\n try {\n const response = await post<DevinLaunchResponse>(VERSE_DEVIN_LAUNCH_PATH, request);\n if (!isRecord(response) || response.ok !== true || !isRecord(response.task)) {\n const error = isRecord(response) && typeof response.error === 'string' && response.error ? response.error : 'The Devin session was not started, and the server sent no reason.';\n const failure = isRecord(response) && typeof response.failure === 'string' ? (response.failure as DevinFailureCode) : null;\n throw new DevinLaunchRefusedError(error, failure);\n }\n return response as DevinLaunchResponse & { task: NonNullable<DevinLaunchResponse['task']> };\n } finally {\n settled();\n }\n}\n\n/** Reply to a waiting session. The id is re-checked before it is spliced into a path. */\nexport async function messageDevinTask(taskId: string, message: string): Promise<unknown> {\n if (!DEVIN_TASK_ID_PATTERN.test(taskId)) throw new Error('That is not a Devin task id.');\n try {\n return await post<unknown>(`${VERSE_DEVIN_TASKS_PATH}/${taskId}/message`, { message });\n } finally {\n settled();\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./index-DOAOxiKl.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.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M5 2.5v5M2.5 5h5M9 11h4.5`}),(0,t.jsx)(`path`,{d:`M11.5 2.5 4.5 13.5`})]})}function o(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M6.5 4h7M6.5 8h7M6.5 12h7`}),(0,t.jsx)(`path`,{d:`m2.25 4 1 1 1.5-2M2.5 8h1.75M2.5 12h1.75`})]})}function s(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`m8 2 6 3-6 3-6-3 6-3Z`}),(0,t.jsx)(`path`,{d:`m2 8 6 3 6-3M2 11l6 3 6-3`})]})}function c(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`2.25`,y:`2.25`,width:`11.5`,height:`11.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M2.25 8h11.5`})]})}function l(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`m4 4 8 8M12 4l-8 8`})})}function u(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`circle`,{cx:`3.5`,cy:`8`,r:`0.9`,fill:`currentColor`,stroke:`none`}),(0,t.jsx)(`circle`,{cx:`8`,cy:`8`,r:`0.9`,fill:`currentColor`,stroke:`none`}),(0,t.jsx)(`circle`,{cx:`12.5`,cy:`8`,r:`0.9`,fill:`currentColor`,stroke:`none`})]})}function d(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M9.75 2.25 13.75 6.25 11 7.5 8.5 10l.25 2.75-5-5L6.5 8 9 5.25Z`}),(0,t.jsx)(`path`,{d:`m5 11-2.75 2.75`})]})}function f(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`3`,rx:`1`}),(0,t.jsx)(`path`,{d:`M2.75 5.75v6.5a1 1 0 0 0 1 1h8.5a1 1 0 0 0 1-1v-6.5M6.5 8.5h3`})]})}function p(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M10.5 2.75 13.25 5.5 6 12.75H3.25V10Z`})})}function m(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M2.5 8h9M8.5 4.5 12 8l-3.5 3.5`}),(0,t.jsx)(`path`,{d:`M13.75 3v10`})]})}function h(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`5.25`,y:`5.25`,width:`8.5`,height:`8.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M10.75 5.25V3.75a1.5 1.5 0 0 0-1.5-1.5h-5.5a1.5 1.5 0 0 0-1.5 1.5v5.5a1.5 1.5 0 0 0 1.5 1.5h1.5`})]})}function g(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M2.75 4.25h10.5M6.25 4.25V2.75h3.5v1.5M4.25 4.25l.6 9h6.3l.6-9`})})}function _(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M2.25 4.25a1.5 1.5 0 0 1 1.5-1.5h2.5l1.5 1.75h4.5a1.5 1.5 0 0 1 1.5 1.5v5.75a1.5 1.5 0 0 1-1.5 1.5h-8.5a1.5 1.5 0 0 1-1.5-1.5Z`})})}function v(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M3.25 2.75h6l3.5 3.5v7a1 1 0 0 1-1 1h-8.5a1 1 0 0 1-1-1v-9.5a1 1 0 0 1 1-1Z`}),(0,t.jsx)(`path`,{d:`M9 2.75v3.5h3.75M5 9h6M5 11.5h4`})]})}function y(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M6 13.25h4M6.5 11.25h3M8 1.75a4.25 4.25 0 0 0-2.4 7.76c.3.2.5.55.5.92v.82h3.8v-.82c0-.37.2-.72.5-.92A4.25 4.25 0 0 0 8 1.75Z`})})}function b(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M2.25 5.5V3.25a1 1 0 0 1 1-1H5.5M10.5 2.25h2.25a1 1 0 0 1 1 1V5.5M13.75 10.5v2.25a1 1 0 0 1-1 1H10.5M5.5 13.75H3.25a1 1 0 0 1-1-1V10.5`})})}function x(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:`M9.75 2.75v10.5`})]})}function S(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 9.5h12.5`})]})}export{c as _,_ as a,g as b,u as c,d,i as f,v as g,a as h,h as i,S as l,p as m,l as n,b as o,y as p,s as r,m as s,f as t,x as u,o as v,r as y};
|
|
2
|
-
//# sourceMappingURL=dock-icons-DGZoDN6N.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dock-icons-DGZoDN6N.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/dock-icons.tsx"],"sourcesContent":["/**\n * routes/verse/dock/dock-icons.tsx — the chat surface's own 16px glyphs\n * (unit C2): the dock's pane tabs and the header's pane toggles, the ⋯\n * menu, pin and archive. Same drawing grammar as components/primitives/icons\n * (16-unit box, 1.5 stroke, round caps, currentColor) so they sit beside the\n * shared set without looking borrowed; kept here because verse-icons.tsx is\n * the shell's file.\n */\nimport type { ReactNode, SVGProps } from 'react';\nimport type { BuiltinPaneId } from '../shell/dock-catalog.js';\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 ReviewGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M5 2.5v5M2.5 5h5M9 11h4.5\" /><path d=\"M11.5 2.5 4.5 13.5\" /></Glyph>;\n}\n\nexport function TasksGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M6.5 4h7M6.5 8h7M6.5 12h7\" /><path d=\"m2.25 4 1 1 1.5-2M2.5 8h1.75M2.5 12h1.75\" /></Glyph>;\n}\n\nexport function ContextGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m8 2 6 3-6 3-6-3 6-3Z\" /><path d=\"m2 8 6 3 6-3M2 11l6 3 6-3\" /></Glyph>;\n}\n\nexport function SplitGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"2.25\" y=\"2.25\" width=\"11.5\" height=\"11.5\" rx=\"1.5\" /><path d=\"M2.25 8h11.5\" /></Glyph>;\n}\n\nexport function CloseGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m4 4 8 8M12 4l-8 8\" /></Glyph>;\n}\n\nexport function MoreGlyph(p: GlyphProps) {\n return (\n <Glyph {...p}>\n <circle cx=\"3.5\" cy=\"8\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"8\" cy=\"8\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12.5\" cy=\"8\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\" />\n </Glyph>\n );\n}\n\nexport function PinGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M9.75 2.25 13.75 6.25 11 7.5 8.5 10l.25 2.75-5-5L6.5 8 9 5.25Z\" /><path d=\"m5 11-2.75 2.75\" /></Glyph>;\n}\n\nexport function ArchiveGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"3\" rx=\"1\" /><path d=\"M2.75 5.75v6.5a1 1 0 0 0 1 1h8.5a1 1 0 0 0 1-1v-6.5M6.5 8.5h3\" /></Glyph>;\n}\n\nexport function RenameGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M10.5 2.75 13.25 5.5 6 12.75H3.25V10Z\" /></Glyph>;\n}\n\nexport function HandoffGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.5 8h9M8.5 4.5 12 8l-3.5 3.5\" /><path d=\"M13.75 3v10\" /></Glyph>;\n}\n\nexport function CopyGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.5\" /><path d=\"M10.75 5.25V3.75a1.5 1.5 0 0 0-1.5-1.5h-5.5a1.5 1.5 0 0 0-1.5 1.5v5.5a1.5 1.5 0 0 0 1.5 1.5h1.5\" /></Glyph>;\n}\n\nexport function TrashGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.75 4.25h10.5M6.25 4.25V2.75h3.5v1.5M4.25 4.25l.6 9h6.3l.6-9\" /></Glyph>;\n}\n\nexport function FilesGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.25 4.25a1.5 1.5 0 0 1 1.5-1.5h2.5l1.5 1.75h4.5a1.5 1.5 0 0 1 1.5 1.5v5.75a1.5 1.5 0 0 1-1.5 1.5h-8.5a1.5 1.5 0 0 1-1.5-1.5Z\" /></Glyph>;\n}\n\nexport function SourcesGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M3.25 2.75h6l3.5 3.5v7a1 1 0 0 1-1 1h-8.5a1 1 0 0 1-1-1v-9.5a1 1 0 0 1 1-1Z\" /><path d=\"M9 2.75v3.5h3.75M5 9h6M5 11.5h4\" /></Glyph>;\n}\n\nexport function ReasoningGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M6 13.25h4M6.5 11.25h3M8 1.75a4.25 4.25 0 0 0-2.4 7.76c.3.2.5.55.5.92v.82h3.8v-.82c0-.37.2-.72.5-.92A4.25 4.25 0 0 0 8 1.75Z\" /></Glyph>;\n}\n\n/** Focus mode: four corners closing in on the conversation. */\nexport function FocusGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.25 5.5V3.25a1 1 0 0 1 1-1H5.5M10.5 2.25h2.25a1 1 0 0 1 1 1V5.5M13.75 10.5v2.25a1 1 0 0 1-1 1H10.5M5.5 13.75H3.25a1 1 0 0 1-1-1V10.5\" /></Glyph>;\n}\n\n/** The panel docked beside the chat. */\nexport function PanelRightGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"M9.75 2.75v10.5\" /></Glyph>;\n}\n\n/** The panel docked under the chat. */\nexport function PanelBottomGlyph(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 9.5h12.5\" /></Glyph>;\n}\n\nexport const DOCK_PANE_GLYPH: Readonly<Record<BuiltinPaneId, (p: GlyphProps) => ReactNode>> = {\n terminal: TerminalGlyph,\n browser: PreviewGlyph,\n diff: ReviewGlyph,\n files: FilesGlyph,\n sources: SourcesGlyph,\n reasoning: ReasoningGlyph,\n tasks: TasksGlyph,\n context: ContextGlyph,\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{c as r}from"./tool-semantics-xF0Fw2Ck.js";import{c as i,i as a,n as o,t as s}from"./sources-queries-BrM41X16.js";import{n as c}from"./verse-transcript-Dc-bk9l2.js";import{t as l}from"./useVerseTranscript-BOhcfdp7.js";import{n as u,t as d}from"./SourcesPanel-DFyLfYBO.js";import{a as f}from"./ChatSection-DXpzV1NW.js";var p=e(n(),1);function m(e,t=!0){let n=l(t?e:null),r=(0,p.useRef)({sessionId:e,cache:a()}),i=(0,p.useRef)({sessionId:e,turns:[]});return(0,p.useMemo)(()=>{if(!t)return i.current.sessionId===e?i.current.turns:[];r.current.sessionId!==e&&(r.current={sessionId:e,cache:a()});let s=o(c(n.items),r.current.cache).turns;return i.current={sessionId:e,turns:s},s},[n,t,e])}function h(e){let t=(0,p.useCallback)(async(t,n)=>{if(!e)throw Error(`no chat is open`);await s(e,t,n)},[e]),n=(0,p.useCallback)(e=>{f(r(e))},[]),a=(0,p.useCallback)(e=>{f(i(e))},[]);return(0,p.useMemo)(()=>({openFile:t,jumpToTool:n,jumpToTurn:a}),[t,n,a])}var g=t();function _({sessionId:e,session:t,visible:n,host:r}){let i=m(e,n),a=h(e),o=r.addToMessage,s=(0,p.useCallback)(e=>o(e),[o]);return(0,g.jsx)(d,{turns:i,session:t,...a,onCite:s})}function v({sessionId:e,session:t,visible:n}){let r=m(e,n),{jumpToTurn:i}=h(e);return(0,g.jsx)(u,{turns:r,engine:t?.engine??null,jumpToTurn:i})}export{v as ReasoningDockPane,_ as SourcesDockPane};
|
|
2
|
-
//# sourceMappingURL=dock-panes-BgSO9q_f.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dock-panes-BgSO9q_f.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/reasoning/pane-data.ts","../../../../../../src/web-ui/routes/verse/reasoning/dock-panes.tsx"],"sourcesContent":["/**\n * routes/verse/reasoning/pane-data.ts — what a Sources / Reasoning pane needs\n * when it is mounted OUTSIDE the transcript (a dock pane, a split), from\n * nothing but the session id.\n *\n * Turns are derived with the same pipeline the transcript uses\n * (groupTranscriptItems → buildTurns) over the same memoized transcript, with\n * a per-hook TurnCache so a streamed token re-derives only the live turn.\n * Jumps go through the transcript's own bus (chat/transcript-jump.ts), so a\n * click in a pane lands on the call or turn with the same reveal machinery\n * (opening a folded activity group, the locator flash).\n */\nimport { useCallback, useMemo, useRef } from 'react';\nimport { requestTranscriptJump } from '../chat/transcript-jump.js';\nimport { toolAnchorId } from '../chat/tool-semantics.js';\nimport { buildTurns, createTurnCache, turnAnchorId, type TurnBlock, type TurnCache } from '../chat/turn-model.js';\nimport { useVerseTranscript } from '../useVerseTranscript.js';\nimport { groupTranscriptItems } from '../verse-transcript.js';\nimport { openSourceFile } from './sources-queries.js';\n\n/**\n * The chat's turns. `active: false` (a pane kept alive behind another tab)\n * unsubscribes from the stream and keeps the last turns it derived, so a\n * hidden pane does no work per token; it catches up when shown again.\n */\nexport function useChatTurns(sessionId: string | null, active = true): TurnBlock[] {\n const transcript = useVerseTranscript(active ? sessionId : null);\n const cache = useRef<{ sessionId: string | null; cache: TurnCache }>({ sessionId, cache: createTurnCache() });\n const last = useRef<{ sessionId: string | null; turns: TurnBlock[] }>({ sessionId, turns: [] });\n return useMemo(() => {\n if (!active) return last.current.sessionId === sessionId ? last.current.turns : [];\n if (cache.current.sessionId !== sessionId) cache.current = { sessionId, cache: createTurnCache() };\n const turns = buildTurns(groupTranscriptItems(transcript.items), cache.current.cache).turns;\n last.current = { sessionId, turns };\n return turns;\n }, [transcript, active, sessionId]);\n}\n\nexport interface PaneActions {\n openFile: (path: string, line: number | undefined) => Promise<void>;\n jumpToTool: (toolUseId: string) => void;\n jumpToTurn: (turnKey: string) => void;\n}\n\nexport function usePaneActions(sessionId: string | null): PaneActions {\n const openFile = useCallback(async (path: string, line: number | undefined) => {\n if (!sessionId) throw new Error('no chat is open');\n await openSourceFile(sessionId, path, line);\n }, [sessionId]);\n const jumpToTool = useCallback((toolUseId: string) => { requestTranscriptJump(toolAnchorId(toolUseId)); }, []);\n const jumpToTurn = useCallback((turnKey: string) => { requestTranscriptJump(turnAnchorId(turnKey)); }, []);\n return useMemo(() => ({ openFile, jumpToTool, jumpToTurn }), [openFile, jumpToTool, jumpToTurn]);\n}\n","/**\n * routes/verse/reasoning/dock-panes.tsx — the Sources and Reasoning panels as\n * registry panes (reasoning.pane.tsx registers them).\n *\n * Adapters only: the panels are presentational over derived turns\n * (SourcesPanel / ReasoningPanel); this is where the dock's PaneProps meet\n * them. A pane kept alive behind another tab (`visible: false`) stops\n * following the stream and keeps what it last showed, so a hidden pane costs\n * nothing per token.\n */\nimport { useCallback } from 'react';\nimport type { PaneProps } from '../panes/pane-registry.js';\nimport { useChatTurns, usePaneActions } from './pane-data.js';\nimport { ReasoningPanel } from './ReasoningPanel.js';\nimport { SourcesPanel } from './SourcesPanel.js';\n\nexport function SourcesDockPane({ sessionId, session, visible, host }: PaneProps) {\n const turns = useChatTurns(sessionId, visible);\n const actions = usePaneActions(sessionId);\n const addToMessage = host.addToMessage;\n const onCite = useCallback((text: string) => addToMessage(text), [addToMessage]);\n return <SourcesPanel turns={turns} session={session} {...actions} onCite={onCite} />;\n}\n\nexport function ReasoningDockPane({ sessionId, session, visible }: PaneProps) {\n const turns = useChatTurns(sessionId, visible);\n const { jumpToTurn } = usePaneActions(sessionId);\n return <ReasoningPanel turns={turns} engine={session?.engine ?? null} jumpToTurn={jumpToTurn} />;\n}\n"],"mappings":"qbAyBA,SAAgB,EAAa,EAA0B,EAAS,GAAmB,CACjF,IAAM,EAAa,EAAmB,EAAS,EAAY,IAAI,EACzD,GAAA,EAAQ,EAAA,OAAA,CAAuD,CAAE,YAAW,MAAO,EAAgB,CAAE,CAAC,EACtG,GAAA,EAAO,EAAA,OAAA,CAAyD,CAAE,YAAW,MAAO,CAAC,CAAE,CAAC,EAC9F,OAAA,EAAO,EAAA,QAAA,KAAc,CACnB,GAAI,CAAC,EAAQ,OAAO,EAAK,QAAQ,YAAc,EAAY,EAAK,QAAQ,MAAQ,CAAC,EAC7E,EAAM,QAAQ,YAAc,IAAW,EAAM,QAAU,CAAE,YAAW,MAAO,EAAgB,CAAE,GACjG,IAAM,EAAQ,EAAW,EAAqB,EAAW,KAAK,EAAG,EAAM,QAAQ,KAAK,CAAC,CAAC,MAEtF,MADA,GAAK,QAAU,CAAE,YAAW,OAAM,EAC3B,CACT,EAAG,CAAC,EAAY,EAAQ,CAAS,CAAC,CACpC,CAQA,SAAgB,EAAe,EAAuC,CACpE,IAAM,GAAA,EAAW,EAAA,YAAA,CAAY,MAAO,EAAc,IAA6B,CAC7E,GAAI,CAAC,EAAW,MAAU,MAAM,iBAAiB,EACjD,MAAM,EAAe,EAAW,EAAM,CAAI,CAC5C,EAAG,CAAC,CAAS,CAAC,EACR,GAAA,EAAa,EAAA,YAAA,CAAa,GAAsB,CAAE,EAAsB,EAAa,CAAS,CAAC,CAAG,EAAG,CAAC,CAAC,EACvG,GAAA,EAAa,EAAA,YAAA,CAAa,GAAoB,CAAE,EAAsB,EAAa,CAAO,CAAC,CAAG,EAAG,CAAC,CAAC,EACzG,OAAA,EAAO,EAAA,QAAA,MAAe,CAAE,WAAU,aAAY,YAAW,GAAI,CAAC,EAAU,EAAY,CAAU,CAAC,CACjG,WCpCA,SAAgB,EAAgB,CAAE,YAAW,UAAS,UAAS,QAAmB,CAChF,IAAM,EAAQ,EAAa,EAAW,CAAO,EACvC,EAAU,EAAe,CAAS,EAClC,EAAe,EAAK,aACpB,GAAA,EAAS,EAAA,YAAA,CAAa,GAAiB,EAAa,CAAI,EAAG,CAAC,CAAY,CAAC,EAC/E,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAqB,QAAgB,UAAS,GAAI,EAAiB,QAAS,CAAA,CACrF,CAEA,SAAgB,EAAkB,CAAE,YAAW,UAAS,WAAsB,CAC5E,IAAM,EAAQ,EAAa,EAAW,CAAO,EACvC,CAAE,cAAe,EAAe,CAAS,EAC/C,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAuB,QAAO,OAAQ,GAAS,QAAU,KAAkB,YAAa,CAAA,CACjG"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{C as e,M as t,V as n,a as r,i}from"./global-BJ_kVFpD.js";import{O as a}from"./VerseShared-CH8mV5ew.js";import{n as o}from"./control-queries-CUNa6TAx.js";import{n as s,u as c}from"./surface-data-D_oFOgkh.js";var l=`/api/verse/fleet/control`,u=`/api/verse/fleet/control/queue`,d=`/api/verse/leader/directives`,f=Object.freeze({state:`verse-fleet-control`,queue:`verse-fleet-control-queue`});function p(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function m(e){return p(e)&&e.v===1&&typeof e.state==`string`&&typeof e.headline==`string`&&p(e.controls)&&p(e.grant)&&p(e.daemon)?e:null}function h(e){return p(e)&&e.v===1&&Array.isArray(e.tasks)&&Array.isArray(e.goals)&&p(e.targets)?e:null}var g=c(f.state,l,`The fleet controls`,m),_=c(f.queue,u,`The fleet queue`,h);async function v(n,i){let a=e();if(!a)throw new o;let s=await r(n,i,a);return t(),s}async function y(e){let t=await v(l,e);return n(f.state),n(f.queue),n(s.fleetLive),n(s.authority),a(),t}async function b(e,t){return i(`${l}/runs/${encodeURIComponent(e)}/log`,t)}async function x(e){let t=await v(d,{text:e});return n(s.leader),t}export{x as a,y as i,g as n,_ as r,b as t};
|
|
2
|
-
//# sourceMappingURL=fleet-control-queries-clsJWanE.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fleet-control-queries-clsJWanE.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/fleet/fleet-control-queries.ts"],"sourcesContent":["/**\n * routes/verse/fleet/fleet-control-queries.ts — reads and writes behind the\n * Fleet control surface (3.15):\n *\n * GET /api/verse/fleet/control FleetControlStateV1\n * GET /api/verse/fleet/control/queue FleetControlQueueV1\n * GET /api/verse/fleet/control/runs/<id>/log FleetRunLogV1\n * POST /api/verse/fleet/control one FleetControlAction\n * POST /api/verse/leader/directives a Leader directive\n *\n * Reads are optional like every surface read (a server without the route is\n * \"not available here\", never a broken page). Writes pull the held mutation\n * token and invalidate exactly what they change.\n */\nimport { apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { refreshActivity } from '../shell/useActivity.js';\nimport { SURFACE_KEYS, optionalQuery } from '../command/surface-data.js';\nimport type {\n FleetControlAction,\n FleetControlActionResultV1,\n FleetControlQueueV1,\n FleetControlStateV1,\n FleetRunLogV1,\n} from '../../../../core/fleet/fleet-control-types.js';\n\nexport const FLEET_CONTROL_PATH = '/api/verse/fleet/control';\nexport const FLEET_CONTROL_QUEUE_PATH = '/api/verse/fleet/control/queue';\nexport const LEADER_DIRECTIVES_PATH = '/api/verse/leader/directives';\n\nexport const FLEET_CONTROL_KEYS = Object.freeze({\n state: 'verse-fleet-control',\n queue: 'verse-fleet-control-queue',\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function narrowFleetControl(raw: unknown): FleetControlStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && typeof raw['state'] === 'string' && typeof raw['headline'] === 'string'\n && isRecord(raw['controls']) && isRecord(raw['grant']) && isRecord(raw['daemon'])\n ? (raw as unknown as FleetControlStateV1)\n : null;\n}\n\nexport function narrowFleetQueue(raw: unknown): FleetControlQueueV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['tasks']) && Array.isArray(raw['goals']) && isRecord(raw['targets'])\n ? (raw as unknown as FleetControlQueueV1)\n : null;\n}\n\nexport const fleetControlQuery = optionalQuery(FLEET_CONTROL_KEYS.state, FLEET_CONTROL_PATH, 'The fleet controls', narrowFleetControl);\nexport const fleetQueueQuery = optionalQuery(FLEET_CONTROL_KEYS.queue, FLEET_CONTROL_QUEUE_PATH, 'The fleet queue', narrowFleetQueue);\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/** One control action; the answer carries the state READ BACK after it. */\nexport async function postFleetControl(action: FleetControlAction): Promise<FleetControlActionResultV1> {\n const result = await post<FleetControlActionResultV1>(FLEET_CONTROL_PATH, action);\n invalidate(FLEET_CONTROL_KEYS.state);\n invalidate(FLEET_CONTROL_KEYS.queue);\n invalidate(SURFACE_KEYS.fleetLive);\n invalidate(SURFACE_KEYS.authority);\n void refreshActivity();\n return result;\n}\n\nexport async function fetchRunLog(runId: string, signal?: AbortSignal): Promise<FleetRunLogV1> {\n return apiGet<FleetRunLogV1>(`${FLEET_CONTROL_PATH}/runs/${encodeURIComponent(runId)}/log`, signal);\n}\n\nexport async function postLeaderDirective(text: string): Promise<unknown> {\n const result = await post<unknown>(LEADER_DIRECTIVES_PATH, { text });\n invalidate(SURFACE_KEYS.leader);\n return result;\n}\n"],"mappings":"sNA4BA,IAAa,EAAqB,2BACrB,EAA2B,iCAC3B,EAAyB,+BAEzB,EAAqB,OAAO,OAAO,CAC9C,MAAO,sBACP,MAAO,2BACT,CAAC,EAED,SAAS,EAAS,EAAkD,CAClE,OAAyB,OAAO,GAAU,YAAnC,GAA+C,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAEA,SAAgB,EAAmB,EAA0C,CAC3E,OAAO,EAAS,CAAG,GAAK,EAAI,IAAS,GAAK,OAAO,EAAI,OAAa,UAAY,OAAO,EAAI,UAAgB,UACpG,EAAS,EAAI,QAAW,GAAK,EAAS,EAAI,KAAQ,GAAK,EAAS,EAAI,MAAS,EAC7E,EACD,IACN,CAEA,SAAgB,EAAiB,EAA0C,CACzE,OAAO,EAAS,CAAG,GAAK,EAAI,IAAS,GAAK,MAAM,QAAQ,EAAI,KAAQ,GAAK,MAAM,QAAQ,EAAI,KAAQ,GAAK,EAAS,EAAI,OAAU,EAC1H,EACD,IACN,CAEA,IAAa,EAAoB,EAAc,EAAmB,MAAO,EAAoB,qBAAsB,CAAkB,EACxH,EAAkB,EAAc,EAAmB,MAAO,EAA0B,kBAAmB,CAAgB,EAEpI,eAAe,EAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAGA,eAAsB,EAAiB,EAAiE,CACtG,IAAM,EAAS,MAAM,EAAiC,EAAoB,CAAM,EAMhF,OALA,EAAW,EAAmB,KAAK,EACnC,EAAW,EAAmB,KAAK,EACnC,EAAW,EAAa,SAAS,EACjC,EAAW,EAAa,SAAS,EACjC,EAAqB,EACd,CACT,CAEA,eAAsB,EAAY,EAAe,EAA8C,CAC7F,OAAO,EAAsB,GAAG,EAAmB,QAAQ,mBAAmB,CAAK,EAAE,MAAO,CAAM,CACpG,CAEA,eAAsB,EAAoB,EAAgC,CACxE,IAAM,EAAS,MAAM,EAAc,EAAwB,CAAE,MAAK,CAAC,EAEnE,OADA,EAAW,EAAa,MAAM,EACvB,CACT"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-DOAOxiKl.js";import{C as n,M as r,V as i,a,i as o,t as s,u as c}from"./global-BJ_kVFpD.js";import{n as l,t as u}from"./control-queries-CUNa6TAx.js";import{c as d,l as f,u as p}from"./fleet-model-D4n8ErhA.js";var m=e(t(),1),h=`verse-runtime`,g=`verse-fleet`,_=`verse-local-only`;function v(e,t){return t instanceof s?t.status===404?`This server doesn't have ${e}.`:`${e} answered HTTP ${t.status}.`:`${e} could not be reached.`}function y(e,t){return async n=>{try{let r=t(await o(e,n));return r===null?{value:null,available:!0,reason:`Unrecognized response — update Ashlr.`}:{value:r,available:!0,reason:null}}catch(t){if(t instanceof s&&t.status===401||t instanceof DOMException&&t.name===`AbortError`)throw t;return{value:null,available:!1,reason:v(e,t)}}}}var b={key:h,fetch:y(`/api/verse/runtime`,p)},x={key:g,fetch:y(`/api/verse/fleet`,d)},S={key:_,fetch:y(`/api/verse/local-only`,f)};async function C(e,t){let i=n();if(!i)throw new l;let o=await a(e,t,i);return r(),o}async function w(e){let t=await C(`/api/verse/runtime`,{action:e});return i(h),i(g),i(u),t}async function T(e){let t=await C(`/api/verse/local-only`,{enabled:e});return i(_),i(u),t}var E=4e3;function D(e=E){let t=c(b),n=c(x);(0,m.useEffect)(()=>{let r=null,i=()=>{t(),n()},a=()=>{r===null&&(r=setInterval(i,e))},o=()=>{r!==null&&(clearInterval(r),r=null)},s=()=>{if(document.visibilityState===`hidden`){o();return}i(),a()};return document.visibilityState!==`hidden`&&a(),document.addEventListener(`visibilitychange`,s),()=>{o(),document.removeEventListener(`visibilitychange`,s)}},[e,t,n])}export{b as a,w as i,x as n,T as o,S as r,D as s,g as t};
|
|
2
|
-
//# sourceMappingURL=fleet-queries-DX1AwHEt.js.map
|