@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,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/fleet/FleetStatusLink.tsx","../../../../../../src/web-ui/routes/verse/command/KpiRow.tsx","../../../../../../src/web-ui/routes/verse/command/NeedsYouCard.tsx","../../../../../../src/web-ui/routes/verse/command/seat-strip-model.ts","../../../../../../src/web-ui/routes/verse/command/SeatStrip.tsx","../../../../../../src/web-ui/routes/verse/cloud/CloudLaunchDialog.tsx","../../../../../../src/web-ui/routes/verse/cloud/CloudCard.tsx","../../../../../../src/web-ui/routes/verse/command/VerdictLine.tsx","../../../../../../src/web-ui/routes/verse/sections/CommandSection.tsx"],"sourcesContent":["/**\n * routes/verse/fleet/FleetStatusLink.tsx — Command's one line about the fleet\n * (3.15). The fleet is operated in ONE place, the Fleet tab; Command states\n * where it stands and links there, instead of repeating its controls, its\n * ladder or its setup steps.\n *\n * ● Running · 3 agents working · stage shadow [Open Fleet ⌘2]\n */\nimport type { FleetControlStateV1 } from '../../../../core/fleet/fleet-control-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { setVerseSection } from '../verse-ui-store.js';\nimport { detectKeyPlatform, formatChord } from '../shell/command-catalog.js';\nimport { commandChord } from '../shell/command-keys.js';\nimport { fleetControlQuery } from './fleet-control-queries.js';\nimport styles from './fleet-control.module.css';\n\nconst TONE: Record<FleetControlStateV1['state'], string> = {\n running: 'running',\n idle: 'ok',\n paused: 'warning',\n stopped: 'danger',\n blocked: 'danger',\n off: 'muted',\n};\n\nexport function FleetStatusLink() {\n const read = useQuery(fleetControlQuery, { freshMs: 10_000 });\n const state = read.data?.value ?? null;\n // An older server without the control route: nothing to link from here.\n if (!state) return null;\n const chord = commandChord('surface.fleet');\n const key = chord ? formatChord(chord, detectKeyPlatform()) : null;\n const anchor = state.blocker ? 'fleet-control' : state.grant.state === 'active' ? 'autonomy' : 'fleet-control';\n return (\n <div className={styles.statusLink} data-testid=\"fleet-status-link\" data-state={state.state}>\n <p className={styles.statusLinkLine}>\n <span className={styles.dot} data-tone={TONE[state.state]} aria-hidden=\"true\" />\n <span>{state.headline}</span>\n </p>\n <Button size=\"sm\" variant={state.blocker ? 'primary' : 'subtle'} onClick={() => setVerseSection('fleet', anchor)} aria-keyshortcuts={key ?? undefined}>\n {state.blocker && state.blocker.action.kind !== 'wait' ? `${state.blocker.action.label} in Fleet` : 'Open Fleet'}\n {key ? <kbd className={styles.kbd}>{key}</kbd> : null}\n </Button>\n </div>\n );\n}\n","/**\n * routes/verse/command/KpiRow.tsx — five StatTiles (SPEC-310B §6: merged in\n * 7 days, post-merge green %, cycle time, spend vs cap, lift), each with a\n * \"vs prior 7d\" delta when both weeks are fully known. Five across at 1440,\n * two per row at 375.\n *\n * Each sparkline also SPEAKS its trend (first → latest, range) in the unit\n * the tile prints, so the glance is not image-only for a screen reader.\n * Cycle time and lift carry no sparkline on purpose: their sources hold one\n * current figure, not a daily series, and none is invented for the glance.\n */\nimport { StatTile } from '../../../components/charts/StatTile.js';\nimport type { Kpi } from './command-model.js';\nimport styles from './command.module.css';\n\nconst DESCRIBE_TREND: Partial<Record<Kpi['id'], (v: number) => string>> = {\n merged: (v) => `${Math.round(v)} merged`,\n green: (v) => `${Math.round(v)}%`,\n spend: (v) => `$${v.toFixed(2)}`,\n};\n\nexport function KpiRow({ kpis }: { kpis: Kpi[] }) {\n return (\n <div className={styles.kpis} role=\"group\" aria-label=\"Key numbers\">\n {kpis.map((k) => (\n <StatTile\n key={k.id}\n label={k.label}\n value={k.value}\n delta={k.delta}\n trend={k.trend}\n trendLabel={k.trendLabel}\n describeTrend={DESCRIBE_TREND[k.id]}\n caption={k.caption}\n />\n ))}\n </div>\n );\n}\n","/**\n * routes/verse/command/NeedsYouCard.tsx — Command's \"Needs you\" card (span 5\n * at 1440, FIRST at 375; SPEC-310C §5). The five most urgent items from the\n * one inbox (owner-lane PRs, class-C asks, veto windows, holds, grant\n * renewal, reconnects — R1 producers via C1's activity route), each with its\n * own actions. The full, keyboard-triaged list is the ⌘J drawer (C1); this\n * card is the glance and the one-click path.\n *\n * Honesty: when any producer did not answer, the card never says \"All\n * clear\" — it names the silent sources instead (\"fleet not answering\").\n * Every approve / reject / veto confirms first (NeedsYouAction contract),\n * then asks for the token; items render their text as plain text only.\n *\n * Rows read like the drawer's (shell/needs-you-model needsYouRowView, one\n * copy): a \"Patch · Claude run\" label over a title that ends on a whole word\n * (two lines at most, the server's text as its tooltip), \"2 files · +384 −0 ·\n * Test-and-repair loop\" for a sandboxed run, the repo's short name, the seat\n * by its label (\"Claude Max\", the id on hover — never \"claude-a\"), and \"38\n * days ago\" with the exact local time on hover.\n */\nimport { Fragment, type ReactElement } from 'react';\nimport type { NeedsYouAction, NeedsYouItem, VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconExternalLink } from '../../../components/primitives/icons.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { ENGINE_LABEL, isVerseEngine } from '../verse-model.js';\nimport { rankNeedsYou, silentSources } from './command-model.js';\nimport { anchorId, goToSection, openChat, openNeedsYou } from './nav.js';\nimport { postNeedsYouAction } from './surface-data.js';\nimport type { ActivityState } from '../shell/useActivity.js';\nimport { needsYouRowView, readableItemTitle, type NeedsYouRowView } from '../shell/needs-you-model.js';\nimport { NeedsYouRunFacts } from '../shell/NeedsYouList.js';\nimport { requestOpenTerminal } from '../shell/open-terminal-request.js';\nimport { Card, CardNote } from './Surface.js';\nimport type { ConfirmSpec, SurfaceActions } from './actions.js';\nimport styles from './command.module.css';\n\nexport const NEEDS_YOU_CARD_LIMIT = 5;\n\n/** Relative ages (\"38 days ago\") only need to stay true to the minute. */\nconst AGE_TICK_MS = 30_000;\n\nconst SEVERITY_WORD = { high: 'Urgent', warn: 'Soon', info: 'FYI' } as const;\nconst SOURCE_WORD: Record<string, string> = {\n approvals: 'approvals',\n authority: 'authority',\n fleet: 'fleet',\n leader: 'Leader',\n chats: 'chats',\n accounts: 'accounts',\n};\n\n/** Generic confirmation for the kinds the drawer always confirms (approve / reject / veto). */\nexport function confirmFor(item: NeedsYouItem, action: NeedsYouAction): ConfirmSpec | undefined {\n if (action.confirm) return { ...action.confirm, destructive: action.destructive };\n if (action.kind === 'approve' || action.kind === 'reject' || action.kind === 'veto') {\n const verb = action.kind === 'approve' ? 'Approve' : action.kind === 'reject' ? 'Reject' : 'Veto';\n return { title: `${verb}?`, body: readableItemTitle(item).text, confirmLabel: action.label, destructive: action.destructive };\n }\n return undefined;\n}\n\nfunction targetLink(item: NeedsYouItem): { label: string; onOpen?: () => void; href?: string } | null {\n const t = item.target;\n switch (t.kind) {\n case 'url':\n return /^https:\\/\\//.test(t.url) ? { label: 'Open', href: t.url } : null;\n case 'section':\n return { label: 'Show', onOpen: () => goToSection(t.section, t.anchor) };\n case 'session':\n return { label: 'Open chat', onOpen: () => openChat(t.sessionId) };\n case 'terminal':\n return { label: 'Open terminal', onOpen: () => requestOpenTerminal({ tabId: t.tabId, blockId: null, sessionId: t.sessionId }) };\n case 'approval':\n case 'seat':\n return { label: 'Open', onOpen: () => openNeedsYou(item.id) };\n default:\n return null;\n }\n}\n\n/** Seat id → display label (command-model `seatNames`). */\nexport type SeatNames = ReadonlyMap<string, string>;\n\n/**\n * The row's kind label with its engine named the way every other surface\n * names it (verse-model ENGINE_LABEL): the shared title reader\n * (approvals-model `readableTitle`) keeps the wire's lower case for a\n * PARTIAL run, so \"Patch · Claude run\" sat beside \"Patch · Partial claude\n * run\". Only the trailing \"<engine> run\" eyebrow is touched.\n */\nexport function cardKindLabel(label: string | null): string | null {\n if (label === null) return null;\n return label.replace(/(^|· )(Partial )?([a-z][\\w-]*) run$/, (_m, lead: string, partial: string | undefined, engine: string) => {\n const name = isVerseEngine(engine) ? ENGINE_LABEL[engine] : `${engine.charAt(0).toUpperCase()}${engine.slice(1)}`;\n return `${lead}${partial ?? ''}${name} run`;\n });\n}\n\n/** \"binshield · #81 · Claude Max · 38 days ago\" — the full repo, the seat id and the exact time ride in tooltips. */\nfunction Meta({ item, view, seatNames }: { item: NeedsYouItem; view: NeedsYouRowView; seatNames: SeatNames | undefined }) {\n const s = item.subject;\n const parts: ReactElement[] = [];\n if (view.repo) parts.push(<span key=\"repo\" className={styles.needsRepo} title={view.repoFull}>{view.repo}</span>);\n if (s.pr) parts.push(<span key=\"pr\">#{s.pr}</span>);\n if (s.seatId) {\n // Unknown to both the roster and the budget route: the id is all there is.\n const name = seatNames?.get(s.seatId) ?? s.seatId;\n parts.push(<span key=\"seat\" title={name === s.seatId ? undefined : s.seatId}>{name}</span>);\n }\n parts.push(<span key=\"age\" title={view.ageStamp}>{view.age}</span>);\n return (\n <span className={styles.needsMeta}>\n {parts.map((part, i) => (\n <Fragment key={part.key}>\n {i > 0 ? <span aria-hidden=\"true\">·</span> : null}\n {part}\n </Fragment>\n ))}\n </span>\n );\n}\n\nexport function NeedsYouRow({ item, actions, now, seatNames }: { item: NeedsYouItem; actions: SurfaceActions; now: number; seatNames?: SeatNames }) {\n const link = targetLink(item);\n const runnable = item.actions.filter((a) => a.request !== null);\n const view = needsYouRowView(item, now);\n const kind = cardKindLabel(view.kindLabel);\n return (\n <li className={styles.needsRow} data-severity={item.severity} id={anchorId(item.id)}>\n <span className={styles.sevDot} data-severity={item.severity} aria-hidden=\"true\" />\n <div className={styles.needsText}>\n {kind ? <span className={styles.needsKind}>{kind}</span> : null}\n {/* Two lines at most, ending on a whole word; the server's title is the tooltip. */}\n <span className={styles.needsTitle} title={view.fullTitle}>\n <span className=\"visually-hidden\">{SEVERITY_WORD[item.severity]}: </span>\n {view.title}\n </span>\n {view.run ? <NeedsYouRunFacts run={view.run} /> : null}\n {view.detail ? <span className={styles.needsDetail}>{view.detail}</span> : null}\n <Meta item={item} view={view} seatNames={seatNames} />\n </div>\n <div className={styles.needsActions}>\n {runnable.map((action) => (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.destructive ? 'danger' : action.kind === 'approve' ? 'primary' : 'subtle'}\n disabled={actions.busy || actions.readOnly}\n onClick={() =>\n actions.act(() => postNeedsYouAction(action.request!.path, action.request!.body), `${action.label}: ${view.title}`, {\n confirm: confirmFor(item, action),\n })\n }\n >\n {action.label}\n </Button>\n ))}\n {link ? (\n link.href ? (\n <a className={styles.linkButton} href={link.href} target=\"_blank\" rel=\"noopener noreferrer\">\n {link.label}\n <IconExternalLink width={12} height={12} aria-hidden=\"true\" />\n <span className=\"visually-hidden\"> (opens in a new tab)</span>\n </a>\n ) : (\n <button type=\"button\" className={styles.linkButton} onClick={link.onOpen}>\n {link.label}\n </button>\n )\n ) : null}\n </div>\n </li>\n );\n}\n\n/** C1's activity store in the surfaces' OptionalRead words. */\nexport function activityRead(state: ActivityState): { activity: VerseActivityResponse | null; loading: boolean; reason: string | null; stale: boolean } {\n if (state.status === 'unavailable') {\n // `unavailable` is also where a FIRST poll that failed lands: only a\n // failure-free one (the route's 404) means \"not in this build\".\n const reason = state.error\n ? `Needs-you inbox unavailable. ${state.error}`\n : 'The Needs-you inbox is not in this build yet, so this card has no source.';\n return { activity: null, loading: false, reason, stale: false };\n }\n if (!state.data) return { activity: null, loading: true, reason: null, stale: false };\n return { activity: state.data, loading: false, reason: null, stale: state.status === 'stale' };\n}\n\nexport function NeedsYouCard({\n state,\n actions,\n fleetLine,\n seatNames,\n}: {\n state: ActivityState;\n actions: SurfaceActions;\n /** One line under \"All clear\"; null when the surface already says it (Command's \"Autonomy is off\" banner). */\n fleetLine: string | null;\n /** Labels for the seats items name; an id neither source knows is shown as sent. */\n seatNames?: SeatNames;\n}) {\n const { activity, loading, reason, stale } = activityRead(state);\n const now = useNow(AGE_TICK_MS);\n const items = activity ? rankNeedsYou(activity.needsYou) : [];\n const silent = silentSources(activity);\n const shown = items.slice(0, NEEDS_YOU_CARD_LIMIT);\n const count = activity ? activity.needsYou.length : null;\n return (\n <Card\n title={count === null ? 'Needs you' : `Needs you (${count})`}\n caption={count === null ? undefined : count === 0 ? undefined : 'Most urgent first'}\n tone={count ? 'attention' : undefined}\n actions={\n <button type=\"button\" className={styles.linkButton} onClick={() => openNeedsYou()} aria-keyshortcuts=\"Meta+J\">\n Open all <kbd className={styles.kbd}>⌘J</kbd>\n </button>\n }\n >\n {loading ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the inbox…</p>\n ) : !activity ? (\n <CardNote tone=\"unknown\">{reason ?? \"The inbox didn't answer.\"} This is not an all-clear.</CardNote>\n ) : shown.length === 0 ? (\n silent.length || stale ? (\n <CardNote tone=\"unknown\">\n {silent.length\n ? `Nothing to show, but ${silent.map((s) => SOURCE_WORD[s] ?? s).join(', ')} ${silent.length === 1 ? 'is' : 'are'} not answering — this is not an all-clear.`\n : 'Nothing to show, but the last refresh failed — this is not an all-clear.'}\n </CardNote>\n ) : (\n <div className={styles.allClear} role=\"status\">\n <span className={styles.allClearTitle}>All clear</span>\n {fleetLine ? <span className={styles.allClearBody}>{fleetLine}</span> : null}\n </div>\n )\n ) : (\n <>\n <ul className={styles.needsList}>\n {shown.map((item) => (\n <NeedsYouRow key={item.id} item={item} actions={actions} now={now} seatNames={seatNames} />\n ))}\n </ul>\n {items.length > shown.length ? (\n <button type=\"button\" className={styles.moreLink} onClick={() => openNeedsYou()}>\n {items.length - shown.length} more in the drawer\n </button>\n ) : null}\n {silent.length ? (\n <p className={styles.muted}>{silent.map((s) => SOURCE_WORD[s] ?? s).join(', ')} not answering — the list may be incomplete.</p>\n ) : null}\n {stale ? <p className={styles.muted}>The last refresh failed; showing the previous list.</p> : null}\n </>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/command/seat-strip-model.ts — the one compact row of seats on\n * Command (audit 14 + 20). Pure: no React, no I/O.\n *\n * WHY THIS IS NOT BUILT FROM THE BURN-DOWNS. Command used to draw one tall\n * burn-down per seat from the budget route alone, and its free-seat card said\n * \"Takes autonomous work\" whatever the local runtime's readiness was — while\n * the rail said \"readiness not reported\" about the same seat. Every account\n * fact here now comes from the SAME projection the rail, the Resources drawer\n * and Apps & Accounts read (usage/capacity-strip-model.ts: `buildCapacityRows`,\n * `accountStatus`, `bindingLeftPercent`, `orderAccountRows`), so Command can\n * no longer describe a seat differently from the rail beside it.\n *\n * The one thing the budget route adds is autonomy eligibility (the router's\n * own verdict). When it says a seat takes autonomous work but readiness says\n * the seat cannot run (signed out, spent, offline, never reported), the two\n * sources disagree — and the strip says \"Status unknown\" and names both\n * claims, rather than picking the rosier one.\n *\n * The full burn-down charts live on Usage (SeatBurnPanel).\n */\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport { describeResetAt } from '../../../../core/verse/seat-readiness.js';\nimport { STATUS_WORDS, type BudgetSeatRow as BudgetRow, type BudgetSeatStatus } from '../budget/budget-model.js';\nimport { usedPercentText } from '../percent-text.js';\nimport { bindingLeftPercent } from '../usage/binding-left.js';\nimport {\n accountStatus,\n capacityHeadline,\n orderAccountRows,\n readBudgetRows,\n type AccountStatus,\n type CapacityRow,\n} from '../usage/capacity-strip-model.js';\nimport { resetWords } from './command-model.js';\n\n/** How the item's meter and value are toned. A word always rides with it. */\nexport type SeatLevel = 'ok' | 'low' | 'out' | 'unknown';\n\n/**\n * eligible / held / off / no-reading the budget route's own verdict\n * conflict the budget says eligible, readiness says the seat cannot run\n * none the budget route has not answered\n */\nexport type SeatAutonomyKind = 'eligible' | 'held' | 'off' | 'no-reading' | 'conflict' | 'none';\n\nexport interface SeatAutonomy {\n kind: SeatAutonomyKind;\n /** Short chip text: \"Eligible\", \"Held back\", \"Off\", \"No reading\", \"Status unknown\", \"Not reported\". */\n word: string;\n /** The router's reason, or — for a conflict — both sources' claims. Null when there is nothing to add. */\n why: string | null;\n}\n\nexport interface SeatStripItem {\n key: string;\n engine: 'claude' | 'codex' | 'grok' | 'local' | 'devin';\n name: string;\n /** 0–100 left in the binding window; null when there is no reading (never a substituted zero). */\n leftPercent: number | null;\n level: SeatLevel;\n /** The value beside the name: \"72% left\", \"Spent\", \"Signed out\", \"Free\", \"—\". */\n value: string;\n /** \"resets Fri 11:46 PM\", the provider's own words, or the status phrase when no reset applies. */\n note: string | null;\n /** The rail's status label for the same seat (\"Connected\", \"Checking…\", \"Ready\", \"Not checked\"). */\n status: string;\n autonomy: SeatAutonomy;\n /**\n * The share of the binding window kept for the operator (0–100), drawn as a\n * tick on the meter: autonomy stops where the remaining share meets it.\n * Null when there is no reserve or autonomy is off for the seat.\n */\n reservePercent: number | null;\n /** \"Reserved for you 40%\" / \"Autonomy off — all yours\"; null when the budget has no policy row. */\n reserveLabel: string | null;\n /** The item's accessible name (the button also says it opens Resources). */\n spoken: string;\n}\n\nexport interface SeatStrip {\n items: SeatStripItem[];\n /** \"2 of 3 accounts usable · local models ready\" — the strip's caption. */\n headline: string;\n}\n\nconst LEVEL_OF_STATUS: Readonly<Record<AccountStatus['kind'], SeatLevel>> = {\n usable: 'ok',\n low: 'low',\n spent: 'out',\n 'signed-out': 'out',\n unavailable: 'out',\n checking: 'unknown',\n 'not-checked': 'unknown',\n};\n\n/** Readiness kinds that do not contradict \"autonomy may use it now\". */\nconst RUNNABLE: ReadonlySet<AccountStatus['kind']> = new Set(['usable', 'low', 'checking']);\n\n\nfunction sentence(text: string): string {\n const t = text.trim();\n return /[.!?]$/.test(t) ? t : `${t}.`;\n}\n\n/** Eligibility for one row: its own budget row, or — for the folded local row — every free seat's. */\nfunction budgetFor(row: CapacityRow, budget: ReadonlyMap<string, BudgetRow>): { status: BudgetSeatStatus; why: string } | null {\n const own = budget.get(row.seatId);\n if (own) return { status: own.status, why: own.why };\n if (row.kind !== 'local') return null;\n const locals = [...budget.values()].filter((b) => b.free || b.engine === 'local');\n if (locals.length === 0) return null;\n // One runtime behind every local tag: any tag autonomy may use means the runtime is wanted.\n const pick = (s: BudgetSeatStatus) => locals.find((b) => b.status === s);\n const chosen = pick('eligible') ?? pick('held') ?? pick('unknown') ?? locals[0]!;\n return { status: chosen.status, why: chosen.why };\n}\n\nconst AUTONOMY_KIND: Readonly<Record<BudgetSeatStatus, SeatAutonomyKind>> = {\n eligible: 'eligible',\n held: 'held',\n off: 'off',\n unknown: 'no-reading',\n};\n\n/**\n * The autonomy chip. Exported for tests: the conflict rule is the point of\n * this module (audit 20).\n */\nexport function seatAutonomy(budget: { status: BudgetSeatStatus; why: string } | null, status: AccountStatus, budgetRead: boolean): SeatAutonomy {\n if (!budget) return { kind: 'none', word: 'Not reported', why: budgetRead ? 'The budget route does not list this seat.' : null };\n if (budget.status === 'eligible' && !RUNNABLE.has(status.kind)) {\n const readiness = `${status.label}${status.detail ? ` — ${status.detail}` : ''}`;\n return {\n kind: 'conflict',\n word: 'Status unknown',\n why: `The router lists it as eligible for autonomy, but its readiness check says: ${readiness}.`,\n };\n }\n return { kind: AUTONOMY_KIND[budget.status], word: STATUS_WORDS[budget.status], why: budget.why ? sentence(budget.why) : null };\n}\n\n/** The reset phrase for a row: the binding window's own wording, always led by \"resets\". */\nfunction resetOf(row: CapacityRow, status: AccountStatus): string | null {\n // A spent seat's status already names the reset that brings it back (the LAST spent window's).\n if (status.kind === 'spent') return status.detail;\n const binding = row.windows.find((w) => w.binding) ?? null;\n return binding?.resetText ? resetWords(binding.resetText) : null;\n}\n\nfunction itemFor(row: CapacityRow, budget: ReadonlyMap<string, BudgetRow>, opts: { healthRead: boolean; budgetRead: boolean; now: number }): SeatStripItem {\n const status = accountStatus(row, { healthRead: opts.healthRead, now: opts.now });\n const autonomy = seatAutonomy(budgetFor(row, budget), status, opts.budgetRead);\n const level = LEVEL_OF_STATUS[status.kind] ?? 'unknown';\n const statusPhrase = `${status.label}${status.detail ? ` · ${status.detail}` : ''}`;\n let left: number | null;\n let value: string;\n let note: string | null;\n if (row.kind === 'local') {\n // No quota to run out of: the value is what the runtime is, never a percent.\n left = null;\n value = status.kind === 'usable' ? 'Free' : status.kind === 'unavailable' ? 'Offline' : '—';\n note = status.kind === 'usable' ? 'Runs on this machine' : status.kind === 'checking' ? 'Checking…' : status.detail ?? status.label;\n } else {\n left = level === 'out' ? 0 : bindingLeftPercent(row);\n value = level === 'out' ? status.label : left === null ? '—' : `${usedPercentText(left)} left`;\n note = resetOf(row, status) ?? (left === null ? statusPhrase : null);\n }\n const name = row.kind === 'local' && row.localCount > 1 ? `Local models (${row.localCount})` : row.label;\n const spoken = [\n `${name}: ${value}`,\n note && note !== statusPhrase ? note : null,\n statusPhrase,\n `Autonomy: ${autonomy.word}`,\n ].filter((p): p is string => p !== null).join('. ');\n const kept = row.reserve?.percent ?? null;\n const reservePercent = kept !== null && kept > 0 ? kept : null;\n return {\n key: row.seatId,\n engine: row.engine,\n name,\n leftPercent: left,\n level,\n value,\n note,\n status: status.label,\n autonomy,\n reservePercent,\n reserveLabel: row.reserve?.label ?? null,\n spoken,\n };\n}\n\n/**\n * Before the seat roster has loaded (or on a server without one), the budget\n * route alone: name, the binding window's remaining share and its reset — and\n * readiness said to be unknown, never assumed.\n */\nfunction budgetOnlyItems(view: BudgetView, now: number): SeatStripItem[] {\n const rows = readBudgetRows(view);\n const out: SeatStripItem[] = [];\n for (const b of rows.values()) {\n const h = b.headroom;\n const used = h?.bindingWindow === 'weekly' ? h.weeklyUsedPercent : h?.bindingWindow === 'session' ? h.sessionUsedPercent : null;\n const left = b.free || used === null || used === undefined ? null : Math.max(0, Math.min(100, 100 - used));\n const when = describeResetAt(h?.resetAt ?? null, now);\n const autonomy: SeatAutonomy = { kind: AUTONOMY_KIND[b.status], word: STATUS_WORDS[b.status], why: b.why ? sentence(b.why) : null };\n const value = b.free ? '—' : left === null ? '—' : `${usedPercentText(left)} left`;\n const note = b.free ? 'Readiness not reported' : when ? `resets ${when}` : null;\n out.push({\n key: b.seatId,\n engine: b.engine,\n name: b.label,\n leftPercent: left,\n level: left === null ? 'unknown' : left <= 0 ? 'out' : 'ok',\n value,\n note,\n status: 'Readiness not reported',\n autonomy,\n reservePercent: null,\n reserveLabel: null,\n spoken: [`${b.label}: ${value}`, note, 'Readiness not reported', `Autonomy: ${autonomy.word}`].filter(Boolean).join('. '),\n });\n }\n return out.sort((a, b) => Number(a.engine === 'local') - Number(b.engine === 'local') || a.name.localeCompare(b.name));\n}\n\nexport interface SeatStripInputs {\n /** Capacity rows (`buildCapacityRows`) — the rail's own projection of the roster. */\n rows: readonly CapacityRow[];\n /** The budget view, for autonomy eligibility; null before it answers. */\n budget: BudgetView | null;\n /** False until the health sweep has answered once. */\n healthRead: boolean;\n now: number;\n}\n\nexport function seatStrip({ rows, budget, healthRead, now }: SeatStripInputs): SeatStrip {\n if (rows.length === 0) {\n const items = budget ? budgetOnlyItems(budget, now) : [];\n return { items, headline: items.length === 0 ? 'No seats reported yet' : 'Seat roster not loaded — readiness unknown' };\n }\n const budgetRows = readBudgetRows(budget);\n const ordered = orderAccountRows(rows, { healthRead, now });\n return {\n items: ordered.map((row) => itemFor(row, budgetRows, { healthRead, budgetRead: budget !== null, now })),\n headline: capacityHeadline(rows),\n };\n}\n\n/**\n * How many equal columns the strip uses, so every row is full or nearly so\n * (audit 15: no blank half-rows): all seats on one line when they fit, else\n * balanced rows — four seats are 4 across when wide and 2 x 2 at medium,\n * never 3 + a lonely 1. Compact is one per line.\n */\nexport function stripColumns(viewport: 'compact' | 'medium' | 'wide', count: number): number {\n const n = Math.max(1, Math.floor(count));\n if (viewport === 'compact') return 1;\n const perRow = viewport === 'medium' ? 3 : 5;\n if (n <= perRow) return viewport === 'medium' && n === 4 ? 2 : n;\n const rows = Math.ceil(n / perRow);\n return Math.ceil(n / rows);\n}\n","/**\n * routes/verse/command/SeatStrip.tsx — every seat's headroom in ONE compact\n * row on Command (audit 14): provider mark + name, what is left of the\n * binding window, the reset, and whether autonomy may use it. One glance\n * answers \"will it run out?\"; clicking a seat (or the head's Resources link,\n * or ⌘.) opens the Resources drawer for the detail. The burn-down charts that\n * used to fill this row live on Usage now (SeatBurnPanel).\n *\n * Its words come from seat-strip-model.ts — the same capacity projection the\n * rail's resource bar reads — so Command and the rail cannot describe one\n * seat two ways (audit 20).\n *\n * READS NOTHING NEW. The roster and the health sweep are read from the cache\n * the rail keeps warm on every surface (useCapacityData in ResourcesBar and\n * the capacity ring), never fetched from here: Command's own reads are pinned\n * by shell/surface-prefetch.test.ts, and a bootstrap read costs the server\n * ~384 ms (useSeatsRefresh.ts). The budget view is Command's own poll.\n */\nimport { useCallback, useMemo, useSyncExternalStore, type CSSProperties } from 'react';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport type { VerseHealthResponse } from '../../../../core/verse/health-types.js';\nimport { ProviderLogo } from '../../../components/primitives/ProviderLogo.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { getQuerySnapshot, subscribeQuery } from '../../../data/cache.js';\nimport type { VerseSeat } from '../../../data/api-types.js';\nimport { VERSE_HEALTH_KEY } from '../health/health-queries.js';\nimport { openResources } from '../resources/resources-store.js';\nimport { buildCapacityRows } from '../usage/capacity-strip-model.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { seatStrip, stripColumns, type SeatStripItem } from './seat-strip-model.js';\nimport { Card, CardNote } from './Surface.js';\nimport command from './command.module.css';\nimport styles from './seat-strip.module.css';\n\n/** The health sweep as the rail last read it; null until it has answered once. */\nfunction useCachedHealth(): VerseHealthResponse | null {\n const snapshot = useSyncExternalStore(\n useCallback((listener: () => void) => subscribeQuery(VERSE_HEALTH_KEY, listener), []),\n () => getQuerySnapshot<VerseHealthResponse>(VERSE_HEALTH_KEY),\n () => getQuerySnapshot<VerseHealthResponse>(VERSE_HEALTH_KEY),\n );\n return snapshot.data ?? null;\n}\n\nfunction SeatTip({ item }: { item: SeatStripItem }) {\n return (\n <div className={styles.tip}>\n <div className={styles.tipHead}>\n <ProviderLogo engine={item.engine} size={14} />\n <strong>{item.name}</strong>\n </div>\n <div>{item.status}{item.note && item.note !== item.status ? ` · ${item.note}` : ''}</div>\n {item.reserveLabel ? <div className={styles.tipLine}>{item.reserveLabel}</div> : null}\n <div className={styles.tipLine}>\n Autonomy: {item.autonomy.word}{item.autonomy.why ? ` — ${item.autonomy.why}` : ''}\n </div>\n <div className={styles.tipHint}>Click for Resources · ⌘.</div>\n </div>\n );\n}\n\nfunction SeatItem({ item }: { item: SeatStripItem }) {\n // Local seats have no quota: a full, quiet track when ready, an empty one otherwise.\n const fill = item.leftPercent ?? (item.engine === 'local' && item.value === 'Free' ? 100 : 0);\n const meterStyle = { '--fill': `${fill}%`, ...(item.reservePercent !== null ? { '--reserve': `${item.reservePercent}%` } : {}) } as CSSProperties;\n return (\n <Tooltip content={<SeatTip item={item} />} placement=\"bottom\">\n <button\n type=\"button\"\n className={styles.item}\n data-level={item.level}\n data-free={item.engine === 'local' || undefined}\n aria-label={`${item.spoken}. Open Resources`}\n aria-keyshortcuts=\"Meta+.\"\n onClick={() => openResources()}\n >\n <span className={styles.head}>\n <ProviderLogo engine={item.engine} size={14} className={styles.logo} />\n <span className={styles.name}>{item.name}</span>\n <span className={styles.value}>{item.value}</span>\n </span>\n <span className={styles.meter} style={meterStyle} aria-hidden=\"true\">\n {/* The reserve as a ZONE (empty → the reserve line), then the fill,\n then the tick — so \"how close to the reserve\" reads as distance\n to a region, as on the Usage burn-downs' reserve band. */}\n {item.reservePercent !== null ? <span className={styles.reserveZone} /> : null}\n <span className={styles.fill} />\n {item.reservePercent !== null ? <span className={styles.reserve} /> : null}\n </span>\n <span className={styles.foot}>\n <span className={styles.note}>{item.note ?? item.status}</span>\n <span className={styles.autonomy} data-kind={item.autonomy.kind}>\n <span className={styles.dot} aria-hidden=\"true\" />\n {item.autonomy.word}\n </span>\n </span>\n </button>\n </Tooltip>\n );\n}\n\nexport function SeatStrip({ budget, seats, now }: { budget: BudgetView | null; seats: readonly VerseSeat[] | null; now: number }) {\n const health = useCachedHealth();\n const { viewport } = useViewport();\n const strip = useMemo(() => {\n let rows: ReturnType<typeof buildCapacityRows> = [];\n try {\n rows = seats && seats.length > 0 ? buildCapacityRows(seats, { health: health?.seats ?? null, budget, now }) : [];\n } catch {\n // A roster entry this client cannot read (a drifted or half-written\n // seat) must not take Command down with it: the strip falls back to the\n // budget route's seat list and says readiness is unknown.\n rows = [];\n }\n return seatStrip({ rows, budget, healthRead: health !== null, now });\n }, [seats, health, budget, now]);\n\n return (\n <Card\n title=\"Seats\"\n caption={strip.headline}\n actions={\n <button type=\"button\" className={command.linkButton} onClick={() => openResources()} aria-keyshortcuts=\"Meta+.\">\n Resources <kbd className={command.kbd}>⌘.</kbd>\n </button>\n }\n >\n {strip.items.length === 0 ? (\n <CardNote tone=\"unknown\">Seat capacity unavailable.</CardNote>\n ) : (\n <div\n className={styles.list}\n role=\"group\"\n aria-label=\"Capacity per seat\"\n style={{ '--seat-columns': stripColumns(viewport, strip.items.length) } as CSSProperties}\n >\n {strip.items.map((item) => (\n <SeatItem key={item.key} item={item} />\n ))}\n </div>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/cloud/CloudLaunchDialog.tsx — \"New cloud task\" (3.11 unit C3):\n * repo (default ashlrai/ashlr-hub), base branch, the task, Launch.\n *\n * Validation runs on Launch, field by field, in the words the service would\n * use (cloud-model validateLaunch) — the server re-checks everything. The\n * request goes through the surface's guarded action (token first when none\n * is held); a refusal (budget, seat, a CLI that printed no session) stays IN\n * the dialog in the server's own sentence, with the draft intact, so the\n * operator can fix the one thing and press Launch again.\n */\nimport { useEffect, useId, useRef, useState, type FormEvent } from 'react';\nimport { CLOUD_PROMPT_MAX_CHARS, type CloudTaskV1 } from '../../../../core/cloud/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Input } from '../../../components/primitives/Input.js';\nimport { DispatchDisabledError } from '../../../data/client.js';\nimport { describeControlError } from '../autonomy/use-guarded-action.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { launchCloudTask } from './cloud-queries.js';\nimport { CLOUD_DEFAULT_REPO, formatDollars, validateLaunch, type LaunchDraft, type LaunchErrors } from './cloud-model.js';\nimport styles from './cloud.module.css';\n\nexport interface CloudLaunchDialogProps {\n open: boolean;\n onClose: () => void;\n actions: Pick<SurfaceActions, 'act' | 'busy'>;\n /** The flat per-session estimate, for the \"Estimated at $3\" line. */\n estimatePerSessionUsd: number | null;\n onLaunched: (task: CloudTaskV1) => void;\n defaultRepo?: string;\n}\n\nconst COUNT = new Intl.NumberFormat('en-US');\n\nexport function CloudLaunchDialog({ open, onClose, actions, estimatePerSessionUsd, onLaunched, defaultRepo = CLOUD_DEFAULT_REPO }: CloudLaunchDialogProps) {\n const titleId = useId();\n const promptId = useId();\n const promptErrorId = useId();\n const taskRef = useRef<HTMLTextAreaElement>(null);\n const [draft, setDraft] = useState<LaunchDraft>({ repo: defaultRepo, baseBranch: '', prompt: '' });\n const [errors, setErrors] = useState<LaunchErrors>({});\n const [refusal, setRefusal] = useState<string | null>(null);\n\n // Each opening starts clean except for the repo, which is usually the same.\n useEffect(() => {\n if (!open) return;\n setErrors({});\n setRefusal(null);\n }, [open]);\n\n const edit = (patch: Partial<LaunchDraft>) => {\n setRefusal(null);\n setDraft((prev) => ({ ...prev, ...patch }));\n setErrors((prev) => {\n const next = { ...prev };\n for (const key of Object.keys(patch) as Array<keyof LaunchDraft>) delete next[key];\n return next;\n });\n };\n\n const submit = (event: FormEvent) => {\n event.preventDefault();\n const result = validateLaunch(draft);\n if (!result.ok) {\n setErrors(result.errors);\n return;\n }\n setErrors({});\n setRefusal(null);\n actions.act(async () => {\n try {\n const response = await launchCloudTask({ ...result.request, origin: 'operator' });\n setDraft((prev) => ({ ...prev, prompt: '' }));\n onLaunched(response.task);\n onClose();\n } catch (err) {\n // A read-only server is the surface's state (its ActionStatus line);\n // every other refusal belongs next to the Launch button.\n if (err instanceof DispatchDisabledError) throw err;\n setRefusal(describeControlError(err));\n }\n }, 'Launch a Claude Code cloud session with this task.');\n };\n\n const length = draft.prompt.trim().length;\n return (\n <Dialog\n open={open}\n onClose={onClose}\n titleId={titleId}\n title=\"New cloud task\"\n description=\"Runs as a Claude Code cloud session on your Claude account. It delivers a draft PR; nothing merges on its own.\"\n widthClassName={styles.dialogWidth}\n initialFocusRef={taskRef}\n >\n <form className={styles.form} onSubmit={submit} noValidate>\n <div className={styles.fieldGrid}>\n <Input\n label=\"Repository\"\n hint=\"GitHub owner/name\"\n mono\n value={draft.repo}\n error={errors.repo}\n autoComplete=\"off\"\n spellCheck={false}\n onChange={(e) => edit({ repo: e.target.value })}\n />\n <Input\n label=\"Base branch\"\n hint=\"Must be pushed. Empty uses the default branch.\"\n mono\n value={draft.baseBranch}\n placeholder=\"default branch\"\n error={errors.baseBranch}\n autoComplete=\"off\"\n spellCheck={false}\n onChange={(e) => edit({ baseBranch: e.target.value })}\n />\n </div>\n <div className={styles.textareaField}>\n <label className={styles.label} htmlFor={promptId}>Task</label>\n <textarea\n ref={taskRef}\n id={promptId}\n className={styles.textarea}\n value={draft.prompt}\n placeholder=\"What should the cloud session do? It reads the repo's own guidance and opens a draft PR.\"\n aria-invalid={errors.prompt ? true : undefined}\n aria-describedby={errors.prompt ? promptErrorId : undefined}\n onChange={(e) => edit({ prompt: e.target.value })}\n />\n {errors.prompt ? <p id={promptErrorId} className={styles.fieldError} role=\"alert\">{errors.prompt}</p> : null}\n <p className={styles.muted}>\n {COUNT.format(length)} of {COUNT.format(CLOUD_PROMPT_MAX_CHARS)} characters\n {estimatePerSessionUsd !== null ? ` · estimated at ${formatDollars(estimatePerSessionUsd)} per session` : ''}\n </p>\n </div>\n {refusal ? <p className={styles.notice} data-tone=\"danger\" role=\"alert\">{refusal}</p> : null}\n <div className={styles.formActions}>\n <Button variant=\"ghost\" onClick={onClose} disabled={actions.busy}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"primary\" busy={actions.busy}>\n Launch\n </Button>\n </div>\n </form>\n </Dialog>\n );\n}\n","/**\n * routes/verse/cloud/CloudCard.tsx — the cloud lane on Command (3.11 unit C3;\n * mounted by sections/CommandSection.tsx beside the burn-downs).\n *\n * Cloud [New cloud task] [Improve Verse] [Edit budget] [↻]\n * Credits remaining $212 of $250 · estimate\n * ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇░░░░░\n * Estimated at $3 per session — Claude doesn't expose the credit balance… Check usage on claude.ai ↗\n * 3 of 20 sessions today · 1 running · resets Sat 12:00 AM\n * (●) Self-improvement 2 of 4 today, on ashlrai/ashlr-hub …\n * ● Running Fix the flaky tracker test\n * ashlrai/ashlr-hub from master · started 5m ago\n * Open in Claude ↗\n *\n * The balance is NOT readable anywhere (types.ts header), so every dollar is\n * an estimate and the card says so beside the number, with the link to the\n * real one. It reads GET /api/verse/cloud itself and polls it every 30 s\n * while Command is visible; every write goes through Command's guarded\n * actions (confirm → token → request) and the overview is re-read after.\n *\n * States: loading, not in this build (404 — renders nothing), empty, running, pr-open, failed,\n * and budget-refused (the launch gate closed — its plain sentence is shown,\n * and New cloud task / Improve Verse are disabled with that sentence as\n * their tooltip).\n */\nimport { lazy, Suspense, useId, useRef, useState } from 'react';\nimport { CLOUD_BALANCE_URL, type CloudBudgetUpdate, type CloudOverviewResponse, type CloudTaskV1 } from '../../../../core/cloud/types.js';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport { IconExternalLink, IconPlus, IconRefresh } from '../../../components/primitives/icons.js';\nimport { Meter } from '../../../components/primitives/Meter.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { tidyProse } from '../autonomy/format.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { Card, CardNote } from '../command/Surface.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { CloudBudgetForm } from './CloudBudgetForm.js';\nimport { CloudLaunchDialog } from './CloudLaunchDialog.js';\nimport {\n approxCredits,\n canDismiss,\n cardTasks,\n CLOUD_NOT_SET_UP_WORD,\n creditsMeter,\n formatDollars,\n gateText,\n launchBlock,\n notSetUpLine,\n safeHref,\n selfImproveLine,\n sessionsLine,\n seatText,\n stateWord,\n STATE_TONE,\n taskDetail,\n taskMeta,\n} from './cloud-model.js';\nimport { CLOUD_NOT_IN_BUILD, CLOUD_POLL_MS, cloudQuery, dismissCloudTask, refreshCloudTasks, runCloudImprove, updateCloudBudget } from './cloud-queries.js';\nimport styles from './cloud.module.css';\n\n/** 3.13: the evidence sheet is its own chunk, fetched the first time a row's Evidence is opened. */\nconst EvidenceTimeline = lazy(() => import('./EvidenceTimeline.js'));\n\ninterface CardNotice {\n tone: 'success' | 'warning' | 'danger';\n text: string;\n href?: string | null;\n linkText?: string;\n}\n\n/** An outbound link, always in a new tab and never carrying this page as referrer. */\nfunction OutLink({ href, children, label }: { href: string; children: string; label?: string }) {\n return (\n <a className={styles.link} href={href} target=\"_blank\" rel=\"noreferrer noopener\" aria-label={label}>\n {children} <IconExternalLink width={12} height={12} aria-hidden=\"true\" />\n </a>\n );\n}\n\nexport function CloudTaskRow({ task, actions, now }: { task: CloudTaskV1; actions: SurfaceActions; now: number }) {\n const session = safeHref(task.sessionUrl, 'claude.ai');\n const pr = task.pr ? safeHref(task.pr.url, 'github.com') : null;\n const detail = taskDetail(task, now);\n const [evidenceOpen, setEvidenceOpen] = useState(false);\n return (\n <li className={styles.task} data-state={task.state}>\n <span className={styles.taskChip}>\n <StatusBadge status={task.state} tone={STATE_TONE[task.state]}>{stateWord(task)}</StatusBadge>\n </span>\n <span className={styles.taskMain}>\n <p className={styles.taskTitle}>{task.title}</p>\n <span className={styles.muted}>{taskMeta(task, now)}</span>\n {detail ? <span className={styles.facts}>{detail}</span> : null}\n <span className={styles.taskLinks}>\n {session ? <OutLink href={session} label={`Open “${task.title}” in Claude`}>Open in Claude</OutLink> : null}\n {pr && task.pr ? <OutLink href={pr} label={`Pull request #${task.pr.number} on GitHub`}>{`PR #${task.pr.number}`}</OutLink> : null}\n <button type=\"button\" className={styles.linkButton} aria-haspopup=\"dialog\" aria-label={`Evidence for “${task.title}”`} onClick={() => setEvidenceOpen(true)}>\n Evidence\n </button>\n {canDismiss(task) ? (\n <button\n type=\"button\"\n className={styles.linkButton}\n disabled={actions.busy || actions.readOnly}\n aria-label={`Dismiss “${task.title}”`}\n onClick={() =>\n actions.act(() => dismissCloudTask(task.id), `Dismiss the cloud task “${task.title}”.`, {\n confirm: {\n title: 'Dismiss this cloud task?',\n body: `Verse stops tracking “${task.title}”. Nothing on GitHub or claude.ai changes — the session and any PR stay where they are.`,\n confirmLabel: 'Dismiss',\n },\n })\n }\n >\n Dismiss\n </button>\n ) : null}\n </span>\n </span>\n {evidenceOpen ? (\n <Suspense fallback={null}>\n <EvidenceTimeline taskId={task.id} title={task.title} open onClose={() => setEvidenceOpen(false)} now={now} />\n </Suspense>\n ) : null}\n </li>\n );\n}\n\n/** \"Edit budget\": the shared budget form in a popover anchored under its button. */\nfunction BudgetPopover({ overview, actions, onClose }: { overview: CloudOverviewResponse; actions: SurfaceActions; onClose: () => void }) {\n const panel = useRef<HTMLDivElement>(null);\n const titleId = useId();\n useFocusTrap({ open: true, containerRef: panel, onClose });\n const save = (update: CloudBudgetUpdate) =>\n actions.act(() => updateCloudBudget(update), 'Change the cloud budget.', { onDone: onClose });\n return (\n <div ref={panel} className={styles.popover} role=\"dialog\" aria-modal=\"false\" aria-labelledby={titleId} tabIndex={-1}>\n <h4 id={titleId} className={styles.popoverTitle}>Cloud budget</h4>\n <CloudBudgetForm\n idPrefix=\"cloud-card-budget\"\n budget={overview.budget.budget}\n busy={actions.busy}\n disabled={actions.readOnly}\n onSave={save}\n onCancel={onClose}\n />\n </div>\n );\n}\n\nfunction CloudBody({ overview, actions, now, onNotice }: { overview: CloudOverviewResponse; actions: SurfaceActions; now: number; onNotice: (n: CardNotice) => void }) {\n const view = overview.budget;\n const meter = creditsMeter(view);\n const seat = seatText(overview.seat);\n const refused = gateText(view.canLaunch, 'The cloud budget does not allow another launch right now.');\n const { shown, hidden } = cardTasks(overview.tasks, now);\n const si = view.budget.selfImprove;\n const estimateNote = (\n <p className={styles.estimateNote}>\n {tidyProse(view.estimateNote, now)}{' '}\n <OutLink href={CLOUD_BALANCE_URL} label=\"Check the real balance on claude.ai\">Check usage on claude.ai</OutLink>\n </p>\n );\n return (\n <div className={styles.body}>\n {seat ? (\n // No seat, no launches: the setup blocker is the state and the credit\n // figure is a plain estimate, never a meter reading as headroom.\n <div className={styles.meterBlock} data-standing=\"not-set-up\">\n <p className={styles.standing} title={notSetUpLine(view.estimatedRemainingUsd)}>\n <StatusBadge status=\"not-set-up\" tone=\"warning\">{CLOUD_NOT_SET_UP_WORD}</StatusBadge>\n <span className={styles.muted}>{approxCredits(view.estimatedRemainingUsd)} · estimate</span>\n </p>\n <p className={styles.notice} data-tone=\"warning\" role=\"note\">{seat}</p>\n {estimateNote}\n </div>\n ) : (\n <div className={styles.meterBlock}>\n <Meter\n value={meter.value}\n max={meter.max}\n label=\"Credits remaining\"\n valueText={meter.text}\n tone={meter.tone}\n aria-label={`Estimated credits remaining: ${meter.text}, ${meter.usedText}`}\n />\n {estimateNote}\n {meter.warning ? <p className={styles.notice} data-tone=\"warning\" role=\"note\">{meter.warning}</p> : null}\n </div>\n )}\n <p className={styles.facts}>{sessionsLine(view, now)}</p>\n {refused ? (\n <p className={styles.notice} data-tone=\"warning\" role=\"note\" data-testid=\"cloud-budget-refused\">\n New launches are paused: {refused}\n </p>\n ) : null}\n <div className={styles.toggleRow}>\n <Switch\n checked={si.enabled}\n label=\"Self-improvement\"\n disabled={actions.busy || actions.readOnly}\n onChange={(enabled) =>\n actions.act(() => updateCloudBudget({ selfImprove: { enabled } }), enabled ? 'Let Verse launch its own self-improvement tasks.' : 'Stop Verse launching its own self-improvement tasks.', {\n onDone: () => onNotice({ tone: 'success', text: enabled ? `Self-improvement is on — up to ${si.maxPerDay} a day.` : 'Self-improvement is off.' }),\n })\n }\n />\n <span className={`${styles.muted} ${styles.toggleText}`}>{selfImproveLine(view)}</span>\n </div>\n {shown.length === 0 ? (\n <CardNote>No cloud tasks yet. Start one with New cloud task, or let Verse improve itself.</CardNote>\n ) : (\n <ul className={styles.tasks} aria-label=\"Cloud tasks\">\n {shown.map((t) => <CloudTaskRow key={t.id} task={t} actions={actions} now={now} />)}\n </ul>\n )}\n {hidden > 0 ? <p className={styles.muted}>{hidden} more {hidden === 1 ? 'task is' : 'tasks are'} listed by ashlr cloud list.</p> : null}\n </div>\n );\n}\n\nexport function CloudCard({ actions, now = Date.now() }: { actions: SurfaceActions; now?: number }) {\n const read = useQuery(cloudQuery, { freshMs: 15_000 });\n const refetch = useRefetch(cloudQuery);\n usePollWhileVisible(refetch, CLOUD_POLL_MS);\n const [launchOpen, setLaunchOpen] = useState(false);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const [notice, setNotice] = useState<CardNotice | null>(null);\n\n const overview = read.data?.value ?? null;\n const loading = !read.data && (read.status === 'loading' || read.status === 'idle');\n const block = overview ? launchBlock(overview.seat, overview.budget) : null;\n const locked = actions.busy || actions.readOnly;\n const nextUp = overview?.backlog.nextUp ? overview.backlog.items.find((i) => i.id === overview.backlog.nextUp) ?? null : null;\n const improveBlock = !overview\n ? null\n : seatText(overview.seat) ?? gateText(overview.budget.canLaunch, 'The cloud budget does not allow another launch right now.') ?? (nextUp ? null : 'The self-improvement backlog has nothing left to launch.');\n const estimate = overview ? overview.budget.budget.estimatedCostPerSessionUsd : null;\n\n const improve = () => {\n if (!overview || !nextUp) return;\n actions.act(() => runCloudImprove({ count: 1 }), 'Launch the next self-improvement task as a cloud session.', {\n confirm: {\n title: 'Improve Verse now?',\n body: `Launches “${nextUp.title}” as a cloud session on ${nextUp.repo ?? overview.budget.budget.selfImprove.repo}${estimate !== null ? `, estimated at ${formatDollars(estimate)}` : ''}. It delivers a draft PR; nothing merges on its own.`,\n confirmLabel: 'Launch',\n },\n onDone: (result) => {\n const first = result.launched[0] ?? null;\n if (first) {\n setNotice({ tone: 'success', text: `Started “${first.title}”.`, href: safeHref(first.sessionUrl, 'claude.ai'), linkText: 'Open in Claude' });\n } else {\n const why = result.skipped[0]?.reason ?? 'Nothing was launched, and the server sent no reason.';\n setNotice({ tone: 'warning', text: tidyProse(why) });\n }\n },\n });\n };\n\n const head = overview ? (\n <span className={styles.headActions}>\n <Tooltip label={block ?? 'Start a cloud session with your own task'}>\n <Button size=\"sm\" variant=\"primary\" icon={<IconPlus width={14} height={14} />} disabled={locked || block !== null} onClick={() => setLaunchOpen(true)}>\n New cloud task\n </Button>\n </Tooltip>\n <Tooltip label={improveBlock ?? (nextUp ? `Launch the next backlog item: ${nextUp.title}` : 'Launch the next backlog item')}>\n <Button size=\"sm\" disabled={locked || improveBlock !== null} onClick={improve}>\n Improve Verse\n </Button>\n </Tooltip>\n <Tooltip label=\"Credits, per-session estimate and daily caps\">\n <Button size=\"sm\" variant=\"ghost\" aria-expanded={budgetOpen} aria-haspopup=\"dialog\" onClick={() => setBudgetOpen((o) => !o)} disabled={actions.readOnly}>\n Edit budget\n </Button>\n </Tooltip>\n <Tooltip label=\"Check GitHub for task updates now\">\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n icon={<IconRefresh width={14} height={14} />}\n aria-label=\"Check GitHub for task updates now\"\n disabled={locked}\n onClick={() => actions.act(() => refreshCloudTasks(), 'Re-read the cloud tasks from GitHub.')}\n />\n </Tooltip>\n {budgetOpen ? <BudgetPopover overview={overview} actions={actions} onClose={() => setBudgetOpen(false)} /> : null}\n </span>\n ) : null;\n\n // A server without the cloud lane (404): no card at all, not a full-width\n // row saying so. Every hook above has already run, so this early return is safe.\n if (read.data?.available === false && read.data.reason === CLOUD_NOT_IN_BUILD) return null;\n\n return (\n <Card title=\"Cloud\" caption=\"Claude Code cloud sessions on your Claude credits\" actions={head}>\n {loading ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the cloud lane…</p>\n ) : !overview ? (\n <CardNote tone=\"unknown\">{read.data?.reason ?? read.error?.message ?? 'The cloud lane did not answer.'}</CardNote>\n ) : (\n <>\n {notice ? (\n <div className={styles.notice} data-tone={notice.tone} role=\"status\">\n <span className={styles.noticeRow}>\n <span>\n {notice.text}\n {notice.href ? <> <OutLink href={notice.href}>{notice.linkText ?? 'Open'}</OutLink></> : null}\n </span>\n <button type=\"button\" className={styles.linkButton} onClick={() => setNotice(null)}>Dismiss</button>\n </span>\n </div>\n ) : null}\n <CloudBody overview={overview} actions={actions} now={now} onNotice={setNotice} />\n <CloudLaunchDialog\n open={launchOpen}\n onClose={() => setLaunchOpen(false)}\n actions={actions}\n estimatePerSessionUsd={estimate}\n onLaunched={(task) =>\n setNotice({ tone: 'success', text: `Started “${task.title}”.`, href: safeHref(task.sessionUrl, 'claude.ai'), linkText: 'Open in Claude' })\n }\n />\n </>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/command/VerdictLine.tsx — the one sentence under the top bar\n * (17/24, weight 500): \"Autonomous · 5 building · 7 merged today · 0 reverts\n * · Claude 46% reserved for you\", then the \"Since you looked\" strip.\n *\n * The strip compares against the operator's previous visit to Command,\n * remembered per viewer in localStorage (a convenience: if storage is\n * blocked the strip simply stays hidden — nothing depends on it).\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { useSectionVisible } from '../shell/section-visibility.js';\nimport { verdictParts, type VerdictInputs } from './authority-model.js';\nimport type { SinceItem } from './command-model.js';\nimport styles from './command.module.css';\n\nexport function VerdictLine(props: VerdictInputs) {\n const parts = verdictParts(props);\n return (\n <p className={styles.verdict} data-testid=\"verdict\">\n {parts.map((p, i) => (\n <span key={p.key} className={styles.verdictPart} data-tone={p.tone}>\n {i > 0 ? <span className={styles.verdictSep} aria-hidden=\"true\"> · </span> : null}\n {p.text}\n </span>\n ))}\n </p>\n );\n}\n\nexport const LAST_LOOKED_KEY = 'ashlr.verse.command.lastLooked.v1';\n\nfunction readStored(): string | null {\n try {\n const v = window.localStorage.getItem(LAST_LOOKED_KEY);\n return v && Number.isFinite(Date.parse(v)) ? v : null;\n } catch {\n return null;\n }\n}\n\nfunction writeStored(value: string): void {\n try {\n window.localStorage.setItem(LAST_LOOKED_KEY, value);\n } catch {\n /* private window / blocked storage: the strip just stays hidden */\n }\n}\n\n/**\n * The previous visit's time. Each time Command comes into view (mount, or\n * back from another surface in the keep-alive shell), what was stored\n * becomes \"last looked\" and now is stored for next time.\n */\nexport function useLastLooked(): string | null {\n const visible = useSectionVisible();\n const [previous, setPrevious] = useState<string | null>(null);\n const wasVisible = useRef(false);\n useEffect(() => {\n if (visible && !wasVisible.current) {\n setPrevious(readStored());\n writeStored(new Date().toISOString());\n }\n wasVisible.current = visible;\n }, [visible]);\n return previous;\n}\n\n/** A glance back sooner than this is the same visit; the strip stays hidden. */\nexport const SINCE_MIN_GAP_MS = 3_600_000;\n\n/**\n * \"Since 9:40 AM: 3 merged · 1 reverted\". Shown only when something changed\n * AND the previous look was at least an hour ago — \"Since 2:14 PM: nothing\n * new\" on every return from another surface was noise.\n */\nexport function SinceStrip({ lastLookedAt, items, now = Date.now() }: { lastLookedAt: string | null; items: SinceItem[]; now?: number }) {\n if (!lastLookedAt || items.length === 0) return null;\n const when = new Date(lastLookedAt);\n if (!Number.isFinite(when.getTime()) || now - when.getTime() < SINCE_MIN_GAP_MS) return null;\n const sameDay = when.toDateString() === new Date(now).toDateString();\n const label = sameDay\n ? when.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })\n : when.toLocaleString('en-US', { weekday: 'short', hour: 'numeric', minute: '2-digit' });\n return (\n <div className={styles.since} role=\"group\" aria-label={`Since you looked at ${label}`}>\n <span className={styles.sinceLead}>Since {label}</span>\n {items.map((item) => (\n <span key={item.id} className={styles.sinceChip} data-tone={item.tone}>\n {item.text}\n </span>\n ))}\n </div>\n );\n}\n","/**\n * routes/verse/sections/CommandSection.tsx — ⌘1 Command, the home surface\n * (SPEC-310B §6, SPEC-310C §5; unit C7). Lazy-mounted by the shell; takes no\n * props (named export, like every section).\n *\n * It answers, top to bottom, in the order the questions arrive:\n * 1. What is autonomy allowed to do, and how do I stop it? (top bar)\n * 2. Is the company producing? (verdict line)\n * 3. What changed since I last looked? (\"Since\" strip)\n * 4. What needs me, and what is the Leader doing? (Needs you 5 | Leader 7)\n * — Needs you reads the shell's shared activity store (C1 useActivity).\n * 5. Is it working? (5 KPI tiles)\n * 6. Will it run out? (one compact seat strip)\n * — and the cloud lane's estimated credits and tasks (3.11 CloudCard)\n * The per-seat burn-down charts live on Usage (audit 14); a seat here\n * opens the Resources drawer (⌘.).\n * 7. What ran? (12 h swimlane)\n * At 375 px: Needs you, Leader, KPIs two per row, one seat per line, then\n * a 6 h swimlane — the DOM order below IS that order.\n *\n * Autonomy off (no grant, grant lapsed, Stop, switch at Off, daemon down):\n * ONE banner under the top bar (autonomy/AutonomyOffState) says what is off\n * and LINKS to the Fleet tab, where the fleet is operated (3.15) — or, while\n * the live setup checklist has a step open before the grant, that step's\n * command (with the checklist under it). It stands in for the verdict line\n * and the Since strip, and the KPI row and the swimlane are left out while\n * they would only draw zeros and dashes.\n *\n * Autonomy on: one line about the fleet (fleet/FleetStatusLink) with a link\n * to Fleet, where the rollout ladder, Start / Pause / Stop, the grant editor\n * and run steering live since 3.15. The bar above keeps the switch, the\n * grant chip and Stop.\n *\n * Every source is optional (surface-data.ts): a Track B module that has not\n * landed is one card's designed \"not in this build\" state, never a blank\n * surface. Polling runs only while Command is the visible surface\n * (usePollWhileVisible), at ≥ 2 s per the performance budget.\n */\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { Swimlane } from '../../../components/charts/Swimlane.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { getQuerySnapshot, subscribeQuery } from '../../../data/cache.js';\nimport type { VerseBootstrap } from '../../../data/api-types.js';\nimport { VERSE_BOOTSTRAP_KEY } from '../verse-queries.js';\nimport { budgetQuery } from '../budget/budget-queries.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { ActionStatus, useSurfaceActions } from '../command/actions.js';\nimport { AutonomyBar, useGrantFlow } from '../command/AutonomyBar.js';\nimport { FleetStatusLink } from '../fleet/FleetStatusLink.js';\nimport { fleetControlQuery } from '../fleet/fleet-control-queries.js';\nimport { AutonomyOffState, useSetupChecklist } from '../autonomy/AutonomyOffState.js';\nimport { autonomyOffState } from '../autonomy/autonomy-off-model.js';\nimport { buildKpis, claudeReserve, kpisSayNothing, seatNames, sinceYouLooked } from '../command/command-model.js';\nimport { KpiRow } from '../command/KpiRow.js';\nimport { LeaderCard } from '../command/LeaderCard.js';\nimport { NeedsYouCard } from '../command/NeedsYouCard.js';\nimport { SeatStrip } from '../command/SeatStrip.js';\nimport { CloudCard } from '../cloud/CloudCard.js';\nimport { Cell, Surface } from '../command/Surface.js';\nimport { SinceStrip, VerdictLine, useLastLooked } from '../command/VerdictLine.js';\nimport { useActivity } from '../shell/useActivity.js';\nimport {\n authorityQuery,\n fleetHistoryQuery,\n fleetLiveQuery,\n leaderQuery,\n learningQuery,\n} from '../command/surface-data.js';\nimport { fleetDarkSince, fleetDarkStatus } from '../fleet/dark-since.js';\nimport { laneRows, runTone } from '../fleet/live-model.js';\nimport styles from '../command/command.module.css';\n\nconst HOUR = 3_600_000;\n\n/** Fast reads: the switch, the fleet and the inbox move while nobody clicks. */\nexport const COMMAND_FAST_POLL_MS = 10_000;\n/** Slow reads: the Leader, budgets (the collector samples every 30 s). */\nexport const COMMAND_SLOW_POLL_MS = 30_000;\n/** History and learning change daily. */\nexport const COMMAND_HISTORY_POLL_MS = 300_000;\n\nexport function CommandSection() {\n const { compact } = useViewport();\n const authority = useQuery(authorityQuery);\n const fleet = useQuery(fleetLiveQuery);\n // The shell's ONE activity poll (C1) — never a second loop from here.\n const activity = useActivity();\n const leader = useQuery(leaderQuery);\n const learning = useQuery(learningQuery, { freshMs: 60_000 });\n const history = useQuery(fleetHistoryQuery, { freshMs: 60_000 });\n const budget = useQuery(budgetQuery, { freshMs: 15_000 });\n\n const refetch = {\n authority: useRefetch(authorityQuery),\n fleet: useRefetch(fleetLiveQuery),\n leader: useRefetch(leaderQuery),\n learning: useRefetch(learningQuery),\n history: useRefetch(fleetHistoryQuery),\n budget: useRefetch(budgetQuery),\n fleetControl: useRefetch(fleetControlQuery),\n };\n usePollWhileVisible(() => {\n refetch.authority();\n refetch.fleet();\n refetch.fleetControl();\n }, COMMAND_FAST_POLL_MS);\n usePollWhileVisible(() => {\n refetch.leader();\n refetch.budget();\n }, COMMAND_SLOW_POLL_MS);\n usePollWhileVisible(() => {\n refetch.history();\n refetch.learning();\n }, COMMAND_HISTORY_POLL_MS);\n\n // A 30 s clock is enough for the chip and the swimlane's \"now\"; the\n // countdown rings keep their own 1 s ticker.\n const now = useNow(30_000);\n const actions = useSurfaceActions();\n // One Touch ID sheet for the bar AND the \"Autonomy is off\" banner.\n const grantFlow = useGrantFlow(actions);\n const lastLooked = useLastLooked();\n\n // The seat roster, for the seat strip (the rail's capacity projection) and\n // Needs-you's seat names. Read from the cache WITHOUT fetching: the console\n // loads bootstrap at startup and the chat surfaces keep it live, and a\n // bootstrap read here would cost ~384 ms of server event loop per poll\n // (useSeatsRefresh.ts). No roster → the strip falls back to the budget\n // route's own seat list and says readiness is unknown.\n const roster = useSyncExternalStore(\n useCallback((listener: () => void) => subscribeQuery(VERSE_BOOTSTRAP_KEY, listener), []),\n () => getQuerySnapshot<VerseBootstrap>(VERSE_BOOTSTRAP_KEY),\n () => getQuerySnapshot<VerseBootstrap>(VERSE_BOOTSTRAP_KEY),\n );\n const seats = roster.data?.seats ?? null;\n\n const view = budget.data ?? null;\n\n const auth = authority.data?.value ?? null;\n const live = fleet.data?.value ?? null;\n const hist = history.data?.value ?? null;\n // THE dark-since instant (fleet/dark-since.ts): null unless the fleet is\n // dark. Never fleet history's date — that is \"quiet since\", not \"dark\".\n const darkSince = fleetDarkSince(live);\n\n const kpis = useMemo(\n // `budget` puts each paid seat's window usage (percent, never dollars) in\n // the metered-spend caption (review 3.10 c10).\n () => buildKpis({ fleet: live, history: hist, learning: learning.data?.value ?? null, policy: auth?.policy ?? null, budget: view }),\n [live, hist, learning.data, auth, view],\n );\n // Needs-you names seats as the seat strip below it does, never by raw id.\n const names = useMemo(() => seatNames(seats, view), [seats, view]);\n // The banner decides once both reads (and, with no grant, the setup\n // checklist) have answered — never a flash of \"off\" while Command is still loading.\n const setup = useSetupChecklist(auth?.grant.state === 'none');\n const banner = authority.data && fleet.data && setup.readiness !== undefined\n ? autonomyOffState({ authority: auth, live, readiness: setup.readiness, setup: setup.report })\n : null;\n const kpisEmpty = useMemo(() => kpisSayNothing({ fleet: live, history: hist, learning: learning.data?.value ?? null }), [live, hist, learning.data]);\n const since = sinceYouLooked({ lastLookedAt: lastLooked, fleet: live, leader: leader.data?.value ?? null, activity: activity.data });\n\n const windowH = compact ? 6 : 12;\n const from = now - windowH * HOUR;\n const lanes = useMemo(() => (live ? laneRows(live.runs, from, now) : []), [live, from, now]);\n const runsStatus: ChartStatus = !fleet.data\n ? { kind: 'loading' }\n : !live\n ? { kind: 'unknown', reason: fleet.data.reason ?? 'the live fleet view did not answer.' }\n : live.state === 'dark' && lanes.length === 0\n ? fleetDarkStatus(live)\n : lanes.length === 0\n ? { kind: 'empty', message: `No runs in the last ${windowH} hours.` }\n : { kind: 'ready' };\n\n // The banner (or the verdict) already says the fleet is dark; \"All clear\"\n // needs no third copy of it.\n const fleetLine = live\n ? live.state === 'dark'\n ? null\n : `Fleet ${live.state}: ${live.summary.building ?? '—'} building, ${live.summary.queued ?? '—'} queued.`\n : 'Fleet status unknown.';\n const refreshing = [authority, fleet].some((q) => q.status === 'refreshing');\n\n return (\n <Surface\n title=\"Command\"\n actions={refreshing ? <RefreshIndicator /> : null}\n lead={\n <div className={styles.lead}>\n <AutonomyBar read={authority.data} loading={authority.status === 'loading'} budgetMode={view?.mode ?? null} actions={actions} compact={compact} now={now} grantFlow={grantFlow} />\n <ActionStatus actions={actions} />\n {banner ? (\n // 3.15: the fleet is operated on the Fleet tab — this banner says\n // where autonomy stands and links there (no second grant button,\n // no second checklist of controls).\n <AutonomyOffState state={banner} here=\"command\" />\n ) : (\n <>\n {/* The rollout ladder and the fleet's controls live on Fleet (3.15). */}\n <FleetStatusLink />\n <VerdictLine\n authority={auth}\n building={live?.summary.building ?? null}\n mergedToday={live?.summary.mergedToday ?? null}\n revertsToday={live?.summary.revertsToday ?? null}\n reserve={claudeReserve(view)}\n darkSince={darkSince}\n />\n <SinceStrip lastLookedAt={lastLooked} items={since} now={now} />\n </>\n )}\n </div>\n }\n >\n <Cell span={5}>\n <NeedsYouCard state={activity} actions={actions} fleetLine={fleetLine} seatNames={names} />\n </Cell>\n <Cell span={7}>\n <LeaderCard read={leader.data} loading={leader.status === 'loading'} actions={actions} />\n </Cell>\n {banner && kpisEmpty ? null : (\n <Cell span={12}>\n <KpiRow kpis={kpis} />\n </Cell>\n )}\n <Cell span={12}>\n <SeatStrip budget={view} seats={seats} now={now} />\n </Cell>\n <Cell span={12}>\n <CloudCard actions={actions} now={now} />\n </Cell>\n {banner && lanes.length === 0 ? null : (\n <Cell span={12}>\n <Swimlane\n title={`Last ${windowH} hours`}\n description=\"Fleet lanes; bars coloured by status, outlines are queued or parked\"\n status={runsStatus}\n lanes={lanes}\n from={from}\n to={now}\n now={now}\n toneOf={runTone}\n />\n </Cell>\n )}\n {grantFlow.sheet}\n {actions.dialogs}\n </Surface>\n );\n}\n"],"file":"CommandSection-8TFjYitt.js"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{t as r}from"./Button-DJY_Pu5B.js";import{t as i}from"./Input-Bt6fp051.js";import{t as a}from"./Playbooks.module-Due8zOPq.js";var o=e(n(),1),s=/^[a-zA-Z_][a-zA-Z0-9_-]{0,31}$/,c=4096,l=1024,u=/^[A-Za-z0-9_./:@%+=,-]+$/;function d(e){return e>=8234&&e<=8238||e>=8294&&e<=8297||e===8232||e===8233||e===8206||e===8207}function f(e){return m(e,e=>e<=8||e>=11&&e<=31||e>=127&&e<=159||d(e))}function p(e){return m(e,e=>e<=31||e>=127&&e<=159||d(e))}function m(e,t){for(let n=0;n<e.length;n+=1)if(t(e.charCodeAt(n)))return!0;return!1}var h=`\0`,g=class extends Error{constructor(e){super(e),this.name=`CommandTemplateError`}};function _(e,t){let n=1;for(let r=0;r<t&&r<e.length;r+=1)e[r]===`
|
|
2
|
-
`&&(n+=1);return n}function v(e,t){let n=[],r=``,i=0;for(;i<e.length;){if(e.startsWith(`\\{{`,i)){r+=`{{`,i+=3;continue}if(e.startsWith(`{{`,i)){let a=e.indexOf(`}}`,i+2);if(a===-1){t.push(`Line ${_(e,i)}: \`{{\` is never closed with \`}}\` (write \`\\{{\` for a literal \`{{\`).`),r+=e.slice(i);break}let o=e.slice(i+2,a),c=`{{${o}}}`;if(/[\r\n]/.test(o))t.push(`Line ${_(e,i)}: a placeholder must fit on one line.`),r+=c;else{let a=o.indexOf(`:`),l=(a===-1?o:o.slice(0,a)).trim(),u=a===-1?null:o.slice(a+1).trim();if(!s.test(l))t.push(`Line ${_(e,i)}: \`${c.slice(0,40)}\` is not a placeholder — a name is a letter or _ then up to 31 letters, digits, _ or - (write \`\\{{\` for a literal \`{{\`).`),r+=c;else{let a=u===null?null:S(u);a&&t.push(`Line ${_(e,i)}: the default of \`${l}\` ${a}`),r&&n.push({kind:`text`,text:r}),r=``,n.push({kind:`hole`,name:l,default:u,raw:c})}}i=a+2;continue}r+=e[i],i+=1}return r&&n.push({kind:`text`,text:r}),n}var y=/[\s;&|()<>]/;function b(e){let t=[],n=[],r=[],i=()=>n[n.length-1]??null,a=0;for(;a<e.length;){let o=e[a],s=i();if(o===h){if(s===null||s.t===`cmdsub`){let n=e[a-1];t.push(n===`$`&&e[a-2]!==`\\`?`dollar`:`plain`)}else t.push(s.t===`ansi`?`single`:s.t);a+=1;continue}if(s?.t===`single`){o===`'`&&n.pop(),a+=1;continue}if(s?.t===`ansi`){o===`\\`?a+=2:(o===`'`&&n.pop(),a+=1);continue}if(s?.t===`double`){if(o===`\\`){a+=2;continue}if(o===`"`)n.pop();else if(o==="`")n.push({t:`backtick`});else if(o===`$`&&e[a+1]===`(`){n.push({t:`cmdsub`,depth:0}),a+=2;continue}a+=1;continue}if(o===`\\`){a+=2;continue}if(o===`'`){n.push({t:`single`}),a+=1;continue}if(o===`"`){n.push({t:`double`}),a+=1;continue}if(o===`$`&&e[a+1]===`'`){n.push({t:`ansi`}),a+=2;continue}if(o===`$`&&e[a+1]===`(`){n.push({t:`cmdsub`,depth:0}),a+=2;continue}if(o==="`"){s?.t===`backtick`?n.pop():n.push({t:`backtick`}),a+=1;continue}if(s?.t===`cmdsub`&&o===`(`){s.depth+=1,a+=1;continue}if(s?.t===`cmdsub`&&o===`)`){s.depth===0?n.pop():--s.depth,a+=1;continue}if(o===`#`&&(a===0||y.test(e[a-1]))){let n=e.indexOf(`
|
|
3
|
-
`,a),r=n===-1?e.length:n;for(let n=a;n<r;n+=1)e[n]===h&&t.push(`comment`);a=r;continue}if(o===`<`&&e[a+1]===`<`&&e[a+2]!==`<`){let n=a+2,i=e[n]===`-`;for(i&&(n+=1);e[n]===` `||e[n]===` `;)n+=1;let o=``;for(;n<e.length&&!y.test(e[n]);)o+=e[n],n+=1;for(let e of o)e===h&&t.push(`heredoc`);let s=o.split(h).join(``).replace(/['"\\]/g,``);s&&r.push({delim:s,strip:i}),a=n;continue}if(o===`
|
|
4
|
-
`&&r.length>0){let n=a+1;for(let i of r.splice(0))for(;n<e.length;){let r=e.indexOf(`
|
|
5
|
-
`,n),a=r===-1?e.length:r,o=e.slice(n,a);if(n=r===-1?e.length:r+1,(i.strip?o.replace(/^\t+/,``):o)===i.delim)break;for(let e of o)e===h&&t.push(`heredoc`)}a=n;continue}a+=1}return t}var x={single:`is inside quotes — put it outside them; its value is quoted for you.`,double:`is inside quotes — put it outside them; its value is quoted for you.`,backtick:`is inside backticks — use $( … ) instead.`,heredoc:`is inside a here-document, where quoting does not apply.`,dollar:"follows a bare `$` — a placeholder is a whole word, not part of a variable."};function S(e){return p(e)?`contains a line break, tab or control character — a pasted command is one line of text.`:e.length>1024?`is longer than ${l} characters.`:null}function C(e){return u.test(e)&&!e.startsWith(`=`)?e:`'${e.replace(/'/g,`'\\''`)}'`}function w(e){let t=[];if(typeof e!=`string`||!e.trim())return{pieces:[],params:[],errors:[`The command is empty.`]};if(e.length>4096)return{pieces:[],params:[],errors:[`The command is longer than ${c} characters.`]};if(f(e))return{pieces:[],params:[],errors:[`The command contains a control character.`]};let n=v(e,t),r=[],i=new Map;for(let e of n){if(e.kind!==`hole`)continue;let n=i.get(e.name);if(n)e.default!==null&&(n.default===null?n.default=e.default:n.default!==e.default&&t.push(`\`${e.name}\` has two different defaults.`));else{let t={name:e.name,default:e.default};i.set(e.name,t),r.push(t)}}r.length>20&&t.push(`At most 20 different placeholders.`);let a=b(n.map(e=>e.kind===`text`?e.text:h).join(``)),o=n.filter(e=>e.kind===`hole`),s=new Set;return o.forEach((e,n)=>{let r=a[n]??`double`;if(r===`plain`||r===`comment`)return;let i=`\`${e.raw.slice(0,40)}\` ${x[r]}`;s.has(i)||t.push(i),s.add(i)}),{pieces:n,params:r,errors:t}}function T(e){let{params:t,errors:n}=w(e);return{params:t,errors:n}}function E(e,t){let n=Object.prototype.hasOwnProperty.call(e,t.name)?e[t.name]:void 0;return typeof n==`string`?n:t.default??``}function D(e,t){let n=[];for(let r of e){let e=E(t,r),i=S(e);i?n.push({name:r.name,message:`\`${r.name}\` ${i}`,required:!1}):r.default===null&&e===``&&n.push({name:r.name,message:`Fill in \`${r.name}\`.`,required:!0})}return n}function O(e,t){let{pieces:n,params:r,errors:i}=w(e);if(i.length>0)throw new g(i[0]);let a=new Map(r.map(e=>[e.name,e])),o=``;for(let e of n){if(e.kind===`text`){o+=e.text;continue}let n=E(t,a.get(e.name)),r=S(n);if(r)throw new g(`\`${e.name}\` ${r}`);o+=C(n)}return o.replace(/\s+$/,``)}function k(e,t={}){let{pieces:n,params:r}=w(e),i=new Map(r.map(e=>[e.name,e]));return n.map(e=>{if(e.kind===`text`)return e.text;let n=i.get(e.name),r=E(t,n);return S(r)||n.default===null&&r===``?`<${e.name}>`:C(r)}).join(``).replace(/\s+$/,``)}var A=/^\s{0,3}(`{3,}|~{3,})([^`]*)$/;function j(e){let t=e.replace(/\r\n?/g,`
|
|
6
|
-
`).split(`
|
|
7
|
-
`),n=0;for(;n<t.length&&!t[n].trim();)n+=1;let r=n<t.length?A.exec(t[n]):null;if(!r)return{ok:!1,error:"“## Command” holds one fenced code block (```) with the command in it."};let i=r[1][0],a=r[1].length,o=[],s=-1;for(let e=n+1;e<t.length;e+=1){let n=/^\s{0,3}(`{3,}|~{3,})\s*$/.exec(t[e]);if(n&&n[1][0]===i&&n[1].length>=a){s=e;break}o.push(t[e])}if(s===-1)return{ok:!1,error:`The code block in “## Command” is never closed.`};if(t.slice(s+1).some(e=>e.trim()))return{ok:!1,error:"“## Command” holds exactly one code block and nothing else — put notes in `description`."};let c=o.join(`
|
|
8
|
-
`).replace(/\s+$/,``);return c.trim()?{ok:!0,template:c}:{ok:!1,error:`The code block in “## Command” is empty.`}}function M(e){let t=Math.max(0,...(e.match(/`+/g)??[]).map(e=>e.length));return"`".repeat(Math.max(3,t+1))}var N=t();function P(e){let t={};for(let n of e)t[n.name]=n.default??``;return t}var F=e=>e.replace(/`/g,``);function I({name:e,template:t,params:n,onPaste:s,pasteDisabledReason:c=null,onCancel:l,cancelLabel:u=`Cancel`}){let[d,f]=(0,o.useState)(()=>P(n)),[p,m]=(0,o.useState)({}),h=(0,o.useId)(),g=(0,o.useId)(),_=(0,o.useMemo)(()=>D(n,d),[n,d]),v=(0,o.useMemo)(()=>k(t,d),[t,d]),y=c??(_[0]?F(_[0].message):null),b=()=>{if(y){m(Object.fromEntries(n.map(e=>[e.name,!0])));return}let e;try{e=O(t,d)}catch{return}s(e)};return(0,N.jsxs)(`form`,{className:a.workflowForm,"aria-label":`Fill ${e}`,onSubmit:e=>{e.preventDefault(),b()},children:[n.length===0?(0,N.jsx)(`p`,{className:a.meta,children:`This command has no parameters.`}):null,n.map((e,t)=>{let n=_.find(t=>t.name===e.name),r=n&&(!n.required||p[e.name])?F(n.message):void 0;return(0,N.jsx)(i,{label:e.name,size:`sm`,mono:!0,value:d[e.name]??``,placeholder:e.default===null?`required`:e.default===``?`optional`:void 0,error:r,autoFocus:t===0,spellCheck:!1,autoComplete:`off`,onChange:t=>{let n=t.target.value;f(t=>({...t,[e.name]:n}))},onBlur:()=>m(t=>({...t,[e.name]:!0}))},e.name)}),(0,N.jsxs)(`div`,{className:a.workflowPreview,children:[(0,N.jsx)(`span`,{id:h,className:a.meta,children:`Pasted at the prompt — you press Enter`}),(0,N.jsx)(`pre`,{"aria-labelledby":h,className:a.commandBlock,children:(0,N.jsx)(`code`,{children:v})})]}),y?(0,N.jsx)(`p`,{id:g,className:a.meta,role:`status`,children:y}):null,(0,N.jsxs)(`div`,{className:a.actions,children:[l?(0,N.jsx)(r,{type:`button`,variant:`ghost`,size:`sm`,onClick:l,children:u}):null,(0,N.jsx)(r,{type:`submit`,variant:`primary`,size:`sm`,disabled:y!==null,"aria-describedby":y?g:void 0,children:`Paste in terminal`})]})]})}export{T as i,M as n,j as r,I as t};
|
|
9
|
-
//# sourceMappingURL=CommandWorkflowForm-B2ooVjof.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CommandWorkflowForm-B2ooVjof.js","names":[],"sources":["../../../../../../src/core/playbooks/command-template.ts","../../../../../../src/web-ui/routes/verse/playbooks/CommandWorkflowForm.tsx"],"sourcesContent":["/**\n * Command workflows (3.15) — the template half of a `kind: command` playbook.\n *\n * A command workflow is a shell command with named holes:\n *\n * git switch -c {{branch}} && git push -u origin {{branch}}\n * gh pr list --state {{state:open}} --limit {{limit:20}}\n *\n * `{{name}}` has no default (the operator must fill it); `{{name:default}}`\n * is prefilled with `default` (which may be empty: `{{name:}}` is an optional\n * hole). The operator fills a form, sees the filled command, and it is PASTED\n * at a terminal prompt — never run. Enter is theirs.\n *\n * PURE and BROWSER-SAFE: the Playbooks view previews as you type, the\n * terminal's picker fills without a round trip, and the server validates the\n * same way on save. No I/O, no Node.\n *\n * SHELL SAFETY — the rules, and why:\n *\n * 1. Every hole is ONE shell word. A filled value is inserted as-is only\n * when it is a \"simple word\" (/^[A-Za-z0-9_./:@%+=,-]+$/, not starting\n * with `=`, which zsh expands to a command path); anything else is\n * single-quoted with the POSIX `'\\''` escape. Inside single quotes\n * nothing is special to sh / bash / zsh — no `$(…)`, no backticks, no\n * `;`, no globbing — so a value can never become code. The price: a hole\n * cannot carry several arguments (`--a --b` becomes one word). That is\n * deliberate: a form field that can inject arbitrary syntax is a\n * footgun even when the operator reviews the paste.\n * 2. Single-quoting is only sound where the shell treats quotes as quotes,\n * so a hole must sit in plain command context (top level, or inside\n * `$( … )`). The template is lexed and a hole inside '…', \"…\", $'…',\n * backticks, a here-document body, or right after a bare `$` is a parse\n * error (\"put it outside the quotes — its value is quoted for you\").\n * 3. Values may not contain control characters: no newline or CR (a paste\n * must never carry a second line the shell could run), no tab (would\n * trigger completion when typed), no ESC / C1 codes (terminal control\n * sequences), no bidi override or Unicode line separator (the preview\n * must read as the paste does). They are refused, not escaped.\n *\n * The quoting is POSIX-shell quoting (sh, bash, zsh — what the Verse\n * terminal runs). fish treats `\\'` inside single quotes differently; a value\n * with both `\\` and `'` may not survive fish intact (it still cannot execute).\n *\n * `\\{{` is a literal `{{` (Go templates: `docker ps --format '\\{{.Names}}'`).\n */\n\n/** A hole's name: a letter or `_`, then up to 31 letters, digits, `_` or `-`. */\nexport const COMMAND_PARAM_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_-]{0,31}$/;\n/** Distinct holes per template. */\nexport const MAX_COMMAND_PARAMS = 20;\n/** A template's size, in characters. */\nexport const MAX_COMMAND_TEMPLATE_CHARS = 4096;\n/** One filled value, in characters. */\nexport const MAX_COMMAND_VALUE_CHARS = 1024;\n\n/** A value inserted without quotes. See rule 1 above. */\nconst SIMPLE_WORD = /^[A-Za-z0-9_./:@%+=,-]+$/;\n/**\n * Bidi embeddings / overrides / isolates and the Unicode line separators:\n * text that would make the preview read differently from what is pasted\n * (\"Trojan Source\"). Refused in templates and values alike.\n */\nfunction invisibleTrick(c: number): boolean {\n return (c >= 0x202a && c <= 0x202e) || (c >= 0x2066 && c <= 0x2069) || c === 0x2028 || c === 0x2029 || c === 0x200e || c === 0x200f;\n}\n/** C0 controls except newline and tab, DEL, C1 controls and invisibleTrick: never in a template. */\nfunction templateForbidden(s: string): boolean {\n return hasCode(s, (c) => c <= 0x08 || (c >= 0x0b && c <= 0x1f) || (c >= 0x7f && c <= 0x9f) || invisibleTrick(c));\n}\n/** Every C0 control (newline and tab included), DEL, C1 and invisibleTrick: never in a value. */\nfunction valueForbidden(s: string): boolean {\n return hasCode(s, (c) => c <= 0x1f || (c >= 0x7f && c <= 0x9f) || invisibleTrick(c));\n}\n/** Char-code scans instead of control-character regexes (eslint no-control-regex). */\nfunction hasCode(s: string, bad: (code: number) => boolean): boolean {\n for (let i = 0; i < s.length; i += 1) if (bad(s.charCodeAt(i))) return true;\n return false;\n}\n/** Stands for a hole while the template is lexed. NUL cannot occur in a valid template. */\nconst HOLE = '\\u0000';\n\nexport interface CommandParam {\n name: string;\n /** null = no default: the operator must fill it in. '' = optional, empty by default. */\n default: string | null;\n}\n\nexport interface CommandTemplateParse {\n /** Distinct holes, in first-appearance order. */\n params: CommandParam[];\n /** Operator-language problems; [] = the template is usable. */\n errors: string[];\n}\n\n/** Thrown by fillCommandTemplate for an invalid template or an unsafe value. */\nexport class CommandTemplateError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CommandTemplateError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tokenizing: text and holes\n// ---------------------------------------------------------------------------\n\ntype Piece = { kind: 'text'; text: string } | { kind: 'hole'; name: string; default: string | null; raw: string };\n\nfunction lineAt(text: string, offset: number): number {\n let line = 1;\n for (let i = 0; i < offset && i < text.length; i += 1) if (text[i] === '\\n') line += 1;\n return line;\n}\n\nfunction tokenize(text: string, errors: string[]): Piece[] {\n const pieces: Piece[] = [];\n let buf = '';\n let i = 0;\n while (i < text.length) {\n if (text.startsWith('\\\\{{', i)) {\n buf += '{{';\n i += 3;\n continue;\n }\n if (text.startsWith('{{', i)) {\n const close = text.indexOf('}}', i + 2);\n if (close === -1) {\n errors.push(`Line ${lineAt(text, i)}: \\`{{\\` is never closed with \\`}}\\` (write \\`\\\\{{\\` for a literal \\`{{\\`).`);\n buf += text.slice(i);\n break;\n }\n const inner = text.slice(i + 2, close);\n const raw = `{{${inner}}}`;\n if (/[\\r\\n]/.test(inner)) {\n errors.push(`Line ${lineAt(text, i)}: a placeholder must fit on one line.`);\n buf += raw;\n } else {\n const colon = inner.indexOf(':');\n const name = (colon === -1 ? inner : inner.slice(0, colon)).trim();\n const def = colon === -1 ? null : inner.slice(colon + 1).trim();\n if (!COMMAND_PARAM_NAME_PATTERN.test(name)) {\n errors.push(\n `Line ${lineAt(text, i)}: \\`${raw.slice(0, 40)}\\` is not a placeholder — a name is a letter or _ then up to 31 letters, digits, _ or - `\n + '(write `\\\\{{` for a literal `{{`).',\n );\n buf += raw;\n } else {\n const problem = def === null ? null : commandValueProblem(def);\n if (problem) errors.push(`Line ${lineAt(text, i)}: the default of \\`${name}\\` ${problem}`);\n if (buf) pieces.push({ kind: 'text', text: buf });\n buf = '';\n pieces.push({ kind: 'hole', name, default: def, raw });\n }\n }\n i = close + 2;\n continue;\n }\n buf += text[i];\n i += 1;\n }\n if (buf) pieces.push({ kind: 'text', text: buf });\n return pieces;\n}\n\n// ---------------------------------------------------------------------------\n// Lexing: which shell context each hole sits in (rule 2)\n// ---------------------------------------------------------------------------\n\ntype HoleContext = 'plain' | 'comment' | 'single' | 'double' | 'backtick' | 'heredoc' | 'dollar';\ntype Frame = { t: 'single' } | { t: 'ansi' } | { t: 'double' } | { t: 'backtick' } | { t: 'cmdsub'; depth: number };\n\n/** Characters that end a word (and so may precede a `#` comment). */\nconst WORD_BREAK = /[\\s;&|()<>]/;\n\n/**\n * The shell context of each HOLE in `s`, in order. A small, conservative\n * POSIX lexer: quotes, escapes, $'…', \"…\", `…`, $( … ) (nested), comments and\n * here-documents. It only needs to be right about where a hole may go; when\n * unsure it reports a quoted context, which refuses rather than guesses.\n */\nfunction holeContexts(s: string): HoleContext[] {\n const out: HoleContext[] = [];\n const stack: Frame[] = [];\n const heredocs: { delim: string; strip: boolean }[] = [];\n const top = (): Frame | null => stack[stack.length - 1] ?? null;\n let i = 0;\n while (i < s.length) {\n const c = s[i]!;\n const frame = top();\n if (c === HOLE) {\n if (frame === null || frame.t === 'cmdsub') {\n const prev = s[i - 1];\n out.push(prev === '$' && s[i - 2] !== '\\\\' ? 'dollar' : 'plain');\n } else {\n out.push(frame.t === 'ansi' ? 'single' : frame.t);\n }\n i += 1;\n continue;\n }\n if (frame?.t === 'single') {\n if (c === \"'\") stack.pop();\n i += 1;\n continue;\n }\n if (frame?.t === 'ansi') {\n if (c === '\\\\') i += 2;\n else {\n if (c === \"'\") stack.pop();\n i += 1;\n }\n continue;\n }\n if (frame?.t === 'double') {\n if (c === '\\\\') { i += 2; continue; }\n if (c === '\"') stack.pop();\n else if (c === '`') stack.push({ t: 'backtick' });\n else if (c === '$' && s[i + 1] === '(') { stack.push({ t: 'cmdsub', depth: 0 }); i += 2; continue; }\n i += 1;\n continue;\n }\n // Command context: top level, $( … ) or ` … `.\n if (c === '\\\\') { i += 2; continue; }\n if (c === \"'\") { stack.push({ t: 'single' }); i += 1; continue; }\n if (c === '\"') { stack.push({ t: 'double' }); i += 1; continue; }\n if (c === '$' && s[i + 1] === \"'\") { stack.push({ t: 'ansi' }); i += 2; continue; }\n if (c === '$' && s[i + 1] === '(') { stack.push({ t: 'cmdsub', depth: 0 }); i += 2; continue; }\n if (c === '`') {\n if (frame?.t === 'backtick') stack.pop();\n else stack.push({ t: 'backtick' });\n i += 1;\n continue;\n }\n if (frame?.t === 'cmdsub' && c === '(') { frame.depth += 1; i += 1; continue; }\n if (frame?.t === 'cmdsub' && c === ')') {\n if (frame.depth === 0) stack.pop();\n else frame.depth -= 1;\n i += 1;\n continue;\n }\n if (c === '#' && (i === 0 || WORD_BREAK.test(s[i - 1]!))) {\n // A comment runs to the end of the line; a hole there is inert text.\n const end = s.indexOf('\\n', i);\n const stop = end === -1 ? s.length : end;\n for (let j = i; j < stop; j += 1) if (s[j] === HOLE) out.push('comment');\n i = stop;\n continue;\n }\n if (c === '<' && s[i + 1] === '<' && s[i + 2] !== '<') {\n let j = i + 2;\n const strip = s[j] === '-';\n if (strip) j += 1;\n while (s[j] === ' ' || s[j] === '\\t') j += 1;\n let word = '';\n while (j < s.length && !WORD_BREAK.test(s[j]!)) { word += s[j]; j += 1; }\n // A hole in the delimiter itself is refused as a here-document hole.\n for (const ch of word) if (ch === HOLE) out.push('heredoc');\n const delim = word.split(HOLE).join('').replace(/['\"\\\\]/g, '');\n if (delim) heredocs.push({ delim, strip });\n i = j;\n continue;\n }\n if (c === '\\n' && heredocs.length > 0) {\n // The bodies start on the next line, one after another.\n let pos = i + 1;\n for (const doc of heredocs.splice(0)) {\n while (pos < s.length) {\n const nl = s.indexOf('\\n', pos);\n const lineEnd = nl === -1 ? s.length : nl;\n const line = s.slice(pos, lineEnd);\n pos = nl === -1 ? s.length : nl + 1;\n if ((doc.strip ? line.replace(/^\\t+/, '') : line) === doc.delim) break;\n for (const ch of line) if (ch === HOLE) out.push('heredoc');\n }\n }\n i = pos;\n continue;\n }\n i += 1;\n }\n return out;\n}\n\nconst CONTEXT_PROBLEM: Record<Exclude<HoleContext, 'plain' | 'comment'>, string> = {\n single: 'is inside quotes — put it outside them; its value is quoted for you.',\n double: 'is inside quotes — put it outside them; its value is quoted for you.',\n backtick: 'is inside backticks — use $( … ) instead.',\n heredoc: 'is inside a here-document, where quoting does not apply.',\n dollar: 'follows a bare `$` — a placeholder is a whole word, not part of a variable.',\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Why `value` cannot fill a hole, or null when it can. Rule 3. */\nexport function commandValueProblem(value: string): string | null {\n if (valueForbidden(value)) return 'contains a line break, tab or control character — a pasted command is one line of text.';\n if (value.length > MAX_COMMAND_VALUE_CHARS) return `is longer than ${MAX_COMMAND_VALUE_CHARS} characters.`;\n return null;\n}\n\n/** One value as one shell word: simple words as-is, anything else single-quoted. Rule 1. Pure. */\nexport function quoteShellValue(value: string): string {\n if (SIMPLE_WORD.test(value) && !value.startsWith('=')) return value;\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction parsePieces(text: string): { pieces: Piece[]; params: CommandParam[]; errors: string[] } {\n const errors: string[] = [];\n if (typeof text !== 'string' || !text.trim()) return { pieces: [], params: [], errors: ['The command is empty.'] };\n if (text.length > MAX_COMMAND_TEMPLATE_CHARS) {\n return { pieces: [], params: [], errors: [`The command is longer than ${MAX_COMMAND_TEMPLATE_CHARS} characters.`] };\n }\n if (templateForbidden(text)) return { pieces: [], params: [], errors: ['The command contains a control character.'] };\n const pieces = tokenize(text, errors);\n const params: CommandParam[] = [];\n const byName = new Map<string, CommandParam>();\n for (const p of pieces) {\n if (p.kind !== 'hole') continue;\n const seen = byName.get(p.name);\n if (!seen) {\n const param = { name: p.name, default: p.default };\n byName.set(p.name, param);\n params.push(param);\n } else if (p.default !== null) {\n if (seen.default === null) seen.default = p.default;\n else if (seen.default !== p.default) errors.push(`\\`${p.name}\\` has two different defaults.`);\n }\n }\n if (params.length > MAX_COMMAND_PARAMS) errors.push(`At most ${MAX_COMMAND_PARAMS} different placeholders.`);\n const flat = pieces.map((p) => (p.kind === 'text' ? p.text : HOLE)).join('');\n const contexts = holeContexts(flat);\n const holes = pieces.filter((p): p is Extract<Piece, { kind: 'hole' }> => p.kind === 'hole');\n const reported = new Set<string>();\n holes.forEach((hole, index) => {\n const context = contexts[index] ?? 'double';\n if (context === 'plain' || context === 'comment') return;\n const message = `\\`${hole.raw.slice(0, 40)}\\` ${CONTEXT_PROBLEM[context]}`;\n if (!reported.has(message)) errors.push(message);\n reported.add(message);\n });\n return { pieces, params, errors };\n}\n\n/**\n * The holes of a template, and what is wrong with it. Never throws. Pure.\n * `errors: []` means fillCommandTemplate will accept it.\n */\nexport function parseCommandTemplate(text: string): CommandTemplateParse {\n const { params, errors } = parsePieces(text);\n return { params, errors };\n}\n\nfunction valueFor(values: Readonly<Record<string, string>>, param: CommandParam): string {\n // Own string properties only: `constructor` is a valid hole name.\n const own = Object.prototype.hasOwnProperty.call(values, param.name) ? values[param.name] : undefined;\n if (typeof own === 'string') return own;\n return param.default ?? '';\n}\n\n/**\n * Per-hole problems for a set of values: a hole with no default left empty\n * (\"required\"), or a value that breaks rule 3. [] = fillable. Pure.\n */\nexport function commandValueIssues(params: readonly CommandParam[], values: Readonly<Record<string, string>>): CommandValueIssue[] {\n const issues: CommandValueIssue[] = [];\n for (const param of params) {\n const value = valueFor(values, param);\n const problem = commandValueProblem(value);\n if (problem) issues.push({ name: param.name, message: `\\`${param.name}\\` ${problem}`, required: false });\n else if (param.default === null && value === '') issues.push({ name: param.name, message: `Fill in \\`${param.name}\\`.`, required: true });\n }\n return issues;\n}\n\nexport interface CommandValueIssue {\n name: string;\n message: string;\n /** true = only \"left empty\" (a hole with no default); false = the value itself is refused. */\n required: boolean;\n}\n\n/**\n * The command with every hole filled — each value as ONE shell word (rule 1);\n * a missing value falls back to the hole's default, then to '' (inserted as\n * `''`, an explicit empty argument). No trailing newline: the result is\n * pasted, never submitted. Throws CommandTemplateError for an invalid\n * template or a value with a control character — never returns an unsafe\n * command. Pure.\n */\nexport function fillCommandTemplate(text: string, values: Readonly<Record<string, string>>): string {\n const { pieces, params, errors } = parsePieces(text);\n if (errors.length > 0) throw new CommandTemplateError(errors[0]!);\n const byName = new Map(params.map((p) => [p.name, p]));\n let out = '';\n for (const piece of pieces) {\n if (piece.kind === 'text') {\n out += piece.text;\n continue;\n }\n const value = valueFor(values, byName.get(piece.name)!);\n const problem = commandValueProblem(value);\n if (problem) throw new CommandTemplateError(`\\`${piece.name}\\` ${problem}`);\n out += quoteShellValue(value);\n }\n return out.replace(/\\s+$/, '');\n}\n\n/**\n * The command as the form's preview shows it: each hole filled like\n * fillCommandTemplate, except a required hole still empty (or a refused\n * value) shows as `<name>`. For display only — paste fillCommandTemplate's\n * result, never this. Pure; never throws.\n */\nexport function previewCommandTemplate(text: string, values: Readonly<Record<string, string>> = {}): string {\n const { pieces, params } = parsePieces(text);\n const byName = new Map(params.map((p) => [p.name, p]));\n return pieces.map((piece) => {\n if (piece.kind === 'text') return piece.text;\n const param = byName.get(piece.name)!;\n const value = valueFor(values, param);\n if (commandValueProblem(value) || (param.default === null && value === '')) return `<${piece.name}>`;\n return quoteShellValue(value);\n }).join('').replace(/\\s+$/, '');\n}\n\n// ---------------------------------------------------------------------------\n// The `## Command` section: one fenced code block\n// ---------------------------------------------------------------------------\n\nconst FENCE_OPEN = /^\\s{0,3}(`{3,}|~{3,})([^`]*)$/;\n\n/**\n * The template inside a `## Command` section's body, which must be exactly\n * one fenced code block (``` or ~~~, any info string). Pure.\n */\nexport function extractCommandFence(body: string): { ok: true; template: string } | { ok: false; error: string } {\n const lines = body.replace(/\\r\\n?/g, '\\n').split('\\n');\n let i = 0;\n while (i < lines.length && !lines[i]!.trim()) i += 1;\n const open = i < lines.length ? FENCE_OPEN.exec(lines[i]!) : null;\n if (!open) return { ok: false, error: '“## Command” holds one fenced code block (```) with the command in it.' };\n const ch = open[1]![0]!;\n const len = open[1]!.length;\n const content: string[] = [];\n let closed = -1;\n for (let j = i + 1; j < lines.length; j += 1) {\n const m = /^\\s{0,3}(`{3,}|~{3,})\\s*$/.exec(lines[j]!);\n if (m && m[1]![0] === ch && m[1]!.length >= len) {\n closed = j;\n break;\n }\n content.push(lines[j]!);\n }\n if (closed === -1) return { ok: false, error: 'The code block in “## Command” is never closed.' };\n if (lines.slice(closed + 1).some((l) => l.trim())) {\n return { ok: false, error: '“## Command” holds exactly one code block and nothing else — put notes in `description`.' };\n }\n const template = content.join('\\n').replace(/\\s+$/, '');\n if (!template.trim()) return { ok: false, error: 'The code block in “## Command” is empty.' };\n return { ok: true, template };\n}\n\n/** A fence that cannot occur inside `template` (CommonMark: longer than any backtick run in it). Pure. */\nexport function commandFenceFor(template: string): string {\n const longest = Math.max(0, ...(template.match(/`+/g) ?? []).map((run) => run.length));\n return '`'.repeat(Math.max(3, longest + 1));\n}\n\n/**\n * A command workflow as markdown, for reading (the Playbooks view and\n * `GET /api/verse/playbooks/<id>`'s `rendered`): the command block, then its\n * parameters. Never an engine prompt. Pure.\n */\nexport function renderCommandWorkflowMarkdown(name: string, spec: { template: string; params: readonly CommandParam[] }): string {\n const fence = commandFenceFor(spec.template);\n const lines = [`## Command workflow: ${name}`, '', `${fence}sh`, spec.template, fence];\n if (spec.params.length > 0) {\n lines.push('', '### Parameters');\n for (const p of spec.params) {\n lines.push(`- \\`${p.name}\\`${p.default === null ? ' — required' : p.default === '' ? ' — optional' : ` — default \\`${p.default.replace(/`/g, \"'\")}\\``}`);\n }\n }\n lines.push('', 'Filled in, it is pasted at a terminal prompt — never run. You press Enter.');\n return lines.join('\\n');\n}\n","/**\n * routes/verse/playbooks/CommandWorkflowForm.tsx — fill a command workflow's\n * holes and paste it (3.15).\n *\n * One labelled field per `{{param}}`, prefilled with its default; a live\n * preview of the command; \"Paste in terminal\". The filling is\n * command-template.ts's — each value becomes ONE shell word (single-quoted\n * unless it is a simple word) and a value with a line break or control\n * character is refused, never stripped — so the preview shows exactly what\n * reaches the prompt. Nothing here runs anything: the caller pastes, and the\n * operator presses Enter.\n *\n * Shared by the Playbooks section (Use…) and CommandWorkflowPicker (the\n * terminal panel's menu).\n */\nimport { useId, useMemo, useState } from 'react';\nimport { commandValueIssues, fillCommandTemplate, previewCommandTemplate, type CommandParam } from '../../../../core/playbooks/command-template.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Input } from '../../../components/primitives/Input.js';\nimport styles from './Playbooks.module.css';\n\nexport interface CommandWorkflowFormProps {\n name: string;\n template: string;\n params: readonly CommandParam[];\n /** Receives the filled command (no trailing newline). Only called with a command that filled cleanly. */\n onPaste: (text: string) => void;\n /** Why pasting is not possible right now (e.g. no chat open); null = it is. */\n pasteDisabledReason?: string | null;\n onCancel?: () => void;\n cancelLabel?: string;\n}\n\nfunction initialValues(params: readonly CommandParam[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const p of params) out[p.name] = p.default ?? '';\n return out;\n}\n\n/** Messages carry `name` in backticks for the markdown-ish core; the form shows plain text. */\nconst plain = (message: string) => message.replace(/`/g, '');\n\nexport function CommandWorkflowForm({ name, template, params, onPaste, pasteDisabledReason = null, onCancel, cancelLabel = 'Cancel' }: CommandWorkflowFormProps) {\n const [values, setValues] = useState<Record<string, string>>(() => initialValues(params));\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const previewId = useId();\n const reasonId = useId();\n\n const issues = useMemo(() => commandValueIssues(params, values), [params, values]);\n const preview = useMemo(() => previewCommandTemplate(template, values), [template, values]);\n const blocked = pasteDisabledReason ?? (issues[0] ? plain(issues[0].message) : null);\n\n const paste = () => {\n if (blocked) {\n setTouched(Object.fromEntries(params.map((p) => [p.name, true])));\n return;\n }\n let filled: string;\n try {\n filled = fillCommandTemplate(template, values);\n } catch {\n return; // unreachable when there are no issues; never paste a command that did not fill\n }\n onPaste(filled);\n };\n\n return (\n <form className={styles.workflowForm} aria-label={`Fill ${name}`} onSubmit={(e) => { e.preventDefault(); paste(); }}>\n {params.length === 0 ? <p className={styles.meta}>This command has no parameters.</p> : null}\n {params.map((p, index) => {\n const issue = issues.find((i) => i.name === p.name);\n const shown = issue && (!issue.required || touched[p.name]) ? plain(issue.message) : undefined;\n return (\n <Input\n key={p.name}\n label={p.name}\n size=\"sm\"\n mono\n value={values[p.name] ?? ''}\n placeholder={p.default === null ? 'required' : p.default === '' ? 'optional' : undefined}\n error={shown}\n autoFocus={index === 0}\n spellCheck={false}\n autoComplete=\"off\"\n onChange={(e) => {\n const next = e.target.value;\n setValues((v) => ({ ...v, [p.name]: next }));\n }}\n onBlur={() => setTouched((t) => ({ ...t, [p.name]: true }))}\n />\n );\n })}\n <div className={styles.workflowPreview}>\n <span id={previewId} className={styles.meta}>Pasted at the prompt — you press Enter</span>\n <pre aria-labelledby={previewId} className={styles.commandBlock}><code>{preview}</code></pre>\n </div>\n {blocked ? <p id={reasonId} className={styles.meta} role=\"status\">{blocked}</p> : null}\n <div className={styles.actions}>\n {onCancel ? <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>{cancelLabel}</Button> : null}\n <Button type=\"submit\" variant=\"primary\" size=\"sm\" disabled={blocked !== null} aria-describedby={blocked ? reasonId : undefined}>\n Paste in terminal\n </Button>\n </div>\n </form>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{l as r}from"./global-BJ_kVFpD.js";import{i}from"./SkipToContent-BjJE6yOo.js";import{R as a}from"./VerseConsoleApp-Cj6yPJo3.js";import{t as o}from"./Button-DJY_Pu5B.js";import{n as s}from"./playbooks-queries-BlpGBpOV.js";import{t as c}from"./CommandWorkflowForm-B2ooVjof.js";import{t as l}from"./Playbooks.module-Due8zOPq.js";var u=e(n(),1),d=t();function f(e){return(e??[]).filter(e=>e.kind===`command`&&!!e.command&&typeof e.command.template==`string`)}function p(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>[e.name,e.id,e.description,e.command.template].some(e=>e.toLowerCase().includes(n))):[...e]}function m({onPaste:e,onClose:t}){let n=r(s,{freshMs:6e4}),[m,h]=(0,u.useState)(null),[g,_]=(0,u.useState)(``),v=(0,u.useRef)(null),y=(0,u.useMemo)(()=>f(n.data?.value),[n.data]),b=(0,u.useMemo)(()=>p(y,g),[y,g]),x=y.find(e=>e.id===m)??null,S=n.data&&!n.data.value?n.data.reason:n.error?`Playbooks could not be read.`:null,C=()=>{h(null),setTimeout(()=>v.current?.focus(),0)};return(0,d.jsxs)(`section`,{className:l.workflowPicker,"aria-label":`Command workflows`,onKeyDown:e=>{e.key===`Escape`&&(e.stopPropagation(),x?C():t())},children:[(0,d.jsxs)(`header`,{className:l.pickerHead,children:[(0,d.jsx)(`h3`,{className:l.pickerTitle,children:x?x.name:`Run command workflow`}),(0,d.jsx)(o,{variant:`ghost`,size:`sm`,onClick:t,children:`Close`})]}),x?(0,d.jsxs)(d.Fragment,{children:[x.description?(0,d.jsx)(`p`,{className:l.meta,children:x.description}):null,(0,d.jsx)(c,{name:x.name,template:x.command.template,params:x.command.params,onCancel:C,cancelLabel:`Back`,onPaste:n=>{e(n),t()}},`${x.id}:${x.latest}`)]}):S?(0,d.jsx)(`p`,{className:l.banner,"data-tone":`danger`,children:S}):n.data===void 0?(0,d.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Loading command workflows`,children:[(0,d.jsx)(i,{width:`60%`}),(0,d.jsx)(i,{width:`40%`})]}):y.length===0?(0,d.jsxs)(`div`,{className:l.pickerEmpty,children:[(0,d.jsxs)(`p`,{className:l.meta,children:[`No command workflows yet. A command workflow is a shell command with `,(0,d.jsx)(`code`,{children:`{{param:default}}`}),` holes you fill in, then paste here.`]}),(0,d.jsx)(o,{variant:`subtle`,size:`sm`,onClick:()=>{a(`playbooks`),t()},children:`Open Playbooks`})]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(`input`,{ref:v,className:l.filter,type:`search`,value:g,placeholder:`Filter command workflows`,"aria-label":`Filter command workflows`,autoFocus:!0,onChange:e=>_(e.target.value),onKeyDown:e=>{e.key===`Enter`&&b[0]&&(e.preventDefault(),h(b[0].id))}}),(0,d.jsxs)(`ul`,{className:l.pickerList,children:[b.map(e=>(0,d.jsx)(`li`,{children:(0,d.jsxs)(`button`,{type:`button`,onClick:()=>h(e.id),children:[(0,d.jsx)(`span`,{className:l.rowName,children:e.name}),(0,d.jsx)(`code`,{className:l.rowCommand,children:e.command.template.split(`
|
|
2
|
-
`)[0]})]})},e.id)),b.length===0?(0,d.jsxs)(`li`,{className:l.meta,children:[`No command workflow matches “`,g,`”.`]}):null]})]})]})}export{m as CommandWorkflowPicker};
|
|
3
|
-
//# sourceMappingURL=CommandWorkflowPicker-C09vJiUG.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CommandWorkflowPicker-C09vJiUG.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/playbooks/CommandWorkflowPicker.tsx"],"sourcesContent":["/**\n * routes/verse/playbooks/CommandWorkflowPicker.tsx — pick a command workflow,\n * fill it, hand back the command (3.15).\n *\n * Self-contained so the terminal panel can lazy-mount it from its menu:\n *\n * const CommandWorkflowPicker = lazy(() =>\n * import('../playbooks/CommandWorkflowPicker.js').then((m) => ({ default: m.CommandWorkflowPicker })));\n * <CommandWorkflowPicker onPaste={(text) => leaf.paste(text)} onClose={close} />\n *\n * It reads the playbook list itself (the shared query cache — one read also\n * serves the Playbooks section and the composer's `!` menu); a command\n * workflow's row already carries its template and parameters, so no second\n * read. Choosing one shows CommandWorkflowForm; \"Paste in terminal\" calls\n * `onPaste(filled)` and then `onClose()`. Escape steps back (form → list →\n * close). It never runs anything: `onPaste` must PASTE (the terminal types\n * it at the prompt; the operator presses Enter).\n */\nimport { useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport type { PlaybookSummary } from '../../../../core/playbooks/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { setVerseSection } from '../verse-ui-store.js';\nimport { CommandWorkflowForm } from './CommandWorkflowForm.js';\nimport { playbooksQuery } from './playbooks-queries.js';\nimport styles from './Playbooks.module.css';\n\nexport interface CommandWorkflowPickerProps {\n /** The filled command, no trailing newline. Paste it — never submit it. */\n onPaste(text: string): void;\n /** Cancel / Escape, and after a paste. */\n onClose(): void;\n}\n\ntype CommandRow = PlaybookSummary & { command: NonNullable<PlaybookSummary['command']> };\n\n/** The command workflows in a playbook list (rows from an older server have no kind: none). Pure. */\nexport function commandWorkflowRows(rows: readonly PlaybookSummary[] | null | undefined): CommandRow[] {\n return (rows ?? []).filter((r): r is CommandRow => r.kind === 'command' && !!r.command && typeof r.command.template === 'string');\n}\n\n/** Case-insensitive filter over name, id, description and the command itself. Pure. */\nexport function filterCommandWorkflows(rows: readonly CommandRow[], query: string): CommandRow[] {\n const q = query.trim().toLowerCase();\n if (!q) return [...rows];\n return rows.filter((r) => [r.name, r.id, r.description, r.command.template].some((s) => s.toLowerCase().includes(q)));\n}\n\nexport function CommandWorkflowPicker({ onPaste, onClose }: CommandWorkflowPickerProps) {\n const read = useQuery(playbooksQuery, { freshMs: 60_000 });\n const [chosenId, setChosenId] = useState<string | null>(null);\n const [filter, setFilter] = useState('');\n const filterRef = useRef<HTMLInputElement>(null);\n const workflows = useMemo(() => commandWorkflowRows(read.data?.value), [read.data]);\n const visible = useMemo(() => filterCommandWorkflows(workflows, filter), [workflows, filter]);\n const chosen = workflows.find((w) => w.id === chosenId) ?? null;\n const reason = read.data && !read.data.value ? read.data.reason : read.error ? 'Playbooks could not be read.' : null;\n\n const back = () => {\n setChosenId(null);\n setTimeout(() => filterRef.current?.focus(), 0);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLElement>) => {\n if (e.key !== 'Escape') return;\n e.stopPropagation();\n if (chosen) back();\n else onClose();\n };\n\n return (\n <section className={styles.workflowPicker} aria-label=\"Command workflows\" onKeyDown={onKeyDown}>\n <header className={styles.pickerHead}>\n <h3 className={styles.pickerTitle}>{chosen ? chosen.name : 'Run command workflow'}</h3>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose}>Close</Button>\n </header>\n {chosen ? (\n <>\n {chosen.description ? <p className={styles.meta}>{chosen.description}</p> : null}\n <CommandWorkflowForm\n key={`${chosen.id}:${chosen.latest}`}\n name={chosen.name}\n template={chosen.command.template}\n params={chosen.command.params}\n onCancel={back}\n cancelLabel=\"Back\"\n onPaste={(text) => {\n onPaste(text);\n onClose();\n }}\n />\n </>\n ) : reason ? (\n <p className={styles.banner} data-tone=\"danger\">{reason}</p>\n ) : read.data === undefined ? (\n <div aria-busy=\"true\" aria-label=\"Loading command workflows\">\n <SkeletonLine width=\"60%\" />\n <SkeletonLine width=\"40%\" />\n </div>\n ) : workflows.length === 0 ? (\n <div className={styles.pickerEmpty}>\n <p className={styles.meta}>\n No command workflows yet. A command workflow is a shell command with <code>{'{{param:default}}'}</code> holes you fill in, then paste here.\n </p>\n <Button variant=\"subtle\" size=\"sm\" onClick={() => { setVerseSection('playbooks'); onClose(); }}>Open Playbooks</Button>\n </div>\n ) : (\n <>\n <input\n ref={filterRef}\n className={styles.filter}\n type=\"search\"\n value={filter}\n placeholder=\"Filter command workflows\"\n aria-label=\"Filter command workflows\"\n autoFocus\n onChange={(e) => setFilter(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && visible[0]) {\n e.preventDefault();\n setChosenId(visible[0].id);\n }\n }}\n />\n <ul className={styles.pickerList}>\n {visible.map((w) => (\n <li key={w.id}>\n <button type=\"button\" onClick={() => setChosenId(w.id)}>\n <span className={styles.rowName}>{w.name}</span>\n <code className={styles.rowCommand}>{w.command.template.split('\\n')[0]}</code>\n </button>\n </li>\n ))}\n {visible.length === 0 ? <li className={styles.meta}>No command workflow matches “{filter}”.</li> : null}\n </ul>\n </>\n )}\n </section>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{t as r}from"./Dialog-r4j4R4b6.js";import{j as i}from"./verse-model-DAOz9LrY.js";import{t as a}from"./MessageMarkdown-CQEqoMvf.js";import{r as o}from"./useVerseSession-BOyvOEDi.js";import{t as s}from"./useVerseTranscript-BOhcfdp7.js";import{c,i as l,p as u,s as d,t as f,u as p}from"./multimodel-flows-CzI-yHg5.js";import{t as m}from"./multimodel.module-ZpbCvfp1.js";var h=e(n(),1),g=t(),_=8;function v(e){return{seatId:e.seatId,model:e.model,label:e.label,engine:e.engine}}function y(e){return e.map(e=>({key:e.target.seatId,label:e.target.label,engine:e.target.engine,seatId:e.target.seatId,model:e.target.model,sessionId:e.sessionId,error:e.ok?null:e.error}))}function b(e){let t=(0,h.useId)(),{source:n,advice:i}=e,a=(0,h.useMemo)(()=>p(e.mode===`compare`?e.prompt:e.question??``).kind,[e]),o=(0,h.useMemo)(()=>{let t=i?[...i.choice?[i.choice]:[],...i.alternatives]:[];return t.length>0?t:e.advisorSeats.filter(e=>e.model).map(e=>({seatId:e.seatId,label:e.label,engine:e.engine,model:e.model,local:e.local,note:e.local?`free · local`:``}))},[i,e.advisorSeats]),s=e.mode===`compare`&&e.maxSeats?Math.max(2,Math.min(e.maxSeats,_)):3,[b,S]=(0,h.useState)(()=>e.mode===`compare`&&e.selectAll?o.slice(0,s).map(e=>e.seatId):u(i?.choice??null,o).map(e=>e.seatId)),[C,w]=(0,h.useState)(null),[T,E]=(0,h.useState)(!1),[D,O]=(0,h.useState)(null),k=(0,h.useRef)(!1);(0,h.useEffect)(()=>{if(e.mode!==`review`||k.current)return;k.current=!0;let t=e.reviewer,r={key:`original`,label:e.authorLabel,engine:n.engine,seatId:n.seatId,model:n.model,sessionId:null,error:null,staticText:e.answer};w([r,{key:t.seatId,label:t.label,engine:t.engine,seatId:t.seatId,model:t.model,sessionId:null,error:null}]),E(!0),c(f,{source:n,reviewer:v(t),question:e.question,answer:e.answer,authorLabel:e.authorLabel}).then(e=>w(n=>n?.map(n=>n.key===t.seatId?{...n,sessionId:e.id}:n)??null)).catch(e=>w(n=>n?.map(n=>n.key===t.seatId?{...n,error:e instanceof Error?e.message:`The review could not start.`}:n)??null)).finally(()=>E(!1))},[e,n]);async function A(){if(e.mode!==`compare`)return;let t=o.filter(e=>b.includes(e.seatId)).map(v);if(t.length<2){O(`Pick at least two seats to compare.`);return}E(!0),O(null),w(t.map(e=>({key:e.seatId,label:e.label,engine:e.engine,seatId:e.seatId,model:e.model,sessionId:null,error:null})));try{let r=await d(f,{source:n,targets:t,text:e.prompt});w(y(r)),r.some(e=>e.ok)&&e.onStarted()}catch(e){O(e instanceof Error?e.message:`Compare could not start.`)}finally{E(!1)}}function j(e){S(t=>t.includes(e)?t.filter(t=>t!==e):t.length>=s?t:[...t,e])}async function M(t){if(!t.sessionId||!C)return;let n=C.filter(e=>e.sessionId&&!e.staticText).map(e=>({sessionId:e.sessionId,seatId:e.seatId,engine:e.engine,...e.model?{model:e.model}:{}}));await l(f,{winnerSessionId:t.sessionId,entries:n,kind:a}),e.onClose()}let N=e.mode===`compare`?`Compare answers`:`Review by ${e.reviewer.label}`,P=e.mode===`compare`?n.turnCount>0?`Each seat gets this chat’s handoff note (built here, free) and your message, in its own chat on the same folders.`:`Each seat gets your message in its own chat on the same folders.`:`A different model family reviews ${e.authorLabel}’s last answer. It may read the repository but changes nothing.`;return(0,g.jsx)(r,{open:!0,onClose:e.onClose,titleId:t,title:N,description:P,widthClassName:m.dialog,children:C===null&&e.mode===`compare`?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`ul`,{className:m.pickList,"aria-label":`Seats to compare`,children:o.map(e=>(0,g.jsxs)(`li`,{className:m.pickRow,children:[(0,g.jsxs)(`label`,{children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:b.includes(e.seatId),onChange:()=>j(e.seatId),disabled:!b.includes(e.seatId)&&b.length>=s}),` `,e.label]}),(0,g.jsx)(`span`,{className:m.pickNote,children:e.note})]},e.seatId))}),D?(0,g.jsx)(`p`,{className:m.noticeError,role:`alert`,children:D}):null,(0,g.jsxs)(`div`,{className:m.footer,children:[(0,g.jsx)(`button`,{type:`button`,className:m.secondary,onClick:e.onClose,children:`Cancel`}),(0,g.jsxs)(`button`,{type:`button`,className:m.primary,disabled:T||b.length<2,onClick:()=>{A()},children:[`Send to `,b.length,` seats`]})]})]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`div`,{className:m.columns,children:(C??[]).map(t=>(0,g.jsx)(x,{column:t,canChoose:e.mode===`compare`,onChoose:()=>{M(t)}},t.key))}),D?(0,g.jsx)(`p`,{className:m.noticeError,role:`alert`,children:D}):null,(0,g.jsx)(`div`,{className:m.footer,children:(0,g.jsx)(`button`,{type:`button`,className:m.secondary,onClick:e.onClose,children:T?`Close (keeps running)`:`Close`})})]})})}function x({column:e,canChoose:t,onChoose:n}){let r=o(e.staticText===void 0?e.sessionId:null),c=s(e.staticText===void 0?e.sessionId:null),l=e.staticText??c.items.flatMap(e=>e.kind===`assistant`?[e.text]:[]).join(`
|
|
2
|
-
|
|
3
|
-
`),u=e.staticText===void 0&&c.live,d=c.items.find(e=>e.kind===`error`),f=r.session?.usage,p=e.error?`Could not start: ${e.error}`:e.staticText===void 0?e.sessionId===null?`Starting…`:d?.kind===`error`?`Failed: ${d.message}`:u?`Answering…`:l?`Done`:`Waiting…`:`The answer under review`;return(0,g.jsxs)(`section`,{className:m.column,"aria-label":e.label,"aria-busy":u||void 0,children:[(0,g.jsxs)(`header`,{className:m.columnHead,children:[(0,g.jsx)(`span`,{className:m.columnTitle,children:e.label}),(0,g.jsxs)(`span`,{className:m.columnMeta,children:[e.engine===`local`?`on this Mac · `:``,f&&f.outputTokens>0?`${i(f.inputTokens+f.outputTokens)} tok · `:``,p]})]}),(0,g.jsx)(`div`,{className:m.columnBody,children:l?(0,g.jsx)(a,{text:l,streaming:u}):null}),t&&e.sessionId&&!e.error?(0,g.jsx)(`div`,{className:m.columnActions,children:(0,g.jsx)(`button`,{type:`button`,className:m.secondary,disabled:u||!l,onClick:n,children:`Continue with this`})}):null]})}export{b as CompareDialog};
|
|
4
|
-
//# sourceMappingURL=CompareDialog-CaopnGI0.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CompareDialog-CaopnGI0.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/multimodel/CompareDialog.tsx"],"sourcesContent":["/**\n * routes/verse/multimodel/CompareDialog.tsx — answers side by side.\n *\n * COMPARE: pick 2–3 seats (default: the Auto choice plus the best seat of\n * each other engine, one local model when there is one — typically Claude +\n * Codex + local), then send. Each seat gets a real chat on the same folders,\n * linked to this one, with the zero-spend handoff note first when this chat\n * already has turns. Answers stream into columns; \"Continue with this\" opens\n * that chat (its context is already there) and records the pick, which the\n * Auto seat learns from.\n *\n * REVIEW: one cross-family reviewer on the last answer, side by side with it.\n *\n * Every chat here is created and every turn sent through the ordinary session\n * routes (multimodel-flows.ts), so the gates that apply to a typed message\n * apply to each of these. Nothing is sent until the operator presses the\n * button that says how many seats it goes to.\n */\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { VerseSeat, VerseSession } from '../../../data/api-types.js';\nimport { classifyPrompt } from '../../../../core/verse/multimodel/classify.js';\nimport { COMPARE_MAX_SEATS, defaultCompareSet, type FanOutEntry } from '../../../../core/verse/multimodel/compare.js';\nimport type { AdvisorSeat } from '../../../../core/verse/multimodel/advisor.js';\nimport type { SeatAdvice, SeatAdviceOption } from '../../../../core/verse/multimodel/types.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { MessageMarkdown } from '../MessageMarkdown.js';\nimport { useVerseSession } from '../useVerseSession.js';\nimport { useVerseTranscript } from '../useVerseTranscript.js';\nimport { formatTokens } from '../verse-readouts.js';\nimport { DEFAULT_FLOW_API, pickWinner, startCompare, startReview, type FlowTarget } from './multimodel-flows.js';\nimport styles from './multimodel.module.css';\n\n/**\n * `selectAll` (3.15, the terminal's \"Ask all\"): every candidate seat starts\n * chosen and the cap rises to `maxSeats` — the operator still presses the\n * button that says how many seats it goes to.\n */\ntype CompareProps = { mode: 'compare'; prompt: string; selectAll?: boolean; maxSeats?: number };\ntype ReviewProps = { mode: 'review'; reviewer: SeatAdviceOption; question: string | null; answer: string; authorLabel: string };\n\nexport type CompareDialogProps = (CompareProps | ReviewProps) & {\n source: VerseSession;\n seats: readonly VerseSeat[];\n advisorSeats: readonly AdvisorSeat[];\n advice: SeatAdvice | null;\n /** The prompt left the composer (compare sent). */\n onStarted(): void;\n onClose(): void;\n};\n\ninterface Column {\n key: string;\n label: string;\n engine: string;\n seatId: string;\n model: string | null;\n sessionId: string | null;\n error: string | null;\n /** A fixed text (the answer under review) instead of a live chat. */\n staticText?: string;\n}\n\n/** \"Ask all\" from the terminal: every ready seat, within reason (each is a real chat and a real turn). */\nconst COMPARE_ALL_MAX_SEATS = 8;\n\nfunction toTarget(o: SeatAdviceOption): FlowTarget {\n return { seatId: o.seatId, model: o.model, label: o.label, engine: o.engine };\n}\n\nfunction columnsFrom(entries: readonly FanOutEntry[]): Column[] {\n return entries.map((e) => ({\n key: e.target.seatId,\n label: e.target.label,\n engine: e.target.engine,\n seatId: e.target.seatId,\n model: e.target.model,\n sessionId: e.sessionId,\n error: e.ok ? null : e.error,\n }));\n}\n\nexport function CompareDialog(props: CompareDialogProps) {\n const titleId = useId();\n const { source, advice } = props;\n const kind = useMemo(() => classifyPrompt(props.mode === 'compare' ? props.prompt : props.question ?? '').kind, [props]);\n\n // Candidates: every seat the advisor could use for this chat (local-only repos: local seats only).\n const candidates: SeatAdviceOption[] = useMemo(() => {\n const ranked = advice ? [...(advice.choice ? [advice.choice] : []), ...advice.alternatives] : [];\n return ranked.length > 0 ? ranked : props.advisorSeats.filter((s) => s.model).map((s) => ({\n seatId: s.seatId, label: s.label, engine: s.engine, model: s.model, local: s.local, note: s.local ? 'free · local' : '',\n }));\n }, [advice, props.advisorSeats]);\n const maxSeats = props.mode === 'compare' && props.maxSeats ? Math.max(2, Math.min(props.maxSeats, COMPARE_ALL_MAX_SEATS)) : COMPARE_MAX_SEATS;\n const [chosen, setChosen] = useState<string[]>(() => (props.mode === 'compare' && props.selectAll\n ? candidates.slice(0, maxSeats).map((o) => o.seatId)\n : defaultCompareSet(advice?.choice ?? null, candidates).map((o) => o.seatId)));\n const [columns, setColumns] = useState<Column[] | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const started = useRef(false);\n\n // Review starts on open: the click that opened it was the consent, and its label named the seat.\n useEffect(() => {\n if (props.mode !== 'review' || started.current) return;\n started.current = true;\n const reviewer = props.reviewer;\n const original: Column = { key: 'original', label: props.authorLabel, engine: source.engine, seatId: source.seatId, model: source.model, sessionId: null, error: null, staticText: props.answer };\n setColumns([original, { key: reviewer.seatId, label: reviewer.label, engine: reviewer.engine, seatId: reviewer.seatId, model: reviewer.model, sessionId: null, error: null }]);\n setBusy(true);\n void startReview(DEFAULT_FLOW_API, { source, reviewer: toTarget(reviewer), question: props.question, answer: props.answer, authorLabel: props.authorLabel })\n .then((session) => setColumns((cols) => cols?.map((c) => (c.key === reviewer.seatId ? { ...c, sessionId: session.id } : c)) ?? null))\n .catch((err: unknown) => setColumns((cols) => cols?.map((c) => (c.key === reviewer.seatId ? { ...c, error: err instanceof Error ? err.message : 'The review could not start.' } : c)) ?? null))\n .finally(() => setBusy(false));\n }, [props, source]);\n\n async function send() {\n if (props.mode !== 'compare') return;\n const targets = candidates.filter((c) => chosen.includes(c.seatId)).map(toTarget);\n if (targets.length < 2) {\n setError('Pick at least two seats to compare.');\n return;\n }\n setBusy(true);\n setError(null);\n setColumns(targets.map((t) => ({ key: t.seatId, label: t.label, engine: t.engine, seatId: t.seatId, model: t.model, sessionId: null, error: null })));\n try {\n const entries = await startCompare(DEFAULT_FLOW_API, { source, targets, text: props.prompt });\n setColumns(columnsFrom(entries));\n if (entries.some((e) => e.ok)) props.onStarted();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Compare could not start.');\n } finally {\n setBusy(false);\n }\n }\n\n function toggle(seatId: string) {\n setChosen((cur) => (cur.includes(seatId) ? cur.filter((id) => id !== seatId) : cur.length >= maxSeats ? cur : [...cur, seatId]));\n }\n\n async function choose(column: Column) {\n if (!column.sessionId || !columns) return;\n const entries = columns.filter((c) => c.sessionId && !c.staticText).map((c) => ({ sessionId: c.sessionId!, seatId: c.seatId, engine: c.engine, ...(c.model ? { model: c.model } : {}) }));\n await pickWinner(DEFAULT_FLOW_API, { winnerSessionId: column.sessionId, entries, kind });\n props.onClose();\n }\n\n const title = props.mode === 'compare' ? 'Compare answers' : `Review by ${props.reviewer.label}`;\n const description = props.mode === 'compare'\n ? (source.turnCount > 0\n ? 'Each seat gets this chat’s handoff note (built here, free) and your message, in its own chat on the same folders.'\n : 'Each seat gets your message in its own chat on the same folders.')\n : `A different model family reviews ${props.authorLabel}’s last answer. It may read the repository but changes nothing.`;\n\n return (\n <Dialog open onClose={props.onClose} titleId={titleId} title={title} description={description} widthClassName={styles.dialog}>\n {columns === null && props.mode === 'compare' ? (\n <>\n <ul className={styles.pickList} aria-label=\"Seats to compare\">\n {candidates.map((c) => (\n <li key={c.seatId} className={styles.pickRow}>\n <label>\n <input type=\"checkbox\" checked={chosen.includes(c.seatId)} onChange={() => toggle(c.seatId)}\n disabled={!chosen.includes(c.seatId) && chosen.length >= maxSeats} />\n {' '}{c.label}\n </label>\n <span className={styles.pickNote}>{c.note}</span>\n </li>\n ))}\n </ul>\n {error ? <p className={styles.noticeError} role=\"alert\">{error}</p> : null}\n <div className={styles.footer}>\n <button type=\"button\" className={styles.secondary} onClick={props.onClose}>Cancel</button>\n <button type=\"button\" className={styles.primary} disabled={busy || chosen.length < 2} onClick={() => { void send(); }}>\n Send to {chosen.length} seats\n </button>\n </div>\n </>\n ) : (\n <>\n <div className={styles.columns}>\n {(columns ?? []).map((c) => (\n <AnswerColumn key={c.key} column={c} canChoose={props.mode === 'compare'} onChoose={() => { void choose(c); }} />\n ))}\n </div>\n {error ? <p className={styles.noticeError} role=\"alert\">{error}</p> : null}\n <div className={styles.footer}>\n <button type=\"button\" className={styles.secondary} onClick={props.onClose}>{busy ? 'Close (keeps running)' : 'Close'}</button>\n </div>\n </>\n )}\n </Dialog>\n );\n}\n\nfunction AnswerColumn({ column, canChoose, onChoose }: { column: Column; canChoose: boolean; onChoose(): void }) {\n // Subscribing opens the chat's stream; a static column subscribes to nothing.\n const head = useVerseSession(column.staticText === undefined ? column.sessionId : null);\n const transcript = useVerseTranscript(column.staticText === undefined ? column.sessionId : null);\n const answer = column.staticText ?? transcript.items.flatMap((it) => (it.kind === 'assistant' ? [it.text] : [])).join('\\n\\n');\n const streaming = column.staticText === undefined && transcript.live;\n const failed = transcript.items.find((it) => it.kind === 'error');\n const usage = head.session?.usage;\n const status = column.error ? `Could not start: ${column.error}`\n : column.staticText !== undefined ? 'The answer under review'\n : column.sessionId === null ? 'Starting…'\n : failed?.kind === 'error' ? `Failed: ${failed.message}`\n : streaming ? 'Answering…' : answer ? 'Done' : 'Waiting…';\n return (\n <section className={styles.column} aria-label={column.label} aria-busy={streaming || undefined}>\n <header className={styles.columnHead}>\n <span className={styles.columnTitle}>{column.label}</span>\n <span className={styles.columnMeta}>\n {column.engine === 'local' ? 'on this Mac · ' : ''}\n {usage && usage.outputTokens > 0 ? `${formatTokens(usage.inputTokens + usage.outputTokens)} tok · ` : ''}\n {status}\n </span>\n </header>\n <div className={styles.columnBody}>\n {answer ? <MessageMarkdown text={answer} streaming={streaming} /> : null}\n </div>\n {canChoose && column.sessionId && !column.error ? (\n <div className={styles.columnActions}>\n <button type=\"button\" className={styles.secondary} disabled={streaming || !answer} onClick={onChoose}>Continue with this</button>\n </div>\n ) : null}\n </section>\n );\n}\n"],"mappings":"4eA+DM,EAAwB,EAE9B,SAAS,EAAS,EAAiC,CACjD,MAAO,CAAE,OAAQ,EAAE,OAAQ,MAAO,EAAE,MAAO,MAAO,EAAE,MAAO,OAAQ,EAAE,MAAO,CAC9E,CAEA,SAAS,EAAY,EAA2C,CAC9D,OAAO,EAAQ,IAAK,IAAO,CACzB,IAAK,EAAE,OAAO,OACd,MAAO,EAAE,OAAO,MAChB,OAAQ,EAAE,OAAO,OACjB,OAAQ,EAAE,OAAO,OACjB,MAAO,EAAE,OAAO,MAChB,UAAW,EAAE,UACb,MAAO,EAAE,GAAK,KAAO,EAAE,KACzB,EAAE,CACJ,CAEA,SAAgB,EAAc,EAA2B,CACvD,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,CAAE,SAAQ,UAAW,EACrB,GAAA,EAAO,EAAA,QAAA,KAAc,EAAe,EAAM,OAAS,UAAY,EAAM,OAAS,EAAM,UAAY,EAAE,CAAC,CAAC,KAAM,CAAC,CAAK,CAAC,EAGjH,GAAA,EAAiC,EAAA,QAAA,KAAc,CACnD,IAAM,EAAS,EAAS,CAAC,GAAI,EAAO,OAAS,CAAC,EAAO,MAAM,EAAI,CAAC,EAAI,GAAG,EAAO,YAAY,EAAI,CAAC,EAC/F,OAAO,EAAO,OAAS,EAAI,EAAS,EAAM,aAAa,OAAQ,GAAM,EAAE,KAAK,CAAC,CAAC,IAAK,IAAO,CACxF,OAAQ,EAAE,OAAQ,MAAO,EAAE,MAAO,OAAQ,EAAE,OAAQ,MAAO,EAAE,MAAO,MAAO,EAAE,MAAO,KAAM,EAAE,MAAQ,eAAiB,EACvH,EAAE,CACJ,EAAG,CAAC,EAAQ,EAAM,YAAY,CAAC,EACzB,EAAW,EAAM,OAAS,WAAa,EAAM,SAAW,KAAK,IAAI,EAAG,KAAK,IAAI,EAAM,SAAU,CAAqB,CAAC,EAAA,EACnH,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,KAA0B,EAAM,OAAS,WAAa,EAAM,UACpF,EAAW,MAAM,EAAG,CAAQ,CAAC,CAAC,IAAK,GAAM,EAAE,MAAM,EACjD,EAAkB,GAAQ,QAAU,KAAM,CAAU,CAAC,CAAC,IAAK,GAAM,EAAE,MAAM,CAAE,EACzE,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAA0B,IAAI,EACtD,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAwB,IAAI,EAChD,GAAA,EAAU,EAAA,OAAA,CAAO,EAAK,GAG5B,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,EAAM,OAAS,UAAY,EAAQ,QAAS,OAChD,EAAQ,QAAU,GAClB,IAAM,EAAW,EAAM,SACjB,EAAmB,CAAE,IAAK,WAAY,MAAO,EAAM,YAAa,OAAQ,EAAO,OAAQ,OAAQ,EAAO,OAAQ,MAAO,EAAO,MAAO,UAAW,KAAM,MAAO,KAAM,WAAY,EAAM,MAAO,EAChM,EAAW,CAAC,EAAU,CAAE,IAAK,EAAS,OAAQ,MAAO,EAAS,MAAO,OAAQ,EAAS,OAAQ,OAAQ,EAAS,OAAQ,MAAO,EAAS,MAAO,UAAW,KAAM,MAAO,IAAK,CAAC,CAAC,EAC7K,EAAQ,EAAI,EACZ,EAAiB,EAAkB,CAAE,SAAQ,SAAU,EAAS,CAAQ,EAAG,SAAU,EAAM,SAAU,OAAQ,EAAM,OAAQ,YAAa,EAAM,WAAY,CAAC,CAAC,CACzJ,KAAM,GAAY,EAAY,GAAS,GAAM,IAAK,GAAO,EAAE,MAAQ,EAAS,OAAS,CAAE,GAAG,EAAG,UAAW,EAAQ,EAAG,EAAI,CAAE,GAAK,IAAI,CAAC,CAAC,CACpI,MAAO,GAAiB,EAAY,GAAS,GAAM,IAAK,GAAO,EAAE,MAAQ,EAAS,OAAS,CAAE,GAAG,EAAG,MAAO,aAAe,MAAQ,EAAI,QAAU,6BAA8B,EAAI,CAAE,GAAK,IAAI,CAAC,CAAC,CAC9L,YAAc,EAAQ,EAAK,CAAC,CACjC,EAAG,CAAC,EAAO,CAAM,CAAC,EAElB,eAAe,GAAO,CACpB,GAAI,EAAM,OAAS,UAAW,OAC9B,IAAM,EAAU,EAAW,OAAQ,GAAM,EAAO,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAQ,EAChF,GAAI,EAAQ,OAAS,EAAG,CACtB,EAAS,qCAAqC,EAC9C,MACF,CACA,EAAQ,EAAI,EACZ,EAAS,IAAI,EACb,EAAW,EAAQ,IAAK,IAAO,CAAE,IAAK,EAAE,OAAQ,MAAO,EAAE,MAAO,OAAQ,EAAE,OAAQ,OAAQ,EAAE,OAAQ,MAAO,EAAE,MAAO,UAAW,KAAM,MAAO,IAAK,EAAE,CAAC,EACpJ,GAAI,CACF,IAAM,EAAU,MAAM,EAAa,EAAkB,CAAE,SAAQ,UAAS,KAAM,EAAM,MAAO,CAAC,EAC5F,EAAW,EAAY,CAAO,CAAC,EAC3B,EAAQ,KAAM,GAAM,EAAE,EAAE,GAAG,EAAM,UAAU,CACjD,OAAS,EAAK,CACZ,EAAS,aAAe,MAAQ,EAAI,QAAU,0BAA0B,CAC1E,QAAU,CACR,EAAQ,EAAK,CACf,CACF,CAEA,SAAS,EAAO,EAAgB,CAC9B,EAAW,GAAS,EAAI,SAAS,CAAM,EAAI,EAAI,OAAQ,GAAO,IAAO,CAAM,EAAI,EAAI,QAAU,EAAW,EAAM,CAAC,GAAG,EAAK,CAAM,CAAE,CACjI,CAEA,eAAe,EAAO,EAAgB,CACpC,GAAI,CAAC,EAAO,WAAa,CAAC,EAAS,OACnC,IAAM,EAAU,EAAQ,OAAQ,GAAM,EAAE,WAAa,CAAC,EAAE,UAAU,CAAC,CAAC,IAAK,IAAO,CAAE,UAAW,EAAE,UAAY,OAAQ,EAAE,OAAQ,OAAQ,EAAE,OAAQ,GAAI,EAAE,MAAQ,CAAE,MAAO,EAAE,KAAM,EAAI,CAAC,CAAG,EAAE,EACxL,MAAM,EAAW,EAAkB,CAAE,gBAAiB,EAAO,UAAW,UAAS,MAAK,CAAC,EACvF,EAAM,QAAQ,CAChB,CAEA,IAAM,EAAQ,EAAM,OAAS,UAAY,kBAAoB,aAAa,EAAM,SAAS,QACnF,EAAc,EAAM,OAAS,UAC9B,EAAO,UAAY,EAClB,oHACA,mEACF,oCAAoC,EAAM,YAAY,iEAE1D,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,KAAA,GAAK,QAAS,EAAM,QAAkB,UAAgB,QAAoB,cAAa,eAAgB,EAAO,OACnH,SAAA,IAAY,MAAQ,EAAM,OAAS,WAClC,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,SAAU,aAAW,mBACxC,SAAA,EAAW,IAAK,IACf,EAAA,EAAA,KAAA,CAAC,KAAD,CAAmB,UAAW,EAAO,QAArC,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,EAAO,SAAS,EAAE,MAAM,EAAG,aAAgB,EAAO,EAAE,MAAM,EACxF,SAAU,CAAC,EAAO,SAAS,EAAE,MAAM,GAAK,EAAO,QAAU,CAAW,CAAA,EACrE,IAAK,EAAE,KACH,CAAA,CAAA,GACP,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAW,SAAA,EAAE,IAAW,CAAA,CAC9C,CAPK,EAAA,EAAE,MAOP,CACL,CACC,CAAA,EACH,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAa,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MACtE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,UAAW,QAAS,EAAM,QAAS,SAAA,QAAc,CAAA,GACzF,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,QAAS,SAAU,GAAQ,EAAO,OAAS,EAAG,YAAe,CAAE,EAAU,CAAG,EAApH,SAAA,CAAuH,WAC5G,EAAO,OAAO,QACjB,CACL,CAAA,CAAA,GACL,CAAA,CAAA,GAEF,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QACnB,UAAA,GAAW,CAAC,EAAA,CAAG,IAAK,IACpB,EAAA,EAAA,IAAA,CAAC,EAAD,CAA0B,OAAQ,EAAG,UAAW,EAAM,OAAS,UAAW,aAAgB,CAAE,EAAY,CAAC,CAAG,CAAI,EAA7F,EAAE,GAA2F,CACjH,CACE,CAAA,EACJ,GAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAa,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,MACtE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OACrB,UAAA,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,UAAW,QAAS,EAAM,QAAU,SAAA,EAAO,wBAA0B,OAAgB,CAAA,CAC1H,CAAA,CACL,CAAA,CAAA,CAEE,CAAA,CAEZ,CAEA,SAAS,EAAa,CAAE,SAAQ,YAAW,YAAsE,CAE/G,IAAM,EAAO,EAAgB,EAAO,aAAe,IAAA,GAAY,EAAO,UAAY,IAAI,EAChF,EAAa,EAAmB,EAAO,aAAe,IAAA,GAAY,EAAO,UAAY,IAAI,EACzF,EAAS,EAAO,YAAc,EAAW,MAAM,QAAS,GAAQ,EAAG,OAAS,YAAc,CAAC,EAAG,IAAI,EAAI,CAAC,CAAE,CAAC,CAAC,KAAK;;CAAM,EACtH,EAAY,EAAO,aAAe,IAAA,IAAa,EAAW,KAC1D,EAAS,EAAW,MAAM,KAAM,GAAO,EAAG,OAAS,OAAO,EAC1D,EAAQ,EAAK,SAAS,MACtB,EAAS,EAAO,MAAQ,oBAAoB,EAAO,QACrD,EAAO,aAAe,IAAA,GACpB,EAAO,YAAc,KAAO,YAC1B,GAAQ,OAAS,QAAU,WAAW,EAAO,UAC3C,EAAY,aAAe,EAAS,OAAS,WAHjB,0BAItC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,OAAQ,aAAY,EAAO,MAAO,YAAW,GAAa,IAAA,GAArF,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,WAA1B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,EAAO,KAAY,CAAA,GACzD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,WAAxB,SAAA,CACG,EAAO,SAAW,QAAU,iBAAmB,GAC/C,GAAS,EAAM,aAAe,EAAI,GAAG,EAAa,EAAM,YAAc,EAAM,YAAY,EAAE,SAAW,GACrG,CACG,CACA,CAAA,CAAA,KACR,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,WACpB,SAAA,GAAS,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,KAAM,EAAmB,WAAY,CAAA,EAAI,IACjE,CAAA,EACJ,GAAa,EAAO,WAAa,CAAC,EAAO,OACxC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,cACrB,UAAA,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,UAAW,SAAU,GAAa,CAAC,EAAQ,QAAS,EAAU,SAAA,oBAA0B,CAAA,CAC7H,CAAA,EACH,IACG,GAEb"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,o as n,s as r}from"./index-DOAOxiKl.js";import{C as i,M as a,T as o,a as s,i as c,t as l}from"./global-BJ_kVFpD.js";import{t as u}from"./focus-trap-B1vuEhZX.js";import{r as d}from"./VerseShared-CH8mV5ew.js";import{i as f}from"./verse-store-DAqqNIyD.js";var p=e(r(),1),m=e(n(),1),h=`/api/verse/computer`,g=`${h}/state`,_=`${h}/commands`,v=`${h}/result`,y=`${h}/revoke`,b=`${h}/kill`,x={read:0,click:1,full:2};function S(e){return x[e]}function C(e){return e===`read`||e===`click`||e===`full`}var w=RegExp(`(^|[^a-z])(${[...`delete.remove.erase.trash.discard.send.reply.forward.post.share.tweet.pay.payment.purchase.checkout.check out.order.place order.subscribe.transfer.donate.publish.deploy.release.merge.submit.confirm.approve.authorize.accept.buy`.split(`.`)].sort((e,t)=>t.length-e.length).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`).replace(/ /g,`\\s+`)).join(`|`)})([^a-z]|$)`,`i`);function T(e){if(typeof e!=`string`||!e.trim())return null;let t=w.exec(e.normalize(`NFKC`));return t?t[2].toLowerCase().replace(/\s+/g,` `):null}var E=/^cc_[A-Za-z0-9_-]{12}$/,D=2e4;async function O(e,t,n){let r=i();if(!r)throw new d;let o=await s(e,t,r,n);return a(),o}function k(e){return e instanceof l&&e.status===404&&e.code===`VERSE_COMPUTER_COMMAND_GONE`}var A={commands:e=>c(`${_}?wait=${D}`,e),result:async e=>{try{await O(v,e)}catch(e){if(k(e))return;throw e}},state:e=>c(g,e),revoke:(e,t)=>O(y,t?{sessionId:e,bundleId:t}:{sessionId:e}),kill:()=>O(b,{}),canWrite:()=>o()},j=`ashlr:computer`,M=6e4,ee=500;function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var te=new Set([`no-permission`,`operator-took-over`,`stopped`,`not-granted`,`tier`,`denied`,`secure-field`,`out-of-bounds`,`not-found`,`stale-ref`,`unsupported`,`invalid`,`busy`,`timeout`,`failed`]),ne=new Set([`idle`,`active`,`paused`,`killed`]),re=new Set([`operator-input`,`escape`,`kill`,`resume`,`idle`]);function P(e){try{let t=e?.__ASHLR_DESKTOP__?.computer;return N(t)?t:null}catch{return null}}function ie(e=typeof window>`u`?void 0:window){let t=P(e);return!t||typeof t.send!=`function`||(typeof t.version==`number`?t.version:0)<1?!1:N(t.capabilities)&&t.capabilities.supported===!0}function ae(e){if(!N(e))return null;if(e.kind===`result`){let t=e.req;return typeof t!=`string`||t.length===0||t.length>64?null:e.ok===!0?{kind:`result`,req:t,ok:!0,data:e.data}:{kind:`result`,req:t,ok:!1,code:typeof e.code==`string`&&te.has(e.code)?e.code:`failed`,error:typeof e.error==`string`&&e.error.trim()?e.error.slice(0,ee):`The desktop app could not do that.`}}if(e.kind===`state`){let t=e.state;if(typeof t!=`string`||!ne.has(t))return null;let n={kind:`state`,state:t};return typeof e.app==`string`&&e.app.trim()&&(n.app=e.app.slice(0,120)),typeof e.reason==`string`&&re.has(e.reason)&&(n.reason=e.reason),n}return null}function F(e,t){let n=t=>{let n=ae(t.detail);n&&e(n)};return t.addEventListener(j,n),()=>t.removeEventListener(j,n)}function oe(e=window){if(!ie(e))return null;let t=P(e),n=t.version,r=t.send,i=e=>{try{return r(e)===!0}catch{return!1}};return{version:n,send:i,request(t,n=M){return new Promise(r=>{let a=!1,o=null,s=e=>{a||(a=!0,o!==null&&clearTimeout(o),c(),r(e))},c=F(e=>{e.kind===`result`&&e.req===t.req&&s(e)},e);o=setTimeout(()=>s({kind:`result`,req:t.req,ok:!1,code:`timeout`,error:`The desktop app did not answer in time.`}),n),i(t)||s({kind:`result`,req:t.req,ok:!1,code:`failed`,error:`The desktop app refused the request.`})})},onState(t){return F(e=>{e.kind===`state`&&t(e)},e)}}}function I(e=Math.random){let t=`cc_`,n=new Uint8Array(12);try{globalThis.crypto.getRandomValues(n)}catch{for(let t=0;t<n.length;t++)n[t]=Math.floor(e()*256)}for(let e of n)t+=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`[e&63];return t}var L={screen:`unknown`,accessibility:`unknown`};function R(e){return e===!0||e===`granted`||e===`authorized`||e===`allowed`?`granted`:e===!1||e===`denied`||e===`missing`||e===`not-determined`||e===`notDetermined`||e===`restricted`?`missing`:N(e)?R(e.granted??e.status):`unknown`}function z(e){if(!N(e))return L;let t=N(e.permissions)?e.permissions:e;return{screen:R(t.screen??t.screenRecording??t[`screen-recording`]),accessibility:R(t.accessibility)}}function se(e){return e.screen===`missing`||e.accessibility===`missing`}var ce=2e3,le=3e4,B=3e3,ue=500,V=3,de=new Set([`permissions`,`list-apps`,`screenshot`,`zoom`,`ax-tree`,`probe`,`ax-press`,`click`,`type`,`key`,`scroll`,`drag`,`kill`]);function fe(e,t){return new Promise(n=>{if(t.aborted)return n();let r=setTimeout(i,e);function i(){clearTimeout(r),t.removeEventListener(`abort`,i),n()}t.addEventListener(`abort`,i)})}function H(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function pe(e){return H(e)&&typeof e.id==`string`&&E.test(e.id)?e.id:null}function U(e,t,n){return{id:e,ok:!1,code:t,error:n}}function me(e,t){let n=new Map(e.map(e=>[e.bundleId,e])),r=[],i=new Set;for(let e of t){let t=n.get(e.bundleId);t&&t.tier!==null&&!i.has(t.bundleId)&&C(e.tier)&&(i.add(t.bundleId),r.push({bundleId:t.bundleId,tier:S(e.tier)<=S(t.tier)?e.tier:t.tier}))}return r}function he(e){let{api:t,native:n}=e,r=e.sleep??fe,i=e.nativeTimeoutMs??6e4,a=new AbortController,o=a.signal,s=new Set,c=new Set,l=new Map;function u(e){if(s.has(e))return!1;if(s.add(e),s.size>ue){let e=s.values().next().value;e!==void 0&&s.delete(e)}return!0}async function f(e){if(!c.has(e.id)){c.add(e.id),l.delete(e.id);for(let n=1;n<=V;n++)try{await t.result(e);return}catch(e){if(e instanceof d||n===V){console.warn(`[verse] computer result not delivered`,e instanceof Error?e.message:e);return}await r(1e3*n,new AbortController().signal)}}}async function p(){let t=await n.request({op:`permissions`,req:I()},i);if(!t.ok)return;let r=z(t.data);se(r)&&e.onNeedsPermissions(r)}async function m(t,r){if(!H(r)||typeof r.op!=`string`||!de.has(r.op)){await f(U(t,`invalid`,`The Verse window does not relay that desktop operation.`));return}if(!(`req`in r)){await f(n.send(r)?{id:t,ok:!0,data:null}:U(t,`failed`,`The desktop app refused the request.`));return}let a=typeof r.req==`string`&&r.req?r:{...r,req:t},o=await n.request(a,i);if(o.ok){await f({id:t,ok:!0,data:o.data});return}o.code===`no-permission`&&e.onNeedsPermissions(null),await f({id:t,ok:!1,code:o.code,error:o.error})}function h(t){let n=pe(t);if(!n||!u(n)||c.has(n))return;let r=t,i=typeof r.sessionId==`string`?r.sessionId:``,a=typeof r.createdAt==`string`?r.createdAt:``;switch(r.kind){case`native`:m(n,r.op);return;case`access`:{if(!Array.isArray(r.apps)){f(U(n,`invalid`,`The access request was malformed.`));return}let t={kind:`access`,id:n,sessionId:i,apps:r.apps.filter(e=>H(e)&&typeof e.bundleId==`string`),reason:typeof r.reason==`string`?r.reason:``,createdAt:a};l.set(n,t),e.onPrompt(t);return}case`confirm`:{if(!H(r.confirm)){f(U(n,`invalid`,`The confirmation request was malformed.`));return}let t={kind:`confirm`,id:n,sessionId:i,confirm:r.confirm,createdAt:a};l.set(n,t),e.onPrompt(t);return}default:f(U(n,`unsupported`,`This Verse window does not understand that command. Update Ashlr.`))}}async function g(){let n=0;for(;!o.aborted;){if(!t.canWrite()){await r(B,o);continue}try{let r=await t.commands(o);if(o.aborted)break;n=0;let i=H(r)&&Array.isArray(r.commands)?r.commands:[];for(let e of i)h(e);i.length>0&&e.onActivity?.()}catch(e){if(o.aborted)break;if(e instanceof d){await r(B,o);continue}n=n===0?ce:Math.min(n*2,le),await r(n,o)}}}return g(),{stop(){a.abort()},async answerAccess(e,t){let r=l.get(e);if(!r||r.kind!==`access`||c.has(e))return;let i=t?me(r.apps,t):[];if(i.length===0){await f({id:e,ok:!1,error:`The operator declined.`});return}await f({id:e,ok:!0,data:{approved:i}}),n.send({op:`arm`}),await p()},async answerConfirm(e,t){let n=l.get(e);n&&n.kind===`confirm`&&!c.has(e)&&await f({id:e,ok:!0,data:{decision:t===`once`||t===`chat`?t:`deny`}})},forgetPrompts(){let e=[...l.keys()];for(let t of e)c.add(t);return l.clear(),e}}}var W={backdrop:`_backdrop_4k9ez_6`,fade:`_fade_4k9ez_1`,sheet:`_sheet_4k9ez_18`,rise:`_rise_4k9ez_1`,title:`_title_4k9ez_34`,meta:`_meta_4k9ez_43`,body:`_body_4k9ez_44`,why:`_why_4k9ez_45`,queued:`_queued_4k9ez_46`,footnote:`_footnote_4k9ez_47`,chat:`_chat_4k9ez_53`,quote:`_quote_4k9ez_58`,quoteLabel:`_quoteLabel_4k9ez_63`,legend:`_legend_4k9ez_64`,quoteText:`_quoteText_4k9ez_72`,apps:`_apps_4k9ez_81`,appRow:`_appRow_4k9ez_91`,check:`_check_4k9ez_101`,appText:`_appText_4k9ez_103`,appHead:`_appHead_4k9ez_105`,appName:`_appName_4k9ez_106`,appReason:`_appReason_4k9ez_107`,notRunning:`_notRunning_4k9ez_108`,tier:`_tier_4k9ez_110`,summary:`_summary_4k9ez_123`,permissions:`_permissions_4k9ez_135`,notes:`_notes_4k9ez_136`,permissionRow:`_permissionRow_4k9ez_138`,permissionText:`_permissionText_4k9ez_148`,status:`_status_4k9ez_149`,actions:`_actions_4k9ez_161`,primary:`_primary_4k9ez_163`,secondary:`_secondary_4k9ez_164`,pillButton:`_pillButton_4k9ez_165`,kill:`_kill_4k9ez_166`,pillWrap:`_pillWrap_4k9ez_189`,pill:`_pill_4k9ez_165`,pillText:`_pillText_4k9ez_213`,dot:`_dot_4k9ez_214`,pulse:`_pulse_4k9ez_1`,notice:`_notice_4k9ez_240`,grants:`_grants_4k9ez_251`,grantChat:`_grantChat_4k9ez_263`,grantChatTitle:`_grantChatTitle_4k9ez_264`,grantList:`_grantList_4k9ez_271`,grantRow:`_grantRow_4k9ez_272`},G=t(),K=6e3,q=15e3,ge=3e3,_e=600,J=80,Y=240,ve=300,ye=60;function be(e){try{let t=f(e).session?.title;return typeof t==`string`&&t.trim()?t:null}catch{return null}}var xe={api:A,native:()=>oe(),titleOf:be,now:()=>Date.now()};function X(e,t){if(typeof e!=`string`)return``;let n=e.replace(/[\u0000-\u0008\u000b-\u001f\u007f\u200b-\u200f\u202a-\u202e\u2066-\u2069]/g,``).replace(/[ \t]+/g,` `).trim();return n.length>t?`${n.slice(0,t-1).trimEnd()}…`:n}var Z={read:`Read only`,click:`Click only`,full:`Full control`};function Se(e){return e?Z[e]:`Never available`}function Q(e){return e instanceof Error&&e.message?X(e.message,Y):`The request failed.`}function Ce({deps:e}={}){let t=(0,p.useMemo)(()=>({...xe,...e}),[e]),[n]=(0,p.useState)(()=>t.native());return n?(0,G.jsx)(we,{deps:t,native:n}):null}function we({deps:e,native:t}){let{api:n,titleOf:r,now:i}=e,a=(0,p.useRef)(null),o=(0,p.useRef)(0),[s,c]=(0,p.useState)([]),[l,u]=(0,p.useState)({open:!1,permissions:L,checking:!1}),[d,f]=(0,p.useState)({state:`idle`,app:null}),[m,h]=(0,p.useState)(null),[g,_]=(0,p.useState)(null),v=(0,p.useRef)(null),y=(0,p.useCallback)(()=>{v.current?.abort();let e=new AbortController;v.current=e,n.state(e.signal).then(t=>{e.signal.aborted||h(t)},()=>void 0)},[n]);(0,p.useEffect)(()=>(y(),()=>v.current?.abort()),[y]);let b=(0,p.useMemo)(()=>(m?.chats??[]).reduce((e,t)=>e+t.grants.length,0),[m]);(0,p.useEffect)(()=>{if(b===0)return;let e=setInterval(y,q);return()=>clearInterval(e)},[b,y]);let x=(0,p.useCallback)(async()=>{u(e=>({...e,checking:!0}));let e=await t.request({op:`permissions`,req:I()});u(t=>({...t,checking:!1,permissions:e.ok?z(e.data):t.permissions}))},[t]),S=(0,p.useCallback)(e=>{u(t=>({open:!0,permissions:e??t.permissions,checking:t.checking})),e||x()},[x]),C=(0,p.useRef)(S);C.current=S;let w=(0,p.useRef)(y);w.current=y,(0,p.useEffect)(()=>{let e=he({api:n,native:t,onPrompt:e=>c(t=>t.some(t=>t.id===e.id)?t:[...t,e]),onNeedsPermissions:e=>C.current(e),onActivity:()=>w.current()});return a.current=e,()=>{e.stop(),a.current=null}},[n,t]);let T=(0,p.useCallback)(()=>{a.current?.forgetPrompts(),c([]),n.kill().then(e=>h(e),e=>_(`Grants could not be revoked: ${Q(e)}`))},[n]),E=(0,p.useCallback)(()=>{o.current=i(),t.send({op:`kill`}),T()},[t,i,T]);(0,p.useEffect)(()=>t.onState(e=>{f({state:e.state,app:e.app??null}),e.state===`killed`&&i()-o.current>ge&&(o.current=i(),T())}),[t,i,T]),(0,p.useEffect)(()=>{if(d.state!==`killed`)return;let e=setTimeout(()=>f({state:`idle`,app:null}),K);return()=>clearTimeout(e)},[d.state]);let D=e=>c(t=>t.filter(t=>t.id!==e)),O=(e,t)=>{D(e),a.current?.answerAccess(e,t).then(y)},k=(e,t)=>{D(e),a.current?.answerConfirm(e,t)},A=(e,t)=>{n.revoke(e,t).then(e=>h(e),e=>_(`Could not revoke: ${Q(e)}`))},j=s[0]??null,M=e=>X(r(e)??e,J)||`an unnamed chat`;return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(je,{control:d,grants:m,grantCount:b,notice:g,chatLabel:M,onKill:E,onResume:()=>t.send({op:`resume`}),onRevoke:A,onDismissNotice:()=>_(null)}),j?.kind===`access`?(0,G.jsx)(Ee,{prompt:j,chat:M(j.sessionId),queued:s.length-1,onAnswer:e=>O(j.id,e)},j.id):j?.kind===`confirm`?(0,G.jsx)(Oe,{prompt:j,chat:M(j.sessionId),queued:s.length-1,onAnswer:e=>k(j.id,e)},j.id):l.open?(0,G.jsx)(Ae,{permissions:l.permissions,checking:l.checking,onOpenSettings:e=>t.send({op:`open-settings`,kind:e}),onAsk:async()=>{let e=[];l.permissions.screen!==`granted`&&e.push(`screen`),l.permissions.accessibility!==`granted`&&e.push(`accessibility`);for(let n of e)await t.request({op:`request-permission`,req:I(),kind:n});await x()},onCheck:()=>void x(),onClose:()=>u(e=>({...e,open:!1}))}):null]})}function $({titleId:e,title:t,children:n,onEscape:r,initialFocusRef:i,tone:a,describedBy:o}){let s=(0,p.useRef)(null);return u({open:!0,containerRef:s,onClose:r,initialFocusRef:i}),(0,m.createPortal)((0,G.jsx)(`div`,{className:W.backdrop,children:(0,G.jsxs)(`div`,{ref:s,className:W.sheet,"data-tone":a,role:`dialog`,"aria-modal":`true`,"aria-labelledby":e,"aria-describedby":o,tabIndex:-1,"data-computer-sheet":!0,children:[(0,G.jsx)(`h2`,{id:e,className:W.title,children:t}),n]})}),document.body)}function Te({count:e}){return e<=0?null:(0,G.jsx)(`p`,{className:W.queued,children:e===1?`1 more request is waiting.`:`${e} more requests are waiting.`})}function Ee({prompt:e,chat:t,queued:n,onAnswer:r}){let i=(0,p.useId)(),[a,o]=(0,p.useState)(new Set),s=(0,p.useRef)(null),c=(0,p.useRef)(!1),l=e.apps.slice(0,ye),u=l.findIndex(e=>e.tier!==null),d=X(e.reason,_e),f=e=>{c.current||(c.current=!0,r(e))},m=()=>f(null),h=()=>{let e=[];for(let t of l)t.tier!==null&&a.has(t.bundleId)&&e.push({bundleId:t.bundleId,tier:t.tier});e.length>0&&f(e)},g=e=>o(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n});return(0,G.jsxs)($,{titleId:i,title:`An agent wants to control apps on this Mac`,onEscape:m,initialFocusRef:u>=0?s:void 0,children:[(0,G.jsxs)(`p`,{className:W.meta,children:[`From chat `,(0,G.jsx)(`strong`,{className:W.chat,children:t})]}),d?(0,G.jsxs)(`figure`,{className:W.quote,children:[(0,G.jsx)(`figcaption`,{className:W.quoteLabel,children:`The agent says`}),(0,G.jsx)(`blockquote`,{className:W.quoteText,children:d})]}):null,(0,G.jsxs)(`fieldset`,{className:W.apps,children:[(0,G.jsx)(`legend`,{className:W.legend,children:`Apps`}),l.map((e,t)=>{let n=e.tier===null,r=`${i}-app-${t}`;return(0,G.jsxs)(`div`,{className:W.appRow,"data-denied":n||void 0,children:[(0,G.jsx)(`input`,{ref:t===u?s:void 0,id:r,type:`checkbox`,className:W.check,checked:!n&&a.has(e.bundleId),disabled:n,onChange:()=>g(e.bundleId)}),(0,G.jsxs)(`label`,{htmlFor:r,className:W.appText,children:[(0,G.jsxs)(`span`,{className:W.appHead,children:[(0,G.jsx)(`span`,{className:W.appName,children:X(e.name,J)||X(e.bundleId,J)}),(0,G.jsx)(`span`,{className:W.tier,"data-tier":e.tier??`denied`,children:Se(e.tier)}),e.running?null:(0,G.jsx)(`span`,{className:W.notRunning,children:`(not running)`})]}),(0,G.jsx)(`span`,{className:W.appReason,children:X(e.reason,Y)})]})]},`${e.bundleId}-${t}`)})]}),(0,G.jsx)(Te,{count:n}),(0,G.jsxs)(`div`,{className:W.actions,children:[(0,G.jsx)(`button`,{type:`button`,className:W.secondary,onClick:m,children:`Deny`}),(0,G.jsx)(`button`,{type:`button`,className:W.primary,onClick:h,disabled:a.size===0,children:`Allow selected`})]}),(0,G.jsx)(`p`,{className:W.footnote,children:`Grants last until you close this chat, restart Verse, or press KILL. Esc stops the agent at any time.`})]})}function De(e){if(e.reason===`untrusted-content`)return`This turn read content from another app or web page, which could contain instructions.`;let t=T(e.label);return t?`The control is labelled ${t}.`:`The control looks consequential.`}function Oe({prompt:e,chat:t,queued:n,onAnswer:r}){let i=(0,p.useId)(),a=(0,p.useId)(),o=(0,p.useRef)(null),s=(0,p.useRef)(!1),c=e=>{s.current||(s.current=!0,r(e))},{confirm:l}=e,u=X(l.summary,ve)||`${X(l.action,40)} in ${X(l.app,J)}`;return(0,G.jsxs)($,{titleId:i,title:`Allow this action?`,onEscape:()=>c(`deny`),initialFocusRef:o,tone:`warning`,describedBy:a,children:[(0,G.jsxs)(`p`,{className:W.meta,children:[`From chat `,(0,G.jsx)(`strong`,{className:W.chat,children:t})]}),(0,G.jsx)(`p`,{className:W.summary,children:u}),(0,G.jsx)(`p`,{id:a,className:W.why,children:De(l)}),(0,G.jsx)(Te,{count:n}),(0,G.jsxs)(`div`,{className:W.actions,children:[(0,G.jsx)(`button`,{ref:o,type:`button`,className:W.secondary,onClick:()=>c(`deny`),children:`Deny`}),(0,G.jsx)(`button`,{type:`button`,className:W.secondary,onClick:()=>c(`chat`),children:`Allow for chat`}),(0,G.jsx)(`button`,{type:`button`,className:W.primary,onClick:()=>c(`once`),children:`Allow once`})]}),(0,G.jsx)(`p`,{className:W.footnote,children:`“Allow for chat” stops asking for this reason until the chat’s grants end.`})]})}var ke={granted:`Allowed`,missing:`Not allowed`,unknown:`Not checked yet`};function Ae({permissions:e,checking:t,onOpenSettings:n,onAsk:r,onCheck:i,onClose:a}){let o=(0,p.useId)(),[s,c]=(0,p.useState)(!1);return(0,G.jsxs)($,{titleId:o,title:`Let Ashlr see and use this Mac`,onEscape:a,children:[(0,G.jsx)(`p`,{className:W.body,children:`Agents in Verse need two macOS permissions before they can use the apps you grant them.`}),(0,G.jsx)(`ul`,{className:W.permissions,children:[{kind:`screen`,name:`Screen Recording`,why:`to see windows`,button:`Open Screen Recording settings`},{kind:`accessibility`,name:`Accessibility`,why:`to click, type and read controls`,button:`Open Accessibility settings`}].map(t=>(0,G.jsxs)(`li`,{className:W.permissionRow,children:[(0,G.jsxs)(`div`,{className:W.permissionText,children:[(0,G.jsx)(`span`,{className:W.appName,children:t.name}),(0,G.jsx)(`span`,{className:W.appReason,children:t.why})]}),(0,G.jsx)(`span`,{className:W.status,"data-status":e[t.kind],"aria-live":`polite`,children:ke[e[t.kind]]}),(0,G.jsx)(`button`,{type:`button`,className:W.secondary,onClick:()=>n(t.kind),children:t.button})]},t.kind))}),(0,G.jsxs)(`ul`,{className:W.notes,children:[(0,G.jsx)(`li`,{children:`After you allow Screen Recording, macOS needs Ashlr to quit and relaunch before it takes effect.`}),(0,G.jsx)(`li`,{children:`macOS asks again roughly once a month (“continue to allow?”). Say yes to keep computer use working.`}),(0,G.jsx)(`li`,{children:`A local rebuild of Ashlr signed with a different identity loses both permissions; allow them again.`})]}),(0,G.jsxs)(`div`,{className:W.actions,children:[(0,G.jsx)(`button`,{type:`button`,className:W.secondary,onClick:a,children:`Close`}),(0,G.jsx)(`button`,{type:`button`,className:W.secondary,disabled:s,onClick:()=>{c(!0),r().finally(()=>c(!1))},children:`Ask macOS`}),(0,G.jsx)(`button`,{type:`button`,className:W.primary,onClick:i,disabled:t,children:t?`Checking…`:`Check again`})]})]})}function je({control:e,grants:t,grantCount:n,notice:r,chatLabel:i,onKill:a,onResume:o,onRevoke:s,onDismissNotice:c}){let[l,u]=(0,p.useState)(!1),d=(0,p.useId)(),f=e.state!==`idle`||n>0||r!==null;if((0,p.useEffect)(()=>{n===0&&u(!1)},[n]),!f)return null;let m=e.app?X(e.app,J):null,h;h=e.state===`active`?`Agent controlling ${m??`an app`} — Esc to stop`:e.state===`paused`?`You took over — the agent is paused`:e.state===`killed`?`Stopped — every desktop grant was revoked`:n===1?`1 app granted to agents`:`${n} apps granted to agents`;let g=e.state===`active`||e.state===`paused`||n>0;return(0,G.jsxs)(`div`,{className:W.pillWrap,"data-computer-pill":!0,children:[(0,G.jsxs)(`div`,{className:W.pill,"data-state":e.state,role:`status`,"aria-live":`polite`,children:[(0,G.jsx)(`span`,{className:W.dot,"aria-hidden":`true`}),(0,G.jsx)(`span`,{className:W.pillText,children:h}),e.state===`paused`?(0,G.jsx)(`button`,{type:`button`,className:W.pillButton,onClick:o,children:`Resume`}):null,n>0?(0,G.jsx)(`button`,{type:`button`,className:W.pillButton,"aria-expanded":l,"aria-controls":l?d:void 0,onClick:()=>u(e=>!e),children:`Grants`}):null,g?(0,G.jsx)(`button`,{type:`button`,className:W.kill,onClick:a,"aria-label":`KILL — stop the agent and revoke every desktop grant`,children:`KILL`}):null]}),r?(0,G.jsxs)(`div`,{className:W.notice,role:`alert`,children:[(0,G.jsx)(`span`,{children:r}),(0,G.jsx)(`button`,{type:`button`,className:W.pillButton,onClick:c,children:`Dismiss`})]}):null,l&&t?(0,G.jsx)(`div`,{id:d,className:W.grants,onKeyDown:e=>{e.key===`Escape`&&(e.stopPropagation(),u(!1))},children:t.chats.filter(e=>e.grants.length>0).map(e=>(0,G.jsxs)(`section`,{className:W.grantChat,"aria-label":`Grants for ${i(e.sessionId)}`,children:[(0,G.jsx)(`h3`,{className:W.grantChatTitle,children:i(e.sessionId)}),(0,G.jsx)(`ul`,{className:W.grantList,children:e.grants.map(t=>{let n=X(t.name,J)||X(t.bundleId,J);return(0,G.jsxs)(`li`,{className:W.grantRow,children:[(0,G.jsx)(`span`,{className:W.appName,children:n}),(0,G.jsx)(`span`,{className:W.tier,"data-tier":t.tier,children:Z[t.tier]??t.tier}),(0,G.jsx)(`button`,{type:`button`,className:W.pillButton,onClick:()=>s(e.sessionId,t.bundleId),"aria-label":`Revoke ${n}`,children:`Revoke`})]},t.bundleId)})})]},e.sessionId))}):null]})}export{Ee as AccessSheet,Ce as ComputerControl,Oe as ConfirmCard,q as GRANTS_REFRESH_MS,K as KILLED_DISMISS_MS,Ae as OnboardingSheet,Z as TIER_LABEL,X as clampText,De as confirmWhy};
|
|
2
|
-
//# sourceMappingURL=ComputerControl-BflC6wd1.js.map
|