@ashlr/hub 3.22.0 → 3.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +5 -5
- package/dist/authority-surface.json +16 -11
- package/dist/build-identity.json +2 -2
- package/dist/cli/verify-safety-sources.d.ts +4 -0
- package/dist/cli/verify-safety-sources.js +41 -0
- package/dist/cli/verify-safety-sources.js.map +1 -0
- package/dist/cli/verify-safety.js +16 -1
- package/dist/cli/verify-safety.js.map +1 -1
- package/dist/core/decide/needs-you.d.ts +3 -1
- package/dist/core/decide/needs-you.js +52 -28
- package/dist/core/decide/needs-you.js.map +1 -1
- package/dist/core/fleet/fleet-control-model.d.ts +2 -1
- package/dist/core/fleet/fleet-control-model.js +5 -0
- package/dist/core/fleet/fleet-control-model.js.map +1 -1
- package/dist/core/fleet/fleet-control-types.d.ts +11 -1
- package/dist/core/fleet/fleet-control.d.ts +4 -0
- package/dist/core/fleet/fleet-control.js +23 -1
- package/dist/core/fleet/fleet-control.js.map +1 -1
- package/dist/core/fleet/quota.js +1 -1
- package/dist/core/fleet/quota.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
- package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
- package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
- package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
- package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
- package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{l as r}from"./global-w7KDTTi0.js";import{i,m as a}from"./VerseShared-Bf-XTHCh.js";import{n as o}from"./verse-bootstrap-query-B3vFD9XK.js";import{a as s,f as c,i as l,o as u,p as d,r as f}from"./VerseMobileApp-ePNuVERe.js";import{C as p,h as m}from"./verse-model-DAOz9LrY.js";import{n as h}from"./composer-queries-D1H4E0Ye.js";import{t as g}from"./use-chat-activity-_tBmEPPN.js";import{n as _,r as v}from"./useVerseSession-BOsgJzT5.js";import{t as y}from"./useVerseTranscript-BN_fMz6x.js";import{d as b,i as x,l as S,n as C,r as w,t as T,u as E}from"./checkpoint-queries-BKD2evmX.js";import{c as D,i as O,n as k,r as A,t as j}from"./ui-parts-wvov2ktB.js";import{t as ee}from"./MobileComposer-B8nWsIJO.js";import{t as M}from"./mobile-actions-avKNGddD.js";import{a as N,c as P,d as F,f as I,i as L,l as R,n as z,o as B,r as V,s as H,t as U,u as W}from"./agent-transcript-model-D-34Ll59.js";var G=e(n(),1),K={header:`_header_zklfu_13`,meta:`_meta_zklfu_24`,who:`_who_zklfu_34`,segmented:`_segmented_zklfu_38`,segment:`_segment_zklfu_38`,log:`_log_zklfu_66`,userRow:`_userRow_zklfu_73`,userBubble:`_userBubble_zklfu_79`,assistant:`_assistant_zklfu_89`,prose:`_prose_zklfu_95`,code:`_code_zklfu_101`,output:`_output_zklfu_102`,tool:`_tool_zklfu_120`,toolChip:`_toolChip_zklfu_126`,toolText:`_toolText_zklfu_153`,toolState:`_toolState_zklfu_161`,thinkingChip:`_thinkingChip_zklfu_167`,thinkingText:`_thinkingText_zklfu_172`,system:`_system_zklfu_182`,link:`_link_zklfu_197`,note:`_note_zklfu_204`,typing:`_typing_zklfu_210`,jumpWrap:`_jumpWrap_zklfu_219`,jump:`_jump_zklfu_219`,modeChip:`_modeChip_zklfu_232`,changes:`_changes_zklfu_238`,summary:`_summary_zklfu_243`,rootName:`_rootName_zklfu_250`,fileBlock:`_fileBlock_zklfu_260`,fileRow:`_fileRow_zklfu_269`,fileStatus:`_fileStatus_zklfu_274`,filePath:`_filePath_zklfu_290`,fileCounts:`_fileCounts_zklfu_298`,add:`_add_zklfu_305`,del:`_del_zklfu_309`,patch:`_patch_zklfu_313`,line:`_line_zklfu_324`},q=t(),J=`Stops the turn in progress. What it already changed stays on disk.`;function te(e){return/HTTP 404/.test(e)?{title:`Chat not found`,reason:`Your Mac has no chat with this id. It may have been deleted.`}:/HTTP \d+/.test(e)?{title:`Couldn’t open this chat`,reason:`Your Mac could not load this chat right now.`}:{title:`Couldn’t open this chat`,reason:e}}function Y({sessionId:e,pane:t}){let{permissions:n,reachability:_,navigate:y}=d(),[b,x]=(0,G.useState)(0),[S,C]=(0,G.useState)(0),w=v(e,b),T=r(o),[E,A]=(0,G.useState)(``),[N,P]=(0,G.useState)(`interject`),F=w.session,I=F?.status===`running`,L=c(n),R=_===`offline`||_===`unreachable`,z=T.data?.seats??[],B=F?.turnCount??null;(0,G.useEffect)(()=>{w.loaded&&B!==null&&g(e,B)},[e,w.loaded,B]);let V=(0,G.useCallback)(()=>y({screen:`agents`}),[y]),H=n=>{n!==t&&y({screen:`agent`,id:e,pane:n},{replace:!0})},U=()=>{M({title:`Stop this turn?`,consequences:J,confirmLabel:`Stop`,destructive:!0,run:()=>i(e),success:`Stopped`})},W=t=>{let n=I?N:`send`;M({title:n===`send`?`Send message`:n===`interject`?`Interject`:`Queue message`,consequences:n===`send`?`Sends this message to the agent, which starts a new turn.`:n===`interject`?`Stops the current turn and sends this next.`:`Sends this after the current turn finishes.`,confirmLabel:n===`send`?`Send`:n===`interject`?`Interject`:`Queue`,confirm:!1,run:()=>n===`send`?a(e,t):h(e,t,n===`interject`?{sendNow:!0}:{}),success:n===`queue`?`Queued for after this turn`:void 0,onDone:()=>A(e=>e.trim()===t?``:e)})},Y=()=>{t===`changes`?C(e=>e+1):x(e=>e+1)};if(w.loadError&&!F){let{title:e,reason:t}=te(w.loadError);return(0,q.jsxs)(l,{title:`Agent`,onBack:V,backLabel:`Agents`,children:[(0,q.jsx)(O,{title:e,reason:t,onRetry:()=>x(e=>e+1)}),(0,q.jsx)(f,{variant:`plain`,block:!0,onClick:V,children:`Back to Agents`})]})}if(!w.loaded||!F)return(0,q.jsx)(l,{title:`Agent`,onBack:V,backLabel:`Agents`,children:(0,q.jsx)(s,{rows:4,label:`Loading the conversation`})});let X=I?(0,q.jsx)(j,{tone:`running`,dot:!0,pulse:!0,children:`Working`}):F.status===`error`?(0,q.jsx)(j,{tone:`danger`,children:`Failed`}):(0,q.jsx)(j,{tone:`neutral`,children:`Idle`}),Z=[p(z,F),m(z,F)].filter(Boolean).join(` · `),Q=(0,q.jsxs)(`div`,{className:K.header,children:[(0,q.jsxs)(`div`,{className:K.meta,children:[(0,q.jsx)(`span`,{className:K.who,children:Z}),X]}),(0,q.jsxs)(`div`,{className:K.segmented,role:`group`,"aria-label":`View`,children:[(0,q.jsx)(`button`,{type:`button`,className:K.segment,"aria-pressed":t===`transcript`,onClick:()=>H(`transcript`),children:`Transcript`}),(0,q.jsx)(`button`,{type:`button`,className:K.segment,"aria-pressed":t===`changes`,onClick:()=>H(`changes`),children:`Changes`})]}),R?(0,q.jsx)(k,{tone:`warning`,children:_===`offline`?`You’re offline. Showing what was loaded; sending resumes when you reconnect.`:`Can’t reach your Mac. Showing what was loaded; sending resumes when it answers.`}):w.stream===`reconnecting`?(0,q.jsx)(k,{tone:`info`,children:`Reconnecting to the live stream…`}):null]}),$=R?`Sending is paused until your Mac is reachable.`:I?N===`interject`?`Interject stops the current turn and sends this next.`:`Queue sends this after the current turn finishes.`:n.act===`locked`?`Sending asks for the mutation token first.`:void 0,re=t===`transcript`?L?(0,q.jsx)(ee,{value:E,onChange:A,onSubmit:W,placeholder:I?`Tell it something now…`:`Message this agent…`,submitLabel:I?N===`interject`?`Interject`:`Queue`:`Send`,disabled:R,hint:$,label:`Message`,above:I?(0,q.jsxs)(`div`,{className:D.chips,role:`group`,"aria-label":`When to send`,children:[(0,q.jsx)(`button`,{type:`button`,className:u(D.chip,K.modeChip),"aria-pressed":N===`interject`,onClick:()=>P(`interject`),children:`Interject now`}),(0,q.jsx)(`button`,{type:`button`,className:u(D.chip,K.modeChip),"aria-pressed":N===`queue`,onClick:()=>P(`queue`),children:`Queue for after`})]}):void 0}):(0,q.jsx)(`div`,{className:D.composer,children:(0,q.jsx)(`p`,{className:D.composerHint,children:n.actReason??`This device can read this chat but not send to it.`})}):void 0,ie=I&&L?(0,q.jsx)(f,{variant:`destructiveTinted`,onClick:U,disabled:R,children:`Stop`}):null;return(0,q.jsx)(l,{title:F.title||`Untitled chat`,onBack:V,backLabel:`Agents`,trailing:ie,header:Q,footer:re,onRefresh:Y,label:t===`changes`?`Changes`:`Transcript`,children:t===`changes`?(0,q.jsx)(oe,{sessionId:e,version:`${F.status}:${F.turnCount}:${S}`}):(0,q.jsx)(ne,{sessionId:e,running:I,canAct:L})})}var X=48;function Z(e){return e?.parentElement??null}function Q(e){let[t,n]=(0,G.useState)(()=>Date.now());return(0,G.useEffect)(()=>{if(!e)return;n(Date.now());let t=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(t)},[e]),t}function ne({sessionId:e,running:t,canAct:n}){let r=y(e),i=_(e),[a,o]=(0,G.useState)(60),[s,c]=(0,G.useState)(!1),l=(0,G.useRef)(null),d=(0,G.useRef)(!0),p=t||r.live,m=Q(p),h=(0,G.useMemo)(()=>F(r.items),[r.items]),g=(0,G.useMemo)(()=>I(h,a),[h,a]);(0,G.useEffect)(()=>{let e=Z(l.current);if(!e)return;let t=()=>{let t=e.scrollHeight-e.scrollTop-e.clientHeight<=X;d.current=t,t&&c(!1)};return e.addEventListener(`scroll`,t,{passive:!0}),()=>e.removeEventListener(`scroll`,t)},[]);let v=h[h.length-1],b=`${h.length}:${v?.key??``}:${v&&`text`in v?v.text.length:0}:${v?.kind===`tool`?String(v.result!==null):``}:${p}`;return(0,G.useLayoutEffect)(()=>{let e=Z(l.current);e&&(d.current?e.scrollTop=e.scrollHeight:c(!0))},[b]),(0,q.jsxs)(`div`,{ref:l,className:K.log,role:`log`,"aria-label":`Conversation`,"aria-live":`off`,children:[g.hidden>0?(0,q.jsxs)(f,{variant:`tinted`,block:!0,onClick:()=>o(e=>e+60),children:[`Show earlier (`,g.hidden,`)`]}):null,h.length===0&&!p?(0,q.jsx)(A,{title:`No messages yet`,body:n?`Send the first message below.`:`Messages sent from your Mac show up here.`}):null,g.items.map(e=>(0,q.jsx)($,{item:e},e.key)),p?(0,q.jsxs)(`p`,{className:K.typing,role:`status`,children:[(0,q.jsx)(`span`,{className:u(D.dot,D.pulse),"aria-hidden":`true`}),(0,q.jsx)(`span`,{children:L(i,m)})]}):null,s?(0,q.jsx)(`div`,{className:K.jumpWrap,children:(0,q.jsx)(f,{variant:`primary`,className:K.jump,onClick:()=>{let e=Z(l.current);d.current=!0,c(!1),e&&(e.scrollTop=e.scrollHeight)},children:`Jump to latest`})}):null]})}function $({item:e}){switch(e.kind){case`user`:return(0,q.jsx)(`div`,{className:K.userRow,children:(0,q.jsx)(`div`,{className:K.userBubble,children:e.text})});case`assistant`:return(0,q.jsx)(`div`,{className:K.assistant,children:H(e.text).map((e,t)=>e.kind===`code`?(0,q.jsx)(`pre`,{className:K.code,"aria-label":e.lang?`${e.lang} code`:`Code`,children:e.text},t):(0,q.jsx)(`p`,{className:K.prose,children:e.text},t))});case`tool`:return(0,q.jsx)(re,{item:e});case`thinking`:return(0,q.jsx)(ie,{item:e});case`remote-pr`:{let t=N(e.url);return(0,q.jsx)(`p`,{className:K.system,"data-tone":`info`,children:t?(0,q.jsx)(`a`,{href:t,target:`_blank`,rel:`noopener noreferrer`,className:K.link,children:`Devin opened a pull request`}):`Devin opened a pull request`})}default:{let t=P(e);return t?(0,q.jsx)(`p`,{className:K.system,"data-tone":t.tone,children:t.text}):null}}}function re({item:e}){let[t,n]=(0,G.useState)(!1),r=W(e.name,e.input),i=e.result===null?`running`:e.result.isError?`error`:`ok`,a=i===`running`?`running`:i===`error`?`failed`:B(e.durationMs)??``,o=e.result?U(e.result.output):null;return(0,q.jsxs)(`div`,{className:K.tool,children:[(0,q.jsxs)(`button`,{type:`button`,className:K.toolChip,"data-state":i,"aria-expanded":t,onClick:()=>n(e=>!e),children:[(0,q.jsx)(`span`,{className:K.toolText,children:r}),a?(0,q.jsx)(`span`,{className:K.toolState,children:a}):null]}),t?o?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`pre`,{className:K.output,"data-error":i===`error`||void 0,children:o.text||`No output.`}),o.hidden>0?(0,q.jsxs)(`p`,{className:K.note,children:[o.hidden,` more `,o.hidden===1?`line`:`lines`,` — open this chat on your Mac for the full output.`]}):null]}):(0,q.jsx)(`p`,{className:K.note,children:`Still running — no output yet.`}):null]})}function ie({item:e}){let[t,n]=(0,G.useState)(!1);return(0,q.jsxs)(`div`,{className:K.tool,children:[(0,q.jsx)(`button`,{type:`button`,className:u(K.toolChip,K.thinkingChip),"aria-expanded":t,onClick:()=>n(e=>!e),children:(0,q.jsx)(`span`,{className:K.toolText,children:R(e)})}),t?(0,q.jsx)(`p`,{className:K.thinkingText,children:e.redacted||!e.text.trim()?`The model kept this reasoning private.`:e.text}):null]})}var ae=`VERSE_CHECKPOINT_UNAVAILABLE`;function oe({sessionId:e,version:t}){let[n,r]=(0,G.useState)({state:`loading`}),[i,a]=(0,G.useState)(0),[o,c]=(0,G.useState)(null);if((0,G.useEffect)(()=>{let t=new AbortController;return r(e=>e.state===`ready`?e:{state:`loading`}),(async()=>{let n=await T.list(e,t.signal),i=n.turns.find(b);if(!i){let e=n.turns.map(E).find(e=>e!==null)??null;t.signal.aborted||r({state:`empty`,reason:e});return}let a=i.roots.filter(e=>e.pre?.commit).map(e=>e.rootId),o=new Map(n.roots.map(e=>[e.rootId,e.name])),s=await Promise.all(a.map(n=>T.diff({chatId:e,turnId:i.turnId,rootId:n,mode:`since`},t.signal)));t.signal.aborted||r({state:`ready`,turnId:i.turnId,roots:s.map((e,t)=>({rootId:a[t],name:o.get(a[t])??`Repository`,diff:e}))})})().catch(e=>{t.signal.aborted||(w(e)===ae?r({state:`empty`,reason:null}):r({state:`error`,message:C(e)}))}),()=>t.abort()},[e,t,i]),n.state===`loading`)return(0,q.jsx)(s,{rows:3,label:`Loading changes`});if(n.state===`error`)return(0,q.jsx)(O,{title:`Couldn’t load the changes`,reason:n.message,onRetry:()=>a(e=>e+1)});if(n.state===`empty`)return(0,q.jsx)(A,{title:`No checkpoint for this chat yet`,body:n.reason??`Verse snapshots a git repository when a turn starts there; changes show up after the first one.`});let l=n.roots.flatMap(e=>e.diff.files),d=S(l),f=n.roots.length>1;return(0,q.jsxs)(`div`,{className:K.changes,children:[(0,q.jsx)(`p`,{className:K.summary,"aria-label":`Summary`,children:V(d)}),l.length===0?(0,q.jsx)(A,{title:`No changes on disk`,body:`Everything this chat changed has been undone, or it has not edited a file yet.`}):null,n.roots.map(t=>t.diff.files.length===0?null:(0,q.jsxs)(`section`,{className:D.section,"aria-label":t.name,children:[f?(0,q.jsx)(`h2`,{className:K.rootName,children:t.name}):null,(0,q.jsx)(`div`,{className:D.group,children:t.diff.files.map(r=>{let i=`${t.rootId}\u0000${r.path}`,a=o===i;return(0,q.jsxs)(`div`,{className:K.fileBlock,children:[(0,q.jsxs)(`button`,{type:`button`,className:u(D.row,K.fileRow),"aria-expanded":a,onClick:()=>c(a?null:i),children:[(0,q.jsx)(`span`,{className:K.fileStatus,"data-status":r.status,title:x[r.status],children:r.status}),(0,q.jsx)(`span`,{className:K.filePath,children:r.oldPath&&r.status===`R`?`${r.path} (was ${r.oldPath})`:r.path}),(0,q.jsx)(`span`,{className:K.fileCounts,children:r.binary?`binary`:(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`span`,{className:K.add,children:[`+`,r.additions]}),` `,(0,q.jsxs)(`span`,{className:K.del,children:[`−`,r.deletions]})]})})]}),a?(0,q.jsx)(se,{sessionId:e,turnId:n.turnId,rootId:t.rootId,file:r}):null]},i)})})]},t.rootId)),(0,q.jsx)(`p`,{className:D.sectionFooter,children:`Read-only here. Review and undo on your Mac.`})]})}function se({sessionId:e,turnId:t,rootId:n,file:r}){let[i,a]=(0,G.useState)({state:`loading`});if((0,G.useEffect)(()=>{let i=new AbortController;return a({state:`loading`}),T.diff({chatId:e,turnId:t,rootId:n,mode:`since`,file:r.path},i.signal).then(e=>{i.signal.aborted||a({state:`ready`,diff:e})},e=>{i.signal.aborted||a({state:`error`,message:C(e)})}),()=>i.abort()},[e,t,n,r.path]),i.state===`loading`)return(0,q.jsx)(`p`,{className:K.note,role:`status`,children:`Loading the diff…`});if(i.state===`error`)return(0,q.jsx)(`p`,{className:K.note,role:`alert`,children:i.message});let o=i.diff.patch;return r.binary||o?.binary?(0,q.jsx)(`p`,{className:K.note,children:`Binary file — open it on your Mac to compare.`}):r.captured?!o||!o.text.trim()?(0,q.jsx)(`p`,{className:K.note,children:`No text changes.`}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`div`,{className:K.patch,"aria-label":`Diff of ${r.path}`,children:z(o.text).map((e,t)=>(0,q.jsx)(`div`,{className:K.line,"data-kind":e.kind,children:e.text||` `},t))}),o.truncated?(0,q.jsx)(`p`,{className:K.note,children:`This diff was cut short — see the whole change on your Mac.`}):null]}):(0,q.jsx)(`p`,{className:K.note,children:`Too large to snapshot, so there is no diff for it.`})}export{Y as AgentDetailScreen,J as STOP_CONSEQUENCES};
|
|
2
|
+
//# sourceMappingURL=AgentDetailScreen-C8h--Nah.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentDetailScreen-C8h--Nah.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/screens/AgentDetailScreen.module.css","../../../../../../src/web-ui/routes/verse/mobile/screens/AgentDetailScreen.tsx"],"sourcesContent":["/*\n * routes/verse/mobile/screens/AgentDetailScreen.module.css — one agent on a\n * phone: the header's seat line and Transcript | Changes switch, the compact\n * transcript (bubbles, one-line tool chips, system lines, the typing line,\n * \"Jump to latest\"), and the read-only diff.\n *\n * Nothing scrolls sideways: code, tool output and diff lines wrap\n * (pre-wrap + break-word). One-line chips clip with an ellipsis instead.\n */\n\n/* ---- header ---------------------------------------------------------------- */\n\n.header {\n flex: none;\n display: grid;\n gap: var(--space-2);\n padding: 0 max(var(--space-4), env(safe-area-inset-right)) var(--space-2) max(var(--space-4), env(safe-area-inset-left));\n}\n\n.header > * {\n margin: 0;\n}\n\n.meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n min-width: 0;\n color: var(--text-secondary);\n font-size: 0.85em;\n}\n\n.who {\n min-width: 0;\n}\n\n.segmented {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--space-1);\n padding: var(--space-1);\n border-radius: var(--radius-lg);\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-subtle);\n}\n\n.segment {\n min-height: 2.75rem;\n border: 0;\n border-radius: var(--radius-md);\n background: transparent;\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n\n.segment[aria-pressed='true'] {\n background: var(--bg-surface);\n color: var(--text-primary);\n box-shadow: 0 0 0 1px var(--border-default);\n}\n\n/* ---- transcript ------------------------------------------------------------- */\n\n.log {\n display: grid;\n gap: var(--space-3);\n padding-top: var(--space-3);\n min-width: 0;\n}\n\n.userRow {\n display: flex;\n justify-content: flex-end;\n min-width: 0;\n}\n\n.userBubble {\n max-width: 85%;\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-xl);\n background: var(--accent-500);\n color: var(--text-on-accent);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.assistant {\n display: grid;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.prose {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.code,\n.output {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-md);\n background: var(--bg-code);\n border: 1px solid var(--border-subtle);\n font-family: var(--font-mono);\n font-size: 0.8em;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-x: hidden;\n}\n\n.output[data-error] {\n border-color: var(--status-danger-solid);\n}\n\n.tool {\n display: grid;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.toolChip {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n justify-self: start;\n max-width: 100%;\n min-height: 2.75rem;\n padding: 0 var(--space-3);\n border-radius: var(--radius-full);\n border: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n color: var(--text-secondary);\n font-size: 0.85em;\n text-align: left;\n cursor: pointer;\n}\n\n.toolChip[data-state='error'] {\n border-color: var(--status-danger-solid);\n color: var(--status-danger-fg);\n}\n\n.toolChip[aria-expanded='true'] {\n border-color: var(--border-default);\n color: var(--text-primary);\n}\n\n.toolText {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-family: var(--font-mono);\n}\n\n.toolState {\n flex: none;\n color: var(--text-tertiary);\n font-size: 0.9em;\n}\n\n.thinkingChip .toolText {\n font-family: inherit;\n font-style: italic;\n}\n\n.thinkingText {\n margin: 0;\n padding-left: var(--space-3);\n border-left: 2px solid var(--border-default);\n color: var(--text-secondary);\n font-size: 0.9em;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.system {\n margin: 0;\n text-align: center;\n color: var(--text-tertiary);\n font-size: 0.8em;\n}\n\n.system[data-tone='danger'] {\n color: var(--status-danger-fg);\n}\n\n.system[data-tone='info'] {\n color: var(--status-info-fg);\n}\n\n.link {\n display: inline-flex;\n align-items: center;\n min-height: 2.75rem;\n color: var(--text-link);\n}\n\n.note {\n margin: 0;\n color: var(--text-tertiary);\n font-size: 0.8em;\n}\n\n.typing {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n margin: 0;\n color: var(--status-running-fg);\n font-size: 0.85em;\n}\n\n.jumpWrap {\n position: sticky;\n bottom: var(--space-3);\n display: flex;\n justify-content: center;\n pointer-events: none;\n}\n\n.jump {\n pointer-events: auto;\n box-shadow: 0 0.25rem 0.75rem color-mix(in srgb, var(--text-primary) 18%, transparent);\n}\n\n.modeChip {\n flex: 1 1 0;\n}\n\n/* ---- changes --------------------------------------------------------------- */\n\n.changes {\n padding-top: var(--space-3);\n min-width: 0;\n}\n\n.summary {\n margin: 0 var(--space-2) var(--space-3);\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n font-variant-numeric: tabular-nums;\n}\n\n.rootName {\n font-family: var(--font-display);\n margin: 0 var(--space-2) var(--space-2);\n color: var(--text-secondary);\n font-size: 0.8em;\n font-weight: var(--font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n}\n\n.fileBlock {\n display: grid;\n min-width: 0;\n}\n\n.fileBlock + .fileBlock {\n border-top: 1px solid var(--border-subtle);\n}\n\n.fileRow {\n align-items: flex-start;\n cursor: pointer;\n}\n\n.fileStatus {\n flex: none;\n min-width: 1.6em;\n text-align: center;\n border-radius: var(--radius-sm);\n font-family: var(--font-mono);\n font-size: 0.8em;\n font-weight: var(--font-weight-semibold);\n background: var(--status-neutral-bg);\n color: var(--status-neutral-fg);\n}\n\n.fileStatus[data-status='A'] { background: var(--status-success-bg); color: var(--status-success-fg); }\n.fileStatus[data-status='D'] { background: var(--status-danger-bg); color: var(--status-danger-fg); }\n.fileStatus[data-status='R'] { background: var(--status-info-bg); color: var(--status-info-fg); }\n\n.filePath {\n flex: 1;\n min-width: 0;\n font-family: var(--font-mono);\n font-size: 0.85em;\n word-break: break-word;\n}\n\n.fileCounts {\n flex: none;\n font-size: 0.8em;\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n}\n\n.add {\n color: var(--status-success-fg);\n}\n\n.del {\n color: var(--status-danger-fg);\n}\n\n.patch {\n margin: 0 var(--space-3) var(--space-3);\n border-radius: var(--radius-md);\n border: 1px solid var(--border-subtle);\n background: var(--bg-code);\n overflow-x: hidden;\n font-family: var(--font-mono);\n font-size: 0.75em;\n line-height: 1.45;\n}\n\n.line {\n padding: 0 var(--space-2);\n white-space: pre-wrap;\n word-break: break-word;\n min-width: 0;\n}\n\n.line[data-kind='add'] {\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n\n.line[data-kind='del'] {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n.line[data-kind='hunk'] {\n color: var(--text-tertiary);\n background: var(--status-neutral-bg);\n}\n\n.line[data-kind='meta'] {\n color: var(--text-tertiary);\n}\n\n.fileBlock > .note {\n margin: 0 var(--space-4) var(--space-3);\n}\n","/**\n * routes/verse/mobile/screens/AgentDetailScreen.tsx — one agent on the\n * phone: its live transcript, what it changed (read-only), and the three\n * things worth doing from a pocket — Send, Interject, Stop.\n *\n * Live data is the workbench's own store, so the phone and the Mac show the\n * same chat from the same events:\n * useVerseSession opens the chat (detail GET, then the resumed SSE stream)\n * useVerseTranscript the derived transcript (one rebuild per frame while streaming)\n * useVerseLive the running turn's progress / thinking / notices\n * checkpointClient the Changes pane (GET /api/verse/checkpoints*)\n *\n * Writes (every one through runMobileAction):\n * idle Send POST /sessions/:id/turns (no confirmation: a message)\n * running Interject POST /queue/:id { sendNow: true } (stops the turn, sends this next)\n * Queue POST /queue/:id (sends after the turn)\n * Stop POST /sessions/:id/cancel (confirmed)\n * A Devin chat stops the same way; ending the Devin session for good\n * (terminate) is deliberately not offered from the phone.\n *\n * The transcript is drawn compactly here rather than with Transcript.tsx /\n * MessageMarkdown (too heavy for this chunk): prose as pre-wrapped text,\n * ``` fences as code blocks, tool calls as one-line chips.\n */\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { VerseCheckpointDiffFile, VerseCheckpointDiffResponse } from '../../../../../core/verse/checkpoint-types.js';\nimport { useQuery } from '../../../../data/hooks.js';\nimport { STATUS_WORD, totals, turnCheckpointError, turnHasCheckpoint } from '../../changes/changes-model.js';\nimport { checkpointClient, describeCheckpointError, errorCode } from '../../changes/checkpoint-queries.js';\nimport { noteSessionSeen } from '../../chat/use-chat-activity.js';\nimport { enqueueFollowUp } from '../../composer/composer-queries.js';\nimport { useVerseLive, useVerseSession } from '../../useVerseSession.js';\nimport { useVerseTranscript } from '../../useVerseTranscript.js';\nimport { verseBootstrapQuery } from '../../verse-bootstrap-query.js';\nimport { modelLabel, seatLabel } from '../../verse-model.js';\nimport { cancelVerseTurn, sendVerseTurn } from '../../verse-queries.js';\nimport type { TranscriptItem } from '../../verse-transcript.js';\nimport { MobileComposer } from '../MobileComposer.js';\nimport { runMobileAction } from '../mobile-actions.js';\nimport { canShowActions, useMobile } from '../mobile-context.js';\nimport type { AgentPane } from '../mobile-router.js';\nimport { Button, Screen, SkeletonList, cx } from '../ui.js';\nimport { Badge, Banner, EmptyState, ErrorState, ui } from '../ui-parts.js';\nimport {\n clipLines,\n diffLines,\n diffSummary,\n liveStatusText,\n safeHttpsUrl,\n shortElapsed,\n splitFences,\n systemLine,\n thinkingLabel,\n toolSummary,\n TRANSCRIPT_WINDOW,\n visibleItems,\n windowItems,\n} from './agent-transcript-model.js';\nimport styles from './AgentDetailScreen.module.css';\n\nexport interface AgentDetailScreenProps {\n sessionId: string;\n pane: AgentPane;\n}\n\ntype SendMode = 'interject' | 'queue';\n\nexport const STOP_CONSEQUENCES = 'Stops the turn in progress. What it already changed stays on disk.';\n\n/** A load error in operator words: the store keeps the raw \"GET … failed (HTTP 404).\" sentence. */\nfunction describeLoadError(message: string): { title: string; reason: string } {\n if (/HTTP 404/.test(message)) return { title: 'Chat not found', reason: 'Your Mac has no chat with this id. It may have been deleted.' };\n if (/HTTP \\d+/.test(message)) return { title: 'Couldn’t open this chat', reason: 'Your Mac could not load this chat right now.' };\n return { title: 'Couldn’t open this chat', reason: message };\n}\n\nexport function AgentDetailScreen({ sessionId, pane }: AgentDetailScreenProps) {\n const { permissions, reachability, navigate } = useMobile();\n const [reload, setReload] = useState(0);\n const [changesReload, setChangesReload] = useState(0);\n const head = useVerseSession(sessionId, reload);\n const boot = useQuery(verseBootstrapQuery);\n const [draft, setDraft] = useState('');\n const [mode, setMode] = useState<SendMode>('interject');\n\n const session = head.session;\n const running = session?.status === 'running';\n const canAct = canShowActions(permissions);\n const disconnected = reachability === 'offline' || reachability === 'unreachable';\n const seats = boot.data?.seats ?? [];\n\n // Opening (and watching) a chat reads it: clear its unread count here and on the Mac.\n const turnCount = session?.turnCount ?? null;\n useEffect(() => {\n if (head.loaded && turnCount !== null) noteSessionSeen(sessionId, turnCount);\n }, [sessionId, head.loaded, turnCount]);\n\n const back = useCallback(() => navigate({ screen: 'agents' }), [navigate]);\n const showPane = (next: AgentPane) => {\n if (next !== pane) navigate({ screen: 'agent', id: sessionId, pane: next }, { replace: true });\n };\n\n const stop = () => {\n runMobileAction({\n title: 'Stop this turn?',\n consequences: STOP_CONSEQUENCES,\n confirmLabel: 'Stop',\n destructive: true,\n run: () => cancelVerseTurn(sessionId),\n success: 'Stopped',\n });\n };\n\n const submit = (text: string) => {\n const kind: 'send' | SendMode = running ? mode : 'send';\n runMobileAction({\n title: kind === 'send' ? 'Send message' : kind === 'interject' ? 'Interject' : 'Queue message',\n consequences:\n kind === 'send'\n ? 'Sends this message to the agent, which starts a new turn.'\n : kind === 'interject'\n ? 'Stops the current turn and sends this next.'\n : 'Sends this after the current turn finishes.',\n confirmLabel: kind === 'send' ? 'Send' : kind === 'interject' ? 'Interject' : 'Queue',\n confirm: false,\n run: () => (kind === 'send' ? sendVerseTurn(sessionId, text) : enqueueFollowUp(sessionId, text, kind === 'interject' ? { sendNow: true } : {})),\n success: kind === 'queue' ? 'Queued for after this turn' : undefined,\n // Clear only what was sent: words typed while it was in flight stay.\n onDone: () => setDraft((current) => (current.trim() === text ? '' : current)),\n });\n };\n\n const refresh = () => {\n if (pane === 'changes') setChangesReload((n) => n + 1);\n else setReload((n) => n + 1);\n };\n\n // ---- states before there is a chat to show --------------------------------\n\n if (head.loadError && !session) {\n const { title, reason } = describeLoadError(head.loadError);\n return (\n <Screen title=\"Agent\" onBack={back} backLabel=\"Agents\">\n <ErrorState title={title} reason={reason} onRetry={() => setReload((n) => n + 1)} />\n <Button variant=\"plain\" block onClick={back}>Back to Agents</Button>\n </Screen>\n );\n }\n if (!head.loaded || !session) {\n return (\n <Screen title=\"Agent\" onBack={back} backLabel=\"Agents\">\n <SkeletonList rows={4} label=\"Loading the conversation\" />\n </Screen>\n );\n }\n\n // ---- the chat ---------------------------------------------------------------\n\n const badge = running\n ? <Badge tone=\"running\" dot pulse>Working</Badge>\n : session.status === 'error'\n ? <Badge tone=\"danger\">Failed</Badge>\n : <Badge tone=\"neutral\">Idle</Badge>;\n const who = [seatLabel(seats, session), modelLabel(seats, session)].filter(Boolean).join(' · ');\n\n const header = (\n <div className={styles.header}>\n <div className={styles.meta}>\n <span className={styles.who}>{who}</span>\n {badge}\n </div>\n <div className={styles.segmented} role=\"group\" aria-label=\"View\">\n <button type=\"button\" className={styles.segment} aria-pressed={pane === 'transcript'} onClick={() => showPane('transcript')}>Transcript</button>\n <button type=\"button\" className={styles.segment} aria-pressed={pane === 'changes'} onClick={() => showPane('changes')}>Changes</button>\n </div>\n {disconnected ? (\n <Banner tone=\"warning\">\n {reachability === 'offline'\n ? 'You’re offline. Showing what was loaded; sending resumes when you reconnect.'\n : 'Can’t reach your Mac. Showing what was loaded; sending resumes when it answers.'}\n </Banner>\n ) : head.stream === 'reconnecting' ? (\n <Banner tone=\"info\">Reconnecting to the live stream…</Banner>\n ) : null}\n </div>\n );\n\n const hint = disconnected\n ? 'Sending is paused until your Mac is reachable.'\n : running\n ? mode === 'interject'\n ? 'Interject stops the current turn and sends this next.'\n : 'Queue sends this after the current turn finishes.'\n : permissions.act === 'locked'\n ? 'Sending asks for the mutation token first.'\n : undefined;\n\n const footer = pane !== 'transcript'\n ? undefined\n : canAct ? (\n <MobileComposer\n value={draft}\n onChange={setDraft}\n onSubmit={submit}\n placeholder={running ? 'Tell it something now…' : 'Message this agent…'}\n submitLabel={running ? (mode === 'interject' ? 'Interject' : 'Queue') : 'Send'}\n disabled={disconnected}\n hint={hint}\n label=\"Message\"\n above={running ? (\n <div className={ui.chips} role=\"group\" aria-label=\"When to send\">\n <button type=\"button\" className={cx(ui.chip, styles.modeChip)} aria-pressed={mode === 'interject'} onClick={() => setMode('interject')}>Interject now</button>\n <button type=\"button\" className={cx(ui.chip, styles.modeChip)} aria-pressed={mode === 'queue'} onClick={() => setMode('queue')}>Queue for after</button>\n </div>\n ) : undefined}\n />\n ) : (\n <div className={ui.composer}>\n <p className={ui.composerHint}>{permissions.actReason ?? 'This device can read this chat but not send to it.'}</p>\n </div>\n );\n\n const trailing = running && canAct ? (\n <Button variant=\"destructiveTinted\" onClick={stop} disabled={disconnected}>Stop</Button>\n ) : null;\n\n return (\n <Screen\n title={session.title || 'Untitled chat'}\n onBack={back}\n backLabel=\"Agents\"\n trailing={trailing}\n header={header}\n footer={footer}\n onRefresh={refresh}\n label={pane === 'changes' ? 'Changes' : 'Transcript'}\n >\n {pane === 'changes' ? (\n <ChangesPane sessionId={sessionId} version={`${session.status}:${session.turnCount}:${changesReload}`} />\n ) : (\n <TranscriptPane sessionId={sessionId} running={running} canAct={canAct} />\n )}\n </Screen>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Transcript\n// ---------------------------------------------------------------------------\n\n/** Within this many pixels of the end counts as \"at the bottom\" (following the stream). */\nconst STICK_PX = 48;\n\n/**\n * Screen renders its children straight into its scroller, so the pane's\n * parent IS the scroll container (ui.tsx Screen).\n */\nfunction scrollerOf(pane: HTMLElement | null): HTMLElement | null {\n return pane?.parentElement ?? null;\n}\n\n/** A clock that ticks once a second while `on` (the typing line's elapsed time). */\nfunction useNow(on: boolean): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!on) return undefined;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [on]);\n return now;\n}\n\nfunction TranscriptPane({ sessionId, running, canAct }: { sessionId: string; running: boolean; canAct: boolean }) {\n const transcript = useVerseTranscript(sessionId);\n const live = useVerseLive(sessionId);\n const [limit, setLimit] = useState(TRANSCRIPT_WINDOW);\n const [jump, setJump] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n const stick = useRef(true);\n const streaming = running || transcript.live;\n const now = useNow(streaming);\n\n const all = useMemo(() => visibleItems(transcript.items), [transcript.items]);\n const shown = useMemo(() => windowItems(all, limit), [all, limit]);\n\n useEffect(() => {\n const el = scrollerOf(root.current);\n if (!el) return undefined;\n const onScroll = () => {\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= STICK_PX;\n stick.current = atBottom;\n if (atBottom) setJump(false);\n };\n el.addEventListener('scroll', onScroll, { passive: true });\n return () => el.removeEventListener('scroll', onScroll);\n }, []);\n\n // Follow new content while the operator is at the bottom; otherwise offer the pill.\n const last = all[all.length - 1];\n const signature = `${all.length}:${last?.key ?? ''}:${last && 'text' in last ? last.text.length : 0}:${last?.kind === 'tool' ? String(last.result !== null) : ''}:${streaming}`;\n useLayoutEffect(() => {\n const el = scrollerOf(root.current);\n if (!el) return;\n if (stick.current) el.scrollTop = el.scrollHeight;\n else setJump(true);\n }, [signature]);\n\n const toLatest = () => {\n const el = scrollerOf(root.current);\n stick.current = true;\n setJump(false);\n if (el) el.scrollTop = el.scrollHeight;\n };\n\n return (\n <div ref={root} className={styles.log} role=\"log\" aria-label=\"Conversation\" aria-live=\"off\">\n {shown.hidden > 0 ? (\n <Button variant=\"tinted\" block onClick={() => setLimit((n) => n + TRANSCRIPT_WINDOW)}>\n Show earlier ({shown.hidden})\n </Button>\n ) : null}\n {all.length === 0 && !streaming ? (\n <EmptyState title=\"No messages yet\" body={canAct ? 'Send the first message below.' : 'Messages sent from your Mac show up here.'} />\n ) : null}\n {shown.items.map((item) => <TranscriptEntry key={item.key} item={item} />)}\n {streaming ? (\n <p className={styles.typing} role=\"status\">\n <span className={cx(ui.dot, ui.pulse)} aria-hidden=\"true\" />\n <span>{liveStatusText(live, now)}</span>\n </p>\n ) : null}\n {jump ? (\n <div className={styles.jumpWrap}>\n <Button variant=\"primary\" className={styles.jump} onClick={toLatest}>Jump to latest</Button>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction TranscriptEntry({ item }: { item: TranscriptItem }) {\n switch (item.kind) {\n case 'user':\n return (\n <div className={styles.userRow}>\n <div className={styles.userBubble}>{item.text}</div>\n </div>\n );\n case 'assistant':\n return (\n <div className={styles.assistant}>\n {splitFences(item.text).map((seg, i) =>\n seg.kind === 'code' ? (\n <pre key={i} className={styles.code} aria-label={seg.lang ? `${seg.lang} code` : 'Code'}>{seg.text}</pre>\n ) : (\n <p key={i} className={styles.prose}>{seg.text}</p>\n ),\n )}\n </div>\n );\n case 'tool':\n return <ToolChip item={item} />;\n case 'thinking':\n return <ThinkingChip item={item} />;\n case 'remote-pr': {\n const href = safeHttpsUrl(item.url);\n return (\n <p className={styles.system} data-tone=\"info\">\n {href ? <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={styles.link}>Devin opened a pull request</a> : 'Devin opened a pull request'}\n </p>\n );\n }\n default: {\n const line = systemLine(item);\n return line ? <p className={styles.system} data-tone={line.tone}>{line.text}</p> : null;\n }\n }\n}\n\nfunction ToolChip({ item }: { item: Extract<TranscriptItem, { kind: 'tool' }> }) {\n const [open, setOpen] = useState(false);\n const summary = toolSummary(item.name, item.input);\n const state = item.result === null ? 'running' : item.result.isError ? 'error' : 'ok';\n const stateText = state === 'running' ? 'running' : state === 'error' ? 'failed' : shortElapsed(item.durationMs) ?? '';\n const output = item.result ? clipLines(item.result.output) : null;\n return (\n <div className={styles.tool}>\n <button type=\"button\" className={styles.toolChip} data-state={state} aria-expanded={open} onClick={() => setOpen((v) => !v)}>\n <span className={styles.toolText}>{summary}</span>\n {stateText ? <span className={styles.toolState}>{stateText}</span> : null}\n </button>\n {open ? (\n output ? (\n <>\n <pre className={styles.output} data-error={state === 'error' || undefined}>{output.text || 'No output.'}</pre>\n {output.hidden > 0 ? <p className={styles.note}>{output.hidden} more {output.hidden === 1 ? 'line' : 'lines'} — open this chat on your Mac for the full output.</p> : null}\n </>\n ) : (\n <p className={styles.note}>Still running — no output yet.</p>\n )\n ) : null}\n </div>\n );\n}\n\nfunction ThinkingChip({ item }: { item: Extract<TranscriptItem, { kind: 'thinking' }> }) {\n const [open, setOpen] = useState(false);\n return (\n <div className={styles.tool}>\n <button type=\"button\" className={cx(styles.toolChip, styles.thinkingChip)} aria-expanded={open} onClick={() => setOpen((v) => !v)}>\n <span className={styles.toolText}>{thinkingLabel(item)}</span>\n </button>\n {open ? (\n <p className={styles.thinkingText}>{item.redacted || !item.text.trim() ? 'The model kept this reasoning private.' : item.text}</p>\n ) : null}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Changes (read-only)\n// ---------------------------------------------------------------------------\n\ninterface RootDiff {\n rootId: string;\n name: string;\n diff: VerseCheckpointDiffResponse;\n}\n\ntype ChangesLoad =\n | { state: 'loading' }\n | { state: 'error'; message: string }\n | { state: 'empty'; reason: string | null }\n | { state: 'ready'; turnId: string; roots: RootDiff[] };\n\nconst NO_CHECKPOINT = 'VERSE_CHECKPOINT_UNAVAILABLE';\n\nfunction ChangesPane({ sessionId, version }: { sessionId: string; version: string }) {\n const [load, setLoad] = useState<ChangesLoad>({ state: 'loading' });\n const [retry, setRetry] = useState(0);\n const [open, setOpen] = useState<string | null>(null);\n\n useEffect(() => {\n const ctl = new AbortController();\n // Keep the last answer on screen while a refresh runs (no flash to a skeleton).\n setLoad((prev) => (prev.state === 'ready' ? prev : { state: 'loading' }));\n void (async () => {\n const list = await checkpointClient.list(sessionId, ctl.signal);\n // \"Everything this chat changed\": from the checkpoint before its FIRST\n // turn that has one, to the files on disk now.\n const first = list.turns.find(turnHasCheckpoint);\n if (!first) {\n const reason = list.turns.map(turnCheckpointError).find((r) => r !== null) ?? null;\n if (!ctl.signal.aborted) setLoad({ state: 'empty', reason });\n return;\n }\n const rootIds = first.roots.filter((r) => r.pre?.commit).map((r) => r.rootId);\n const names = new Map(list.roots.map((r) => [r.rootId, r.name]));\n const diffs = await Promise.all(\n rootIds.map((rootId) => checkpointClient.diff({ chatId: sessionId, turnId: first.turnId, rootId, mode: 'since' }, ctl.signal)),\n );\n if (ctl.signal.aborted) return;\n setLoad({\n state: 'ready',\n turnId: first.turnId,\n roots: diffs.map((diff, i) => ({ rootId: rootIds[i]!, name: names.get(rootIds[i]!) ?? 'Repository', diff })),\n });\n })().catch((err: unknown) => {\n if (ctl.signal.aborted) return;\n if (errorCode(err) === NO_CHECKPOINT) setLoad({ state: 'empty', reason: null });\n else setLoad({ state: 'error', message: describeCheckpointError(err) });\n });\n return () => ctl.abort();\n }, [sessionId, version, retry]);\n\n if (load.state === 'loading') return <SkeletonList rows={3} label=\"Loading changes\" />;\n if (load.state === 'error') return <ErrorState title=\"Couldn’t load the changes\" reason={load.message} onRetry={() => setRetry((n) => n + 1)} />;\n if (load.state === 'empty') {\n return <EmptyState title=\"No checkpoint for this chat yet\" body={load.reason ?? 'Verse snapshots a git repository when a turn starts there; changes show up after the first one.'} />;\n }\n\n const allFiles = load.roots.flatMap((r) => r.diff.files);\n const sum = totals(allFiles);\n const multi = load.roots.length > 1;\n return (\n <div className={styles.changes}>\n <p className={styles.summary} aria-label=\"Summary\">{diffSummary(sum)}</p>\n {allFiles.length === 0 ? <EmptyState title=\"No changes on disk\" body=\"Everything this chat changed has been undone, or it has not edited a file yet.\" /> : null}\n {load.roots.map((root) =>\n root.diff.files.length === 0 ? null : (\n <section key={root.rootId} className={ui.section} aria-label={root.name}>\n {multi ? <h2 className={styles.rootName}>{root.name}</h2> : null}\n <div className={ui.group}>\n {root.diff.files.map((file) => {\n const key = `${root.rootId}\\u0000${file.path}`;\n const expanded = open === key;\n return (\n <div key={key} className={styles.fileBlock}>\n <button type=\"button\" className={cx(ui.row, styles.fileRow)} aria-expanded={expanded} onClick={() => setOpen(expanded ? null : key)}>\n <span className={styles.fileStatus} data-status={file.status} title={STATUS_WORD[file.status]}>{file.status}</span>\n <span className={styles.filePath}>{file.oldPath && file.status === 'R' ? `${file.path} (was ${file.oldPath})` : file.path}</span>\n <span className={styles.fileCounts}>\n {file.binary ? 'binary' : <><span className={styles.add}>+{file.additions}</span> <span className={styles.del}>−{file.deletions}</span></>}\n </span>\n </button>\n {expanded ? <FilePatch sessionId={sessionId} turnId={load.turnId} rootId={root.rootId} file={file} /> : null}\n </div>\n );\n })}\n </div>\n </section>\n ),\n )}\n <p className={ui.sectionFooter}>Read-only here. Review and undo on your Mac.</p>\n </div>\n );\n}\n\ntype PatchLoad = { state: 'loading' } | { state: 'error'; message: string } | { state: 'ready'; diff: VerseCheckpointDiffResponse };\n\nfunction FilePatch({ sessionId, turnId, rootId, file }: { sessionId: string; turnId: string; rootId: string; file: VerseCheckpointDiffFile }) {\n const [load, setLoad] = useState<PatchLoad>({ state: 'loading' });\n useEffect(() => {\n const ctl = new AbortController();\n setLoad({ state: 'loading' });\n checkpointClient.diff({ chatId: sessionId, turnId, rootId, mode: 'since', file: file.path }, ctl.signal).then(\n (diff) => { if (!ctl.signal.aborted) setLoad({ state: 'ready', diff }); },\n (err: unknown) => { if (!ctl.signal.aborted) setLoad({ state: 'error', message: describeCheckpointError(err) }); },\n );\n return () => ctl.abort();\n }, [sessionId, turnId, rootId, file.path]);\n\n if (load.state === 'loading') return <p className={styles.note} role=\"status\">Loading the diff…</p>;\n if (load.state === 'error') return <p className={styles.note} role=\"alert\">{load.message}</p>;\n const patch = load.diff.patch;\n if (file.binary || patch?.binary) return <p className={styles.note}>Binary file — open it on your Mac to compare.</p>;\n if (!file.captured) return <p className={styles.note}>Too large to snapshot, so there is no diff for it.</p>;\n if (!patch || !patch.text.trim()) return <p className={styles.note}>No text changes.</p>;\n return (\n <>\n <div className={styles.patch} aria-label={`Diff of ${file.path}`}>\n {diffLines(patch.text).map((line, i) => (\n <div key={i} className={styles.line} data-kind={line.kind}>{line.text || ' '}</div>\n ))}\n </div>\n {patch.truncated ? <p className={styles.note}>This diff was cut short — see the whole change on your Mac.</p> : null}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{t as r}from"./MutationTokenDialog-DlY2VLVh.js";import{t as i}from"./Segmented-BA8RmKYq.js";import{n as a,t as o}from"./use-token-gate-h5QAERLT.js";import{t as s}from"./Sheet-Bk64-Hlt.js";import{t as c}from"./Switch-Cqc_bSoh.js";import{t as l}from"./agent-tools-client-DmJq7zlr.js";import{t as u}from"./AgentTools.module-CkjqeuMS.js";var d=e(n(),1),f=t(),p={off:`The agent cannot use Verse terminals.`,agent:`The agent opens its own terminal tabs (marked Agent) and runs commands there. You can watch, type to take over, and hand back.`,shared:`Also lets you share one of your own shells with the agent, per tab, from the terminal's More menu.`},m={off:`The agent cannot use the Browser pane.`,look:`Open pages, take screenshots, read text and the console — on localhost, or sites you allowed in the Browser pane.`,"act-localhost":`Also click, type and fill forms — on localhost pages only.`,"act-allowed":`Also click, type and fill forms on sites you allowed for this chat.`};function h({sessionId:e,open:t,onClose:n,api:h=l}){let g=(0,d.useId)(),_=a(),[v,y]=(0,d.useState)(null),[b,x]=(0,d.useState)(null),[S,C]=(0,d.useState)(!1),[w,T]=(0,d.useState)(``);(0,d.useEffect)(()=>{if(!t)return;let n=new AbortController;return h.state(e,n.signal).then(e=>{y(e),T(e.grant.computerApps.join(`, `)),x(null)},e=>{n.signal.aborted||x(o(e))}),()=>n.abort()},[h,t,e]);let E=(0,d.useCallback)(async t=>{C(!0);try{let n=await _.run(`Change what this chat's agent may do`,()=>h.setGrant({sessionId:e,...t}));n&&(y(n),x(null))}catch(e){x(o(e))}finally{C(!1)}},[h,_,e]),D=v?.grant??null,O=v?.seatLabel??`the agent`,k=v&&!v.support.supported?v.support.reason:null,A=S||v===null||k!==null,j=D?.browser===`act-localhost`||D?.browser===`act-allowed`;return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(s,{open:t,onClose:n,titleId:g,title:`Agent tools`,description:`What ${O} may do on this Mac in this chat, through Verse. Changes apply at once.`,footer:(0,f.jsx)(`p`,{className:u.footnote,children:`Everything starts off again when Verse restarts. Destructive commands always ask you first.`}),children:(0,f.jsxs)(`div`,{className:u.sheetBody,"aria-busy":v===null||S||void 0,children:[b?(0,f.jsx)(`p`,{className:u.error,role:`alert`,children:b}):null,k?(0,f.jsx)(`p`,{className:u.warning,role:`note`,children:k}):null,v&&!v.desktop?(0,f.jsx)(`p`,{className:u.warning,role:`note`,children:`Terminal and computer tools need the Ashlr desktop app; this Verse server has no built-in terminal.`}):null,v&&v.support.supported?(0,f.jsx)(`p`,{className:u.quiet,children:v.support.note}):null,(0,f.jsxs)(`section`,{className:u.group,"aria-labelledby":`${g}-terminal`,children:[(0,f.jsx)(`h3`,{id:`${g}-terminal`,className:u.groupTitle,children:`Terminal`}),(0,f.jsx)(i,{"aria-labelledby":`${g}-terminal`,size:`sm`,block:!0,value:D?.terminal??`off`,onChange:e=>void E({terminal:e}),options:[{value:`off`,label:`Off`,disabled:A},{value:`agent`,label:`Agent tabs`,disabled:A},{value:`shared`,label:`Share my shells`,disabled:A}]}),(0,f.jsx)(`p`,{className:u.quiet,children:p[D?.terminal??`off`]})]}),(0,f.jsxs)(`section`,{className:u.group,"aria-labelledby":`${g}-browser`,children:[(0,f.jsx)(`h3`,{id:`${g}-browser`,className:u.groupTitle,children:`Browser`}),(0,f.jsx)(i,{"aria-labelledby":`${g}-browser`,size:`sm`,block:!0,value:D?.browser??`off`,onChange:e=>void E({browser:e}),options:[{value:`off`,label:`Off`,disabled:A},{value:`look`,label:`Look`,disabled:A},{value:`act-localhost`,label:`Act: localhost`,disabled:A},{value:`act-allowed`,label:`Act: allowed sites`,disabled:A}]}),(0,f.jsx)(`p`,{className:u.quiet,children:m[D?.browser??`off`]}),j?(0,f.jsx)(c,{checked:D?.browserScript===!0,disabled:A,onChange:e=>void E({browserScript:e}),label:`Allow page scripts (run JavaScript in the page)`}):null]}),(0,f.jsxs)(`section`,{className:u.group,"aria-labelledby":`${g}-computer`,children:[(0,f.jsx)(`h3`,{id:`${g}-computer`,className:u.groupTitle,children:`Computer`}),(0,f.jsx)(i,{"aria-labelledby":`${g}-computer`,size:`sm`,block:!0,value:D?.computer??`off`,onChange:e=>void E({computer:e}),options:[{value:`off`,label:`Off`,disabled:A},{value:`apps`,label:`Listed apps`,disabled:A}]}),D?.computer===`apps`?(0,f.jsxs)(`form`,{className:u.apps,onSubmit:e=>{e.preventDefault(),E({computerApps:w.split(`,`).map(e=>e.trim()).filter(Boolean)})},children:[(0,f.jsx)(`label`,{className:u.quiet,htmlFor:`${g}-apps`,children:`Apps the agent may see and drive (comma-separated)`}),(0,f.jsxs)(`div`,{className:u.appsRow,children:[(0,f.jsx)(`input`,{id:`${g}-apps`,className:u.input,value:w,disabled:A,placeholder:`Simulator, Xcode`,onChange:e=>T(e.target.value)}),(0,f.jsx)(`button`,{type:`submit`,className:u.smallButton,disabled:A,children:`Save`})]})]}):(0,f.jsx)(`p`,{className:u.quiet,children:`The agent cannot see or drive other apps.`})]})]})}),(0,f.jsx)(r,{..._.dialog,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`})]})}export{h as AgentToolsSheet};
|
|
2
|
+
//# sourceMappingURL=AgentToolsSheet-BP3h-UbZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentToolsSheet-BP3h-UbZ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/agent-tools/AgentToolsSheet.tsx"],"sourcesContent":["/**\n * routes/verse/agent-tools/AgentToolsSheet.tsx — the chat's \"Agent tools\"\n * sheet (3.15): what this chat's seat may do on this Mac through Verse's MCP\n * server (core/verse/verse-mcp*.ts).\n *\n * Terminal off / agent tabs / share my shells\n * Browser off / look / act on localhost / act on allowed sites (+ page scripts)\n * Computer off / listed apps\n *\n * Changes apply at once — a running turn loses a tool the moment it is\n * switched off. Nothing here is remembered across a Verse restart: the tools\n * start off again, like the Browser pane's agent access. Loaded lazily (the\n * chat's first paint never pays for it).\n */\nimport { useCallback, useEffect, useId, useState } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport type {\n VerseAgentBrowserMode,\n VerseAgentComputerMode,\n VerseAgentTerminalMode,\n VerseAgentToolsGrantRequest,\n VerseAgentToolsState,\n} from '../../../../core/verse/verse-mcp-types.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { agentToolsApi, type AgentToolsApi } from './agent-tools-client.js';\nimport styles from './AgentTools.module.css';\n\nexport interface AgentToolsSheetProps {\n sessionId: string;\n open: boolean;\n onClose: () => void;\n api?: AgentToolsApi;\n}\n\nconst TERMINAL_HELP: Record<VerseAgentTerminalMode, string> = {\n off: 'The agent cannot use Verse terminals.',\n agent: 'The agent opens its own terminal tabs (marked Agent) and runs commands there. You can watch, type to take over, and hand back.',\n shared: 'Also lets you share one of your own shells with the agent, per tab, from the terminal\\'s More menu.',\n};\n\nconst BROWSER_HELP: Record<VerseAgentBrowserMode, string> = {\n off: 'The agent cannot use the Browser pane.',\n look: 'Open pages, take screenshots, read text and the console — on localhost, or sites you allowed in the Browser pane.',\n 'act-localhost': 'Also click, type and fill forms — on localhost pages only.',\n 'act-allowed': 'Also click, type and fill forms on sites you allowed for this chat.',\n};\n\nexport function AgentToolsSheet({ sessionId, open, onClose, api = agentToolsApi }: AgentToolsSheetProps) {\n const titleId = useId();\n const gate = useTokenGate();\n const [state, setState] = useState<VerseAgentToolsState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [apps, setApps] = useState('');\n\n useEffect(() => {\n if (!open) return;\n const abort = new AbortController();\n api.state(sessionId, abort.signal).then(\n (next) => { setState(next); setApps(next.grant.computerApps.join(', ')); setError(null); },\n (err: unknown) => { if (!abort.signal.aborted) setError(describeContextError(err)); },\n );\n return () => abort.abort();\n }, [api, open, sessionId]);\n\n const change = useCallback(async (patch: Omit<VerseAgentToolsGrantRequest, 'sessionId'>) => {\n setBusy(true);\n try {\n const next = await gate.run('Change what this chat\\'s agent may do', () => api.setGrant({ sessionId, ...patch }));\n if (next) { setState(next); setError(null); }\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(false);\n }\n }, [api, gate, sessionId]);\n\n const grant = state?.grant ?? null;\n const seat = state?.seatLabel ?? 'the agent';\n const unsupported = state && !state.support.supported ? state.support.reason : null;\n const disabled = busy || state === null || unsupported !== null;\n const act = grant?.browser === 'act-localhost' || grant?.browser === 'act-allowed';\n\n return (\n <>\n <Sheet open={open} onClose={onClose} titleId={titleId} title=\"Agent tools\"\n description={`What ${seat} may do on this Mac in this chat, through Verse. Changes apply at once.`}\n footer={<p className={styles.footnote}>Everything starts off again when Verse restarts. Destructive commands always ask you first.</p>}>\n <div className={styles.sheetBody} aria-busy={state === null || busy || undefined}>\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n {unsupported ? <p className={styles.warning} role=\"note\">{unsupported}</p> : null}\n {state && !state.desktop ? (\n <p className={styles.warning} role=\"note\">Terminal and computer tools need the Ashlr desktop app; this Verse server has no built-in terminal.</p>\n ) : null}\n {state && state.support.supported ? <p className={styles.quiet}>{state.support.note}</p> : null}\n\n <section className={styles.group} aria-labelledby={`${titleId}-terminal`}>\n <h3 id={`${titleId}-terminal`} className={styles.groupTitle}>Terminal</h3>\n <Segmented<VerseAgentTerminalMode>\n aria-labelledby={`${titleId}-terminal`}\n size=\"sm\"\n block\n value={grant?.terminal ?? 'off'}\n onChange={(terminal) => void change({ terminal })}\n options={[\n { value: 'off', label: 'Off', disabled },\n { value: 'agent', label: 'Agent tabs', disabled },\n { value: 'shared', label: 'Share my shells', disabled },\n ]}\n />\n <p className={styles.quiet}>{TERMINAL_HELP[grant?.terminal ?? 'off']}</p>\n </section>\n\n <section className={styles.group} aria-labelledby={`${titleId}-browser`}>\n <h3 id={`${titleId}-browser`} className={styles.groupTitle}>Browser</h3>\n <Segmented<VerseAgentBrowserMode>\n aria-labelledby={`${titleId}-browser`}\n size=\"sm\"\n block\n value={grant?.browser ?? 'off'}\n onChange={(browser) => void change({ browser })}\n options={[\n { value: 'off', label: 'Off', disabled },\n { value: 'look', label: 'Look', disabled },\n { value: 'act-localhost', label: 'Act: localhost', disabled },\n { value: 'act-allowed', label: 'Act: allowed sites', disabled },\n ]}\n />\n <p className={styles.quiet}>{BROWSER_HELP[grant?.browser ?? 'off']}</p>\n {act ? (\n <Switch checked={grant?.browserScript === true} disabled={disabled}\n onChange={(browserScript) => void change({ browserScript })}\n label=\"Allow page scripts (run JavaScript in the page)\" />\n ) : null}\n </section>\n\n <section className={styles.group} aria-labelledby={`${titleId}-computer`}>\n <h3 id={`${titleId}-computer`} className={styles.groupTitle}>Computer</h3>\n <Segmented<VerseAgentComputerMode>\n aria-labelledby={`${titleId}-computer`}\n size=\"sm\"\n block\n value={grant?.computer ?? 'off'}\n onChange={(computer) => void change({ computer })}\n options={[\n { value: 'off', label: 'Off', disabled },\n { value: 'apps', label: 'Listed apps', disabled },\n ]}\n />\n {grant?.computer === 'apps' ? (\n <form className={styles.apps} onSubmit={(event) => {\n event.preventDefault();\n void change({ computerApps: apps.split(',').map((a) => a.trim()).filter(Boolean) });\n }}>\n <label className={styles.quiet} htmlFor={`${titleId}-apps`}>Apps the agent may see and drive (comma-separated)</label>\n <div className={styles.appsRow}>\n <input id={`${titleId}-apps`} className={styles.input} value={apps} disabled={disabled}\n placeholder=\"Simulator, Xcode\" onChange={(event) => setApps(event.target.value)} />\n <button type=\"submit\" className={styles.smallButton} disabled={disabled}>Save</button>\n </div>\n </form>\n ) : (\n <p className={styles.quiet}>The agent cannot see or drive other apps.</p>\n )}\n </section>\n </div>\n </Sheet>\n <MutationTokenDialog {...gate.dialog} tokenLabel=\"Mutation token\" tokenHelp=\"the mutation token ashlr verse printed\" />\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{t as r}from"./MutationTokenDialog-DlY2VLVh.js";import{j as i}from"./VerseShared-Bf-XTHCh.js";import{n as a,t as o}from"./use-token-gate-h5QAERLT.js";import{t as s}from"./agent-tools-client-DmJq7zlr.js";import{t as c}from"./AgentTools.module-CkjqeuMS.js";var l=e(n(),1),u=t(),d=2e3,f=1e4,p=5,m={ok:`done`,error:`failed`,denied:`denied`,pending:`running`};function h({sessionId:e,onOpenSheet:t,api:n=s,now:h=Date.now}){let g=a(),[_,v]=(0,l.useState)(!1),[y,b]=(0,l.useState)(`the agent`),[x,S]=(0,l.useState)(null),[C,w]=(0,l.useState)(null),[,T]=(0,l.useState)(0),E=(0,l.useCallback)(async()=>{try{let t=await n.state(e);v(t.scopes.length>0),b(t.seatLabel)}catch{}},[n,e]),D=(0,l.useCallback)(async()=>{try{S(await n.activity(e))}catch{}},[n,e]);(0,l.useEffect)(()=>{E()},[E]),i(()=>{E()},f),(0,l.useEffect)(()=>{_&&D()},[_,D]),i(()=>{D(),T(e=>e+1)},d,{enabled:_});let O=async(t,r)=>{try{await g.run(`Answer the agent's request`,()=>n.confirm(e,t,r).then(()=>!0))&&(S(e=>e&&{...e,pending:e.pending.filter(e=>e.id!==t)}),w(null))}catch(e){w(o(e))}D()},k=async e=>{try{await g.run(`Hand the terminal back to the agent`,()=>n.resume(e).then(()=>!0)),w(null)}catch(e){w(o(e))}D()},A=x?.pending??[],j=(x?.tabs??[]).filter(e=>e.takenOverAt!==null),M=(x?.actions??[]).slice(0,p);return!_&&A.length===0?(0,u.jsx)(r,{...g.dialog,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`}):(0,u.jsxs)(`div`,{className:c.strip,"data-testid":`agent-tools-strip`,children:[C?(0,u.jsx)(`p`,{className:c.error,role:`alert`,children:C}):null,A.map(e=>{let t=Math.max(0,Math.round((Date.parse(e.expiresAt)-h())/1e3));return(0,u.jsxs)(`div`,{className:c.confirm,role:`alertdialog`,"aria-labelledby":`${e.id}-title`,"aria-describedby":`${e.id}-why`,children:[(0,u.jsxs)(`div`,{className:c.confirmText,children:[(0,u.jsxs)(`span`,{id:`${e.id}-title`,className:c.confirmTitle,children:[y,` wants to run`]}),(0,u.jsx)(`code`,{className:c.command,children:e.command}),(0,u.jsxs)(`span`,{id:`${e.id}-why`,className:c.quiet,children:[e.reason,` · `,t,`s left`]})]}),(0,u.jsxs)(`div`,{className:c.confirmActions,children:[(0,u.jsx)(`button`,{type:`button`,className:c.smallButton,onClick:()=>void O(e.id,`once`),children:`Allow once`}),e.rule.startsWith(`terminal-run-`)?null:(0,u.jsx)(`button`,{type:`button`,className:c.smallButton,onClick:()=>void O(e.id,`chat`),title:`Allow commands like this for the rest of this chat`,children:`Allow for chat`}),(0,u.jsx)(`button`,{type:`button`,className:`${c.smallButton} ${c.deny}`,onClick:()=>void O(e.id,`deny`),children:`Deny`})]})]},e.id)}),j.map(e=>(0,u.jsxs)(`div`,{className:c.takeover,role:`status`,children:[(0,u.jsxs)(`span`,{children:[`You took over terminal `,e.tabId,`. `,y,` is paused there.`]}),(0,u.jsx)(`button`,{type:`button`,className:c.smallButton,onClick:()=>void k(e.tabId),children:`Resume agent`})]},e.tabId)),_?(0,u.jsxs)(`div`,{className:c.actions,"aria-label":`${y}'s recent actions`,children:[(0,u.jsx)(`button`,{type:`button`,className:c.toolsChip,onClick:t,title:`Agent tools for this chat`,children:`Agent tools on`}),M.length===0?(0,u.jsx)(`span`,{className:c.quiet,children:`No actions yet.`}):null,M.map(e=>(0,u.jsxs)(`span`,{className:c.action,"data-outcome":e.outcome,title:`${e.tool} · ${e.at}`,children:[(0,u.jsx)(`span`,{className:c.actionTool,children:e.tool.replace(/^terminal_/,``).replace(/^browser_/,`browser `)}),(0,u.jsx)(`span`,{className:c.actionSummary,children:e.summary}),(0,u.jsx)(`span`,{className:c.actionOutcome,children:m[e.outcome]})]},e.id))]}):null,(0,u.jsx)(r,{...g.dialog,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`})]})}export{h as AgentToolsStrip};
|
|
2
|
+
//# sourceMappingURL=AgentToolsStrip--hf18knJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentToolsStrip--hf18knJ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/agent-tools/AgentToolsStrip.tsx"],"sourcesContent":["/**\n * routes/verse/agent-tools/AgentToolsStrip.tsx — above the composer, while a\n * chat has agent tools on (3.15):\n *\n * - a destructive command waiting for you: the command, why it asks, the\n * seconds left, and [Allow once] [Allow for chat] [Deny] — no answer in\n * 120 s is a refusal the agent is told about;\n * - a terminal you took over (you typed in a tab the agent was driving):\n * [Resume agent] hands it back;\n * - the agent's recent actions, newest first.\n *\n * Polls the chat's activity every 2 s only while tools are on and the chat is\n * visible; renders nothing otherwise. Loaded lazily.\n */\nimport { useCallback, useEffect, useState } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport type { VerseAgentAction, VerseAgentToolsActivity, VerseMcpConfirmAnswer } from '../../../../core/verse/verse-mcp-types.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { agentToolsApi, type AgentToolsApi } from './agent-tools-client.js';\nimport styles from './AgentTools.module.css';\n\nexport const AGENT_TOOLS_ACTIVITY_POLL_MS = 2_000;\nexport const AGENT_TOOLS_STATE_POLL_MS = 10_000;\nconst SHOWN_ACTIONS = 5;\n\nexport interface AgentToolsStripProps {\n sessionId: string;\n /** Opens the Agent tools sheet. */\n onOpenSheet?: () => void;\n api?: AgentToolsApi;\n now?: () => number;\n}\n\nconst OUTCOME_WORD: Record<VerseAgentAction['outcome'], string> = { ok: 'done', error: 'failed', denied: 'denied', pending: 'running' };\n\nexport function AgentToolsStrip({ sessionId, onOpenSheet, api = agentToolsApi, now = Date.now }: AgentToolsStripProps) {\n const gate = useTokenGate();\n const [enabled, setEnabled] = useState(false);\n const [seat, setSeat] = useState('the agent');\n const [activity, setActivity] = useState<VerseAgentToolsActivity | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [, setTick] = useState(0);\n\n const loadState = useCallback(async () => {\n try {\n const state = await api.state(sessionId);\n setEnabled(state.scopes.length > 0);\n setSeat(state.seatLabel);\n } catch { /* the strip is optional: a failed read shows nothing */ }\n }, [api, sessionId]);\n\n const loadActivity = useCallback(async () => {\n try {\n setActivity(await api.activity(sessionId));\n } catch { /* keep the last answer */ }\n }, [api, sessionId]);\n\n useEffect(() => { void loadState(); }, [loadState]);\n usePollWhileVisible(() => { void loadState(); }, AGENT_TOOLS_STATE_POLL_MS);\n useEffect(() => { if (enabled) void loadActivity(); }, [enabled, loadActivity]);\n usePollWhileVisible(() => { void loadActivity(); setTick((t) => t + 1); }, AGENT_TOOLS_ACTIVITY_POLL_MS, { enabled });\n\n const answer = async (id: string, value: VerseMcpConfirmAnswer) => {\n try {\n const done = await gate.run('Answer the agent\\'s request', () => api.confirm(sessionId, id, value).then(() => true));\n if (done) {\n setActivity((prev) => (prev ? { ...prev, pending: prev.pending.filter((p) => p.id !== id) } : prev));\n setError(null);\n }\n } catch (err) {\n setError(describeContextError(err));\n }\n void loadActivity();\n };\n\n const resume = async (tabId: string) => {\n try {\n await gate.run('Hand the terminal back to the agent', () => api.resume(tabId).then(() => true));\n setError(null);\n } catch (err) {\n setError(describeContextError(err));\n }\n void loadActivity();\n };\n\n const pending = activity?.pending ?? [];\n const takenOver = (activity?.tabs ?? []).filter((t) => t.takenOverAt !== null);\n const actions = (activity?.actions ?? []).slice(0, SHOWN_ACTIONS);\n if (!enabled && pending.length === 0) return <MutationTokenDialog {...gate.dialog} tokenLabel=\"Mutation token\" tokenHelp=\"the mutation token ashlr verse printed\" />;\n\n return (\n <div className={styles.strip} data-testid=\"agent-tools-strip\">\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n {pending.map((p) => {\n const left = Math.max(0, Math.round((Date.parse(p.expiresAt) - now()) / 1000));\n return (\n <div key={p.id} className={styles.confirm} role=\"alertdialog\" aria-labelledby={`${p.id}-title`} aria-describedby={`${p.id}-why`}>\n <div className={styles.confirmText}>\n <span id={`${p.id}-title`} className={styles.confirmTitle}>{seat} wants to run</span>\n <code className={styles.command}>{p.command}</code>\n <span id={`${p.id}-why`} className={styles.quiet}>{p.reason} · {left}s left</span>\n </div>\n <div className={styles.confirmActions}>\n <button type=\"button\" className={styles.smallButton} onClick={() => void answer(p.id, 'once')}>Allow once</button>\n {!p.rule.startsWith('terminal-run-') ? <button type=\"button\" className={styles.smallButton} onClick={() => void answer(p.id, 'chat')}\n title=\"Allow commands like this for the rest of this chat\">Allow for chat</button> : null}\n <button type=\"button\" className={`${styles.smallButton} ${styles.deny}`} onClick={() => void answer(p.id, 'deny')}>Deny</button>\n </div>\n </div>\n );\n })}\n {takenOver.map((t) => (\n <div key={t.tabId} className={styles.takeover} role=\"status\">\n <span>You took over terminal {t.tabId}. {seat} is paused there.</span>\n <button type=\"button\" className={styles.smallButton} onClick={() => void resume(t.tabId)}>Resume agent</button>\n </div>\n ))}\n {enabled ? (\n <div className={styles.actions} aria-label={`${seat}'s recent actions`}>\n <button type=\"button\" className={styles.toolsChip} onClick={onOpenSheet} title=\"Agent tools for this chat\">Agent tools on</button>\n {actions.length === 0 ? <span className={styles.quiet}>No actions yet.</span> : null}\n {actions.map((a) => (\n <span key={a.id} className={styles.action} data-outcome={a.outcome} title={`${a.tool} · ${a.at}`}>\n <span className={styles.actionTool}>{a.tool.replace(/^terminal_/, '').replace(/^browser_/, 'browser ')}</span>\n <span className={styles.actionSummary}>{a.summary}</span>\n <span className={styles.actionOutcome}>{OUTCOME_WORD[a.outcome]}</span>\n </span>\n ))}\n </div>\n ) : null}\n <MutationTokenDialog {...gate.dialog} tokenLabel=\"Mutation token\" tokenHelp=\"the mutation token ashlr verse printed\" />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{W as r,l as i,o as a}from"./global-w7KDTTi0.js";import{S as o,b as s,w as c}from"./VerseShared-Bf-XTHCh.js";import{n as l}from"./verse-bootstrap-query-B3vFD9XK.js";import{a as u,f as ee,i as te,o as d,p as f,r as p,u as ne}from"./VerseMobileApp-ePNuVERe.js";import{C as m,b as h,h as g,u as _}from"./verse-model-DAOz9LrY.js";import{r as v}from"./sidebar-model-COzIPSiP.js";import{i as y,n as b}from"./use-chat-activity-_tBmEPPN.js";import{c as x,i as S,n as C,o as w,r as T,t as E}from"./ui-parts-wvov2ktB.js";import{o as D}from"./agent-transcript-model-D-34Ll59.js";var O=e(n(),1),k=[{id:`working`,label:`Working`,empty:`No agent is running right now.`},{id:`needs-you`,label:`Needs you`,empty:`No agent is waiting on you.`},{id:`review`,label:`Ready for review`,empty:`Nothing new to review.`},{id:`done`,label:`Done`,empty:`No finished agents yet.`}];function A(e){return e.status.kind===`running`?`working`:e.needsYou||e.status.kind===`failed`?`needs-you`:e.status.kind===`unread`?`review`:`done`}function j(e){let t=v({sessions:e.sessions,projects:e.projects,query:``,filter:`all`,activity:e.activity,meta:e.meta,localSeen:e.localSeen,selectedId:null}),n=new Map(k.map(e=>[e.id,[]]));for(let e of t.groups)for(let t of e.rows)t.archived||n.get(A(t)).push(t);let r=(e,t)=>t.session.updatedAt.localeCompare(e.session.updatedAt);return k.map(e=>({...e,rows:n.get(e.id).sort(r)}))}function M(e){let t={working:0,"needs-you":0,review:0,done:0};for(let n of e)t[n.id]=n.rows.length;return t}var N={chipCount:`_chipCount_qaw2j_3`,columnTitle:`_columnTitle_qaw2j_9`,who:`_who_qaw2j_19`,status:`_status_qaw2j_20`,failed:`_failed_qaw2j_29`},P=t(),F={working:`Working`,"needs-you":`Needs you`,review:`Review`,done:`Done`};function I(e){for(let t of k)if(e[t.id]>0)return t.id;return null}function L(e,t,n=Date.now()){let{status:r}=e;switch(r.kind){case`running`:{let i=t?.live??null,a=i?.tool?`Using ${i.tool}`:e.live?.text??`Working`,o=r.startedAt?Date.parse(r.startedAt):NaN,s=Number.isFinite(o)?D(n-o):null;return s?`${a} · ${s}`:a}case`failed`:return`Failed`;case`unread`:return`${r.newTurns} new ${r.newTurns===1?`turn`:`turns`}`;case`time`:{if(e.needsYou)return`Waiting on you`;let t=_(r.at,n);return t?t===`now`?`Just now`:/^\d+[mhd]$/.test(t)?`${t} ago`:t:`unknown`}}}function R(e,t){switch(t){case`working`:return{tone:`running`,label:`Working`,pulse:!0};case`needs-you`:return e.status.kind===`failed`?{tone:`danger`,label:`Failed`,pulse:!1}:{tone:`warning`,label:`Needs you`,pulse:!1};case`review`:return{tone:`info`,label:`New`,pulse:!1};case`done`:return{tone:`neutral`,label:`Done`,pulse:!1}}}function z(){return Promise.all([r(c.key,()=>c.fetch(),!0),r(s.key,()=>s.fetch(),!0),r(o.key,()=>o.fetch(),!0)])}function B(){let{permissions:e,reachability:t,navigate:n,refreshActivity:r}=f(),o=i(c),s=i(l),{activity:_,meta:v,localSeen:D}=b(),[A,B]=(0,O.useState)(null);(0,O.useEffect)(()=>y(),[]);let V=o.data??s.data?.sessions??null,H=s.data?.projects,U=s.data?.seats,W=(0,O.useMemo)(()=>V?j({sessions:V,projects:H??[],activity:_,meta:v,localSeen:D}):null,[V,H,_,v,D]),G=W?M(W):null,K=A??(G?I(G):null)??`working`,q=W?.find(e=>e.id===K)??null,J=(0,O.useMemo)(()=>new Map((_?.running??[]).map(e=>[e.sessionId,e])),[_]),Y=ee(e),X=t===`offline`||t===`unreachable`,re=G?G.working+G[`needs-you`]+G.review+G.done:0,Z=(0,O.useCallback)(()=>Promise.all([z(),r()]),[r]),ie=(0,O.useCallback)(()=>void Z().catch(()=>void 0),[Z]),Q=(0,O.useCallback)(()=>n({screen:`new`}),[n]),ae=Y?(0,P.jsxs)(p,{variant:`plain`,onClick:Q,disabled:X,"aria-label":`New agent`,children:[(0,P.jsx)(ne,{size:18}),(0,P.jsx)(`span`,{children:`New`})]}):null,$;return $=!V||!W||!G?o.status===`error`?(0,P.jsx)(S,{title:`Couldn’t load your agents`,reason:a(o.error),onRetry:ie}):(0,P.jsx)(u,{rows:4,label:`Loading agents`}):re===0?(0,P.jsx)(T,{title:`No agents yet`,body:`Chats you start here or on your Mac show up here, grouped by what they need from you.`,action:Y?(0,P.jsx)(p,{variant:`primary`,onClick:Q,disabled:X,children:`+ New agent`}):void 0}):(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(`div`,{className:x.chips,role:`group`,"aria-label":`Show agents`,children:k.map(e=>(0,P.jsxs)(`button`,{type:`button`,className:x.chip,"aria-pressed":e.id===K,onClick:()=>B(e.id),children:[F[e.id],` `,(0,P.jsx)(`span`,{className:N.chipCount,children:G[e.id]})]},e.id))}),(0,P.jsx)(`h2`,{className:N.columnTitle,children:q?.label??``}),q&&q.rows.length>0?(0,P.jsx)(`div`,{className:x.group,children:q.rows.map(e=>{let t=e.session,r=R(e,q.id),i=[m(U??[],t),g(U??[],t),h(t.projectPath,H??[])].filter(Boolean).join(` · `);return(0,P.jsx)(w,{title:t.title||`Untitled chat`,subtitle:(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(`span`,{className:N.who,children:i}),(0,P.jsx)(`span`,{className:d(N.status,e.status.kind===`failed`&&N.failed),children:L(e,J.get(t.id))})]}),trailing:(0,P.jsx)(E,{tone:r.tone,dot:r.tone===`running`,pulse:r.pulse,children:r.label}),onClick:()=>n({screen:`agent`,id:t.id,pane:`transcript`})},t.id)})}):(0,P.jsx)(T,{title:q?.empty??`Nothing here.`})]}),(0,P.jsxs)(te,{title:`Agents`,large:!0,trailing:ae,onRefresh:Z,label:`Agents`,children:[X?(0,P.jsx)(C,{tone:`warning`,children:t===`offline`?`You’re offline. This is the last list your phone saw; starting agents resumes when you reconnect.`:`Can’t reach your Mac. This is the last list your phone saw; starting agents resumes when it answers.`}):null,V&&o.status===`error`?(0,P.jsxs)(C,{tone:`warning`,children:[`Couldn’t refresh the list: `,a(o.error)]}):null,$]})}export{B as AgentsScreen,F as CHIP_LABEL,R as agentBadge,L as agentStatusLine,I as defaultColumn};
|
|
2
|
+
//# sourceMappingURL=AgentsScreen-BR-j0Fzd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentsScreen-BR-j0Fzd.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/agents-board-model.ts","../../../../../../src/web-ui/routes/verse/mobile/screens/AgentsScreen.module.css","../../../../../../src/web-ui/routes/verse/mobile/screens/AgentsScreen.tsx"],"sourcesContent":["/**\n * routes/verse/chat/agents-board-model.ts — every chat on a four-column\n * board: Working / Needs you / Ready for review / Done. Pure.\n *\n * Built ON the chat list's own row model (sidebar-model.ts buildSidebar), so\n * \"running\", \"needs you\", \"unread\" and \"failed\" mean exactly what the chat\n * list's dots mean — one definition, however many surfaces draw it (the\n * phone's Agents tab today; the workbench's Agents board can read the same\n * function):\n *\n * Working the chat is running a turn (engine status or activity)\n * Needs you a Needs-you item points at it, or its last turn failed\n * Ready for review finished turns the operator has not opened yet\n * Done everything else that is not archived\n *\n * A chat sits in exactly ONE column, checked in that order: a running chat\n * that also has a question for you is Working (it is still moving); its\n * question is in Needs you's own list regardless. Archived chats are left\n * out. Each column is newest first.\n */\nimport type { VerseProject, VerseSession } from '../../../data/api-types.js';\nimport type { VerseActivityResponse, VerseSessionMetaResponse } from '../../../../core/verse/workbench-types.js';\nimport { buildSidebar, type SidebarRow } from './sidebar-model.js';\n\nexport type AgentColumnId = 'working' | 'needs-you' | 'review' | 'done';\n\nexport const AGENT_COLUMNS: ReadonlyArray<{ id: AgentColumnId; label: string; empty: string }> = [\n { id: 'working', label: 'Working', empty: 'No agent is running right now.' },\n { id: 'needs-you', label: 'Needs you', empty: 'No agent is waiting on you.' },\n { id: 'review', label: 'Ready for review', empty: 'Nothing new to review.' },\n { id: 'done', label: 'Done', empty: 'No finished agents yet.' },\n];\n\nexport interface AgentColumn {\n id: AgentColumnId;\n label: string;\n empty: string;\n rows: SidebarRow[];\n}\n\nexport interface AgentsBoardInput {\n sessions: readonly VerseSession[];\n projects: readonly VerseProject[];\n activity: VerseActivityResponse | null;\n meta: VerseSessionMetaResponse | null;\n localSeen: ReadonlyMap<string, number>;\n}\n\nexport function columnOf(row: SidebarRow): AgentColumnId {\n if (row.status.kind === 'running') return 'working';\n if (row.needsYou || row.status.kind === 'failed') return 'needs-you';\n if (row.status.kind === 'unread') return 'review';\n return 'done';\n}\n\nexport function buildAgentsBoard(input: AgentsBoardInput): AgentColumn[] {\n const model = buildSidebar({\n sessions: input.sessions,\n projects: input.projects,\n query: '',\n filter: 'all',\n activity: input.activity,\n meta: input.meta,\n localSeen: input.localSeen,\n selectedId: null,\n });\n const byColumn = new Map<AgentColumnId, SidebarRow[]>(AGENT_COLUMNS.map((c) => [c.id, []]));\n for (const group of model.groups) {\n for (const row of group.rows) {\n if (row.archived) continue;\n byColumn.get(columnOf(row))!.push(row);\n }\n }\n const newest = (a: SidebarRow, b: SidebarRow) => b.session.updatedAt.localeCompare(a.session.updatedAt);\n return AGENT_COLUMNS.map((c) => ({ ...c, rows: byColumn.get(c.id)!.sort(newest) }));\n}\n\n/** Column counts, for a tab badge or a summary line. */\nexport function boardCounts(columns: readonly AgentColumn[]): Record<AgentColumnId, number> {\n const out: Record<AgentColumnId, number> = { working: 0, 'needs-you': 0, review: 0, done: 0 };\n for (const c of columns) out[c.id] = c.rows.length;\n return out;\n}\n","/* routes/verse/mobile/screens/AgentsScreen.module.css — the Agents tab's chip counts, column title and two-line rows. */\n\n.chipCount {\n margin-left: var(--space-1);\n color: var(--text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.columnTitle {\n font-family: var(--font-display);\n margin: var(--space-5) var(--space-2) var(--space-2);\n color: var(--text-secondary);\n font-size: 0.8em;\n font-weight: var(--font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n}\n\n.who,\n.status {\n display: block;\n min-width: 0;\n}\n\n.status {\n color: var(--text-tertiary);\n}\n\n.failed {\n color: var(--status-danger-fg);\n}\n","/**\n * routes/verse/mobile/screens/AgentsScreen.tsx — the Agents tab: every chat,\n * grouped the way the operator acts on them — Working / Needs you / Ready\n * for review / Done — one column at a time behind a chip row.\n *\n * The grouping is the workbench's own (chat/agents-board-model.ts over the\n * chat list's row model), fed by the same reads the Mac's chat list uses:\n *\n * sessions GET /api/verse/sessions (verseSessionsQuery; the bootstrap's\n * copy until it answers), refreshed by the verse-sessions SSE\n * digest (openVerseListChannel)\n * activity useChatActivity() — who is running and what they are doing,\n * the Needs-you items, read state (polls every 5 s while visible)\n *\n * So a chat is \"Working\" here exactly when its dot pulses on the Mac.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { VerseActivityRunning } from '../../../../../core/verse/workbench-types.js';\nimport { refetchQuery } from '../../../../data/cache.js';\nimport { readFailureReason } from '../../../../data/client.js';\nimport { useQuery } from '../../../../data/hooks.js';\nimport { AGENT_COLUMNS, boardCounts, buildAgentsBoard, type AgentColumnId } from '../../chat/agents-board-model.js';\nimport type { SidebarRow } from '../../chat/sidebar-model.js';\nimport { useChatActivity } from '../../chat/use-chat-activity.js';\nimport { verseBootstrapQuery } from '../../verse-bootstrap-query.js';\nimport { openVerseListChannel } from '../../verse-events.js';\nimport { formatRelative, modelLabel, projectName, seatLabel } from '../../verse-model.js';\nimport { verseActivityQuery, verseSessionMetaQuery, verseSessionsQuery } from '../../verse-queries.js';\nimport { canShowActions, useMobile } from '../mobile-context.js';\nimport { PlusGlyph } from '../mobile-icons.js';\nimport { Button, Screen, SkeletonList, cx } from '../ui.js';\nimport { Badge, Banner, EmptyState, ErrorState, Row, ui, type Tone } from '../ui-parts.js';\nimport { shortElapsed } from './agent-transcript-model.js';\nimport styles from './AgentsScreen.module.css';\n\n/** The chip's short name (the board's own label is the long one). */\nexport const CHIP_LABEL: Readonly<Record<AgentColumnId, string>> = {\n working: 'Working',\n 'needs-you': 'Needs you',\n review: 'Review',\n done: 'Done',\n};\n\n/** The column shown when the operator has not picked one: the first with anything in it. */\nexport function defaultColumn(counts: Readonly<Record<AgentColumnId, number>>): AgentColumnId | null {\n for (const c of AGENT_COLUMNS) if (counts[c.id] > 0) return c.id;\n return null;\n}\n\n/**\n * The row's second line: what a running agent is doing and for how long,\n * \"Failed\", \"2 new turns\", or when it was last touched.\n */\nexport function agentStatusLine(row: SidebarRow, running: VerseActivityRunning | undefined, now: number = Date.now()): string {\n const { status } = row;\n switch (status.kind) {\n case 'running': {\n const live = running?.live ?? null;\n const doing = live?.tool ? `Using ${live.tool}` : row.live?.text ?? 'Working';\n const started = status.startedAt ? Date.parse(status.startedAt) : NaN;\n const span = Number.isFinite(started) ? shortElapsed(now - started) : null;\n return span ? `${doing} · ${span}` : doing;\n }\n case 'failed':\n return 'Failed';\n case 'unread':\n return `${status.newTurns} new ${status.newTurns === 1 ? 'turn' : 'turns'}`;\n case 'time': {\n if (row.needsYou) return 'Waiting on you';\n const rel = formatRelative(status.at, now);\n if (!rel) return 'unknown';\n if (rel === 'now') return 'Just now';\n return /^\\d+[mhd]$/.test(rel) ? `${rel} ago` : rel;\n }\n }\n}\n\nexport function agentBadge(row: SidebarRow, column: AgentColumnId): { tone: Tone; label: string; pulse: boolean } {\n switch (column) {\n case 'working':\n return { tone: 'running', label: 'Working', pulse: true };\n case 'needs-you':\n return row.status.kind === 'failed' ? { tone: 'danger', label: 'Failed', pulse: false } : { tone: 'warning', label: 'Needs you', pulse: false };\n case 'review':\n return { tone: 'info', label: 'New', pulse: false };\n case 'done':\n return { tone: 'neutral', label: 'Done', pulse: false };\n }\n}\n\n/** Pull-to-refresh: the list, activity and read state, forced fresh. */\nfunction refreshAgents(): Promise<unknown> {\n return Promise.all([\n refetchQuery(verseSessionsQuery.key, () => verseSessionsQuery.fetch(), true),\n refetchQuery(verseActivityQuery.key, () => verseActivityQuery.fetch(), true),\n refetchQuery(verseSessionMetaQuery.key, () => verseSessionMetaQuery.fetch(), true),\n ]);\n}\n\nexport function AgentsScreen() {\n const { permissions, reachability, navigate, refreshActivity } = useMobile();\n const sessionsQuery = useQuery(verseSessionsQuery);\n const boot = useQuery(verseBootstrapQuery);\n const { activity, meta, localSeen } = useChatActivity();\n const [picked, setPicked] = useState<AgentColumnId | null>(null);\n\n // The verse-sessions digest refreshes the list the moment a chat changes.\n useEffect(() => openVerseListChannel(), []);\n\n const sessions = sessionsQuery.data ?? boot.data?.sessions ?? null;\n const projects = boot.data?.projects;\n const seats = boot.data?.seats;\n const columns = useMemo(\n () => (sessions ? buildAgentsBoard({ sessions, projects: projects ?? [], activity, meta, localSeen }) : null),\n [sessions, projects, activity, meta, localSeen],\n );\n const counts = columns ? boardCounts(columns) : null;\n const selected = picked ?? (counts ? defaultColumn(counts) : null) ?? 'working';\n const column = columns?.find((c) => c.id === selected) ?? null;\n const runningById = useMemo(() => new Map((activity?.running ?? []).map((r) => [r.sessionId, r])), [activity]);\n\n const canAct = canShowActions(permissions);\n const disconnected = reachability === 'offline' || reachability === 'unreachable';\n const total = counts ? counts.working + counts['needs-you'] + counts.review + counts.done : 0;\n\n const refresh = useCallback(() => Promise.all([refreshAgents(), refreshActivity()]), [refreshActivity]);\n const retry = useCallback(() => void refresh().catch(() => undefined), [refresh]);\n const openNew = useCallback(() => navigate({ screen: 'new' }), [navigate]);\n\n const newButton = canAct ? (\n <Button variant=\"plain\" onClick={openNew} disabled={disconnected} aria-label=\"New agent\">\n <PlusGlyph size={18} />\n <span>New</span>\n </Button>\n ) : null;\n\n let body;\n if (!sessions || !columns || !counts) {\n body = sessionsQuery.status === 'error' ? (\n <ErrorState title=\"Couldn’t load your agents\" reason={readFailureReason(sessionsQuery.error)} onRetry={retry} />\n ) : (\n <SkeletonList rows={4} label=\"Loading agents\" />\n );\n } else if (total === 0) {\n body = (\n <EmptyState\n title=\"No agents yet\"\n body=\"Chats you start here or on your Mac show up here, grouped by what they need from you.\"\n action={canAct ? <Button variant=\"primary\" onClick={openNew} disabled={disconnected}>+ New agent</Button> : undefined}\n />\n );\n } else {\n body = (\n <>\n <div className={ui.chips} role=\"group\" aria-label=\"Show agents\">\n {AGENT_COLUMNS.map((c) => (\n <button\n key={c.id}\n type=\"button\"\n className={ui.chip}\n aria-pressed={c.id === selected}\n onClick={() => setPicked(c.id)}\n >\n {CHIP_LABEL[c.id]} <span className={styles.chipCount}>{counts[c.id]}</span>\n </button>\n ))}\n </div>\n <h2 className={styles.columnTitle}>{column?.label ?? ''}</h2>\n {column && column.rows.length > 0 ? (\n <div className={ui.group}>\n {column.rows.map((row) => {\n const s = row.session;\n const badge = agentBadge(row, column.id);\n const who = [seatLabel(seats ?? [], s), modelLabel(seats ?? [], s), projectName(s.projectPath, projects ?? [])].filter(Boolean).join(' · ');\n return (\n <Row\n key={s.id}\n title={s.title || 'Untitled chat'}\n subtitle={\n <>\n <span className={styles.who}>{who}</span>\n <span className={cx(styles.status, row.status.kind === 'failed' && styles.failed)}>{agentStatusLine(row, runningById.get(s.id))}</span>\n </>\n }\n trailing={<Badge tone={badge.tone} dot={badge.tone === 'running'} pulse={badge.pulse}>{badge.label}</Badge>}\n onClick={() => navigate({ screen: 'agent', id: s.id, pane: 'transcript' })}\n />\n );\n })}\n </div>\n ) : (\n <EmptyState title={column?.empty ?? 'Nothing here.'} />\n )}\n </>\n );\n }\n\n return (\n <Screen title=\"Agents\" large trailing={newButton} onRefresh={refresh} label=\"Agents\">\n {disconnected ? (\n <Banner tone=\"warning\">\n {reachability === 'offline'\n ? 'You’re offline. This is the last list your phone saw; starting agents resumes when you reconnect.'\n : 'Can’t reach your Mac. This is the last list your phone saw; starting agents resumes when it answers.'}\n </Banner>\n ) : null}\n {sessions && sessionsQuery.status === 'error' ? (\n <Banner tone=\"warning\">Couldn’t refresh the list: {readFailureReason(sessionsQuery.error)}</Banner>\n ) : null}\n {body}\n </Screen>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{l as r,u as i}from"./global-w7KDTTi0.js";import{t as a}from"./Dialog-DDHg9cuT.js";import{t as o}from"./MutationTokenDialog-DlY2VLVh.js";import{J as s,j as c}from"./VerseConsoleApp-DjPpZLo1.js";import{M as l,i as ee,j as u}from"./VerseShared-Bf-XTHCh.js";import{n as d}from"./verse-bootstrap-query-B3vFD9XK.js";import{T as f,d as p,n as m}from"./verse-model-DAOz9LrY.js";import{t as h}from"./Segmented-BA8RmKYq.js";import{n as g,t as _}from"./SeatSelector-YRNdNpP8.js";import{t as v}from"./Button-CstSJwha.js";import{n as y,t as b}from"./use-token-gate-h5QAERLT.js";import{t as te}from"./EmptyState-CGVr0VO2.js";import{t as x}from"./Switch-Cqc_bSoh.js";import{_ as S,a as ne,b as C,c as w,d as T,f as E,g as D,h as re,i as ie,l as O,m as k,o as ae,p as A,r as j,s as oe,t as M,u as N,v as P,y as F}from"./ChecksPanel-D9r8koxq.js";import{a as I,i as L,n as R,r as se}from"./agents-focus-B1LKhUVg.js";import{t as ce}from"./Select-B8GqZOX9.js";import{t as z}from"./Input-Cpn9uYj2.js";var B=e(n(),1),V={repo:null,query:``,doneWithinMs:2592e5};function le(e,t,n){let r=t.query.trim().toLowerCase();return e.filter(e=>{if(t.repo&&e.repo!==t.repo||r&&![e.title,e.repo??``,e.branch??``,e.model??``,e.seatId??``,e.reasonText].some(e=>e.toLowerCase().includes(r)))return!1;if(e.column===`done`&&t.doneWithinMs!==null&&!e.pinned){let r=Date.parse(e.updatedAt);if(Number.isFinite(r)&&n-r>t.doneWithinMs)return!1}return!0})}function ue(e){let t={working:[],"needs-you":[],review:[],done:[]};for(let n of e)t[n.column].push(n);return t}function H(e){return[...new Set(e.map(e=>e.repo).filter(e=>!!e))].sort((e,t)=>e.localeCompare(t))}function de(e,t,n){let r=P.filter(t=>e[t].length>0);if(r.length===0)return null;if(!t||e[t.column].length===0)return{column:r[0],index:0};let i=e[t.column],a=Math.min(t.index,i.length-1);switch(n){case`up`:return{column:t.column,index:Math.max(0,a-1)};case`down`:return{column:t.column,index:Math.min(i.length-1,a+1)};case`first`:return{column:t.column,index:0};case`last`:return{column:t.column,index:i.length-1};case`left`:case`right`:{let i=r[r.indexOf(t.column)+(n===`left`?-1:1)];return i?{column:i,index:Math.min(a,e[i].length-1)}:{column:t.column,index:a}}}}function fe(e,t){return t?e[t.column][t.index]??null:null}function pe(e,t){for(let n of P){let r=e[n].findIndex(e=>e.id===t);if(r>=0)return{column:n,index:r}}return null}function me(e,t){return e.filter(e=>(!t||t.has(e.id))&&e.column!==`needs-you`&&e.unread&&e.sessionId).map(e=>e.id)}function U(e,t){if(!e)return null;let n=Date.parse(e);if(!Number.isFinite(n))return null;let r=Math.max(0,Math.round((t-n)/1e3));if(r<60)return`${r}s`;let i=Math.floor(r/60);if(i<60)return`${i}m ${String(r%60).padStart(2,`0`)}s`;let a=Math.floor(i/60);return a<24?`${a}h ${String(i%60).padStart(2,`0`)}m`:`${Math.floor(a/24)}d ${a%24}h`}function he(e,t){if(!e)return``;let n=Date.parse(e);if(!Number.isFinite(n))return``;let r=Math.max(0,Math.round((t-n)/1e3));if(r<45)return`just now`;let i=Math.round(r/60);if(i<60)return`${i}m ago`;let a=Math.round(i/60);return a<48?`${a}h ago`:`${Math.round(a/24)}d ago`}function W(e){return e>=100?`$${Math.round(e)}`:e>=10?`$${e.toFixed(1)}`:`$${e.toFixed(2)}`}function ge(e){return e.usd===null?e.tokens>0?`${K(e.tokens)} tokens`:`—`:e.capUsd===null?W(e.usd):`${W(e.usd)} of ${W(e.capUsd)}`}function G(e){return e.fraction===null?`neutral`:e.fraction>=1?`danger`:e.fraction>=.8?`warning`:`neutral`}function K(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}function _e(e){let t=e.checks;if(!t)return null;if(!t.pr)return t.ci===`unknown`?null:t.dirty>0?`${t.dirty} uncommitted`:t.ahead>0?`${t.ahead} ahead`:null;let n=t.pr.state===`merged`?`merged`:t.pr.state===`closed`?`closed`:t.ci===`passing`?`green`:t.ci===`failing`?`red`:t.ci===`pending`?`running`:`no checks`;return`#${t.pr.number} ${n}`}function q(e){let t=[];for(let n of p(e))for(let e of n.seats){let n=f(e),r=e.models.find(e=>!(typeof e.unavailableReason==`string`&&e.unavailableReason.trim()));t.push({seatId:e.id,label:e.label,engine:e.engine,model:r?.id??null,modelLabel:r?.label??null,disabled:n??(r?null:`No model on this seat can run right now.`)})}return t}function J(e){if(!e.root)return{ok:!1,error:`Pick a repository.`};if(e.seats.length===0)return{ok:!1,error:`Pick at least one seat.`};if(e.seats.length>1&&!e.isolate)return{ok:!1,error:`Several seats on one task each need their own workspace.`};if(!e.prompt.trim())return{ok:!1,error:`Say what the agent should do.`};if(e.autoMerge&&!e.isolate)return{ok:!1,error:`Auto-merge needs the agent in its own workspace (its own branch).`};let t=e.capText.trim().replace(/^\$/,``),n=null;if(t){let e=Number(t);if(!Number.isFinite(e)||e<=0||e>1e4)return{ok:!1,error:`The spend cap is a dollar amount above 0.`};n=Math.round(e*100)/100}return{ok:!0,cap:n}}function Y(e){let t=(e.trim().split(`
|
|
2
|
+
`)[0]?.trim()??``).replace(/[#*`>_]/g,``).trim();return t?t.length<=60?t:`${t.slice(0,57).replace(/\s+\S*$/,``)}…`:`Agent`}var X=t();function ve({card:e,now:t,busy:n,onClose:r,onChanged:i,act:a,onOpenChat:o,onOpenTerminal:s,onStop:c}){let[l,ee]=(0,B.useState)(e.reason===`ci-failed`||e.reason===`pr-open`?`checks`:`overview`),[u,d]=(0,B.useState)(e.plan?.text??``),[f,p]=(0,B.useState)(e.spend.capUsd===null?``:String(e.spend.capUsd)),m=e.agentId;(0,B.useEffect)(()=>{d(e.plan?.text??``)},[e.plan?.text]),(0,B.useEffect)(()=>{p(e.spend.capUsd===null?``:String(e.spend.capUsd))},[e.spend.capUsd]);let g=()=>{if(!m)return;let e=f.trim().replace(/^\$/,``),t=e===``?null:Number(e);t!==null&&(!Number.isFinite(t)||t<=0)||a(`cap`,`Change this agent’s spend cap`,async()=>(await S(m,{spendCapUsd:t}),t===null?`Spend cap removed.`:`Spend cap set to ${W(t)}.`))},_=[...e.scripts].reverse().find(e=>e.kind===`setup`)??null,y=e.scripts.filter(e=>e.kind===`run`&&e.state===`running`);return(0,X.jsxs)(`aside`,{className:j.details,"aria-label":`Details: ${e.title}`,children:[(0,X.jsxs)(`header`,{className:j.detailsHead,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`h3`,{className:j.detailsTitle,children:e.title}),(0,X.jsx)(`p`,{className:j.muted,children:e.reasonText})]}),(0,X.jsx)(v,{size:`sm`,variant:`ghost`,onClick:r,"aria-label":`Close details`,children:`Close`})]}),(0,X.jsxs)(`div`,{className:j.detailsActions,children:[e.sessionId?(0,X.jsx)(v,{size:`sm`,variant:`subtle`,onClick:o,children:`Open chat`}):null,e.status===`running`?(0,X.jsx)(v,{size:`sm`,variant:`ghost`,onClick:c,children:`Stop`}):null,e.reason===`failed`?(0,X.jsx)(v,{size:`sm`,variant:`ghost`,busy:n===`resolve:${e.id}`,onClick:()=>void a(`resolve:${e.id}`,`Resolve this failed turn`,async()=>(await T(e.id),`Resolved: it leaves Needs you.`)),children:`Resolve`}):null,m&&!e.archived?(0,X.jsx)(v,{size:`sm`,variant:`ghost`,busy:n===`archive`,onClick:()=>void a(`archive`,`Archive this agent (snapshot, then remove its worktree)`,async()=>(await ae(m),r(),`Archived. Its snapshot is kept — Restore brings it back.`)),children:`Archive`}):null,m&&e.restorable?(0,X.jsx)(v,{size:`sm`,variant:`subtle`,busy:n===`restore`,onClick:()=>void a(`restore`,`Restore this agent’s workspace`,async()=>(await E(m),`Restored.`)),children:`Restore`}):null]}),(0,X.jsx)(h,{"aria-label":`Detail view`,value:l,onChange:e=>ee(e),options:[{value:`overview`,label:`Overview`},{value:`checks`,label:`Checks`}]}),l===`checks`?(0,X.jsx)(M,{cardId:e.id,onChanged:i}):(0,X.jsxs)(`div`,{className:j.overview,children:[(0,X.jsxs)(`dl`,{className:j.facts,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Seat`}),(0,X.jsxs)(`dd`,{children:[e.seatId??`—`,e.model?` · ${e.model}`:``]})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Where`}),(0,X.jsxs)(`dd`,{className:j.mono,children:[e.repo??`—`,e.branch?` · ${e.branch}`:``]})]}),e.workspacePath?(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Workspace`}),(0,X.jsx)(`dd`,{className:j.mono,children:e.workspacePath})]}):null,e.ports?(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Ports`}),(0,X.jsx)(`dd`,{children:e.ports.count>0?`${e.ports.base}–${e.ports.base+e.ports.count-1} (ASHLR_PORT)`:`ASHLR_PORT=${e.ports.base}`})]}):null,(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Spend`}),(0,X.jsxs)(`dd`,{children:[ge(e.spend),` `,(0,X.jsx)(`span`,{className:j.muted,children:`(API list price)`})]})]}),e.startedAt?(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Running for`}),(0,X.jsx)(`dd`,{children:U(e.startedAt,t)})]}):null]}),e.plan&&e.plan.state===`awaiting-approval`&&m?(0,X.jsxs)(`section`,{className:j.planBox,"aria-label":`Plan for approval`,children:[(0,X.jsx)(`h4`,{className:j.smallHead,children:`Plan — edit, then approve`}),(0,X.jsx)(`textarea`,{className:j.textarea,rows:12,value:u,onChange:e=>d(e.target.value)}),(0,X.jsxs)(`div`,{className:j.formActions,children:[(0,X.jsx)(v,{size:`sm`,variant:`ghost`,busy:n===`plan:discard`,onClick:()=>void a(`plan:discard`,`Discard this plan`,async()=>(await w(m,`discard`),`Plan discarded. Nothing was changed.`)),children:`Discard`}),(0,X.jsx)(v,{size:`sm`,variant:`primary`,busy:n===`plan:approve`,onClick:()=>void a(`plan:approve`,`Approve the plan: the seat starts making the changes`,async()=>(await w(m,`approve`,u),`Approved — the agent is carrying it out.`)),children:`Approve and run`})]})]}):e.plan?(0,X.jsxs)(`p`,{className:j.hint,children:[`Plan first: `,e.plan.state===`drafting`?`the seat is writing a plan.`:e.plan.state===`approved`?`plan approved.`:`on.`]}):null,e.heldPrompt&&m?(0,X.jsxs)(`section`,{className:j.held,children:[(0,X.jsx)(`p`,{className:j.hint,children:`The first prompt is held until setup finishes.`}),(0,X.jsxs)(`div`,{className:j.formActions,children:[(0,X.jsx)(v,{size:`sm`,variant:`ghost`,busy:n===`setup`,onClick:()=>void a(`setup`,`Run setup again`,async()=>(await A(m,`setup`),`Setup started again.`)),children:`Rerun setup`}),(0,X.jsx)(v,{size:`sm`,variant:`subtle`,busy:n===`send`,onClick:()=>void a(`send`,`Send the held prompt now, without setup`,async()=>(await k(m),`Sent.`)),children:`Send anyway`})]})]}):null,m&&e.workspacePath?(0,X.jsxs)(`section`,{"aria-label":`Scripts`,children:[(0,X.jsx)(`h4`,{className:j.smallHead,children:`Workspace scripts`}),(0,X.jsxs)(`div`,{className:j.scriptButtons,children:[e.runScripts.map((e,t)=>(0,X.jsxs)(v,{size:`sm`,variant:`subtle`,busy:n===`run:${t}`,onClick:()=>void a(`run:${t}`,`Run “${e}” in this workspace`,async()=>{let n=await A(m,`run`,t);return n.run.via===`terminal`&&s(),`${e} started${n.run.via===`terminal`?` in a terminal tab`:``}.`}),children:[`Run `,e]},e)),e.runScripts.length===0?(0,X.jsx)(`span`,{className:j.muted,children:`No run scripts in .ashlr/verse/workspace.json.`}):null]}),y.map(e=>(0,X.jsxs)(`div`,{className:j.runRow,children:[(0,X.jsxs)(`span`,{children:[e.name,` — running`,e.via===`terminal`?` in a terminal tab`:``]}),(0,X.jsx)(v,{size:`sm`,variant:`ghost`,onClick:()=>void a(`stop:${e.id}`,`Stop ${e.name}`,async()=>(await D(m,e.id),`${e.name} stopped.`)),children:`Stop`})]},e.id)),_?(0,X.jsx)(Z,{agentId:m,run:_,onOpenTerminal:s}):null]}):null,m?(0,X.jsxs)(`section`,{className:j.capBox,"aria-label":`Spend cap`,children:[(0,X.jsx)(z,{label:`Spend cap (USD at API list price)`,size:`sm`,value:f,onChange:e=>p(e.target.value),placeholder:`none`,inputMode:`decimal`,hint:`Warns at 80%; at 100% the agent stops and takes no more turns until you raise it.`}),(0,X.jsx)(v,{size:`sm`,variant:`subtle`,onClick:g,busy:n===`cap`,children:`Save cap`}),(0,X.jsx)(x,{checked:e.pinned,onChange:e=>void a(`pin`,e?`Pin this agent`:`Unpin this agent`,async()=>(await S(m,{pinned:e}),null)),label:`Pinned (never auto-archived)`})]}):null,e.loopNote?(0,X.jsx)(`p`,{className:j.loopNote,role:`status`,children:e.loopNote}):null]})]})}function Z({agentId:e,run:t,onOpenTerminal:n}){let[r,i]=(0,B.useState)(null);(0,B.useEffect)(()=>{if(t.via!==`process`)return;let n=new AbortController,r=()=>O(e,t.id,n.signal).then(e=>i(e.text),()=>void 0);r();let a=t.state===`running`?setInterval(r,2e3):null;return()=>{n.abort(),a&&clearInterval(a)}},[e,t.id,t.via,t.state]);let a=t.state===`running`?`running`:t.state===`ok`?`finished`:`failed${t.exitCode===null?``:` (exit ${t.exitCode})`}`;return(0,X.jsxs)(`div`,{className:j.setupLog,children:[(0,X.jsxs)(`div`,{className:j.runRow,children:[(0,X.jsxs)(`span`,{children:[`Setup `,a]}),t.via===`terminal`?(0,X.jsx)(v,{size:`sm`,variant:`ghost`,onClick:n,children:`Show terminal`}):null]}),t.via===`process`&&r?(0,X.jsx)(`pre`,{className:j.log,children:r.slice(-8e3)}):null]})}function Q(e){let t=e.config,n=[];return n.push(t.setup?`setup: ${t.setup.length>40?`${t.setup.slice(0,40)}…`:t.setup}`:`no setup script`),t.run.length>0&&n.push(`${t.run.length} run button${t.run.length===1?``:`s`} (${t.run.map(e=>e.name).join(`, `)})`),t.copy.length>0&&n.push(`copies ${t.copy.join(`, `)} if present`),n.push(t.ports>0?`${t.ports} ports`:`no ports`),`${e.source===`file`?`.ashlr/verse/workspace.json`:`No workspace.json (defaults)`}: ${n.join(` · `)}`}function ye({open:e,multi:t,projects:n,seats:r,initialRoot:i,busy:o,error:s,onClose:c,onSpawn:l}){let ee=(0,B.useId)(),u=(0,B.useId)(),d=(0,B.useRef)(null),f=(0,B.useMemo)(()=>[...n].sort((e,t)=>Number(t.enrolled)-Number(e.enrolled)||e.name.localeCompare(t.name)),[n]),p=(0,B.useMemo)(()=>q(r),[r]),[h,y]=(0,B.useState)(``),[b,te]=(0,B.useState)(null),[S,ne]=(0,B.useState)(new Set),[C,w]=(0,B.useState)(``),[T,E]=(0,B.useState)(``),[D,re]=(0,B.useState)(!0),[ie,O]=(0,B.useState)(!1),[k,ae]=(0,B.useState)(``),[A,oe]=(0,B.useState)(!1),[M,P]=(0,B.useState)(!1),[F,I]=(0,B.useState)(null),[L,R]=(0,B.useState)(null),se=(0,B.useRef)({initialRoot:i,sorted:f,seats:r});se.current={initialRoot:i,sorted:f,seats:r},(0,B.useEffect)(()=>{if(!e)return;let t=se.current;y(t.initialRoot&&t.sorted.some(e=>e.path===t.initialRoot)?t.initialRoot:t.sorted[0]?.path??``);let n=g(t.seats);te(n),ne(new Set(n?[n.seatId]:[])),w(``),E(``),re(!0),O(!1),ae(``),oe(!1),P(!1),I(null)},[e]),(0,B.useEffect)(()=>{if(!e||!h)return;let t=new AbortController;return R(null),N(h,t.signal).then(e=>R(e),()=>R(null)),()=>t.abort()},[e,h]);let V=(0,B.useMemo)(()=>t?p.filter(e=>S.has(e.seatId)&&e.model&&!e.disabled).map(e=>({seatId:e.seatId,model:e.model})):b?[b]:[],[t,b,p,S]),le=e=>{e?.preventDefault();let n={root:h,title:C,prompt:T,seats:V,isolate:t?!0:D,planFirst:ie,capText:k,autoFix:A,autoMerge:M},r=J(n);if(!r.ok){I(r.error);return}I(null);let i=C.trim()||Y(T),a=e=>p.find(t=>t.seatId===e)?.label??e;l(V.map(e=>({root:h,seatId:e.seatId,model:e.model,title:V.length>1?`${i} · ${a(e.seatId)}`:i,prompt:T,isolate:n.isolate,planFirst:ie,spendCapUsd:r.cap,autoFix:A,autoMerge:M})))},ue=e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),le())},H=V.length;return(0,X.jsx)(a,{open:e,onClose:c,titleId:ee,title:t?`Same task on several seats`:`New agent`,description:t?`Each seat gets its own workspace and branch, and the same prompt. Compare what comes back.`:`A chat with its own git worktree and branch, the repo’s setup, and its own ports.`,initialFocusRef:d,widthClassName:j.dialogWidth,children:(0,X.jsxs)(`form`,{className:j.form,onSubmit:le,children:[(0,X.jsxs)(ce,{label:`Repository`,value:h,onChange:e=>y(e.target.value),disabled:o,children:[f.length===0?(0,X.jsx)(`option`,{value:``,children:`No projects yet — open one in Chat first`}):null,f.map(e=>(0,X.jsx)(`option`,{value:e.path,children:e.name},e.path))]}),L?(0,X.jsxs)(`p`,{className:j.hint,children:[Q(L),L.warnings.length?` — ${L.warnings[0]}`:``]}):null,t?(0,X.jsxs)(`fieldset`,{className:j.seatList,disabled:o,children:[(0,X.jsxs)(`legend`,{children:[`Seats (`,H,` selected)`]}),p.map(e=>(0,X.jsxs)(`label`,{className:j.seatRow,"data-disabled":e.disabled?!0:void 0,children:[(0,X.jsx)(`input`,{type:`checkbox`,checked:S.has(e.seatId),disabled:!!e.disabled,onChange:t=>ne(n=>{let r=new Set(n);return t.target.checked?r.add(e.seatId):r.delete(e.seatId),r})}),(0,X.jsx)(`span`,{children:e.label}),(0,X.jsxs)(`span`,{className:j.muted,children:[m[e.engine],e.modelLabel?` · ${e.modelLabel}`:``]}),e.disabled?(0,X.jsxs)(`span`,{className:j.muted,children:[` — `,e.disabled]}):null]},e.seatId))]}):(0,X.jsx)(_,{seats:r,value:b,onChange:te,disabled:o,label:`Seat`}),(0,X.jsxs)(`div`,{className:j.field,children:[(0,X.jsxs)(`label`,{htmlFor:u,className:j.fieldLabel,children:[`What should `,H>1?`they`:`it`,` do?`]}),(0,X.jsx)(`textarea`,{id:u,ref:d,className:j.textarea,rows:5,value:T,onChange:e=>E(e.target.value),onKeyDown:ue,placeholder:`Fix the login redirect loop and add a test for it.`,disabled:o})]}),(0,X.jsx)(z,{label:`Title (optional)`,value:C,onChange:e=>w(e.target.value),placeholder:T?Y(T):`From the prompt`,disabled:o}),(0,X.jsxs)(`details`,{className:j.advancedOptions,children:[(0,X.jsx)(`summary`,{children:`Options`}),(0,X.jsxs)(`div`,{className:j.options,children:[t?null:(0,X.jsx)(x,{checked:D,onChange:re,label:`Own workspace (worktree + branch)`,disabled:o}),(0,X.jsx)(x,{checked:ie,onChange:O,label:`Plan first — approve before it edits`,disabled:o}),(0,X.jsx)(x,{checked:A,onChange:oe,label:`Auto-fix CI`,disabled:o}),(0,X.jsx)(x,{checked:M,onChange:P,label:`Auto-merge when green`,disabled:o||!t&&!D}),(0,X.jsx)(z,{label:`Spend cap (USD, at API list price)`,value:k,onChange:e=>ae(e.target.value),placeholder:`none`,inputMode:`decimal`,size:`sm`,hint:`Warns at 80%, stops the agent at 100%.`,disabled:o})]})]}),M?(0,X.jsx)(`p`,{className:j.hint,children:`Auto-merge squash-merges only a green, mergeable PR that touches no protected path (CI, manifests, lockfiles); ashlr-hub itself only when the grant’s self-land policy allows. GitHub’s branch rules still apply.`}):null,F||s?(0,X.jsx)(`p`,{className:j.formError,role:`alert`,children:F??s}):null,(0,X.jsxs)(`div`,{className:j.formActions,children:[(0,X.jsx)(v,{variant:`ghost`,onClick:c,disabled:o,children:`Cancel`}),(0,X.jsx)(v,{variant:`primary`,type:`submit`,busy:o,disabled:H===0||!h,children:H>1?`Start ${H} agents`:`Start agent`})]}),(0,X.jsxs)(`p`,{className:j.keyHint,children:[`⌘ Return starts `,H>1?`them`:`it`,`.`]})]})})}var be={ArrowUp:`up`,k:`up`,ArrowDown:`down`,j:`down`,ArrowLeft:`left`,h:`left`,ArrowRight:`right`,l:`right`,Home:`first`,End:`last`};function xe(e,t){let[n,r]=(0,B.useState)(()=>Date.now());return(0,B.useEffect)(()=>{if(!t)return;let n=setInterval(()=>r(Date.now()),e);return()=>clearInterval(n)},[e,t]),n}function Se(){let e=r(ne),t=i(ne);u(t,ie);let n=r(d),a=xe(1e3,l()),f=y(),[p,m]=(0,B.useState)(V),[h,g]=(0,B.useState)(null),[_,x]=(0,B.useState)(new Set),[S,w]=(0,B.useState)(null),[E,D]=(0,B.useState)({open:!1,multi:!1}),[O,k]=(0,B.useState)(!1),[ae,A]=(0,B.useState)(null),[M,N]=(0,B.useState)(null),[F,U]=(0,B.useState)(null),he=(0,B.useRef)(null),W=(0,B.useMemo)(()=>e.data?.cards??[],[e.data]),ge=Math.floor(a/6e4),G=(0,B.useMemo)(()=>le(W,p,ge*6e4),[W,p,ge]),K=(0,B.useMemo)(()=>ue(G),[G]),_e=(0,B.useMemo)(()=>H(W),[W]),q=h?pe(K,h):null,J=S?W.find(e=>e.id===S)??null:null,Y=(0,B.useSyncExternalStore)(L,R,R);(0,B.useEffect)(()=>{Y&&(se(Y)&&(Y.kind===`new`||Y.kind===`new-multi`?(A(null),D({open:!0,multi:Y.kind===`new-multi`})):Y.cardId&&(g(Y.cardId),w(Y.cardId))),I(Y.seq))},[Y]);let Z=(0,B.useCallback)(async(e,n,r)=>{U(e),N(null);try{let e=await f.run(n,r);e&&N({tone:`neutral`,text:e}),t()}catch(e){N({tone:`danger`,text:b(e)})}finally{U(null)}},[f,t]),Q=(e,t,n)=>{if(t.length===0){N({tone:`neutral`,text:e===`read`?`Nothing unread outside Needs you.`:`Nothing selected.`});return}Z(`bulk:${e}`,`${n} (${t.length})`,async()=>{let r=await oe(e,t),i=r.filter(e=>e.ok).length,a=r.filter(e=>e.skipped).length,o=r.filter(e=>!e.ok&&!e.skipped);return e===`archive`&&x(new Set),`${n}: ${i} done${a?`, ${a} in Needs you left as they are`:``}${o.length?`, ${o.length} failed (${o[0].error})`:``}.`})},Se=e=>{k(!0),A(null),f.run(e.length>1?`Start ${e.length} agents`:`Start an agent`,async()=>{let t=[],n=null,r=0;for(let i of e)try{let e=await re(i);n??=e.agent.id,r+=e.archivedForCap.length}catch(e){t.push(`${i.title}: ${b(e)}`)}return{first:n,errors:t,archived:r,total:e.length}}).then(e=>{if(k(!1),!e)return;if(t(),e.errors.length===e.total){A(e.errors.join(` `));return}D({open:!1,multi:!1}),e.first&&g(e.first);let n=e.total-e.errors.length;N({tone:e.errors.length?`danger`:`neutral`,text:`Started ${n} agent${n===1?``:`s`}.${e.archived?` Archived ${e.archived} idle workspace${e.archived===1?``:`s`} to stay under the cap (restorable).`:``}${e.errors.length?` ${e.errors.join(` `)}`:``}`})},e=>{k(!1),A(b(e))})},we=e=>{e.sessionId&&c(e.sessionId)},Te=e=>{if(e.defaultPrevented||e.metaKey||e.ctrlKey||e.altKey||e.target.closest(`input, textarea, select, [contenteditable="true"]`))return;let t=be[e.key];if(t){e.preventDefault();let n=de(K,q,t),r=fe(K,n);r&&(g(r.id),he.current?.querySelector(`[data-card-id="${CSS.escape(r.id)}"]`)?.focus());return}let n=fe(K,q);if(n)switch(e.key){case`Enter`:e.preventDefault(),we(n);break;case` `:e.preventDefault(),w(e=>e===n.id?null:n.id);break;case`x`:e.preventDefault(),x(e=>{let t=new Set(e);return t.has(n.id)?t.delete(n.id):t.add(n.id),t});break;case`e`:e.preventDefault(),n.column===`needs-you`?N({tone:`neutral`,text:`Needs you is not cleared by marking read — resolve it (r) or act on it.`}):Q(`read`,me([n]),`Mark read`);break;case`r`:n.reason===`failed`&&(e.preventDefault(),Z(`resolve:${n.id}`,`Resolve this failed turn`,async()=>(await T(n.id),null)));break;case`s`:(n.status===`running`||n.status===`setup`)&&(e.preventDefault(),Q(`stop`,[n.id],`Stop`));break;case`Escape`:(S||_.size)&&(e.preventDefault(),w(null),x(new Set))}},$=[..._].filter(e=>W.some(t=>t.id===e)),Ee=e.data?.counts,De=n.data?.projects??[],Oe=n.data?.seats??[];return(0,X.jsxs)(`section`,{className:j.section,"aria-label":`Agents`,children:[(0,X.jsxs)(`header`,{className:j.header,children:[(0,X.jsxs)(`div`,{className:j.headerText,children:[(0,X.jsx)(`h2`,{className:j.title,children:`Agents`}),(0,X.jsxs)(`p`,{className:j.lede,children:[Ee?`${Ee.working} working · ${Ee[`needs-you`]} need you · ${Ee.review} ready for review`:`Every chat and agent, by what it needs.`,e.data?e.data.cap===C?` · ${e.data.liveWorkspaces} workspaces · no retention cap`:` · ${e.data.liveWorkspaces} of ${e.data.cap} workspaces`:``]})]}),(0,X.jsxs)(`div`,{className:j.headerActions,children:[(0,X.jsxs)(ce,{"aria-label":`Repository`,size:`sm`,value:p.repo??``,onChange:e=>m(t=>({...t,repo:e.target.value||null})),children:[(0,X.jsx)(`option`,{value:``,children:`All repos`}),_e.map(e=>(0,X.jsx)(`option`,{value:e,children:e},e))]}),(0,X.jsx)(z,{"aria-label":`Filter cards`,size:`sm`,placeholder:`Filter`,value:p.query,onChange:e=>m(t=>({...t,query:e.target.value}))}),(0,X.jsx)(v,{size:`sm`,variant:`ghost`,onClick:()=>Q(`read`,me(G),`Mark all read`),busy:F===`bulk:read`,title:`Needs you is never cleared by this`,children:`Mark all read`}),(0,X.jsx)(v,{size:`sm`,variant:`subtle`,onClick:()=>D({open:!0,multi:!0}),title:`⇧⌘N`,children:`Same task on N seats`}),(0,X.jsx)(v,{size:`sm`,variant:`primary`,onClick:()=>D({open:!0,multi:!1}),title:`⌘N`,children:`New agent`})]})]}),M?(0,X.jsx)(`p`,{className:j.banner,"data-tone":M.tone,role:`status`,children:M.text}):null,e.error&&!e.data?(0,X.jsx)(`p`,{className:j.banner,"data-tone":`danger`,role:`alert`,children:b(e.error)}):null,$.length>0?(0,X.jsxs)(`div`,{className:j.bulkBar,role:`toolbar`,"aria-label":`Selected cards`,children:[(0,X.jsxs)(`span`,{children:[$.length,` selected`]}),(0,X.jsx)(v,{size:`sm`,variant:`ghost`,onClick:()=>Q(`read`,me(G,new Set($)),`Mark read`),children:`Mark read`}),(0,X.jsx)(v,{size:`sm`,variant:`ghost`,onClick:()=>Q(`stop`,$,`Stop`),children:`Stop`}),(0,X.jsx)(v,{size:`sm`,variant:`ghost`,onClick:()=>Q(`pin`,$,`Pin`),children:`Pin`}),(0,X.jsx)(v,{size:`sm`,variant:`ghost`,onClick:()=>Q(`unpin`,$,`Unpin`),children:`Unpin`}),(0,X.jsx)(v,{size:`sm`,variant:`danger`,onClick:()=>Q(`archive`,$,`Archive`),children:`Archive`}),(0,X.jsx)(v,{size:`sm`,variant:`ghost`,onClick:()=>x(new Set),children:`Clear`})]}):null,(0,X.jsxs)(`div`,{className:j.body,"data-details":J?`open`:void 0,children:[e.data&&W.length===0?(0,X.jsx)(te,{title:`No agents yet`,body:`Start one with ⌘N: it gets its own worktree and branch, runs the repo’s setup, and shows up here while it works.`,action:(0,X.jsx)(v,{variant:`primary`,size:`sm`,onClick:()=>D({open:!0,multi:!1}),children:`New agent`})}):(0,X.jsx)(`div`,{className:j.board,ref:he,onKeyDown:Te,"aria-label":`Agent board`,"aria-keyshortcuts":`ArrowLeft ArrowRight ArrowUp ArrowDown Enter Space x e r s`,children:P.map(e=>(0,X.jsx)(Ce,{column:e,cards:K[e],now:a,cursorId:q?fe(K,q)?.id??null:null,selected:_,onFocusCard:e=>g(e),onOpen:we,onDetails:e=>{g(e),w(t=>t===e?null:e)},onToggleSelect:e=>x(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},e))}),J?(0,X.jsx)(ve,{card:J,now:a,onClose:()=>w(null),onChanged:t,act:Z,busy:F,onOpenChat:()=>we(J),onOpenTerminal:()=>{J.sessionId&&(c(J.sessionId),s(`terminal`,J.sessionId))},onStop:()=>{let e=J.sessionId;e&&Z(`stop`,`Stop this agent’s turn`,async()=>(await ee(e),null))}}):null]}),(0,X.jsx)(`p`,{className:j.keyHint,children:`←→↑↓ move · Enter open · Space details · x select · e mark read · r resolve · s stop · ⌘N new agent · ⇧⌘N same task on N seats`}),(0,X.jsx)(ye,{open:E.open,multi:E.multi,projects:De,seats:Oe,initialRoot:null,busy:O,error:ae,onClose:()=>{O||D({open:!1,multi:!1})},onSpawn:Se}),(0,X.jsx)(o,{...f.dialog,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`})]})}function Ce({column:e,cards:t,now:n,cursorId:r,selected:i,onFocusCard:a,onOpen:o,onDetails:s,onToggleSelect:c}){return(0,X.jsxs)(`section`,{className:j.column,"data-column":e,"aria-label":`${F[e]}, ${t.length}`,children:[(0,X.jsxs)(`h3`,{className:j.columnHead,children:[(0,X.jsx)(`span`,{children:F[e]}),(0,X.jsx)(`span`,{className:j.count,children:t.length})]}),(0,X.jsxs)(`ul`,{className:j.cardList,children:[t.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsx)(we,{card:e,now:n,active:e.id===r,selected:i.has(e.id),onFocus:()=>a(e.id),onOpen:()=>o(e),onDetails:()=>s(e.id),onToggleSelect:()=>c(e.id)})},e.id)),t.length===0?(0,X.jsx)(`li`,{className:j.emptyColumn,children:e===`needs-you`?`Nothing is waiting on you.`:`—`}):null]})]})}function we({card:e,now:t,active:n,selected:r,onFocus:i,onOpen:a,onDetails:o,onToggleSelect:s}){let c=e.startedAt?U(e.startedAt,t):he(e.updatedAt,t),l=_e(e),ee=G(e.spend);return(0,X.jsxs)(`div`,{className:j.card,"data-card-id":e.id,"data-active":n||void 0,"data-selected":r||void 0,"data-column":e.column,"data-reason":e.reason,tabIndex:0,role:`button`,"aria-pressed":r,"aria-label":`${e.title}. ${e.reasonText}.${e.unread?` Unread.`:``}`,onFocus:i,onClick:e=>{e.shiftKey||e.metaKey?s():o()},onDoubleClick:a,children:[(0,X.jsxs)(`div`,{className:j.cardTop,children:[(0,X.jsx)(`input`,{type:`checkbox`,className:j.cardCheck,checked:r,"aria-label":`Select ${e.title}`,onClick:e=>e.stopPropagation(),onChange:s,tabIndex:-1}),e.unread?(0,X.jsx)(`span`,{className:j.unreadDot,"aria-hidden":`true`}):null,(0,X.jsx)(`span`,{className:j.cardTitle,children:e.title}),e.pinned?(0,X.jsx)(`span`,{className:j.pin,"aria-label":`Pinned`,children:`•`}):null]}),(0,X.jsxs)(`div`,{className:j.cardMeta,children:[e.engine?(0,X.jsxs)(`span`,{className:j.seatChip,"data-engine":e.engine,children:[m[e.engine],e.model?` · ${e.model}`:``]}):null,e.repo?(0,X.jsxs)(`span`,{className:j.muted,children:[e.repo,e.branch?` · ${e.branch}`:``]}):null]}),(0,X.jsx)(`div`,{className:j.cardReason,"data-reason":e.reason,children:e.reasonText}),(0,X.jsxs)(`div`,{className:j.cardStats,children:[c?(0,X.jsx)(`span`,{title:e.startedAt?`Running for`:`Last activity`,children:c}):null,(0,X.jsx)(`span`,{"data-tone":ee,title:`At API list price — an equivalent`,children:ge(e.spend)}),l?(0,X.jsx)(`span`,{children:l}):null,e.autoFix?(0,X.jsx)(`span`,{className:j.flag,children:`auto-fix`}):null,e.autoMerge?(0,X.jsx)(`span`,{className:j.flag,children:`auto-merge`}):null]}),e.lastActivity?(0,X.jsx)(`div`,{className:j.cardLast,children:e.lastActivity}):null]})}function Te(){return(0,X.jsx)(Se,{})}export{Te as AgentsSection};
|
|
3
|
+
//# sourceMappingURL=AgentsSection-OKKOuYed.js.map
|