@ashlr/hub 3.22.0 → 3.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +5 -5
- package/dist/authority-surface.json +16 -11
- package/dist/build-identity.json +2 -2
- package/dist/cli/verify-safety-sources.d.ts +4 -0
- package/dist/cli/verify-safety-sources.js +41 -0
- package/dist/cli/verify-safety-sources.js.map +1 -0
- package/dist/cli/verify-safety.js +16 -1
- package/dist/cli/verify-safety.js.map +1 -1
- package/dist/core/decide/needs-you.d.ts +3 -1
- package/dist/core/decide/needs-you.js +52 -28
- package/dist/core/decide/needs-you.js.map +1 -1
- package/dist/core/fleet/fleet-control-model.d.ts +2 -1
- package/dist/core/fleet/fleet-control-model.js +5 -0
- package/dist/core/fleet/fleet-control-model.js.map +1 -1
- package/dist/core/fleet/fleet-control-types.d.ts +11 -1
- package/dist/core/fleet/fleet-control.d.ts +4 -0
- package/dist/core/fleet/fleet-control.js +23 -1
- package/dist/core/fleet/fleet-control.js.map +1 -1
- package/dist/core/fleet/quota.js +1 -1
- package/dist/core/fleet/quota.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
- package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
- package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
- package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
- package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
- package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"live-model-CCjYFk48.js","names":[],"sources":["../../../../../../src/core/authority/types.ts","../../../../../../src/web-ui/routes/verse/command/GrantScopeEditor.tsx","../../../../../../src/web-ui/routes/verse/command/GrantSheet.tsx","../../../../../../src/web-ui/routes/verse/command/AutonomyBar.tsx","../../../../../../src/web-ui/routes/verse/fleet/fleet-control.module.css","../../../../../../src/web-ui/routes/verse/fleet/live-model.ts"],"sourcesContent":["/**\n * Standing authority — V3.10 Track B contract (unit B-U1, frozen day 0).\n *\n * ONE Touch ID signs a StandingGrantV1 with a non-exportable Secure Enclave\n * key (tools/custody, unit U2). The grant bounds everything autonomy may do\n * for ≤ 30 days — repos and their stage, merge caps, spend, engines, the\n * Leader's action classes — plus a signed ROLLOUT LADDER that the daemon\n * climbs by itself as evidence accrues and drops back down on a breach\n * (addendum §1). It can never climb past the last signed stage, and the\n * Leader can neither skip nor edit stages.\n *\n * Invariants these types serve (SPEC-310B §0):\n * I1 Only a grant signed under Touch ID RAISES authority. Lowering it — Stop,\n * revoke, switching down, moving the budget toward reserve — is instant\n * and needs no auth.\n * I2 Agents cannot read, write or invoke anything that signs, stores or\n * widens authority, and changed authority code cannot run under an old\n * grant (`authoritySurfaceDigest`).\n * I3 Effective policy = min(grant, current rollout stage, config, compiled\n * ceilings). Config and the Leader can only tighten it.\n * I4 Every merge is remote, pinned to a SHA, checked server-side, attributed\n * and reversible.\n * I5 Mason's reserve is never spent.\n *\n * CANONICAL BYTES — the contract between the TS verifier (U1) and the Swift\n * helper (U2). A grant is signed over\n * STANDING_GRANT_SIGNING_DOMAIN ‖ canonicalizeDaemonActivationValue(payload)\n * i.e. keys sorted by UTF-16 code unit, no whitespace, `undefined` keys\n * omitted, strings escaped exactly as JSON.stringify escapes them (so '/' is\n * NOT escaped — Swift's JSONEncoder escapes it, so the helper needs its own\n * canonicalizer). To make byte-identical output easy in both languages, every\n * number in a grant is a non-negative safe integer and every string is\n * printable ASCII matching STANDING_GRANT_PATTERNS (never '\"' or '\\\\').\n *\n * Honesty rule: `null` = unknown.\n *\n * BROWSER-SAFE: the Command surface imports this — type-only imports and\n * plain constants, no node: modules. It is also a LEAF of the authority\n * surface: it imports nothing at runtime, so it never widens the authority\n * import closure.\n */\nimport type { BudgetMode } from '../routing/types.js';\nimport type {\n FleetActor,\n FleetPrChange,\n FleetPrRecord,\n GateResult,\n GrantEngine,\n LandingRecord,\n MergeRisk,\n PostMergeResult,\n RepoEnforcement,\n RepoHold,\n RepoHoldKind,\n RepoStage,\n ReserveBreachRecord,\n SandboxViolationRecord,\n WouldMergeRecord,\n} from '../fleet/fleet-types.js';\nimport type {\n LeaderAction,\n LeaderActionClass,\n LeaderMemoRecord,\n LeaderOutcomeRecord,\n LeaderVetoRecord,\n} from '../vision/leader-types.js';\nimport type { ExperimentResultV1, HarnessTransition, HarnessVersion } from '../learn/harness-types.js';\n\n// The three day-0 record types SPEC-310BC-COORD §1 lists under \"authority\n// types\" live with their domains (fleet / vision / learn) so each owning unit\n// finds them next to its code; re-exported here so both import paths work.\nexport type { LandingRecord, LeaderAction, HarnessVersion };\n\n// ---------------------------------------------------------------------------\n// Small shared vocab\n// ---------------------------------------------------------------------------\n\n/**\n * - `off` — nothing autonomous runs (dark), whatever the grant allows.\n * - `propose` — the fleet runs and opens PRs; nothing merges; the Leader only proposes.\n * - `autonomous` — merges land where the grant and its current rollout stage allow.\n * Anyone may lower it; raising it is capped at the grant (raising past the\n * grant needs a new grant — Touch ID).\n */\nexport type AutonomySwitch = 'off' | 'propose' | 'autonomous';\n\nexport const AUTONOMY_SWITCHES: readonly AutonomySwitch[] = ['off', 'propose', 'autonomous'];\n\nexport const AUTONOMY_SWITCH_RANK: Readonly<Record<AutonomySwitch, number>> = Object.freeze({\n off: 0,\n propose: 1,\n autonomous: 2,\n});\n\n/**\n * Budget modes ordered by how much autonomy may spend. \"Toward reserve\" is\n * lowering (instant, class A for the Leader); \"toward all-in\" is raising\n * (class B, capped at the grant's `spend.maxMode`).\n */\nexport const BUDGET_MODE_RANK: Readonly<Record<BudgetMode, number>> = Object.freeze({\n reserve: 0,\n balanced: 1,\n 'all-in': 2,\n});\n\n/** Class C is never grantable — it is by definition outside the grant. */\nexport type LeaderGrantClass = Exclude<LeaderActionClass, 'C'>;\n\n/** How the grant treats ashlr-hub itself. */\nexport type SelfRepoMode = 'propose-only' | 'merge-non-authority';\n\nexport type SeatRole = 'producer' | 'judge' | 'leader';\n\n/**\n * Activation capability kinds. `proposal-once` is master's one-shot permit;\n * `resident-standing` is minted per tick under a standing grant (U1 widens\n * DaemonActivationCapability['kind'] in activation-permit.ts to this union).\n * Loop code should test `kind === 'proposal-once'`, which compiles before and\n * after the widening.\n */\nexport type DaemonCapabilityKind = 'proposal-once' | 'resident-standing';\n\n// ---------------------------------------------------------------------------\n// StandingGrantV1 (+ the addendum's rollout ladder)\n// ---------------------------------------------------------------------------\n\nexport interface StandingGrantRepo {\n /** GitHub `owner/name`. */\n nameWithOwner: string;\n /** The most this repo may ever reach under this grant. */\n stage: RepoStage;\n enforcement: RepoEnforcement;\n maxRisk: MergeRisk;\n maxMergesPerDay: number;\n}\n\nexport interface StandingGrantMerge {\n /** Explicit signed opt-in; absent retains legacy volume limits, including local 4/150/4. */\n volumePolicy?: 'operator-signed';\n maxFiles: number;\n maxLines: number;\n selfRepo: SelfRepoMode;\n}\n\nexport interface StandingGrantSeat {\n enabled: boolean;\n /** Percent (integer 0–100) of the binding window autonomy never touches — Mason's reserve. */\n reserveFloorPercent: number;\n /** Autonomy stays off the seat while its 5-hour window is above this percent. Absent = no session ceiling. */\n maxSessionWindowPercent?: number;\n roles: SeatRole[];\n}\n\nexport interface StandingGrantSpend {\n /** Highest budget mode autonomy (and the Leader) may select. */\n maxMode: BudgetMode;\n /** Integer USD per day for metered (per-token) APIs; 0 = none. */\n meteredUsdPerDay: number;\n /** Keyed by seat id. A seat absent here is unusable by autonomy (fail closed). */\n seats: Record<string, StandingGrantSeat>;\n}\n\nexport interface StandingGrantLeader {\n classes: LeaderGrantClass[];\n /** Class-B veto window in minutes (≥ STANDING_GRANT_CEILINGS.minVetoMinutes). */\n vetoMinutes: number;\n}\n\n/**\n * Exit criteria for ONE rollout stage, evaluated from ledger rows written\n * while that stage was current. All met ⇒ the daemon advances one stage\n * (`rollout:advanced`). A breach — any sandbox violation, any reserve\n * breach, or a revert rate above `maxRevertRatePct` — drops it back one\n * stage (`rollout:regressed`).\n */\nexport interface RolloutCriteria {\n /** Merges landed in the stage. In a stage where no repo is at `merge` (shadow), complete would-merge digests count instead. */\n minMerges: number;\n /** green / (green + red) over the stage's completed post-merge watches, integer percent. With no completed watch it is met only when minMerges is 0. */\n minPostMergeGreenPct: number;\n /** reverts / merges in the stage, integer percent. */\n maxRevertRatePct: number;\n /** Hours since the stage was entered. */\n minHours: number;\n /** Literal 0: no stage ever tolerates a sandbox violation. */\n maxSandboxViolations: 0;\n /** Literal 0: no stage ever tolerates spending Mason's reserve. */\n reserveBreaches: 0;\n}\n\nexport interface RolloutStageRepo {\n nameWithOwner: string;\n stage: RepoStage;\n}\n\n/**\n * One rung of the ladder. A stage can only NARROW the grant's top-level\n * scope: its repos ⊆ grant repos (stage ≤ the repo's grant stage), engines ⊆\n * grant engines, caps ≤ grant caps, leaderClasses ⊆ grant leader classes.\n * The verifier and the Swift helper both reject a stage that widens anything.\n */\nexport interface RolloutStage {\n /** e.g. `shadow`, `2a`, `2b`, `2c`, `full` (STANDING_GRANT_PATTERNS.stageId). */\n id: string;\n repos: RolloutStageRepo[];\n engines: GrantEngine[];\n maxRisk: MergeRisk;\n maxFiles: number;\n maxLines: number;\n maxMergesPerRepoPerDay: number;\n leaderClasses: LeaderGrantClass[];\n criteria: RolloutCriteria;\n}\n\nexport interface StandingGrantRollout {\n /** Ordered, first = where the grant starts. 1..STANDING_GRANT_CEILINGS.maxStages. */\n stages: RolloutStage[];\n /** Literal true: advancing is automatic; the ladder itself is what Mason signed. */\n autoAdvance: true;\n}\n\nexport interface StandingGrantV1 {\n v: 1;\n /** 32 lowercase hex. */\n grantId: string;\n /** Positive integer; must be ≥ minGrantSeq (Revoke bumps minGrantSeq past the revoked grant). */\n grantSeq: number;\n /** Must name a compiled trust root (authority/trust-roots.ts); never a file or env value. */\n keyId: string;\n issuedAt: string;\n /** ≤ issuedAt + 30 days. */\n expiresAt: string;\n /** sha256 hex of this Mac's IOPlatformUUID (uppercase, as `ioreg` prints it) — the grant is useless elsewhere. */\n hostBinding: string;\n /** Digest of dist/authority-surface.json's closure; a deploy that changes it pauses the grant until re-approved. */\n authoritySurfaceDigest: string;\n repos: StandingGrantRepo[];\n merge: StandingGrantMerge;\n spend: StandingGrantSpend;\n engines: GrantEngine[];\n leader: StandingGrantLeader;\n /** Lets the goal / simple conductors run live (liveConductorActivationAuthorized). */\n conductorGoals: boolean;\n rollout: StandingGrantRollout;\n}\n\n/** What ashlr-custody `sign-grant` returns and what is stored on disk (grants are signed public data, not secrets). */\nexport interface SignedStandingGrantV1 {\n payload: StandingGrantV1;\n /** ES256 over the canonical bytes: base64 (RFC 4648 §4, padded) of the 64-byte IEEE-P1363 r‖s form. */\n signature: string;\n}\n\n/** A compiled trust root (authority/trust-roots.ts STANDING_GRANT_TRUST_ROOTS). ES256 only — the old ed25519 key is never trusted. */\nexport interface StandingGrantTrustRoot {\n keyId: string;\n alg: 'ES256';\n /** SPKI PEM of the Secure Enclave P-256 public key. */\n publicKeyPem: string;\n}\n\nexport const STANDING_GRANT_SIGNING_DOMAIN = 'ashlr:standing-grant:v1\\0';\n\n/**\n * Compiled ceilings (SPEC-310B §1 + addendum §5). No grant, config value or\n * Leader action can exceed them; the helper refuses to sign a payload above\n * them and the verifier refuses to accept one. The structural bounds at the\n * end are parser limits (blast radius for a malformed payload), not policy.\n */\nexport const STANDING_GRANT_CEILINGS = Object.freeze({\n maxTtlMs: 30 * 24 * 60 * 60 * 1000,\n maxRisk: 'medium',\n /** Transport-safe integer bounds, not product throughput policies. */\n maxFiles: Number.MAX_SAFE_INTEGER,\n maxLines: Number.MAX_SAFE_INTEGER,\n maxMergesPerRepoPerDay: Number.MAX_SAFE_INTEGER,\n /** Local-authored risk bound and legacy size defaults (marker-absent grants). */\n localAuthored: Object.freeze({ maxRisk: 'low', maxFiles: 4, maxLines: 150 } as const),\n /** Local-enforcement risk bound and legacy volume defaults (marker-absent grants). */\n localEnforcement: Object.freeze({ maxRisk: 'low', maxFiles: 4, maxLines: 150, maxMergesPerDay: 4 } as const),\n minVetoMinutes: 30,\n maxVetoMinutes: 24 * 60,\n maxStageHours: 30 * 24,\n /** Mirrors routing/policy.ts BUDGET_MAX_DAILY_USD. */\n maxMeteredUsdPerDay: 10_000,\n maxRepos: 32,\n maxStages: 8,\n maxSeats: 64,\n maxRolesPerSeat: 3,\n} as const);\n\n/** Conservative defaults and legacy V1 limits; larger values require explicit signed opt-in. */\nexport const STANDING_GRANT_DEFAULT_VOLUME_LIMITS = Object.freeze({ maxFiles: 10, maxLines: 300, maxMergesPerRepoPerDay: 24 });\n\n/** MAX_SAFE_INTEGER represents an explicitly signed absence of a product volume cap. */\nexport function volumeLimitLabel(value: number): string {\n return value === Number.MAX_SAFE_INTEGER ? 'No volume cap' : String(value);\n}\n\n/** Every string in a grant matches one of these (see CANONICAL BYTES above). */\nexport const STANDING_GRANT_PATTERNS = Object.freeze({\n grantId: /^[a-f0-9]{32}$/u,\n keyId: /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u,\n /** hostBinding, authoritySurfaceDigest. */\n sha256Hex: /^[a-f0-9]{64}$/u,\n /** Exactly Date.prototype.toISOString()'s shape. */\n isoInstant: /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/u,\n nameWithOwner: /^[A-Za-z0-9][A-Za-z0-9-]{0,38}\\/[A-Za-z0-9._-]{1,100}$/u,\n stageId: /^[a-z0-9][a-z0-9-]{0,31}$/u,\n /** Same spelling rule as routing/policy.ts BUDGET_SEAT_ID_RE. */\n seatId: /^[A-Za-z0-9][A-Za-z0-9._:@/+-]{0,199}$/u,\n /** base64 of 64 bytes. */\n signature: /^[A-Za-z0-9+/]{86}==$/u,\n});\n\n/**\n * Builds a key list from an object literal that must name EVERY key of T —\n * `-?` makes optional keys mandatory in the literal, so a key added to an\n * interface without being added here is a compile error, and an unknown key\n * is an excess-property error. This is what keeps \"exact key set\" checks in\n * the verifier and the Swift helper from drifting from the types.\n */\nfunction keyList<T>(keys: { readonly [K in keyof T]-?: true }): readonly (keyof T & string)[] {\n return Object.freeze(Object.keys(keys)) as readonly (keyof T & string)[];\n}\n\n/**\n * Exact key sets per object level of a signed grant. Every key is required\n * EXCEPT those in STANDING_GRANT_OPTIONAL_KEYS; any other key is refused.\n */\nexport const STANDING_GRANT_KEYS = Object.freeze({\n envelope: keyList<SignedStandingGrantV1>({ payload: true, signature: true }),\n grant: keyList<StandingGrantV1>({\n v: true,\n grantId: true,\n grantSeq: true,\n keyId: true,\n issuedAt: true,\n expiresAt: true,\n hostBinding: true,\n authoritySurfaceDigest: true,\n repos: true,\n merge: true,\n spend: true,\n engines: true,\n leader: true,\n conductorGoals: true,\n rollout: true,\n }),\n repo: keyList<StandingGrantRepo>({\n nameWithOwner: true,\n stage: true,\n enforcement: true,\n maxRisk: true,\n maxMergesPerDay: true,\n }),\n merge: keyList<StandingGrantMerge>({ maxFiles: true, maxLines: true, selfRepo: true, volumePolicy: true }),\n spend: keyList<StandingGrantSpend>({ maxMode: true, meteredUsdPerDay: true, seats: true }),\n seat: keyList<StandingGrantSeat>({\n enabled: true,\n reserveFloorPercent: true,\n maxSessionWindowPercent: true,\n roles: true,\n }),\n leader: keyList<StandingGrantLeader>({ classes: true, vetoMinutes: true }),\n rollout: keyList<StandingGrantRollout>({ stages: true, autoAdvance: true }),\n stage: keyList<RolloutStage>({\n id: true,\n repos: true,\n engines: true,\n maxRisk: true,\n maxFiles: true,\n maxLines: true,\n maxMergesPerRepoPerDay: true,\n leaderClasses: true,\n criteria: true,\n }),\n stageRepo: keyList<RolloutStageRepo>({ nameWithOwner: true, stage: true }),\n criteria: keyList<RolloutCriteria>({\n minMerges: true,\n minPostMergeGreenPct: true,\n maxRevertRatePct: true,\n minHours: true,\n maxSandboxViolations: true,\n reserveBreaches: true,\n }),\n});\n\n/** The only optional keys in a signed grant. */\nexport const STANDING_GRANT_OPTIONAL_KEYS = Object.freeze({\n merge: Object.freeze(['volumePolicy'] as const),\n seat: Object.freeze(['maxSessionWindowPercent'] as const),\n});\n\n// ---------------------------------------------------------------------------\n// EffectivePolicy — what currentStandingPolicy() returns\n// ---------------------------------------------------------------------------\n\nexport interface EffectiveRepoPolicy {\n volumePolicy?: 'operator-signed';\n nameWithOwner: string;\n /** min(grant repo stage, current rollout stage, switch, selfRepo rule). */\n stage: RepoStage;\n enforcement: RepoEnforcement;\n maxRisk: MergeRisk;\n maxFiles: number;\n maxLines: number;\n maxMergesPerDay: number;\n /** Non-null only for ashlr-hub itself: the grant's merge.selfRepo. */\n selfRepo: SelfRepoMode | null;\n}\n\nexport interface EffectiveMergePolicy {\n volumePolicy?: 'operator-signed';\n /** The grant-wide cap after min(grant, stage, config, ceilings); a repo's own cap may be lower. */\n maxFiles: number;\n maxLines: number;\n selfRepo: SelfRepoMode;\n /** Caps for work a local model authored. */\n localAuthored: { maxRisk: 'low'; maxFiles: number; maxLines: number };\n}\n\nexport interface EffectiveSeatPolicy {\n seatId: string;\n enabled: boolean;\n reserveFloorPercent: number;\n /** null = no session ceiling. */\n maxSessionWindowPercent: number | null;\n roles: readonly SeatRole[];\n}\n\nexport interface EffectiveSpendPolicy {\n maxMode: BudgetMode;\n meteredUsdPerDay: number;\n /** A seat absent here is unusable by autonomy (fail closed). */\n seats: Readonly<Record<string, EffectiveSeatPolicy>>;\n}\n\nexport interface EffectiveLeaderPolicy {\n /**\n * Current stage's leaderClasses ∩ the grant's. Empty while the switch is\n * `propose` (the Leader only proposes) and in a shadow stage (dry-run memos).\n */\n classes: readonly LeaderGrantClass[];\n vetoMinutes: number;\n}\n\nexport interface EffectiveRolloutPosition {\n stageId: string;\n /** 0-based. */\n stageIndex: number;\n stageCount: number;\n /** When this stage became current (from the ledger). */\n enteredAt: string;\n}\n\n/**\n * The standing authority actually in force right now: min(grant, current\n * rollout stage, clamp switch, config, compiled ceilings). It exists only\n * while a verified, unexpired, unrevoked, unpaused grant is installed, KILL\n * is off, the switch is not `off` and the ledger chain is intact — otherwise\n * currentStandingPolicy() returns null and the fleet behaves exactly as\n * master does (dark).\n */\nexport interface EffectivePolicy {\n v: 1;\n grantId: string;\n grantSeq: number;\n keyId: string;\n issuedAt: string;\n expiresAt: string;\n /** Never `off` here (off ⇒ no policy at all). */\n switch: Exclude<AutonomySwitch, 'off'>;\n rollout: EffectiveRolloutPosition;\n /** The current stage's repos only, each fully clamped. */\n repos: readonly EffectiveRepoPolicy[];\n merge: EffectiveMergePolicy;\n spend: EffectiveSpendPolicy;\n /** Stage engines ∩ grant engines. */\n engines: readonly GrantEngine[];\n leader: EffectiveLeaderPolicy;\n conductorGoals: boolean;\n /** When this value was computed (currentStandingPolicy caches ≤ 10 s). */\n computedAt: string;\n}\n\n// ---------------------------------------------------------------------------\n// Rollout evidence / progress\n// ---------------------------------------------------------------------------\n\n/** What the criteria were evaluated against (recorded on rollout ledger rows). */\nexport interface RolloutEvidence {\n hoursInStage: number;\n merges: number;\n /** null = no completed post-merge watch in the stage. */\n postMergeGreenPct: number | null;\n /** null = no merges in the stage. */\n revertRatePct: number | null;\n sandboxViolations: number;\n reserveBreaches: number;\n}\n\nexport interface RolloutProgress extends EffectiveRolloutPosition, RolloutEvidence {\n criteria: RolloutCriteria;\n /** null = this is the last signed stage. */\n nextStageId: string | null;\n /** Every criterion met — the daemon advances on its next tick. */\n met: boolean;\n /** Plain-language unmet criteria, e.g. \"3 of 10 merges\", \"6 h of 8 h\". */\n unmet: string[];\n}\n\n// ---------------------------------------------------------------------------\n// The authority ledger — ~/.ashlr/authority/ledger.jsonl (authority/ledger.ts)\n// ---------------------------------------------------------------------------\n\n/**\n * Entry hash = sha256hex(LEDGER_HASH_DOMAIN ‖ canonicalizeDaemonActivationValue(\n * entry without `hash`)). `prevHash` chains to the previous entry (the first\n * entry uses LEDGER_GENESIS_PREV_HASH) and `seq` is contiguous from 0. A\n * broken or shortened chain halts everything until a new grant is signed.\n */\nexport const LEDGER_HASH_DOMAIN = 'ashlr:authority-ledger:v1\\0';\n\nexport const LEDGER_GENESIS_PREV_HASH = '0'.repeat(64);\n\n/** Why a grant is paused (it stays installed; a re-approval — new grant, one Touch ID — resumes). */\nexport type GrantPauseCode = 'authority-code-changed' | 'ledger-broken';\n\n/**\n * An autonomous run whose sandbox-violation evidence is UNKNOWN (3.10 d0):\n * the kernel log watch for its tagged deny rules was unavailable or did not\n * reach its end barrier, so an empty violation list proves nothing. The\n * rollout neither counts the run as clean nor treats it as a breach: the row\n * HOLDS the stage (never advances it, never regresses it) — see\n * `EVIDENCE_UNKNOWN_HOLD_MS` in authority/rollout.ts.\n */\nexport interface SandboxEvidenceUnknownRecord {\n v: 1;\n engine: string;\n repo: string | null;\n runId: string | null;\n /** The kernel evidence state (never `complete` — a complete run writes no row). */\n state: 'incomplete' | 'unavailable';\n /** Plain sentence from the evidence watch, no paths. */\n reason: string;\n at: string;\n}\n\n/**\n * Payload per ledger event kind. Rows are immutable once written, so a\n * payload never changes shape — add a new kind instead. Grouped by writer.\n */\nexport interface LedgerPayloads {\n // U1 — lifecycle of the ledger itself, grants, switch, kill, rollout\n /** First row of every chain. `hostBinding` null = this machine's binding could not be read (non-macOS, tests). */\n 'ledger:genesis': { hostBinding: string | null };\n /**\n * Second row of a chain that REPLACED a broken one. Written only while\n * installing a newly signed grant (the Touch ID is the authorization to\n * start over); the broken file is kept beside it. `grantSeqFloor` carries\n * the old chain's highest accepted grantSeq forward, so a grant accepted\n * before the break can never be re-installed (sequence rollback).\n */\n 'ledger:recovered': {\n /** Last intact entry of the broken chain; null when nothing was intact. */\n previousHead: LedgerHead | null;\n brokenAtSeq: number | null;\n reason: string;\n /** File name (not path) the broken chain was archived under. */\n archivedAs: string;\n grantSeqFloor: number;\n };\n 'grant:accepted': {\n grantId: string;\n grantSeq: number;\n keyId: string;\n issuedAt: string;\n expiresAt: string;\n authoritySurfaceDigest: string;\n stageIds: string[];\n /** sha256 hex of the canonical signed envelope. */\n envelopeDigest: string;\n };\n 'grant:rejected': { grantId: string | null; code: string; reason: string };\n 'grant:paused': { grantId: string; code: GrantPauseCode; reason: string };\n 'grant:revoked': { grantId: string | null; minGrantSeq: number; reason: string };\n 'grant:expired': { grantId: string; expiresAt: string };\n 'switch:changed': { from: AutonomySwitch; to: AutonomySwitch; requested: AutonomySwitch; reason: string };\n 'kill:on': { reason: string };\n 'kill:off': { reason: string };\n 'rollout:advanced': {\n grantId: string;\n fromStageId: string;\n toStageId: string;\n toStageIndex: number;\n evidence: RolloutEvidence;\n };\n 'rollout:regressed': {\n grantId: string;\n fromStageId: string;\n toStageId: string;\n toStageIndex: number;\n breach: string;\n evidence: RolloutEvidence;\n };\n // U3 — gates, PRs, merges\n 'gate:result': GateResult;\n 'gate:would-merge': WouldMergeRecord;\n 'pr:opened': FleetPrRecord;\n 'pr:closed': FleetPrChange;\n 'pr:reopened': FleetPrChange;\n 'merge:landed': LandingRecord;\n // U4 — post-merge watch, reverts, holds\n 'post-merge:result': PostMergeResult;\n 'revert:landed': LandingRecord;\n 'revert:failed': { landingId: string; repo: string; reason: string };\n 'hold:set': RepoHold;\n 'hold:cleared': { repo: string; kind: RepoHoldKind; reason: string };\n // Safety signals that regress the rollout (U2 / U5 / U6)\n 'sandbox:violation': SandboxViolationRecord;\n 'reserve:breach': ReserveBreachRecord;\n /** d0: a run whose violation evidence is unknown — HOLDS the rollout, never moves it. */\n 'sandbox:evidence-unknown': SandboxEvidenceUnknownRecord;\n // U8 — Leader\n 'leader:memo': LeaderMemoRecord;\n /** Written on every status change (scheduled, applied — with its inverse — refused, failed, escalated). */\n 'leader:action': LeaderAction;\n 'leader:vetoed': LeaderVetoRecord;\n 'leader:outcome': LeaderOutcomeRecord;\n // U9 — harness\n 'harness:experiment': ExperimentResultV1;\n 'harness:adopted': HarnessTransition;\n 'harness:rolled-back': HarnessTransition;\n 'harness:rejected': HarnessTransition;\n // Informational only — nothing reads a note to make an authority decision.\n note: { topic: string; detail: string };\n}\n\nexport type LedgerEventKind = keyof LedgerPayloads;\n\n/** Every ledger event kind (exhaustive — a kind added to LedgerPayloads must be added here). */\nexport const LEDGER_EVENT_KINDS = keyList<LedgerPayloads>({\n 'ledger:genesis': true,\n 'ledger:recovered': true,\n 'grant:accepted': true,\n 'grant:rejected': true,\n 'grant:paused': true,\n 'grant:revoked': true,\n 'grant:expired': true,\n 'switch:changed': true,\n 'kill:on': true,\n 'kill:off': true,\n 'rollout:advanced': true,\n 'rollout:regressed': true,\n 'gate:result': true,\n 'gate:would-merge': true,\n 'pr:opened': true,\n 'pr:closed': true,\n 'pr:reopened': true,\n 'merge:landed': true,\n 'post-merge:result': true,\n 'revert:landed': true,\n 'revert:failed': true,\n 'hold:set': true,\n 'hold:cleared': true,\n 'sandbox:violation': true,\n 'reserve:breach': true,\n 'sandbox:evidence-unknown': true,\n 'leader:memo': true,\n 'leader:action': true,\n 'leader:vetoed': true,\n 'leader:outcome': true,\n 'harness:experiment': true,\n 'harness:adopted': true,\n 'harness:rolled-back': true,\n 'harness:rejected': true,\n note: true,\n});\n\nexport interface LedgerEntryBase {\n v: 1;\n /** 0-based, contiguous. */\n seq: number;\n at: string;\n actor: FleetActor;\n /** The standing grant in force when written; null = none. */\n grantId: string | null;\n /** nameWithOwner when the event concerns one repo; null otherwise. */\n repo: string | null;\n prevHash: string;\n hash: string;\n}\n\nexport type LedgerEntryOf<K extends LedgerEventKind> = LedgerEntryBase & { kind: K; data: LedgerPayloads[K] };\n\n/** Discriminated on `kind`, so narrowing the kind narrows `data`. */\nexport type LedgerEntry = { [K in LedgerEventKind]: LedgerEntryOf<K> }[LedgerEventKind];\n\n/** Input to appendLedger — the ledger fills seq, at, prevHash and hash. */\nexport interface LedgerAppendInput<K extends LedgerEventKind> {\n kind: K;\n data: LedgerPayloads[K];\n actor: FleetActor;\n grantId: string | null;\n repo: string | null;\n}\n\n/**\n * A failed append means the authority action must NOT proceed (fail closed):\n * e.g. U3 writes its gate rows before the merge call and aborts on !ok.\n */\nexport type LedgerAppendResult<K extends LedgerEventKind> =\n | { ok: true; entry: LedgerEntryOf<K> }\n | { ok: false; reason: string };\n\nexport interface LedgerHead {\n seq: number;\n hash: string;\n at: string;\n}\n\nexport interface LedgerReadOptions {\n sinceSeq?: number;\n sinceAt?: string;\n kinds?: readonly LedgerEventKind[];\n repo?: string;\n grantId?: string;\n /** Newest `limit` entries (after filtering); absent = all. */\n limit?: number;\n}\n\nexport interface LedgerReadResult {\n /** Oldest first. */\n entries: LedgerEntry[];\n head: LedgerHead | null;\n /** `broken` ⇒ callers fail closed (no merge, no advance). */\n chain: 'ok' | 'empty' | 'broken';\n brokenAtSeq: number | null;\n reason: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Authority API (U1) — GET / POST /api/verse/authority\n// ---------------------------------------------------------------------------\n\nexport const VERSE_AUTHORITY_PATH = '/api/verse/authority';\n\n/**\n * - `none` — no grant installed.\n * - `active` — verified and in force.\n * - `paused` — installed but paused (e.g. \"authority code changed — re-approve\").\n * - `expired` / `revoked` — needs a new grant.\n * - `invalid` — present but fails verification (key drift, host, digest, sequence).\n */\nexport type GrantState = 'none' | 'active' | 'paused' | 'expired' | 'revoked' | 'invalid';\n\nexport interface AuthorityGrantView {\n state: GrantState;\n /** Specific sentence for Mason; null when active. */\n reason: string | null;\n grantId: string | null;\n grantSeq: number | null;\n keyId: string | null;\n issuedAt: string | null;\n expiresAt: string | null;\n /** [] when there is no grant. */\n repos: StandingGrantRepo[];\n engines: GrantEngine[];\n maxMode: BudgetMode | null;\n stageIds: string[];\n}\n\nexport interface AuthorityCustodyView {\n /** ashlr-custody installed (root-owned) — null = unknown. */\n installed: boolean | null;\n keyInitialized: boolean | null;\n githubApp: boolean | null;\n claudeToken: boolean | null;\n}\n\nexport interface AuthorityStatusV1 {\n v: 1;\n checkedAt: string;\n /** The switch as last set (clamp.json). */\n switch: AutonomySwitch;\n /** What is actually in force: min(switch, grant, KILL). */\n effectiveSwitch: AutonomySwitch;\n /** Highest position reachable without a new grant; raising beyond it needs Touch ID. */\n maxSwitchWithoutGrant: AutonomySwitch;\n /** ~/.ashlr/KILL present (Stop). */\n kill: boolean;\n grant: AuthorityGrantView;\n rollout: RolloutProgress | null;\n /** currentStandingPolicy(). */\n policy: EffectivePolicy | null;\n ledger: { state: 'ok' | 'empty' | 'broken'; head: LedgerHead | null; reason: string | null };\n custody: AuthorityCustodyView;\n /**\n * Why `effectiveSwitch` is below `switch` (Stop, the grant's state, no OS\n * confinement, an unreadable config…); null when nothing holds it back.\n * Additive (3.10 phase 2) — absent from day-0 fixtures.\n */\n effectiveReason?: string | null;\n}\n\n/**\n * GET /api/verse/authority/setup and `ashlr authority setup --dry-run --json`\n * (src/cli/authority.ts) — the Phase-0 checklist. Read-only: producing it\n * asks nothing and changes nothing.\n */\nexport const VERSE_AUTHORITY_SETUP_PATH = '/api/verse/authority/setup';\n\n/** `skipped` = a dry run planned the step without performing it. */\nexport type AuthoritySetupStepStatus = 'done' | 'already' | 'waiting-on-you' | 'skipped' | 'blocked' | 'failed';\n\n/** What a setup step needs from Mason himself (a UI renders these as badges). */\nexport type AuthoritySetupNeed = 'sudo' | 'touch-id' | 'browser' | 'github' | 'terminal';\n\nexport interface AuthoritySetupStepV1 {\n /** Stable id (`custody-helper`, `github-app`, …). */\n id: string;\n step: string;\n status: AuthoritySetupStepStatus;\n detail: string;\n needs: readonly AuthoritySetupNeed[];\n /**\n * The exact command that moves this step on (copied, never executed by a\n * UI); null when nothing on this Mac can (a PR to merge, a build block).\n * Additive to v1 — absent from reports made before it existed.\n */\n command?: string | null;\n /** A page the step waits on (the App's install page, the trust-root PR); null when none. Additive. */\n link?: string | null;\n}\n\nexport interface AuthoritySetupReportV1 {\n schema: 'ashlr.authority-setup.v1';\n dryRun: boolean;\n /** Every step is done or already in place, including resident runtime admission. */\n complete: boolean;\n summary: { done: number; already: number; waitingOnYou: number; blocked: number; failed: number; planned: number };\n steps: AuthoritySetupStepV1[];\n /** The first step that is not done or already in place (null when complete). */\n next: string | null;\n}\n\n/**\n * GET /api/verse/authority/draft — the grant the server would ask Mason to\n * sign (the default ladder) and its digest. The Touch ID sheet renders it;\n * the `grant` / `re-approve` actions echo `digest` so the server signs\n * exactly what Mason saw.\n */\nexport interface AuthorityGrantDraft {\n payload: StandingGrantV1;\n /** sha256 hex of the canonical payload. */\n digest: string;\n}\n\n/**\n * POST /api/verse/authority — exactly one form per request. Lowering forms\n * (switch down, stop, revoke) apply instantly with no auth. `clear-stop` and\n * raising the switch up to `maxSwitchWithoutGrant` need no Touch ID either:\n * both stay inside what the installed grant already allows. Raising past it\n * is refused with 409 `grant-required`; `grant` / `re-approve` trigger the\n * custody helper's Touch ID prompt on this Mac and answer with the new\n * AuthorityStatusV1. Like every Verse POST, these pass the dispatch and\n * mutation-token gates, which agents cannot reach.\n */\nexport type AuthorityActionRequest =\n | { action: 'switch'; to: AutonomySwitch }\n | { action: 'stop' }\n | { action: 'clear-stop' }\n | { action: 'revoke'; reason?: string }\n | { action: 'grant'; draftDigest: string }\n | { action: 're-approve'; draftDigest: string };\n","/**\n * routes/verse/command/GrantScopeEditor.tsx — edit a grant draft's scope\n * before signing it (3.15), inside the Touch ID sheet.\n *\n * The editor chooses available scope and explicitly reviewed volume limits: repos from the draft\n * (the enrolled repos + the canary), engines the draft offers (the four fleet\n * lanes, plus Devin when the custody helper can sign it), Leader classes A/B,\n * the budget ceiling, metered dollars, the days, and per-change/per-repo volume. \"Preview\" sends the choice\n * to POST /api/verse/authority/draft, which applies it to its OWN draft\n * (authority/grant-scope.ts), re-validates it and answers the new draft with a\n * diff against the grant in force. What gets signed is exactly that returned\n * draft (its digest) — the helper then shows the scope again in its own Touch\n * ID prompt. Nothing here can sign, and nothing here holds a secret.\n */\nimport { useId, useState } from 'react';\nimport type { AuthorityGrantDraft, LeaderGrantClass, SeatRole } from '../../../../core/authority/types.js';\nimport type { GrantDiffLine, GrantDraftEditable, GrantScopeEdit, GrantSeatPolicyEdit } from '../../../../core/authority/grant-scope-types.js';\nimport type { GrantEngine } from '../../../../core/fleet/fleet-types.js';\nimport type { BudgetMode } from '../../../../core/routing/types.js';\nimport { apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { AUTHORITY_DRAFT_PATH } from './surface-data.js';\nimport { MicroLabel } from './Surface.js';\nimport styles from './command.module.css';\n\n/** The draft with the 3.15 additions the editor reads (absent from an older server). */\nexport interface EditableGrantDraft extends AuthorityGrantDraft {\n kind?: 'new' | 'reapprove';\n summary?: string[];\n startStageId?: string;\n diff?: GrantDiffLine[];\n editable?: GrantDraftEditable;\n eliteDirect?: boolean;\n}\n\n/** A draft with Mason's scope edits applied server-side, within its own draft. */\nexport async function postGrantDraft(kind: 'new' | 'reapprove' | 'auto', scope: GrantScopeEdit, eliteDirect?: boolean): Promise<EditableGrantDraft> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<EditableGrantDraft>(AUTHORITY_DRAFT_PATH, { kind, scope, ...(eliteDirect === undefined ? {} : { eliteDirect }) }, token);\n touchMutationHold();\n return result;\n}\n\nconst ENGINE_LABEL: Record<string, string> = {\n 'claude-cli': 'Claude Code (claude-cli)',\n codex: 'Codex',\n 'grok-cli': 'Grok (grok-cli)',\n devin: 'Devin',\n 'devin-cli': 'Devin CLI',\n local: 'Local models',\n};\n\n/** Editing only budget/scope must never opt a legacy grant into wider local limits. */\nfunction VolumeInput({ label, value, onChange }: { label: string; value: string; onChange: (value: string) => void }) {\n const id = useId();\n const unlimited = value === String(Number.MAX_SAFE_INTEGER);\n return <div>\n <label className={styles.scopeField} htmlFor={id}>\n <span>{label}</span>\n <input id={id} type=\"number\" min={label === 'Files per change' || label === 'Lines per change' ? 1 : 0} max={Number.MAX_SAFE_INTEGER} step={1} inputMode=\"numeric\" disabled={unlimited} value={unlimited ? '' : value} onChange={(e) => onChange(e.target.value)} />\n </label>\n <label className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={unlimited} aria-label={`No volume cap: ${label}`} onChange={(e) => onChange(e.target.checked ? String(Number.MAX_SAFE_INTEGER) : '1')} />\n <span>No volume cap</span>\n </label>\n </div>;\n}\n\ninterface SeatInputs {\n enabled: boolean;\n roles: SeatRole[];\n reserve: string;\n session: string;\n ceiling: boolean;\n}\n\nfunction SeatPolicyInputs({ id, value, roles, onChange }: { id: string; value: SeatInputs; roles: SeatRole[]; onChange: (field: keyof GrantSeatPolicyEdit, change: Partial<SeatInputs>) => void }) {\n const controlId = useId();\n return <fieldset className={styles.scopeFieldset}>\n <legend>{id}</legend>\n <label className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={value.enabled} onChange={(e) => onChange('enabled', { enabled: e.target.checked })} />\n <span>Permit autonomy on {id}</span>\n </label>\n {roles.map((role) => <label key={role} className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={value.roles.includes(role)} onChange={(e) => onChange('roles', { roles: toggle(value.roles, role, e.target.checked) })} />\n <span>{id}: {role}</span>\n </label>)}\n <label className={styles.scopeField} htmlFor={`${controlId}-reserve`}>\n <span>{id}: reserve for you (%)</span>\n <input id={`${controlId}-reserve`} type=\"number\" min={0} max={100} step={1} inputMode=\"numeric\" value={value.reserve} onChange={(e) => onChange('reserveFloorPercent', { reserve: e.target.value })} />\n </label>\n <label className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={!value.ceiling} onChange={(e) => onChange('maxSessionWindowPercent', { ceiling: !e.target.checked })} />\n <span>{id}: No session ceiling</span>\n </label>\n <label className={styles.scopeField} htmlFor={`${controlId}-session`}>\n <span>{id}: session usage ceiling (%)</span>\n <input id={`${controlId}-session`} type=\"number\" min={1} max={100} step={1} inputMode=\"numeric\" disabled={!value.ceiling} value={value.ceiling ? value.session : ''} onChange={(e) => onChange('maxSessionWindowPercent', { session: e.target.value })} />\n </label>\n </fieldset>;\n}\n\nconst MODE_LABEL: Record<BudgetMode, string> = { reserve: 'Reserve', balanced: 'Balanced', 'all-in': 'All-in' };\n\nfunction toggle<T>(list: readonly T[], value: T, on: boolean): T[] {\n return on ? (list.includes(value) ? [...list] : [...list, value]) : list.filter((v) => v !== value);\n}\n\nfunction daysOf(draft: AuthorityGrantDraft): number {\n const d = Math.round((Date.parse(draft.payload.expiresAt) - Date.parse(draft.payload.issuedAt)) / 86_400_000);\n return Number.isFinite(d) && d > 0 ? d : 30;\n}\n\nexport interface GrantScopeEditorProps {\n draft: EditableGrantDraft;\n busy: boolean;\n /** Ask the server for the edited draft (the sheet runs it through the token guard). */\n onPreview: (scope: GrantScopeEdit) => void;\n onReset: () => void;\n edited: boolean;\n onAccountSettings?: () => void;\n onResources?: () => void;\n onDirty?: () => void;\n}\n\nexport function GrantScopeEditor({ draft, busy, onPreview, onReset, edited, onAccountSettings, onResources, onDirty }: GrantScopeEditorProps) {\n const base = draft.editable;\n const g = draft.payload;\n const [repos, setRepos] = useState<string[]>(() => g.repos.map((r) => r.nameWithOwner));\n const [engines, setEngines] = useState<string[]>(() => [...g.engines]);\n const [classes, setClasses] = useState<string[]>(() => [...g.leader.classes]);\n const [mode, setMode] = useState<BudgetMode>(g.spend.maxMode);\n const [metered, setMetered] = useState<string>(String(g.spend.meteredUsdPerDay));\n const [days, setDays] = useState<string>(String(daysOf(draft)));\n const [files, setFiles] = useState(String(g.merge.maxFiles));\n const [lines, setLines] = useState(String(g.merge.maxLines));\n const [rates, setRates] = useState<Record<string, string>>(() => Object.fromEntries(g.repos.map((r) => [r.nameWithOwner, String(r.maxMergesPerDay)])));\n const [volumeEdited, setVolumeEdited] = useState(false);\n const [seats, setSeats] = useState<Record<string, SeatInputs>>(() => Object.fromEntries(Object.entries(g.spend.seats).map(([id, seat]) => [id, { enabled: seat.enabled, roles: [...seat.roles], reserve: String(seat.reserveFloorPercent), session: String(seat.maxSessionWindowPercent ?? 70), ceiling: seat.maxSessionWindowPercent !== undefined }])));\n const [seatFields, setSeatFields] = useState<Record<string, (keyof GrantSeatPolicyEdit)[]>>({});\n function changeSeat(id: string, field: keyof GrantSeatPolicyEdit, change: Partial<SeatInputs>): void {\n setSeats((current) => ({ ...current, [id]: { ...current[id]!, ...change } }));\n setSeatFields((current) => ({ ...current, [id]: toggle(current[id] ?? [], field, true) }));\n }\n\n const ids = { metered: useId(), days: useId(), mode: useId() };\n if (!base) {\n return <p className={styles.scopeMeta}>This server cannot edit a draft yet — update Ashlr to choose repos and engines here.</p>;\n }\n const meteredN = Number(metered);\n const daysN = Number(days);\n const volumeValid = !volumeEdited || (Number.isSafeInteger(Number(files)) && Number(files) > 0 && Number.isSafeInteger(Number(lines)) && Number(lines) > 0 && repos.every((repo) => rates[repo] !== undefined && rates[repo] !== '' && Number.isSafeInteger(Number(rates[repo])) && Number(rates[repo]) >= 0));\n const seatValid = Object.keys(seatFields).every((id) => {\n const seat = seats[id]!;\n return seat.roles.length > 0 && seat.reserve !== '' && Number.isInteger(Number(seat.reserve)) && Number(seat.reserve) >= 0 && Number(seat.reserve) <= 100\n && (!seat.ceiling || (seat.session !== '' && Number.isInteger(Number(seat.session)) && Number(seat.session) >= 1 && Number(seat.session) <= 100));\n });\n const valid = seatValid && volumeValid && repos.length > 0 && engines.length > 0 && Number.isInteger(meteredN) && meteredN >= 0 && Number.isInteger(daysN) && daysN >= 1 && daysN <= base.maxDays;\n\n function preview(): void {\n onPreview({\n repos,\n engines: engines as GrantEngine[],\n leaderClasses: classes as LeaderGrantClass[],\n maxMode: mode,\n meteredUsdPerDay: meteredN,\n days: daysN,\n ...(base?.seatPolicies && Object.keys(seatFields).length ? { seatPolicies: Object.fromEntries(Object.entries(seatFields).map(([id, fields]) => {\n const seat = seats[id]!;\n const policy: GrantSeatPolicyEdit = {};\n if (fields.includes('enabled')) policy.enabled = seat.enabled;\n if (fields.includes('roles')) policy.roles = seat.roles;\n if (fields.includes('reserveFloorPercent')) policy.reserveFloorPercent = Number(seat.reserve);\n if (fields.includes('maxSessionWindowPercent')) policy.maxSessionWindowPercent = seat.ceiling ? Number(seat.session) : null;\n return [id, policy];\n })) } : {}),\n ...(base?.volumeLimits && volumeEdited ? {\n maxFiles: Number(files), maxLines: Number(lines),\n repoMaxMergesPerDay: Object.fromEntries(repos.map((repo) => [repo, Number(rates[repo])])),\n } : {}),\n });\n }\n\n return (\n <div className={styles.scopeEditor} aria-label=\"Edit the grant scope\" onChange={onDirty}>\n <fieldset className={styles.scopeFieldset}>\n <legend><MicroLabel>Repositories ({repos.length}/{base.repos.length})</MicroLabel></legend>\n {base.repos.map((repo) => (\n <label key={repo} className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={repos.includes(repo)} onChange={(e) => setRepos(toggle(repos, repo, e.target.checked))} />\n <span className={styles.mono}>{repo}</span>\n </label>\n ))}\n <p className={styles.scopeMeta}>Only enrolled repos can be granted. Enroll another checkout to add it here.</p>\n </fieldset>\n <fieldset className={styles.scopeFieldset}>\n <legend><MicroLabel>Engines</MicroLabel></legend>\n {base.engines.map((engine) => (\n <label key={engine} className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={engines.includes(engine)} onChange={(e) => setEngines(toggle(engines, engine, e.target.checked))} />\n <span>{ENGINE_LABEL[engine] ?? engine}</span>\n </label>\n ))}\n </fieldset>\n <fieldset className={styles.scopeFieldset}>\n <legend><MicroLabel>Leader may act</MicroLabel></legend>\n {base.leaderClasses.map((c) => (\n <label key={c} className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={classes.includes(c)} onChange={(e) => setClasses(toggle(classes, c, e.target.checked))} />\n <span>Class {c}{c === 'A' ? ' — reversible housekeeping' : ' — larger changes, with a veto window'}</span>\n </label>\n ))}\n </fieldset>\n {base.volumeLimits ? <fieldset className={styles.scopeFieldset}>\n <legend><MicroLabel>Signed volume limits</MicroLabel></legend>\n <label className={styles.scopeCheck}>\n <input type=\"checkbox\" checked={volumeEdited} onChange={(e) => setVolumeEdited(e.target.checked)} />\n <span>Replace volume limits for all models and enforcement modes</span>\n </label>\n <p className={styles.scopeMeta}>An explicit choice applies these size limits to every rollout stage and these daily limits to merging stages. Local work keeps its risk and verification rules. Unchanged or renewed grants keep their existing volume policy. Preview shows the change before Touch ID.</p>\n <VolumeInput label=\"Files per change\" value={files} onChange={(value) => { setFiles(value); setVolumeEdited(true); }} />\n <VolumeInput label=\"Lines per change\" value={lines} onChange={(value) => { setLines(value); setVolumeEdited(true); }} />\n {repos.map((repo) => <VolumeInput key={repo} label={`${repo} merges/day`} value={rates[repo] ?? ''} onChange={(value) => { setRates((current) => ({ ...current, [repo]: value })); setVolumeEdited(true); }} />)}\n </fieldset> : null}\n <fieldset className={styles.scopeFieldset}>\n <legend><MicroLabel>Budget caps</MicroLabel></legend>\n <label className={styles.scopeField} htmlFor={ids.mode}>\n <span>Budget mode up to</span>\n <select id={ids.mode} value={mode} onChange={(e) => setMode(e.target.value as BudgetMode)}>\n {(['reserve', 'balanced', 'all-in'] as const).map((m) => (\n <option key={m} value={m}>{MODE_LABEL[m]}</option>\n ))}\n </select>\n </label>\n <label className={styles.scopeField} htmlFor={ids.metered}>\n <span>Metered APIs, $ per day</span>\n <input id={ids.metered} type=\"number\" min={0} step={1} inputMode=\"numeric\" value={metered} onChange={(e) => setMetered(e.target.value)} />\n </label>\n <label className={styles.scopeField} htmlFor={ids.days}>\n <span>Valid for (days, at most {base.maxDays})</span>\n <input id={ids.days} type=\"number\" min={1} max={base.maxDays} step={1} inputMode=\"numeric\" value={days} onChange={(e) => setDays(e.target.value)} />\n </label>\n </fieldset>\n {base.seatPolicies ? <fieldset className={styles.scopeFieldset}>\n <legend><MicroLabel>Account permissions and reserves</MicroLabel></legend>\n <p className={styles.scopeMeta}>All-in does not remove account reserves or session ceilings. Set 0% reserve or No session ceiling explicitly. These are standing permissions; current budget settings, known usage and provider readiness may tighten them further. A producer role does not qualify an unsupported provider.</p>\n <p className={styles.scopeMeta}>Current Budget settings are in Apps & Accounts; Resources shows usage and readiness. Opening either leaves this unsigned draft.</p>\n <span className={styles.sheetButtons}>\n {onAccountSettings ? <Button variant=\"ghost\" size=\"sm\" onClick={onAccountSettings}>Current account settings</Button> : null}\n {onResources ? <Button variant=\"ghost\" size=\"sm\" onClick={onResources}>Resources</Button> : null}\n </span>\n {Object.entries(base.seatPolicies).filter(([id]) => seats[id] !== undefined).map(([id, policy]) => <SeatPolicyInputs key={id} id={id} value={seats[id]!} roles={policy.roles} onChange={(field, change) => changeSeat(id, field, change)} />)}\n </fieldset> : null}\n <span className={styles.sheetButtons}>\n {edited ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={onReset}>\n Back to the default draft\n </Button>\n ) : null}\n <Button variant=\"subtle\" size=\"sm\" onClick={preview} disabled={!valid} busy={busy}>\n Preview the changes\n </Button>\n </span>\n {!valid ? <p className={styles.scopeMeta}>Keep at least one repo and one engine, whole dollars, at least one role per edited account, whole reserve percentages (0–100) and session ceilings (1–100), positive whole size limits, nonnegative whole merge limits, and 1–{base.maxDays} days.</p> : null}\n </div>\n );\n}\n\nconst DIRECTION_WORD: Record<GrantDiffLine['direction'], string> = { wider: 'wider', narrower: 'narrower', changed: 'changed' };\n\n/** What signing this draft changes vs the grant in force. */\nexport function GrantDiff({ lines }: { lines: GrantDiffLine[] | undefined }) {\n if (!lines) return null;\n if (lines.length === 0) {\n return (\n <section className={styles.scopeBlock} aria-label=\"Changes\">\n <MicroLabel>Changes vs the grant in force</MicroLabel>\n <p className={styles.scopeMeta}>Same scope as the grant in force.</p>\n </section>\n );\n }\n return (\n <section className={styles.scopeBlock} aria-label=\"Changes\">\n <MicroLabel>Changes vs the grant in force</MicroLabel>\n <table className={styles.scopeTable}>\n <thead>\n <tr>\n <th scope=\"col\">What</th>\n <th scope=\"col\">Now</th>\n <th scope=\"col\">After signing</th>\n <th scope=\"col\">Authority</th>\n </tr>\n </thead>\n <tbody>\n {lines.map((line, i) => (\n <tr key={`${line.field}-${i}`} data-direction={line.direction}>\n <td>{line.label}</td>\n <td className={styles.mono}>{line.before}</td>\n <td className={styles.mono}>{line.after}</td>\n <td className={styles.diffDirection} data-direction={line.direction}>{DIRECTION_WORD[line.direction]}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </section>\n );\n}\n","/**\n * routes/verse/command/GrantSheet.tsx — the Touch ID sheet (SPEC-310B §6:\n * \"Raising it past the grant opens the Touch ID sheet, which shows scope and\n * expiry\"; unit C7).\n *\n * It shows EXACTLY what the custody helper will sign — the server's draft\n * StandingGrantV1 and its digest — before anything is sent: repos and how\n * far each may go, merge caps, spend (mode ceiling, metered dollars, every\n * seat's reserve floor), engines, the Leader's classes and veto window, the\n * rollout ladder with each rung's exit criteria, and the expiry. Approving\n * echoes the draft's digest back, so the server signs what Mason read, not\n * whatever it would draft a second later. The Touch ID prompt itself is the\n * helper's, on this Mac; this page never sees a key.\n *\n * All copy is plain text; the draft is server data but rendered as text only.\n */\nimport { useId, useRef, useState } from 'react';\nimport { volumeLimitLabel } from '../../../../core/authority/types.js';\nimport type { AuthorityGrantDraft, RolloutStage, StandingGrantV1 } from '../../../../core/authority/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { IconLock } from '../../../components/primitives/icons.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { authorityDraftQuery, authorityEliteDraftQuery, type OptionalRead } from './surface-data.js';\nimport { SWITCH_LABEL } from './authority-model.js';\nimport { CardNote, MicroLabel } from './Surface.js';\nimport type { AutonomySwitch } from '../../../../core/authority/types.js';\nimport type { SurfaceActions } from './actions.js';\nimport { GrantDiff, GrantScopeEditor, postGrantDraft, type EditableGrantDraft } from './GrantScopeEditor.js';\nimport { setVerseResourcesOpen, setVerseSection } from '../verse-ui-store.js';\nimport styles from './command.module.css';\n\nexport type GrantIntent = 'grant' | 're-approve';\n\nexport interface GrantSheetProps {\n open: boolean;\n intent: GrantIntent;\n /** The switch position the operator asked for (applied after the grant, if it allows it). */\n then: AutonomySwitch | null;\n busy: boolean;\n /** Why the sheet opened, in one sentence (\"Autonomous needs a new grant.\"). */\n why: string;\n onApprove: (draft: AuthorityGrantDraft) => void;\n onClose: () => void;\n /**\n * 3.15: the surface's guarded action. With it the sheet can EDIT the draft's\n * scope (repos, engines, Leader classes, caps, days) before signing — the\n * token prompt comes first, like every write. Without it, view-only.\n */\n act?: SurfaceActions['act'];\n /** 3.15: open straight into the scope editor (Fleet's \"Edit scope\"). */\n startEditing?: boolean;\n}\n\nconst DAY = 86_400_000;\n\nfunction fmtDate(iso: string): string {\n const t = Date.parse(iso);\n return Number.isFinite(t) ? new Date(t).toLocaleString('en-US', { weekday: 'short', month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' }) : '—';\n}\n\nexport function grantDays(g: Pick<StandingGrantV1, 'issuedAt' | 'expiresAt'>): number | null {\n const a = Date.parse(g.issuedAt);\n const b = Date.parse(g.expiresAt);\n return Number.isFinite(a) && Number.isFinite(b) ? Math.round((b - a) / DAY) : null;\n}\n\n/** The reserved rung id (authority/elite-models.ts ELITE_DIRECT_STAGE_ID; the web bundle keeps its own copy). */\nconst ELITE_DIRECT_STAGE_ID = 'elite-direct';\n\n/** One line the sheet shows for an elite-direct grant — what Mason is signing. */\nexport const ELITE_DIRECT_SHEET_LINE =\n 'Elite models (Opus 5.5/5, Fable 5.1/5, Sonnet 5, GPT-6 Astra/Sol/Luna, Grok 4.7/4.6, SWE-2, Qwen 3.8 27B) land directly on green tests — no judge. '\n + 'Other models still need an independent judge; changes to authority code still come to you.';\n\nfunction stageLine(s: RolloutStage): string {\n const c = s.criteria;\n if (s.id === ELITE_DIRECT_STAGE_ID) {\n return `${s.repos.filter((r) => r.stage === 'merge').length} of ${s.repos.length} repos merge · ${s.maxRisk} risk · ≤ ${volumeLimitLabel(s.maxFiles)} files / ${volumeLimitLabel(s.maxLines)} lines — one rung, no ramp; elite models land on green tests, no judge`;\n }\n const parts = [\n `${s.repos.length} repo${s.repos.length === 1 ? '' : 's'}`,\n `${s.maxRisk} risk`,\n `≤ ${volumeLimitLabel(s.maxFiles)} files / ${volumeLimitLabel(s.maxLines)} lines`,\n `≤ ${volumeLimitLabel(s.maxMergesPerRepoPerDay)} merges/repo/day`,\n ];\n const exit = [`${c.minMerges} merges`, `${c.minHours} h`, c.minPostMergeGreenPct ? `≥ ${c.minPostMergeGreenPct}% green` : null, `≤ ${c.maxRevertRatePct}% reverts`].filter(Boolean);\n return `${parts.join(' · ')} — advances after ${exit.join(', ')}`;\n}\n\nexport function DraftScope({ draft }: { draft: AuthorityGrantDraft }) {\n const g = draft.payload;\n const days = grantDays(g);\n return (\n <div className={styles.scope}>\n <section className={styles.scopeBlock} aria-label=\"Expiry\">\n <MicroLabel>Expiry</MicroLabel>\n <p className={styles.scopeLead}>\n {days !== null ? `${days} days` : '—'}, until {fmtDate(g.expiresAt)}\n </p>\n <p className={styles.scopeMeta}>\n Signed by key <span className={styles.mono}>{g.keyId}</span> · sequence {g.grantSeq} · bound to this Mac\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Repositories\">\n <MicroLabel>Repositories ({g.repos.length})</MicroLabel>\n <table className={styles.scopeTable}>\n <thead>\n <tr>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Up to</th>\n <th scope=\"col\">Checks</th>\n <th scope=\"col\">Risk</th>\n <th scope=\"col\" className={styles.num}>Merges/day</th>\n </tr>\n </thead>\n <tbody>\n {g.repos.map((r) => (\n <tr key={r.nameWithOwner}>\n <td className={styles.mono}>{r.nameWithOwner}</td>\n <td>{r.stage === 'merge' ? 'Merge' : 'Propose'}</td>\n <td>{r.enforcement === 'server' ? 'GitHub' : 'Local only'}</td>\n <td>{r.maxRisk}</td>\n <td className={styles.num}>{volumeLimitLabel(r.maxMergesPerDay)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n <p className={styles.scopeMeta}>\n Every merge ≤ {volumeLimitLabel(g.merge.maxFiles)} files / {volumeLimitLabel(g.merge.maxLines)} lines · ashlr-hub itself: {g.merge.selfRepo === 'propose-only' ? 'propose only' : 'merge outside authority code'}\n </p>\n </section>\n\n <p className={styles.scopeMeta}>{g.merge.volumePolicy === 'operator-signed' ? 'Signed volume limits apply to all models and enforcement modes. Risk, CI, spend, Stop and revocation remain binding.' : 'Legacy local limits remain: 4 files / 150 lines, and 4 merges/day for locally enforced repos.'}</p>\n\n <section className={styles.scopeBlock} aria-label=\"Spend\">\n <MicroLabel>Spend</MicroLabel>\n <p className={styles.scopeLead}>\n Up to {g.spend.maxMode === 'all-in' ? 'All-in' : g.spend.maxMode === 'balanced' ? 'Balanced' : 'Reserve'} · metered APIs ${g.spend.meteredUsdPerDay}/day\n </p>\n <ul className={styles.scopeList}>\n {Object.entries(g.spend.seats).map(([seatId, seat]) => (\n <li key={seatId}>\n <span className={styles.mono}>{seatId}</span>\n {seat.enabled ? `: keeps ${seat.reserveFloorPercent}% for you` : ': not used by autonomy'}\n {seat.enabled && seat.maxSessionWindowPercent !== undefined ? `, never above ${seat.maxSessionWindowPercent}% of its 5-hour window` : ''}\n {` · permitted roles: ${seat.roles.join(', ')}`}\n {seat.enabled && seat.maxSessionWindowPercent === undefined ? ', no session ceiling' : ''}\n </li>\n ))}\n </ul>\n <p className={styles.scopeMeta}>Signed account permissions are ceilings. Current Budget settings, usage and Resources readiness still govern dispatch; a listed role does not establish provider support.</p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Engines and Leader\">\n <MicroLabel>Engines and Leader</MicroLabel>\n <p className={styles.scopeLead}>{g.engines.join(', ') || 'none'}</p>\n <p className={styles.scopeMeta}>\n Leader classes {g.leader.classes.length ? g.leader.classes.join(' + ') : 'none (proposes only)'} · class-B veto window {g.leader.vetoMinutes} min ·\n goal conductor {g.conductorGoals ? 'on' : 'off'}\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Rollout ladder\">\n {g.rollout.stages.some((s) => s.id === ELITE_DIRECT_STAGE_ID) ? (\n <>\n <MicroLabel>Elite direct</MicroLabel>\n <p className={styles.scopeLead}>{ELITE_DIRECT_SHEET_LINE}</p>\n </>\n ) : (\n <MicroLabel>Rollout ladder ({g.rollout.stages.length} stages, advances by itself)</MicroLabel>\n )}\n <ol className={styles.ladder}>\n {g.rollout.stages.map((s) => (\n <li key={s.id}>\n <span className={styles.ladderId}>{s.id}</span>\n <span>{stageLine(s)}</span>\n </li>\n ))}\n </ol>\n <p className={styles.scopeMeta}>\n {g.rollout.stages.length === 1 && g.rollout.stages[0]?.id === ELITE_DIRECT_STAGE_ID\n ? 'A sandbox violation, reserve breach, or reverts above 10% restart this rung’s evidence window. Elite direct remains the signed merge ceiling until you stop, revoke, or replace the grant.'\n : 'Any sandbox violation or reserve breach drops it back one stage. It can never climb past the last stage.'}\n </p>\n </section>\n\n <p className={styles.scopeMeta}>\n Draft digest <span className={styles.mono}>{draft.digest.slice(0, 16)}…</span>\n </p>\n </div>\n );\n}\n\nexport function GrantSheet({ open, intent, then, busy, why, onApprove, onClose, act, startEditing }: GrantSheetProps) {\n const titleId = useId();\n // Only read the draft while the sheet is open: drafting is cheap on the\n // server, but a draft read while the sheet is closed would be stale by the\n // time anyone approved it.\n return open ? <GrantSheetBody titleId={titleId} intent={intent} then={then} busy={busy} why={why} onApprove={onApprove} onClose={onClose} {...(act ? { act } : {})} startEditing={startEditing === true} /> : null;\n}\n\nfunction GrantSheetBody({ titleId, intent, then, busy, why, onApprove, onClose, act, startEditing }: Omit<GrantSheetProps, 'open'> & { titleId: string }) {\n const [elite, setElite] = useState(false);\n const eliteHintId = useId();\n const read = useQuery(elite ? authorityEliteDraftQuery : authorityDraftQuery, { freshMs: 0 });\n const served = (read.data as OptionalRead<EditableGrantDraft> | undefined)?.value ?? null;\n // 3.15: Mason's edited draft (the server's answer to the editor) replaces\n // the served one; approving signs exactly the draft on screen (its digest).\n const [edited, setEdited] = useState<EditableGrantDraft | null>(null);\n const [editing, setEditing] = useState(startEditing === true);\n const [editorRevision, setEditorRevision] = useState(0);\n const revision = useRef(0);\n const previewRequest = useRef(0);\n const [editorReset, setEditorReset] = useState(0);\n const [acknowledged, setAcknowledged] = useState<{ revision: number; sourceDigest: string } | null>(null);\n const [editedSourceDigest, setEditedSourceDigest] = useState<string | null>(null);\n const sourceDigest = useRef<string | null>(null);\n sourceDigest.current = served?.digest ?? null;\n const [editError, setEditError] = useState<string | null>(null);\n const [previewing, setPreviewing] = useState(false);\n // A late preview from the previous ladder must never replace the new one.\n const draft: EditableGrantDraft | null = edited && editedSourceDigest === served?.digest && edited.eliteDirect === served?.eliteDirect ? edited : served;\n const reason = read.data?.reason ?? null;\n const canEdit = act !== undefined && served?.editable !== undefined;\n const fixedElite = served?.kind === 'reapprove' && served.eliteDirect === true;\n const scopeDirty = editorRevision > 0 && (acknowledged?.revision !== editorRevision || acknowledged.sourceDigest !== served?.digest);\n const draftMatchesChoice = draft !== null && (draft.eliteDirect === true) === (elite || fixedElite);\n\n function markDirty(): void {\n revision.current++;\n setEditorRevision(revision.current);\n setEditError(null);\n }\n\n function resetEditor(): void {\n // Explicit reset acknowledges the current fetched source, restores its\n // controls, and invalidates every earlier in-flight preview.\n revision.current++;\n previewRequest.current++;\n setEditorRevision(0);\n setAcknowledged(null);\n setEdited(null);\n setEditedSourceDigest(null);\n setEditError(null);\n setPreviewing(false);\n setEditorReset((value) => value + 1);\n }\n\n\n function preview(scope: Parameters<typeof postGrantDraft>[1]): void {\n if (!act || !served) return;\n const kind = served.kind ?? 'auto';\n const request = ++previewRequest.current;\n const choiceRevision = revision.current;\n const baseDigest = served.digest;\n setEditError(null);\n setPreviewing(true);\n act(\n async () => {\n try {\n return await postGrantDraft(kind, scope, served.eliteDirect === true);\n } catch (error) {\n if (request === previewRequest.current && baseDigest === sourceDigest.current) setEditError(error instanceof Error ? error.message : String(error));\n return null;\n } finally {\n if (request === previewRequest.current) setPreviewing(false);\n }\n },\n 'Preview the edited grant',\n {\n onDone: (next) => {\n // Never acknowledge a newer choice, a different fetched draft, or\n // a response invalidated by Reset. The exact accepted digest is signed.\n if (request !== previewRequest.current || choiceRevision !== revision.current || baseDigest !== sourceDigest.current) return;\n if (next && typeof next === 'object' && typeof next.digest === 'string' && next.eliteDirect === served.eliteDirect) {\n setEdited(next);\n setEditedSourceDigest(baseDigest);\n setAcknowledged({ revision: choiceRevision, sourceDigest: baseDigest });\n }\n },\n },\n );\n }\n return (\n <Sheet\n open\n onClose={onClose}\n titleId={titleId}\n width={600}\n title={intent === 're-approve' ? 'Re-approve the standing grant' : 'Approve a standing grant'}\n description={why}\n footer={\n <div className={styles.sheetFooter}>\n <p className={styles.sheetFootnote}>\n Touch ID appears on this Mac. Lowering authority — Off, Stop, Revoke — never needs it.\n {then ? ` After approval the switch moves to ${SWITCH_LABEL[then]}.` : ''}\n </p>\n <span className={styles.sheetButtons}>\n <Button variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button variant=\"primary\" icon={<IconLock />} disabled={!draft || !draftMatchesChoice || scopeDirty || previewing} busy={busy} onClick={() => draft && onApprove(draft)}>\n Approve with Touch ID\n </Button>\n </span>\n </div>\n }\n >\n <label className={styles.eliteToggle}>\n <input type=\"checkbox\" checked={elite || fixedElite} disabled={previewing || busy || fixedElite} onChange={(e) => { setElite(e.target.checked); resetEditor(); }} aria-describedby={eliteHintId} />\n Elite direct\n </label>\n <p id={eliteHintId} className={styles.scopeMeta}>\n {ELITE_DIRECT_SHEET_LINE}\n </p>\n {read.status === 'loading' && !read.data ? (\n <p className={styles.muted} aria-busy=\"true\">Preparing the grant draft…</p>\n ) : draft ? (\n <>\n {canEdit ? (\n <div className={styles.scopeEditToggle}>\n <Button variant=\"ghost\" size=\"sm\" aria-expanded={editing} onClick={() => setEditing((e) => !e)}>\n {editing ? 'Hide the scope editor' : 'Edit scope'}\n </Button>\n {edited ? <span className={styles.scopeMeta}>Showing your edited draft.</span> : null}\n </div>\n ) : null}\n {canEdit && editing && served ? (\n <GrantScopeEditor\n key={editorReset}\n draft={served as EditableGrantDraft}\n busy={previewing}\n edited={editedSourceDigest === served.digest || scopeDirty}\n onDirty={markDirty}\n onAccountSettings={() => { onClose(); setVerseSection('apps'); }}\n onResources={() => { onClose(); setVerseResourcesOpen(true); }}\n onPreview={preview}\n onReset={resetEditor}\n />\n ) : null}\n {scopeDirty ? <CardNote tone=\"muted\">Preview your choices before approving. Only the reviewed draft below can be signed.</CardNote> : null}\n {editError ? <CardNote tone=\"danger\">{editError}</CardNote> : null}\n <GrantDiff lines={draft.diff} />\n <DraftScope draft={draft} />\n </>\n ) : (\n <CardNote tone=\"unknown\">{reason ?? 'Grant draft unreadable — nothing to approve.'}</CardNote>\n )}\n </Sheet>\n );\n}\n","/**\n * routes/verse/command/AutonomyBar.tsx — Command's top bar (SPEC-310B §6,\n * SPEC-310C §5; unit C7):\n *\n * Autonomy [Off | Propose | Autonomous] Budget · Balanced ▾ Grant 23d ■ Stop\n *\n * - Lowering the switch is instant (no confirm, no Touch ID — I1).\n * - Raising within what the installed grant allows is instant too.\n * - Raising PAST the grant opens the Touch ID sheet with the draft's full\n * scope and expiry; the switch then moves once the grant is signed.\n * - The Budget pill opens A9's BudgetControl, with the grant's mode\n * ceiling stated above it (autonomy never spends past it whatever the\n * control shows — the server clamps; see CROSS-UNIT REQUEST to C6).\n * - The grant chip reads \"23d\", or \"Paused, re-approve\" and opens the sheet.\n * - Stop asks for confirmation (the catalog's `fleet.stop` guard copy),\n * then writes KILL; while stopped it becomes Resume.\n *\n * At 375 px the bar is just [Autonomy][■] (SPEC-310C §5); the budget pill\n * and grant chip move under the verdict line (rendered by CommandSection).\n *\n * ⌘K reaches the same paths (usePaletteCommands below): \"Autonomy: …\",\n * \"Approve grant…\", \"Re-approve grant…\" and \"Budget mode: …\" run THROUGH this bar — the switch's\n * lower/raise/needs-grant classification, the grant chip's own intent, the\n * budget's grant ceiling, the token prompt, the read-only session — so the\n * palette can never be a shortcut around any of them. When the bar would\n * have been disabled, the palette says why instead of doing nothing.\n */\nimport { useState, type ReactNode } from 'react';\nimport type { AuthorityGrantDraft, AuthorityStatusV1, AutonomySwitch } from '../../../../core/authority/types.js';\nimport type { BudgetMode } from '../../../../core/routing/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { IconChevronDown, IconLock, IconPlay, IconStop } from '../../../components/primitives/icons.js';\nimport { BudgetControl } from '../budget/BudgetControl.js';\nimport { modeAboveCeiling } from '../budget/budget-model.js';\nimport { updateBudget } from '../budget/budget-queries.js';\nimport { useCommandHandler } from '../shell/command-bus.js';\nimport { findCommand } from '../shell/command-catalog.js';\nimport { shellNotify } from '../shell/run-command.js';\nimport { actionForDraft, SWITCH_LABEL, SWITCH_RANK, classifySwitch, grantChip, stopOutcomeSentence, switchOptions, type ChipTone } from './authority-model.js';\nimport { GrantSheet, type GrantIntent } from './GrantSheet.js';\nimport { postAuthority, type OptionalRead } from './surface-data.js';\nimport type { ConfirmSpec, SurfaceActions } from './actions.js';\nimport styles from './command.module.css';\n\nconst MODE_WORD: Record<BudgetMode, string> = { 'all-in': 'All-in', balanced: 'Balanced', reserve: 'Reserve' };\n\n/** The catalog's Stop copy, so ⌘K \"Stop the fleet…\" and this button confirm with the same words. */\nexport function stopConfirm(): ConfirmSpec {\n const guard = findCommand('fleet.stop')?.guard?.confirm;\n return {\n title: guard?.title ?? 'Stop the fleet?',\n body: guard?.body ?? 'Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.',\n confirmLabel: guard?.confirmLabel ?? 'Stop fleet',\n destructive: true,\n };\n}\n\nconst RESUME_CONFIRM: ConfirmSpec = {\n title: 'Resume the fleet?',\n body: 'Autonomy picks up at the switch position on its next tick. Stopping again is one click.',\n confirmLabel: 'Resume fleet',\n destructive: false,\n};\n\nexport function ChipDot({ tone }: { tone: ChipTone }) {\n return <span className={styles.dot} data-tone={tone} aria-hidden=\"true\" />;\n}\n\n/**\n * The Touch ID sheet and what approving it does, as one piece: the bar's\n * switch and grant chip open it, and so does Command's \"Autonomy is off\"\n * banner (autonomy/AutonomyOffState) — one sheet, one approve path.\n */\nexport interface GrantFlow {\n /**\n * `then`: the switch position to apply after signing, if the new grant allows it.\n * `edit` (3.15): open straight into the scope editor.\n */\n open: (intent: GrantIntent, why: string, then?: AutonomySwitch | null, opts?: { edit?: boolean }) => void;\n /** Render once (the bar does unless its owner passes the flow in). */\n sheet: ReactNode;\n}\n\nexport function useGrantFlow(actions: SurfaceActions): GrantFlow {\n const [sheet, setSheet] = useState<{ intent: GrantIntent; then: AutonomySwitch | null; why: string; edit: boolean } | null>(null);\n\n function approve(draft: AuthorityGrantDraft): void {\n if (!sheet) return;\n const { then } = sheet;\n // The DRAFT decides grant vs re-approve (B-U1: GET …/draft answers with\n // `kind`, and POST refuses a digest whose kind does not match the action).\n // The sheet's intent is only what the operator clicked; a grant that is no\n // longer continuable is drafted as a new one, and signing it must say so.\n const intent = actionForDraft(draft, sheet.intent);\n actions.act(\n () => postAuthority({ action: intent, draftDigest: draft.digest }),\n intent === 're-approve' ? 'Re-approve the standing grant' : 'Sign a new standing grant',\n {\n onDone: (next) => {\n setSheet(null);\n // Apply the requested position only if the NEW grant allows it.\n if (then && next && SWITCH_RANK[then] <= SWITCH_RANK[next.maxSwitchWithoutGrant] && then !== next.switch) {\n actions.act(() => postAuthority({ action: 'switch', to: then }), `Switch autonomy to ${SWITCH_LABEL[then]}`);\n }\n },\n },\n );\n }\n\n return {\n open: (intent, why, then = null, opts = {}) => setSheet({ intent, then, why, edit: opts.edit === true }),\n sheet: (\n <GrantSheet\n open={sheet !== null}\n intent={sheet?.intent ?? 'grant'}\n then={sheet?.then ?? null}\n why={sheet?.why ?? ''}\n busy={actions.busy}\n onApprove={approve}\n onClose={() => setSheet(null)}\n act={actions.act}\n startEditing={sheet?.edit === true}\n />\n ),\n };\n}\n\nexport interface AutonomyBarProps {\n read: OptionalRead<AuthorityStatusV1> | undefined;\n loading: boolean;\n budgetMode: BudgetMode | null;\n actions: SurfaceActions;\n compact: boolean;\n now: number;\n /** A flow shared with the rest of the surface; its owner renders `sheet`. Omitted = the bar's own. */\n grantFlow?: GrantFlow;\n}\n\nexport function AutonomyBar({ read, loading, budgetMode, actions, compact, now, grantFlow }: AutonomyBarProps) {\n const status = read?.value ?? null;\n const ownFlow = useGrantFlow(actions);\n const flow = grantFlow ?? ownFlow;\n /** What the last Stop did (drain count, merges revoked) — shown while stopped. */\n const [stopNote, setStopNote] = useState<string | null>(null);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const unavailable = !status;\n const chip = grantChip(status, now);\n\n function onSwitch(to: AutonomySwitch): void {\n if (!status) return;\n const change = classifySwitch(status, to);\n if (change === 'same') return;\n if (change === 'raise-needs-grant') {\n const paused = status.grant.state === 'paused';\n flow.open(\n paused ? 're-approve' : 'grant',\n paused\n ? `${status.grant.reason ?? 'The grant is paused.'} ${SWITCH_LABEL[to]} needs it re-approved.`\n : `${SWITCH_LABEL[to]} is beyond what the installed grant allows, so it needs a new grant.`,\n to,\n );\n return;\n }\n // Lower, or raise within the grant: straight to the server, no dialog.\n actions.act(() => postAuthority({ action: 'switch', to }), `Switch autonomy to ${SWITCH_LABEL[to]}`);\n }\n\n // ⌘K \"Approve grant…\" opens the SAME flow the chip and the off-state banner do.\n usePaletteCommands({ read, status, budgetMode, actions, chip, onSwitch, openGrant: flow.open });\n\n const options = status ? switchOptions(status) : switchOptions({ switch: 'off', maxSwitchWithoutGrant: 'off' });\n const stopped = status?.kill ?? false;\n const disabled = unavailable || actions.busy || actions.readOnly;\n\n const switchControl = (\n <div className={styles.switchWrap} title={unavailable ? (read?.reason ?? 'Reading autonomy state…') : undefined}>\n {!compact ? <span className={styles.barLabel} aria-hidden=\"true\">Autonomy</span> : null}\n <Segmented<AutonomySwitch>\n size=\"sm\"\n aria-label=\"Autonomy\"\n value={status?.switch ?? 'off'}\n onChange={onSwitch}\n options={options.map((o) => ({\n value: o.value,\n label: (\n <span className={styles.switchOption}>\n {compact ? o.short : o.label}\n {o.needsGrant ? <IconLock className={styles.touchMark} width={12} height={12} aria-hidden=\"true\" /> : null}\n </span>\n ),\n ariaLabel: o.ariaLabel,\n disabled,\n }))}\n />\n </div>\n );\n\n const onStop = () => actions.act(() => postAuthority({ action: 'stop' }), 'Stop the fleet', {\n confirm: stopConfirm(),\n onDone: (next) => setStopNote(stopOutcomeSentence(next)),\n });\n const onResume = () => actions.act(() => postAuthority({ action: 'clear-stop' }), 'Resume the fleet', {\n confirm: RESUME_CONFIRM,\n onDone: () => setStopNote(null),\n });\n const stopButton = stopped\n ? compact\n ? <Button variant=\"subtle\" size=\"sm\" icon={<IconPlay />} iconOnly aria-label=\"Resume the fleet\" disabled={disabled} onClick={onResume} />\n : <Button variant=\"subtle\" size=\"sm\" icon={<IconPlay />} disabled={disabled} onClick={onResume}>Resume</Button>\n : compact\n ? <Button variant=\"danger\" size=\"sm\" icon={<IconStop />} iconOnly aria-label=\"Stop the fleet\" disabled={disabled} onClick={onStop} />\n : <Button variant=\"danger\" size=\"sm\" icon={<IconStop />} disabled={disabled} onClick={onStop}>Stop</Button>;\n\n return (\n <>\n <div className={styles.bar} role=\"toolbar\" aria-label=\"Autonomy controls\" data-loading={loading || undefined}>\n {switchControl}\n {!compact ? (\n <>\n <BudgetPill mode={budgetMode} onOpen={() => setBudgetOpen(true)} />\n <GrantChip chip={chip} onOpen={(intent) => flow.open(intent, chip.detail)} />\n </>\n ) : null}\n <span className={styles.barSpacer} />\n {stopButton}\n </div>\n {stopped && stopNote ? <p className={styles.muted} role=\"status\">{stopNote}</p> : null}\n {compact ? (\n <div className={styles.barSecondary}>\n <BudgetPill mode={budgetMode} onOpen={() => setBudgetOpen(true)} />\n <GrantChip chip={chip} onOpen={(intent) => flow.open(intent, chip.detail)} />\n </div>\n ) : null}\n {grantFlow ? null : ownFlow.sheet}\n <BudgetSheet open={budgetOpen} onClose={() => setBudgetOpen(false)} status={status} />\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ⌘K — the palette's autonomy, grant and budget entries\n// ---------------------------------------------------------------------------\n\ninterface PaletteWiring {\n read: OptionalRead<AuthorityStatusV1> | undefined;\n status: AuthorityStatusV1 | null;\n budgetMode: BudgetMode | null;\n actions: SurfaceActions;\n chip: ReturnType<typeof grantChip>;\n onSwitch: (to: AutonomySwitch) => void;\n openGrant: GrantFlow['open'];\n}\n\n/**\n * Why the bar's controls are disabled right now, in the words the operator\n * needs — or null when they are live. Mirrors `disabled` in AutonomyBar.\n */\nexport function paletteBlock(p: { status: AuthorityStatusV1 | null; reason: string | null; readOnly: boolean; busy: boolean }): string | null {\n if (p.readOnly) return 'Read-only session: this server was started without dispatch, so autonomy cannot be changed from here.';\n if (!p.status) return p.reason ?? 'The autonomy state has not been read yet, so nothing was changed.';\n if (p.busy) return 'Another autonomy action is still running. Try again when it finishes.';\n return null;\n}\n\nfunction usePaletteCommands({ read, status, budgetMode, actions, chip, onSwitch, openGrant }: PaletteWiring): void {\n // Registered only once the authority read has answered (value OR a reason):\n // a command parked while Command mounts must be judged against a real\n // status, never the empty one of the first render.\n const ready = read !== undefined;\n const block = () => paletteBlock({ status, reason: read?.reason ?? null, readOnly: actions.readOnly, busy: actions.busy });\n\n const toSwitch = (to: AutonomySwitch) => () => {\n const why = block();\n if (why || !status) {\n shellNotify(why ?? 'The autonomy state is unknown, so nothing was changed.', 'neutral');\n return;\n }\n if (status.switch === to) {\n shellNotify(`Autonomy is already ${SWITCH_LABEL[to]}.`, 'neutral');\n return;\n }\n // The bar's own click path: lower / raise within the grant → POST;\n // past the grant → the Touch ID sheet, which says why it opened.\n onSwitch(to);\n };\n useCommandHandler('autonomy.off', toSwitch('off'), ready);\n useCommandHandler('autonomy.propose', toSwitch('propose'), ready);\n useCommandHandler('autonomy.autonomous', toSwitch('autonomous'), ready);\n\n useCommandHandler(\n 'autonomy.grant',\n () => {\n const why = block();\n if (why) {\n shellNotify(why, 'neutral');\n return;\n }\n // The chip decides, exactly as a click on it would: nothing to approve\n // while an active grant has days left — say so rather than draft a\n // replacement nobody asked for.\n if (!chip.action) {\n shellNotify(chip.detail, 'neutral');\n return;\n }\n openGrant(chip.action, chip.detail);\n },\n ready,\n );\n\n // 3.14 \"Re-approve grant…\": renew a grant that is still continuable (active,\n // paused, expired) through the SAME sheet — the server drafts it as a\n // re-approval that continues the ladder. Nothing to continue → say so.\n useCommandHandler(\n 'autonomy.reapprove',\n () => {\n const why = block();\n if (why || !status) {\n shellNotify(why ?? 'The autonomy state is unknown, so nothing was changed.', 'neutral');\n return;\n }\n const state = status.grant.state;\n if (state !== 'active' && state !== 'paused' && state !== 'expired') {\n shellNotify('There is no grant to re-approve. Use \"Approve grant…\" to sign a new one.', 'neutral');\n return;\n }\n openGrant(\n 're-approve',\n state === 'active'\n ? `${chip.detail} Re-approving signs a fresh 30 days and continues the rollout from its current stage.`\n : chip.detail,\n );\n },\n ready,\n );\n\n const toBudget = (mode: BudgetMode) => () => {\n // Budget does not need the authority read to be present — only to know\n // the ceiling — but a read-only or busy surface refuses it like the pill.\n if (actions.readOnly || actions.busy) {\n shellNotify(block() ?? 'Budget cannot be changed right now.', 'neutral');\n return;\n }\n if (budgetMode === mode) {\n shellNotify(`Budget is already ${MODE_WORD[mode]}.`, 'neutral');\n return;\n }\n // BudgetSheet's rule: an active grant's mode ceiling disables the modes above it.\n const ceiling = status?.grant.state === 'active' ? status.grant.maxMode : null;\n if (ceiling && modeAboveCeiling(mode, ceiling)) {\n shellNotify(`Your grant allows up to ${MODE_WORD[ceiling]}, so ${MODE_WORD[mode]} is unavailable. A new grant can raise the ceiling.`, 'neutral');\n return;\n }\n actions.act(() => updateBudget({ mode }), `Switch the budget to ${MODE_WORD[mode]}`, {\n onDone: () => shellNotify(`Budget set to ${MODE_WORD[mode]}.`, 'success'),\n });\n };\n useCommandHandler('budget.all-in', toBudget('all-in'), ready);\n useCommandHandler('budget.balanced', toBudget('balanced'), ready);\n useCommandHandler('budget.reserve', toBudget('reserve'), ready);\n}\n\nexport function BudgetPill({ mode, onOpen }: { mode: BudgetMode | null; onOpen: () => void }) {\n return (\n <button type=\"button\" className={styles.pill} aria-haspopup=\"dialog\" onClick={onOpen}>\n <span className={styles.pillLabel}>Budget</span>\n <span>{mode ? MODE_WORD[mode] : '—'}</span>\n <IconChevronDown width={14} height={14} aria-hidden=\"true\" />\n </button>\n );\n}\n\nexport function GrantChip({ chip, onOpen }: { chip: ReturnType<typeof grantChip>; onOpen: (intent: GrantIntent) => void }) {\n const body: ReactNode = (\n <>\n <ChipDot tone={chip.tone} />\n <span className={styles.pillLabel}>Grant</span>\n <span>{chip.label}</span>\n </>\n );\n if (!chip.action) {\n return (\n <span className={styles.chip} data-tone={chip.tone} title={chip.detail} aria-label={`Grant: ${chip.label}. ${chip.detail}`} role=\"status\">\n {body}\n </span>\n );\n }\n const intent = chip.action;\n return (\n <button type=\"button\" className={styles.chip} data-tone={chip.tone} title={chip.detail} aria-haspopup=\"dialog\" onClick={() => onOpen(intent)} aria-label={`Grant: ${chip.label}. ${chip.detail}`}>\n {body}\n </button>\n );\n}\n\nfunction BudgetSheet({ open, onClose, status }: { open: boolean; onClose: () => void; status: AuthorityStatusV1 | null }) {\n const max = status?.grant.state === 'active' ? status.grant.maxMode : null;\n return (\n <Sheet\n open={open}\n onClose={onClose}\n titleId=\"command-budget-sheet\"\n width={560}\n title=\"Budget\"\n description={\n max\n ? `Your grant allows up to ${MODE_WORD[max]}. Autonomy never spends past it, whatever is selected here — moving toward Reserve is always instant.`\n : 'No active grant: autonomy only proposes. The budget still decides which seats it would use.'\n }\n >\n {/* The grant's ceiling disables the modes above it (A9 control, C7 request). */}\n {open ? <BudgetControl maxMode={max} /> : null}\n </Sheet>\n );\n}\n","/*\n * routes/verse/fleet/fleet-control.module.css — the Fleet tab's control\n * surface (3.15): the header, the blocker, the facts row, the runs and queue.\n * Tokens only (style-scan-310).\n */\n.control {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n padding: var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n}\n\n.control[data-state='blocked'],\n.control[data-state='stopped'] {\n border-color: var(--status-danger-solid);\n}\n\n.head {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n}\n\n.headline {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n margin: 0;\n min-width: 0;\n font-size: var(--text-lg-size);\n line-height: var(--text-lg-line);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.stateWord {\n font-weight: var(--font-weight-semibold);\n}\n\n.dot {\n width: 10px;\n height: 10px;\n flex: none;\n border-radius: var(--radius-full);\n background: var(--status-neutral-solid);\n}\n\n.dot[data-tone='running'] {\n background: var(--status-running-solid);\n}\n.dot[data-tone='ok'] {\n background: var(--status-success-solid);\n}\n.dot[data-tone='warning'] {\n background: var(--status-warning-solid);\n}\n.dot[data-tone='danger'] {\n background: var(--status-danger-solid);\n}\n.dot[data-tone='muted'] {\n background: var(--status-unknown-solid);\n}\n\n.buttons,\n.inlineButtons {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--space-2);\n}\n\n.kbd {\n margin-left: var(--space-2);\n color: var(--text-tertiary);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n}\n\n.blocker {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-3);\n padding: var(--space-3);\n border-radius: var(--radius-md);\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n.blockerReason {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.blockerCommand {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n}\n\n.did {\n margin: 0;\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n margin-left: var(--space-2);\n padding: 0;\n border: 0;\n background: none;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n\n.link:hover {\n text-decoration: underline;\n}\n\n.link:disabled {\n color: var(--text-disabled);\n cursor: default;\n text-decoration: none;\n}\n\n.link:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}\n\n.progress {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface-raised);\n}\n\n.progress[data-phase='failed'] {\n border-color: var(--status-danger-solid);\n}\n\n.progress[data-phase='done'] {\n border-color: var(--status-success-solid);\n}\n\n.progressLine {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n\n.command {\n display: block;\n overflow-x: auto;\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-code);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n white-space: pre;\n}\n\n.output pre {\n max-height: 240px;\n overflow: auto;\n margin: var(--space-2) 0 0;\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-code);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.output summary {\n cursor: pointer;\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n}\n\n.facts {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: var(--space-3);\n margin: 0;\n}\n\n.fact {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.fact dt,\n.fact dd {\n margin: 0;\n}\n\n.factValue {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-variant-numeric: tabular-nums;\n}\n\n.factSub {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.factValue .link {\n margin-left: 0;\n align-self: flex-start;\n}\n\n/* ---- runs, queue, goals ------------------------------------------------ */\n.list {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.row {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3) 0;\n border-top: 1px solid var(--border-subtle);\n}\n\n.row:first-child {\n border-top: 0;\n}\n\n.rowHead {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.rowTitle {\n margin: 0;\n min-width: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n overflow-wrap: anywhere;\n}\n\n.rowMeta {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.rowControls {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n}\n\n.log {\n max-height: 280px;\n overflow: auto;\n margin: 0;\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-code);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.interject {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.textarea {\n width: 100%;\n min-height: 64px;\n padding: var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n resize: vertical;\n}\n\n.textarea:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 1px;\n}\n\n.directive {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n gap: var(--space-2);\n}\n\n.directive > :first-child {\n flex: 1 1 240px;\n}\n\n.sectionLabel {\n margin: var(--space-3) 0 0;\n}\n\n@media (max-width: 480px) {\n .control {\n padding: var(--space-3);\n }\n .buttons {\n width: 100%;\n }\n}\n\n/* ---- Command's one line about the fleet (FleetStatusLink.tsx) ---------- */\n.statusLink {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n}\n\n.statusLink[data-state='blocked'],\n.statusLink[data-state='stopped'] {\n border-color: var(--status-danger-solid);\n}\n\n.statusLinkLine {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n margin: 0;\n min-width: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n","/**\n * routes/verse/fleet/live-model.ts — FleetLiveSnapshotV1 → chart props\n * (unit C7; SPEC-310B §6 Fleet, SPEC-310C §5). Shared by Command's 12 h\n * swimlane and every Fleet card, so both make the same decisions:\n *\n * - rows are LANES × SLOTS: runs overlapping in one lane stack into\n * numbered slot rows (\"Grok · 2\"), so a bar never hides behind another;\n * - bar colour is STATUS (running amber, merged green, reverted red …);\n * the lane's ENGINE is the tick + monogram beside its label;\n * - queued and parked work draws as an outline (it holds a place; nothing\n * runs) — the Parked Gantt runs from \"parked since\" to `nextEligibleAt`,\n * and an unknown `nextEligibleAt` stays open-ended with \"unknown\" in words.\n *\n * Framework-free; tested directly.\n */\nimport type { FleetEngine, FleetGateFunnel, FleetLaneState, FleetLiveRun, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { SeatDecision } from '../../../../core/routing/types.js';\nimport type { ChartEngine, ChartTone } from '../../../components/charts/colors.js';\nimport { CHART_NEUTRAL, seriesColor } from '../../../components/charts/colors.js';\nimport type { SwimlaneLane } from '../../../components/charts/Swimlane.js';\nimport type { FunnelStage } from '../../../components/charts/Funnel.js';\nimport type { BarStackSegment } from '../../../components/charts/BarStack.js';\nimport { laneReasonText, localTimes } from './why-seat-model.js';\n\nexport const LANE_ENGINE: Readonly<Record<FleetEngine, ChartEngine>> = {\n local: 'local',\n 'grok-cli': 'grok',\n 'claude-cli': 'claude',\n codex: 'codex',\n 'devin-cli': 'devin',\n};\n\nexport const LANE_LABEL: Readonly<Record<FleetEngine, string>> = {\n local: 'Local',\n 'grok-cli': 'Grok',\n 'claude-cli': 'Claude',\n codex: 'Codex',\n 'devin-cli': 'Devin CLI',\n};\n\n/** A lane chip's words: \"Local · off\", \"Grok · 1/2\". The why is a separate line (`laneNotes`). */\nexport function laneChipText(lane: FleetLaneState): { name: string; slots: string } {\n return { name: LANE_LABEL[lane.lane], slots: lane.slots === 0 ? 'off' : `${lane.busy}/${lane.slots}` };\n}\n\nexport interface LaneNote {\n /** The lanes this reason applies to, in strip order. */\n lanes: FleetEngine[];\n /** True when every lane shares it — then it is said once, without names. */\n all: boolean;\n reason: string;\n}\n\n/** A lane's cap reason as the operator reads it (`laneReasonText`); null when it has none. */\nexport function laneReason(lane: FleetLaneState): string | null {\n const reason = lane.capReason?.trim();\n return reason ? laneReasonText(reason) : null;\n}\n\n/**\n * Each distinct lane cap reason ONCE, with the lanes it covers, in the plain\n * words the server already wrote. A dark fleet gives every lane the same sentence; 3.10.0\n * repeated it inside every chip and truncated it there.\n */\nexport function laneNotes(lanes: readonly FleetLaneState[]): LaneNote[] {\n const byReason = new Map<string, FleetEngine[]>();\n for (const lane of lanes) {\n const reason = laneReason(lane);\n if (!reason) continue;\n const list = byReason.get(reason) ?? [];\n list.push(lane.lane);\n byReason.set(reason, list);\n }\n return [...byReason.entries()].map(([reason, covered]) => ({\n lanes: covered,\n all: covered.length === lanes.length && lanes.length > 1,\n reason,\n }));\n}\n\n/** The word a bar is labelled with: the outcome once it ended, else the phase. */\nexport function runStatus(run: FleetLiveRun): string {\n if (run.phase === 'queued' || run.phase === 'parked') return run.phase;\n if (run.phase === 'reverting') return 'reverting';\n return run.outcome ?? run.phase;\n}\n\nconst TONES: Readonly<Record<string, ChartTone>> = {\n producing: 'running',\n verifying: 'running',\n judging: 'running',\n landing: 'running',\n watching: 'info',\n reverting: 'danger',\n merged: 'success',\n proposed: 'info',\n 'owner-lane': 'warning',\n refused: 'warning',\n failed: 'danger',\n reverted: 'danger',\n cancelled: 'neutral',\n queued: 'neutral',\n parked: 'neutral',\n};\n\nexport function runTone(status: string): ChartTone {\n return TONES[status] ?? 'unknown';\n}\n\nfunction startOf(run: FleetLiveRun): number | null {\n const t = Date.parse(run.startedAt ?? run.phaseStartedAt ?? '');\n return Number.isFinite(t) ? t : null;\n}\n\nfunction endOf(run: FleetLiveRun): number | null {\n if (!run.endedAt) return null;\n const t = Date.parse(run.endedAt);\n return Number.isFinite(t) ? t : null;\n}\n\nfunction runDetail(run: FleetLiveRun): string {\n const where = run.repo.includes('/') ? run.repo.split('/')[1] : run.repo;\n return [where, run.title, run.model, run.prNumber ? `PR #${run.prNumber}` : null].filter(Boolean).join(' · ');\n}\n\nconst LANE_ORDER: readonly (FleetEngine | 'none')[] = ['local', 'grok-cli', 'claude-cli', 'codex', 'devin-cli', 'none'];\n\n/**\n * Runs within [from, now] packed into lane × slot rows. `parkedAsGantt`\n * leaves parked runs out (the Fleet surface draws them in their own Gantt);\n * Command keeps them in, as outlines.\n */\nexport function laneRows(runs: readonly FleetLiveRun[], from: number, now: number, opts: { includeParked?: boolean } = {}): SwimlaneLane[] {\n const includeParked = opts.includeParked ?? true;\n const byLane = new Map<FleetEngine | 'none', FleetLiveRun[]>();\n for (const run of runs) {\n if (!includeParked && run.phase === 'parked') continue;\n const s = startOf(run);\n if (s === null) continue;\n const e = endOf(run) ?? now;\n if (e < from || s > now) continue;\n const key = run.lane ?? 'none';\n if (!byLane.has(key)) byLane.set(key, []);\n byLane.get(key)!.push(run);\n }\n const lanes: SwimlaneLane[] = [];\n for (const key of LANE_ORDER) {\n const list = byLane.get(key);\n if (!list?.length) continue;\n list.sort((a, b) => startOf(a)! - startOf(b)!);\n const slotEnds: number[] = [];\n const slotItems: FleetLiveRun[][] = [];\n for (const run of list) {\n const s = startOf(run)!;\n const e = endOf(run) ?? now;\n let slot = slotEnds.findIndex((end) => end <= s);\n if (slot === -1) {\n slot = slotEnds.length;\n slotEnds.push(e);\n slotItems.push([]);\n } else {\n slotEnds[slot] = e;\n }\n slotItems[slot]!.push(run);\n }\n const name = key === 'none' ? 'Unassigned' : LANE_LABEL[key];\n slotItems.forEach((items, i) => {\n lanes.push({\n id: `${key}:${i}`,\n label: slotItems.length > 1 ? `${name} · ${i + 1}` : name,\n ...(key === 'none' ? {} : { engine: LANE_ENGINE[key] }),\n items: items.map((run) => ({\n id: run.id,\n start: startOf(run)!,\n end: endOf(run),\n status: runStatus(run),\n detail: runDetail(run),\n })),\n });\n });\n }\n return lanes;\n}\n\nexport interface GanttRow {\n lanes: SwimlaneLane[];\n from: number;\n to: number;\n /** Rows whose release time is unknown (drawn open-ended). */\n unknownRelease: number;\n}\n\n/**\n * The Parked Gantt: one row per parked item, from when it parked to when its\n * seat should free up. The window always shows \"now\" plus the furthest known\n * release (capped at 48 h — a week-long wait still reads, it just runs off\n * the right edge and the table carries the exact time).\n */\nexport function parkedGantt(runs: readonly FleetLiveRun[], now: number): GanttRow {\n const parked = runs.filter((r) => r.phase === 'parked' || r.hold !== null);\n const releases = parked.map((r) => (r.hold?.nextEligibleAt ? Date.parse(r.hold.nextEligibleAt) : NaN)).filter(Number.isFinite);\n const starts = parked.map((r) => startOf(r) ?? now);\n const from = Math.min(now - 60 * 60_000, ...starts);\n const to = Math.min(now + 48 * 3_600_000, Math.max(now + 2 * 3_600_000, ...releases));\n let unknownRelease = 0;\n const lanes: SwimlaneLane[] = parked.map((r) => {\n const release = r.hold?.nextEligibleAt ? Date.parse(r.hold.nextEligibleAt) : NaN;\n if (!Number.isFinite(release)) unknownRelease++;\n const where = r.repo.includes('/') ? r.repo.split('/')[1] : r.repo;\n return {\n id: r.id,\n label: `${where}: ${r.title}`,\n ...(r.lane ? { engine: LANE_ENGINE[r.lane] } : {}),\n items: [{\n id: r.id,\n start: startOf(r) ?? now,\n end: Number.isFinite(release) ? release : null,\n status: r.hold?.kind === 'split' ? 'split' : 'parked',\n outline: true,\n detail: `${localTimes(r.hold?.reason ?? 'parked', now)}${Number.isFinite(release) ? '' : ' · release time unknown'}`,\n }],\n };\n });\n return { lanes, from, to, unknownRelease };\n}\n\n// ---------------------------------------------------------------------------\n// Gate funnel + refusal reasons\n// ---------------------------------------------------------------------------\n\n/** Gate names in operator words (the funnel's stage labels). */\nexport const GATE_LABEL: Readonly<Record<string, string>> = {\n G0: 'Authority',\n G1: 'Protected paths',\n G1b: 'Tamper',\n G2: 'Scope',\n G3: 'Verify',\n G4: 'Claims',\n G5: 'Blast radius',\n G6: 'Judge or elite',\n G7: 'GitHub checks',\n};\n\n/** Entered G0, then how many passed each gate — a strictly narrowing pipeline. */\nexport function funnelStages(funnel: FleetGateFunnel | null): FunnelStage[] {\n if (!funnel || funnel.stages.length === 0) return [];\n return [\n { id: 'entered', label: 'Proposals', value: funnel.stages[0]!.entered },\n ...funnel.stages.map((s) => ({ id: s.gate, label: `${s.gate} ${GATE_LABEL[s.gate] ?? ''}`.trim(), value: s.passed })),\n ];\n}\n\nexport interface RefusalStack {\n categories: string[];\n segments: BarStackSegment[];\n values: (number | null)[][];\n total: number;\n}\n\n/**\n * Refusals per gate, stacked by reason. The top five reasons (by count over\n * the window) keep FIXED identity slots — a reason's colour never changes\n * when another is filtered out — and the rest fold into a neutral \"Other\".\n */\nexport function refusalStack(funnel: FleetGateFunnel | null, topN = 5): RefusalStack {\n if (!funnel) return { categories: [], segments: [], values: [], total: 0 };\n const totals = new Map<string, { reason: string; count: number }>();\n for (const s of funnel.stages) for (const r of s.refusals) {\n const prev = totals.get(r.code);\n totals.set(r.code, { reason: prev?.reason ?? r.reason, count: (prev?.count ?? 0) + r.count });\n }\n const ranked = [...totals.entries()].sort((a, b) => b[1].count - a[1].count || a[0].localeCompare(b[0]));\n const top = ranked.slice(0, topN).map(([code]) => code);\n const hasOther = ranked.length > topN;\n const segments: BarStackSegment[] = [\n ...top.map((code, i) => ({ id: code, label: totals.get(code)!.reason, color: seriesColor(i) })),\n ...(hasOther ? [{ id: '__other', label: 'Other reasons', color: CHART_NEUTRAL }] : []),\n ];\n const stages = funnel.stages.filter((s) => s.refusals.length > 0 || s.entered !== s.passed);\n return {\n categories: stages.map((s) => s.gate),\n segments,\n values: stages.map((s) => {\n const row = top.map((code) => s.refusals.find((r) => r.code === code)?.count ?? 0);\n if (hasOther) row.push(s.refusals.filter((r) => !top.includes(r.code)).reduce((n, r) => n + r.count, 0));\n return row;\n }),\n total: ranked.reduce((n, [, v]) => n + v.count, 0),\n };\n}\n\n/**\n * No run of any kind and no proposal at the gates: every chart card on Fleet\n * (live swimlane, gate funnel, refusals, parked) would be an empty state.\n */\nexport function nothingToDraw(fleet: FleetLiveSnapshotV1): boolean {\n return fleet.runs.length === 0 && funnelStages(fleet.funnel).length === 0 && refusalStack(fleet.funnel).total === 0;\n}\n\n/** The newest seat decision behind a live dispatch (\"why this seat\"). */\nexport function latestDecision(fleet: FleetLiveSnapshotV1 | null): { decision: SeatDecision; run: FleetLiveRun } | null {\n if (!fleet) return null;\n const withDecision = fleet.runs.filter((r) => r.seatDecision !== null);\n if (!withDecision.length) return null;\n withDecision.sort((a, b) => (startOf(b) ?? 0) - (startOf(a) ?? 0));\n const run = withDecision[0]!;\n return { decision: run.seatDecision!, run };\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{z as e}from"./VerseShared-CH8mV5ew.js";import{n as t}from"./mobile-toast-eIrghd9o.js";function n(n){let r=n.confirm!==!1;return e({title:n.title,body:n.consequences,confirmLabel:n.confirmLabel,destructive:n.destructive===!0,token:!0,tokenReason:`${n.confirmLabel} changes state on your Mac and needs the mutation token \`ashlr verse\` printed.`,skipConfirm:!r,run:async()=>{await n.run()},onDone:()=>{n.success&&t(n.success,`success`),n.onDone?.()},onError:r?void 0:e=>t(e,`danger`)})}export{n as t};
|
|
2
|
-
//# sourceMappingURL=mobile-actions-XqB_h7a8.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mobile-actions-XqB_h7a8.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/mobile-actions.ts"],"sourcesContent":["/**\n * routes/verse/mobile/mobile-actions.ts — every write the phone makes goes\n * through here: confirmation (unless the action is trivially undoable), then\n * the mutation token if it is not held, then the call — the one order\n * shell/guard-store.ts enforces for the desktop too. MobileGuardSheet draws\n * it; this module only describes the action.\n */\nimport { requestGuarded } from '../shell/guard-store.js';\nimport { showMobileToast } from './mobile-toast.js';\n\nexport interface MobileAction {\n /** Sheet title: the question (\"Stop the fleet?\"). */\n title: string;\n /** What will happen, in operator language — the sheet's body. */\n consequences: string;\n /** The confirm button (\"Stop fleet\"). */\n confirmLabel: string;\n destructive?: boolean;\n /**\n * false = no confirmation sheet (Pause, Send): the token prompt still\n * appears if the hold has lapsed, and a failure becomes a toast.\n */\n confirm?: boolean;\n run: () => Promise<unknown>;\n /** Toast after success; omit for none. */\n success?: string;\n onDone?: () => void;\n}\n\n/** Start `action`. False when another guarded action is already open. */\nexport function runMobileAction(action: MobileAction): boolean {\n const confirm = action.confirm !== false;\n return requestGuarded({\n title: action.title,\n body: action.consequences,\n confirmLabel: action.confirmLabel,\n destructive: action.destructive === true,\n token: true,\n tokenReason: `${action.confirmLabel} changes state on your Mac and needs the mutation token \\`ashlr verse\\` printed.`,\n skipConfirm: !confirm,\n run: async () => {\n await action.run();\n },\n onDone: () => {\n if (action.success) showMobileToast(action.success, 'success');\n action.onDone?.();\n },\n onError: confirm ? undefined : (message) => showMobileToast(message, 'danger'),\n });\n}\n"],"mappings":"6FA8BA,SAAgB,EAAgB,EAA+B,CAC7D,IAAM,EAAU,EAAO,UAAY,GACnC,OAAO,EAAe,CACpB,MAAO,EAAO,MACd,KAAM,EAAO,aACb,aAAc,EAAO,aACrB,YAAa,EAAO,cAAgB,GACpC,MAAO,GACP,YAAa,GAAG,EAAO,aAAa,kFACpC,YAAa,CAAC,EACd,IAAK,SAAY,CACf,MAAM,EAAO,IAAI,CACnB,EACA,WAAc,CACR,EAAO,SAAS,EAAgB,EAAO,QAAS,SAAS,EAC7D,EAAO,SAAS,CAClB,EACA,QAAS,EAAU,IAAA,GAAa,GAAY,EAAgB,EAAS,QAAQ,CAC/E,CAAC,CACH"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{s as r}from"./VerseMobileApp-BRayqF_2.js";import{t as i}from"./parts.module-CBkHcD6w.js";var a=e(n(),1),o=t(),s={...r,...i},c=4e3,l=[],u=1,d=new Set;function f(e){l=e;for(let e of[...d])e()}function p(e){f(l.filter(t=>t.id!==e))}function m(e,t=`neutral`){let n=u++;f([...l.slice(-2),{id:n,message:e,tone:t}]),setTimeout(()=>p(n),c)}function h(e){return d.add(e),()=>d.delete(e)}function g(){let e=(0,a.useSyncExternalStore)(h,()=>l,()=>l);return(0,o.jsx)(`div`,{className:s.toasts,role:`status`,"aria-live":`polite`,children:e.map(e=>(0,o.jsxs)(`div`,{className:s.toast,"data-tone":e.tone,children:[(0,o.jsx)(`span`,{children:e.message}),(0,o.jsx)(`button`,{type:`button`,className:`${s.btn} ${s.iconBtn}`,onClick:()=>p(e.id),"aria-label":`Dismiss`,children:`×`})]},e.id))})}export{m as n,g as t};
|
|
2
|
-
//# sourceMappingURL=mobile-toast-eIrghd9o.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mobile-toast-eIrghd9o.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/mobile-toast.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/mobile-toast.tsx — one-line confirmations under the\n * status bar (\"Approved: fix the flaky test\"). A module store rather than a\n * context so a helper outside React (an action's onDone) can post one; one\n * aria-live region announces each once.\n */\nimport { useSyncExternalStore } from 'react';\nimport partStyles from './parts.module.css';\nimport coreStyles from './ui.module.css';\n\nconst styles = { ...coreStyles, ...partStyles };\n\nexport type MobileToastTone = 'neutral' | 'success' | 'danger';\n\ninterface ToastItem {\n id: number;\n message: string;\n tone: MobileToastTone;\n}\n\nconst AUTO_DISMISS_MS = 4000;\nlet items: ToastItem[] = [];\nlet nextId = 1;\nconst listeners = new Set<() => void>();\n\nfunction emit(next: ToastItem[]): void {\n items = next;\n for (const l of [...listeners]) l();\n}\n\nfunction dismiss(id: number): void {\n emit(items.filter((t) => t.id !== id));\n}\n\nexport function showMobileToast(message: string, tone: MobileToastTone = 'neutral'): void {\n const id = nextId++;\n // At most three: a burst of actions must not bury the screen.\n emit([...items.slice(-2), { id, message, tone }]);\n setTimeout(() => dismiss(id), AUTO_DISMISS_MS);\n}\n\nexport function resetMobileToastsForTest(): void {\n emit([]);\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function MobileToasts() {\n const current = useSyncExternalStore(subscribe, () => items, () => items);\n return (\n <div className={styles.toasts} role=\"status\" aria-live=\"polite\">\n {current.map((t) => (\n <div key={t.id} className={styles.toast} data-tone={t.tone}>\n <span>{t.message}</span>\n <button type=\"button\" className={`${styles.btn} ${styles.iconBtn}`} onClick={() => dismiss(t.id)} aria-label=\"Dismiss\">\n ×\n </button>\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"uNAUM,EAAS,CAAE,GAAG,EAAY,GAAG,CAAW,EAUxC,EAAkB,IACpB,EAAqB,CAAC,EACtB,EAAS,EACP,EAAY,IAAI,IAEtB,SAAS,EAAK,EAAyB,CACrC,EAAQ,EACR,IAAK,IAAM,IAAK,CAAC,GAAG,CAAS,EAAG,EAAE,CACpC,CAEA,SAAS,EAAQ,EAAkB,CACjC,EAAK,EAAM,OAAQ,GAAM,EAAE,KAAO,CAAE,CAAC,CACvC,CAEA,SAAgB,EAAgB,EAAiB,EAAwB,UAAiB,CACxF,IAAM,EAAK,IAEX,EAAK,CAAC,GAAG,EAAM,MAAM,EAAE,EAAG,CAAE,KAAI,UAAS,MAAK,CAAC,CAAC,EAChD,eAAiB,EAAQ,CAAE,EAAG,CAAe,CAC/C,CAMA,SAAS,EAAU,EAAkC,CAEnD,OADA,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC,CAEA,SAAgB,GAAe,CAC7B,IAAM,GAAA,EAAU,EAAA,qBAAA,CAAqB,MAAiB,MAAa,CAAK,EACxE,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAQ,KAAK,SAAS,YAAU,SACpD,SAAA,EAAQ,IAAK,IACZ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAgB,UAAW,EAAO,MAAO,YAAW,EAAE,KAAtD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAE,OAAc,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,GAAG,EAAO,IAAI,GAAG,EAAO,UAAW,YAAe,EAAQ,EAAE,EAAE,EAAG,aAAW,UAAU,SAAA,GAE/G,CAAA,CACL,CALK,EAAA,EAAE,EAKP,CACN,CACE,CAAA,CAET"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-hePW80VL.js";import{R as t}from"./global-BJ_kVFpD.js";import{j as n}from"./VerseConsoleApp-Cj6yPJo3.js";import{a as r,m as i}from"./VerseShared-CH8mV5ew.js";import{i as a}from"./verse-store-DAqqNIyD.js";import{r as o,t as s}from"./context-queries-Bsl-w0q-.js";import"./composer-state-DTAoie2b.js";import{t as c}from"./verse-transcript-Dc-bk9l2.js";import{i as l,o as u}from"./multimodel-queries-DxIT9AZY.js";function d(e){return e instanceof Error&&e.message?e.message:typeof e==`string`&&e?e:`The request failed.`}function f(e){let t=new Set,n=[];for(let r of e)if(r.seatId&&!t.has(r.seatId)&&(t.add(r.seatId),n.push(r),n.length===3))break;return n}async function p(e,t,n){let r=f(e);return Promise.all(r.map(async e=>{let r=null;try{if(r=(await n.createSession(e)).id,n.link)try{await n.link(r)}catch{}return await n.sendTurn(r,t),{target:e,ok:!0,sessionId:r}}catch(t){return{target:e,ok:!1,sessionId:r,error:d(t)}}}))}function m(e,t,n=3){let r=[...e?[e]:[],...t],i=[],a=new Set,o=e=>{i.length>=n||i.some(t=>t.seatId===e.seatId)||(i.push(e),a.add(e.engine))};if(e&&e.tier===`elite`&&!e.local){for(let e of r)!a.has(e.engine)&&e.tier===`elite`&&!e.local&&o(e);for(let e of r)a.has(e.engine)||o(e);for(let e of r)o(e);return i.slice(0,n)}for(let e of r)!a.has(e.engine)&&!e.local&&o(e);let s=r.find(e=>e.local);s&&!i.some(e=>e.local)&&(i.length===n&&i.pop(),o(s));for(let e of r)o(e);return i.slice(0,n)}var h=new Set([`devin`]);function g(e,t){return t.find(t=>t.engine!==e&&!h.has(t.engine))??null}var _=24e3;function v(e,t){return e.length<=t?e:`${e.slice(0,t)}\n…(truncated for review)`}function y(e){let t=[`You are reviewing work produced by another model (${e.authorLabel}). Be an independent, skeptical reviewer.`,`The repository is open to you: read files or run read-only commands (such as a diff) to check claims, but change nothing.`,`Start with one line: "Verdict: ship", "Verdict: fix first" or "Verdict: wrong", then list concrete problems (correctness, missed edge cases, security, simpler alternatives), most important first. Say plainly when you find nothing.`];if(e.question&&t.push(``,`The request was:`,``,v(e.question.trim(),4e3)),e.answer&&t.push(``,`The answer to review:`,``,v(e.answer.trim(),_)),e.diff){let n=v(e.diff.trim(),_),r=Math.max(0,...Array.from(n.matchAll(/`+/g),e=>e[0].length)),i="`".repeat(Math.max(3,r+1));t.push(``,`The changes to review:`,``,`${i}diff`,n,i)}return t.join(`
|
|
2
|
-
`)}function b(e,t){return t?`${t.trim()}\n\n---\n\nThe request to answer now:\n\n${e}`:e}var x=.55,S=[/\bI(?:'m| am) not (?:sure|certain)\b/i,/\bI (?:don't|do not) know\b/i,/\bI (?:can't|cannot|am unable to|'m unable to)\b/i,/\bunable to (?:determine|access|find|help)\b/i,/\bas an AI\b/i,/\bI (?:don't|do not) have access\b/i,/\bwithout more (?:context|information)\b/i,/\bit(?:'s| is) (?:unclear|hard to say)\b/i];function C(e){let t=new Map;for(let n of e.split(`
|
|
3
|
-
`)){let e=n.trim();if(e.length<12)continue;let r=(t.get(e)??0)+1;if(r>=3)return!0;t.set(e,r)}return!1}function w(e){let t=e.trimEnd();return t.length<400?!1:/```\s*$/.test(t)&&(t.match(/```/g)??[]).length%2==1?!0:!/[.!?:)\]`"'*>|]$/.test(t)}function T(e){let t=[],n=e.text.trim();if(!e.ok)return{escalate:!0,confidence:0,reasons:[`The local turn did not finish cleanly.`]};if(n.length===0)return{escalate:!0,confidence:0,reasons:[`The local model returned nothing.`]};let r=1,i=e.classification.difficulty===`low`;n.length<40&&!i&&(e.toolUses??0)===0&&(r-=.5,t.push(`The answer is very short for the question.`));let a=S.filter(e=>e.test(n)).length;return a>0&&(r-=Math.min(.6,.3*a),t.push(a===1?`The answer hedges.`:`The answer hedges ${a} times.`)),C(n)&&(r-=.5,t.push(`The answer repeats itself.`)),w(n)&&(r-=.3,t.push(`The answer looks cut off.`)),(e.classification.kind===`code`||e.classification.kind===`debug`||e.classification.kind===`refactor`)&&!/```/.test(n)&&(e.toolUses??0)===0&&(r-=.3,t.push(`A code request got neither code nor edits.`)),r=Math.max(0,Math.round(r*100)/100),t.length===0&&t.push(`The draft reads complete.`),{escalate:r<x,confidence:r,reasons:t}}function E(e,t,n,r){let i=t.length>6e3?`${t.slice(0,6e3)}\n…(draft truncated)`:t;return[e.trim(),``,`---`,`A local model (${r}) drafted an answer first; it was escalated because: ${n.reasons.join(` `)}`,`Use it only if it is right. Its draft:`,``,i.split(`
|
|
4
|
-
`).map(e=>`> ${e}`).join(`
|
|
5
|
-
`)].join(`
|
|
6
|
-
`)}function D(e){return Math.ceil(e.length/4)}var O={review:/\b(review|critique|audit|look over|second opinion|sanity[- ]check|double[- ]check|code review|pr review|poke holes)\b/i,debug:/\b(error|exception|stack ?trace|traceback|failing|fails|failed|bug|crash(?:es|ed)?|broken|doesn'?t work|not working|segfault|panic|regression|flaky|TypeError|ReferenceError|undefined is not|cannot read propert)/i,refactor:/\b(refactor|restructure|clean ?up|extract (?:a |the )?\w+|migrate|port (?:it|this|the)|rename (?:all|every)|split (?:up|into)|consolidate|decouple)\b/i,plan:/\b(plan|design|architect(?:ure)?|approach|strategy|roadmap|trade-?offs?|should (?:we|i)|how should|pros and cons|options for|spec(?:ification)?)\b/i,code:/\b(implement|write|add|create|build|fix|make|update|change|wire|hook up|remove|delete|replace|convert|generate)\b/i,codeNoun:/\b(function|class|component|endpoint|tests?|script|handler|route|migration|schema)\b/i,bulk:/\b(all files|every file|across the (?:repo|codebase|project)|bulk|batch|each of (?:the|these)|every (?:module|package|test)|codemod|mass[- ]rename)\b/i,question:/^\s*(what|why|how|when|where|who|which|is|are|does|do|can|could|should|would|will|explain|tell me)\b/i,explain:/\b(explain|what does|what is|how does|walk me through|summari[sz]e|describe|meaning of|difference between)\b/i,hard:/\b(architect(?:ure)?|concurren(?:t|cy)|race condition|deadlock|security|vulnerab|auth(?:entication|orization)?|migration|performance|optimi[sz]e|distributed|memory leak|end[- ]to[- ]end|from scratch|entire|whole (?:codebase|repo|system)|complex|tricky|subtle|production)\b/i,easy:/\b(typo|quick|simple|small|tiny|trivial|one[- ]liner|rename|bump|format|lint|comment|docstring)\b/i,stackTrace:/(^\s+at .+\(.+:\d+:\d+\)$)|(Traceback \(most recent call last\))|(^\s*File ".+", line \d+)/m},k={question:{low:`quick question`,medium:`question`,high:`hard question`},explain:{low:`quick explanation`,medium:`explanation`,high:`deep explanation`},code:{low:`small code change`,medium:`code change`,high:`hard code change`},debug:{low:`quick fix`,medium:`debugging`,high:`hard debugging`},refactor:{low:`small refactor`,medium:`refactor`,high:`hard refactor`},review:{low:`quick review`,medium:`review`,high:`deep review`},plan:{low:`quick plan`,medium:`planning`,high:`architecture planning`},bulk:{low:`bulk edit`,medium:`bulk edit`,high:`large bulk edit`}};function A(e){return e===`review`?`review`:e===`plan`?`plan`:e===`bulk`?`bulk`:`code`}function j(e,t,n){if(O.bulk.test(e))return n.push(`touches many files`),`bulk`;if(O.review.test(e))return n.push(`asks for a review`),`review`;if(O.stackTrace.test(e))return n.push(`stack trace`),`debug`;if(O.debug.test(e))return n.push(`names a failure`),`debug`;if(O.refactor.test(e))return n.push(`restructures code`),`refactor`;if(O.plan.test(e))return n.push(`asks for a plan or design`),`plan`;let r=O.code.test(e);return O.explain.test(e)&&!r?(n.push(`asks for an explanation`),`explain`):(O.question.test(e)||e.trim().endsWith(`?`))&&!r&&!t?(n.push(`a question`),`question`):((r||t||O.codeNoun.test(e))&&n.push(t?`includes code`:`asks for a change`),`code`)}function M(e,t){return e>2e3||t>=4?`large`:e<120&&t<=1?`small`:`medium`}function N(e,t={}){let n=e.trim(),r=[],i=D(n),a=/```/.test(n)||/^( {4}|\t)\S/m.test(n),o=(n.match(/(^|\s)@[\w./-]+/g)??[]).length+(n.match(/\b[\w-]+\/[\w./-]+\.(?:ts|tsx|js|jsx|py|go|rs|java|rb|swift|kt|css|md|json|ya?ml)\b/g)??[]).length;o>0&&r.push(o===1?`1 file named`:`${o} files named`);let s=j(n,a,r),c=M(i,o);c===`large`&&r.push(`≈${i.toLocaleString(`en-US`)} tokens`);let l=`medium`,u=O.hard.test(n),d=O.easy.test(n);u&&r.push(`hard subject`),u||c===`large`||s===`plan`&&c!==`small`||s===`refactor`&&o>=2?l=`high`:(d||c===`small`&&(s===`question`||s===`explain`))&&(l=`low`,d&&r.push(`small by its own words`));let f=t.contextTokens??0;return l===`low`&&f>15e4&&(l=`medium`,r.push(`deep into a long chat`)),{kind:s,task:A(s),difficulty:l,size:c,estTokens:i,label:k[s][l],signals:r}}var P=2,F=1.5;Object.freeze({up:1,down:-1,retry:-.5,"switch-away":-.5,"switch-to":.5,"auto-followed":.1,"auto-overridden":-.5,"compare-won":1,"compare-lost":-.25,escalated:-.5,"draft-accepted":1});function I(e,t){return`${e}|seat:${t}`}function L(e,t){return`${e}|engine:${t}`}var R={question:`questions`,explain:`explanations`,code:`code changes`,debug:`debugging`,refactor:`refactors`,review:`reviews`,plan:`planning`,bulk:`bulk edits`};function z(e,t,n){if(!e)return{tilt:0,phrase:null};let r=e[I(t,n.seatId)],i=e[L(t,n.engine)],a=r&&r.n>=3?r:i&&i.n>=3?i:null;if(!a)return{tilt:0,phrase:null};let o=a.score/(a.n+P),s=-Math.max(-1.5,Math.min(F,o*2*F));if(Math.abs(s)<.15)return{tilt:0,phrase:null};let c=a.up+a.down,l=c>0?` (${a.up} of ${c} signals positive)`:``,u=s<0?`you've preferred ${n.label} for ${R[t]}${l}`:`you've passed over ${n.label} for ${R[t]}${l}`;return{tilt:Math.round(s*1e3)/1e3,phrase:u}}function B(e,t,n,r){return t.map(t=>({at:r,seatId:t.seatId,engine:t.engine,kind:n,signal:t.sessionId===e?`compare-won`:`compare-lost`,sessionId:t.sessionId,...t.model?{model:t.model}:{}}))}var V=e({DEFAULT_FLOW_API:()=>H,escalate:()=>Q,looksLikePlan:()=>K,pickWinner:()=>X,quickHandoff:()=>q,quickHandoffFromChat:()=>J,routeMessage:()=>G,siblingRequest:()=>U,startCompare:()=>Y,startReview:()=>Z}),H={createSession:r,createHandoffSession:s,fetchHandoffPreview:o,sendTurn:i,link:l,outcome:u,saveDraft:t,open:n};function U(e,t,n){let r={projectPath:e.projectPath,seatId:t.seatId},i=(e.extraRoots??[]).filter(t=>typeof t==`string`&&t.length>0&&t!==e.projectPath);i.length>0&&(r.extraRoots=i),t.model&&(r.model=t.model);let a=n?.trim();return a&&(r.title=a.slice(0,120)),r}async function W(e,t,n,r){if(t.turnCount>0){let i=await e.fetchHandoffPreview(t.id);return{session:await e.createHandoffSession({source:t,seatId:n.seatId,...n.model?{model:n.model}:{},...r?{title:r}:{}}),note:i.text}}return{session:await e.createSession(U(t,n,r)),note:null}}async function G(e,t){let{session:n,note:r}=await W(e,t.source,t.target);return await e.sendTurn(n.id,b(t.text,r)),e.outcome({seatId:t.target.seatId,kind:t.kind,signal:t.overridden?`switch-to`:`auto-followed`,sessionId:n.id}),t.overridden&&e.outcome({seatId:t.overridden.seatId,kind:t.kind,signal:`auto-overridden`}),e.open(n.id),n}function K(e){return e?/^#{1,4}\s*(?:the\s+)?plan\b/im.test(e)?!0:(e.match(/^\s*(?:\d+[.)]|[-*] \[[ x]\])\s+\S/gm)??[]).length>=3:!1}async function q(e,t){let n=K(t.lastAssistant),r=await e.fetchHandoffPreview(t.source.id,n?{includeLastAssistant:!0}:{}),i=await e.createHandoffSession({source:t.source,seatId:t.target.seatId,...t.target.model?{model:t.target.model}:{}});return e.saveDraft(i.id,r.text),e.outcome({seatId:t.source.seatId,kind:t.kind,signal:`switch-away`,sessionId:t.source.id}),e.outcome({seatId:t.target.seatId,kind:t.kind,signal:`switch-to`,sessionId:i.id}),e.open(i.id),i}async function J(e,t,n=H){let r=a(e).session;if(!r||r.turnCount===0)return null;let i=c(e).items,o=``,s=null;for(let e=i.length-1;e>=0;--e){let t=i[e];if(s===null&&t.kind===`assistant`&&(s=t.text),t.kind===`user`){o=t.text;break}}return q(n,{source:r,target:t,lastAssistant:s,kind:N(o).kind})}async function Y(e,t){let n=t.source.turnCount>0?(await e.fetchHandoffPreview(t.source.id)).text:null,r=e=>`${t.source.title.slice(0,80)} · ${e}`;return p(t.targets,b(t.text,n),{createSession:n=>t.source.turnCount>0?e.createHandoffSession({source:t.source,seatId:n.seatId,...n.model?{model:n.model}:{},title:r(n.label)}):e.createSession(U(t.source,n,r(n.label))),sendTurn:(t,n)=>e.sendTurn(t,n),link:n=>e.link({parentSessionId:t.source.id,childSessionId:n,relation:`compare`})})}async function X(e,t){let n=B(t.winnerSessionId,t.entries,t.kind,new Date().toISOString());await Promise.all(n.map(t=>e.outcome({seatId:t.seatId,kind:t.kind,signal:t.signal,...t.sessionId?{sessionId:t.sessionId}:{},...t.model?{model:t.model}:{}}))),e.open(t.winnerSessionId)}async function Z(e,t){let n=await e.createSession(U(t.source,t.reviewer,`Review · ${t.source.title.slice(0,80)}`));return e.link({parentSessionId:t.source.id,childSessionId:n.id,relation:`review`}),await e.sendTurn(n.id,y({question:t.question,answer:t.answer,authorLabel:t.authorLabel})),n}async function Q(e,t){let{session:n,note:r}=await W(e,t.source,t.target);return e.link({parentSessionId:t.source.id,childSessionId:n.id,relation:`escalate`}),await e.sendTurn(n.id,b(E(t.question,t.draft,t.verdict,t.draftLabel),r)),e.outcome({seatId:t.source.seatId,kind:t.kind,signal:`escalated`,sessionId:t.source.id}),e.open(n.id),n}export{G as a,Z as c,T as d,g as f,X as i,z as l,y as m,Q as n,U as o,m as p,V as r,Y as s,H as t,N as u};
|
|
7
|
-
//# sourceMappingURL=multimodel-flows-CzI-yHg5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multimodel-flows-CzI-yHg5.js","names":[],"sources":["../../../../../../src/core/verse/multimodel/compare.ts","../../../../../../src/core/verse/multimodel/escalation.ts","../../../../../../src/core/verse/multimodel/classify.ts","../../../../../../src/core/verse/multimodel/learning.ts","../../../../../../src/web-ui/routes/verse/multimodel/multimodel-flows.ts"],"sourcesContent":["/**\n * Compare and cross-family review — the same prompt to 2–3 seats at once, and\n * \"ask another model to review this\" in one click.\n *\n * FAN-OUT GOES THROUGH THE FRONT DOOR. `fanOut` takes its two effects as\n * injected functions, and the app passes the SAME `createVerseSession` /\n * `sendVerseTurn` a hand-typed chat uses — so every answer passes the spend\n * chokepoint, the readiness gate, the local-only gate and the mutation token.\n * One seat failing (not ready, signed out, refused) never sinks the others:\n * each target settles on its own and reports why.\n *\n * Every Compare answer is a real chat, linked to its thread\n * (`relation: 'compare'`), so \"pick one to continue\" is simply opening that\n * chat — its context is already there — and the per-chat meter counts all of\n * them.\n *\n * BROWSER-SAFE and deterministic (the effects are injected).\n */\nimport type { SeatAdviceOption } from './types.js';\n\n/** Most seats one Compare may fan out to. */\nexport const COMPARE_MAX_SEATS = 3;\n\nexport interface CompareTarget {\n seatId: string;\n model: string | null;\n label: string;\n engine: string;\n}\n\nexport interface FanOutDeps {\n /** Create a chat on `target` (POST /api/verse/sessions); resolves to its id. */\n createSession(target: CompareTarget): Promise<{ id: string }>;\n /** Send turn 1 (POST /api/verse/sessions/:id/turns). */\n sendTurn(sessionId: string, text: string): Promise<unknown>;\n /** Record the thread link (best effort — a failure here never fails the answer). */\n link?(childSessionId: string): Promise<unknown>;\n}\n\nexport type FanOutEntry =\n | { target: CompareTarget; ok: true; sessionId: string }\n | { target: CompareTarget; ok: false; sessionId: string | null; error: string };\n\nfunction message(err: unknown): string {\n if (err instanceof Error && err.message) return err.message;\n return typeof err === 'string' && err ? err : 'The request failed.';\n}\n\n/** Distinct seats, capped at COMPARE_MAX_SEATS, in the caller's order. */\nexport function normalizeTargets(targets: readonly CompareTarget[]): CompareTarget[] {\n const seen = new Set<string>();\n const out: CompareTarget[] = [];\n for (const t of targets) {\n if (!t.seatId || seen.has(t.seatId)) continue;\n seen.add(t.seatId);\n out.push(t);\n if (out.length === COMPARE_MAX_SEATS) break;\n }\n return out;\n}\n\n/**\n * Send `text` to every target in parallel. Never throws: each entry says\n * whether its chat was created and its turn accepted.\n */\nexport async function fanOut(targets: readonly CompareTarget[], text: string, deps: FanOutDeps): Promise<FanOutEntry[]> {\n const list = normalizeTargets(targets);\n return Promise.all(list.map(async (target): Promise<FanOutEntry> => {\n let sessionId: string | null = null;\n try {\n sessionId = (await deps.createSession(target)).id;\n if (deps.link) {\n try { await deps.link(sessionId); } catch { /* the meter just misses this link */ }\n }\n await deps.sendTurn(sessionId, text);\n return { target, ok: true, sessionId };\n } catch (err) {\n return { target, ok: false, sessionId, error: message(err) };\n }\n }));\n}\n\n/**\n * Default Compare set: the Auto choice plus the best seats of OTHER engines\n * (a second account of the same provider is not a second opinion).\n *\n * - Elite work (the Auto choice is a hosted elite seat): the elite partners\n * against each other — typically Claude + Codex + Devin (3.15).\n * - Everything else: with one local model when there is one — so a typical\n * set is two hosted seats + local.\n */\nexport function defaultCompareSet(choice: SeatAdviceOption | null, alternatives: readonly SeatAdviceOption[], max = COMPARE_MAX_SEATS): SeatAdviceOption[] {\n const pool = [...(choice ? [choice] : []), ...alternatives];\n const out: SeatAdviceOption[] = [];\n const engines = new Set<string>();\n const take = (o: SeatAdviceOption) => {\n if (out.length >= max || out.some((x) => x.seatId === o.seatId)) return;\n out.push(o);\n engines.add(o.engine);\n };\n if (choice && choice.tier === 'elite' && !choice.local) {\n for (const o of pool) if (!engines.has(o.engine) && o.tier === 'elite' && !o.local) take(o);\n for (const o of pool) if (!engines.has(o.engine)) take(o);\n for (const o of pool) take(o);\n return out.slice(0, max);\n }\n for (const o of pool) if (!engines.has(o.engine) && !o.local) take(o);\n const local = pool.find((o) => o.local);\n if (local && !out.some((o) => o.local)) {\n // Make room for one local voice when the set is all paid seats.\n if (out.length === max) out.pop();\n take(local);\n }\n for (const o of pool) take(o);\n return out.slice(0, max);\n}\n\n/**\n * The reviewer for cross-family review: the best-ranked seat whose engine\n * differs from the author's. Claude-on-Ollama (`local`) counts as a different\n * family from `claude` — it is a different model. Null when every candidate\n * shares the author's engine.\n *\n * Devin REVIEWS nothing here: its answers are reviewed like anyone's, but it\n * is never auto-picked to deliver a verdict (\"Verdict: ship\") on another\n * model's work — the same producer-not-judge line the fleet holds (a decision\n * left to Mason, 3.15).\n */\nexport const NEVER_AUTO_REVIEWER_ENGINES: ReadonlySet<string> = new Set(['devin']);\n\nexport function crossFamilyReviewer(authorEngine: string, ranked: readonly SeatAdviceOption[]): SeatAdviceOption | null {\n return ranked.find((o) => o.engine !== authorEngine && !NEVER_AUTO_REVIEWER_ENGINES.has(o.engine)) ?? null;\n}\n\nexport interface ReviewSubject {\n /** What Mason asked, when reviewing an answer. */\n question?: string | null;\n /** The answer under review. */\n answer?: string | null;\n /** `git diff --stat` / a diff excerpt, when reviewing changes. */\n diff?: string | null;\n authorLabel: string;\n}\n\nconst REVIEW_MAX_CHARS = 24_000;\n\nfunction cap(text: string, max: number): string {\n return text.length <= max ? text : `${text.slice(0, max)}\\n…(truncated for review)`;\n}\n\n/** The review turn: an independent critique, read-only, with a verdict line first. */\nexport function reviewPrompt(subject: ReviewSubject): string {\n const parts = [\n `You are reviewing work produced by another model (${subject.authorLabel}). Be an independent, skeptical reviewer.`,\n 'The repository is open to you: read files or run read-only commands (such as a diff) to check claims, but change nothing.',\n 'Start with one line: \"Verdict: ship\", \"Verdict: fix first\" or \"Verdict: wrong\", then list concrete problems (correctness, missed edge cases, security, simpler alternatives), most important first. Say plainly when you find nothing.',\n ];\n if (subject.question) parts.push('', 'The request was:', '', cap(subject.question.trim(), 4_000));\n if (subject.answer) parts.push('', 'The answer to review:', '', cap(subject.answer.trim(), REVIEW_MAX_CHARS));\n if (subject.diff) {\n const diff = cap(subject.diff.trim(), REVIEW_MAX_CHARS);\n // A fence longer than any backtick run inside: a diff of Markdown that\n // itself holds ``` must not close the block early.\n const longest = Math.max(0, ...Array.from(diff.matchAll(/`+/g), (m) => m[0].length));\n const fence = '`'.repeat(Math.max(3, longest + 1));\n parts.push('', 'The changes to review:', '', `${fence}diff`, diff, fence);\n }\n return parts.join('\\n');\n}\n\n/**\n * Turn 1 of a Compare chat. Mid-thread, each seat gets the zero-spend handoff\n * note first (none of them has the conversation), then the prompt.\n */\nexport function comparePrompt(text: string, handoffNote: string | null): string {\n if (!handoffNote) return text;\n return `${handoffNote.trim()}\\n\\n---\\n\\nThe request to answer now:\\n\\n${text}`;\n}\n","/**\n * Cheap-first escalation — a local model drafts, a frontier seat is used only\n * when it is needed. Two PURE decisions and one piece of arithmetic:\n *\n * triage(classification) BEFORE sending: is this message one a local model\n * should even try? Hard work, large messages and a\n * confident \"needs frontier\" from the decision\n * layer go straight to the frontier seat — a weak\n * draft there would cost a round trip and save\n * nothing.\n * assessDraft(draft) AFTER the local turn: is the draft good enough?\n * Legible heuristics, each named in the verdict —\n * the turn failed, the answer is empty or cut off,\n * it hedges, it loops, an edit request produced no\n * code. Below ESCALATE_BELOW the composer escalates.\n * savedUsd(tokens, price) What answering locally saved, at the frontier\n * seat's API list price — an EQUIVALENT (a Max\n * subscription is not billed per token), labelled\n * as such wherever it is shown.\n *\n * Escalation itself is an ordinary handoff: the conversation continues on the\n * frontier seat from the zero-spend handoff note, with the local draft quoted\n * for it to check — through the same session routes as any other turn.\n *\n * BROWSER-SAFE.\n */\nimport type { PromptClassification } from './types.js';\n\n/** A draft scoring below this is escalated. */\nexport const ESCALATE_BELOW = 0.55;\n\nexport interface TriageVerdict {\n route: 'local' | 'frontier';\n reason: string;\n}\n\nexport function triage(cls: PromptClassification, opts: { localAvailable: boolean }): TriageVerdict {\n if (!opts.localAvailable) return { route: 'frontier', reason: 'No local model is running, so there is nothing to draft with.' };\n if ((cls.needsFrontier ?? 0) >= 0.7) return { route: 'frontier', reason: `Jev says this needs a frontier model (${Math.round((cls.needsFrontier ?? 0) * 100)}%).` };\n if (cls.difficulty === 'high') return { route: 'frontier', reason: `A ${cls.label} goes straight to a frontier seat — a local draft would not save anything.` };\n if (cls.size === 'large') return { route: 'frontier', reason: 'A message this large goes straight to a frontier seat.' };\n return { route: 'local', reason: `A ${cls.label} — a local model drafts it first.` };\n}\n\nexport interface DraftInput {\n text: string;\n /** The turn ended cleanly (turn-done ok). */\n ok: boolean;\n classification: PromptClassification;\n /** Tool calls the turn made (an edit request answered with edits has no code block to show). */\n toolUses?: number;\n}\n\nexport interface DraftVerdict {\n escalate: boolean;\n /** 0–1: how much the heuristics trust the draft. */\n confidence: number;\n /** Every heuristic that fired, as a short sentence. */\n reasons: string[];\n}\n\nconst HEDGES = [\n /\\bI(?:'m| am) not (?:sure|certain)\\b/i,\n /\\bI (?:don't|do not) know\\b/i,\n /\\bI (?:can't|cannot|am unable to|'m unable to)\\b/i,\n /\\bunable to (?:determine|access|find|help)\\b/i,\n /\\bas an AI\\b/i,\n /\\bI (?:don't|do not) have access\\b/i,\n /\\bwithout more (?:context|information)\\b/i,\n /\\bit(?:'s| is) (?:unclear|hard to say)\\b/i,\n];\n\n/** A line repeated three or more times — small models loop. */\nfunction loops(text: string): boolean {\n const counts = new Map<string, number>();\n for (const raw of text.split('\\n')) {\n const line = raw.trim();\n if (line.length < 12) continue;\n const n = (counts.get(line) ?? 0) + 1;\n if (n >= 3) return true;\n counts.set(line, n);\n }\n return false;\n}\n\nfunction cutOff(text: string): boolean {\n const t = text.trimEnd();\n if (t.length < 400) return false;\n if (/```\\s*$/.test(t) && (t.match(/```/g) ?? []).length % 2 === 1) return true;\n return !/[.!?:)\\]`\"'*>|]$/.test(t);\n}\n\nexport function assessDraft(input: DraftInput): DraftVerdict {\n const reasons: string[] = [];\n const text = input.text.trim();\n if (!input.ok) return { escalate: true, confidence: 0, reasons: ['The local turn did not finish cleanly.'] };\n if (text.length === 0) return { escalate: true, confidence: 0, reasons: ['The local model returned nothing.'] };\n\n let confidence = 1;\n const trivial = input.classification.difficulty === 'low';\n // A short reply after edits made through tools is a normal \"done\".\n if (text.length < 40 && !trivial && (input.toolUses ?? 0) === 0) {\n confidence -= 0.5;\n reasons.push('The answer is very short for the question.');\n }\n const hedges = HEDGES.filter((re) => re.test(text)).length;\n if (hedges > 0) {\n confidence -= Math.min(0.6, 0.3 * hedges);\n reasons.push(hedges === 1 ? 'The answer hedges.' : `The answer hedges ${hedges} times.`);\n }\n if (loops(text)) {\n confidence -= 0.5;\n reasons.push('The answer repeats itself.');\n }\n if (cutOff(text)) {\n confidence -= 0.3;\n reasons.push('The answer looks cut off.');\n }\n const edit = input.classification.kind === 'code' || input.classification.kind === 'debug' || input.classification.kind === 'refactor';\n if (edit && !/```/.test(text) && (input.toolUses ?? 0) === 0) {\n confidence -= 0.3;\n reasons.push('A code request got neither code nor edits.');\n }\n confidence = Math.max(0, Math.round(confidence * 100) / 100);\n if (reasons.length === 0) reasons.push('The draft reads complete.');\n return { escalate: confidence < ESCALATE_BELOW, confidence, reasons };\n}\n\nexport interface ListPrice {\n /** USD per million input tokens. */\n inPerM: number;\n /** USD per million output tokens. */\n outPerM: number;\n}\n\n/** What `tokens` would have cost at `price` (cache reads at a tenth of the input rate). */\nexport function listCostUsd(tokens: { input: number; output: number; cacheRead?: number }, price: ListPrice): number {\n const usd = (tokens.input * price.inPerM + (tokens.cacheRead ?? 0) * price.inPerM * 0.1 + tokens.output * price.outPerM) / 1_000_000;\n return Math.round(usd * 10_000) / 10_000;\n}\n\n/** The escalation turn: the question again, with the local draft quoted for the frontier seat to check. */\nexport function escalationPrompt(question: string, draft: string, verdict: DraftVerdict, draftSeatLabel: string): string {\n const quoted = draft.length > 6_000 ? `${draft.slice(0, 6_000)}\\n…(draft truncated)` : draft;\n return [\n question.trim(),\n '',\n `---`,\n `A local model (${draftSeatLabel}) drafted an answer first; it was escalated because: ${verdict.reasons.join(' ')}`,\n 'Use it only if it is right. Its draft:',\n '',\n quoted.split('\\n').map((l) => `> ${l}`).join('\\n'),\n ].join('\\n');\n}\n","/**\n * Prompt classification for the Auto seat — kind, size, difficulty — from the\n * text alone. PURE, deterministic, no model call: it runs in the browser on\n * every pause in typing, so it has to be instant and it must never send the\n * draft anywhere.\n *\n * It is deliberately a small set of legible rules rather than a scorer: the\n * Auto line shows the verdict (\"quick question\", \"hard refactor\") and the\n * operator must be able to see why and disagree. When the rules are unsure\n * they say `medium`, which leaves the router's own quality order in charge.\n *\n * BROWSER-SAFE.\n */\nimport type { RoutingDifficulty, RoutingTask } from '../../routing/types.js';\nimport type { PromptClassification, PromptKind, PromptSize } from './types.js';\n\n/** chars / 4, rounded up — the same estimator the handoff and fit badges use. */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nconst RE = {\n review: /\\b(review|critique|audit|look over|second opinion|sanity[- ]check|double[- ]check|code review|pr review|poke holes)\\b/i,\n debug: /\\b(error|exception|stack ?trace|traceback|failing|fails|failed|bug|crash(?:es|ed)?|broken|doesn'?t work|not working|segfault|panic|regression|flaky|TypeError|ReferenceError|undefined is not|cannot read propert)/i,\n refactor: /\\b(refactor|restructure|clean ?up|extract (?:a |the )?\\w+|migrate|port (?:it|this|the)|rename (?:all|every)|split (?:up|into)|consolidate|decouple)\\b/i,\n plan: /\\b(plan|design|architect(?:ure)?|approach|strategy|roadmap|trade-?offs?|should (?:we|i)|how should|pros and cons|options for|spec(?:ification)?)\\b/i,\n /** Asking for a change: an imperative verb. */\n code: /\\b(implement|write|add|create|build|fix|make|update|change|wire|hook up|remove|delete|replace|convert|generate)\\b/i,\n /** Code nouns: a change when paired with a verb, but \"what does this function do?\" is still a question. */\n codeNoun: /\\b(function|class|component|endpoint|tests?|script|handler|route|migration|schema)\\b/i,\n bulk: /\\b(all files|every file|across the (?:repo|codebase|project)|bulk|batch|each of (?:the|these)|every (?:module|package|test)|codemod|mass[- ]rename)\\b/i,\n question: /^\\s*(what|why|how|when|where|who|which|is|are|does|do|can|could|should|would|will|explain|tell me)\\b/i,\n explain: /\\b(explain|what does|what is|how does|walk me through|summari[sz]e|describe|meaning of|difference between)\\b/i,\n hard: /\\b(architect(?:ure)?|concurren(?:t|cy)|race condition|deadlock|security|vulnerab|auth(?:entication|orization)?|migration|performance|optimi[sz]e|distributed|memory leak|end[- ]to[- ]end|from scratch|entire|whole (?:codebase|repo|system)|complex|tricky|subtle|production)\\b/i,\n easy: /\\b(typo|quick|simple|small|tiny|trivial|one[- ]liner|rename|bump|format|lint|comment|docstring)\\b/i,\n stackTrace: /(^\\s+at .+\\(.+:\\d+:\\d+\\)$)|(Traceback \\(most recent call last\\))|(^\\s*File \".+\", line \\d+)/m,\n};\n\nconst LABEL: Record<PromptKind, Record<RoutingDifficulty, string>> = {\n question: { low: 'quick question', medium: 'question', high: 'hard question' },\n explain: { low: 'quick explanation', medium: 'explanation', high: 'deep explanation' },\n code: { low: 'small code change', medium: 'code change', high: 'hard code change' },\n debug: { low: 'quick fix', medium: 'debugging', high: 'hard debugging' },\n refactor: { low: 'small refactor', medium: 'refactor', high: 'hard refactor' },\n review: { low: 'quick review', medium: 'review', high: 'deep review' },\n plan: { low: 'quick plan', medium: 'planning', high: 'architecture planning' },\n bulk: { low: 'bulk edit', medium: 'bulk edit', high: 'large bulk edit' },\n};\n\n/** The Auto line's noun phrase for a kind at a difficulty (\"hard refactor\"). */\nexport function promptLabel(kind: PromptKind, difficulty: RoutingDifficulty): string {\n return LABEL[kind][difficulty];\n}\n\nexport function taskOf(kind: PromptKind): RoutingTask {\n if (kind === 'review') return 'review';\n if (kind === 'plan') return 'plan';\n if (kind === 'bulk') return 'bulk';\n return 'code';\n}\n\nfunction kindOf(text: string, hasCode: boolean, signals: string[]): PromptKind {\n // Order matters: the most specific intent wins. \"Review this fix\" is a\n // review, \"plan the refactor\" is a plan, a pasted trace is debugging.\n if (RE.bulk.test(text)) { signals.push('touches many files'); return 'bulk'; }\n if (RE.review.test(text)) { signals.push('asks for a review'); return 'review'; }\n if (RE.stackTrace.test(text)) { signals.push('stack trace'); return 'debug'; }\n if (RE.debug.test(text)) { signals.push('names a failure'); return 'debug'; }\n if (RE.refactor.test(text)) { signals.push('restructures code'); return 'refactor'; }\n if (RE.plan.test(text)) { signals.push('asks for a plan or design'); return 'plan'; }\n const verb = RE.code.test(text);\n if (RE.explain.test(text) && !verb) { signals.push('asks for an explanation'); return 'explain'; }\n if ((RE.question.test(text) || text.trim().endsWith('?')) && !verb && !hasCode) { signals.push('a question'); return 'question'; }\n if (verb || hasCode || RE.codeNoun.test(text)) { signals.push(hasCode ? 'includes code' : 'asks for a change'); return 'code'; }\n return 'code';\n}\n\nfunction sizeOf(tokens: number, fileRefs: number): PromptSize {\n if (tokens > 2_000 || fileRefs >= 4) return 'large';\n if (tokens < 120 && fileRefs <= 1) return 'small';\n return 'medium';\n}\n\n/**\n * Classify one message. `contextTokens` is what the chat already holds — a\n * small question deep into a 400k-token session is not a small turn.\n */\nexport function classifyPrompt(text: string, opts: { contextTokens?: number | null } = {}): PromptClassification {\n const trimmed = text.trim();\n const signals: string[] = [];\n const estTokens = estimateTokens(trimmed);\n const hasCode = /```/.test(trimmed) || /^( {4}|\\t)\\S/m.test(trimmed);\n const fileRefs = (trimmed.match(/(^|\\s)@[\\w./-]+/g) ?? []).length\n + (trimmed.match(/\\b[\\w-]+\\/[\\w./-]+\\.(?:ts|tsx|js|jsx|py|go|rs|java|rb|swift|kt|css|md|json|ya?ml)\\b/g) ?? []).length;\n if (fileRefs > 0) signals.push(fileRefs === 1 ? '1 file named' : `${fileRefs} files named`);\n\n const kind = kindOf(trimmed, hasCode, signals);\n const size = sizeOf(estTokens, fileRefs);\n if (size === 'large') signals.push(`≈${estTokens.toLocaleString('en-US')} tokens`);\n\n let difficulty: RoutingDifficulty = 'medium';\n const hard = RE.hard.test(trimmed);\n const easy = RE.easy.test(trimmed);\n if (hard) signals.push('hard subject');\n if (hard || size === 'large' || (kind === 'plan' && size !== 'small') || (kind === 'refactor' && fileRefs >= 2)) {\n difficulty = 'high';\n } else if (easy || (size === 'small' && (kind === 'question' || kind === 'explain'))) {\n difficulty = 'low';\n if (easy) signals.push('small by its own words');\n }\n // A long chat makes every turn heavier: the whole prefix is re-sent.\n const context = opts.contextTokens ?? 0;\n if (difficulty === 'low' && context > 150_000) {\n difficulty = 'medium';\n signals.push('deep into a long chat');\n }\n\n return { kind, task: taskOf(kind), difficulty, size, estTokens, label: LABEL[kind][difficulty], signals };\n}\n","/**\n * What the Auto seat learns from Mason — PURE aggregation of the outcome log\n * (thumbs, retries, switches, Compare picks, overrides, escalations) into a\n * small per-(kind, seat) and per-(kind, engine) table, and the bounded TILT\n * that table applies to the router's ranking.\n *\n * Rules that keep it honest:\n * - Evidence decays (half-life 14 days): last month's Codex outage should\n * not keep Codex out of reviews forever.\n * - Nothing tilts on fewer than MIN_SIGNALS decayed signals, and the score is\n * shrunk toward zero (score / (n + PRIOR)), so one thumbs-down never moves\n * a seat.\n * - The tilt is bounded (±MAX_TILT positions): learning re-orders close\n * calls, it never overrides eligibility — a spent or signed-out seat stays\n * out no matter how much Mason likes it, and a local-only repo stays local.\n * - Seat-level evidence wins over engine-level (two Codex accounts can\n * behave differently); engine-level fills in for a seat never used.\n *\n * BROWSER-SAFE.\n */\nimport type { LearnedStat, LearnedTable, OutcomeSignal, PromptKind, SeatOutcome } from './types.js';\n\nexport const LEARNING_HALF_LIFE_MS = 14 * 24 * 60 * 60 * 1000;\nexport const LEARNING_MIN_SIGNALS = 3;\n/** Pseudo-count the score is shrunk toward zero with. */\nconst PRIOR = 2;\n/** The most a learned preference can move a seat, in ranking positions. */\nexport const LEARNING_MAX_TILT = 1.5;\n\n/** Signed weight of each signal, for the seat it names. */\nexport const SIGNAL_WEIGHT: Readonly<Record<OutcomeSignal, number>> = Object.freeze({\n up: 1,\n down: -1,\n retry: -0.5,\n 'switch-away': -0.5,\n 'switch-to': 0.5,\n 'auto-followed': 0.1,\n 'auto-overridden': -0.5,\n 'compare-won': 1,\n 'compare-lost': -0.25,\n escalated: -0.5,\n 'draft-accepted': 1,\n});\n\nexport function seatKey(kind: PromptKind, seatId: string): string {\n return `${kind}|seat:${seatId}`;\n}\n\nexport function engineKey(kind: PromptKind, engine: string): string {\n return `${kind}|engine:${engine}`;\n}\n\nfunction add(table: LearnedTable, key: string, weight: number, decay: number): void {\n const stat: LearnedStat = table[key] ?? { score: 0, n: 0, up: 0, down: 0 };\n stat.score += weight * decay;\n stat.n += decay;\n if (weight > 0) stat.up += 1;\n if (weight < 0) stat.down += 1;\n table[key] = stat;\n}\n\n/** Fold outcomes into the table, newest evidence weighted most. Malformed rows are skipped. */\nexport function aggregateOutcomes(outcomes: readonly SeatOutcome[], nowMs: number): LearnedTable {\n const table: LearnedTable = {};\n for (const o of outcomes) {\n const weight = SIGNAL_WEIGHT[o.signal];\n const at = Date.parse(o.at);\n if (weight === undefined || !Number.isFinite(at) || typeof o.seatId !== 'string' || typeof o.kind !== 'string') continue;\n const age = Math.max(0, nowMs - at);\n const decay = Math.pow(0.5, age / LEARNING_HALF_LIFE_MS);\n add(table, seatKey(o.kind, o.seatId), weight, decay);\n if (typeof o.engine === 'string' && o.engine) add(table, engineKey(o.kind, o.engine), weight, decay);\n }\n // Round for a stable wire shape.\n for (const stat of Object.values(table)) {\n stat.score = Math.round(stat.score * 1000) / 1000;\n stat.n = Math.round(stat.n * 1000) / 1000;\n }\n return table;\n}\n\nexport interface LearnedTilt {\n /** Added to the seat's ranking position: NEGATIVE moves it up. 0 = no evidence. */\n tilt: number;\n /** \"you've rated Codex well for reviews (4 of 5 up)\" — null when no tilt. */\n phrase: string | null;\n}\n\nconst KIND_PLURAL: Record<PromptKind, string> = {\n question: 'questions',\n explain: 'explanations',\n code: 'code changes',\n debug: 'debugging',\n refactor: 'refactors',\n review: 'reviews',\n plan: 'planning',\n bulk: 'bulk edits',\n};\n\n/** The tilt learned evidence gives one seat for one kind of message. */\nexport function learnedTilt(table: LearnedTable | null | undefined, kind: PromptKind, seat: { seatId: string; engine: string; label: string }): LearnedTilt {\n if (!table) return { tilt: 0, phrase: null };\n const bySeat = table[seatKey(kind, seat.seatId)];\n const byEngine = table[engineKey(kind, seat.engine)];\n const stat = bySeat && bySeat.n >= LEARNING_MIN_SIGNALS ? bySeat : byEngine && byEngine.n >= LEARNING_MIN_SIGNALS ? byEngine : null;\n if (!stat) return { tilt: 0, phrase: null };\n const shrunk = stat.score / (stat.n + PRIOR);\n const tilt = -Math.max(-LEARNING_MAX_TILT, Math.min(LEARNING_MAX_TILT, shrunk * 2 * LEARNING_MAX_TILT));\n if (Math.abs(tilt) < 0.15) return { tilt: 0, phrase: null };\n const total = stat.up + stat.down;\n const tally = total > 0 ? ` (${stat.up} of ${total} signals positive)` : '';\n const phrase = tilt < 0\n ? `you've preferred ${seat.label} for ${KIND_PLURAL[kind]}${tally}`\n : `you've passed over ${seat.label} for ${KIND_PLURAL[kind]}${tally}`;\n return { tilt: Math.round(tilt * 1000) / 1000, phrase };\n}\n\n/**\n * The outcome rows one Compare pick produces: the winner `compare-won`, every\n * other answer `compare-lost`.\n */\nexport function compareOutcomes(\n winnerSessionId: string,\n entries: ReadonlyArray<{ sessionId: string; seatId: string; engine: string; model?: string }>,\n kind: PromptKind,\n at: string,\n): SeatOutcome[] {\n return entries.map((e) => ({\n at,\n seatId: e.seatId,\n engine: e.engine,\n kind,\n signal: e.sessionId === winnerSessionId ? 'compare-won' : 'compare-lost',\n sessionId: e.sessionId,\n ...(e.model ? { model: e.model } : {}),\n }));\n}\n","/**\n * routes/verse/multimodel/multimodel-flows.ts — the multi-model actions, as\n * sequences of ORDINARY session calls.\n *\n * Every flow here is built from the same four calls a hand-driven chat makes\n * — create a session, build the zero-spend handoff note, send a turn, open a\n * chat — so each spent turn passes the server's spend chokepoint, readiness\n * gate, local-only gate and mutation token exactly as a typed message does.\n * The calls are injected (`FlowApi`) so the flows are testable without a\n * server; `DEFAULT_FLOW_API` wires the real ones.\n *\n * routeMessage Auto sent this message to another seat: continue the\n * conversation there (handoff note + the message).\n * quickHandoff One click from the seat chip: note built, chat created on\n * the target, note PREFILLED in its composer, chat opened.\n * Nothing is spent until Mason presses Send.\n * startCompare The same prompt to 2–3 seats in parallel (compare.ts fanOut).\n * pickWinner \"Continue with this one\": record the pick, open that chat.\n * startReview A cross-family reviewer asked about the last answer.\n * escalate Cheap-first: a weak local draft moves to a frontier seat.\n */\nimport type { VerseCreateSessionRequest, VerseHandoffPreview, VerseHandoffPreviewRequest, VerseSession, VerseTurnResponse } from '../../../../core/verse/types.js';\nimport { comparePrompt, fanOut, reviewPrompt, type CompareTarget, type FanOutEntry } from '../../../../core/verse/multimodel/compare.js';\nimport { escalationPrompt, type DraftVerdict } from '../../../../core/verse/multimodel/escalation.js';\nimport { classifyPrompt } from '../../../../core/verse/multimodel/classify.js';\nimport { compareOutcomes } from '../../../../core/verse/multimodel/learning.js';\nimport type { PromptKind, SeatOutcomeRequest, ThreadLinkRequest } from '../../../../core/verse/multimodel/types.js';\nimport { saveDraft } from '../chat/composer-state.js';\nimport { createHandoffSession, fetchHandoffPreview, type HandoffSessionInput } from '../context/context-queries.js';\nimport { createVerseSession, sendVerseTurn } from '../verse-queries.js';\nimport { getVerseSessionHead } from '../verse-store.js';\nimport { getVerseTranscript } from '../verse-transcript.js';\nimport { openVerseSession } from '../verse-ui-store.js';\nimport { linkThread, recordOutcome } from './multimodel-queries.js';\n\nexport interface FlowApi {\n createSession(req: VerseCreateSessionRequest): Promise<VerseSession>;\n createHandoffSession(input: HandoffSessionInput): Promise<VerseSession>;\n fetchHandoffPreview(sessionId: string, req?: VerseHandoffPreviewRequest): Promise<VerseHandoffPreview>;\n sendTurn(sessionId: string, text: string): Promise<VerseTurnResponse | unknown>;\n link(req: ThreadLinkRequest): Promise<boolean>;\n outcome(req: SeatOutcomeRequest): Promise<boolean>;\n saveDraft(sessionId: string, text: string): void;\n open(sessionId: string): void;\n}\n\nexport const DEFAULT_FLOW_API: FlowApi = {\n createSession: createVerseSession,\n createHandoffSession,\n fetchHandoffPreview,\n sendTurn: sendVerseTurn,\n link: linkThread,\n outcome: recordOutcome,\n saveDraft,\n open: openVerseSession,\n};\n\nexport interface FlowTarget {\n seatId: string;\n model: string | null;\n label: string;\n engine: string;\n}\n\n/**\n * A new chat on the SAME pinned roots as `source`, with no handoff: the\n * source's own `projectPath` + `extraRoots` (never its workspace id — see\n * context-queries `createHandoffSession` for why pinned roots are the honest set).\n */\nexport function siblingRequest(source: VerseSession, target: FlowTarget, title?: string): VerseCreateSessionRequest {\n const req: VerseCreateSessionRequest = { projectPath: source.projectPath, seatId: target.seatId };\n const extras = (source.extraRoots ?? []).filter((r) => typeof r === 'string' && r.length > 0 && r !== source.projectPath);\n if (extras.length > 0) req.extraRoots = extras;\n if (target.model) req.model = target.model;\n const t = title?.trim();\n if (t) req.title = t.slice(0, 120);\n return req;\n}\n\n/** Continue `source` on `target`: a handoff mid-thread, a plain sibling chat when it has no turns yet. */\nasync function continuation(api: FlowApi, source: VerseSession, target: FlowTarget, title?: string): Promise<{ session: VerseSession; note: string | null }> {\n if (source.turnCount > 0) {\n const preview = await api.fetchHandoffPreview(source.id);\n const session = await api.createHandoffSession({ source, seatId: target.seatId, ...(target.model ? { model: target.model } : {}), ...(title ? { title } : {}) });\n return { session, note: preview.text };\n }\n return { session: await api.createSession(siblingRequest(source, target, title)), note: null };\n}\n\nexport async function routeMessage(\n api: FlowApi,\n input: { source: VerseSession; target: FlowTarget; text: string; kind: PromptKind; overridden?: { seatId: string } | null },\n): Promise<VerseSession> {\n const { session, note } = await continuation(api, input.source, input.target);\n await api.sendTurn(session.id, comparePrompt(input.text, note));\n void api.outcome({ seatId: input.target.seatId, kind: input.kind, signal: input.overridden ? 'switch-to' : 'auto-followed', sessionId: session.id });\n if (input.overridden) void api.outcome({ seatId: input.overridden.seatId, kind: input.kind, signal: 'auto-overridden' });\n api.open(session.id);\n return session;\n}\n\n/** A plan worth carrying verbatim: a \"Plan\" heading, or three or more numbered / checklist steps. */\nexport function looksLikePlan(text: string | null | undefined): boolean {\n if (!text) return false;\n if (/^#{1,4}\\s*(?:the\\s+)?plan\\b/im.test(text)) return true;\n return (text.match(/^\\s*(?:\\d+[.)]|[-*] \\[[ x]\\])\\s+\\S/gm) ?? []).length >= 3;\n}\n\nexport async function quickHandoff(\n api: FlowApi,\n input: { source: VerseSession; target: FlowTarget; lastAssistant?: string | null; kind: PromptKind },\n): Promise<VerseSession> {\n // The last answer rides along verbatim when it is a plan — the note's own\n // sections list files and asks, but not the plan the agent just wrote.\n const carryPlan = looksLikePlan(input.lastAssistant);\n const preview = await api.fetchHandoffPreview(input.source.id, carryPlan ? { includeLastAssistant: true } : {});\n const session = await api.createHandoffSession({ source: input.source, seatId: input.target.seatId, ...(input.target.model ? { model: input.target.model } : {}) });\n api.saveDraft(session.id, preview.text);\n void api.outcome({ seatId: input.source.seatId, kind: input.kind, signal: 'switch-away', sessionId: input.source.id });\n void api.outcome({ seatId: input.target.seatId, kind: input.kind, signal: 'switch-to', sessionId: session.id });\n api.open(session.id);\n return session;\n}\n\n/**\n * `quickHandoff` for a chat by id — what the seat chip calls. Reads the chat's\n * record and last answer from the store (this module is lazy, so the\n * transcript derivation stays off the composer's first-paint path).\n */\nexport async function quickHandoffFromChat(sessionId: string, target: FlowTarget, api: FlowApi = DEFAULT_FLOW_API): Promise<VerseSession | null> {\n const source = getVerseSessionHead(sessionId).session;\n // Nothing to hand off yet: the caller opens a plain new chat instead.\n if (!source || source.turnCount === 0) return null;\n const items = getVerseTranscript(sessionId).items;\n let lastUser = '';\n let lastAssistant: string | null = null;\n for (let i = items.length - 1; i >= 0; i -= 1) {\n const it = items[i]!;\n if (lastAssistant === null && it.kind === 'assistant') lastAssistant = it.text;\n if (it.kind === 'user') { lastUser = it.text; break; }\n }\n return quickHandoff(api, { source, target, lastAssistant, kind: classifyPrompt(lastUser).kind });\n}\n\nexport async function startCompare(\n api: FlowApi,\n input: { source: VerseSession; targets: readonly FlowTarget[]; text: string },\n): Promise<FanOutEntry[]> {\n // One note for every seat: built once, zero spend.\n const note = input.source.turnCount > 0 ? (await api.fetchHandoffPreview(input.source.id)).text : null;\n const title = (label: string) => `${input.source.title.slice(0, 80)} · ${label}`;\n return fanOut(input.targets as readonly CompareTarget[], comparePrompt(input.text, note), {\n createSession: (t) => (input.source.turnCount > 0\n ? api.createHandoffSession({ source: input.source, seatId: t.seatId, ...(t.model ? { model: t.model } : {}), title: title(t.label) })\n : api.createSession(siblingRequest(input.source, t, title(t.label)))),\n sendTurn: (id, text) => api.sendTurn(id, text),\n link: (child) => api.link({ parentSessionId: input.source.id, childSessionId: child, relation: 'compare' }),\n });\n}\n\nexport async function pickWinner(\n api: FlowApi,\n input: { winnerSessionId: string; entries: ReadonlyArray<{ sessionId: string; seatId: string; engine: string; model?: string }>; kind: PromptKind },\n): Promise<void> {\n const rows = compareOutcomes(input.winnerSessionId, input.entries, input.kind, new Date().toISOString());\n await Promise.all(rows.map((r) => api.outcome({ seatId: r.seatId, kind: r.kind, signal: r.signal, ...(r.sessionId ? { sessionId: r.sessionId } : {}), ...(r.model ? { model: r.model } : {}) })));\n api.open(input.winnerSessionId);\n}\n\nexport async function startReview(\n api: FlowApi,\n input: { source: VerseSession; reviewer: FlowTarget; question: string | null; answer: string; authorLabel: string },\n): Promise<VerseSession> {\n const session = await api.createSession(siblingRequest(input.source, input.reviewer, `Review · ${input.source.title.slice(0, 80)}`));\n void api.link({ parentSessionId: input.source.id, childSessionId: session.id, relation: 'review' });\n await api.sendTurn(session.id, reviewPrompt({ question: input.question, answer: input.answer, authorLabel: input.authorLabel }));\n return session;\n}\n\nexport async function escalate(\n api: FlowApi,\n input: { source: VerseSession; target: FlowTarget; question: string; draft: string; verdict: DraftVerdict; draftLabel: string; kind: PromptKind },\n): Promise<VerseSession> {\n const { session, note } = await continuation(api, input.source, input.target);\n void api.link({ parentSessionId: input.source.id, childSessionId: session.id, relation: 'escalate' });\n await api.sendTurn(session.id, comparePrompt(escalationPrompt(input.question, input.draft, input.verdict, input.draftLabel), note));\n void api.outcome({ seatId: input.source.seatId, kind: input.kind, signal: 'escalated', sessionId: input.source.id });\n api.open(session.id);\n return session;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{C as e,M as t,V as n,a as r,i}from"./global-BJ_kVFpD.js";import{r as a}from"./VerseShared-CH8mV5ew.js";var o=`/api/verse/multimodel`,s=`${o}/context`,c=`${o}/outcome`,l=`${o}/link`,u=`${o}/meter`,d=`${o}/local/warm`,f=`${o}/label`,p=`verse-multimodel-context:`,m=`verse-multimodel-meter:`;function h(e){let t=`sessionId`in e?`?sessionId=${encodeURIComponent(e.sessionId)}`:e.projectPath?`?projectPath=${encodeURIComponent(e.projectPath)}`:``;return{key:`${p}${t}`,fetch:e=>i(`${s}${t}`,e)}}function g(e){return{key:`${m}${e}`,fetch:t=>i(`${u}?sessionId=${encodeURIComponent(e)}`,t)}}function _(){let t=e();if(!t)throw new a;return t}async function v(e){let n=await r(f,e,_());return t(),n}async function y(e){try{return await r(c,e,_()),t(),!0}catch{return!1}}async function b(e){try{return await r(l,e,_()),t(),n(`${m}${e.parentSessionId}`),!0}catch{return!1}}async function x(e){let n=await r(d,{seatId:e},_());return t(),n}function S(e){n(`${m}${e}`)}export{h as a,b as i,S as n,y as o,v as r,x as s,g as t};
|
|
2
|
-
//# sourceMappingURL=multimodel-queries-DxIT9AZY.js.map
|