@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-composer-D04tqOmU.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/playbooks/playbook-composer.ts"],"sourcesContent":["/**\n * routes/verse/playbooks/playbook-composer.ts — put a playbook's `!macro`\n * into the chat composer (never send it).\n *\n * A playbook reaches a task through its text: `!fix-bug` in the message is\n * resolved by whichever lane runs it (the chat itself on any seat, Run in\n * cloud, Run in Devin, a fleet goal). So \"Use playbook…\" and \"Run…\" only\n * WRITE the macro at the front of the draft — the operator still describes\n * the task and picks the lane.\n *\n * Like cloud/composer-draft.ts, this goes through the box itself (native\n * setter + `input` event), which React's controlled textarea treats as the\n * operator's own edit, so draft persistence sees it too.\n */\nimport { findComposerBox } from '../cloud/composer-draft.js';\nimport { setVerseSection } from '../verse-ui-store.js';\n\n/** `!name` tokens anywhere in prose (the server's rule, simplified: whitespace or start before `!`). */\nconst MACRO_TOKEN = /(^|\\s)![a-z0-9][a-z0-9-]{1,47}(?:@v?\\d{1,6})?(?=\\s|$)/g;\n\n/**\n * The draft with `macro` at its front. A draft that already names a\n * playbook has that one replaced (one playbook per task); an empty draft\n * becomes `!macro ` ready for the task text. Pure.\n */\nexport function withMacro(draft: string, macro: string): string {\n const stripped = draft.replace(MACRO_TOKEN, (_m, lead: string) => lead).replace(/^\\s+/, '');\n return stripped ? `${macro} ${stripped}` : `${macro} `;\n}\n\nfunction write(box: HTMLTextAreaElement, value: string): void {\n const setter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set;\n if (setter) setter.call(box, value);\n else box.value = value;\n box.dispatchEvent(new Event('input', { bubbles: true }));\n box.focus();\n const end = box.value.length;\n try {\n box.setSelectionRange(end, end);\n } catch {\n /* a hidden box has no selection; the text is in either way */\n }\n}\n\n/** Write the macro into the composer on screen. False when there is no usable box. */\nexport function putMacroInComposerNow(macro: string, root?: ParentNode): boolean {\n const box = findComposerBox(root);\n if (!box || box.disabled) return false;\n write(box, withMacro(box.value, macro));\n return true;\n}\n\n/**\n * Go to Chat and write the macro once its composer is mounted (the Chat\n * section may be a chunk that is still loading). False when no chat composer\n * appeared in time — the caller says so (open a chat first).\n */\nexport async function putMacroInComposer(macro: string, opts: { waitMs?: number; root?: ParentNode } = {}): Promise<boolean> {\n setVerseSection('chat');\n const deadline = Date.now() + (opts.waitMs ?? 3_000);\n for (;;) {\n if (putMacroInComposerNow(macro, opts.root)) return true;\n if (Date.now() >= deadline) return false;\n await new Promise((resolve) => setTimeout(resolve, 60));\n }\n}\n"],"mappings":"mGAkBA,IAAM,EAAc,yDAOpB,SAAgB,EAAU,EAAe,EAAuB,CAC9D,IAAM,EAAW,EAAM,QAAQ,GAAc,EAAI,IAAiB,CAAI,CAAC,CAAC,QAAQ,OAAQ,EAAE,EAC1F,OAAO,EAAW,GAAG,EAAM,GAAG,IAAa,GAAG,EAAM,EACtD,CAEA,SAAS,EAAM,EAA0B,EAAqB,CAC5D,IAAM,EAAS,OAAO,yBAAyB,oBAAoB,UAAW,OAAO,CAAC,EAAE,IACpF,EAAQ,EAAO,KAAK,EAAK,CAAK,EAC7B,EAAI,MAAQ,EACjB,EAAI,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CAAC,EACvD,EAAI,MAAM,EACV,IAAM,EAAM,EAAI,MAAM,OACtB,GAAI,CACF,EAAI,kBAAkB,EAAK,CAAG,CAChC,MAAQ,CAER,CACF,CAGA,SAAgB,EAAsB,EAAe,EAA4B,CAC/E,IAAM,EAAM,EAAgB,CAAI,EAGhC,MAFI,CAAC,GAAO,EAAI,SAAiB,IACjC,EAAM,EAAK,EAAU,EAAI,MAAO,CAAK,CAAC,EAC/B,GACT,CAOA,eAAsB,EAAmB,EAAe,EAA+C,CAAC,EAAqB,CAC3H,EAAgB,MAAM,EACtB,IAAM,EAAW,KAAK,IAAI,GAAK,EAAK,QAAU,KAC9C,OAAS,CACP,GAAI,EAAsB,EAAO,EAAK,IAAI,EAAG,MAAO,GACpD,GAAI,KAAK,IAAI,GAAK,EAAU,MAAO,GACnC,MAAM,IAAI,QAAS,GAAY,WAAW,EAAS,EAAE,CAAC,CACxD,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-hePW80VL.js";import{R as t}from"./VerseConsoleApp-DjPpZLo1.js";var n=e({REQUEST_TTL_MS:()=>r,getPlaybookFocus:()=>l,isPlaybookFocusLive:()=>u,requestPlaybookFocus:()=>c,subscribePlaybookFocus:()=>f,takePlaybookFocus:()=>d}),r=2e4,i=null,a=0,o=new Set;function s(){for(let e of[...o])e()}function c(e){a+=1,i={...e,seq:a,at:Date.now()},t(`playbooks`),s()}function l(){return i}function u(e,t=Date.now()){return t-e.at<=r}function d(e){i?.seq===e&&(i=null,s())}function f(e){return o.add(e),()=>o.delete(e)}export{d as a,f as i,u as n,n as r,l as t};
|
|
2
|
+
//# sourceMappingURL=playbook-focus-DD1VIfkd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-focus-DD1VIfkd.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/playbooks/playbook-focus.ts"],"sourcesContent":["/**\n * routes/verse/playbooks/playbook-focus.ts — ⌘K \"Run playbook…\" → the lazily\n * mounted Playbooks section, in \"choose one to run\" mode (the same shape as\n * wiki/wiki-focus.ts). A request waits (up to REQUEST_TTL_MS) until the\n * section mounts and takes it. Tiny and framework-free.\n */\nimport { setVerseSection } from '../verse-ui-store.js';\n\n/**\n * `run`: ⌘K \"Run playbook…\" — pick any playbook to run.\n * `workflows`: ⌘K \"Run command workflow…\" when no terminal panel served it —\n * the list narrows to command workflows (kind: command).\n */\nexport type PlaybookFocusTarget = { kind: 'run' } | { kind: 'workflows' };\nexport type PlaybookFocusRequest = PlaybookFocusTarget & { seq: number; at: number };\n\nexport const REQUEST_TTL_MS = 20_000;\n\nlet current: PlaybookFocusRequest | null = null;\nlet seq = 0;\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\nexport function requestPlaybookFocus(target: PlaybookFocusTarget): void {\n seq += 1;\n current = { ...target, seq, at: Date.now() };\n setVerseSection('playbooks');\n emit();\n}\n\nexport function getPlaybookFocus(): PlaybookFocusRequest | null {\n return current;\n}\n\nexport function isPlaybookFocusLive(request: PlaybookFocusRequest, now: number = Date.now()): boolean {\n return now - request.at <= REQUEST_TTL_MS;\n}\n\n/** Clear request `requestSeq` (only that one — a newer ask survives). */\nexport function takePlaybookFocus(requestSeq: number): void {\n if (current?.seq !== requestSeq) return;\n current = null;\n emit();\n}\n\nexport function subscribePlaybookFocus(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Test hygiene. */\nexport function resetPlaybookFocus(): void {\n current = null;\n emit();\n}\n"],"mappings":"sQAgBa,EAAiB,IAE1B,EAAuC,KACvC,EAAM,EACJ,EAAY,IAAI,IAEtB,SAAS,GAAa,CACpB,IAAK,IAAM,IAAK,CAAC,GAAG,CAAS,EAAG,EAAE,CACpC,CAEA,SAAgB,EAAqB,EAAmC,CACtE,GAAO,EACP,EAAU,CAAE,GAAG,EAAQ,MAAK,GAAI,KAAK,IAAI,CAAE,EAC3C,EAAgB,WAAW,EAC3B,EAAK,CACP,CAEA,SAAgB,GAAgD,CAC9D,OAAO,CACT,CAEA,SAAgB,EAAoB,EAA+B,EAAc,KAAK,IAAI,EAAY,CACpG,OAAO,EAAM,EAAQ,IAAM,CAC7B,CAGA,SAAgB,EAAkB,EAA0B,CACtD,GAAS,MAAQ,IACrB,EAAU,KACV,EAAK,EACP,CAEA,SAAgB,EAAuB,EAAkC,CAEvE,OADA,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{C as e,M as t,V as n,a as r,i,t as a}from"./global-w7KDTTi0.js";import{r as o}from"./VerseShared-Bf-XTHCh.js";var s=`/api/verse/playbooks`,c=[`Outcome`,`Procedure`,`Specifications`,`Advice`,`Forbidden actions`,`Required from user`],l=[`Outcome`,`Procedure`],u=[`agent`,`command`],d=`Command`,f=/^[a-z0-9][a-z0-9-]{1,47}$/,p=/^![a-z0-9][a-z0-9-]{1,47}$/,m=12288;function h(e){return e?.kind===`command`?`command`:`agent`}var g=`verse-playbooks`,_=(e,t)=>`verse-playbook:${e}:${t??`latest`}`;function v(e){if(!e||typeof e!=`object`)return null;let t=e.playbooks;return Array.isArray(t)?t:null}var y={key:g,fetch:async e=>{try{let t=v(await i(s,e));return t?{value:t,available:!0,reason:null}:{value:null,available:!0,reason:`Unrecognized response — update Ashlr.`}}catch(e){if(e instanceof a&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{value:null,available:!1,reason:e instanceof a&&e.status===404?`Playbooks are not in this build yet.`:`Playbooks could not be read.`}}}};function b(e,t){let n=t===null?``:`?version=${t}`;return{key:_(e,t),fetch:t=>i(`${s}/${encodeURIComponent(e)}${n}`,t)}}async function x(i){let a=e();if(!a)throw new o;let c=await r(s,i,a);return t(),c.ok&&(n(g),n(_(c.playbook.meta.id,null))),c}export{f as a,m as c,h as d,d as i,c as l,y as n,u as o,x as r,p as s,b as t,l as u};
|
|
2
|
+
//# sourceMappingURL=playbooks-queries-X7NGzpIn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbooks-queries-X7NGzpIn.js","names":[],"sources":["../../../../../../src/core/playbooks/types.ts","../../../../../../src/web-ui/routes/verse/playbooks/playbooks-queries.ts"],"sourcesContent":["/**\n * Versioned playbooks — the vocabulary (3.15).\n *\n * A PLAYBOOK is a reusable, versioned task template every lane can run under:\n * fleet goals, the cloud lane, the Devin lane, the Leader's work.dispatch and\n * the interactive \"Run in cloud / Run in Devin\". Modelled on Devin playbooks:\n * a markdown body with fixed sections (Outcome, Procedure, Specifications,\n * Advice, Forbidden actions, Required from user) under a small front-matter\n * (id, name, `!macro`, where it applies, done-when checks, default budget).\n *\n * Versions are IMMUTABLE: an edit writes v<N+1>; v<N> is never rewritten, so\n * a task that ran under `fix-issue@v3` can always be traced to the exact text\n * it was given, and retros attribute outcomes per version.\n *\n * Guidance only: a playbook changes what the brief SAYS, never a route, gate,\n * budget cap or authority. A task with no playbook gets a byte-identical prompt.\n *\n * BROWSER-SAFE: the Playbooks view imports this — type-only imports, plain consts.\n */\nimport type { TaskKind } from '../learn/retro/types.js';\nimport type { CommandParam } from './command-template.js';\n\nexport type { TaskKind, CommandParam };\n\nexport const VERSE_PLAYBOOKS_PATH = '/api/verse/playbooks';\n\n/** The body sections, in render order. Headings are `## <name>` (case-insensitive). */\nexport const PLAYBOOK_SECTIONS = [\n 'Outcome',\n 'Procedure',\n 'Specifications',\n 'Advice',\n 'Forbidden actions',\n 'Required from user',\n] as const;\nexport type PlaybookSectionName = (typeof PLAYBOOK_SECTIONS)[number];\n\n/** A playbook without these is rejected: an engine needs a goal and a way there. */\nexport const REQUIRED_PLAYBOOK_SECTIONS: readonly PlaybookSectionName[] = ['Outcome', 'Procedure'];\n\n/**\n * What a playbook is (the `kind` front-matter key):\n * agent guidance an engine follows — every playbook before this key\n * existed, and the default when it is absent.\n * command a COMMAND WORKFLOW: a shell command template with\n * `{{param:default}}` holes (command-template.ts). The operator\n * fills a form and the command is pasted at a terminal prompt —\n * never run, never sent to an engine. No lane resolves one: not\n * by `!macro`, not explicitly, not by auto-match (resolve.ts).\n */\nexport const PLAYBOOK_KINDS = ['agent', 'command'] as const;\nexport type PlaybookKind = (typeof PLAYBOOK_KINDS)[number];\n\n/** A command workflow's body: the `## Command` code block and its holes. */\nexport interface PlaybookCommandSpec {\n /** The command template, exactly as in the code block (no trailing newline). */\n template: string;\n /** Distinct `{{name[:default]}}` holes, in first-appearance order. */\n params: CommandParam[];\n}\n\n/** The one section of a `kind: command` playbook (its code block is the template). */\nexport const COMMAND_SECTION = 'Command';\n\n/** Ids are path segments: lowercase, digits, dashes; 2–48 chars. */\nexport const PLAYBOOK_ID_PATTERN = /^[a-z0-9][a-z0-9-]{1,47}$/;\n/** Macros are `!` + an id-shaped name. */\nexport const PLAYBOOK_MACRO_PATTERN = /^![a-z0-9][a-z0-9-]{1,47}$/;\n\n/** A playbook's markdown source never exceeds this (UTF-8 bytes). */\nexport const PLAYBOOK_MAX_BYTES = 12 * 1024;\n/** The rendered block injected into a prompt never exceeds this (Devin's AGENTS.md cap). */\nexport const PLAYBOOK_INJECT_CAP_BYTES = 16 * 1024;\n\nexport interface PlaybookBudget {\n /** Default spend ceiling for one run, in USD; null = the lane's own default. */\n usd: number | null;\n /** Default wall-clock ceiling for one run, in minutes; null = the lane's own default. */\n minutes: number | null;\n}\n\n/** Front-matter. */\nexport interface PlaybookMeta {\n id: string;\n name: string;\n /** `!fix-bug`. Defaults to `!<id>`. */\n macro: string;\n /** One line for lists and the ⌘K palette. */\n description: string;\n /** Where it applies. Empty lists mean \"any\". */\n appliesTo: {\n /** GitHub `owner/name`, case-insensitive. */\n repos: string[];\n /** Repo-relative globs (`src/**`, `*.md`). */\n globs: string[];\n };\n /** Task kinds it is written for; [] = any. */\n taskKinds: TaskKind[];\n /** Checks the engine must see pass before it calls the task done. */\n doneWhen: string[];\n budget: PlaybookBudget;\n /**\n * Auto-match: attach this playbook to tasks that did not name one when the\n * task's kind (and repo / globs) match. Off by default — a playbook reaches\n * a task only when asked for, until Mason turns this on.\n */\n auto: boolean;\n /**\n * `agent` or `command` (see PLAYBOOK_KINDS). The parser always sets it;\n * absent (a record from an older build, a hand-built meta) means `agent`.\n */\n kind?: PlaybookKind;\n /** kind `command` only: the template and its holes. */\n command?: PlaybookCommandSpec;\n}\n\n/** A playbook's kind; absent ⇒ `agent` (every playbook written before 3.15's command workflows). Pure. */\nexport function playbookKindOf(meta: { kind?: PlaybookKind } | null | undefined): PlaybookKind {\n return meta?.kind === 'command' ? 'command' : 'agent';\n}\n\nexport type PlaybookSections = Partial<Record<PlaybookSectionName, string>>;\n\n/** A parsed, validated playbook version. */\nexport interface PlaybookV1 {\n v: 1;\n meta: PlaybookMeta;\n sections: PlaybookSections;\n version: number;\n /** First 12 hex of sha256(source) — pins the exact text a task ran under. */\n sha: string;\n /** The canonical markdown stored on disk. */\n source: string;\n createdAt: string;\n /** Shipped with ashlr and never edited on this machine (v1 lives in code). */\n builtin: boolean;\n}\n\n/** What a task / proposal / retro records: the exact playbook version it ran under. */\nexport interface PlaybookRef {\n id: string;\n version: number;\n sha: string;\n}\n\n/** How a playbook reached a task. */\nexport type PlaybookMatch = 'explicit' | 'macro' | 'auto';\n\nexport interface PlaybookVersionInfo {\n version: number;\n sha: string;\n createdAt: string;\n /** Optional change note written with the edit. */\n note: string | null;\n /** Who wrote this version (`mason`, `leader`, `cli`, `ashlr` for a built-in); null = not recorded. */\n author: string | null;\n}\n\n/** One row of the playbook list. */\nexport interface PlaybookSummary {\n id: string;\n name: string;\n macro: string;\n description: string;\n taskKinds: TaskKind[];\n auto: boolean;\n latest: number;\n builtin: boolean;\n updatedAt: string;\n /** `agent` | `command`; absent (an older server) ⇒ `agent`. */\n kind?: PlaybookKind;\n /** kind `command` only: the template and its holes, so a picker fills without a second read. */\n command?: PlaybookCommandSpec;\n}\n\n/** Outcomes per version, counted from retros that carry this playbook. */\nexport interface PlaybookOutcomeCounts {\n merged: number;\n /** gate-refused, owner-laned, closed, vetoed. */\n refused: number;\n reverted: number;\n /** verify-failed, failed, expired. */\n failed: number;\n total: number;\n}\n\nexport interface PlaybookValidationIssue {\n field: string;\n message: string;\n}\n\nexport type PlaybookParseResult =\n | { ok: true; meta: PlaybookMeta; sections: PlaybookSections; warnings: PlaybookValidationIssue[] }\n | { ok: false; errors: PlaybookValidationIssue[] };\n\n// ---------------------------------------------------------------------------\n// Verse contract\n// ---------------------------------------------------------------------------\n\n/** GET /api/verse/playbooks */\nexport interface PlaybooksListResponse {\n v: 1;\n playbooks: PlaybookSummary[];\n}\n\n/** GET /api/verse/playbooks/<id>[?version=N] */\nexport interface PlaybookDetailResponse {\n v: 1;\n playbook: PlaybookV1;\n /**\n * Rendered as an engine sees it. A command workflow never reaches an\n * engine: for one this is its command block and parameters, for reading.\n */\n rendered: string;\n versions: (PlaybookVersionInfo & { outcomes: PlaybookOutcomeCounts })[];\n}\n\n/** POST /api/verse/playbooks — create (id must be new) or edit (id exists ⇒ v<N+1>). */\nexport interface PlaybookSaveRequest {\n source: string;\n /** Edit guard: the version the editor started from; a newer latest refuses the save. */\n baseVersion?: number;\n note?: string;\n}\n\nexport type PlaybookSaveResponse =\n | { ok: true; playbook: PlaybookV1 }\n | { ok: false; errors: PlaybookValidationIssue[] };\n\nexport function formatPlaybookRef(ref: Pick<PlaybookRef, 'id' | 'version'>): string {\n return `${ref.id}@v${ref.version}`;\n}\n\n/** Parse `id@vN` / `id@N` / `id`. null when malformed. Pure. */\nexport function parsePlaybookRefText(text: string): { id: string; version: number | null } | null {\n const m = /^([a-z0-9][a-z0-9-]{1,47})(?:@v?(\\d{1,6}))?$/.exec(text.trim().replace(/^!/, ''));\n if (!m) return null;\n return { id: m[1]!, version: m[2] ? Number(m[2]) : null };\n}\n\n/** Is this a well-formed PlaybookRef? (Records are read back from disk.) */\nexport function isPlaybookRef(value: unknown): value is PlaybookRef {\n if (!value || typeof value !== 'object') return false;\n const r = value as Record<string, unknown>;\n return typeof r['id'] === 'string' && PLAYBOOK_ID_PATTERN.test(r['id'])\n && typeof r['version'] === 'number' && Number.isInteger(r['version']) && r['version'] >= 1\n && typeof r['sha'] === 'string' && /^[0-9a-f]{12}$/.test(r['sha']);\n}\n","/**\n * routes/verse/playbooks/playbooks-queries.ts — the reads and the one write\n * behind the Playbooks section (core/verse/playbooks-api.ts).\n *\n * GET /api/verse/playbooks → PlaybooksListResponse\n * GET /api/verse/playbooks/<id>[?version=N] → PlaybookDetailResponse\n * POST /api/verse/playbooks → PlaybookSaveResponse (a NEW version)\n *\n * The list read is optional (an older server has no route: the composer's\n * `!` menu and the ⋯ sheet then say so instead of failing). Writes pull the\n * held mutation token, touch the hold, and invalidate what they change.\n */\nimport {\n VERSE_PLAYBOOKS_PATH,\n type PlaybookDetailResponse,\n type PlaybookSaveRequest,\n type PlaybookSaveResponse,\n type PlaybooksListResponse,\n type PlaybookSummary,\n} from '../../../../core/playbooks/types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const PLAYBOOKS_KEY = 'verse-playbooks';\nconst detailKeyOf = (id: string, version: number | null) => `verse-playbook:${id}:${version ?? 'latest'}`;\n\n/** The list, or why there is none. `value: null` ⇒ `reason` says why. */\nexport interface PlaybooksRead {\n value: PlaybookSummary[] | null;\n available: boolean;\n reason: string | null;\n}\n\nfunction narrowList(raw: unknown): PlaybookSummary[] | null {\n if (!raw || typeof raw !== 'object') return null;\n const rows = (raw as { playbooks?: unknown }).playbooks;\n return Array.isArray(rows) ? (rows as PlaybookSummary[]) : null;\n}\n\n/**\n * The list as an optional read: a 404 (no route in this build) or an\n * unreachable server resolves with a reason instead of throwing. Kept free\n * of the command surface's helpers: the composer's `!` menu imports this,\n * and the composer is on the chat's first paint.\n */\nexport const playbooksQuery: QueryDef<PlaybooksRead> = {\n key: PLAYBOOKS_KEY,\n fetch: async (signal) => {\n try {\n const value = narrowList(await apiGet<unknown>(VERSE_PLAYBOOKS_PATH, signal));\n return value ? { value, available: true, reason: null } : { value: null, available: true, reason: 'Unrecognized response — update Ashlr.' };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n const missing = err instanceof ApiError && err.status === 404;\n return { value: null, available: false, reason: missing ? 'Playbooks are not in this build yet.' : 'Playbooks could not be read.' };\n }\n },\n};\n\nexport function playbookDetailQuery(id: string, version: number | null): QueryDef<PlaybookDetailResponse> {\n const suffix = version === null ? '' : `?version=${version}`;\n return {\n key: detailKeyOf(id, version),\n fetch: (signal) => apiGet<PlaybookDetailResponse>(`${VERSE_PLAYBOOKS_PATH}/${encodeURIComponent(id)}${suffix}`, signal),\n };\n}\n\n/** Save = create (new id) or a new version (existing id). Never rewrites a version. */\nexport async function savePlaybookSource(request: PlaybookSaveRequest): Promise<PlaybookSaveResponse> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const res = await apiPost<PlaybookSaveResponse>(VERSE_PLAYBOOKS_PATH, request, token);\n touchMutationHold();\n if (res.ok) {\n invalidate(PLAYBOOKS_KEY);\n invalidate(detailKeyOf(res.playbook.meta.id, null));\n }\n return res;\n}\n\nexport type { PlaybooksListResponse };\n"],"mappings":"qHAwBA,IAAa,EAAuB,uBAGvB,EAAoB,CAC/B,UACA,YACA,iBACA,SACA,oBACA,oBACF,EAIa,EAA6D,CAAC,UAAW,WAAW,EAYpF,EAAiB,CAAC,QAAS,SAAS,EAYpC,EAAkB,UAGlB,EAAsB,4BAEtB,EAAyB,6BAGzB,EAAqB,MA+ClC,SAAgB,EAAe,EAAgE,CAC7F,OAAO,GAAM,OAAS,UAAY,UAAY,OAChD,CC7FA,IAAa,EAAgB,kBACvB,GAAe,EAAY,IAA2B,kBAAkB,EAAG,GAAG,GAAW,WAS/F,SAAS,EAAW,EAAwC,CAC1D,GAAI,CAAC,GAAO,OAAO,GAAQ,SAAU,OAAO,KAC5C,IAAM,EAAQ,EAAgC,UAC9C,OAAO,MAAM,QAAQ,CAAI,EAAK,EAA6B,IAC7D,CAQA,IAAa,EAA0C,CACrD,IAAK,EACL,MAAO,KAAO,IAAW,CACvB,GAAI,CACF,IAAM,EAAQ,EAAW,MAAM,EAAgB,EAAsB,CAAM,CAAC,EAC5E,OAAO,EAAQ,CAAE,QAAO,UAAW,GAAM,OAAQ,IAAK,EAAI,CAAE,MAAO,KAAM,UAAW,GAAM,OAAQ,uCAAwC,CAC5I,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EAEpE,MAAO,CAAE,MAAO,KAAM,UAAW,GAAO,OADxB,aAAe,GAAY,EAAI,SAAW,IACA,uCAAyC,8BAA+B,CACpI,CACF,CACF,EAEA,SAAgB,EAAoB,EAAY,EAA0D,CACxG,IAAM,EAAS,IAAY,KAAO,GAAK,YAAY,IACnD,MAAO,CACL,IAAK,EAAY,EAAI,CAAO,EAC5B,MAAQ,GAAW,EAA+B,GAAG,EAAqB,GAAG,mBAAmB,CAAE,IAAI,IAAU,CAAM,CACxH,CACF,CAGA,eAAsB,EAAmB,EAA6D,CACpG,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAM,MAAM,EAA8B,EAAsB,EAAS,CAAK,EAMpF,OALA,EAAkB,EACd,EAAI,KACN,EAAW,CAAa,EACxB,EAAW,EAAY,EAAI,SAAS,KAAK,GAAI,IAAI,CAAC,GAE7C,CACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";var r=e(n(),1),i=t();function a(e){let t=null,n=null,a=()=>(n??=e().then(e=>t=e,e=>{throw n=null,e}),n),o=(0,r.lazy)(()=>a().then(e=>({default:e})));function s(e){let[n]=(0,r.useState)(()=>t);return n?(0,i.jsx)(n,{...e}):(0,i.jsx)(o,{...e})}return typeof window<`u`&&a().catch(()=>void 0),{Slot:s,ready:a}}function o(e){let t=null,n=null,i=()=>(n??=e().then(e=>t=e,e=>{throw n=null,e}),n);function a(){let[e,n]=(0,r.useState)(()=>({current:t}));return(0,r.useEffect)(()=>{if(e.current)return;let t=!0;return i().then(e=>{t&&n({current:e})},()=>void 0),()=>{t=!1}},[e]),e.current}return typeof window<`u`&&i().catch(()=>void 0),{ready:i,useLoaded:a}}export{o as n,a as t};
|
|
2
|
+
//# sourceMappingURL=preloaded-6hKNGuRp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preloaded-6hKNGuRp.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/preloaded.tsx"],"sourcesContent":["/**\n * routes/verse/shell/preloaded.tsx — chunks that start downloading when the\n * module DECLARING them evaluates, and render synchronously once they are in.\n *\n * Moved out of sections/ChatSection.tsx so the shell (guarded-action.tsx)\n * can keep its dialogs off the chat first-paint path the same way the Chat\n * section keeps its workspace, chat list and dialogs off it. A preloaded\n * dialog that has landed mounts in the same render that opens it, exactly as\n * a static import would; one opened in the few milliseconds before its chunk\n * lands shows a moment later.\n */\nimport { lazy, useEffect, useState, type ComponentType } from 'react';\n\n/**\n * A component in its own chunk whose download starts the moment the module\n * declaring it evaluates — not when React first renders it — so it streams in\n * parallel with the chat's first paint instead of after it.\n *\n * WHY (SPEC-310A §1: chat first-paint critical JS ≤ 350 KB, measured by\n * scripts/check-first-paint-budget.mjs). React + react-dom alone are ~220 KB\n * of that; the chat list, the transcript, the composer and the markdown\n * renderer were another ~290 KB in this chunk. The section's frame (its\n * grid, the banners, every mutation and key handler) paints from this chunk;\n * the workspace and the chat list paint a beat later from theirs, over\n * skeletons in their own shape so nothing jumps.\n *\n * Once the module is in, every later mount renders it synchronously (no\n * Suspense flash when you come back to Chat). Which of the two a mount uses\n * is fixed for that mount's life: swapping the lazy wrapper for the loaded\n * component mid-life would remount the subtree and drop its state — the\n * composer's draft, the transcript's scroll.\n */\nexport function preloadedLazy<P extends object>(load: () => Promise<ComponentType<P>>): { Slot: ComponentType<P>; ready: () => Promise<ComponentType<P>> } {\n let loaded: ComponentType<P> | null = null;\n let pending: Promise<ComponentType<P>> | null = null;\n const ready = (): Promise<ComponentType<P>> => {\n // A failed download is not cached: the next mount (or retry) asks again.\n pending ??= load().then((c) => (loaded = c), (err: unknown) => { pending = null; throw err; });\n return pending;\n };\n const Lazy = lazy(() => ready().then((c) => ({ default: c })));\n function Slot(props: P) {\n const [Ready] = useState<ComponentType<P> | null>(() => loaded);\n return Ready ? <Ready {...props} /> : <Lazy {...props} />;\n }\n if (typeof window !== 'undefined') void ready().catch(() => undefined);\n return { Slot, ready };\n}\n\n/**\n * A module (not a component) on the same terms as preloadedLazy: fetched when\n * the declaring module evaluates, read synchronously once in. useLoaded() re-renders\n * its caller once, when it lands; a failed load leaves it null (the values it\n * would have computed stay empty) and is retried on the next mount.\n */\nexport function preloadedModule<M>(load: () => Promise<M>): { ready: () => Promise<M>; useLoaded: () => M | null } {\n let loaded: M | null = null;\n let pending: Promise<M> | null = null;\n const ready = (): Promise<M> => {\n pending ??= load().then((m) => (loaded = m), (err: unknown) => { pending = null; throw err; });\n return pending;\n };\n function useLoaded(): M | null {\n const [mod, setMod] = useState<{ current: M | null }>(() => ({ current: loaded }));\n useEffect(() => {\n if (mod.current) return undefined;\n let live = true;\n ready().then((m) => { if (live) setMod({ current: m }); }, () => undefined);\n return () => { live = false; };\n }, [mod]);\n return mod.current;\n }\n if (typeof window !== 'undefined') void ready().catch(() => undefined);\n return { ready, useLoaded };\n}\n"],"mappings":"uHAgCA,SAAgB,EAAgC,EAA2G,CACzJ,IAAI,EAAkC,KAClC,EAA4C,KAC1C,OAEJ,IAAY,EAAK,CAAC,CAAC,KAAM,GAAO,EAAS,EAAK,GAAiB,CAAkB,KAAhB,GAAU,KAAY,CAAK,CAAC,EACtF,GAEH,GAAA,EAAO,EAAA,KAAA,KAAW,EAAM,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,CAAE,EAAE,CAAC,EAC7D,SAAS,EAAK,EAAU,CACtB,GAAM,CAAC,IAAA,EAAS,EAAA,SAAA,KAAwC,CAAM,EAC9D,OAAO,GAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,GAAI,CAAQ,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,CAAQ,CAAA,CAC1D,CAEA,OADI,OAAO,OAAW,KAAa,EAAW,CAAC,CAAC,UAAY,IAAA,EAAS,EAC9D,CAAE,OAAM,OAAM,CACvB,CAQA,SAAgB,EAAmB,EAAgF,CACjH,IAAI,EAAmB,KACnB,EAA6B,KAC3B,OACJ,IAAY,EAAK,CAAC,CAAC,KAAM,GAAO,EAAS,EAAK,GAAiB,CAAkB,KAAhB,GAAU,KAAY,CAAK,CAAC,EACtF,GAET,SAAS,GAAsB,CAC7B,GAAM,CAAC,EAAK,IAAA,EAAU,EAAA,SAAA,MAAuC,CAAE,QAAS,CAAO,EAAE,EAOjF,OANA,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,EAAI,QAAS,OACjB,IAAI,EAAO,GAEX,OADA,EAAM,CAAC,CAAC,KAAM,GAAM,CAAM,GAAM,EAAO,CAAE,QAAS,CAAE,CAAC,CAAG,MAAS,IAAA,EAAS,MAC7D,CAAE,EAAO,EAAO,CAC/B,EAAG,CAAC,CAAG,CAAC,EACD,EAAI,OACb,CAEA,OADI,OAAO,OAAW,KAAa,EAAW,CAAC,CAAC,UAAY,IAAA,EAAS,EAC9D,CAAE,QAAO,WAAU,CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./focus-trap-BZeH0rVB.js";import"./Dialog-DDHg9cuT.js";import"./Epistemic-tp0ZNAKZ.js";import"./StatusBadge-Yz7S3kZ2.js";import"./RouteErrorBoundary-BaJ1ZePy.js";import"./RefreshIndicator-D96C9qiH.js";import"./SkipToContent-BynsXs9i.js";import"./VerseConsoleApp-DjPpZLo1.js";import"./Segmented-BA8RmKYq.js";import"./Tag-BvOxSxYi.js";import"./Button-CstSJwha.js";import"./EmptyState-CGVr0VO2.js";import"./Meter-VXI75VNe.js";import"./Sheet-Bk64-Hlt.js";import"./Switch-Cqc_bSoh.js";import"./Slider-DS5HrVzl.js";import"./Select-B8GqZOX9.js";import"./Input-Cpn9uYj2.js";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./index-BC5Uslm5.js";var t=`${e}sw.js`,n=e,r=`/next/verse-m/`,i=`${r}manifest.webmanifest`,a=`${r}apple-touch-icon.png`,o=Object.freeze({light:`rgb(250 250 250)`,dark:`rgb(11 11 13)`}),s=`width=device-width, initial-scale=1, viewport-fit=cover`;function c(e,t,n,r){let i=e.head.querySelector(t);i||(i=n(),e.head.append(i));for(let[e,t]of Object.entries(r))i.setAttribute(e,t)}function l(e,t,n,r={}){c(e,`meta[name="${t}"]${r.media?`[media="${r.media}"]`:``}`,()=>e.createElement(`meta`),{name:t,content:n,...r})}function u(e,t,n){c(e,`link[rel="${t}"]`,()=>e.createElement(`link`),{rel:t,href:n})}function d(e=document){e.head&&(e.title=`Ashlr Verse`,l(e,`viewport`,s),u(e,`manifest`,i),u(e,`apple-touch-icon`,a),l(e,`apple-mobile-web-app-capable`,`yes`),l(e,`mobile-web-app-capable`,`yes`),l(e,`apple-mobile-web-app-status-bar-style`,`black-translucent`),l(e,`apple-mobile-web-app-title`,`Verse`),l(e,`theme-color`,o.light,{media:`(prefers-color-scheme: light)`}),l(e,`theme-color`,o.dark,{media:`(prefers-color-scheme: dark)`}),l(e,`format-detection`,`telephone=no`))}async function f(e=typeof navigator>`u`?void 0:navigator){let r=e?.serviceWorker;if(!r||typeof r.register!=`function`)return`unsupported`;try{return await r.register(t,{scope:n,type:`classic`,updateViaCache:`none`}),`registered`}catch{return`failed`}}function p(e=window){return e.navigator.standalone===!0||typeof e.matchMedia==`function`&&e.matchMedia(`(display-mode: standalone)`).matches}function m(e=navigator,t=window){return e.standalone===!0&&`serviceWorker`in e&&`PushManager`in t&&`Notification`in t}async function h(e){if(!m())throw Error(`Notifications require Verse installed on an iPhone Home Screen with Web Push support.`);if(Notification.permission===`denied`)throw Error(`Notifications are blocked in this phone’s settings.`);if((Notification.permission===`granted`?`granted`:await Notification.requestPermission())!==`granted`)throw Error(`Notification permission was not granted.`);let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t.padEnd(Math.ceil(t.length/4)*4,`=`)),r=new Uint8Array(n.length);for(let e=0;e<n.length;e+=1)r[e]=n.charCodeAt(e);let i=await navigator.serviceWorker.ready;return await i.pushManager.getSubscription()??i.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:r})}export{h as enableRemotePush,d as installMobileHead,p as isStandalone,f as registerMobileServiceWorker,m as supportsIphoneHomeScreenPush};
|
|
2
|
+
//# sourceMappingURL=pwa-BzXJXtDt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pwa-BzXJXtDt.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/pwa.ts"],"sourcesContent":["/**\n * routes/verse/mobile/pwa.ts — what makes /verse/m installable and launch\n * like an app: the head tags iOS and Android read, and the service worker.\n *\n * WHY THE HEAD IS WRITTEN AT RUNTIME: index.html is shared by every console.\n * A manifest link or `viewport-fit=cover` there would make the desktop Verse,\n * Universe and Resources pages installable, and let the workbench draw under\n * a phone's notch without the safe-area padding only this app has. So the\n * phone app adds them when it mounts — iOS reads them when \"Add to Home\n * Screen\" is tapped, which is always after that.\n *\n * WHY THE WORKER LIVES AT /verse/m/sw.js: a worker controls only paths under\n * its own script's directory (core/web/static.ts maps the path to the built\n * file in next/verse-m/). What it caches is in public/verse-m/sw.js: the app\n * shell and hashed assets — never an /api/ response, so no read data is left\n * on the phone.\n */\nimport { VERSE_MOBILE_PATH } from '../../../app/console-mode.js';\n\nexport const VERSE_MOBILE_SW_URL = `${VERSE_MOBILE_PATH}sw.js`;\nexport const VERSE_MOBILE_SW_SCOPE = VERSE_MOBILE_PATH;\n\n/**\n * Built by Vite from src/web-ui/public/verse-m/ into /next/verse-m/ (the\n * build's base). Literal, like the manifest's own icon paths, so the two can\n * never disagree.\n */\nconst ASSET_BASE = '/next/verse-m/';\nexport const VERSE_MOBILE_MANIFEST_HREF = `${ASSET_BASE}manifest.webmanifest`;\nexport const VERSE_MOBILE_TOUCH_ICON_HREF = `${ASSET_BASE}apple-touch-icon.png`;\n\n/** The canvas colour of each theme (design/tokens.css --bg-canvas), for the status bar. */\nexport const THEME_COLORS = Object.freeze({ light: 'rgb(250 250 250)', dark: 'rgb(11 11 13)' });\n\nconst VIEWPORT = 'width=device-width, initial-scale=1, viewport-fit=cover';\n\nfunction upsert(doc: Document, selector: string, create: () => HTMLElement, attrs: Record<string, string>): void {\n let el = doc.head.querySelector<HTMLElement>(selector);\n if (!el) {\n el = create();\n doc.head.append(el);\n }\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\n}\n\nfunction meta(doc: Document, name: string, content: string, extra: Record<string, string> = {}): void {\n const media = extra.media ? `[media=\"${extra.media}\"]` : '';\n upsert(doc, `meta[name=\"${name}\"]${media}`, () => doc.createElement('meta'), { name, content, ...extra });\n}\n\nfunction link(doc: Document, rel: string, href: string): void {\n upsert(doc, `link[rel=\"${rel}\"]`, () => doc.createElement('link'), { rel, href });\n}\n\n/** Idempotent: safe to call on every mount. */\nexport function installMobileHead(doc: Document = document): void {\n if (!doc.head) return;\n doc.title = 'Ashlr Verse';\n meta(doc, 'viewport', VIEWPORT);\n link(doc, 'manifest', VERSE_MOBILE_MANIFEST_HREF);\n link(doc, 'apple-touch-icon', VERSE_MOBILE_TOUCH_ICON_HREF);\n meta(doc, 'apple-mobile-web-app-capable', 'yes');\n meta(doc, 'mobile-web-app-capable', 'yes');\n // Content runs under the status bar; the shell pads by env(safe-area-inset-top).\n meta(doc, 'apple-mobile-web-app-status-bar-style', 'black-translucent');\n meta(doc, 'apple-mobile-web-app-title', 'Verse');\n meta(doc, 'theme-color', THEME_COLORS.light, { media: '(prefers-color-scheme: light)' });\n meta(doc, 'theme-color', THEME_COLORS.dark, { media: '(prefers-color-scheme: dark)' });\n // Phone numbers and dates in agent output are not links to dial.\n meta(doc, 'format-detection', 'telephone=no');\n}\n\nexport type ServiceWorkerOutcome = 'registered' | 'unsupported' | 'failed';\n\n/**\n * Register the shell cache. Never throws and never blocks the app: a phone\n * with no worker (private mode, an http:// tunnel that is not localhost) is\n * the same app minus the offline screen.\n */\nexport async function registerMobileServiceWorker(\n nav: Pick<Navigator, 'serviceWorker'> | undefined = typeof navigator === 'undefined' ? undefined : navigator,\n): Promise<ServiceWorkerOutcome> {\n const container = nav?.serviceWorker;\n if (!container || typeof container.register !== 'function') return 'unsupported';\n try {\n await container.register(VERSE_MOBILE_SW_URL, { scope: VERSE_MOBILE_SW_SCOPE, type: 'classic', updateViaCache: 'none' });\n return 'registered';\n } catch {\n return 'failed';\n }\n}\n\n/** Whether the app is running from the home screen (no browser chrome). */\nexport function isStandalone(win: Window = window): boolean {\n const iosStandalone = (win.navigator as Navigator & { standalone?: boolean }).standalone === true;\n return iosStandalone || (typeof win.matchMedia === 'function' && win.matchMedia('(display-mode: standalone)').matches);\n}\n\n/** This gateway's push sender accepts Apple Web Push subscriptions only. */\nexport function supportsIphoneHomeScreenPush(\n nav: Navigator = navigator,\n win: Window = window,\n): boolean {\n return (nav as Navigator & { standalone?: boolean }).standalone === true\n && 'serviceWorker' in nav && 'PushManager' in win && 'Notification' in win;\n}\n\n/** Only called from an explicit tap after the paired gateway advertises push. */\nexport async function enableRemotePush(publicKey: string): Promise<PushSubscription> {\n if (!supportsIphoneHomeScreenPush()) {\n throw new Error('Notifications require Verse installed on an iPhone Home Screen with Web Push support.');\n }\n if (Notification.permission === 'denied') throw new Error('Notifications are blocked in this phone’s settings.');\n const permission = Notification.permission === 'granted' ? 'granted' : await Notification.requestPermission();\n if (permission !== 'granted') throw new Error('Notification permission was not granted.');\n const normalized = publicKey.replace(/-/g, '+').replace(/_/g, '/');\n const decoded = atob(normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '='));\n const key = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i += 1) key[i] = decoded.charCodeAt(i);\n const registration = await navigator.serviceWorker.ready;\n const existing = await registration.pushManager.getSubscription();\n return existing ?? registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e}from"./global-w7KDTTi0.js";var t={key:`dashboard-snapshot`,fetch:t=>e(`/api/snapshot`,t)},n={key:`control-snapshot`,fetch:t=>e(`/api/control`,t)},r={key:`agent-os-snapshot`,fetch:t=>e(`/api/agent-os`,t)},i={key:`universe-overview`,fetch:t=>e(`/api/universe`,t)};function a(t){return{key:`universe-graph-${t}`,fetch:n=>e(`/api/universe/graph?universeId=${encodeURIComponent(t)}`,n)}}var o={key:`runs`,fetch:t=>e(`/api/runs`,t)};function s(t){return{key:`run-detail-${t}`,fetch:n=>e(`/api/run/${encodeURIComponent(t)}`,n)}}var c={key:`swarms`,fetch:t=>e(`/api/swarms`,t)};function l(t){return{key:`swarm-detail-${t}`,fetch:n=>e(`/api/swarm/${encodeURIComponent(t)}`,n)}}var u={key:`daemon`,fetch:t=>e(`/api/daemon-observation`,t)},d={key:`fleet`,fetch:t=>e(`/api/fleet`,t)},f={key:`fleet-activity`,fetch:t=>e(`/api/fleet-activity`,t)},p={key:`goals`,fetch:t=>e(`/api/goals`,t)},m={key:`vision-mission`,fetch:t=>e(`/api/vision/mission`,t)},h={key:`inbox`,fetch:t=>e(`/api/inbox`,t)};function g(t={}){let n=new URLSearchParams;t.status!==void 0&&n.set(`status`,t.status),t.since!==void 0&&n.set(`since`,t.since),t.limit!==void 0&&n.set(`limit`,String(t.limit));let r=n.toString();return{key:`inbox-list:${t.status??`pending`}:${t.since??``}:${t.limit??``}`,fetch:t=>e(`/api/inbox${r?`?${r}`:``}`,t)}}function _(t){return{key:`proposal-detail-${t}`,fetch:n=>e(`/api/inbox/${encodeURIComponent(t)}`,n)}}var v={key:`control-logs-observation`,fetch:t=>e(`/api/logs-observation?tail=200`,t)};function y(t){return{key:`pulse-${t}`,fetch:n=>e(`/api/pulse?window=${t}`,n)}}function b(e){return typeof e==`object`&&!!e&&`entry`in e&&`score`in e}function x(t){let n=t.trim();return{key:n?`genome-search-${n}`:`genome-list`,fetch:t=>e(n?`/api/genome?q=${encodeURIComponent(n)}`:`/api/genome`,t)}}function S(t){return{key:`models-${t}`,fetch:n=>e(`/api/models?window=${t}`,n)}}var C={key:`portfolio`,fetch:t=>e(`/api/portfolio`,t)};export{m as C,i as S,s as _,t as a,c as b,x as c,h as d,b as f,y as g,_ as h,u as i,p as l,C as m,v as n,f as o,S as p,n as r,d as s,r as t,g as u,o as v,a as x,l as y};
|
|
2
|
+
//# sourceMappingURL=queries-PgZlvFqO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries-PgZlvFqO.js","names":[],"sources":["../../../../../../src/web-ui/data/queries.ts"],"sourcesContent":["/**\n * data/queries.ts — one typed accessor per backend resource. Each pairs a\n * stable cache key (also the SSE invalidation target — see sse.ts's\n * EVENT_TO_CACHE_KEYS) with the exact GET call and response type. Views\n * never call apiGet directly; they call these through useQuery (hooks.ts)\n * so caching, de-dupe, and SSE-driven refresh are automatic.\n */\nimport { apiGet } from './client.js';\nimport type { UniverseGraph } from '../../core/universe/graph-types.js';\nimport type {\n AgentOsSnapshotResponse,\n UniverseOverview,\n ControlLogEntry,\n ControlSnapshot,\n DashboardSnapshot,\n DecisionEntry,\n FleetActivitySnapshot,\n FleetStatus,\n Proposal,\n ProposalStatus,\n PublicDaemonObservation,\n RunState,\n SwarmRun,\n ActivityRollup,\n GenomeEntry,\n RecallHit,\n PortfolioSummary,\n ModelStatsReadResult,\n} from './api-types.js';\nimport type { SourceQuality } from './api-types.js';\n\nexport interface QueryDef<T> {\n key: string;\n fetch: (signal?: AbortSignal) => Promise<T>;\n}\n\nexport const dashboardSnapshotQuery: QueryDef<DashboardSnapshot> = {\n key: 'dashboard-snapshot',\n fetch: (signal) => apiGet<DashboardSnapshot>('/api/snapshot', signal),\n};\n\nexport const controlSnapshotQuery: QueryDef<ControlSnapshot> = {\n key: 'control-snapshot',\n fetch: (signal) => apiGet<ControlSnapshot>('/api/control', signal),\n};\n\nexport const agentOsSnapshotQuery: QueryDef<AgentOsSnapshotResponse> = {\n key: 'agent-os-snapshot',\n fetch: (signal) => apiGet<AgentOsSnapshotResponse>('/api/agent-os', signal),\n};\n\nexport const universeOverviewQuery: QueryDef<UniverseOverview> = {\n key: 'universe-overview',\n fetch: (signal) => apiGet<UniverseOverview>('/api/universe', signal),\n};\n\n/** Read only on demand; never invalidate this alongside the overview poll. */\nexport function universeGraphQuery(universeId: string): QueryDef<UniverseGraph> {\n return {\n key: `universe-graph-${universeId}`,\n fetch: (signal) => apiGet<UniverseGraph>(`/api/universe/graph?universeId=${encodeURIComponent(universeId)}`, signal),\n };\n}\n\n// NOTE: there is no standalone GET /api/visibility route — VisibilitySnapshot\n// is an optional field on DashboardSnapshot (`.visibility`), populated by\n// buildSnapshot() server-side. Read it off dashboardSnapshotQuery's data\n// rather than issuing a second request for it.\n\n/**\n * GET /api/runs returns the bare array (see src/core/web/api.ts:1121-1125,\n * `listRuns({limit:200})` -> `RunState[]`) — NOT `{runs: [...]}`. The prior\n * `RunSummary`/`runsQuery` pair here was speculative and didn't match the\n * real response shape; it was unused (FleetDashboardView reads its compact\n * run summaries off `DashboardSnapshot['runs']` instead, a different,\n * deliberately-thin shape). Replaced with the real, fully-typed contract.\n */\nexport const runsQuery: QueryDef<RunState[]> = {\n key: 'runs',\n fetch: (signal) => apiGet<RunState[]>('/api/runs', signal),\n};\n\nexport function runDetailQuery(id: string): QueryDef<RunState> {\n return {\n key: `run-detail-${id}`,\n fetch: (signal) => apiGet<RunState>(`/api/run/${encodeURIComponent(id)}`, signal),\n };\n}\n\nexport const swarmsQuery: QueryDef<SwarmRun[]> = {\n key: 'swarms',\n fetch: (signal) => apiGet<SwarmRun[]>('/api/swarms', signal),\n};\n\nexport function swarmDetailQuery(id: string): QueryDef<SwarmRun> {\n return {\n key: `swarm-detail-${id}`,\n fetch: (signal) => apiGet<SwarmRun>(`/api/swarm/${encodeURIComponent(id)}`, signal),\n };\n}\n\n/**\n * Same PublicDaemonObservation the backend embeds at ControlSnapshot.daemonObservation\n * — fetched standalone here because /control/daemon renders a fuller detail page\n * than DaemonPanel's dashboard-compact view and wants the raw observation\n * (including `ticks`) independent of whether the rest of /api/control succeeds.\n * Cache key 'daemon' deliberately matches sse.ts's existing (previously orphaned)\n * `daemon` / `daemon-observation` -> ['daemon'] mapping so this now actually\n * live-updates.\n */\nexport const daemonObservationQuery: QueryDef<PublicDaemonObservation> = {\n key: 'daemon',\n fetch: (signal) => apiGet<PublicDaemonObservation>('/api/daemon-observation', signal),\n};\n\nexport const fleetStatusQuery: QueryDef<FleetStatus> = {\n key: 'fleet',\n fetch: (signal) => apiGet<FleetStatus>('/api/fleet', signal),\n};\n\nexport const fleetActivityQuery: QueryDef<FleetActivitySnapshot> = {\n key: 'fleet-activity',\n fetch: (signal) => apiGet<FleetActivitySnapshot>('/api/fleet-activity', signal),\n};\n\n/**\n * GET /api/goals returns a bare array of ad-hoc per-goal projections built\n * inline in src/core/web/api.ts (`path === '/api/goals'`, ~line 1654) — there\n * is no exported backend type for this shape (unlike every other resource\n * here), so this interface is hand-written to match that handler exactly\n * rather than re-exported. Keep it in sync with api.ts if that handler's\n * shape changes.\n */\nexport interface GoalMilestoneSummary {\n title: string;\n status: string;\n order: number;\n}\n\nexport interface GoalSummary {\n id: string;\n objective: string;\n status: string;\n milestones: GoalMilestoneSummary[];\n progress: {\n fractionDone: number;\n counts: Record<string, number>;\n nextActionableId: string | null;\n };\n}\n\nexport const goalsQuery: QueryDef<GoalSummary[]> = {\n key: 'goals',\n fetch: (signal) => apiGet<GoalSummary[]>('/api/goals', signal),\n};\n\n/**\n * GET /api/vision/mission — buildVisionMissionSnapshot() in src/core/web/api.ts\n * is itself typed `Promise<Record<string, unknown>>` on the backend (no\n * exported interface to import), so this is a narrow hand-written contract\n * covering only the fields the Goals view actually reads: top-level `state`\n * (mirrors the SourceQuality.sourceState vocabulary) and the per-source\n * epistemic breakdown under `sources`. `briefing`/`preview`/`shadow` are\n * deliberately left as `unknown` — the view does not render briefing prose.\n */\nexport interface VisionMissionSourceStatus {\n sourceState: 'healthy' | 'degraded' | 'missing' | 'unknown';\n sourcePresent?: boolean;\n complete: boolean;\n reason?: string;\n}\n\nexport interface VisionMissionSnapshot {\n schemaVersion: number;\n state: string;\n authority: string;\n briefing: unknown;\n sources: {\n briefing: VisionMissionSourceStatus | null;\n goals: VisionMissionSourceStatus | null;\n enrollment: VisionMissionSourceStatus | null;\n proposals: VisionMissionSourceStatus | null;\n };\n}\n\nexport const visionMissionQuery: QueryDef<VisionMissionSnapshot> = {\n key: 'vision-mission',\n fetch: (signal) => apiGet<VisionMissionSnapshot>('/api/vision/mission', signal),\n};\n\nexport interface InboxProposal {\n id: string;\n title: string;\n kind: string;\n repo: string;\n origin: string;\n createdAt: string;\n}\n\nexport const inboxQuery: QueryDef<{ pending: number; proposals: InboxProposal[] }> = {\n key: 'inbox',\n fetch: (signal) => apiGet('/api/inbox', signal),\n};\n\n/**\n * `?status=&since=&limit=` view over GET /api/inbox (src/core/web/api.ts\n * INBOX_STATUS_QUERY_VALUES) — the history surface `inboxQuery` above never\n * had: it's hardcoded pending-only. `status: undefined` = server default\n * (pending); `'all'` = every status. Keyed per filter combo so switching\n * status/since/limit doesn't fight over one cache entry, and so sse.ts can\n * sweep every live combo (`invalidatePrefix('inbox-list:')`) on the 'inbox'\n * SSE event without knowing which combos are mounted.\n */\nexport type InboxHistoryStatus = ProposalStatus | 'all';\n\nexport interface InboxListFilters {\n status?: InboxHistoryStatus;\n /** ISO timestamp or YYYY-MM-DD, passed straight through to the server. */\n since?: string;\n limit?: number;\n}\n\nexport interface InboxListResponse {\n pending: number;\n total: number;\n /**\n * Full `Proposal[]`, not the narrow `InboxProposal` shape above — the\n * server has always sent full sanitized Proposal records here\n * (`listProposals()`); `InboxProposal` just under-typed it for the\n * original pending-badge use case. The history view needs `status` and\n * `decisionReason` per row (triage: \"why was this rejected\") without an\n * N+1 decisions-ledger read per row, and both live directly on Proposal.\n */\n proposals: Proposal[];\n /** True when more rows matched than were returned (hit the server cap). */\n truncated: boolean;\n filters: { status: InboxHistoryStatus; since: string | null; limit: number | null };\n}\n\nexport function inboxListQuery(filters: InboxListFilters = {}): QueryDef<InboxListResponse> {\n const params = new URLSearchParams();\n if (filters.status !== undefined) params.set('status', filters.status);\n if (filters.since !== undefined) params.set('since', filters.since);\n if (filters.limit !== undefined) params.set('limit', String(filters.limit));\n const qs = params.toString();\n return {\n key: `inbox-list:${filters.status ?? 'pending'}:${filters.since ?? ''}:${filters.limit ?? ''}`,\n fetch: (signal) => apiGet<InboxListResponse>(`/api/inbox${qs ? `?${qs}` : ''}`, signal),\n };\n}\n\n/**\n * Evidence behind a judge's verdict for one proposal — joined server-side\n * (src/core/web/api.ts GET /api/inbox/:id) from the decisions ledger, which\n * is the ONLY place `judgeReasonCode` lives (Proposal itself never carries\n * it). `judge-parse-failure`/`judge-network-failure` are infra failures,\n * never a considered `judge-review` — render them distinctly, never folded\n * together. When the ledger read is degraded or no row matches this\n * proposal, `sourceQuality` says so; render \"unknown\" via <Epistemic/>\n * rather than treating an empty `decisions` array as \"never judged\".\n */\nexport interface InboxDecisionEvidence {\n sourceQuality: SourceQuality;\n decisions: DecisionEntry[];\n}\n\n/**\n * GET /api/inbox/:id — full proposal detail including diff/taste/verdict\n * (src/core/web/api.ts:1240-1255, `loadProposal(id)`) plus `decisionEvidence`\n * (readDecisionsDetailed({proposalId}), added alongside the inbox history\n * view). Used by the work journal's \"why did it do that\" drill-in (M416) —\n * `/api/inbox` only ever returns pending proposals, but a decided\n * proposal's id (surfaced via fleet-activity's recentMerges/recentActions,\n * or via inboxListQuery's history view) still resolves here as long as its\n * on-disk record hasn't been pruned.\n */\nexport function proposalDetailQuery(id: string): QueryDef<Proposal & { decisionEvidence: InboxDecisionEvidence }> {\n return {\n key: `proposal-detail-${id}`,\n fetch: (signal) =>\n apiGet<Proposal & { decisionEvidence: InboxDecisionEvidence }>(`/api/inbox/${encodeURIComponent(id)}`, signal),\n };\n}\n\n/**\n * GET /api/logs-observation?tail=200 — the provenance-bearing sibling of\n * GET /api/logs (src/core/web/api.ts:~1543-1560): same daemon tick/merge\n * log, plus `sourceQuality` so a degraded/incomplete log can be rendered\n * honestly via <Epistemic/> instead of silently showing a truncated or\n * stale list as complete. `entries` is `null` when the source itself is not\n * healthy+complete (server-side contract, not a client guess). Used by the\n * work journal (M416) as one of several merged history sources — NOT a\n * substitute for full on-disk history: this is capped at 200 entries\n * server-side and only carries daemon tick/merge/info/dispatch events, not\n * raw run stdout or the ~672 historical proposals living only on disk.\n */\nexport interface ControlLogsObservation {\n entries: ControlLogEntry[] | null;\n sourceQuality: SourceQuality;\n}\n\nexport const controlLogsObservationQuery: QueryDef<ControlLogsObservation> = {\n key: 'control-logs-observation',\n fetch: (signal) => apiGet<ControlLogsObservation>('/api/logs-observation?tail=200', signal),\n};\n\n// ---------------------------------------------------------------------------\n// Intelligence + Portfolio (charts/dataviz work)\n// ---------------------------------------------------------------------------\n\nexport type PulseWindow = '1d' | '7d' | '30d';\n\n/** GET /api/pulse?window= — buildRollup() (src/core/observability/rollup.ts).\n * Parameterized like runDetailQuery/swarmDetailQuery above: a distinct cache\n * key per window so switching windows doesn't fight over one cache entry. */\nexport function pulseQuery(window: PulseWindow): QueryDef<ActivityRollup> {\n return {\n key: `pulse-${window}`,\n fetch: (signal) => apiGet<ActivityRollup>(`/api/pulse?window=${window}`, signal),\n };\n}\n\n/**\n * GET /api/genome[?q=] — src/core/web/api.ts:1189-1201. Two response shapes\n * depending on `q`: empty/absent `q` returns `GenomeEntry[]` (list mode,\n * `loadGenome()`); a non-empty `q` returns `RecallHit[]` (query mode,\n * `recall()`, `{entry, score, method}`). Use `isRecallHit` to discriminate —\n * the view can't know which shape it got from the type alone since both are\n * arrays. Keyed per query string so a debounced search doesn't stomp the\n * browse-mode cache entry.\n */\nexport type GenomeResult = GenomeEntry[] | RecallHit[];\n\nexport function isRecallHit(item: GenomeEntry | RecallHit): item is RecallHit {\n return typeof item === 'object' && item !== null && 'entry' in item && 'score' in item;\n}\n\nexport function genomeQuery(q: string): QueryDef<GenomeResult> {\n const trimmed = q.trim();\n return {\n key: trimmed ? `genome-search-${trimmed}` : 'genome-list',\n fetch: (signal) =>\n apiGet<GenomeResult>(trimmed ? `/api/genome?q=${encodeURIComponent(trimmed)}` : '/api/genome', signal),\n };\n}\n\nexport type ModelStatsWindow = '7d' | '30d' | 'all';\n\n/** GET /api/models?window= — computeModelStatsDetailed() joined per-model\n * economics (src/core/fleet/model-stats.ts). NOTE: a second, dead\n * `/api/models` handler later in api.ts's if-chain (local-model provider\n * probe off ControlSnapshot.models) is unreachable — this one always wins\n * since route matching is first-match. */\nexport function modelsQuery(window: ModelStatsWindow): QueryDef<ModelStatsReadResult & { window: ModelStatsWindow }> {\n return {\n key: `models-${window}`,\n fetch: (signal) => apiGet(`/api/models?window=${window}`, signal),\n };\n}\n\n/**\n * GET /api/portfolio — src/core/web/api.ts:1105-1109. Returns\n * `DashboardSnapshot.portfolio ?? null`: `null` on an older producer or\n * empty enrollment, not an error — render that as an honest \"not available\"\n * state, never as a zeroed chart.\n */\nexport const portfolioQuery: QueryDef<PortfolioSummary | null> = {\n key: 'portfolio',\n fetch: (signal) => apiGet<PortfolioSummary | null>('/api/portfolio', signal),\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-BC5Uslm5.js";var n=e(t(),1),r=[`collapsed`,`expanded`,`hidden`],i={collapsed:`Collapsed`,expanded:`Expanded`,hidden:`Hidden`},a=`ashlr.verse.reasoning.v1`,o=`collapsed`;function s(e){return typeof e==`string`&&r.includes(e)}function c(){try{let e=localStorage.getItem(a);return s(e)?e:o}catch{return o}}var l=null,u=new Set;function d(){return l===null&&(l=c()),l}function f(e){if(s(e)&&e!==d()){l=e;try{localStorage.setItem(a,e)}catch{}for(let e of[...u])e()}}function p(e){return u.add(e),()=>u.delete(e)}function m(){return(0,n.useSyncExternalStore)(p,d,d)}export{m as i,i as n,f as r,r as t};
|
|
2
|
+
//# sourceMappingURL=reasoning-pref-BS0PSZ8d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-pref-BS0PSZ8d.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/reasoning-pref.ts"],"sourcesContent":["/**\n * routes/verse/chat/reasoning-pref.ts — how the transcript shows the model's\n * reasoning (SPEC-310C §2 \"Settings offers Expanded, Collapsed or Hidden\";\n * unit C2 owns the behaviour, C1's Settings ▸ Chat panel renders the control).\n *\n * collapsed (default) a block streams in a three-line window while the\n * model thinks, then folds to \"Thought 12s · ~1.8k tok ▸\";\n * expanded the same stream, but a finished block stays open;\n * hidden no reasoning in the transcript at all — the live status line\n * still says \"Thinking · 12s\", so a long think is never mistaken\n * for a hang.\n *\n * A per-device preference, so it lives in this browser's storage under its\n * own key (the precedent of resources-collapse / chat-panel-sizing: display\n * preferences that are not part of the shell's v3 blob). Framework-free store\n * + one hook; every read and write is try/catch'd because storage can be\n * absent (private window, blocked site data).\n */\nimport { useSyncExternalStore } from 'react';\n\nexport const REASONING_DISPLAYS = ['collapsed', 'expanded', 'hidden'] as const;\nexport type ReasoningDisplay = (typeof REASONING_DISPLAYS)[number];\n\nexport const REASONING_DISPLAY_LABEL: Readonly<Record<ReasoningDisplay, string>> = {\n collapsed: 'Collapsed',\n expanded: 'Expanded',\n hidden: 'Hidden',\n};\n\nexport const REASONING_DISPLAY_KEY = 'ashlr.verse.reasoning.v1';\nexport const DEFAULT_REASONING_DISPLAY: ReasoningDisplay = 'collapsed';\n\nexport function isReasoningDisplay(value: unknown): value is ReasoningDisplay {\n return typeof value === 'string' && (REASONING_DISPLAYS as readonly string[]).includes(value);\n}\n\nfunction read(): ReasoningDisplay {\n try {\n const raw = localStorage.getItem(REASONING_DISPLAY_KEY);\n return isReasoningDisplay(raw) ? raw : DEFAULT_REASONING_DISPLAY;\n } catch {\n return DEFAULT_REASONING_DISPLAY;\n }\n}\n\nlet current: ReasoningDisplay | null = null;\nconst listeners = new Set<() => void>();\n\nexport function getReasoningDisplay(): ReasoningDisplay {\n if (current === null) current = read();\n return current;\n}\n\nexport function setReasoningDisplay(next: ReasoningDisplay): void {\n if (!isReasoningDisplay(next) || next === getReasoningDisplay()) return;\n current = next;\n try {\n localStorage.setItem(REASONING_DISPLAY_KEY, next);\n } catch {\n /* the choice still holds for this page */\n }\n for (const listener of [...listeners]) listener();\n}\n\nexport function subscribeReasoningDisplay(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Test seam: forget the in-memory value so the next read re-reads storage. */\nexport function resetReasoningDisplay(): void {\n current = null;\n for (const listener of [...listeners]) listener();\n}\n\nexport function useReasoningDisplay(): ReasoningDisplay {\n return useSyncExternalStore(subscribeReasoningDisplay, getReasoningDisplay, getReasoningDisplay);\n}\n"],"mappings":"0GAoBa,EAAqB,CAAC,YAAa,WAAY,QAAQ,EAGvD,EAAsE,CACjF,UAAW,YACX,SAAU,WACV,OAAQ,QACV,EAEa,EAAwB,2BACxB,EAA8C,YAE3D,SAAgB,EAAmB,EAA2C,CAC5E,OAAO,OAAO,GAAU,UAAa,EAAyC,SAAS,CAAK,CAC9F,CAEA,SAAS,GAAyB,CAChC,GAAI,CACF,IAAM,EAAM,aAAa,QAAQ,CAAqB,EACtD,OAAO,EAAmB,CAAG,EAAI,EAAM,CACzC,MAAQ,CACN,OAAO,CACT,CACF,CAEA,IAAI,EAAmC,KACjC,EAAY,IAAI,IAEtB,SAAgB,GAAwC,CAEtD,OADI,IAAY,OAAM,EAAU,EAAK,GAC9B,CACT,CAEA,SAAgB,EAAoB,EAA8B,CAC5D,GAAC,EAAmB,CAAI,GAAK,IAAS,EAAoB,EAC9D,GAAU,EACV,GAAI,CACF,aAAa,QAAQ,EAAuB,CAAI,CAClD,MAAQ,CAER,CACA,IAAK,IAAM,IAAY,CAAC,GAAG,CAAS,EAAG,EAAS,CANtC,CAOZ,CAEA,SAAgB,EAA0B,EAAkC,CAE1E,OADA,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC,CAQA,SAAgB,GAAwC,CACtD,OAAA,EAAO,EAAA,qBAAA,CAAqB,EAA2B,EAAqB,CAAmB,CACjG"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/global-1SED_aTT.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./index-BC5Uslm5.js";import{t}from"./global-w7KDTTi0.js";var n=class extends Error{status;constructor(e,t=null){super(e),this.status=t,this.name=`RemoteClientError`}},r=null,i=0;function a(e){if(e!==void 0&&e!==i)throw new n(`The phone session changed. Try again.`)}function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e){if(!o(e)||typeof e.authenticated!=`boolean`||typeof e.csrfToken!=`string`||e.csrfToken.length<16||e.csrfToken.length>256||!o(e.capabilities)||e.capabilities.writes!==!0&&e.capabilities.writes!==!1)throw new n(`The phone session answer was incomplete. Nothing was sent.`);if(!e.authenticated)return{authenticated:!1,csrfToken:e.csrfToken,capabilities:{writes:!1,pairing:e.capabilities.pairing===!0,push:e.capabilities.push===!0}};let t=e.scopes;if(typeof e.deviceId!=`string`||!e.deviceId||typeof e.label!=`string`||!o(t)||t.read!==!0||typeof t.act!=`boolean`||typeof e.expiresAt!=`number`||!Number.isFinite(e.expiresAt)||e.expiresAt<=Date.now())throw new n(`The paired device session could not be verified. Nothing was sent.`);return{authenticated:!0,csrfToken:e.csrfToken,capabilities:{writes:e.capabilities.writes===!0,pairing:e.capabilities.pairing===!0,push:e.capabilities.push===!0},deviceId:e.deviceId,label:e.label,scopes:{read:!0,act:t.act},expiresAt:e.expiresAt}}async function c(t,s){if(a(s),t.type===`opaqueredirect`||t.status>=300&&t.status<400||t.headers.get(`content-type`)?.includes(`text/html`))throw r=null,i+=1,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-w7KDTTi0.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired(),new n(`Cloudflare Access sign-in expired. Reload this page to sign in again.`,401);if(t.status===401)throw r=null,i+=1,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-w7KDTTi0.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired(),new n(`Phone sign-in expired. Reload to sign in again.`,401);let c;try{c=await t.json()}catch{throw new n(`The phone gateway did not return JSON.`,t.status)}if(a(s),!t.ok)throw new n(o(c)&&typeof c.error==`string`?c.error.slice(0,240):`The phone gateway refused the request.`,t.status);return c}async function l(e,t){return c(await fetch(e,{method:`GET`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`}),t)}async function u(n,a){let o=i,s=await fetch(n,{method:`GET`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`,signal:a});if(s.type===`opaqueredirect`||s.status>=300&&s.status<400||s.headers.get(`content-type`)?.includes(`text/html`))throw o===i&&(r=null,i+=1,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-w7KDTTi0.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired()),new t(`Cloudflare Access sign-in expired. Reload to sign in again.`,401,n);if(s.status===401)throw o===i&&(r=null,i+=1,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-w7KDTTi0.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired()),new t(`Phone session expired.`,401,n);if(!s.ok){let e=null,r=null;try{let t=await s.json();typeof t.error==`string`&&(e=t.error),typeof t.code==`string`&&(r=t.code)}catch{}throw new t(`GET ${n} failed (HTTP ${s.status}).`,s.status,n,e,r)}return await s.json()}async function d(e,t,o,s){let l=o??i;a(l);let u=s??r?.csrfToken;if(!u)throw new n(`Connect this phone to the gateway before continuing.`);let d=await fetch(e,{method:`POST`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`,headers:{"Content-Type":`application/json`,"x-ashlr-remote-csrf":u},body:JSON.stringify(t??{})});return d.status===204?(a(l),null):c(d,l)}async function f(e,t){let i=t??r?.csrfToken;if(!i)throw new n(`Connect this phone to the gateway before continuing.`);let a=await fetch(e,{method:`DELETE`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`,headers:{"x-ashlr-remote-csrf":i}});if(a.status!==204)throw new n(`The Mac could not remove this phone’s push subscription.`,a.status)}async function p(){let e=++i;try{let t=s(await l(`/remote/session`,e));return a(e),r=t,t}catch(t){throw e===i&&(r=null),t}}function m(){return r?.authenticated===!0&&r.scopes?.act===!0&&r.capabilities.writes&&typeof r.expiresAt==`number`&&Date.now()+5e3<r.expiresAt}function h(){return r}function g(e){if(!o(e)||typeof e.challengeId!=`string`||!e.challengeId||!o(e.options)||typeof e.options.challenge!=`string`)throw new n(`The passkey challenge was incomplete. Nothing was sent.`);return{challengeId:e.challengeId,options:e.options}}async function _(t,r){let i=await d(`/remote/pair/claim`,{code:t.trim(),label:r.trim()});if(!o(i)||typeof i.pendingId!=`string`||!i.pendingId||!o(i.options)||typeof i.options.challenge!=`string`)throw new n(`The pairing challenge was incomplete. Nothing was sent.`);let{startRegistration:a}=await e(async()=>{let{startRegistration:e}=await import(`./esm-BFCrCNMJ.js`);return{startRegistration:e}},[]),s=await a({optionsJSON:i.options}),c=await d(`/remote/pair/complete`,{pendingId:i.pendingId,response:s});if(!o(c)||c.pendingApproval!==!0)throw new n(`Pairing still needs approval on your Mac.`);return{pendingId:i.pendingId}}async function v(e){let t=await l(`/remote/pair/status?pendingId=${encodeURIComponent(e)}`);if(!o(t)||t.state!==`pending`&&t.state!==`approved`&&t.state!==`denied`)throw new n(`The pairing status was incomplete.`);if(t.state===`approved`){if(typeof t.deviceId!=`string`||!t.deviceId)throw new n(`The approved device ID was missing.`);return{state:`approved`,deviceId:t.deviceId}}return{state:t.state}}async function y(t){let o=++i,c=g(await d(`/remote/auth/begin`,{deviceId:t},o)),{startAuthentication:l}=await e(async()=>{let{startAuthentication:e}=await import(`./esm-BFCrCNMJ.js`);return{startAuthentication:e}},[]),u=await l({optionsJSON:c.options}),f=s(await d(`/remote/auth/finish`,{challengeId:c.challengeId,response:u},o));if(a(o),!f.authenticated||f.deviceId!==t)throw new n(`The passkey sign-in did not complete.`);return r=f,f}async function b(){let e=r,t=++i;r=null;try{if(e?.authenticated&&e.capabilities.push)try{await f(`/remote/push/subscribe`,e.csrfToken)}catch{}await d(`/remote/logout`,{},void 0,e?.csrfToken)}finally{t===i&&(r=null)}}async function x(e){if(r?.authenticated!==!0||r.capabilities.push!==!0)throw new n(`Phone notifications are not enabled by this gateway.`);await d(`/remote/push/subscribe`,e.toJSON())}async function S(){if(r?.authenticated!==!0||r.capabilities.push!==!0)throw new n(`Phone notifications are not enabled by this gateway.`);let e=await l(`/remote/push/config`);if(!o(e)||typeof e.publicKey!=`string`||!/^[A-Za-z0-9_-]{80,120}$/.test(e.publicKey))throw new n(`The gateway push key is unavailable.`);return e.publicKey}async function C(t,i,a){if(!m())throw new n(r?.authenticated&&typeof r.expiresAt==`number`&&r.expiresAt<=Date.now()+5e3?`The phone session is refreshing. No action was sent.`:`This gateway is read-only. No action was sent.`);if(t===`POST`&&w(i))return await d(i,a);let o={method:t,path:i,body:JSON.stringify(a??{})},s=g(await d(`/remote/step-up/begin`,o)),{startAuthentication:c}=await e(async()=>{let{startAuthentication:e}=await import(`./esm-BFCrCNMJ.js`);return{startAuthentication:e}},[]),l=await c({optionsJSON:s.options});return await d(`/remote/step-up/finish`,{...o,challengeId:s.challengeId,response:l})}function w(e){return e===`/api/verse/activity/seen`||e===`/api/verse/sessions`||e===`/api/verse/leader/thread`||e===`/api/verse/leader/directives`||/^\/api\/verse\/sessions\/[^/?#]+\/turns$/.test(e)||/^\/api\/verse\/queue\/[^/?#]+$/.test(e)||/^\/api\/verse\/leader\/questions\/[^/?#]+\/answer$/.test(e)||/^\/api\/verse\/(cloud|devin)\/tasks\/[^/?#]+\/dismiss$/.test(e)}export{n as RemoteClientError,y as authenticateRemoteDevice,_ as claimRemotePairing,h as currentRemoteSession,b as logoutRemoteDevice,p as probeRemoteSession,u as remoteApiGet,C as remoteMutate,v as remotePairStatus,S as remotePushPublicKey,x as subscribeRemotePush};
|
|
3
|
+
//# sourceMappingURL=remote-session-Bu-dtRcS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/data/remote-session.ts"],"sourcesContent":["/** Cookie-bound phone session. No Hub read or mutation token enters this module. */\nimport type {\n PublicKeyCredentialCreationOptionsJSON,\n PublicKeyCredentialRequestOptionsJSON,\n} from '@simplewebauthn/browser';\nimport { ApiError } from './client.js';\n\nexport interface RemoteSession {\n authenticated: boolean;\n csrfToken: string;\n capabilities: { writes: boolean; pairing: boolean; push: boolean };\n deviceId?: string;\n label?: string;\n scopes?: { read: boolean; act: boolean };\n expiresAt?: number;\n}\n\nexport class RemoteClientError extends Error {\n constructor(message: string, readonly status: number | null = null) {\n super(message);\n this.name = 'RemoteClientError';\n }\n}\n\nlet session: RemoteSession | null = null;\n// Superseded checks and passkey requests cannot restore a signed-out session.\nlet sessionRevision = 0;\n\nfunction assertCurrent(revision: number | undefined): void {\n if (revision !== undefined && revision !== sessionRevision) {\n throw new RemoteClientError('The phone session changed. Try again.');\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction parseSession(value: unknown): RemoteSession {\n if (!record(value) || typeof value.authenticated !== 'boolean'\n || typeof value.csrfToken !== 'string' || value.csrfToken.length < 16 || value.csrfToken.length > 256\n || !record(value.capabilities) || value.capabilities.writes !== true && value.capabilities.writes !== false) {\n throw new RemoteClientError('The phone session answer was incomplete. Nothing was sent.');\n }\n if (!value.authenticated) return {\n authenticated: false, csrfToken: value.csrfToken,\n capabilities: { writes: false, pairing: value.capabilities.pairing === true, push: value.capabilities.push === true },\n };\n const scopes = value.scopes;\n if (typeof value.deviceId !== 'string' || !value.deviceId || typeof value.label !== 'string'\n || !record(scopes) || scopes.read !== true || typeof scopes.act !== 'boolean'\n || typeof value.expiresAt !== 'number' || !Number.isFinite(value.expiresAt) || value.expiresAt <= Date.now()) {\n throw new RemoteClientError('The paired device session could not be verified. Nothing was sent.');\n }\n return {\n authenticated: true, csrfToken: value.csrfToken,\n capabilities: { writes: value.capabilities.writes === true, pairing: value.capabilities.pairing === true, push: value.capabilities.push === true },\n deviceId: value.deviceId, label: value.label, scopes: { read: true, act: scopes.act }, expiresAt: value.expiresAt,\n };\n}\n\nasync function jsonResponse(res: Response, revision?: number): Promise<unknown> {\n assertCurrent(revision);\n if (res.type === 'opaqueredirect' || res.status >= 300 && res.status < 400\n || res.headers.get('content-type')?.includes('text/html')) {\n session = null;\n sessionRevision += 1;\n (await import('./auth-store.js')).reportSessionExpired();\n throw new RemoteClientError('Cloudflare Access sign-in expired. Reload this page to sign in again.', 401);\n }\n if (res.status === 401) {\n session = null;\n sessionRevision += 1;\n (await import('./auth-store.js')).reportSessionExpired();\n throw new RemoteClientError('Phone sign-in expired. Reload to sign in again.', 401);\n }\n let value: unknown;\n try { value = await res.json(); } catch { throw new RemoteClientError('The phone gateway did not return JSON.', res.status); }\n assertCurrent(revision);\n if (!res.ok) {\n const message = record(value) && typeof value.error === 'string' ? value.error.slice(0, 240) : 'The phone gateway refused the request.';\n throw new RemoteClientError(message, res.status);\n }\n return value;\n}\n\nasync function remoteGet(path: string, revision?: number): Promise<unknown> {\n const res = await fetch(path, { method: 'GET', credentials: 'same-origin', cache: 'no-store', redirect: 'manual' });\n return jsonResponse(res, revision);\n}\n\n/** Remote API reads use only the paired cookie; Access HTML/redirect locks UI. */\nexport async function remoteApiGet<T>(path: string, signal?: AbortSignal): Promise<T> {\n const revision = sessionRevision;\n const res = await fetch(path, { method: 'GET', credentials: 'same-origin', cache: 'no-store', redirect: 'manual', signal });\n if (res.type === 'opaqueredirect' || res.status >= 300 && res.status < 400\n || res.headers.get('content-type')?.includes('text/html')) {\n if (revision === sessionRevision) {\n session = null;\n sessionRevision += 1;\n (await import('./auth-store.js')).reportSessionExpired();\n }\n throw new ApiError('Cloudflare Access sign-in expired. Reload to sign in again.', 401, path);\n }\n if (res.status === 401) {\n if (revision === sessionRevision) {\n session = null;\n sessionRevision += 1;\n (await import('./auth-store.js')).reportSessionExpired();\n }\n throw new ApiError('Phone session expired.', 401, path);\n }\n if (!res.ok) {\n let detail: string | null = null;\n let code: string | null = null;\n try {\n const value = await res.json() as { error?: unknown; code?: unknown };\n if (typeof value.error === 'string') detail = value.error;\n if (typeof value.code === 'string') code = value.code;\n } catch { /* a non-JSON refusal */ }\n throw new ApiError(`GET ${path} failed (HTTP ${res.status}).`, res.status, path, detail, code);\n }\n return await res.json() as T;\n}\n\nasync function remotePost(path: string, body: unknown, revision?: number, csrfOverride?: string): Promise<unknown> {\n const expected = revision ?? sessionRevision;\n assertCurrent(expected);\n const csrf = csrfOverride ?? session?.csrfToken;\n if (!csrf) throw new RemoteClientError('Connect this phone to the gateway before continuing.');\n const res = await fetch(path, {\n method: 'POST', credentials: 'same-origin', cache: 'no-store', redirect: 'manual',\n headers: { 'Content-Type': 'application/json', 'x-ashlr-remote-csrf': csrf },\n body: JSON.stringify(body ?? {}),\n });\n if (res.status === 204) { assertCurrent(expected); return null; }\n return jsonResponse(res, expected);\n}\n\nasync function remoteDelete(path: string, csrfOverride?: string): Promise<void> {\n const csrf = csrfOverride ?? session?.csrfToken;\n if (!csrf) throw new RemoteClientError('Connect this phone to the gateway before continuing.');\n const res = await fetch(path, {\n method: 'DELETE', credentials: 'same-origin', cache: 'no-store', redirect: 'manual',\n headers: { 'x-ashlr-remote-csrf': csrf },\n });\n if (res.status !== 204) throw new RemoteClientError('The Mac could not remove this phone’s push subscription.', res.status);\n}\n\n/** A fresh cookie and CSRF token come from the gateway, never browser storage. */\nexport async function probeRemoteSession(): Promise<RemoteSession> {\n const revision = ++sessionRevision;\n try {\n const next = parseSession(await remoteGet('/remote/session', revision));\n assertCurrent(revision);\n session = next;\n return next;\n } catch (error) {\n if (revision === sessionRevision) session = null;\n throw error;\n }\n}\n\nexport function canRemoteWrite(): boolean {\n return session?.authenticated === true && session.scopes?.act === true && session.capabilities.writes\n && typeof session.expiresAt === 'number' && Date.now() + 5_000 < session.expiresAt;\n}\n\nexport function currentRemoteSession(): RemoteSession | null { return session; }\n\nexport function clearRemoteSessionForTest(): void { session = null; sessionRevision += 1; }\n\nfunction challenge(value: unknown): { challengeId: string; options: PublicKeyCredentialRequestOptionsJSON } {\n if (!record(value) || typeof value.challengeId !== 'string' || !value.challengeId || !record(value.options)\n || typeof value.options.challenge !== 'string') {\n throw new RemoteClientError('The passkey challenge was incomplete. Nothing was sent.');\n }\n return { challengeId: value.challengeId, options: value.options as unknown as PublicKeyCredentialRequestOptionsJSON };\n}\n\nexport async function claimRemotePairing(code: string, label: string): Promise<{ pendingId: string }> {\n const started = await remotePost('/remote/pair/claim', { code: code.trim(), label: label.trim() });\n if (!record(started) || typeof started.pendingId !== 'string' || !started.pendingId || !record(started.options)\n || typeof started.options.challenge !== 'string') {\n throw new RemoteClientError('The pairing challenge was incomplete. Nothing was sent.');\n }\n const { startRegistration } = await import('@simplewebauthn/browser');\n const response = await startRegistration({ optionsJSON: started.options as unknown as PublicKeyCredentialCreationOptionsJSON });\n const completed = await remotePost('/remote/pair/complete', { pendingId: started.pendingId, response });\n if (!record(completed) || completed.pendingApproval !== true) {\n throw new RemoteClientError('Pairing still needs approval on your Mac.');\n }\n return { pendingId: started.pendingId };\n}\n\nexport async function remotePairStatus(pendingId: string): Promise<{ state: 'pending' | 'approved' | 'denied'; deviceId?: string }> {\n const value = await remoteGet(`/remote/pair/status?pendingId=${encodeURIComponent(pendingId)}`);\n if (!record(value) || value.state !== 'pending' && value.state !== 'approved' && value.state !== 'denied') {\n throw new RemoteClientError('The pairing status was incomplete.');\n }\n if (value.state === 'approved') {\n if (typeof value.deviceId !== 'string' || !value.deviceId) throw new RemoteClientError('The approved device ID was missing.');\n return { state: 'approved', deviceId: value.deviceId };\n }\n return { state: value.state };\n}\n\nexport async function authenticateRemoteDevice(deviceId: string): Promise<RemoteSession> {\n const revision = ++sessionRevision;\n const started = challenge(await remotePost('/remote/auth/begin', { deviceId }, revision));\n const { startAuthentication } = await import('@simplewebauthn/browser');\n const response = await startAuthentication({ optionsJSON: started.options });\n const next = parseSession(await remotePost('/remote/auth/finish', { challengeId: started.challengeId, response }, revision));\n assertCurrent(revision);\n if (!next.authenticated || next.deviceId !== deviceId) throw new RemoteClientError('The passkey sign-in did not complete.');\n session = next;\n return next;\n}\n\nexport async function logoutRemoteDevice(): Promise<void> {\n const previous = session;\n const revision = ++sessionRevision;\n session = null;\n try {\n // Stop this device's generic alerts before dropping the cookie. Failure\n // must not prevent sign-out; Mac-side device revocation is the authority\n // when a lost or offline phone cannot complete either request.\n if (previous?.authenticated && previous.capabilities.push) {\n try { await remoteDelete('/remote/push/subscribe', previous.csrfToken); }\n catch { /* continue with logout even if push is unavailable */ }\n }\n await remotePost('/remote/logout', {}, undefined, previous?.csrfToken);\n } finally {\n // The server may be offline, but this page must immediately lose its\n // in-memory session and act capability. The HttpOnly cookie is only\n // cleared by a successful server response or by Mac-side revocation.\n if (revision === sessionRevision) session = null;\n }\n}\n\n/** Push is dormant until the gateway explicitly advertises and mounts it. */\nexport async function subscribeRemotePush(subscription: PushSubscription): Promise<void> {\n if (session?.authenticated !== true || session.capabilities.push !== true) {\n throw new RemoteClientError('Phone notifications are not enabled by this gateway.');\n }\n await remotePost('/remote/push/subscribe', subscription.toJSON());\n}\n\nexport async function remotePushPublicKey(): Promise<string> {\n if (session?.authenticated !== true || session.capabilities.push !== true) {\n throw new RemoteClientError('Phone notifications are not enabled by this gateway.');\n }\n const value = await remoteGet('/remote/push/config');\n if (!record(value) || typeof value.publicKey !== 'string' || !/^[A-Za-z0-9_-]{80,120}$/.test(value.publicKey)) {\n throw new RemoteClientError('The gateway push key is unavailable.');\n }\n return value.publicKey;\n}\n\n/** A server capability enables this later; stage 3 returns writes:false. */\nexport async function remoteMutate<T>(method: 'POST' | 'DELETE', path: string, body: unknown): Promise<T> {\n if (!canRemoteWrite()) throw new RemoteClientError(session?.authenticated && typeof session.expiresAt === 'number'\n && session.expiresAt <= Date.now() + 5_000\n ? 'The phone session is refreshing. No action was sent.'\n : 'This gateway is read-only. No action was sent.');\n if (method === 'POST' && directCsrfWrite(path)) return await remotePost(path, body) as T;\n const bytes = JSON.stringify(body ?? {});\n const operation = { method, path, body: bytes };\n const started = challenge(await remotePost('/remote/step-up/begin', operation));\n const { startAuthentication } = await import('@simplewebauthn/browser');\n const response = await startAuthentication({ optionsJSON: started.options });\n const result = await remotePost('/remote/step-up/finish', { ...operation, challengeId: started.challengeId, response });\n return result as T;\n}\n\n/** Mirrors only gateway routes classified low-risk; unknown paths step up. */\nexport function directCsrfWrite(path: string): boolean {\n return path === '/api/verse/activity/seen'\n || path === '/api/verse/sessions'\n || path === '/api/verse/leader/thread'\n || path === '/api/verse/leader/directives'\n || /^\\/api\\/verse\\/sessions\\/[^/?#]+\\/turns$/.test(path)\n || /^\\/api\\/verse\\/queue\\/[^/?#]+$/.test(path)\n || /^\\/api\\/verse\\/leader\\/questions\\/[^/?#]+\\/answer$/.test(path)\n || /^\\/api\\/verse\\/(cloud|devin)\\/tasks\\/[^/?#]+\\/dismiss$/.test(path);\n}\n"],"file":"remote-session-Bu-dtRcS.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-BC5Uslm5.js";var n=e(t(),1),r=new Map,i=new Set;function a(){for(let e of[...i])e()}function o(e,t=Date.now()){r=new Map(r).set(e,t),a()}function s(e,t=Date.now()){let n=!1,i=new Map(r);for(let[r,a]of i)(!e.has(r)||t-a>6e4)&&(i.delete(r),n=!0);n&&(r=i,a())}function c(){return(0,n.useSyncExternalStore)(e=>(i.add(e),()=>i.delete(e)),()=>r,()=>r)}export{s as n,c as r,o as t};
|
|
2
|
+
//# sourceMappingURL=resolved-store-UYN2k9My.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolved-store-UYN2k9My.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/resolved-store.ts"],"sourcesContent":["/**\n * routes/verse/shell/resolved-store.ts — which Needs-you items were just\n * acted on, so every list hides them at once (optimistic) until a poll no\n * longer lists them, or 60 s pass.\n *\n * Split out of needs-you-actions.ts, which re-exports all of it, so a\n * surface that only COUNTS what is waiting (the phone app's tab badge, at\n * first paint) does not download the action runner and the row model.\n */\nimport { useSyncExternalStore } from 'react';\n\n/** How long an acted-on item stays hidden while the server catches up. */\nexport const RESOLVED_HIDE_MS = 60_000;\n\nlet resolved = new Map<string, number>();\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\nexport function markResolved(id: string, at: number = Date.now()): void {\n resolved = new Map(resolved).set(id, at);\n emit();\n}\n\n/** Drop marks the server has caught up with (the id is gone) or that are too old. */\nexport function pruneResolved(liveIds: ReadonlySet<string>, now: number = Date.now()): void {\n let changed = false;\n const next = new Map(resolved);\n for (const [id, at] of next) {\n if (!liveIds.has(id) || now - at > RESOLVED_HIDE_MS) {\n next.delete(id);\n changed = true;\n }\n }\n if (changed) {\n resolved = next;\n emit();\n }\n}\n\nexport function useResolvedIds(): ReadonlyMap<string, number> {\n return useSyncExternalStore(\n (l) => {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n () => resolved,\n () => resolved,\n );\n}\n\nexport function resetResolvedForTest(): void {\n resolved = new Map();\n emit();\n}\n"],"mappings":"0GAcI,EAAW,IAAI,IACb,EAAY,IAAI,IAEtB,SAAS,GAAa,CACpB,IAAK,IAAM,IAAK,CAAC,GAAG,CAAS,EAAG,EAAE,CACpC,CAEA,SAAgB,EAAa,EAAY,EAAa,KAAK,IAAI,EAAS,CACtE,EAAW,IAAI,IAAI,CAAQ,CAAC,CAAC,IAAI,EAAI,CAAE,EACvC,EAAK,CACP,CAGA,SAAgB,EAAc,EAA8B,EAAc,KAAK,IAAI,EAAS,CAC1F,IAAI,EAAU,GACR,EAAO,IAAI,IAAI,CAAQ,EAC7B,IAAK,GAAM,CAAC,EAAI,KAAO,GACjB,CAAC,EAAQ,IAAI,CAAE,GAAK,EAAM,EAAA,OAC5B,EAAK,OAAO,CAAE,EACd,EAAU,IAGV,IACF,EAAW,EACX,EAAK,EAET,CAEA,SAAgB,GAA8C,CAC5D,OAAA,EAAO,EAAA,qBAAA,CACJ,IACC,EAAU,IAAI,CAAC,MACF,EAAU,OAAO,CAAC,OAE3B,MACA,CACR,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e,t}from"./global-w7KDTTi0.js";import{H as n,R as r,V as i,s as a}from"./verse-model-DAOz9LrY.js";import{n as o,t as s}from"./capacity-strip-model-CBMJ2U-w.js";import{l as c,t as l}from"./types-IYKrYLku.js";import{o as u}from"./local-model-C9xNi9fN.js";var d=`/api/verse/budget/readiness`,f=new Set([`spent`,`signed-out`,`unavailable`]),p=[[`usable`,`usable`],[`low`,`running low`],[`spent`,`spent`],[`signed-out`,`signed out`],[`unavailable`,`unavailable`]];function m(e,t){let n=e.filter(e=>e.kind===`subscription`).map(e=>s(e,{healthRead:t.healthRead,...t.now===void 0?{}:{now:t.now}}).kind),r=new Map;for(let e of n)r.set(e,(r.get(e)??0)+1);let i=p.filter(([e])=>r.has(e)).map(([e,t])=>`${r.get(e)} ${t}`).join(` · `),a=`unknown`;return n.some(e=>f.has(e))?a=`alert`:n.includes(`low`)?a=`tight`:n.includes(`usable`)&&(a=`ok`),{tone:a,spoken:i||(n.length===0?`no accounts connected`:`not read yet`)}}function h(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function g(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function _(e){return typeof e==`string`&&e.trim().length>0?e.trim():null}var v=`An estimate from the sessions Verse launched — the real balance is on claude.ai.`;function y(e){let t=h(e),n=h(t?.budget);if(!t||!n)return null;let r=g(n.creditsTotalUsd),i=g(n.estimatedSpentUsd),a=g(n.estimatedRemainingUsd);if(r===null||i===null&&a===null)return null;let o=Math.max(0,a??r-(i??0)),s=h(t.seat),c=h(n.canLaunch),u=_(n.balanceUrl),d=h(n.budget);return{totalUsd:r,spentUsd:i??Math.max(0,r-o),remainingUsd:o,remainingPercent:r>0?Math.max(0,Math.min(100,o/r*100)):0,running:Math.max(0,g(n.running)??0),sessionsToday:Math.max(0,g(n.sessionsToday)??0),maxSessionsPerDay:g(d?.maxSessionsPerDay),seatReady:s?.ready!==!1,seatReason:_(s?.reason),canLaunch:c?.ok!==!1,canLaunchReason:_(c?.reason),estimateNote:_(n.estimateNote)??v,balanceUrl:u!==null&&u.startsWith(`https://claude.ai/`)?u:l}}function b(e){let t=Math.max(0,e);return t>=100||Number.isInteger(t)?`$${Math.round(t)}`:`$${t.toFixed(2)}`}var x={"llama-server":`llama-server`,ollama:`Ollama`,vllm:`vLLM`,unknown:`Serving runtime`},S={running:`Running`,starting:`Starting…`,stopping:`Stopping…`,stopped:`Stopped`,unknown:`State not reported`};function C(e){if(!e)return null;let t=[];e.model&&t.push(u(e.model)),e.contextTokens!==null&&t.push(`${a(e.contextTokens)} context per agent`),e.slotsTotal!==null&&e.slotsTotal>0&&t.push(e.slotsBusy===null?`${e.slotsTotal} slots`:`${e.slotsBusy} of ${e.slotsTotal} slots busy`);let n=e.state;return{name:x[e.kind]??x.unknown,state:n,word:S[n]??S.unknown,tone:n===`running`?`success`:n===`starting`||n===`stopping`?`warning`:`neutral`,detail:t.length>0?t.join(` · `):null,canStart:e.supervised&&n===`stopped`,canStop:e.supervised&&n===`running`,managedElsewhere:!e.supervised}}function w(e){let t=e.configuredContext,n=e.nativeContext;return t!==null&&e.contextTruncated&&n!==null?`${a(t)} of ${a(n)} context`:t===null?n===null?null:`${a(n)} context`:`${a(t)} context`}function T(e){if(typeof e!=`string`)return``;try{let t=new URL(e);return t.port?`:${t.port}`:t.host}catch{return``}}function E(e){let t=Array.isArray(e.models)?e.models:[],n=0;for(let e of t){let t=h(e);(t?.state===`loaded`||t?.loaded===!0)&&(n+=1)}return{installed:t.length,loaded:n}}function D(e,t,n){let r=h(n);if(!r)return null;let i=T(r.baseUrl);if(r.reachable!==!0)return{id:e,name:t,tone:`neutral`,word:`Not running`,detail:i?`nothing answering on ${i}`:`nothing answering`};let{installed:a,loaded:o}=E(r),s=r.stale===!0?` · last known`:``;return{id:e,name:t,tone:o>0?`success`:`neutral`,word:`Answering`,detail:`${a} installed · ${o>0?`${o} loaded`:`none loaded`}${s}`}}function O(e){let t=h(e);if(!t)return null;let n=T(t.baseUrl),r=t.status,i=t.reason,a=`llama-server`;if(r===`ok`){let e=typeof t.modelCount==`number`?t.modelCount:null,n=typeof t.slots==`number`?t.slots:null;return{id:`llama-server`,name:a,tone:`success`,word:`Answering`,detail:[e===null?`serving`:`${e} model${e===1?``:`s`} served`,n===null?null:`${n} slots`].filter(e=>e!==null).join(` · `)}}return r===`loading`?{id:`llama-server`,name:a,tone:`warning`,word:`Loading…`,detail:`mapping weights on ${n}`}:r===`error`?{id:`llama-server`,name:a,tone:`danger`,word:`Error`,detail:`answering on ${n} with an error`}:i===`llama-server-timeout`?{id:`llama-server`,name:a,tone:`danger`,word:`Not answering`,detail:`listening on ${n} but not answering — restart it`}:{id:`llama-server`,name:a,tone:`neutral`,word:`Not running`,detail:n?`nothing answering on ${n}`:`nothing answering`}}function k(e){let t=h(e);return t?[D(`ollama`,`Ollama`,t.ollama),D(`lmstudio`,`LM Studio`,t.lmStudio),O(t.llamaServer)].filter(e=>e!==null):[]}function A(e,t=3){let n=[...new Set(e.filter(e=>e.trim().length>0))];if(n.length===0)return null;let r=n.slice(0,t).join(`, `);return n.length>t?`${r} +${n.length-t} more`:r}function j(e){let t=e.models.filter(e=>!e.unavailableReason);return t.length>0?t:e.models.slice(0,1)}function M(e){let t=j(e),n=t[0]?.id??null;return{tier:i(e.engine,n),basis:e.costBasis??r(e.engine,{modelId:n}),models:t.map(e=>e.label),reserve:null}}function N(e){if(e.length===0)return null;let t=e.map(M);return{tier:t.reduce((e,t)=>n(t.tier)<n(e)?t.tier:e,t[0].tier),basis:t[0].basis,models:t.flatMap(e=>e.models),reserve:null}}function P(e){return[...new Set(e.map(e=>M(e).basis))]}function F(e){return[`elite`,`fast`,`free`].map(t=>({tier:t,entries:e.filter(e=>e.tier===t).sort((e,t)=>e.statusRank-t.statusRank||e.marginal-t.marginal||e.index-t.index)})).filter(e=>e.entries.length>0)}function I(e){return o(e===null?`not-checked`:e?`usable`:`unavailable`)}var L={key:`verse-resources-cloud`,fetch:async n=>{try{return{available:!0,credits:y(await e(c,n))}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{available:!1,credits:null}}}},R=`verse-resources-readiness`;function z(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.v===1&&Array.isArray(t.resources)&&typeof t.autonomy==`object`&&t.autonomy!==null}var B={key:R,fetch:async n=>{try{let t=await e(d,n);return{available:!0,value:z(t)?t:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{available:!1,value:null}}}},V={cloud:6e4,local:3e4,runtime:15e3,readiness:3e4};export{b as a,N as c,I as d,C as f,P as i,w as l,m,L as n,F as o,M as p,B as r,k as s,V as t,A as u};
|
|
2
|
+
//# sourceMappingURL=resources-queries-XfQ8w9In.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources-queries-XfQ8w9In.js","names":[],"sources":["../../../../../../src/core/routing/readiness-types.ts","../../../../../../src/web-ui/routes/verse/resources/resources-model.ts","../../../../../../src/web-ui/routes/verse/resources/resources-queries.ts"],"sourcesContent":["/**\n * Per-resource readiness — the wire contract for `GET /api/verse/budget/readiness`\n * (3.14, \"every account ready for chat and the fleet\").\n *\n * One row per resource Mason can spend — each paid account, the local\n * runtimes as ONE resource, and the Claude cloud lane — answering the two\n * questions the Resources drawer (⌘.) exists for:\n *\n * Chat can a NEW chat run on it right now (the session engine's own\n * admission gate, core/verse/seat-readiness.ts)?\n * Fleet would the AUTONOMOUS fleet use it right now — under the installed\n * standing grant, its current rollout stage, the budget mode, the\n * Leader's directives and the capacity snapshot the daemon routes on\n * (~/.ashlr/routing/capacity.json)?\n *\n * Every \"not ready\" carries one plain sentence and, when one exists, the ONE\n * fix: a Verse action (reconnect / check again) or a literal command to run.\n * A command is never a secret and never names a private path beyond `~`.\n *\n * BROWSER-SAFE: type-only imports and constants. The web bundle imports it.\n */\n\nexport const VERSE_RESOURCE_READINESS_PATH = '/api/verse/budget/readiness';\n\nexport type ReadinessFixKind = 'reconnect' | 'check-again' | 'command';\n\nexport interface ReadinessFix {\n kind: ReadinessFixKind;\n /** Button / chip label: \"Reconnect\", \"Check again\", \"Set up the Claude seat\". */\n label: string;\n /** `command` only: the exact line to run in a terminal. */\n command?: string;\n /** `reconnect` / `check-again` only: the seat the action targets. */\n seatId?: string;\n}\n\n/** `ok` ready · `warn` usable with a caveat · `off` intentionally not used · `blocked` needs a fix. */\nexport type ReadinessTone = 'ok' | 'warn' | 'off' | 'blocked';\n\nexport interface ReadinessVerdict {\n ready: boolean;\n tone: ReadinessTone;\n /** Two or three words: \"Ready\", \"Signed out\", \"Not in this stage\". */\n word: string;\n /** One plain sentence (may be empty when `word` says it all). */\n detail: string;\n fix: ReadinessFix | null;\n}\n\nexport interface FleetReadinessVerdict extends ReadinessVerdict {\n /** The grant's roles for this seat (\"producer\", \"judge\", \"leader\"); empty when not granted. */\n roles: string[];\n /** Percent of the binding window kept for Mason; null when not applicable (local, cloud, not granted). */\n reservePercent: number | null;\n}\n\nexport interface ResourceReading {\n /** `live` = a current reading · `last` = only an expired one (see `at`) · `none` = never read here. */\n state: 'live' | 'last' | 'none';\n /** ISO instant of the reading (current or last); null when none. */\n at: string | null;\n /** Plain sentence on WHY there is no live reading; null when live. */\n note: string | null;\n}\n\nexport interface ResourceReadinessRow {\n /** Account id (codex-personal, claude, …), `local`, or `cloud`. */\n id: string;\n label: string;\n /** 3.15: `devin` for the Devin card (built from core/devin's own verdicts). */\n engine: 'claude' | 'codex' | 'grok' | 'local' | 'devin';\n kind: 'subscription' | 'local' | 'cloud';\n reading: ResourceReading;\n chat: ReadinessVerdict;\n fleet: FleetReadinessVerdict;\n}\n\nexport interface ResourceReadinessResponse {\n v: 1;\n checkedAt: string;\n /** Standing autonomy as the fleet sees it. */\n autonomy: {\n active: boolean;\n /** Current rollout stage id (\"shadow\"), when a grant is active. */\n stage: string | null;\n /** \"Stage 1 of 8 · shadow\" or why autonomy is off. */\n detail: string;\n };\n /** When the fleet's capacity snapshot was published; null when there is none. */\n capacitySnapshotAt: string | null;\n resources: ResourceReadinessRow[];\n}\n","/**\n * routes/verse/resources/resources-model.ts — what the Resources drawer says,\n * projected from reads other units already own (unit 3.11 C6). Pure: no\n * React, no I/O.\n *\n * Nothing about a seat is worded here. Every account line comes from C6's\n * capacity projection (usage/capacity-strip-model.ts: `accountStatus`,\n * `orderAccountRows`), so the drawer, Apps & Accounts and the rail ring can\n * never describe one seat two ways. What IS new here:\n *\n * - the edge handle's one-dot summary across the paid accounts;\n * - the cloud lane's overview (GET /api/verse/cloud), narrowed field by\n * field — the route is landing in parallel, so a missing or drifted body\n * reads as \"not available yet\", never as a crash or a zero;\n * - short sentences for the serving runtime and each local model's context.\n */\nimport { CLOUD_BALANCE_URL, type CloudOverviewResponse } from '../../../../core/cloud/types.js';\nimport { costBasisOf, seatTier, tierRank, type CostBasis, type ResourceTier } from '../../../../core/routing/tiers.js';\nimport type { ServingRuntimeSnapshot, VerseSeat } from '../../../data/api-types.js';\nimport { accountStatus, accountStatusRank, type AccountStatusKind, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { modelNameInText, type LocalModelRow } from '../usage/local-model.js';\nimport { formatContextWindow } from '../verse-model.js';\n\n// ---------------------------------------------------------------------------\n// The handle's dot\n// ---------------------------------------------------------------------------\n\n/**\n * ok every account read is usable, none tight\n * tight something is running low (or usable only on credits)\n * alert something is spent, signed out or unavailable\n * unknown nothing has been read yet — no dot at all (never \"all good\")\n */\nexport type ResourcesTone = 'ok' | 'tight' | 'alert' | 'unknown';\n\nexport interface ResourcesSummary {\n tone: ResourcesTone;\n /** Appended to the handle's accessible name and tooltip: \"2 usable · 1 spent\". */\n spoken: string;\n}\n\nconst ALERT_KINDS: ReadonlySet<AccountStatusKind> = new Set(['spent', 'signed-out', 'unavailable']);\n\nconst COUNT_WORDS: ReadonlyArray<[AccountStatusKind, string]> = [\n ['usable', 'usable'],\n ['low', 'running low'],\n ['spent', 'spent'],\n ['signed-out', 'signed out'],\n ['unavailable', 'unavailable'],\n];\n\n/** The paid accounts, reduced to one tone and one sentence. Local seats have no quota to run out of. */\nexport function summarizeResources(rows: readonly CapacityRow[], opts: { healthRead: boolean; now?: number }): ResourcesSummary {\n const kinds = rows\n .filter((r) => r.kind === 'subscription')\n .map((r) => accountStatus(r, { healthRead: opts.healthRead, ...(opts.now !== undefined ? { now: opts.now } : {}) }).kind);\n const counts = new Map<AccountStatusKind, number>();\n for (const k of kinds) counts.set(k, (counts.get(k) ?? 0) + 1);\n const spoken = COUNT_WORDS.filter(([k]) => counts.has(k))\n .map(([k, word]) => `${counts.get(k)} ${word}`)\n .join(' · ');\n let tone: ResourcesTone = 'unknown';\n if (kinds.some((k) => ALERT_KINDS.has(k))) tone = 'alert';\n else if (kinds.includes('low')) tone = 'tight';\n else if (kinds.includes('usable')) tone = 'ok';\n return { tone, spoken: spoken || (kinds.length === 0 ? 'no accounts connected' : 'not read yet') };\n}\n\nexport const TONE_WORD: Readonly<Record<ResourcesTone, string>> = {\n ok: 'all usable',\n tight: 'running low',\n alert: 'needs attention',\n unknown: 'not read yet',\n};\n\n// ---------------------------------------------------------------------------\n// Cloud credits\n// ---------------------------------------------------------------------------\n\nexport interface CloudCreditsView {\n totalUsd: number;\n spentUsd: number;\n remainingUsd: number;\n /** 0–100, remaining of total. */\n remainingPercent: number;\n running: number;\n sessionsToday: number;\n maxSessionsPerDay: number | null;\n seatReady: boolean;\n seatReason: string | null;\n canLaunch: boolean;\n canLaunchReason: string | null;\n estimateNote: string;\n /** Always https://claude.ai/… — anything else falls back to the frozen constant. */\n balanceUrl: string;\n}\n\nfunction rec(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as Record<string, unknown>) : null;\n}\n\nfunction num(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nfunction text(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;\n}\n\nconst DEFAULT_ESTIMATE_NOTE = 'An estimate from the sessions Verse launched — the real balance is on claude.ai.';\n\n/** Narrow a GET /api/verse/cloud body; null when it is not one. */\nexport function projectCloudCredits(raw: unknown): CloudCreditsView | null {\n const root = rec(raw) as Partial<Record<keyof CloudOverviewResponse, unknown>> | null;\n const budget = rec(root?.budget);\n if (!root || !budget) return null;\n const total = num(budget['creditsTotalUsd']);\n const spent = num(budget['estimatedSpentUsd']);\n const remainingRaw = num(budget['estimatedRemainingUsd']);\n if (total === null || (spent === null && remainingRaw === null)) return null;\n const remaining = Math.max(0, remainingRaw ?? total - (spent ?? 0));\n const seat = rec(root.seat);\n const gate = rec(budget['canLaunch']);\n const url = text(budget['balanceUrl']);\n const policy = rec(budget['budget']);\n return {\n totalUsd: total,\n spentUsd: spent ?? Math.max(0, total - remaining),\n remainingUsd: remaining,\n remainingPercent: total > 0 ? Math.max(0, Math.min(100, (remaining / total) * 100)) : 0,\n running: Math.max(0, num(budget['running']) ?? 0),\n sessionsToday: Math.max(0, num(budget['sessionsToday']) ?? 0),\n maxSessionsPerDay: num(policy?.['maxSessionsPerDay']),\n seatReady: seat?.['ready'] !== false,\n seatReason: text(seat?.['reason']),\n canLaunch: gate?.['ok'] !== false,\n canLaunchReason: text(gate?.['reason']),\n estimateNote: text(budget['estimateNote']) ?? DEFAULT_ESTIMATE_NOTE,\n balanceUrl: url !== null && url.startsWith('https://claude.ai/') ? url : CLOUD_BALANCE_URL,\n };\n}\n\n/** \"$212\" / \"$3.50\" — whole dollars once the cents stop mattering. */\nexport function formatUsd(value: number): string {\n const v = Math.max(0, value);\n return v >= 100 || Number.isInteger(v) ? `$${Math.round(v)}` : `$${v.toFixed(2)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Local\n// ---------------------------------------------------------------------------\n\nconst RUNTIME_NAME: Readonly<Record<ServingRuntimeSnapshot['kind'], string>> = {\n 'llama-server': 'llama-server',\n ollama: 'Ollama',\n vllm: 'vLLM',\n unknown: 'Serving runtime',\n};\n\nconst STATE_WORD: Readonly<Record<ServingRuntimeSnapshot['state'], string>> = {\n running: 'Running',\n starting: 'Starting…',\n stopping: 'Stopping…',\n stopped: 'Stopped',\n unknown: 'State not reported',\n};\n\nexport interface RuntimeView {\n name: string;\n state: ServingRuntimeSnapshot['state'];\n word: string;\n tone: 'success' | 'warning' | 'neutral';\n /** \"Qwen3-32B · 16k context per agent · 1 of 4 slots busy\" — only the parts that were reported. */\n detail: string | null;\n canStart: boolean;\n canStop: boolean;\n /** Set when Verse cannot start or stop it (launchd, the operator's own terminal). */\n managedElsewhere: boolean;\n}\n\nexport function runtimeView(runtime: ServingRuntimeSnapshot | null): RuntimeView | null {\n if (!runtime) return null;\n const parts: string[] = [];\n if (runtime.model) parts.push(modelNameInText(runtime.model));\n // Per-slot context, the number one agent actually gets (fleet-types.ts).\n if (runtime.contextTokens !== null) parts.push(`${formatContextWindow(runtime.contextTokens)} context per agent`);\n if (runtime.slotsTotal !== null && runtime.slotsTotal > 0) {\n parts.push(runtime.slotsBusy !== null ? `${runtime.slotsBusy} of ${runtime.slotsTotal} slots busy` : `${runtime.slotsTotal} slots`);\n }\n const state = runtime.state;\n return {\n name: RUNTIME_NAME[runtime.kind] ?? RUNTIME_NAME.unknown,\n state,\n word: STATE_WORD[state] ?? STATE_WORD.unknown,\n tone: state === 'running' ? 'success' : state === 'starting' || state === 'stopping' ? 'warning' : 'neutral',\n detail: parts.length > 0 ? parts.join(' · ') : null,\n canStart: runtime.supervised && state === 'stopped',\n canStop: runtime.supervised && state === 'running',\n managedElsewhere: !runtime.supervised,\n };\n}\n\n/**\n * The context a local model runs with. The configured window is the one a\n * turn actually gets; when it is below the model's native window both are\n * said, so \"256k model\" is never read as \"256k here\".\n */\nexport function modelContextText(row: Pick<LocalModelRow, 'nativeContext' | 'configuredContext' | 'contextTruncated'>): string | null {\n const configured = row.configuredContext;\n const native = row.nativeContext;\n if (configured !== null && row.contextTruncated && native !== null) return `${formatContextWindow(configured)} of ${formatContextWindow(native)} context`;\n if (configured !== null) return `${formatContextWindow(configured)} context`;\n if (native !== null) return `${formatContextWindow(native)} context`;\n return null;\n}\n\n/** How many models the drawer lists before pointing at Usage for the rest. */\nexport const LOCAL_MODELS_SHOWN = 6;\n\n// ---------------------------------------------------------------------------\n// Local runtimes (3.14): Ollama, LM Studio and llama-server as ONE resource\n// ---------------------------------------------------------------------------\n\nexport interface LocalRuntimeLine {\n id: 'ollama' | 'lmstudio' | 'llama-server';\n name: string;\n /** Status-line tone: answering with something loaded = success. */\n tone: 'success' | 'warning' | 'danger' | 'neutral';\n /** \"Answering\", \"Not answering\", \"Loading…\". */\n word: string;\n /** \"4 installed · 1 loaded\" / \"listening on :8080 but not answering — restart it\". */\n detail: string;\n}\n\nfunction portOf(baseUrl: unknown): string {\n if (typeof baseUrl !== 'string') return '';\n try {\n const url = new URL(baseUrl);\n return url.port ? `:${url.port}` : url.host;\n } catch {\n return '';\n }\n}\n\nfunction modelCounts(report: Record<string, unknown>): { installed: number; loaded: number } {\n const models = Array.isArray(report['models']) ? report['models'] : [];\n let loaded = 0;\n // `state: 'loaded'` is the current wire; `loaded: true` the pre-3.10 one.\n for (const m of models) {\n const row = rec(m);\n if (row?.['state'] === 'loaded' || row?.['loaded'] === true) loaded += 1;\n }\n return { installed: models.length, loaded };\n}\n\nfunction catalogLine(id: 'ollama' | 'lmstudio', name: string, raw: unknown): LocalRuntimeLine | null {\n const report = rec(raw);\n if (!report) return null;\n const port = portOf(report['baseUrl']);\n if (report['reachable'] !== true) {\n return { id, name, tone: 'neutral', word: 'Not running', detail: port ? `nothing answering on ${port}` : 'nothing answering' };\n }\n const { installed, loaded } = modelCounts(report);\n const stale = report['stale'] === true ? ' · last known' : '';\n return {\n id,\n name,\n tone: loaded > 0 ? 'success' : 'neutral',\n word: 'Answering',\n detail: `${installed} installed · ${loaded > 0 ? `${loaded} loaded` : 'none loaded'}${stale}`,\n };\n}\n\nfunction llamaLine(raw: unknown): LocalRuntimeLine | null {\n const report = rec(raw);\n if (!report) return null;\n const port = portOf(report['baseUrl']);\n const status = report['status'];\n const reason = report['reason'];\n const name = 'llama-server';\n if (status === 'ok') {\n const count = typeof report['modelCount'] === 'number' ? report['modelCount'] : null;\n const slots = typeof report['slots'] === 'number' ? report['slots'] : null;\n const parts = [count !== null ? `${count} model${count === 1 ? '' : 's'} served` : 'serving', slots !== null ? `${slots} slots` : null]\n .filter((p): p is string => p !== null);\n return { id: 'llama-server', name, tone: 'success', word: 'Answering', detail: parts.join(' · ') };\n }\n if (status === 'loading') return { id: 'llama-server', name, tone: 'warning', word: 'Loading…', detail: `mapping weights on ${port}` };\n if (status === 'error') return { id: 'llama-server', name, tone: 'danger', word: 'Error', detail: `answering on ${port} with an error` };\n // `down`: refused = not running; timed out = a process holds the port but\n // never answers — wedged, which needs a restart, not a start.\n if (reason === 'llama-server-timeout') {\n return { id: 'llama-server', name, tone: 'danger', word: 'Not answering', detail: `listening on ${port} but not answering — restart it` };\n }\n return { id: 'llama-server', name, tone: 'neutral', word: 'Not running', detail: port ? `nothing answering on ${port}` : 'nothing answering' };\n}\n\n/**\n * One line per local runtime from GET /api/verse/local-models. A runtime the\n * server did not report (an older build has no `llamaServer`) is simply\n * absent — never shown as down.\n */\nexport function localRuntimeLines(raw: unknown): LocalRuntimeLine[] {\n const root = rec(raw);\n if (!root) return [];\n return [\n catalogLine('ollama', 'Ollama', root['ollama']),\n catalogLine('lmstudio', 'LM Studio', root['lmStudio']),\n llamaLine(root['llamaServer']),\n ].filter((line): line is LocalRuntimeLine => line !== null);\n}\n\n// ---------------------------------------------------------------------------\n// One card anatomy, one tier model (3.15, \"equal partners\")\n// ---------------------------------------------------------------------------\n\n/**\n * The facts line every card carries, whatever the provider: its TIER\n * (routing/tiers.ts), what one more turn costs, the models it offers and —\n * when there is one — the reserve kept for Mason. Status, usage and the\n * Chat / Fleet readiness lines are the card's other rows.\n */\nexport interface ResourceFactsView {\n tier: ResourceTier;\n basis: CostBasis;\n /** Runnable model labels, default first; empty when the card lists its own models. */\n models: string[];\n /** \"10 ACUs kept for you\", when the reserve is not already on a meter; null otherwise. */\n reserve: string | null;\n}\n\n/** Shown before \"+N more\". */\nexport const FACTS_MODELS_SHOWN = 3;\n\n/** \"Opus 5.5, Sonnet 5, Haiku +2 more\" — never empty-looking, never a bare \"…\". */\nexport function modelsLine(labels: readonly string[], max = FACTS_MODELS_SHOWN): string | null {\n const unique = [...new Set(labels.filter((l) => l.trim().length > 0))];\n if (unique.length === 0) return null;\n const shown = unique.slice(0, max).join(', ');\n return unique.length > max ? `${shown} +${unique.length - max} more` : shown;\n}\n\nfunction runnable(seat: Pick<VerseSeat, 'models'>) {\n const models = seat.models.filter((m) => !m.unavailableReason);\n return models.length > 0 ? models : seat.models.slice(0, 1);\n}\n\n/** The facts for one seat (its default model decides the tier). */\nexport function seatFacts(seat: Pick<VerseSeat, 'engine' | 'models' | 'costBasis'>): ResourceFactsView {\n const models = runnable(seat);\n const first = models[0]?.id ?? null;\n return {\n tier: seatTier(seat.engine, first),\n basis: seat.costBasis ?? costBasisOf(seat.engine, { modelId: first }),\n models: models.map((m) => m.label),\n reserve: null,\n };\n}\n\n/**\n * The facts for a PROVIDER card that covers several seats (Devin cloud + CLI,\n * the local runtime): the best tier any of them offers, and every cost basis\n * worded once (\"credits · subscription\").\n */\nexport function mergedFacts(seats: ReadonlyArray<Pick<VerseSeat, 'engine' | 'models' | 'costBasis'>>): ResourceFactsView | null {\n if (seats.length === 0) return null;\n const all = seats.map(seatFacts);\n const tier = all.reduce<ResourceTier>((best, f) => (tierRank(f.tier) < tierRank(best) ? f.tier : best), all[0]!.tier);\n return { tier, basis: all[0]!.basis, models: all.flatMap((f) => f.models), reserve: null };\n}\n\n/** Every cost basis a provider card spans, in first-seen order. */\nexport function costBases(seats: ReadonlyArray<Pick<VerseSeat, 'engine' | 'models' | 'costBasis'>>): CostBasis[] {\n return [...new Set(seats.map((s) => seatFacts(s).basis))];\n}\n\n/** One card in a tier section, ranked by status the same way for every provider. */\nexport interface TierEntry<K extends string = string> {\n key: K;\n tier: ResourceTier;\n /** `accountStatusRank` of the card's status; lower = more usable. */\n statusRank: number;\n /** 0 subscription / free, 1 credits / per-token — the router's marginal-cost rule. */\n marginal: number;\n index: number;\n}\n\n/**\n * Cards per tier, best tier first; inside a tier usable before not, a\n * subscription before a metered balance, then the caller's order. Empty tiers\n * are dropped. No provider is named anywhere in this ordering.\n */\nexport function groupByTier<E extends TierEntry>(entries: readonly E[]): Array<{ tier: ResourceTier; entries: E[] }> {\n const tiers: ResourceTier[] = ['elite', 'fast', 'free'];\n return tiers\n .map((tier) => ({\n tier,\n entries: entries\n .filter((e) => e.tier === tier)\n .sort((a, b) => a.statusRank - b.statusRank || a.marginal - b.marginal || a.index - b.index),\n }))\n .filter((g) => g.entries.length > 0);\n}\n\n/** A status rank for a card that has no capacity row (cloud credits, Devin): from its Chat verdict. */\nexport function readinessStatusRank(chatReady: boolean | null): number {\n if (chatReady === null) return accountStatusRank('not-checked');\n return accountStatusRank(chatReady ? 'usable' : 'unavailable');\n}\n","/**\n * routes/verse/resources/resources-queries.ts — the one read the Resources\n * drawer adds (unit 3.11 C6). Seats, health, budget, local models and the\n * serving runtime are read through their owners' QueryDefs (usage/, health/,\n * budget/, autonomy/fleet-queries); only the cloud lane's overview is new.\n *\n * GET /api/verse/cloud lands in parallel with this drawer. Until it does the\n * server answers 404, and that is a designed state (\"Cloud lane not available\n * yet\"), not an error: the fetcher resolves `{ available: false }` instead of\n * throwing. A 401 still propagates — an expired session is the whole app's\n * problem, not this panel's.\n */\nimport { VERSE_CLOUD_PATH } from '../../../../core/cloud/types.js';\nimport { VERSE_RESOURCE_READINESS_PATH, type ResourceReadinessResponse } from '../../../../core/routing/readiness-types.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { projectCloudCredits, type CloudCreditsView } from './resources-model.js';\n\nexport const RESOURCES_CLOUD_KEY = 'verse-resources-cloud';\n\nexport interface CloudCreditsRead {\n /** False when the route is absent (404) or unreachable. */\n available: boolean;\n /** Null when absent, or when the body was not a cloud overview. */\n credits: CloudCreditsView | null;\n}\n\nexport const cloudCreditsQuery: QueryDef<CloudCreditsRead> = {\n key: RESOURCES_CLOUD_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(VERSE_CLOUD_PATH, signal);\n return { available: true, credits: projectCloudCredits(raw) };\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 { available: false, credits: null };\n }\n },\n};\n\nexport const RESOURCES_READINESS_KEY = 'verse-resources-readiness';\n\nexport interface ReadinessRead {\n /** False when this server has no readiness route (404) or it could not answer. */\n available: boolean;\n /** Null when absent, or when the body was not a readiness response. */\n value: ResourceReadinessResponse | null;\n}\n\nfunction isReadiness(raw: unknown): raw is ResourceReadinessResponse {\n if (raw === null || typeof raw !== 'object') return false;\n const r = raw as Record<string, unknown>;\n return r['v'] === 1 && Array.isArray(r['resources']) && typeof r['autonomy'] === 'object' && r['autonomy'] !== null;\n}\n\n/**\n * GET /api/verse/budget/readiness (3.14): per resource, \"ready for chat?\" and\n * \"ready for the fleet?\" with the one fix. An older server answers 404 — the\n * drawer then simply shows no readiness lines, never a false \"not ready\".\n */\nexport const resourceReadinessQuery: QueryDef<ReadinessRead> = {\n key: RESOURCES_READINESS_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(VERSE_RESOURCE_READINESS_PATH, signal);\n return { available: true, value: isReadiness(raw) ? raw : 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 { available: false, value: null };\n }\n },\n};\n\n/** While the drawer is open: seats and health ride their own 30 s polls; these are the drawer's own. */\nexport const RESOURCES_POLL_MS = { cloud: 60_000, local: 30_000, runtime: 15_000, readiness: 30_000 } as const;\n"],"mappings":"yQAsBA,IAAa,EAAgC,8BCmBvC,EAA8C,IAAI,IAAI,CAAC,QAAS,aAAc,aAAa,CAAC,EAE5F,EAA0D,CAC9D,CAAC,SAAU,QAAQ,EACnB,CAAC,MAAO,aAAa,EACrB,CAAC,QAAS,OAAO,EACjB,CAAC,aAAc,YAAY,EAC3B,CAAC,cAAe,aAAa,CAC/B,EAGA,SAAgB,EAAmB,EAA8B,EAA+D,CAC9H,IAAM,EAAQ,EACX,OAAQ,GAAM,EAAE,OAAS,cAAc,CAAC,CACxC,IAAK,GAAM,EAAc,EAAG,CAAE,WAAY,EAAK,WAAY,GAAI,EAAK,MAAQ,IAAA,GAAgC,CAAC,EAArB,CAAE,IAAK,EAAK,GAAI,CAAQ,CAAC,CAAC,CAAC,IAAI,EACpH,EAAS,IAAI,IACnB,IAAK,IAAM,KAAK,EAAO,EAAO,IAAI,GAAI,EAAO,IAAI,CAAC,GAAK,GAAK,CAAC,EAC7D,IAAM,EAAS,EAAY,QAAQ,CAAC,KAAO,EAAO,IAAI,CAAC,CAAC,CAAC,CACtD,KAAK,CAAC,EAAG,KAAU,GAAG,EAAO,IAAI,CAAC,EAAE,GAAG,GAAM,CAAC,CAC9C,KAAK,KAAK,EACT,EAAsB,UAI1B,OAHI,EAAM,KAAM,GAAM,EAAY,IAAI,CAAC,CAAC,EAAG,EAAO,QACzC,EAAM,SAAS,KAAK,EAAG,EAAO,QAC9B,EAAM,SAAS,QAAQ,IAAG,EAAO,MACnC,CAAE,OAAM,OAAQ,IAAW,EAAM,SAAW,EAAI,wBAA0B,eAAgB,CACnG,CA+BA,SAAS,EAAI,EAAgD,CAC3D,OAAO,OAAO,GAAU,UAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,EAAK,EAAoC,IACrH,CAEA,SAAS,EAAI,EAA+B,CAC1C,OAAO,OAAO,GAAU,UAAY,OAAO,SAAS,CAAK,EAAI,EAAQ,IACvE,CAEA,SAAS,EAAK,EAA+B,CAC3C,OAAO,OAAO,GAAU,UAAY,EAAM,KAAK,CAAC,CAAC,OAAS,EAAI,EAAM,KAAK,EAAI,IAC/E,CAEA,IAAM,EAAwB,mFAG9B,SAAgB,EAAoB,EAAuC,CACzE,IAAM,EAAO,EAAI,CAAG,EACd,EAAS,EAAI,GAAM,MAAM,EAC/B,GAAI,CAAC,GAAQ,CAAC,EAAQ,OAAO,KAC7B,IAAM,EAAQ,EAAI,EAAO,eAAkB,EACrC,EAAQ,EAAI,EAAO,iBAAoB,EACvC,EAAe,EAAI,EAAO,qBAAwB,EACxD,GAAI,IAAU,MAAS,IAAU,MAAQ,IAAiB,KAAO,OAAO,KACxE,IAAM,EAAY,KAAK,IAAI,EAAG,GAAgB,GAAS,GAAS,EAAE,EAC5D,EAAO,EAAI,EAAK,IAAI,EACpB,EAAO,EAAI,EAAO,SAAY,EAC9B,EAAM,EAAK,EAAO,UAAa,EAC/B,EAAS,EAAI,EAAO,MAAS,EACnC,MAAO,CACL,SAAU,EACV,SAAU,GAAS,KAAK,IAAI,EAAG,EAAQ,CAAS,EAChD,aAAc,EACd,iBAAkB,EAAQ,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,IAAM,EAAY,EAAS,GAAG,CAAC,EAAI,EACtF,QAAS,KAAK,IAAI,EAAG,EAAI,EAAO,OAAU,GAAK,CAAC,EAChD,cAAe,KAAK,IAAI,EAAG,EAAI,EAAO,aAAgB,GAAK,CAAC,EAC5D,kBAAmB,EAAI,GAAS,iBAAoB,EACpD,UAAW,GAAO,QAAa,GAC/B,WAAY,EAAK,GAAO,MAAS,EACjC,UAAW,GAAO,KAAU,GAC5B,gBAAiB,EAAK,GAAO,MAAS,EACtC,aAAc,EAAK,EAAO,YAAe,GAAK,EAC9C,WAAY,IAAQ,MAAQ,EAAI,WAAW,oBAAoB,EAAI,EAAM,CAC3E,CACF,CAGA,SAAgB,EAAU,EAAuB,CAC/C,IAAM,EAAI,KAAK,IAAI,EAAG,CAAK,EAC3B,OAAO,GAAK,KAAO,OAAO,UAAU,CAAC,EAAI,IAAI,KAAK,MAAM,CAAC,IAAM,IAAI,EAAE,QAAQ,CAAC,GAChF,CAMA,IAAM,EAAyE,CAC7E,eAAgB,eAChB,OAAQ,SACR,KAAM,OACN,QAAS,iBACX,EAEM,EAAwE,CAC5E,QAAS,UACT,SAAU,YACV,SAAU,YACV,QAAS,UACT,QAAS,oBACX,EAeA,SAAgB,EAAY,EAA4D,CACtF,GAAI,CAAC,EAAS,OAAO,KACrB,IAAM,EAAkB,CAAC,EACrB,EAAQ,OAAO,EAAM,KAAK,EAAgB,EAAQ,KAAK,CAAC,EAExD,EAAQ,gBAAkB,MAAM,EAAM,KAAK,GAAG,EAAoB,EAAQ,aAAa,EAAE,mBAAmB,EAC5G,EAAQ,aAAe,MAAQ,EAAQ,WAAa,GACtD,EAAM,KAAK,EAAQ,YAAc,KAAoE,GAAG,EAAQ,WAAW,QAAnF,GAAG,EAAQ,UAAU,MAAM,EAAQ,WAAW,YAA4C,EAEpI,IAAM,EAAQ,EAAQ,MACtB,MAAO,CACL,KAAM,EAAa,EAAQ,OAAS,EAAa,QACjD,QACA,KAAM,EAAW,IAAU,EAAW,QACtC,KAAM,IAAU,UAAY,UAAY,IAAU,YAAc,IAAU,WAAa,UAAY,UACnG,OAAQ,EAAM,OAAS,EAAI,EAAM,KAAK,KAAK,EAAI,KAC/C,SAAU,EAAQ,YAAc,IAAU,UAC1C,QAAS,EAAQ,YAAc,IAAU,UACzC,iBAAkB,CAAC,EAAQ,UAC7B,CACF,CAOA,SAAgB,EAAiB,EAAqG,CACpI,IAAM,EAAa,EAAI,kBACjB,EAAS,EAAI,cAInB,OAHI,IAAe,MAAQ,EAAI,kBAAoB,IAAW,KAAa,GAAG,EAAoB,CAAU,EAAE,MAAM,EAAoB,CAAM,EAAE,UAC5I,IAAe,KACf,IAAW,KACR,KADqB,GAAG,EAAoB,CAAM,EAAE,UAD3B,GAAG,EAAoB,CAAU,EAAE,SAGrE,CAoBA,SAAS,EAAO,EAA0B,CACxC,GAAI,OAAO,GAAY,SAAU,MAAO,GACxC,GAAI,CACF,IAAM,EAAM,IAAI,IAAI,CAAO,EAC3B,OAAO,EAAI,KAAO,IAAI,EAAI,OAAS,EAAI,IACzC,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAS,EAAY,EAAwE,CAC3F,IAAM,EAAS,MAAM,QAAQ,EAAO,MAAS,EAAI,EAAO,OAAY,CAAC,EACjE,EAAS,EAEb,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAM,EAAI,CAAC,GACb,GAAM,QAAa,UAAY,GAAM,SAAc,MAAM,GAAU,EACzE,CACA,MAAO,CAAE,UAAW,EAAO,OAAQ,QAAO,CAC5C,CAEA,SAAS,EAAY,EAA2B,EAAc,EAAuC,CACnG,IAAM,EAAS,EAAI,CAAG,EACtB,GAAI,CAAC,EAAQ,OAAO,KACpB,IAAM,EAAO,EAAO,EAAO,OAAU,EACrC,GAAI,EAAO,YAAiB,GAC1B,MAAO,CAAE,KAAI,OAAM,KAAM,UAAW,KAAM,cAAe,OAAQ,EAAO,wBAAwB,IAAS,mBAAoB,EAE/H,GAAM,CAAE,YAAW,UAAW,EAAY,CAAM,EAC1C,EAAQ,EAAO,QAAa,GAAO,gBAAkB,GAC3D,MAAO,CACL,KACA,OACA,KAAM,EAAS,EAAI,UAAY,UAC/B,KAAM,YACN,OAAQ,GAAG,EAAU,eAAe,EAAS,EAAI,GAAG,EAAO,SAAW,gBAAgB,GACxF,CACF,CAEA,SAAS,EAAU,EAAuC,CACxD,IAAM,EAAS,EAAI,CAAG,EACtB,GAAI,CAAC,EAAQ,OAAO,KACpB,IAAM,EAAO,EAAO,EAAO,OAAU,EAC/B,EAAS,EAAO,OAChB,EAAS,EAAO,OAChB,EAAO,eACb,GAAI,IAAW,KAAM,CACnB,IAAM,EAAQ,OAAO,EAAO,YAAkB,SAAW,EAAO,WAAgB,KAC1E,EAAQ,OAAO,EAAO,OAAa,SAAW,EAAO,MAAW,KAGtE,MAAO,CAAE,GAAI,eAAgB,OAAM,KAAM,UAAW,KAAM,YAAa,OAFzD,CAAC,IAAU,KAA0D,UAAnD,GAAG,EAAM,QAAQ,IAAU,EAAI,GAAK,IAAI,SAAsB,IAAU,KAA0B,KAAnB,GAAG,EAAM,OAAc,CAAC,CACpI,OAAQ,GAAmB,IAAM,IAC2C,CAAA,CAAM,KAAK,KAAK,CAAE,CACnG,CAQA,OAPI,IAAW,UAAkB,CAAE,GAAI,eAAgB,OAAM,KAAM,UAAW,KAAM,WAAY,OAAQ,sBAAsB,GAAO,EACjI,IAAW,QAAgB,CAAE,GAAI,eAAgB,OAAM,KAAM,SAAU,KAAM,QAAS,OAAQ,gBAAgB,EAAK,eAAgB,EAGnI,IAAW,uBACN,CAAE,GAAI,eAAgB,OAAM,KAAM,SAAU,KAAM,gBAAiB,OAAQ,gBAAgB,EAAK,gCAAiC,EAEnI,CAAE,GAAI,eAAgB,OAAM,KAAM,UAAW,KAAM,cAAe,OAAQ,EAAO,wBAAwB,IAAS,mBAAoB,CAC/I,CAOA,SAAgB,EAAkB,EAAkC,CAClE,IAAM,EAAO,EAAI,CAAG,EAEpB,OADK,EACE,CACL,EAAY,SAAU,SAAU,EAAK,MAAS,EAC9C,EAAY,WAAY,YAAa,EAAK,QAAW,EACrD,EAAU,EAAK,WAAc,CAC/B,CAAC,CAAC,OAAQ,GAAmC,IAAS,IAAI,EALxC,CAAC,CAMrB,CAyBA,SAAgB,EAAW,EAA2B,EAAA,EAAyC,CAC7F,IAAM,EAAS,CAAC,GAAG,IAAI,IAAI,EAAO,OAAQ,GAAM,EAAE,KAAK,CAAC,CAAC,OAAS,CAAC,CAAC,CAAC,EACrE,GAAI,EAAO,SAAW,EAAG,OAAO,KAChC,IAAM,EAAQ,EAAO,MAAM,EAAG,CAAG,CAAC,CAAC,KAAK,IAAI,EAC5C,OAAO,EAAO,OAAS,EAAM,GAAG,EAAM,IAAI,EAAO,OAAS,EAAI,OAAS,CACzE,CAEA,SAAS,EAAS,EAAiC,CACjD,IAAM,EAAS,EAAK,OAAO,OAAQ,GAAM,CAAC,EAAE,iBAAiB,EAC7D,OAAO,EAAO,OAAS,EAAI,EAAS,EAAK,OAAO,MAAM,EAAG,CAAC,CAC5D,CAGA,SAAgB,EAAU,EAA6E,CACrG,IAAM,EAAS,EAAS,CAAI,EACtB,EAAQ,EAAO,EAAE,EAAE,IAAM,KAC/B,MAAO,CACL,KAAM,EAAS,EAAK,OAAQ,CAAK,EACjC,MAAO,EAAK,WAAa,EAAY,EAAK,OAAQ,CAAE,QAAS,CAAM,CAAC,EACpE,OAAQ,EAAO,IAAK,GAAM,EAAE,KAAK,EACjC,QAAS,IACX,CACF,CAOA,SAAgB,EAAY,EAAoG,CAC9H,GAAI,EAAM,SAAW,EAAG,OAAO,KAC/B,IAAM,EAAM,EAAM,IAAI,CAAS,EAE/B,MAAO,CAAE,KADI,EAAI,QAAsB,EAAM,IAAO,EAAS,EAAE,IAAI,EAAI,EAAS,CAAI,EAAI,EAAE,KAAO,EAAO,EAAI,EAAE,CAAE,IACvG,EAAM,MAAO,EAAI,EAAE,CAAE,MAAO,OAAQ,EAAI,QAAS,GAAM,EAAE,MAAM,EAAG,QAAS,IAAK,CAC3F,CAGA,SAAgB,EAAU,EAAuF,CAC/G,MAAO,CAAC,GAAG,IAAI,IAAI,EAAM,IAAK,GAAM,EAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAC1D,CAkBA,SAAgB,EAAiC,EAAoE,CAEnH,MAAO,CADwB,QAAS,OAAQ,MACzC,CAAA,CACJ,IAAK,IAAU,CACd,OACA,QAAS,EACN,OAAQ,GAAM,EAAE,OAAS,CAAI,CAAC,CAC9B,MAAM,EAAG,IAAM,EAAE,WAAa,EAAE,YAAc,EAAE,SAAW,EAAE,UAAY,EAAE,MAAQ,EAAE,KAAK,CAC/F,EAAE,CAAC,CACF,OAAQ,GAAM,EAAE,QAAQ,OAAS,CAAC,CACvC,CAGA,SAAgB,EAAoB,EAAmC,CAErE,OAD+B,EAA3B,IAAc,KAA+B,cACxB,EAAY,SAAW,aADc,CAEhE,CC7XA,IAAa,EAAgD,CAC3D,IAAK,wBACL,MAAO,KAAO,IAAW,CACvB,GAAI,CAEF,MAAO,CAAE,UAAW,GAAM,QAAS,EAAoB,MADrC,EAAgB,EAAkB,CAAM,CACA,CAAE,CAC9D,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EACpE,MAAO,CAAE,UAAW,GAAO,QAAS,IAAK,CAC3C,CACF,CACF,EAEa,EAA0B,4BASvC,SAAS,EAAY,EAAgD,CACnE,GAAoB,OAAO,GAAQ,WAA/B,EAAyC,MAAO,GACpD,IAAM,EAAI,EACV,OAAO,EAAE,IAAS,GAAK,MAAM,QAAQ,EAAE,SAAY,GAAK,OAAO,EAAE,UAAgB,UAAY,EAAE,WAAgB,IACjH,CAOA,IAAa,EAAkD,CAC7D,IAAK,EACL,MAAO,KAAO,IAAW,CACvB,GAAI,CACF,IAAM,EAAM,MAAM,EAAgB,EAA+B,CAAM,EACvE,MAAO,CAAE,UAAW,GAAM,MAAO,EAAY,CAAG,EAAI,EAAM,IAAK,CACjE,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EACpE,MAAO,CAAE,UAAW,GAAO,MAAO,IAAK,CACzC,CACF,CACF,EAGa,EAAoB,CAAE,MAAO,IAAQ,MAAO,IAAQ,QAAS,KAAQ,UAAW,GAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{t as e}from"./nav-CUXtg-Iw.js";var t=3e3;function n(e){return typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape(e):e.replace(/["\\]/g,`\\$&`)}function r(t,r,i=document){let a=i.querySelector(`[data-surface="${n(t)}"]`);return a?a.querySelector(`#${n(e(r))}`)??a.querySelector(`[data-verse-anchor="${n(r)}"]`):null}function i(e){typeof e.scrollIntoView==`function`&&e.scrollIntoView({block:`center`,behavior:`smooth`}),(e.tabIndex>=0||e.matches(`a[href],button,input,select,textarea,[tabindex]`))&&e.focus({preventScroll:!0})}function a({section:e,anchor:n},a=t){if(typeof document>`u`)return Promise.resolve(!1);let o=r(e,n);return o&&!o.closest(`[hidden]`)?(i(o),Promise.resolve(!0)):new Promise(t=>{let o=!1,s=e=>{o||(o=!0,l.disconnect(),window.clearTimeout(u),e&&i(e),t(e!==null))},c=()=>{let t=r(e,n);t&&!t.closest(`[hidden]`)&&s(t)},l=new MutationObserver(c);l.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`hidden`,`id`,`data-verse-anchor`]});let u=window.setTimeout(()=>s(null),a);c()})}export{t as ANCHOR_WAIT_MS,r as findAnchorElement,a as revealAnchor};
|
|
2
|
+
//# sourceMappingURL=reveal-anchor-3ZUTtB8Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reveal-anchor-3ZUTtB8Q.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/reveal-anchor.ts"],"sourcesContent":["/**\n * routes/verse/shell/reveal-anchor.ts — \"go to that card\" for any surface\n * (unit C1; C7 cross-unit request 3).\n *\n * Needs-you items, Leader memos and Command cards point INTO a surface\n * (\"memo:m-7\" on Mind, \"seat:claude-a\" on Apps). Whoever raises it calls\n * `setVerseSection(section, anchor)` (or dispatches VERSE_ANCHOR_EVENT); the\n * shell listens once (VerseApp, through shell/anchor-requests.ts) and reveals\n * the element here.\n *\n * WHY WAIT, AND FOR HOW LONG. The target surface may be a lazy chunk that has\n * not loaded, a keep-alive surface un-hiding, or a list still fetching its\n * rows. Two animation frames (C7's own fallback in command/nav.ts) cover the\n * keep-alive case only; a cold chunk takes longer. So this watches the\n * surface's subtree until the element appears, and gives up quietly after\n * ANCHOR_WAIT_MS — a missing anchor is never an error, the operator is\n * already on the right surface.\n *\n * WHICH ELEMENT. C7 stamps `id=\"c7-anchor-<key>\"` (command/nav.ts anchorId);\n * any other owner may stamp `data-verse-anchor=\"<key>\"` instead of adopting\n * C7's id scheme. The search is scoped to `[data-surface=<section>]` so an\n * identically-keyed card on a HIDDEN keep-alive surface never wins.\n */\nimport { anchorId } from '../command/nav.js';\nimport type { VerseAnchorRequest } from '../verse-ui-store.js';\n\nexport const ANCHOR_WAIT_MS = 3_000;\n\nfunction cssEscape(value: string): string {\n return typeof CSS !== 'undefined' && typeof CSS.escape === 'function' ? CSS.escape(value) : value.replace(/[\"\\\\]/g, '\\\\$&');\n}\n\n/** The anchor's element on `section`'s surface, or null when it is not in the DOM (yet). */\nexport function findAnchorElement(section: string, anchor: string, root: ParentNode = document): HTMLElement | null {\n const host = root.querySelector<HTMLElement>(`[data-surface=\"${cssEscape(section)}\"]`);\n if (!host) return null;\n return (\n host.querySelector<HTMLElement>(`#${cssEscape(anchorId(anchor))}`) ??\n host.querySelector<HTMLElement>(`[data-verse-anchor=\"${cssEscape(anchor)}\"]`)\n );\n}\n\nfunction reveal(el: HTMLElement): void {\n if (typeof el.scrollIntoView === 'function') el.scrollIntoView({ block: 'center', behavior: 'smooth' });\n // Keyboard users land ON the card, not just near it. Only an element that\n // can already take focus is focused — the shell never rewrites another\n // unit's tab order to make a div focusable.\n if (el.tabIndex >= 0 || el.matches('a[href],button,input,select,textarea,[tabindex]')) {\n el.focus({ preventScroll: true });\n }\n}\n\n/**\n * Reveal `anchor` on `section`. Resolves true when it was found and scrolled\n * to, false when it did not appear within `waitMs`. Never throws.\n */\nexport function revealAnchor({ section, anchor }: VerseAnchorRequest, waitMs: number = ANCHOR_WAIT_MS): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n const now = findAnchorElement(section, anchor);\n if (now && !now.closest('[hidden]')) {\n reveal(now);\n return Promise.resolve(true);\n }\n return new Promise((resolve) => {\n let done = false;\n const finish = (el: HTMLElement | null) => {\n if (done) return;\n done = true;\n observer.disconnect();\n window.clearTimeout(timer);\n if (el) reveal(el);\n resolve(el !== null);\n };\n const check = () => {\n const el = findAnchorElement(section, anchor);\n // Wait for the surface to be un-hidden too: scrolling a hidden element is a no-op.\n if (el && !el.closest('[hidden]')) finish(el);\n };\n const observer = new MutationObserver(check);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['hidden', 'id', 'data-verse-anchor'] });\n const timer = window.setTimeout(() => finish(null), waitMs);\n check();\n });\n}\n"],"mappings":"sCA0BA,IAAa,EAAiB,IAE9B,SAAS,EAAU,EAAuB,CACxC,OAAO,OAAO,IAAQ,KAAe,OAAO,IAAI,QAAW,WAAa,IAAI,OAAO,CAAK,EAAI,EAAM,QAAQ,SAAU,MAAM,CAC5H,CAGA,SAAgB,EAAkB,EAAiB,EAAgB,EAAmB,SAA8B,CAClH,IAAM,EAAO,EAAK,cAA2B,kBAAkB,EAAU,CAAO,EAAE,GAAG,EAErF,OADK,EAEH,EAAK,cAA2B,IAAI,EAAU,EAAS,CAAM,CAAC,GAAG,GACjE,EAAK,cAA2B,uBAAuB,EAAU,CAAM,EAAE,GAAG,EAH5D,IAKpB,CAEA,SAAS,EAAO,EAAuB,CACjC,OAAO,EAAG,gBAAmB,YAAY,EAAG,eAAe,CAAE,MAAO,SAAU,SAAU,QAAS,CAAC,GAIlG,EAAG,UAAY,GAAK,EAAG,QAAQ,iDAAiD,IAClF,EAAG,MAAM,CAAE,cAAe,EAAK,CAAC,CAEpC,CAMA,SAAgB,EAAa,CAAE,UAAS,UAA8B,EAAiB,EAAkC,CACvH,GAAI,OAAO,SAAa,IAAa,OAAO,QAAQ,QAAQ,EAAK,EACjE,IAAM,EAAM,EAAkB,EAAS,CAAM,EAK7C,OAJI,GAAO,CAAC,EAAI,QAAQ,UAAU,GAChC,EAAO,CAAG,EACH,QAAQ,QAAQ,EAAI,GAEtB,IAAI,QAAS,GAAY,CAC9B,IAAI,EAAO,GACL,EAAU,GAA2B,CACrC,IACJ,EAAO,GACP,EAAS,WAAW,EACpB,OAAO,aAAa,CAAK,EACrB,GAAI,EAAO,CAAE,EACjB,EAAQ,IAAO,IAAI,EACrB,EACM,MAAc,CAClB,IAAM,EAAK,EAAkB,EAAS,CAAM,EAExC,GAAM,CAAC,EAAG,QAAQ,UAAU,GAAG,EAAO,CAAE,CAC9C,EACM,EAAW,IAAI,iBAAiB,CAAK,EAC3C,EAAS,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,QAAS,GAAM,WAAY,GAAM,gBAAiB,CAAC,SAAU,KAAM,mBAAmB,CAAE,CAAC,EAC5I,IAAM,EAAQ,OAAO,eAAiB,EAAO,IAAI,EAAG,CAAM,EAC1D,EAAM,CACR,CAAC,CACH"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,o as n,s as r}from"./index-BC5Uslm5.js";import{t as i}from"./focus-trap-BZeH0rVB.js";import{t as a}from"./parts.module-CBkHcD6w.js";var o=e(r(),1),s=e(n(),1),c=t();function l({open:e,onClose:t,title:n,children:r,footer:l,busy:u=!1,role:d=`dialog`}){let f=(0,o.useRef)(null),p=(0,o.useId)(),m=(0,o.useCallback)(()=>{u||t()},[u,t]);return i({open:e,containerRef:f,onClose:m}),e?(0,s.createPortal)((0,c.jsx)(`div`,{className:a.sheetBackdrop,onMouseDown:e=>e.target===e.currentTarget&&m(),children:(0,c.jsxs)(`div`,{ref:f,className:a.sheet,role:d,"aria-modal":`true`,"aria-labelledby":p,tabIndex:-1,children:[(0,c.jsx)(`span`,{className:a.grabber,"aria-hidden":`true`}),(0,c.jsx)(`h2`,{id:p,className:a.sheetTitle,children:n}),(0,c.jsx)(`div`,{className:a.sheetBody,children:r}),l?(0,c.jsx)(`div`,{className:a.sheetFooter,children:l}):null]})}),document.body):null}export{l as t};
|
|
2
|
+
//# sourceMappingURL=sheet-DP8ByDWU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheet-DP8ByDWU.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/sheet.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/sheet.tsx — the bottom sheet: grabber, title, a\n * scrolling body and a pinned footer, with the console's focus trap (Escape\n * and the backdrop close it unless it is busy). Off the first paint.\n */\nimport { useCallback, useId, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport styles from './parts.module.css';\n\n// ---------------------------------------------------------------------------\n// Bottom sheet\n// ---------------------------------------------------------------------------\n\nexport interface BottomSheetProps {\n open: boolean;\n onClose: () => void;\n title: ReactNode;\n children: ReactNode;\n footer?: ReactNode;\n /** While busy the backdrop and Escape do not close it. */\n busy?: boolean;\n role?: 'dialog' | 'alertdialog';\n}\n\nexport function BottomSheet({ open, onClose, title, children, footer, busy = false, role = 'dialog' }: BottomSheetProps) {\n const panel = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const close = useCallback(() => {\n if (!busy) onClose();\n }, [busy, onClose]);\n useFocusTrap({ open, containerRef: panel, onClose: close });\n if (!open) return null;\n return createPortal(\n <div className={styles.sheetBackdrop} onMouseDown={(e) => e.target === e.currentTarget && close()}>\n <div ref={panel} className={styles.sheet} role={role} aria-modal=\"true\" aria-labelledby={titleId} tabIndex={-1}>\n <span className={styles.grabber} aria-hidden=\"true\" />\n <h2 id={titleId} className={styles.sheetTitle}>{title}</h2>\n <div className={styles.sheetBody}>{children}</div>\n {footer ? <div className={styles.sheetFooter}>{footer}</div> : null}\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":"qOAyBA,SAAgB,EAAY,CAAE,OAAM,UAAS,QAAO,WAAU,SAAQ,OAAO,GAAO,OAAO,UAA8B,CACvH,IAAM,GAAA,EAAQ,EAAA,OAAA,CAAuB,IAAI,EACnC,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAQ,EAAA,YAAA,KAAkB,CACzB,GAAM,EAAQ,CACrB,EAAG,CAAC,EAAM,CAAO,CAAC,EAGlB,OAFA,EAAa,CAAE,OAAM,aAAc,EAAO,QAAS,CAAM,CAAC,EACrD,GACL,EAAO,EAAA,aAAA,EACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cAAe,YAAc,GAAM,EAAE,SAAW,EAAE,eAAiB,EAAM,EAC9F,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,IAAK,EAAO,UAAW,EAAO,MAAa,OAAM,aAAW,OAAO,kBAAiB,EAAS,SAAU,GAA5G,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,cAAY,MAAQ,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,WAAa,SAAA,CAAU,CAAA,GAC1D,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UAAY,UAAc,CAAA,EAChD,GAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,YAAc,SAAA,CAAY,CAAA,EAAI,IAC5D,GACF,CAAA,EACL,SAAS,IACX,EAXkB,IAYpB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PreviewPane-D1WaefIG.js","assets/global-w7KDTTi0.js","assets/SkipToContent-BynsXs9i.js","assets/VerseConsoleApp-DjPpZLo1.js","assets/RouteErrorBoundary-BaJ1ZePy.js","assets/percent-text-CSk89zQF.js","assets/VerseShared-Bf-XTHCh.js","assets/verse-bootstrap-query-B3vFD9XK.js","assets/Segmented-BA8RmKYq.js","assets/icons-C3G-y5j2.js","assets/MessageMarkdown-CS0mAtSs.js","assets/Transcript.module-DD0MFIIy.js","assets/pane-chrome.module-D7o-fVd0.js","assets/terminal-icons-Dx6neM-J.js","assets/global-1SED_aTT.css","assets/SkipToContent-c02H5dmz.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-BmckthwC.css","assets/Segmented-BnjHbKzH.css","assets/Button-DrnKsvnQ.css","assets/EmptyState-B3YUPGaa.css","assets/Transcript-DZ96MnR7.css","assets/pane-chrome-8JmEhHVD.css","assets/PreviewPane-DoMsJSG3.css","assets/TerminalPane-D3f02aI4.js","assets/verse-model-DAOz9LrY.js","assets/compaction-point-VL9oegWS.js","assets/format-V6IiIMAL.js","assets/format-D7nBg2bn.js","assets/seat-readiness-a5B9iqP-.js","assets/ActionMenu-Z14OhnFI.js","assets/command-catalog-B0ApAGD0.js","assets/terminal-client-CCSvMeEv.js","assets/terminal-view-BSieiQvi.js","assets/ActionMenu-DPjsLU1g.css","assets/TerminalPane-BwfMbnJz.css","assets/BranchBar-CkiZSNqB.js","assets/MutationTokenDialog-DlY2VLVh.js","assets/Dialog-DDHg9cuT.js","assets/focus-trap-BZeH0rVB.js","assets/git-model-C1I4z_iQ.js","assets/use-token-gate-h5QAERLT.js","assets/GitDialogs-ekwzxl76.js","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/GitDialogs-ChreZUPG.css","assets/BranchBar-B1I6KeIl.css","assets/DiffPane-BR3HU7pC.js","assets/diff-parser-BnW_HiQm.js","assets/highlight-BCNIvJ85.js","assets/line-diff-B5Eonif2.js","assets/DiffPane.module-CTk5rZn3.js","assets/DiffPane-BAvvbBsf.css","assets/SessionInsightChip-DIKfih6i.js","assets/surface-data-hufdOfpz.js","assets/control-queries-BG53otwz.js","assets/mutations-CdLi0erM.js","assets/nav-CUXtg-Iw.js","assets/mind.module-rVKz51LB.js","assets/colors-DvK0wMHH.js","assets/calendar-day-BxBYHfX1.js","assets/workspace-model-C-q_I8xN.js","assets/mind-B9PzLcl0.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n,t as r}from"./index-BC5Uslm5.js";import{t as i}from"./Button-CstSJwha.js";import{t as a}from"./EmptyState-CGVr0VO2.js";var o=e(n(),1),s=t(),c={"branch-bar":{path:`git/BranchBar.tsx`,exportName:`BranchBar`,owner:`C5`,kind:`inline`,label:`Branch bar`},"diff-pane":{path:`git/DiffPane.tsx`,exportName:`DiffPane`,owner:`C5`,kind:`pane`,label:`Review`},"terminal-pane":{path:`dock/terminal/TerminalPane.tsx`,exportName:`TerminalPane`,owner:`C4`,kind:`pane`,label:`Terminal`},"preview-pane":{path:`dock/preview/PreviewPane.tsx`,exportName:`PreviewPane`,owner:`C4`,kind:`pane`,label:`Preview`},"session-insight-chip":{path:`mind/SessionInsightChip.tsx`,exportName:`SessionInsightChip`,owner:`C7`,kind:`inline`,label:`Insight`}};Object.keys(c);var l=Object.assign({"../dock/preview/PreviewPane.tsx":()=>r(()=>import(`./PreviewPane-D1WaefIG.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23])),"../dock/terminal/TerminalPane.tsx":()=>r(()=>import(`./TerminalPane-D3f02aI4.js`),__vite__mapDeps([24,1,2,3,4,5,6,7,25,26,27,28,29,30,9,31,12,13,32,33,14,15,16,17,19,34,20,22,35])),"../git/BranchBar.tsx":()=>r(()=>import(`./BranchBar-CkiZSNqB.js`),__vite__mapDeps([36,37,1,38,39,3,4,2,5,6,7,27,28,25,26,29,40,9,41,42,14,43,44,16,15,17,19,45,46])),"../git/DiffPane.tsx":()=>r(()=>import(`./DiffPane-BR3HU7pC.js`),__vite__mapDeps([47,2,48,49,8,40,1,6,7,50,9,51,12,15,18,14,19,20,52,22])),"../mind/SessionInsightChip.tsx":()=>r(()=>import(`./SessionInsightChip-DIKfih6i.js`),__vite__mapDeps([53,1,27,28,5,25,26,29,54,6,7,55,56,57,3,4,2,58,59,60,61,14,16,15,17,62]))});function u(e,t){return t[`../${c[e].path}`]}function d(e,t=l){return u(e,t)!==void 0}function f(e,t=l){let n=u(e,t);if(!n)return null;let{exportName:r}=c[e];return(0,o.lazy)(async()=>{let t=(await n())[r];if(typeof t!=`function`&&(typeof t!=`object`||!t))throw Error(`${c[e].path} exports no ${r}`);return{default:t}})}var p=new Map;function m(e){return p.has(e)||p.set(e,f(e)),p.get(e)}var h=class extends o.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(e,t){console.error(`[verse] ${this.props.label} failed`,e,t.componentStack)}render(){return this.state.failed?this.props.kind===`inline`?null:(0,s.jsx)(g,{label:this.props.label,onRetry:this.props.onRetry}):this.props.children}};function g({label:e,onRetry:t}){return(0,s.jsx)(a,{compact:!0,tone:`error`,title:`${e} could not load`,body:`The rest of the chat still works.`,action:(0,s.jsx)(i,{variant:`subtle`,size:`sm`,onClick:t,children:`Try again`})})}function _({id:e,props:t,resolve:n=m,forget:r=e=>p.delete(e)}){let[i,a]=(0,o.useState)(0),l=n(e);if(!l)return null;let{kind:u,label:d}=c[e];return(0,s.jsx)(h,{kind:u,label:d,onRetry:()=>{r(e),a(e=>e+1)},children:(0,s.jsx)(o.Suspense,{fallback:null,children:(0,s.jsx)(l,{...t})})},i)}function v(e){return(0,s.jsx)(_,{id:`branch-bar`,props:e})}function y(e){return(0,s.jsx)(_,{id:`diff-pane`,props:e})}function b(e){return(0,s.jsx)(_,{id:`terminal-pane`,props:e})}function x(e){return(0,s.jsx)(_,{id:`preview-pane`,props:e})}function S(e){return(0,s.jsx)(_,{id:`session-insight-chip`,props:e})}export{b as a,S as i,y as n,d as o,x as r,v as t};
|
|
3
|
+
//# sourceMappingURL=slots-DWlj_c7i.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/slots.tsx"],"sourcesContent":["/**\n * routes/verse/shell/slots.tsx — where Chat mounts other units' UI (unit C0;\n * SPEC-310C §7 \"Slots\").\n *\n * C2 owns the chat, the dock and the header; C4, C5 and C7 own things that\n * render INSIDE them. Rather than C2 importing their files — which would not\n * compile until every one of them landed, and would drag each into C2's\n * chunk — C2 renders these slots. Each resolves ONE fixed file lazily and:\n * - renders nothing until that file lands (and `isSlotAvailable` says so,\n * so C2 can hide the toggle for a pane that does not exist yet);\n * - loads in its own chunk (xterm and the diff viewer stay off the chat's\n * critical path — SPEC-310C budgets: chat critical JS ≤ 350 KB);\n * - is fenced by an error boundary: a crashed inline slot vanishes, a\n * crashed pane says so with a retry — neither takes the chat down.\n *\n * The props below ARE the contract: each owning unit's component takes\n * exactly its slot's props, as a NAMED export (`export function BranchBar`).\n *\n * Resolution uses `import.meta.glob` with literal paths — the same \"absent\n * file is an absent key\" mechanism VerseApp uses for sections.\n */\nimport { Component, Suspense, lazy, useState, type ComponentType, type ErrorInfo, type ReactNode } from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport type { VerseReviewScope, VerseTerminalLaunchVia } from '../../../../core/verse/workbench-types.js';\n\n// ===========================================================================\n// Contracts\n// ===========================================================================\n\n/** Open the Review pane on a root, at a scope (and optionally one file). */\nexport interface DiffPaneRequest {\n root: string;\n scope: VerseReviewScope;\n file?: string;\n}\n\n/** A file the chat's latest turn touched — the Review pane's \"This turn\" scope (C2 derives it from events). */\nexport interface TurnFileChange {\n root: string;\n /** Relative to `root`. */\n path: string;\n}\n\n/** Open the Terminal pane: a tab at `root`, optionally pasting (never running) a command. */\nexport interface TerminalOpenRequest {\n /** Changes on every request, so the same request twice is two opens. */\n nonce: number;\n root?: string;\n /** Force a new tab instead of focusing the root's existing one (⌃⇧`). */\n newTab?: boolean;\n /** \"Run in terminal\": pasted at the prompt, NEVER executed — the operator presses Enter. */\n paste?: string;\n /** Apps [Launch ▸]: the catalog app to launch in the new tab. */\n appId?: string;\n /**\n * With `appId`: HOW to launch it — the app's own CLI (`native`) or through\n * Ollama (`ollama`, with `model` naming the local tag). These mirror\n * VerseTerminalCreateRequest; the page only names the choice, the server\n * resolves the argv from the catalog and the installed binaries\n * (`resolveAppLaunch`) and refuses via/model without an appId.\n */\n via?: VerseTerminalLaunchVia;\n /** With `via: 'ollama'`: the local model tag to launch the app on. */\n model?: string;\n /** Preview's dev-server Start: the server to run in the new tab. */\n devServerId?: string;\n /** 3.15 ⌘K \"Generate command…\": plain words → a command in the focused shell's input editor (never run). */\n assist?: boolean;\n /** 3.15 ⌘K \"Search terminal history…\". */\n history?: boolean;\n /**\n * 3.15: focus this existing tab (a `verse://terminal/<tab>/<block>` link, a\n * notification click, a Needs-you row) and, with `blockId`, show that block.\n */\n tabId?: string;\n blockId?: string;\n /** 3.15: open the launch-configuration dialog (the palette's \"Launch terminal configuration…\"). */\n launch?: boolean;\n}\n\n/** Open the Preview pane on a loopback URL, a chat artifact, or a dev server. */\nexport interface PreviewOpenRequest {\n nonce: number;\n url?: string;\n artifactPath?: string;\n devServerId?: string;\n}\n\n/** C5 `git/BranchBar.tsx` → `export function BranchBar(props: BranchBarProps)` — above the composer. */\nexport interface BranchBarProps {\n sessionId: string;\n /** The chat's roots in priority order; the bar shows one row per root with changes, then \"Show N more\". */\n roots: readonly string[];\n /** The ± counts open the branch diff: C2 opens the dock's Review pane with this. */\n onOpenDiff: (request: DiffPaneRequest) => void;\n}\n\n/** C5 `git/DiffPane.tsx` → `export function DiffPane(props: DiffPaneProps)` — the dock's Review pane. */\nexport interface DiffPaneProps {\n sessionId: string;\n roots: readonly string[];\n /** Latest open request; null = the pane chooses (Uncommitted, first root with changes). */\n request: (DiffPaneRequest & { nonce: number }) | null;\n turnFiles: readonly TurnFileChange[];\n /** \"Add to message\": drafts `path:line: note` into the composer (⌘Enter sends). */\n onAddToMessage: (text: string) => void;\n /** False while the pane is a background tab — stop timers, skip work. */\n visible: boolean;\n}\n\n/** C4 `dock/terminal/TerminalPane.tsx` → `export function TerminalPane(props: TerminalPaneProps)`. */\nexport interface TerminalPaneProps {\n sessionId: string;\n roots: readonly string[];\n request: TerminalOpenRequest | null;\n /** \"Send selection to chat\": the text, already fenced as a code block. */\n onSendToChat: (text: string) => void;\n visible: boolean;\n}\n\n/** C4 `dock/preview/PreviewPane.tsx` → `export function PreviewPane(props: PreviewPaneProps)`. */\nexport interface PreviewPaneProps {\n sessionId: string;\n roots: readonly string[];\n request: PreviewOpenRequest | null;\n /** Dev-server Start runs the server in a terminal tab — through the dock, never directly. */\n onOpenTerminal: (request: Omit<TerminalOpenRequest, 'nonce'>) => void;\n visible: boolean;\n}\n\n/** C7 `mind/SessionInsightChip.tsx` → `export function SessionInsightChip(props)` — the chat header chip. */\nexport interface SessionInsightChipProps {\n sessionId: string;\n}\n\nexport interface SlotPropsMap {\n 'branch-bar': BranchBarProps;\n 'diff-pane': DiffPaneProps;\n 'terminal-pane': TerminalPaneProps;\n 'preview-pane': PreviewPaneProps;\n 'session-insight-chip': SessionInsightChipProps;\n}\n\nexport type SlotId = keyof SlotPropsMap;\n\n/**\n * Each slot's fixed file (relative to routes/verse), its named export, its\n * owner, and how a crash is shown: an INLINE slot vanishes; a PANE fills the\n * dock, so it says it failed and offers a retry.\n */\nexport const SLOTS = {\n 'branch-bar': { path: 'git/BranchBar.tsx', exportName: 'BranchBar', owner: 'C5', kind: 'inline', label: 'Branch bar' },\n 'diff-pane': { path: 'git/DiffPane.tsx', exportName: 'DiffPane', owner: 'C5', kind: 'pane', label: 'Review' },\n 'terminal-pane': { path: 'dock/terminal/TerminalPane.tsx', exportName: 'TerminalPane', owner: 'C4', kind: 'pane', label: 'Terminal' },\n 'preview-pane': { path: 'dock/preview/PreviewPane.tsx', exportName: 'PreviewPane', owner: 'C4', kind: 'pane', label: 'Preview' },\n 'session-insight-chip': { path: 'mind/SessionInsightChip.tsx', exportName: 'SessionInsightChip', owner: 'C7', kind: 'inline', label: 'Insight' },\n} as const satisfies Record<SlotId, { path: string; exportName: string; owner: string; kind: 'inline' | 'pane'; label: string }>;\n\nexport const SLOT_IDS = Object.keys(SLOTS) as SlotId[];\n\n// ===========================================================================\n// Resolution\n// ===========================================================================\n\ntype Importer = () => Promise<unknown>;\n\n/**\n * Every slot file that exists at build time, keyed `../<path>`. Literal\n * patterns (no wildcards): a slot may only ever load its owner's one file.\n * EXPORTED for the slot test, which checks it against SLOTS.\n */\nexport const SLOT_MODULES: Record<string, Importer> = import.meta.glob([\n '../git/BranchBar.tsx',\n '../git/DiffPane.tsx',\n '../dock/terminal/TerminalPane.tsx',\n '../dock/preview/PreviewPane.tsx',\n '../mind/SessionInsightChip.tsx',\n]);\n\nfunction importerFor(id: SlotId, modules: Record<string, Importer>): Importer | undefined {\n return modules[`../${SLOTS[id].path}`];\n}\n\n/** True once the slot's file has landed in this build. */\nexport function isSlotAvailable(id: SlotId, modules: Record<string, Importer> = SLOT_MODULES): boolean {\n return importerFor(id, modules) !== undefined;\n}\n\ntype AnyComponent = ComponentType<Record<string, unknown>>;\n\n/**\n * Build the lazy component for one slot. Absent → renders nothing. Present\n * but exporting no component of the contract name → throws on load, so the\n * boundary shows it (a slot that silently renders nothing because of a typo\n * would look exactly like \"not landed yet\").\n */\nexport function createSlotComponent(id: SlotId, modules: Record<string, Importer> = SLOT_MODULES): AnyComponent | null {\n const importer = importerFor(id, modules);\n if (!importer) return null;\n const { exportName } = SLOTS[id];\n return lazy(async () => {\n const mod = (await importer()) as Record<string, unknown>;\n const exported = mod[exportName];\n if (typeof exported !== 'function' && (typeof exported !== 'object' || exported === null)) {\n throw new Error(`${SLOTS[id].path} exports no ${exportName}`);\n }\n return { default: exported as AnyComponent };\n });\n}\n\n// One lazy component per slot for the life of the page: re-creating it per\n// render would remount the pane (and drop a terminal's scrollback) each time.\nconst RESOLVED = new Map<SlotId, AnyComponent | null>();\nfunction slotComponent(id: SlotId): AnyComponent | null {\n if (!RESOLVED.has(id)) RESOLVED.set(id, createSlotComponent(id));\n return RESOLVED.get(id)!;\n}\n\n// ===========================================================================\n// Rendering\n// ===========================================================================\n\ninterface BoundaryProps {\n kind: 'inline' | 'pane';\n label: string;\n /** Drop the cached module and mount a fresh boundary (a failed lazy import stays failed otherwise). */\n onRetry: () => void;\n children: ReactNode;\n}\n\nclass SlotBoundary extends Component<BoundaryProps, { failed: boolean }> {\n override state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n // The console, not the page: operator copy never carries a stack or a path.\n console.error(`[verse] ${this.props.label} failed`, error, info.componentStack);\n }\n\n override render(): ReactNode {\n if (!this.state.failed) return this.props.children;\n if (this.props.kind === 'inline') return null;\n return <PaneFailed label={this.props.label} onRetry={this.props.onRetry} />;\n }\n}\n\nfunction PaneFailed({ label, onRetry }: { label: string; onRetry: () => void }) {\n return (\n <EmptyState\n compact\n tone=\"error\"\n title={`${label} could not load`}\n body=\"The rest of the chat still works.\"\n action={\n <Button variant=\"subtle\" size=\"sm\" onClick={onRetry}>\n Try again\n </Button>\n }\n />\n );\n}\n\nfunction SlotHost<K extends SlotId>({\n id,\n props,\n resolve = slotComponent,\n forget = (slot: SlotId) => RESOLVED.delete(slot),\n}: {\n id: K;\n props: SlotPropsMap[K];\n resolve?: (id: SlotId) => AnyComponent | null;\n forget?: (id: SlotId) => void;\n}) {\n const [attempt, setAttempt] = useState(0);\n const Resolved = resolve(id);\n if (!Resolved) return null;\n const { kind, label } = SLOTS[id];\n const retry = () => {\n forget(id);\n setAttempt((n) => n + 1);\n };\n return (\n // A new key per attempt: a fresh boundary AND a fresh lazy component.\n <SlotBoundary key={attempt} kind={kind} label={label} onRetry={retry}>\n <Suspense fallback={null}>\n <Resolved {...(props as unknown as Record<string, unknown>)} />\n </Suspense>\n </SlotBoundary>\n );\n}\n\n/** Test seam: render a slot against an injected module map (fake landed / absent / broken files). */\nexport function SlotForTest<K extends SlotId>({ id, props, modules }: { id: K; props: SlotPropsMap[K]; modules: Record<string, Importer> }) {\n const [cache] = useState(() => new Map<SlotId, AnyComponent | null>());\n const resolve = (slot: SlotId) => {\n if (!cache.has(slot)) cache.set(slot, createSlotComponent(slot, modules));\n return cache.get(slot)!;\n };\n return <SlotHost id={id} props={props} resolve={resolve} forget={(slot) => cache.delete(slot)} />;\n}\n\nexport function BranchBarSlot(props: BranchBarProps) {\n return <SlotHost id=\"branch-bar\" props={props} />;\n}\n\nexport function DiffPaneSlot(props: DiffPaneProps) {\n return <SlotHost id=\"diff-pane\" props={props} />;\n}\n\nexport function TerminalPaneSlot(props: TerminalPaneProps) {\n return <SlotHost id=\"terminal-pane\" props={props} />;\n}\n\nexport function PreviewPaneSlot(props: PreviewPaneProps) {\n return <SlotHost id=\"preview-pane\" props={props} />;\n}\n\nexport function SessionInsightChipSlot(props: SessionInsightChipProps) {\n return <SlotHost id=\"session-insight-chip\" props={props} />;\n}\n"],"file":"slots-DWlj_c7i.js"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{C as e,M as t,a as n}from"./global-w7KDTTi0.js";import{t as r}from"./diff-parser-BnW_HiQm.js";import{r as i}from"./VerseShared-Bf-XTHCh.js";import{d as a,l as o,r as s,s as c,u as l}from"./tool-semantics-xF0Fw2Ck.js";var u=2048,d={read:`Read`,read_file:`Read`,readfile:`Read`,view_file:`Read`,edit:`Edit`,multiedit:`Edit`,multi_edit:`Edit`,apply_patch:`Edit`,write:`Write`,write_file:`Write`,create_file:`Write`,bash:`Command`,shell:`Command`,exec_command:`Command`,run_command:`Command`,grep:`Search`,glob:`Search`,search:`Search`,tree:`Search`,webfetch:`Web`,web_fetch:`Web`,websearch:`Web`,web_search:`Web`,task:`Delegate`,agent:`Delegate`,subagent:`Delegate`};function f(e,t){if(e&&typeof e==`object`)try{return Object.getOwnPropertyDescriptor(e,t)?.value}catch{return}}function p(e,t){let n=f(e,t);return typeof n==`boolean`?n:null}function m(e){if(typeof e!=`string`||e.length>256)return{label:`Unrecognized tool`,mcp:!1};let t=e.trim(),n=/^mcp__[^\s]+__[^\s]+/i.test(t)||/^mcp:[^\s.]+\.[^\s]+/i.test(t),r=s(t),i=Object.hasOwn(d,r)?d[r]:`Other tool`;if(!n)return{label:i,mcp:!1};let a=/^mcp:/i.test(t)?t.slice(4,t.indexOf(`.`)):t.split(`__`)[1];return{label:`${a===`ashlr`||a===`plugin_ashlr_ashlr`?`Ashlr MCP`:a===`ashlr-efficiency`?`Ashlr efficiency MCP`:a===`ashlr-verse`?`Verse MCP`:`Other MCP`}: ${i}`,mcp:!0}}function h(e,t){let n=p(t,`pending`),r=p(t,`failed`);return{...m(e),state:n===!0?`pending`:r===!0?`failed`:n===!1&&r===!1?`completed`:`unknown`}}function g(e,t,n,r){let i=p(n,`pending`),a=p(n,`failed`),o=r?.get(e);if(o&&o.name===t&&o.pending===i&&o.failed===a)return o.evidence;let s=h(t,n);return r&&(!r.has(e)&&r.size>=2048&&r.delete(r.keys().next().value),r.set(e,{name:typeof t==`string`&&t.length<=256?t:null,pending:i,failed:a,evidence:s})),s}function _(){return{calls:0,mcpCalls:0,pending:0,failed:0,unknown:0,sources:0,playbooks:0,partial:!1,groups:[]}}function v(e,t){if(e.calls>=2048){e.partial=!0;return}e.calls++,t.mcp&&e.mcpCalls++,t.state!==`completed`&&e[t.state]++;let n=e.groups.find(e=>e.label===t.label);if(!n&&e.groups.length<12&&(n={label:t.label,calls:0,pending:0,failed:0,unknown:0},e.groups.push(n)),!n){e.partial=!0;return}n.calls++,t.state!==`completed`&&n[t.state]++}function y(e,t,n){e.sources=Number.isSafeInteger(t)&&t>=0?Math.min(t,512):0,e.playbooks=Number.isSafeInteger(n)&&n>=0?Math.min(n,u):0,(t>512||n>2048)&&(e.partial=!0)}function b(){return{facts:new Map,counts:new Map,toolText:new Map,resources:new Map}}function x(e){return JSON.stringify([e.turnId??null,e.toolUseId])}function S(e,t){let n=x(e),r=t?.facts.get(n);if(r&&!(r.pending&&e.result!==null))return r;let i=c({name:e.name,input:e.input,result:e.result});return t&&(t.facts.set(n,i),t.counts.delete(n),t.toolText.delete(n)),i}function C(e){return`verse-note-${e.replace(/[^A-Za-z0-9_-]/g,``)}`}function w(e){return`verse-turn-${e.replace(/[^A-Za-z0-9_-]/g,``)}`}var T={read:0,edit:1,create:2,delete:3};function E(e){let t=0,n=0;for(let i of r(e).files)t+=i.additions,n+=i.deletions;return{additions:t,deletions:n}}function D(e,t,n){let r=n?.counts.get(e);if(r)return r;let i=E(t);return n?.counts.set(e,i),i}function O(e){return e.kind===`thinking`?[e]:e.kind===`toolGroup`?e.items.filter(e=>e.kind===`thinking`):[]}function k(e){return e.kind===`tool`?[e]:e.kind===`toolGroup`?e.items.filter(e=>e.kind===`tool`):[]}function A(e,t=null){let n=new Map,r=[],i=[],a=[],o=()=>{a.length!==0&&(i.push(j(a,n,r,t)),a=[])},s;for(let t of e){let e=`turnId`in t?t.turnId:null;(t.kind===`user`||s!==void 0&&e!==null&&e!==s)&&o(),(t.kind===`user`||s===void 0||e!==null)&&(s=e),a.push(t)}return o(),{turns:i,facts:n,errorAnchors:r}}function j(e,t,n,r){let i=e[0],s=new Map,c=0,u=0,d=0,f=null,p=`running`,m=null,h=null,b=[],w=a(),E={shown:0,hidden:0,durationMs:null,tokens:null},A=_(),j=0,N=e=>{d++,f||=e,n.push(e)};for(let n of e){n.kind===`user`&&h===null&&(h=n.text),n.kind===`user`&&n.playbook&&j++;for(let e of O(n)){let t=e.redacted||e.text.trim().length===0;t?E.hidden++:E.shown++,e.durationMs!==null&&(E.durationMs=(E.durationMs??0)+e.durationMs);let n=e.estimatedTokens??(t?null:Math.ceil(e.text.trim().length/4));n!==null&&(E.tokens=(E.tokens??0)+n)}n.kind===`source`&&n.turnId!==null&&b.push(n.source);for(let e of k(n)){c++;let n=S(e,r);v(A,g(x(e),e.name,n,r?.resources??null)),t.set(e.toolUseId,n),n.action===`command`&&u++,n.failed&&N(`verse-tool-${e.toolUseId.replace(/[^A-Za-z0-9_-]/g,``)}`);for(let t of n.sources)b.push(t.toolUseId?t:{...t,toolUseId:e.toolUseId});M(w,n);let i=n.action;if(i!==`read`&&i!==`edit`&&i!==`create`&&i!==`delete`)continue;let a=n.diff?D(x(e),n.diff.text,r):{additions:0,deletions:0};for(let t of n.paths){let r=s.get(t)??{path:t,reads:0,edits:0,creates:0,deletes:0,action:i,anchorToolUseId:e.toolUseId,additions:0,deletions:0,failed:!1};i===`read`?r.reads++:i===`edit`?r.edits++:i===`create`?r.creates++:r.deletes++,T[i]>T[r.action]&&(r.action=i,r.anchorToolUseId=e.toolUseId),i!==`read`&&(r.additions+=a.additions,r.deletions+=a.deletions),n.failed&&(r.failed=!0),s.set(t,r)}}switch(n.kind){case`error`:N(C(n.key)),p=`error`;break;case`cancelled`:p=`stopped`;break;case`turn-done`:m=n.durationMs>0?n.durationMs:m,n.ok?p=p===`running`?`ok`:p:p===`running`&&(p=`error`,N(C(n.key)))}}let P=0,F=0;for(let e of s.values())e.action===`read`?w.filesRead++:e.action===`edit`?w.filesEdited++:e.action===`create`?w.filesCreated++:w.filesDeleted++,P+=e.additions,F+=e.deletions;(P>0||F>0)&&(w.additions=P,w.deletions=F);let I=o(b);return y(A,I.length,j),w.sources=I.length,w.thoughts=E.shown,w.hiddenThoughts=E.hidden,{key:i.key,turnId:`turnId`in i?i.turnId:null,items:e,prompt:h,at:i.at,citations:I,stats:w,work:l(w),reasoning:E,resources:A,files:[...s.values()].sort((e,t)=>T[t.action]-T[e.action]||t.additions+t.deletions-(e.additions+e.deletions)||e.path.localeCompare(t.path)),toolCount:c,commandCount:u,errorCount:d,firstErrorAnchor:f,status:p,durationMs:m}}function M(e,t){switch(t.action){case`command`:e.commands++,t.failed&&e.commandsFailed++;break;case`search`:e.codeSearches++;break;case`web`:e.webLookups++;break;case`task`:e.subagents++;break;case`other`:e.otherTools++}t.failed&&e.failed++}function N(e){if(e.length===0)return``;let t={edited:0,created:0,deleted:0,read:0};for(let n of e)n.action===`edit`?t.edited++:n.action===`create`?t.created++:n.action===`delete`?t.deleted++:t.read++;let n=[];return t.created&&n.push(`${t.created} created`),t.edited&&n.push(`${t.edited} edited`),t.deleted&&n.push(`${t.deleted} deleted`),t.read&&n.push(`${t.read} read`),n.join(`, `)}var P=new WeakMap,F=4e3;function I(e,t){let n=x(e),r=t?.toolText.get(n);if(r!==void 0)return r;let i=[e.name];if(typeof e.input==`string`)i.push(e.input.slice(0,F));else if(e.input)try{i.push(JSON.stringify(e.input).slice(0,F))}catch{}e.result&&i.push(e.result.output.slice(0,F));let a=i.join(`
|
|
2
|
+
`);return t&&e.result&&t.toolText.set(n,a),a}function L(e,t=null){let n=P.get(e);if(n!==void 0)return n;let r=[],i=e=>{switch(e.kind){case`user`:case`assistant`:case`thinking`:r.push(e.text);break;case`error`:r.push(e.message);break;case`tool`:r.push(I(e,t));break;case`toolGroup`:for(let t of e.items)i(t)}};for(let t of e.items)i(t);let a=r.join(`
|
|
3
|
+
`);return P.set(e,a),a}var R=48;function z(e,t,n=null){let r=t.trim().toLowerCase();if(r.length===0)return[];let i=[];for(let t of e){let e=L(t,n),a=e.toLowerCase().indexOf(r);if(a===-1)continue;let o=Math.max(0,a-R),s=Math.min(e.length,a+r.length+R),c=`${o>0?`…`:``}${e.slice(o,s).replace(/\s+/g,` `).trim()}${s<e.length?`…`:``}`;i.push({turnKey:t.key,snippet:c})}return i}function B(e,t=72){let n=e.prompt?.replace(/\s+/g,` `).trim();return n?n.length>t?`${n.slice(0,t-1)}…`:n:e.toolCount>0?`${e.toolCount} tool call${e.toolCount===1?``:`s`}`:`Session note`}var V=`/api/verse/sources/open`;function H(){let t=e();if(!t)throw new i;return t}async function U(e,r,i){await n(V,i===void 0?{sessionId:e,path:r}:{sessionId:e,path:r,line:i},H()),t()}export{N as a,w as c,b as i,B as l,A as n,C as o,E as r,z as s,U as t};
|
|
4
|
+
//# sourceMappingURL=sources-queries-Cjk1rpDU.js.map
|