@ashlr/hub 3.22.0 → 3.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +5 -5
- package/dist/authority-surface.json +16 -11
- package/dist/build-identity.json +2 -2
- package/dist/cli/verify-safety-sources.d.ts +4 -0
- package/dist/cli/verify-safety-sources.js +41 -0
- package/dist/cli/verify-safety-sources.js.map +1 -0
- package/dist/cli/verify-safety.js +16 -1
- package/dist/cli/verify-safety.js.map +1 -1
- package/dist/core/decide/needs-you.d.ts +3 -1
- package/dist/core/decide/needs-you.js +52 -28
- package/dist/core/decide/needs-you.js.map +1 -1
- package/dist/core/fleet/fleet-control-model.d.ts +2 -1
- package/dist/core/fleet/fleet-control-model.js +5 -0
- package/dist/core/fleet/fleet-control-model.js.map +1 -1
- package/dist/core/fleet/fleet-control-types.d.ts +11 -1
- package/dist/core/fleet/fleet-control.d.ts +4 -0
- package/dist/core/fleet/fleet-control.js +23 -1
- package/dist/core/fleet/fleet-control.js.map +1 -1
- package/dist/core/fleet/quota.js +1 -1
- package/dist/core/fleet/quota.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
- package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
- package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
- package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
- package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
- package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{t as r}from"./global-BJ_kVFpD.js";import{i}from"./SkipToContent-BjJE6yOo.js";import{Bt as ee,Ht as te,Vt as a,gt as ne}from"./VerseConsoleApp-Cj6yPJo3.js";import{M as re,j as ie}from"./VerseShared-CH8mV5ew.js";import{b as ae}from"./verse-model-DAOz9LrY.js";import{n as o}from"./format-V6IiIMAL.js";import{n as s,t as c}from"./Button-DJY_Pu5B.js";import{n as oe,t as se}from"./ActionMenu-CebJFKYy.js";import{T as ce,l as le,v as ue,x as de}from"./icons-MYfI6vZr.js";import{a as fe,o as l}from"./command-catalog-Dnx-iMLX.js";import{t as u}from"./EmptyState-Cwpga8L9.js";import{t as d}from"./pane-chrome.module-D7o-fVd0.js";import{f as pe,r as me,u as he}from"./terminal-icons-BakeOpKV.js";import{a as ge,i as _e,n as ve,t as f}from"./terminal-client-iL4DagCN.js";import{a as p,i as ye,n as be,r as xe,s as Se,t as m}from"./terminal-view-D6AAh08q.js";var h=e(n(),1),g={pane:`_pane_7fww7_15`,loading:`_loading_7fww7_91`,strip:`_strip_7fww7_100`,tabs:`_tabs_7fww7_109`,tab:`_tab_7fww7_109`,tabButton:`_tabButton_7fww7_142`,tabClose:`_tabClose_7fww7_159`,noticeClose:`_noticeClose_7fww7_160`,tabTitle:`_tabTitle_7fww7_165`,tabExited:`_tabExited_7fww7_171`,unseen:`_unseen_7fww7_180`,stripActions:`_stripActions_7fww7_215`,cwd:`_cwd_7fww7_227`,headerStatus:`_headerStatus_7fww7_229`,notice:`_notice_7fww7_160`,inlineNotice:`_inlineNotice_7fww7_267`,body:`_body_7fww7_275`,panel:`_panel_7fww7_285`,viewport:`_viewport_7fww7_294`,host:`_host_7fww7_301`,viewLoading:`_viewLoading_7fww7_318`,exitBar:`_exitBar_7fww7_323`,header:`_header_7fww7_229`},_=t(),Ce={api:ge,createView:m,openStream:p,platform:ee(),writeClipboard:async e=>{await navigator.clipboard.writeText(e)}},we=3e3,v=`ashlr.verse.terminal.screenReader`,y=0;function b(){y=0}function Te(){try{return localStorage.getItem(v)===`1`}catch{return!1}}function Ee(e){try{localStorage.setItem(v,e?`1`:`0`)}catch{}}function De(e,t){if(e.type!==`keydown`||!l(e,[`chat`,`global`],t))return!1;let n=a(e),r=e.ctrlKey&&(n==="`"||n===`tab`);return t===`mac`?e.metaKey||r:r||e.ctrlKey&&e.shiftKey}function x(e,t){if(e instanceof f)return e.message;if(e instanceof r){if(e.status===401)return`Unlock actions with the mutation token to use the terminal.`;if(e.detail)return o(e.detail)}return t}function S({sessionId:e,roots:t,request:n,onSendToChat:ee,visible:a,deps:o}){let l=(0,h.useMemo)(()=>({...Ce,...o}),[o]),ge=re(),f=a&&ge,p=ne().compact,[m,v]=(0,h.useState)(null),[b,S]=(0,h.useState)(null),[C,w]=(0,h.useState)(null),[T,E]=(0,h.useState)(null),[D,Oe]=(0,h.useState)(!1),[ke,Ae]=(0,h.useState)(null),[je,Me]=(0,h.useState)(!1),[Ne,Pe]=(0,h.useState)(!1),[O,Fe]=(0,h.useState)(Te),[k,Ie]=(0,h.useState)(!1),[A,Le]=(0,h.useState)(()=>new Set),[j,Re]=(0,h.useState)(null),[ze,Be]=(0,h.useState)(()=>new Map),M=(0,h.useRef)(new Map),N=(0,h.useRef)(new Map),P=(0,h.useRef)(new Set),F=(0,h.useRef)(!1),I=(0,h.useRef)(null),Ve=(0,h.useRef)(null),L=(0,h.useRef)(new Map),R=(0,h.useRef)(null),z=(0,h.useRef)(null),B=(0,h.useRef)(null),V=(0,h.useRef)(!0),H=(0,h.useRef)(!1),U=(0,h.useMemo)(()=>m?.tabs??[],[m]),W=(0,h.useRef)(new Set);W.current=new Set(U.filter(e=>e.exited).map(e=>e.id));let G=(0,h.useMemo)(()=>U.filter(t=>t.sessionId===e),[U,e]),K=G.find(e=>e.id===C)??null,q=U.length-G.length,J=(0,h.useCallback)(async()=>{try{let e=await l.api.list();if(!V.current)return;v(e),S(null)}catch(e){if(!V.current)return;S(x(e,`The terminal list could not be loaded.`))}},[l.api]);(0,h.useEffect)(()=>(V.current=!0,J(),()=>{V.current=!1}),[J]),ie(()=>{J()},we,{enabled:a}),(0,h.useEffect)(()=>{m&&(C&&G.some(e=>e.id===C)||w(G.at(-1)?.id??null))},[m,G,C]),(0,h.useEffect)(()=>{if(!m)return;let e=new Set(m.tabs.map(e=>e.id));for(let[t,n]of M.current)e.has(t)||(Y(n),M.current.delete(t),Le(e=>{let n=new Set(e);return n.delete(t),n}))},[m]),(0,h.useEffect)(()=>{K&&f&&Be(e=>e.get(K.id)===K.lastActivityAt?e:new Map(e).set(K.id,K.lastActivityAt))},[K,f]),(0,h.useEffect)(()=>()=>{for(let e of M.current.values())Y(e);M.current.clear();for(let e of[R,z,B])e.current&&clearTimeout(e.current)},[]);function Y(e){e.queue.dispose();for(let t of e.disposers)try{t.dispose()}catch{}try{e.view.dispose()}catch{}}let He=(0,h.useCallback)(()=>{for(let e of M.current.values())if(e.view.cols>1&&e.view.rows>1)return{cols:e.view.cols,rows:e.view.rows};return{cols:80,rows:24}},[]),X=(0,h.useCallback)(async(t={})=>{Oe(!0),E(null);try{let n=await l.api.create({sessionId:e,...t.root?{root:t.root}:{},...t.appId?{appId:t.appId}:{},...t.appId&&t.via?{via:t.via}:{},...t.appId&&t.model?{model:t.model}:{},...t.devServerId?{devServerId:t.devServerId}:{},...He()});return V.current?(v(e=>e&&{...e,tabs:[...e.tabs.filter(e=>e.id!==n.id),n]}),w(n.id),n):n}catch(e){return V.current&&E({tone:`error`,text:x(e,`The terminal could not be opened.`)}),null}finally{V.current&&Oe(!1)}},[l.api,e,He]),Z=(0,h.useCallback)(async e=>{try{await l.api.kill(e.id)}catch(e){if(!(e instanceof r&&e.status===404)){E({tone:`error`,text:x(e,`The terminal could not be closed.`)});return}}let t=M.current.get(e.id);if(t&&(Y(t),M.current.delete(e.id)),v(t=>t&&{...t,tabs:t.tabs.filter(t=>t.id!==e.id)}),C===e.id){let t=G.findIndex(t=>t.id===e.id),n=G[t+1]??G[t-1]??null;w(n?.id??null)}},[C,l.api,G]),Ue=(0,h.useCallback)(async e=>{await X({root:e.root})&&await Z(e)},[Z,X]),We=(0,h.useRef)(e);We.current!==e&&(We.current=e,F.current=!1),(0,h.useEffect)(()=>{m&&m.available&&f&&!F.current&&!D&&(n&&n.nonce>y||(F.current=!0,G.length===0&&X({})))},[m,f,G.length,D,X,n]);let Ge=(0,h.useCallback)(async(e,t)=>{if(!(M.current.has(e)||P.current.has(e))){P.current.add(e);try{let n=await l.createView({...be(t),theme:xe(t),screenReaderMode:Te()});if(!V.current||!N.current.has(e)){n.dispose();return}n.open(t);let r=Se(t=>l.api.input(e,t),{onError:e=>{V.current&&E({tone:`error`,text:x(e,`That input did not reach the shell.`)})}}),i={view:n,host:t,lastSeq:0,queue:r,disposers:[]};i.disposers.push(n.onData(t=>{W.current.has(e)||r.pushText(t)})),i.disposers.push(n.onBinary(t=>{W.current.has(e)||r.pushBinary(t)})),i.disposers.push(n.onSelectionChange(()=>{let e=n.hasSelection();Me(e),e&&(B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{let e=n.getSelection();e&&l.writeClipboard(e).then(()=>{V.current&&(Pe(!0),z.current&&clearTimeout(z.current),z.current=setTimeout(()=>Pe(!1),1200))},()=>{})},150))})),n.setKeyFilter(e=>!De(e,l.platform)),M.current.set(e,i),Ie(!1),Le(t=>new Set(t).add(e))}catch(e){console.error(`[verse] terminal view failed to load`,e),V.current&&Ie(!0)}finally{P.current.delete(e)}}},[l]),Ke=(0,h.useRef)(Ge);Ke.current=Ge;let qe=(0,h.useRef)(new Map),Je=e=>{let t=qe.current.get(e);return t||(t=t=>{t?(N.current.set(e,t),Ke.current(e,t)):(N.current.delete(e),qe.current.delete(e))},qe.current.set(e,t)),t},Ye=(0,h.useCallback)(()=>{if(!C)return;let e=M.current.get(C);if(!e)return;let t={cols:e.view.cols,rows:e.view.rows},n=e.view.fit();if(!n||n.cols===t.cols&&n.rows===t.rows&&K&&K.cols===n.cols&&K.rows===n.rows)return;R.current&&clearTimeout(R.current);let r=C;R.current=setTimeout(()=>{l.api.resize(r,n.cols,n.rows).catch(()=>{})},100)},[K,C,l.api]);(0,h.useEffect)(()=>{if(!f||!C||!A.has(C))return;Ye();let e=Ve.current;if(!e||typeof ResizeObserver>`u`)return;let t=0,n=new ResizeObserver(()=>{cancelAnimationFrame(t),t=requestAnimationFrame(Ye)});return n.observe(e),()=>{cancelAnimationFrame(t),n.disconnect()}},[f,C,A,Ye]),(0,h.useEffect)(()=>ye(()=>{for(let e of M.current.values())e.view.setTheme(xe(e.host))}),[]);let Q=(0,h.useCallback)(e=>{let t=I.current;if(!t||t.tabId!==e)return;let n=M.current.get(e);if(!n)return;I.current=null;let r=t.text.replace(/[\r\n]+$/,``);r.includes(`
|
|
2
|
-
`)&&!n.view.bracketedPaste()?l.writeClipboard(r).then(()=>E({tone:`info`,text:`That command has several lines, so it was copied instead: paste it with ⌘V.`}),()=>E({tone:`error`,text:`That command has several lines and could not be pasted safely.`})):n.view.paste(r),n.view.focus()},[l]);(0,h.useEffect)(()=>{if(!f||!C||!A.has(C)){Ae(null);return}let e=M.current.get(C);if(!e)return;let t=C,n=!0,r=l.openStream(t,()=>e.lastSeq,{onFrame:r=>{if(r.type===`output`){if(r.seq<=e.lastSeq)return;e.lastSeq>0&&r.seq>e.lastSeq+1&&e.view.reset(),e.view.write(ve(r.dataBase64)),e.lastSeq=r.seq,n&&(n=!1,I.current?.tabId===t&&setTimeout(()=>Q(t),120));return}v(e=>e&&{...e,tabs:e.tabs.map(e=>e.id===t?r.type===`title`?e.title===r.title?e:{...e,title:r.title}:{...e,exited:{code:r.code,signal:r.signal,at:new Date().toISOString()}}:e)})},onState:e=>{V.current&&(Ae(e),e===`gone`&&J())}});return I.current?.tabId===t&&e.lastSeq>0&&setTimeout(()=>Q(t),0),()=>r.close()},[f,C,A,l,J,Q]);let Xe=(0,h.useCallback)(async e=>{let n=e.root??K?.root??t[0],r=e.newTab===!0||!!e.appId||!!e.devServerId,i=null;if(r||(i=(K&&!K.exited&&(!e.root||K.root===e.root)?K:null)??G.find(t=>!t.exited&&(!e.root||t.root===e.root))??null),i?w(i.id):i=await X({...n?{root:n}:{},...e.appId?{appId:e.appId}:{},...e.via?{via:e.via}:{},...e.model?{model:e.model}:{},...e.devServerId?{devServerId:e.devServerId}:{}}),i){if(e.paste){I.current={tabId:i.id,text:e.paste};let t=M.current.get(i.id);t&&t.lastSeq>0&&Q(i.id)}else M.current.get(i.id)?.view.focus()}},[K,Q,X,t,G]);(0,h.useEffect)(()=>{!n||!m||n.nonce<=y||(y=n.nonce,F.current=!0,m.available&&Xe(n))},[n,m,Xe]),(0,h.useEffect)(()=>{f&&C&&A.has(C)&&M.current.get(C)?.view.focus()},[f,C,A]);let Ze=()=>{if(!C)return;let e=M.current.get(C)?.view.getSelection()??``;e.trim()&&ee(_e(e))},Qe=()=>{let e=!O;Fe(e),Ee(e);for(let t of M.current.values())t.view.setScreenReaderMode(e)},$e=async()=>{try{await l.api.openExternal(e,K?.root??t[0]),E({tone:`info`,text:`Opened in Terminal.`})}catch(e){E({tone:`error`,text:x(e,`Terminal could not be opened.`)})}},et=e=>{H.current=!0,X(e).finally(()=>{H.current=!1})},tt=()=>{et(K?.root?{root:K.root}:{})},nt=(e,t)=>{let n=-1;if(e.key===`ArrowRight`?n=(t+1)%G.length:e.key===`ArrowLeft`?n=(t-1+G.length)%G.length:e.key===`Home`?n=0:e.key===`End`&&(n=G.length-1),n<0)return;e.preventDefault();let r=G[n];w(r.id),L.current.get(r.id)?.focus()};if(!m)return b?(0,_.jsx)(`div`,{className:g.pane,children:(0,_.jsx)(u,{compact:!0,tone:`error`,title:`Terminal is not reachable`,body:b,action:(0,_.jsx)(c,{size:`sm`,variant:`subtle`,onClick:()=>void J(),children:`Try again`})})}):(0,_.jsxs)(`div`,{className:g.pane,"aria-busy":`true`,children:[(0,_.jsx)(`div`,{className:g.strip,"aria-hidden":`true`}),(0,_.jsxs)(`div`,{className:g.loading,children:[(0,_.jsx)(i,{width:`40%`}),(0,_.jsx)(i,{width:`70%`})]})]});if(!m.available)return(0,_.jsxs)(`div`,{className:g.pane,children:[(0,_.jsx)(u,{compact:!0,icon:(0,_.jsx)(pe,{size:20}),title:`Terminal needs the desktop app`,body:`This Verse server has no built-in terminal. Open the project in Terminal instead, or use the Ashlr desktop app.`,action:l.platform===`mac`?(0,_.jsx)(c,{size:`sm`,variant:`subtle`,icon:(0,_.jsx)(le,{}),onClick:()=>void $e(),children:`Open in Terminal`}):void 0}),T?(0,_.jsx)(`p`,{className:g.inlineNotice,role:T.tone===`error`?`alert`:`status`,children:T.text}):null]});let rt=t.length>1,it=fe(`dock.terminal-new`)?.keys[0],$=it?te(it,l.platform):null,at=G.length===0&&!k&&(!F.current||D&&!H.current),ot=K?.root??G.at(-1)?.root??(at?t[0]??null:null);return(0,_.jsxs)(`div`,{className:g.pane,"data-compact":p||void 0,children:[(0,_.jsxs)(`div`,{className:g.strip,children:[(0,_.jsx)(`div`,{className:g.tabs,role:`tablist`,"aria-label":`Terminals`,children:G.map((e,t)=>{let n=e.id===C,r=!n&&(ze.get(e.id)??e.createdAt)<e.lastActivityAt;return(0,_.jsxs)(`div`,{className:g.tab,"data-selected":n||void 0,role:`presentation`,children:[(0,_.jsxs)(`button`,{ref:t=>{t?L.current.set(e.id,t):L.current.delete(e.id)},type:`button`,role:`tab`,id:`terminal-tab-${e.id}`,"aria-selected":n,"aria-controls":`terminal-panel-${e.id}`,tabIndex:n?0:-1,className:g.tabButton,title:`${e.title} — ${e.root}`,onClick:()=>w(e.id),onKeyDown:e=>nt(e,t),children:[(0,_.jsx)(`span`,{className:g.tabTitle,children:e.title}),e.exited?(0,_.jsx)(`span`,{className:g.tabExited,children:`exited`}):null,r&&!e.exited?(0,_.jsx)(`span`,{className:g.unseen,"aria-label":`new output`,role:`img`}):null]}),(0,_.jsx)(`button`,{type:`button`,className:g.tabClose,"aria-label":`Close terminal ${e.title}`,title:`Close terminal`,onClick:()=>void Z(e),children:(0,_.jsx)(ce,{size:12})})]},e.id)})}),(0,_.jsxs)(`div`,{className:g.stripActions,children:[(0,_.jsx)(s,{variant:`ghost`,size:`sm`,icon:(0,_.jsx)(ue,{}),"aria-label":`New terminal tab`,title:$?`New terminal tab (${$})`:`New terminal tab`,busy:D,onClick:tt}),rt?(0,_.jsx)(s,{variant:`ghost`,size:`sm`,icon:(0,_.jsx)(me,{}),"aria-label":`New terminal in…`,"aria-haspopup":`menu`,"aria-expanded":j!==null,title:`Choose the folder`,onClick:e=>Re({anchor:oe(e.currentTarget),from:e.currentTarget})}):null]})]}),ot===null?null:(0,_.jsxs)(`div`,{className:`${d.header} ${g.header}`,children:[(0,_.jsx)(`span`,{className:`${d.title} ${g.cwd}`,title:ot,children:ae(ot)}),(0,_.jsx)(`span`,{className:g.headerStatus,role:`status`,"aria-live":`polite`,children:ke===`reconnecting`?`Reconnecting…`:ke===`expired`?`Session expired — reload to reconnect`:Ne?`Copied`:``}),(0,_.jsxs)(`div`,{className:d.actions,children:[(0,_.jsx)(c,{variant:`ghost`,size:`sm`,icon:(0,_.jsx)(de,{}),disabled:!je,"aria-label":`Send selection to chat`,title:je?`Send the selected text to the chat as a code block`:`Select text in the terminal first`,onClick:Ze,children:p?null:`Send to chat`}),(0,_.jsx)(s,{variant:`ghost`,size:`sm`,icon:(0,_.jsx)(he,{}),"aria-label":`Screen reader mode`,"aria-pressed":O,title:O?`Screen reader mode is on`:`Screen reader mode`,onClick:Qe}),l.platform===`mac`?(0,_.jsx)(s,{variant:`ghost`,size:`sm`,icon:(0,_.jsx)(le,{}),"aria-label":`Open in Terminal.app`,title:`Open this folder in Terminal.app`,onClick:()=>void $e()}):null]})]}),T?(0,_.jsxs)(`div`,{className:g.notice,"data-tone":T.tone,role:T.tone===`error`?`alert`:`status`,children:[(0,_.jsx)(`span`,{children:T.text}),(0,_.jsx)(`button`,{type:`button`,className:g.noticeClose,"aria-label":`Dismiss`,title:`Dismiss`,onClick:()=>E(null),children:(0,_.jsx)(ce,{size:12})})]}):null,(0,_.jsxs)(`div`,{className:g.body,ref:Ve,children:[k?(0,_.jsx)(u,{compact:!0,tone:`error`,title:`The terminal could not load`,body:`The rest of the chat still works.`,action:(0,_.jsx)(c,{size:`sm`,variant:`subtle`,onClick:()=>{Ie(!1);for(let[e,t]of N.current)Ge(e,t)},children:`Try again`})}):null,at?(0,_.jsx)(`div`,{className:g.loading,role:`status`,"aria-label":`Opening a shell`,children:(0,_.jsx)(i,{width:`30%`})}):null,G.length===0&&!k&&!at?(0,_.jsx)(u,{compact:!0,icon:(0,_.jsx)(pe,{size:20}),title:`No terminal open`,body:`Click New terminal${$?` or press ${$}`:``} to open a login shell in this chat's folder.${q>0?` ${q} ${q===1?`terminal is`:`terminals are`} open in other chats.`:``}`,action:(0,_.jsx)(c,{size:`sm`,variant:`subtle`,icon:(0,_.jsx)(ue,{}),busy:D,onClick:tt,children:`New terminal`})}):null,G.map(e=>{let t=e.id===C;return(0,_.jsxs)(`div`,{id:`terminal-panel-${e.id}`,role:`tabpanel`,"aria-labelledby":`terminal-tab-${e.id}`,className:g.panel,hidden:!t,children:[(0,_.jsxs)(`div`,{className:g.viewport,children:[(0,_.jsx)(`div`,{className:g.host,ref:Je(e.id),"data-testid":`terminal-host-${e.id}`}),!A.has(e.id)&&!k?(0,_.jsx)(`div`,{className:g.viewLoading,"aria-hidden":`true`,children:(0,_.jsx)(i,{width:`30%`})}):null]}),e.exited?(0,_.jsxs)(`div`,{className:g.exitBar,role:`status`,children:[(0,_.jsx)(`span`,{children:e.exited.signal&&e.exited.code===null?`Shell ended (${e.exited.signal}).`:`Shell exited${e.exited.code===null?``:` with code ${e.exited.code}`}.`}),(0,_.jsx)(c,{size:`sm`,variant:`subtle`,onClick:()=>void Ue(e),children:`Restart`}),(0,_.jsx)(c,{size:`sm`,variant:`ghost`,onClick:()=>void Z(e),children:`Close`})]}):null]},e.id)})]}),j?(0,_.jsx)(se,{label:`New terminal in`,anchor:j.anchor,returnFocus:j.from,onClose:()=>Re(null),items:t.map(e=>({id:e,label:ae(e),description:e,onSelect:()=>{et({root:e})}}))}):null]})}export{we as TERMINAL_LIST_POLL_MS,S as TerminalPane,De as keyPassesToPage,b as resetTerminalPaneForTest};
|
|
3
|
-
//# sourceMappingURL=TerminalPane-DJKT600N.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TerminalPane-DJKT600N.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/TerminalPane.module.css","../../../../../../src/web-ui/routes/verse/dock/terminal/TerminalPane.tsx"],"sourcesContent":["/*\n * dock/terminal/TerminalPane.module.css — the Terminal pane (unit C4).\n * Tokens only (design/style-scan-310: no raw hex, no px font sizes).\n *\n * THE TERMINAL PALETTE. xterm needs concrete colours, so the pane declares\n * them here as custom properties mapped onto design tokens, and\n * terminal-view.ts resolves them at runtime (and again on a theme change).\n * The ANSI colours reuse the status inks (red/green/yellow), the quantity\n * azure (blue) and categorical inks (magenta/cyan) — never the accent, which\n * is interaction only; the accent appears only as the selection, which IS\n * interaction. The neutral ramp inverts between themes, so black/white are\n * re-pointed in dark mode to stay dark/light.\n */\n\n.pane {\n --term-bg: var(--bg-code);\n --term-fg: var(--text-primary);\n --term-cursor: var(--text-primary);\n --term-selection: color-mix(in srgb, var(--accent-500) 26%, transparent);\n --term-selection-inactive: var(--bg-selected);\n --term-scrollbar: color-mix(in srgb, var(--text-tertiary) 30%, transparent);\n --term-scrollbar-hover: color-mix(in srgb, var(--text-tertiary) 55%, transparent);\n /* Light: the normal hues are the dark text inks; \"bright\" ones are the\n stronger fills where those still read on --bg-code (≥ 3:1, tested). */\n --term-black: var(--gray-800);\n --term-red: var(--status-danger-fg);\n --term-green: var(--status-success-fg);\n --term-yellow: var(--status-running-fg);\n --term-blue: var(--data-seq-6);\n --term-magenta: var(--data-cat-4);\n --term-cyan: var(--data-cat-1);\n --term-white: var(--gray-300);\n --term-bright-black: var(--gray-500);\n --term-bright-red: var(--status-danger-solid);\n --term-bright-green: var(--data-cat-5);\n --term-bright-yellow: var(--status-warning-fg);\n --term-bright-blue: var(--status-info-solid);\n --term-bright-magenta: var(--data-cat-6);\n --term-bright-cyan: var(--data-cat-1);\n --term-bright-white: var(--gray-100);\n\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--term-bg);\n color: var(--text-primary);\n}\n\n/* Dark: the solids read well on the near-black background and the -fg inks\n are the brighter set; the neutral ramp inverts (gray-800 is light here). */\n:global(:root[data-theme='dark']) .pane {\n --term-black: var(--gray-300);\n --term-red: var(--status-danger-solid);\n --term-green: var(--status-success-solid);\n --term-yellow: var(--status-running-solid);\n --term-blue: var(--data-seq-5);\n --term-magenta: var(--data-cat-4);\n --term-cyan: var(--data-cat-1);\n --term-white: var(--gray-800);\n --term-bright-black: var(--gray-500);\n --term-bright-red: var(--status-danger-fg);\n --term-bright-green: var(--status-success-fg);\n --term-bright-yellow: var(--status-running-fg);\n --term-bright-blue: var(--data-seq-6);\n --term-bright-magenta: var(--data-cat-6);\n --term-bright-cyan: var(--data-cat-1);\n --term-bright-white: var(--gray-900);\n}\n@media (prefers-color-scheme: dark) {\n :global(:root:not([data-theme='light'])) .pane {\n --term-black: var(--gray-300);\n --term-red: var(--status-danger-solid);\n --term-green: var(--status-success-solid);\n --term-yellow: var(--status-running-solid);\n --term-blue: var(--data-seq-5);\n --term-magenta: var(--data-cat-4);\n --term-cyan: var(--data-cat-1);\n --term-white: var(--gray-800);\n --term-bright-black: var(--gray-500);\n --term-bright-red: var(--status-danger-fg);\n --term-bright-green: var(--status-success-fg);\n --term-bright-yellow: var(--status-running-fg);\n --term-bright-blue: var(--data-seq-6);\n --term-bright-magenta: var(--data-cat-6);\n --term-bright-cyan: var(--data-cat-1);\n --term-bright-white: var(--gray-900);\n }\n}\n\n.loading {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--card-pad);\n}\n\n/* ---- tab strip ------------------------------------------------------------ */\n\n.strip {\n display: flex;\n align-items: stretch;\n flex: none;\n min-height: var(--control-h-sm);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n.tabs {\n display: flex;\n align-items: stretch;\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.tabs::-webkit-scrollbar { display: none; }\n\n.tab {\n position: relative;\n display: flex;\n align-items: center;\n flex: none;\n max-width: 200px;\n border-right: 1px solid var(--border-subtle);\n color: var(--text-secondary);\n}\n.tab[data-selected] {\n color: var(--text-primary);\n background: var(--term-bg);\n}\n/* The selected tab's 2px underline: interaction, so the accent. */\n.tab[data-selected]::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: -1px;\n height: 2px;\n background: var(--accent-500);\n}\n\n.tabButton {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n height: 100%;\n padding: 0 var(--space-1) 0 var(--space-3);\n border: 0;\n background: transparent;\n color: inherit;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n cursor: pointer;\n}\n.tabButton:hover { color: var(--text-primary); }\n.tabButton:focus-visible,\n.tabClose:focus-visible,\n.noticeClose:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n\n.tabTitle {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tabExited {\n flex: none;\n font-family: var(--font-ui);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n}\n\n/* Unseen output in a background tab: a dot WITH an accessible name. */\n.unseen {\n flex: none;\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-info-solid);\n}\n\n.tabClose {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n /* One step under the xs control: 20px comfortable, 16px compact. A literal\n 20px stayed comfortable when Density went compact and outgrew the\n shrunken tab row (control-density.test.ts, DESIGN-V2 §2). */\n width: calc(var(--control-h-xs) - var(--space-1));\n height: calc(var(--control-h-xs) - var(--space-1));\n margin-right: var(--space-1);\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.tab:hover .tabClose,\n.tab[data-selected] .tabClose,\n.tabClose:focus-visible { opacity: 1; }\n.tabClose:hover { background: var(--bg-hover); color: var(--text-primary); }\n@media (hover: none) {\n .tabClose { opacity: 1; }\n}\n\n.stripActions {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n flex: none;\n padding: 0 var(--space-1);\n}\n\n/* ---- header --------------------------------------------------------------- */\n/* Height, padding, border and surface come from ../pane-chrome.module.css\n (the row every dock pane shares); only what is terminal-specific is here. */\n\n.cwd { font-family: var(--font-mono); }\n\n.headerStatus {\n flex: none;\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n.headerStatus:empty { display: none; }\n\n/* ---- notices -------------------------------------------------------------- */\n\n.notice {\n display: flex;\n align-items: flex-start;\n gap: var(--space-2);\n flex: none;\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n background: var(--status-info-bg);\n color: var(--status-info-fg);\n}\n.notice[data-tone='error'] {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n.notice > span { flex: 1; }\n\n.noticeClose {\n display: inline-flex;\n flex: none;\n padding: var(--space-1);\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: inherit;\n cursor: pointer;\n}\n\n.inlineNotice {\n margin: 0 var(--card-pad) var(--card-pad);\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n\n/* ---- terminal body -------------------------------------------------------- */\n\n.body {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n}\n.panel[hidden] { display: none; }\n\n/* Padding lives on the viewport; xterm's fit reads the HOST's box. */\n.viewport {\n position: relative;\n flex: 1 1 auto;\n min-height: 0;\n padding: var(--space-2) var(--space-1) var(--space-1) var(--space-3);\n}\n\n.host {\n width: 100%;\n height: 100%;\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n}\n\n/* xterm's own scroll area follows the pane's background, not xterm's default black. */\n.host :global(.xterm),\n.host :global(.xterm-viewport) {\n background-color: var(--term-bg) !important;\n}\n.host :global(.xterm-viewport) {\n scrollbar-width: thin;\n scrollbar-color: var(--term-scrollbar) transparent;\n}\n\n.viewLoading {\n position: absolute;\n inset: var(--space-3);\n}\n\n.exitBar {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n padding: var(--space-2) var(--space-3);\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n.exitBar > span { flex: 1; min-width: 0; }\n\n/* ---- compact (375) -------------------------------------------------------- */\n\n.pane[data-compact] .tab { max-width: 140px; }\n.pane[data-compact] .header { padding-left: var(--space-2); }\n.pane[data-compact] .viewport { padding-left: var(--space-2); }\n\n@media (prefers-reduced-motion: reduce) {\n .tabClose { transition: none; }\n}\n","/**\n * dock/terminal/TerminalPane.tsx — the chat dock's Terminal (unit C4;\n * SPEC-310C §3). Rendered by C2's Dock through C0's `terminal-pane` slot, so\n * this file (and xterm with it) loads only when a terminal is first opened.\n *\n * WHAT IT IS\n * - One tab per shell, each a LOGIN shell the sidecar runs on a real PTY\n * (core/verse/terminal.ts), opened in one of this chat's roots. Tabs\n * live on the server: a page reload reattaches to them and replays their\n * scrollback. The tab title follows the shell's own OSC title.\n * - Header: the working directory, \"Send selection to chat\" (as a fenced\n * block), a screen-reader mode, and \"Open in Terminal.app\".\n * - Selecting text copies it (the ⌘C you would otherwise type next).\n * - Under Node (no PTY) the pane says the terminal needs the desktop app\n * and still offers Terminal.app.\n *\n * WIRING\n * - Output: ONE live stream, the visible tab's (terminal-stream.ts). A\n * background tab catches up from its last seq when shown again; the\n * list poll (every 3 s, only while visible) marks unseen output with a dot.\n * - Input: keystrokes go through a single-flight queue (input-queue.ts) so\n * they reach the shell in the order they were typed.\n * - Keys: xterm owns the keyboard while focused, EXCEPT the app's own\n * chords (⌘K, ⌘J, ⌘1–5, ⌃`, ⌃Tab …, from command-catalog.ts), which it\n * passes to the page. ⌃C, ⌃R, Esc and ⌥-word motions stay in the shell.\n * - Requests from the dock (`request`, one per nonce): focus or open a tab\n * at a root, force a new one (⌃⇧`), paste a command WITHOUT running it\n * (\"Run in terminal\"), launch an app or start a dev server (the server\n * types that command — built from its own catalog, never from the page).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport type { VerseTerminalFrame, VerseTerminalListResponse, VerseTerminalTab } from '../../../../data/api-types.js';\nimport { ApiError } from '../../../../data/client.js';\nimport { Button, IconButton } from '../../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../../components/primitives/EmptyState.js';\nimport { SkeletonLine } from '../../../../components/primitives/Skeleton.js';\nimport { IconExternalLink, IconPlus, IconSend, IconX } from '../../../../components/primitives/icons.js';\nimport { asSentence } from '../../autonomy/format.js';\nimport { ActionMenu, anchorBelow, type MenuAnchor } from '../../chat/ActionMenu.js';\nimport { detectKeyPlatform, eventKeyName, findCommand, formatChord, matchCommand, type KeyPlatform } from '../../shell/command-catalog.js';\nimport { usePollWhileVisible, useSectionVisible } from '../../shell/section-visibility.js';\nimport type { VerseTerminalLaunchVia } from '../../../../../core/verse/workbench-types.js';\nimport type { TerminalPaneProps } from '../../shell/slots.js';\nimport type { TerminalRequest } from '../dock-store.js';\nimport { useViewport } from '../../shell/viewport.js';\nimport { projectName } from '../../verse-model.js';\nimport { createInputQueue, type InputQueue } from './input-queue.js';\nimport { base64ToBytes, fenceSelection, terminalApi, TerminalLockedError, type TerminalApi } from './terminal-client.js';\nimport { openTerminalStream, type TerminalStreamState } from './terminal-stream.js';\nimport {\n createXtermView,\n resolveTerminalFont,\n resolveTerminalTheme,\n watchThemeChanges,\n type TerminalView,\n type TerminalViewFactory,\n} from './terminal-view.js';\nimport { ChevronDownGlyph, ScreenReaderGlyph, TerminalGlyph } from './terminal-icons.js';\nimport chrome from '../pane-chrome.module.css';\nimport styles from './TerminalPane.module.css';\n\n// ---------------------------------------------------------------------------\n// Seams\n// ---------------------------------------------------------------------------\n\nexport interface TerminalPaneDeps {\n api: TerminalApi;\n createView: TerminalViewFactory;\n openStream: typeof openTerminalStream;\n platform: KeyPlatform;\n writeClipboard: (text: string) => Promise<void>;\n}\n\nconst DEFAULT_DEPS: TerminalPaneDeps = {\n api: terminalApi,\n createView: createXtermView,\n openStream: openTerminalStream,\n platform: detectKeyPlatform(),\n writeClipboard: async (text) => {\n await navigator.clipboard.writeText(text);\n },\n};\n\n/** How often the tab list is refreshed while the pane is on screen. */\nexport const TERMINAL_LIST_POLL_MS = 3_000;\nconst SCREEN_READER_PREF_KEY = 'ashlr.verse.terminal.screenReader';\n/** Requests already handled, across remounts (the dock keeps its last request around). */\nlet lastHandledNonce = 0;\n\n/** Test hygiene. */\nexport function resetTerminalPaneForTest(): void {\n lastHandledNonce = 0;\n}\n\nfunction readScreenReaderPref(): boolean {\n try {\n return localStorage.getItem(SCREEN_READER_PREF_KEY) === '1';\n } catch {\n return false;\n }\n}\n\nfunction writeScreenReaderPref(on: boolean): void {\n try {\n localStorage.setItem(SCREEN_READER_PREF_KEY, on ? '1' : '0');\n } catch {\n /* storage unavailable: the choice lasts for this page only */\n }\n}\n\n/**\n * Keys the PAGE handles even while the terminal has focus: a catalog command\n * whose chord uses ⌘ (macOS), or ⌃` / ⌃Tab. Everything else — ⌃C, ⌃R, Esc,\n * ⌥← — belongs to the shell. Off macOS `mod` is Ctrl, so only Ctrl+Shift\n * chords and ⌃` / ⌃Tab pass (Ctrl+K must still kill a line).\n */\nexport function keyPassesToPage(event: KeyboardEvent, platform: KeyPlatform): boolean {\n if (event.type !== 'keydown') return false;\n if (!matchCommand(event, ['chat', 'global'], platform)) return false;\n const key = eventKeyName(event);\n const shellChord = event.ctrlKey && (key === '`' || key === 'tab');\n if (platform === 'mac') return event.metaKey || shellChord;\n return shellChord || (event.ctrlKey && event.shiftKey);\n}\n\nfunction errorText(err: unknown, fallback: string): string {\n if (err instanceof TerminalLockedError) return err.message;\n if (err instanceof ApiError) {\n if (err.status === 401) return 'Unlock actions with the mutation token to use the terminal.';\n if (err.detail) return asSentence(err.detail);\n }\n return fallback;\n}\n\ninterface ViewRecord {\n view: TerminalView;\n host: HTMLDivElement;\n lastSeq: number;\n queue: InputQueue;\n disposers: Array<{ dispose(): void }>;\n}\n\ntype Notice = { tone: 'error' | 'info'; text: string };\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TerminalPane({ sessionId, roots, request, onSendToChat, visible, deps: depsOverride }: TerminalPaneProps & { deps?: Partial<TerminalPaneDeps> }) {\n const deps = useMemo<TerminalPaneDeps>(() => ({ ...DEFAULT_DEPS, ...depsOverride }), [depsOverride]);\n const sectionVisible = useSectionVisible();\n const shown = visible && sectionVisible;\n const compact = useViewport().compact;\n\n const [list, setList] = useState<VerseTerminalListResponse | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [activeId, setActiveId] = useState<string | null>(null);\n const [notice, setNotice] = useState<Notice | null>(null);\n const [creating, setCreating] = useState(false);\n const [streamState, setStreamState] = useState<TerminalStreamState | null>(null);\n const [hasSelection, setHasSelection] = useState(false);\n const [copied, setCopied] = useState(false);\n const [screenReader, setScreenReader] = useState(readScreenReaderPref);\n const [viewFailed, setViewFailed] = useState(false);\n const [readyIds, setReadyIds] = useState<ReadonlySet<string>>(() => new Set());\n const [rootMenu, setRootMenu] = useState<{ anchor: MenuAnchor; from: HTMLElement } | null>(null);\n const [seen, setSeen] = useState<ReadonlyMap<string, string>>(() => new Map());\n\n const views = useRef(new Map<string, ViewRecord>());\n const hosts = useRef(new Map<string, HTMLDivElement>());\n const creatingViews = useRef(new Set<string>());\n const autoCreated = useRef(false);\n const pendingPaste = useRef<{ tabId: string; text: string } | null>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const tabRefs = useRef(new Map<string, HTMLButtonElement>());\n const resizeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const copyTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const selectionTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const mounted = useRef(true);\n /**\n * True while a shell the operator CLICKED for is opening (New terminal, the\n * folder menu). Any other open — the automatic first one, a dock request —\n * shows the pane opening instead of \"No terminal open\"; a click keeps the\n * empty state (and the focused, busy button) where it is.\n */\n const manualOpen = useRef(false);\n\n const allTabs = useMemo(() => list?.tabs ?? [], [list]);\n const exitedIds = useRef(new Set<string>());\n exitedIds.current = new Set(allTabs.filter((t) => t.exited).map((t) => t.id));\n const tabs = useMemo(() => allTabs.filter((t) => t.sessionId === sessionId), [allTabs, sessionId]);\n const active = tabs.find((t) => t.id === activeId) ?? null;\n const otherChats = allTabs.length - tabs.length;\n\n // -------------------------------------------------------------------------\n // The tab list\n // -------------------------------------------------------------------------\n\n const refresh = useCallback(async () => {\n try {\n const next = await deps.api.list();\n if (!mounted.current) return;\n setList(next);\n setLoadError(null);\n } catch (err) {\n if (!mounted.current) return;\n setLoadError(errorText(err, 'The terminal list could not be loaded.'));\n }\n }, [deps.api]);\n\n useEffect(() => {\n mounted.current = true;\n void refresh();\n return () => { mounted.current = false; };\n }, [refresh]);\n\n usePollWhileVisible(() => { void refresh(); }, TERMINAL_LIST_POLL_MS, { enabled: visible });\n\n // Keep the active tab valid: the first of this chat's tabs when it vanished.\n useEffect(() => {\n if (!list) return;\n if (activeId && tabs.some((t) => t.id === activeId)) return;\n setActiveId(tabs.at(-1)?.id ?? null);\n }, [list, tabs, activeId]);\n\n // Forget views of tabs that no longer exist (killed elsewhere, idle-closed).\n useEffect(() => {\n if (!list) return;\n const live = new Set(list.tabs.map((t) => t.id));\n for (const [id, rec] of views.current) {\n if (live.has(id)) continue;\n disposeRecord(rec);\n views.current.delete(id);\n setReadyIds((prev) => { const next = new Set(prev); next.delete(id); return next; });\n }\n }, [list]);\n\n // The active tab's output is seen as it arrives.\n useEffect(() => {\n if (!active || !shown) return;\n setSeen((prev) => (prev.get(active.id) === active.lastActivityAt ? prev : new Map(prev).set(active.id, active.lastActivityAt)));\n }, [active, shown]);\n\n // Dispose everything on unmount (the SERVER keeps the shells).\n useEffect(() => () => {\n for (const rec of views.current.values()) disposeRecord(rec);\n views.current.clear();\n for (const t of [resizeTimer, copyTimer, selectionTimer]) if (t.current) clearTimeout(t.current);\n }, []);\n\n function disposeRecord(rec: ViewRecord): void {\n rec.queue.dispose();\n for (const d of rec.disposers) {\n try { d.dispose(); } catch { /* already gone */ }\n }\n try { rec.view.dispose(); } catch { /* already gone */ }\n }\n\n // -------------------------------------------------------------------------\n // Creating, closing, restarting tabs\n // -------------------------------------------------------------------------\n\n const sizeHint = useCallback((): { cols: number; rows: number } => {\n for (const rec of views.current.values()) {\n if (rec.view.cols > 1 && rec.view.rows > 1) return { cols: rec.view.cols, rows: rec.view.rows };\n }\n return { cols: 80, rows: 24 };\n }, []);\n\n const createTab = useCallback(async (opts: { root?: string; appId?: string; via?: VerseTerminalLaunchVia; model?: string; devServerId?: string } = {}): Promise<VerseTerminalTab | null> => {\n setCreating(true);\n setNotice(null);\n try {\n const tab = await deps.api.create({\n sessionId,\n ...(opts.root ? { root: opts.root } : {}),\n ...(opts.appId ? { appId: opts.appId } : {}),\n // How the app launches (Ollama, a local model): only with an app — the server refuses them alone.\n ...(opts.appId && opts.via ? { via: opts.via } : {}),\n ...(opts.appId && opts.model ? { model: opts.model } : {}),\n ...(opts.devServerId ? { devServerId: opts.devServerId } : {}),\n ...sizeHint(),\n });\n if (!mounted.current) return tab;\n setList((prev) => (prev ? { ...prev, tabs: [...prev.tabs.filter((t) => t.id !== tab.id), tab] } : prev));\n setActiveId(tab.id);\n return tab;\n } catch (err) {\n if (mounted.current) setNotice({ tone: 'error', text: errorText(err, 'The terminal could not be opened.') });\n return null;\n } finally {\n if (mounted.current) setCreating(false);\n }\n }, [deps.api, sessionId, sizeHint]);\n\n const closeTab = useCallback(async (tab: VerseTerminalTab) => {\n try {\n await deps.api.kill(tab.id);\n } catch (err) {\n // Already gone on the server is as good as closed.\n if (!(err instanceof ApiError && err.status === 404)) {\n setNotice({ tone: 'error', text: errorText(err, 'The terminal could not be closed.') });\n return;\n }\n }\n const rec = views.current.get(tab.id);\n if (rec) {\n disposeRecord(rec);\n views.current.delete(tab.id);\n }\n setList((prev) => (prev ? { ...prev, tabs: prev.tabs.filter((t) => t.id !== tab.id) } : prev));\n if (activeId === tab.id) {\n const index = tabs.findIndex((t) => t.id === tab.id);\n const neighbour = tabs[index + 1] ?? tabs[index - 1] ?? null;\n setActiveId(neighbour?.id ?? null);\n }\n }, [activeId, deps.api, tabs]);\n\n const restartTab = useCallback(async (tab: VerseTerminalTab) => {\n const next = await createTab({ root: tab.root });\n if (next) await closeTab(tab);\n }, [closeTab, createTab]);\n\n // Another chat (the dock keeps this pane mounted across chats): its own\n // first look may open a shell again.\n const autoCreatedFor = useRef(sessionId);\n if (autoCreatedFor.current !== sessionId) {\n autoCreatedFor.current = sessionId;\n autoCreated.current = false;\n }\n\n // First look at an empty pane: open a shell in the chat's primary root.\n useEffect(() => {\n if (!list || !list.available || !shown || autoCreated.current || creating) return;\n if (request && request.nonce > lastHandledNonce) return; // the request decides\n autoCreated.current = true;\n if (tabs.length === 0) void createTab({});\n }, [list, shown, tabs.length, creating, createTab, request]);\n\n // -------------------------------------------------------------------------\n // Views (xterm) — one per tab, created when its panel mounts\n // -------------------------------------------------------------------------\n\n const attachView = useCallback(async (tabId: string, host: HTMLDivElement) => {\n if (views.current.has(tabId) || creatingViews.current.has(tabId)) return;\n creatingViews.current.add(tabId);\n try {\n const view = await deps.createView({ ...resolveTerminalFont(host), theme: resolveTerminalTheme(host), screenReaderMode: readScreenReaderPref() });\n if (!mounted.current || !hosts.current.has(tabId)) {\n view.dispose();\n return;\n }\n view.open(host);\n const queue = createInputQueue((b64) => deps.api.input(tabId, b64), {\n onError: (err) => {\n if (mounted.current) setNotice({ tone: 'error', text: errorText(err, 'That input did not reach the shell.') });\n },\n });\n const rec: ViewRecord = { view, host, lastSeq: 0, queue, disposers: [] };\n // Keystrokes into a shell that has exited go nowhere (the exit bar offers Restart).\n rec.disposers.push(view.onData((data) => { if (!exitedIds.current.has(tabId)) queue.pushText(data); }));\n rec.disposers.push(view.onBinary((data) => { if (!exitedIds.current.has(tabId)) queue.pushBinary(data); }));\n rec.disposers.push(view.onSelectionChange(() => {\n const selected = view.hasSelection();\n setHasSelection(selected);\n if (!selected) return;\n // Copy on select, once the drag settles.\n if (selectionTimer.current) clearTimeout(selectionTimer.current);\n selectionTimer.current = setTimeout(() => {\n const text = view.getSelection();\n if (!text) return;\n deps.writeClipboard(text).then(() => {\n if (!mounted.current) return;\n setCopied(true);\n if (copyTimer.current) clearTimeout(copyTimer.current);\n copyTimer.current = setTimeout(() => setCopied(false), 1_200);\n }, () => { /* clipboard refused (no user gesture): the selection still works with ⌘C */ });\n }, 150);\n }));\n view.setKeyFilter((event) => !keyPassesToPage(event, deps.platform));\n views.current.set(tabId, rec);\n setViewFailed(false);\n setReadyIds((prev) => new Set(prev).add(tabId));\n } catch (err) {\n console.error('[verse] terminal view failed to load', err);\n if (mounted.current) setViewFailed(true);\n } finally {\n creatingViews.current.delete(tabId);\n }\n }, [deps]);\n\n // One stable ref callback per tab: a fresh closure each render would make\n // React detach and re-attach the host on every render.\n const attachRef = useRef(attachView);\n attachRef.current = attachView;\n const hostRefs = useRef(new Map<string, (node: HTMLDivElement | null) => void>());\n const hostRef = (tabId: string) => {\n let ref = hostRefs.current.get(tabId);\n if (!ref) {\n ref = (node) => {\n if (node) {\n hosts.current.set(tabId, node);\n void attachRef.current(tabId, node);\n } else {\n hosts.current.delete(tabId);\n hostRefs.current.delete(tabId);\n }\n };\n hostRefs.current.set(tabId, ref);\n }\n return ref;\n };\n\n // Fit the visible view to its panel and tell the shell its size.\n const fitActive = useCallback(() => {\n if (!activeId) return;\n const rec = views.current.get(activeId);\n if (!rec) return;\n const before = { cols: rec.view.cols, rows: rec.view.rows };\n const size = rec.view.fit();\n if (!size || (size.cols === before.cols && size.rows === before.rows && active && active.cols === size.cols && active.rows === size.rows)) return;\n if (resizeTimer.current) clearTimeout(resizeTimer.current);\n const id = activeId;\n resizeTimer.current = setTimeout(() => {\n deps.api.resize(id, size.cols, size.rows).catch(() => { /* the next fit retries */ });\n }, 100);\n }, [active, activeId, deps.api]);\n\n useEffect(() => {\n if (!shown || !activeId || !readyIds.has(activeId)) return;\n fitActive();\n const body = bodyRef.current;\n if (!body || typeof ResizeObserver === 'undefined') return;\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(fitActive);\n });\n observer.observe(body);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [shown, activeId, readyIds, fitActive]);\n\n // Theme follows the app (explicit toggle or OS appearance).\n useEffect(() => watchThemeChanges(() => {\n for (const rec of views.current.values()) rec.view.setTheme(resolveTerminalTheme(rec.host));\n }), []);\n\n // -------------------------------------------------------------------------\n // The live stream (visible tab only)\n // -------------------------------------------------------------------------\n\n const applyPaste = useCallback((tabId: string) => {\n const pending = pendingPaste.current;\n if (!pending || pending.tabId !== tabId) return;\n const rec = views.current.get(tabId);\n if (!rec) return;\n pendingPaste.current = null;\n const text = pending.text.replace(/[\\r\\n]+$/, '');\n if (text.includes('\\n') && !rec.view.bracketedPaste()) {\n // Without bracketed paste a shell would RUN each line as it arrives.\n deps.writeClipboard(text).then(\n () => setNotice({ tone: 'info', text: 'That command has several lines, so it was copied instead: paste it with ⌘V.' }),\n () => setNotice({ tone: 'error', text: 'That command has several lines and could not be pasted safely.' }),\n );\n } else {\n rec.view.paste(text);\n }\n rec.view.focus();\n }, [deps]);\n\n useEffect(() => {\n if (!shown || !activeId || !readyIds.has(activeId)) {\n setStreamState(null);\n return;\n }\n const rec = views.current.get(activeId);\n if (!rec) return;\n const tabId = activeId;\n let firstOutput = true;\n const onFrame = (frame: VerseTerminalFrame) => {\n if (frame.type === 'output') {\n if (frame.seq <= rec.lastSeq) return;\n // A gap means the scrollback ring dropped frames this view never got:\n // start over from what the server still has rather than draw a torn screen.\n if (rec.lastSeq > 0 && frame.seq > rec.lastSeq + 1) rec.view.reset();\n rec.view.write(base64ToBytes(frame.dataBase64));\n rec.lastSeq = frame.seq;\n if (firstOutput) {\n firstOutput = false;\n if (pendingPaste.current?.tabId === tabId) setTimeout(() => applyPaste(tabId), 120);\n }\n return;\n }\n setList((prev) => {\n if (!prev) return prev;\n return {\n ...prev,\n tabs: prev.tabs.map((t) => {\n if (t.id !== tabId) return t;\n if (frame.type === 'title') return t.title === frame.title ? t : { ...t, title: frame.title };\n return { ...t, exited: { code: frame.code, signal: frame.signal, at: new Date().toISOString() } };\n }),\n };\n });\n };\n const stream = deps.openStream(tabId, () => rec.lastSeq, {\n onFrame,\n onState: (state) => {\n if (!mounted.current) return;\n setStreamState(state);\n if (state === 'gone') void refresh();\n },\n });\n // An existing tab that already has output can take a paste right away.\n if (pendingPaste.current?.tabId === tabId && rec.lastSeq > 0) setTimeout(() => applyPaste(tabId), 0);\n return () => stream.close();\n }, [shown, activeId, readyIds, deps, refresh, applyPaste]);\n\n // -------------------------------------------------------------------------\n // Requests from the dock\n // -------------------------------------------------------------------------\n\n const handleRequest = useCallback(async (req: TerminalRequest) => {\n const root = req.root ?? active?.root ?? roots[0];\n const wantsNew = req.newTab === true || Boolean(req.appId) || Boolean(req.devServerId);\n let target: VerseTerminalTab | null = null;\n if (!wantsNew) {\n target = (active && !active.exited && (!req.root || active.root === req.root) ? active : null)\n ?? tabs.find((t) => !t.exited && (!req.root || t.root === req.root)) ?? null;\n }\n if (target) {\n setActiveId(target.id);\n } else {\n target = await createTab({\n ...(root ? { root } : {}),\n ...(req.appId ? { appId: req.appId } : {}),\n ...(req.via ? { via: req.via } : {}),\n ...(req.model ? { model: req.model } : {}),\n ...(req.devServerId ? { devServerId: req.devServerId } : {}),\n });\n }\n if (!target) return;\n if (req.paste) {\n pendingPaste.current = { tabId: target.id, text: req.paste };\n const rec = views.current.get(target.id);\n if (rec && rec.lastSeq > 0) applyPaste(target.id);\n } else {\n views.current.get(target.id)?.view.focus();\n }\n }, [active, applyPaste, createTab, roots, tabs]);\n\n useEffect(() => {\n if (!request || !list || request.nonce <= lastHandledNonce) return;\n lastHandledNonce = request.nonce;\n autoCreated.current = true;\n if (!list.available) return;\n void handleRequest(request);\n }, [request, list, handleRequest]);\n\n // Focus the terminal when its tab becomes the visible one.\n useEffect(() => {\n if (!shown || !activeId || !readyIds.has(activeId)) return;\n views.current.get(activeId)?.view.focus();\n }, [shown, activeId, readyIds]);\n\n // -------------------------------------------------------------------------\n // Header actions\n // -------------------------------------------------------------------------\n\n const sendSelection = () => {\n if (!activeId) return;\n const text = views.current.get(activeId)?.view.getSelection() ?? '';\n if (!text.trim()) return;\n onSendToChat(fenceSelection(text));\n };\n\n const toggleScreenReader = () => {\n const next = !screenReader;\n setScreenReader(next);\n writeScreenReaderPref(next);\n for (const rec of views.current.values()) rec.view.setScreenReaderMode(next);\n };\n\n const openExternal = async () => {\n try {\n await deps.api.openExternal(sessionId, active?.root ?? roots[0]);\n setNotice({ tone: 'info', text: 'Opened in Terminal.' });\n } catch (err) {\n setNotice({ tone: 'error', text: errorText(err, 'Terminal could not be opened.') });\n }\n };\n\n const openByClick = (opts: { root?: string }) => {\n manualOpen.current = true;\n void createTab(opts).finally(() => { manualOpen.current = false; });\n };\n\n const onNewTabClick = () => {\n openByClick(active?.root ? { root: active.root } : {});\n };\n\n // Tabs: ←/→ move and activate, Home/End jump (WAI-ARIA tabs, automatic activation).\n const onTabKeyDown = (event: ReactKeyboardEvent<HTMLButtonElement>, index: number) => {\n let next = -1;\n if (event.key === 'ArrowRight') next = (index + 1) % tabs.length;\n else if (event.key === 'ArrowLeft') next = (index - 1 + tabs.length) % tabs.length;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = tabs.length - 1;\n if (next < 0) return;\n event.preventDefault();\n const tab = tabs[next]!;\n setActiveId(tab.id);\n tabRefs.current.get(tab.id)?.focus();\n };\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n if (!list) {\n if (loadError) {\n return (\n <div className={styles.pane}>\n <EmptyState compact tone=\"error\" title=\"Terminal is not reachable\" body={loadError}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={() => void refresh()}>Try again</Button>} />\n </div>\n );\n }\n return (\n <div className={styles.pane} aria-busy=\"true\">\n {/* The strip's row is held from the first frame so the chrome does not drop in under the dock's tabs. */}\n <div className={styles.strip} aria-hidden=\"true\" />\n <div className={styles.loading}>\n <SkeletonLine width=\"40%\" />\n <SkeletonLine width=\"70%\" />\n </div>\n </div>\n );\n }\n\n if (!list.available) {\n return (\n <div className={styles.pane}>\n <EmptyState\n compact\n icon={<TerminalGlyph size={20} />}\n title=\"Terminal needs the desktop app\"\n body=\"This Verse server has no built-in terminal. Open the project in Terminal instead, or use the Ashlr desktop app.\"\n action={deps.platform === 'mac' ? (\n <Button size=\"sm\" variant=\"subtle\" icon={<IconExternalLink />} onClick={() => void openExternal()}>Open in Terminal</Button>\n ) : undefined}\n />\n {notice ? <p className={styles.inlineNotice} role={notice.tone === 'error' ? 'alert' : 'status'}>{notice.text}</p> : null}\n </div>\n );\n }\n\n const canChooseRoot = roots.length > 1;\n const newTabChord = findCommand('dock.terminal-new')?.keys[0];\n const newTabKey = newTabChord ? formatChord(newTabChord, deps.platform) : null;\n // Before a chat's first shell is open — the automatic one on first sight,\n // or one a dock request asked for — the pane shows it opening instead of\n // flashing \"No terminal open\" for the moment the request takes.\n const opening = tabs.length === 0 && !viewFailed && (!autoCreated.current || (creating && !manualOpen.current));\n // The folder the header names: the visible tab's (or, for the render before\n // the active tab is chosen, the one that will be), or while the first shell\n // opens the chat's primary folder, where it opens — so the row does not\n // appear, or change, when the tab lands.\n const headerRoot = active?.root ?? tabs.at(-1)?.root ?? (opening ? roots[0] ?? null : null);\n\n return (\n <div className={styles.pane} data-compact={compact || undefined}>\n <div className={styles.strip}>\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Terminals\">\n {tabs.map((tab, index) => {\n const selected = tab.id === activeId;\n const unseen = !selected && (seen.get(tab.id) ?? tab.createdAt) < tab.lastActivityAt;\n return (\n <div key={tab.id} className={styles.tab} data-selected={selected || undefined} role=\"presentation\">\n <button\n ref={(node) => { if (node) tabRefs.current.set(tab.id, node); else tabRefs.current.delete(tab.id); }}\n type=\"button\"\n role=\"tab\"\n id={`terminal-tab-${tab.id}`}\n aria-selected={selected}\n aria-controls={`terminal-panel-${tab.id}`}\n tabIndex={selected ? 0 : -1}\n className={styles.tabButton}\n title={`${tab.title} — ${tab.root}`}\n onClick={() => setActiveId(tab.id)}\n onKeyDown={(event) => onTabKeyDown(event, index)}\n >\n <span className={styles.tabTitle}>{tab.title}</span>\n {tab.exited ? <span className={styles.tabExited}>exited</span> : null}\n {unseen && !tab.exited ? <span className={styles.unseen} aria-label=\"new output\" role=\"img\" /> : null}\n </button>\n <button type=\"button\" className={styles.tabClose} aria-label={`Close terminal ${tab.title}`}\n title=\"Close terminal\" onClick={() => void closeTab(tab)}>\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <div className={styles.stripActions}>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconPlus />} aria-label=\"New terminal tab\"\n title={newTabKey ? `New terminal tab (${newTabKey})` : 'New terminal tab'}\n busy={creating} onClick={onNewTabClick} />\n {canChooseRoot ? (\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ChevronDownGlyph />} aria-label=\"New terminal in…\" aria-haspopup=\"menu\"\n aria-expanded={rootMenu !== null} title=\"Choose the folder\"\n onClick={(event) => setRootMenu({ anchor: anchorBelow(event.currentTarget), from: event.currentTarget })} />\n ) : null}\n </div>\n </div>\n\n {headerRoot !== null ? (\n <div className={`${chrome.header} ${styles.header}`}>\n {/* The folder's NAME; the full path (a home or temp path) is the tooltip. */}\n <span className={`${chrome.title} ${styles.cwd}`} title={headerRoot}>{projectName(headerRoot)}</span>\n <span className={styles.headerStatus} role=\"status\" aria-live=\"polite\">\n {streamState === 'reconnecting' ? 'Reconnecting…' : streamState === 'expired' ? 'Session expired — reload to reconnect' : copied ? 'Copied' : ''}\n </span>\n <div className={chrome.actions}>\n <Button variant=\"ghost\" size=\"sm\" icon={<IconSend />} disabled={!hasSelection} aria-label=\"Send selection to chat\"\n title={hasSelection ? 'Send the selected text to the chat as a code block' : 'Select text in the terminal first'}\n onClick={sendSelection}>\n {compact ? null : 'Send to chat'}\n </Button>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ScreenReaderGlyph />} aria-label=\"Screen reader mode\" aria-pressed={screenReader}\n title={screenReader ? 'Screen reader mode is on' : 'Screen reader mode'} onClick={toggleScreenReader} />\n {deps.platform === 'mac' ? (\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconExternalLink />} aria-label=\"Open in Terminal.app\"\n title=\"Open this folder in Terminal.app\" onClick={() => void openExternal()} />\n ) : null}\n </div>\n </div>\n ) : null}\n\n {notice ? (\n <div className={styles.notice} data-tone={notice.tone} role={notice.tone === 'error' ? 'alert' : 'status'}>\n <span>{notice.text}</span>\n <button type=\"button\" className={styles.noticeClose} aria-label=\"Dismiss\" title=\"Dismiss\" onClick={() => setNotice(null)}>\n <IconX size={12} />\n </button>\n </div>\n ) : null}\n\n <div className={styles.body} ref={bodyRef}>\n {viewFailed ? (\n <EmptyState compact tone=\"error\" title=\"The terminal could not load\" body=\"The rest of the chat still works.\"\n action={<Button size=\"sm\" variant=\"subtle\" onClick={() => {\n setViewFailed(false);\n for (const [id, host] of hosts.current) void attachView(id, host);\n }}>Try again</Button>} />\n ) : null}\n {opening ? (\n <div className={styles.loading} role=\"status\" aria-label=\"Opening a shell\">\n <SkeletonLine width=\"30%\" />\n </div>\n ) : null}\n {tabs.length === 0 && !viewFailed && !opening ? (\n <EmptyState compact icon={<TerminalGlyph size={20} />} title=\"No terminal open\"\n body={`Click New terminal${newTabKey ? ` or press ${newTabKey}` : ''} to open a login shell in this chat's folder.${otherChats > 0 ? ` ${otherChats} ${otherChats === 1 ? 'terminal is' : 'terminals are'} open in other chats.` : ''}`}\n action={<Button size=\"sm\" variant=\"subtle\" icon={<IconPlus />} busy={creating} onClick={onNewTabClick}>New terminal</Button>} />\n ) : null}\n {tabs.map((tab) => {\n const selected = tab.id === activeId;\n return (\n <div\n key={tab.id}\n id={`terminal-panel-${tab.id}`}\n role=\"tabpanel\"\n aria-labelledby={`terminal-tab-${tab.id}`}\n className={styles.panel}\n hidden={!selected}\n >\n <div className={styles.viewport}>\n <div className={styles.host} ref={hostRef(tab.id)} data-testid={`terminal-host-${tab.id}`} />\n {!readyIds.has(tab.id) && !viewFailed ? (\n <div className={styles.viewLoading} aria-hidden=\"true\"><SkeletonLine width=\"30%\" /></div>\n ) : null}\n </div>\n {tab.exited ? (\n <div className={styles.exitBar} role=\"status\">\n <span>\n {tab.exited.signal && tab.exited.code === null\n ? `Shell ended (${tab.exited.signal}).`\n : `Shell exited${tab.exited.code === null ? '' : ` with code ${tab.exited.code}`}.`}\n </span>\n <Button size=\"sm\" variant=\"subtle\" onClick={() => void restartTab(tab)}>Restart</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => void closeTab(tab)}>Close</Button>\n </div>\n ) : null}\n </div>\n );\n })}\n </div>\n\n {rootMenu ? (\n <ActionMenu\n label=\"New terminal in\"\n anchor={rootMenu.anchor}\n returnFocus={rootMenu.from}\n onClose={() => setRootMenu(null)}\n items={roots.map((root) => ({\n id: root,\n label: projectName(root),\n description: root,\n onSelect: () => { openByClick({ root }); },\n }))}\n />\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";var r=e(n(),1),i={thinking:`_thinking_lm3ty_11`,summary:`_summary_lm3ty_18`,line:`_line_lm3ty_19`,chevron:`_chevron_lm3ty_40`,glyph:`_glyph_lm3ty_55`,"thinking-breathe":`_thinking-breathe_lm3ty_1`,label:`_label_lm3ty_64`,kind:`_kind_lm3ty_73`,hidden:`_hidden_lm3ty_74`,body:`_body_lm3ty_85`},a=t();function o(e){let t=Math.max(0,Math.round(e));return t<1e3?`~${t} tok`:t<1e4?`~${(t/1e3).toFixed(1).replace(/\.0$/,``)}k tok`:t<1e6?`~${Math.round(t/1e3)}k tok`:`~${(t/1e6).toFixed(1).replace(/\.0$/,``)}M tok`}function s(e){if(!Number.isFinite(e)||e<0)return``;if(e<1e3)return`<1s`;let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m ${t%60}s`:`${Math.floor(n/60)}h ${n%60}m`}var c=4;function l(e,t){if(typeof t==`number`&&Number.isFinite(t)&&t>0)return t;let n=e.trim().length;return n>0?Math.ceil(n/c):null}function u(e){let t=[e.streaming?`Thinking`:`Thought`],n=e.elapsedMs===null?``:s(e.elapsedMs);return e.streaming?n&&t.push(n):n&&(t[0]=`Thought ${n}`),e.tokens!==null&&t.push(o(e.tokens)),t.join(` · `)}function d(e){let[t,n]=(0,r.useState)(()=>Date.now());return(0,r.useEffect)(()=>{if(!e)return;n(Date.now());let t=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(t)},[e]),t}var f=24,p=(0,r.memo)(function({text:e,streaming:t=!1,startedAt:n=null,redacted:o=!1,durationMs:s=null,estimatedTokens:c=null,kind:p=null,defaultOpen:m=!1,stateKey:h}){let[g,_]=(0,r.useState)(m),v=(0,r.useRef)(!1),[y,b]=(0,r.useState)(!1),x=(0,r.useRef)(null),S=(0,r.useRef)(!0),C=d(t&&n!==null),w=u({streaming:t,elapsedMs:t?n===null?null:Math.max(0,C-n):s,tokens:l(e,c)}),T=e.trim().length>0,E=t&&g&&!y;(0,r.useLayoutEffect)(()=>{let e=x.current;e&&(E&&e.scrollHeight>e.clientHeight+1?e.setAttribute(`data-clipped`,``):e.removeAttribute(`data-clipped`),t&&(S.current||E)&&(e.scrollTop=e.scrollHeight))},[e,t,g,E]);function D(){let e=x.current;e&&(S.current=e.scrollHeight-e.scrollTop-e.clientHeight<=f)}(0,r.useEffect)(()=>{v.current||_(m)},[m]);function O(e){E&&(e.preventDefault(),v.current=!0,b(!0))}function k(e){let t=e.currentTarget.open;t!==g&&(v.current=!0),_(t)}return T?(0,a.jsxs)(`details`,{className:i.thinking,open:g,onToggle:k,"data-state-key":h,"data-streaming":t||void 0,"data-thinking-kind":p??void 0,children:[(0,a.jsxs)(`summary`,{className:i.summary,onClick:O,"aria-label":E?`${w} — show all`:void 0,children:[(0,a.jsx)(`span`,{className:i.chevron,"aria-hidden":`true`}),t?(0,a.jsx)(`span`,{className:i.glyph,"aria-hidden":`true`}):null,(0,a.jsx)(`span`,{className:i.label,children:w}),p===`summary`?(0,a.jsx)(`span`,{className:i.kind,title:`A summary the provider wrote of the model's reasoning, not its raw chain of thought.`,children:`summary`}):null]}),(0,a.jsx)(`div`,{ref:x,className:i.body,onScroll:D,"data-window":E||void 0,onClick:E?()=>{v.current=!0,b(!0)}:void 0,children:e})]}):(0,a.jsx)(`div`,{className:i.thinking,"data-streaming":t||void 0,"data-redacted":o||void 0,"data-thinking-kind":p??void 0,children:(0,a.jsxs)(`span`,{className:i.line,children:[t?(0,a.jsx)(`span`,{className:i.glyph,"aria-hidden":`true`}):null,(0,a.jsx)(`span`,{className:i.label,children:w}),o?(0,a.jsx)(`span`,{className:i.hidden,title:`The provider returned this reasoning without its text; only how long it took is known.`,children:`reasoning hidden by the provider`}):null]})})});export{s as n,o as r,p as t};
|
|
2
|
-
//# sourceMappingURL=ThinkingBlock-CHRZX_fJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ThinkingBlock-CHRZX_fJ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/ThinkingBlock.module.css","../../../../../../src/web-ui/routes/verse/chat/ThinkingBlock.tsx"],"sourcesContent":["/**\n * Reasoning reads as a quieter voice beside the answer: tertiary text, a\n * 2px rule, no box (DESIGN §5 — role is weight and rule, never a card).\n * While it streams a dot breathes in the running colour; the label's\n * figures are tabular so a ticking clock does not jitter the line.\n *\n * The row keeps the tool rows' left geometry (a 2px rule slot and --space-3)\n * so its ▸ sits exactly under theirs; the slot is transparent — reasoning has\n * no rule of its own until it is open.\n */\n.thinking {\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n min-width: 0;\n}\n\n.summary,\n.line {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-xs);\n max-width: 100%;\n padding-left: var(--space-3);\n border-left: 2px solid transparent;\n}\n/* No ▸ on a line with nothing to open: its label starts where theirs do. */\n.line { padding-left: calc(var(--space-3) + 10px + var(--space-2)); }\n.summary {\n cursor: pointer;\n list-style: none;\n border-radius: var(--radius-xs);\n padding-right: var(--space-2);\n transition: color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);\n}\n.summary::-webkit-details-marker { display: none; }\n.summary:hover { color: var(--text-secondary); background: var(--bg-hover); }\n\n/* The shared disclosure glyph (Transcript .toolGlyph, ActivityGroup .chevron). */\n.chevron {\n flex: none;\n width: 0;\n height: 0;\n margin: 0 3px 0 2px;\n border-top: 4px solid transparent;\n border-bottom: 4px solid transparent;\n border-left: 5px solid currentColor;\n opacity: 0.7;\n transition: transform var(--duration-fast) var(--ease-standard);\n}\n.thinking[open] .chevron { transform: rotate(90deg); }\n\n/* Only while streaming: the running colour, breathing. */\n.glyph {\n width: 6px;\n height: 6px;\n flex: none;\n border-radius: var(--radius-full);\n background: var(--status-running-solid);\n animation: thinking-breathe 1.6s var(--ease-standard) infinite;\n}\n\n.label {\n font-family: var(--font-display);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n\n.kind,\n.hidden {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n white-space: nowrap;\n}\n.kind {\n padding: 0 var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n}\n\n.body {\n margin-top: var(--space-2);\n padding-left: var(--space-4);\n border-left: 2px solid var(--border-subtle);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n line-height: var(--text-sm-line-relaxed);\n color: var(--text-secondary);\n /* A long chain of thought scrolls inside itself instead of pushing the\n answer a screen away. */\n max-height: min(40vh, 480px);\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n.thinking[data-streaming] .body { border-left-color: var(--status-running-solid); }\n\n/* 3.10: the streaming window — exactly three lines of the tail, the top\n line fading so it reads as \"there is more above\", no scrollbar. */\n.body[data-window] {\n max-height: calc(3 * var(--text-sm-line-relaxed));\n overflow: hidden;\n cursor: pointer;\n}\n.body[data-window][data-clipped] {\n -webkit-mask-image: linear-gradient(to bottom, transparent 0, black 1.2em);\n mask-image: linear-gradient(to bottom, transparent 0, black 1.2em);\n}\n\n@keyframes thinking-breathe { 50% { opacity: 0.35; } }\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .glyph { animation: none; }\n :root:not([data-motion=\"full\"]) .chevron { transition: none; }\n}\n:root[data-motion=\"reduce\"] .glyph { animation: none; }\n:root[data-motion=\"reduce\"] .chevron { transition: none; }\n","/**\n * routes/verse/chat/ThinkingBlock.tsx — one block of model reasoning (V3.10).\n *\n * Before 3.10 reasoning arrived only when a block closed, behind a static\n * \"Thinking\" disclosure, usually two collapses deep inside a tool group — and\n * for Claude Opus it was almost always EMPTY (the CLI omitted the text), so\n * nothing showed at all. Now the adapters stream vendor summaries\n * (`thinking-delta`), and this block:\n *\n * - streams them while the model thinks, open, with a live\n * \"Thinking · 12s · ~1.8k tok\" line;\n * - settles to a collapsed \"Thought 12s · ~1.8k tok\" once the block ends,\n * the operator's own open/closed choice winning over the default;\n * - says honestly when the provider withheld the text (a redacted,\n * signature-only block): the duration is real, the words are not shown,\n * and there is nothing to expand.\n *\n * 3.10 (SPEC-310C §2, unit C2): while it streams, the body is a THREE-LINE\n * window that follows the tail — enough to see what the model is working\n * on, not so much that a long think shoves the answer off screen. Clicking\n * the label (or the window) shows the whole stream. Once the block ends it\n * folds to \"Thought 12s · ~1.8k tok ▸\" — or stays open when Settings ▸ Chat\n * says Expanded (chat/reasoning-pref.ts; Hidden is handled by the\n * transcript, which then renders no reasoning at all).\n *\n * Honesty rule: an unknown duration or token count is omitted, never shown\n * as 0. A token count the CLI did not report is estimated from the text\n * (~4 characters per token) and always carries the \"~\".\n *\n * 3.10.1: the row opens with the same ▸ every foldable transcript row uses\n * (tool cards, activity groups), at the same x; the breathing dot appears\n * only while the block streams — a settled block has no stray bullet.\n */\nimport { memo, useEffect, useLayoutEffect, useRef, useState, type MouseEvent, type SyntheticEvent } from 'react';\nimport type { VerseThinkingKind } from '../../../../core/verse/types.js';\nimport styles from './ThinkingBlock.module.css';\n\nexport interface ThinkingBlockProps {\n text: string;\n /** Still streaming: the label counts up and the body follows new text. */\n streaming?: boolean;\n /** Client clock (ms) the block started — the live label's origin while streaming. */\n startedAt?: number | null;\n /** The provider sent the block without its text. */\n redacted?: boolean;\n durationMs?: number | null;\n /** The CLI's own estimate; null → estimated from the text when there is any. */\n estimatedTokens?: number | null;\n kind?: VerseThinkingKind | null;\n /** Initial open state; the operator's toggle wins afterwards. */\n defaultOpen?: boolean;\n /** Survives scroll restore (useScrollRestore) like every other disclosure. */\n stateKey?: string;\n}\n\n/** \"~1.8k tok\" — one decimal under 10k, so the figure moves visibly while it streams. */\nexport function formatThinkingTokens(n: number): string {\n const rounded = Math.max(0, Math.round(n));\n if (rounded < 1000) return `~${rounded} tok`;\n if (rounded < 10_000) return `~${(rounded / 1000).toFixed(1).replace(/\\.0$/, '')}k tok`;\n if (rounded < 1_000_000) return `~${Math.round(rounded / 1000)}k tok`;\n return `~${(rounded / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M tok`;\n}\n\n/** \"12s\" / \"1m 5s\" / \"<1s\". */\nexport function formatThinkingDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return '';\n if (ms < 1000) return '<1s';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${s % 60}s`;\n return `${Math.floor(m / 60)}h ${m % 60}m`;\n}\n\n/** Characters per token for the fallback estimate (the common English ratio). */\nconst CHARS_PER_TOKEN = 4;\n\nexport function thinkingTokenFigure(text: string, estimatedTokens: number | null | undefined): number | null {\n if (typeof estimatedTokens === 'number' && Number.isFinite(estimatedTokens) && estimatedTokens > 0) return estimatedTokens;\n const chars = text.trim().length;\n return chars > 0 ? Math.ceil(chars / CHARS_PER_TOKEN) : null;\n}\n\n/** The one-line label — exported so the transcript search and tests agree with the UI. */\nexport function thinkingLabel(opts: {\n streaming: boolean;\n elapsedMs: number | null;\n tokens: number | null;\n}): string {\n const parts = [opts.streaming ? 'Thinking' : 'Thought'];\n const duration = opts.elapsedMs === null ? '' : formatThinkingDuration(opts.elapsedMs);\n if (opts.streaming) {\n if (duration) parts.push(duration);\n } else if (duration) {\n parts[0] = `Thought ${duration}`;\n }\n if (opts.tokens !== null) parts.push(formatThinkingTokens(opts.tokens));\n return parts.join(' · ');\n}\n\n/** Re-render once a second while `active` — the label's clock, not a network poll. */\nfunction useSecondTick(active: boolean): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!active) return undefined;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [active]);\n return now;\n}\n\n/** How close to the bottom the body must be for new text to keep it pinned there. */\nconst FOLLOW_PX = 24;\n\nexport const ThinkingBlock = memo(function ThinkingBlock({\n text,\n streaming = false,\n startedAt = null,\n redacted = false,\n durationMs = null,\n estimatedTokens = null,\n kind = null,\n defaultOpen = false,\n stateKey,\n}: ThinkingBlockProps) {\n const [open, setOpen] = useState(defaultOpen);\n /** The operator opened or closed it by hand; from then on their choice wins over `defaultOpen`. */\n const chosen = useRef(false);\n /** The operator asked for the whole stream instead of the three-line window. */\n const [full, setFull] = useState(false);\n const body = useRef<HTMLDivElement>(null);\n const following = useRef(true);\n const now = useSecondTick(streaming && startedAt !== null);\n\n const elapsed = streaming\n ? (startedAt !== null ? Math.max(0, now - startedAt) : null)\n : durationMs;\n const tokens = thinkingTokenFigure(text, estimatedTokens);\n const label = thinkingLabel({ streaming, elapsedMs: elapsed, tokens });\n const hasText = text.trim().length > 0;\n\n // Follow the stream inside the body unless the operator scrolled up in it.\n const windowed = streaming && open && !full;\n useLayoutEffect(() => {\n const node = body.current;\n if (!node) return;\n // Fade the top line only when something is actually cut off above it.\n if (windowed && node.scrollHeight > node.clientHeight + 1) node.setAttribute('data-clipped', '');\n else node.removeAttribute('data-clipped');\n if (!streaming || (!following.current && !windowed)) return;\n node.scrollTop = node.scrollHeight;\n }, [text, streaming, open, windowed]);\n\n function onScroll() {\n const node = body.current;\n if (!node) return;\n following.current = node.scrollHeight - node.scrollTop - node.clientHeight <= FOLLOW_PX;\n }\n\n // Open while its turn runs, folded once it finishes — unless the operator\n // already decided for this block.\n useEffect(() => {\n if (!chosen.current) setOpen(defaultOpen);\n }, [defaultOpen]);\n\n // While windowed, the first click on the label means \"show me all of it\",\n // not \"hide it\": folding the one thing the operator is trying to read\n // would be the opposite of the gesture.\n function onSummaryClick(event: MouseEvent<HTMLElement>) {\n if (!windowed) return;\n event.preventDefault();\n chosen.current = true;\n setFull(true);\n }\n\n function onToggle(event: SyntheticEvent<HTMLDetailsElement>) {\n const next = event.currentTarget.open;\n // A toggle event also follows OUR prop change; only a mismatch is a click.\n if (next !== open) chosen.current = true;\n setOpen(next);\n }\n\n if (!hasText) {\n // Nothing to expand: a redacted block, or the CLI's token count before\n // any summary text arrived. One quiet line that still says it happened.\n return (\n <div className={styles.thinking} data-streaming={streaming || undefined} data-redacted={redacted || undefined}\n data-thinking-kind={kind ?? undefined}>\n <span className={styles.line}>\n {streaming ? <span className={styles.glyph} aria-hidden=\"true\" /> : null}\n <span className={styles.label}>{label}</span>\n {redacted ? (\n <span className={styles.hidden} title=\"The provider returned this reasoning without its text; only how long it took is known.\">\n reasoning hidden by the provider\n </span>\n ) : null}\n </span>\n </div>\n );\n }\n\n return (\n <details className={styles.thinking} open={open} onToggle={onToggle} data-state-key={stateKey}\n data-streaming={streaming || undefined} data-thinking-kind={kind ?? undefined}>\n <summary className={styles.summary} onClick={onSummaryClick} aria-label={windowed ? `${label} — show all` : undefined}>\n <span className={styles.chevron} aria-hidden=\"true\" />\n {streaming ? <span className={styles.glyph} aria-hidden=\"true\" /> : null}\n <span className={styles.label}>{label}</span>\n {kind === 'summary' ? <span className={styles.kind} title=\"A summary the provider wrote of the model's reasoning, not its raw chain of thought.\">summary</span> : null}\n </summary>\n <div ref={body} className={styles.body} onScroll={onScroll} data-window={windowed || undefined}\n onClick={windowed ? () => { chosen.current = true; setFull(true); } : undefined}>{text}</div>\n </details>\n );\n});\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{B as r,E as i,G as a,b as o,f as s,i as c,l,s as u,u as d}from"./global-BJ_kVFpD.js";import{n as f,t as p}from"./UniverseView-ZXAOJ0Rq.js";import{t as m}from"./SkipToContent-BjJE6yOo.js";import{SessionGate as h}from"./SessionGate-Bab2qO29.js";var g=e(n(),1),_=Object.freeze({"campaign-execution":Object.freeze([`campaign-call-threw`]),"campaign-verification":Object.freeze([`campaign-evidence-changed`]),"delivery-execution":Object.freeze([`delivery-call-threw`]),"delivery-verification":Object.freeze([`delivery-evidence-changed`,`delivery-receipt-unverified`]),"settlement-publication":Object.freeze([`settlement-write-failed`])});function v(e){return typeof e==`string`&&/^[a-z0-9][a-z0-9_-]{0,63}$/.test(e)}function y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function b(e){return typeof e==`string`&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString()===(e.length===20?e.replace(`Z`,`.000Z`):e)}function x(e){return typeof e==`string`&&/^[a-z0-9][a-z0-9_:-]{0,191}$/.test(e)}function S(e,t){let n=()=>Error(`Controller evidence could not be validated.`);if(!v(t)||!y(e)||e.schemaVersion!==1||e.controllerId!==t||typeof e.sourceState!=`string`||![`healthy`,`missing`,`degraded`].includes(e.sourceState)||typeof e.status!=`string`||![`completed`,`incomplete`,`cancelled`,`timed-out`,`unavailable`,`draining`,`drained`].includes(e.status)||!(e.createdAt===null||b(e.createdAt))||!(e.deadlineAt===null||b(e.deadlineAt))||!b(e.observedAt)||!Array.isArray(e.reasons)||e.reasons.length>128||!e.reasons.every(x)||!Array.isArray(e.outcomes)||e.outcomes.length>64)throw n();let r=new Set,i=e.outcomes.map(e=>{if(!y(e)||typeof e.campaignId!=`string`||!v(e.campaignId)||r.has(e.campaignId)||typeof e.state!=`string`||![`pending`,`in-flight`,`completed`,`held`].includes(e.state)||typeof e.attempted!=`boolean`||!x(e.reasonCode))throw n();return r.add(e.campaignId),{campaignId:e.campaignId,state:e.state,attempted:e.attempted,reasonCode:e.reasonCode}}),a;if(e.topology!==void 0){if(!Array.isArray(e.topology)||e.topology.length>64||e.topology.length!==i.length)throw n();let t=new Set;a=e.topology.map(e=>{if(!y(e)||!v(e.campaignId)||!r.has(e.campaignId)||t.has(e.campaignId))throw n();t.add(e.campaignId);let i=t=>{if(!Array.isArray(t)||t.length>63||!t.every(t=>v(t)&&r.has(t)&&t!==e.campaignId)||new Set(t).size!==t.length)throw n();return[...t]},a=i(e.dependsOn),o=i(e.prerequisites);if(a.some(e=>!o.includes(e)))throw n();return{campaignId:e.campaignId,dependsOn:a,prerequisites:o}});let o=new Map(a.map(e=>[e.campaignId,e])),s=new Set;for(;s.size<a.length;){let e=a.find(e=>!s.has(e.campaignId)&&e.prerequisites.every(e=>s.has(e)));if(!e)throw n();s.add(e.campaignId)}for(let e of a){let t=new Set,r=[...e.dependsOn];for(;r.length;){let e=r.pop();t.has(e)||(t.add(e),r.push(...o.get(e).dependsOn))}if(e.prerequisites.some(e=>!t.has(e)))throw n()}}let o,s;if(e.diagnostics!==void 0){if(!Array.isArray(e.diagnostics)||e.diagnostics.length>i.length)throw n();let t=new Set;s=e.diagnostics.map(e=>{if(!y(e)||!v(e.campaignId)||!r.has(e.campaignId)||t.has(e.campaignId)||i.find(t=>t.campaignId===e.campaignId)?.state===`pending`||typeof e.phase!=`string`||!Object.hasOwn(_,e.phase)||typeof e.code!=`string`||!b(e.at))throw n();let a=e.phase;if(!_[a].includes(e.code))throw n();return t.add(e.campaignId),{campaignId:e.campaignId,phase:a,code:e.code,at:e.at}})}if(e.control!==void 0){let t=e.control;if(!y(t)||typeof t.mode!=`string`||![`open`,`drain`].includes(t.mode)||!Number.isInteger(t.sequence)||t.sequence<1||t.sequence>511||!b(t.requestedAt)||!(t.acknowledgedAt===null||b(t.acknowledgedAt)))throw n();o={mode:t.mode,sequence:t.sequence,requestedAt:t.requestedAt,acknowledgedAt:t.acknowledgedAt}}if(o?.mode===`open`&&o.acknowledgedAt!==null||e.status===`draining`&&(o?.mode!==`drain`||o.acknowledgedAt!==null)||e.status===`drained`&&(o?.mode!==`drain`||o.acknowledgedAt===null))throw n();return{schemaVersion:1,controllerId:t,sourceState:e.sourceState,status:e.status,createdAt:e.createdAt,deadlineAt:e.deadlineAt,observedAt:e.observedAt,reasons:[...e.reasons],outcomes:i,...a?{topology:a}:{},...o?{control:o}:{},...s?{diagnostics:s}:{}}}async function C(e,t){if(!v(e))throw Error(`Enter a valid controller ID.`);return S(await c(`/api/universe/controller-status?controllerId=${encodeURIComponent(e)}`,t),e)}function w(e,t,n){let r=t.trim().toLowerCase();return e.filter(e=>(n===`all`||e.state===n)&&(e.campaignId.toLowerCase().includes(r)||e.reasonCode.toLowerCase().includes(r)))}function T(e,t,n){let r=Number.isFinite(n)?Math.max(0,Math.floor(n)):0;if(t===null)return e.slice(0,r);let i=[],a=[];for(let n of e)(n.from===t||n.to===t?i:a).push(n);return[...i,...a].slice(0,r)}var E={topology:`_topology_1rqbo_1`,header:`_header_1rqbo_2`,snapshot:`_snapshot_1rqbo_5`,counts:`_counts_1rqbo_6`,finder:`_finder_1rqbo_10`,finderControls:`_finderControls_1rqbo_11`,searchLabel:`_searchLabel_1rqbo_13`,utilityButton:`_utilityButton_1rqbo_16`,finderMeta:`_finderMeta_1rqbo_19`,results:`_results_1rqbo_22`,result:`_result_1rqbo_22`,resultName:`_resultName_1rqbo_27`,resultState:`_resultState_1rqbo_28`,resultReason:`_resultReason_1rqbo_32`,pagination:`_pagination_1rqbo_33`,noResults:`_noResults_1rqbo_35`,selectionNote:`_selectionNote_1rqbo_36`,workspace:`_workspace_1rqbo_37`,board:`_board_1rqbo_38`,canvas:`_canvas_1rqbo_39`,edges:`_edges_1rqbo_40`,edge:`_edge_1rqbo_40`,selectedEdge:`_selectedEdge_1rqbo_41`,column:`_column_1rqbo_43`,node:`_node_1rqbo_44`,nodeName:`_nodeName_1rqbo_47`,nodeState:`_nodeState_1rqbo_48`,detail:`_detail_1rqbo_52`,detailState:`_detailState_1rqbo_55`,facts:`_facts_1rqbo_59`,relationships:`_relationships_1rqbo_63`,note:`_note_1rqbo_67`,legend:`_legend_1rqbo_67`,empty:`_empty_1rqbo_67`,notice:`_notice_1rqbo_69`,srOnly:`_srOnly_1rqbo_73`},D=t(),O=64,k=256,A=8,j={pending:`Pending`,"in-flight":`Unresolved intent`,completed:`Completed`,held:`Held`},M={pending:`No settled outcome is recorded. Pending does not mean ready to run.`,"in-flight":`A durable dispatch intent remains unresolved. This is not proof of a live worker.`,completed:`The controller recorded completion, including any required local delivery. This is not a production deployment claim.`,held:`Work remains held for the recorded reason. This view does not retry or release it.`};function N(e){let t=e.outcomes.slice(0,O),n=new Map(e.topology?.map(e=>[e.campaignId,e])),r=new Set(t.map(e=>e.campaignId)),i=new Map;if(e.topology)for(let e=0;e<t.length;e++)for(let e of t){let t=n.get(e.campaignId);i.has(e.campaignId)||!t||t.dependsOn.some(e=>!i.has(e))||i.set(e.campaignId,t.dependsOn.length?Math.max(...t.dependsOn.map(e=>i.get(e)))+1:0)}let a=[...new Set(i.values())].sort((e,t)=>e-t).map(e=>({label:`Dependency layer ${e+1}`,nodes:t.filter(t=>i.get(t.campaignId)===e)})),o=t.filter(e=>!i.has(e.campaignId));o.length&&a.push({label:e.topology?`Layer unavailable`:`Recorded campaigns`,nodes:o});let s=new Map;return a.forEach((e,t)=>e.nodes.forEach((e,n)=>s.set(e.campaignId,{x:24+t*244,y:56+n*108}))),{nodes:t,topology:n,columns:a,positions:s,edges:t.flatMap(e=>(n.get(e.campaignId)?.dependsOn??[]).filter(e=>r.has(e)).map(t=>({from:t,to:e.campaignId}))),width:Math.max(256,a.length*244+8),height:64+Math.max(1,...a.map(e=>e.nodes.length))*108}}function P({data:e}){let t=(0,g.useMemo)(()=>N(e),[e]),[n,r]=(0,g.useState)(t.nodes[0]?.campaignId??null),[i,a]=(0,g.useState)(``),[o,s]=(0,g.useState)(`all`),[c,l]=(0,g.useState)(0),u=(0,g.useRef)(null),d=(0,g.useRef)(new Map),f=t.nodes.find(e=>e.campaignId===n),p=(0,g.useMemo)(()=>w(t.nodes,i,o),[t.nodes,i,o]),m=i.trim().length>0||o!==`all`,h=Math.max(1,Math.ceil(p.length/A)),_=Math.min(c,h-1),v=p.slice(_*A,(_+1)*A),y=f&&m&&!p.some(e=>e.campaignId===f.campaignId),b=(0,g.useMemo)(()=>T(t.edges,f?.campaignId??null,k),[t.edges,f?.campaignId]),x=(0,g.useId)(),S=`${x}-detail`,C=f?t.topology.get(f.campaignId):void 0,P=C?.prerequisites.filter(e=>!C.dependsOn.includes(e))??[],F=new Map(e.outcomes.map(e=>[e.campaignId,e])),I=t=>e.outcomes.filter(e=>e.state===t).length;function L(e,n=!1){let r=u.current,i=t.positions.get(e);if(!r||!i)return;let a=Math.max(0,i.x+96-r.clientWidth/2),o=Math.max(0,i.y+40-r.clientHeight/2);typeof r.scrollTo==`function`?r.scrollTo({left:a,top:o,behavior:`auto`}):(r.scrollLeft=a,r.scrollTop=o),n&&d.current.get(e)?.focus({preventScroll:!0})}function R(e){r(e),L(e)}function z(e,n){return e.length?(0,D.jsx)(`ul`,{className:E.relationships,children:e.map(e=>(0,D.jsxs)(`li`,{children:[t.positions.has(e)?(0,D.jsx)(`button`,{type:`button`,onClick:()=>R(e),children:e}):(0,D.jsx)(`span`,{children:e}),(0,D.jsx)(`span`,{children:F.has(e)?j[F.get(e).state]:`Outcome unavailable`})]},e))}):(0,D.jsx)(`p`,{className:E.note,children:n})}return(0,D.jsxs)(`section`,{className:E.topology,"aria-label":`Controller mission topology`,children:[(0,D.jsxs)(`header`,{className:E.header,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`h3`,{children:`Mission topology`}),(0,D.jsx)(`p`,{children:`Follow the declared work graph. Select a campaign to inspect its recorded state and prerequisites.`})]}),(0,D.jsx)(`span`,{className:E.snapshot,children:`Recorded snapshot`})]}),(0,D.jsxs)(`dl`,{className:E.counts,"aria-label":`Recorded campaign counts`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Campaigns`}),(0,D.jsx)(`dd`,{children:e.outcomes.length})]}),[`completed`,`in-flight`,`held`,`pending`].map(e=>(0,D.jsxs)(`div`,{"data-state":e,children:[(0,D.jsx)(`dt`,{children:j[e]}),(0,D.jsx)(`dd`,{children:I(e)})]},e))]}),e.topology?null:(0,D.jsx)(`p`,{className:E.notice,children:`Dependency information is unavailable in this observation. Campaign placement does not imply independence or readiness.`}),e.outcomes.length>O?(0,D.jsxs)(`p`,{className:E.notice,children:[`Showing the first `,O,` of `,e.outcomes.length,` campaigns. Counts include all recorded outcomes; relationships outside this diagram remain in the selected campaign detail.`]}):null,t.nodes.length?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`section`,{className:E.finder,"aria-label":`Campaign navigator`,children:[(0,D.jsxs)(`div`,{className:E.finderControls,children:[(0,D.jsxs)(`label`,{className:E.searchLabel,htmlFor:`${x}-search`,children:[`Search campaigns`,(0,D.jsx)(`input`,{id:`${x}-search`,type:`search`,value:i,maxLength:192,placeholder:`Campaign ID or recorded reason`,"aria-describedby":`${x}-finder-hint`,onChange:e=>{a(e.target.value),l(0)}})]}),(0,D.jsxs)(`label`,{htmlFor:`${x}-state`,children:[`Recorded state`,(0,D.jsxs)(`select`,{id:`${x}-state`,value:o,onChange:e=>{s(e.target.value),l(0)},children:[(0,D.jsx)(`option`,{value:`all`,children:`All recorded states`}),[`pending`,`in-flight`,`completed`,`held`].map(e=>(0,D.jsx)(`option`,{value:e,children:j[e]},e))]})]}),(0,D.jsx)(`button`,{type:`button`,className:E.utilityButton,disabled:!f,onClick:()=>{f&&L(f.campaignId,!0)},children:`Locate selected`}),m?(0,D.jsx)(`button`,{type:`button`,className:E.utilityButton,onClick:()=>{a(``),s(`all`),l(0)},children:`Reset filters`}):null]}),(0,D.jsxs)(`div`,{className:E.finderMeta,children:[(0,D.jsxs)(`p`,{id:`${x}-finder-hint`,children:[`Search covers the `,t.nodes.length,` diagram campaigns. Filters narrow this index, not the graph or its dependency layers.`]}),(0,D.jsx)(`span`,{"aria-live":`polite`,"aria-atomic":`true`,children:m?`${p.length} matching campaign${p.length===1?``:`s`}`:`${t.nodes.length} campaigns in diagram`})]}),m?(0,D.jsxs)(D.Fragment,{children:[p.length?(0,D.jsx)(`ul`,{className:E.results,"aria-label":`Matching campaigns`,children:v.map(e=>(0,D.jsx)(`li`,{children:(0,D.jsxs)(`button`,{type:`button`,className:E.result,"aria-label":`Select campaign ${e.campaignId}`,"aria-describedby":`${x}-result-state-${e.campaignId} ${x}-result-reason-${e.campaignId}`,"aria-pressed":f?.campaignId===e.campaignId,"aria-controls":S,onClick:()=>R(e.campaignId),children:[(0,D.jsx)(`span`,{className:E.resultName,children:e.campaignId}),(0,D.jsx)(`span`,{id:`${x}-result-state-${e.campaignId}`,className:E.resultState,"data-state":e.state,children:j[e.state]}),(0,D.jsx)(`span`,{id:`${x}-result-reason-${e.campaignId}`,className:E.resultReason,children:e.reasonCode})]})},e.campaignId))}):(0,D.jsx)(`p`,{className:E.noResults,children:`No diagram campaigns match. Try another campaign ID or recorded reason, or reset filters.`}),h>1?(0,D.jsxs)(`nav`,{className:E.pagination,"aria-label":`Campaign result pages`,children:[(0,D.jsxs)(`span`,{children:[`Page `,_+1,` of `,h]}),(0,D.jsx)(`button`,{type:`button`,className:E.utilityButton,disabled:_===0,onClick:()=>l(_-1),children:`Previous results`}),(0,D.jsx)(`button`,{type:`button`,className:E.utilityButton,disabled:_+1===h,onClick:()=>l(_+1),children:`Next results`})]}):null]}):null]}),(0,D.jsxs)(`div`,{className:E.workspace,children:[(0,D.jsx)(`div`,{ref:u,className:E.board,role:`region`,"aria-label":`Campaign dependency diagram`,tabIndex:0,children:(0,D.jsxs)(`div`,{className:E.canvas,style:{width:t.width,height:t.height},children:[(0,D.jsx)(`svg`,{width:t.width,height:t.height,className:E.edges,"aria-hidden":`true`,children:b.map(e=>{let n=t.positions.get(e.from),r=t.positions.get(e.to),i=n.x+192,a=r.x,o=(i+a)/2;return(0,D.jsx)(`path`,{className:f&&(e.from===f.campaignId||e.to===f.campaignId)?E.selectedEdge:E.edge,d:`M ${i} ${n.y+40} C ${o} ${n.y+40}, ${o} ${r.y+40}, ${a} ${r.y+40}`},`${e.from}-${e.to}`)})}),t.columns.map((e,t)=>(0,D.jsx)(`span`,{className:E.column,style:{left:24+t*244},children:e.label},e.label)),t.nodes.map((e,n)=>{let r=t.positions.get(e.campaignId),i=t.topology.get(e.campaignId);return(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`button`,{type:`button`,className:E.node,"data-state":e.state,style:{left:r.x,top:r.y},ref:t=>{t?d.current.set(e.campaignId,t):d.current.delete(e.campaignId)},"aria-label":`Inspect campaign ${e.campaignId}: ${j[e.state]}`,"aria-pressed":f?.campaignId===e.campaignId,"aria-controls":S,"aria-describedby":`${x}-relations-${n}`,onClick:()=>R(e.campaignId),children:[(0,D.jsx)(`span`,{className:E.nodeName,children:e.campaignId}),(0,D.jsx)(`span`,{className:E.nodeState,children:j[e.state]})]}),(0,D.jsx)(`span`,{id:`${x}-relations-${n}`,className:E.srOnly,children:i?`Direct dependencies: ${i.dependsOn.join(`, `)||`none declared`}. Additional inherited delivery prerequisites: ${i.prerequisites.filter(e=>!i.dependsOn.includes(e)).join(`, `)||`none recorded`}.`:`Dependency information unavailable.`})]},e.campaignId)})]})}),(0,D.jsx)(`section`,{id:S,className:E.detail,"aria-label":`Selected campaign detail`,children:f?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`span`,{className:E.detailState,"data-state":f.state,children:j[f.state]}),(0,D.jsx)(`h4`,{children:f.campaignId}),y?(0,D.jsx)(`p`,{className:E.selectionNote,children:`The selected campaign is outside the current filters. Its recorded detail remains available.`}):null,(0,D.jsx)(`p`,{children:M[f.state]}),(0,D.jsxs)(`dl`,{className:E.facts,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Recorded reason`}),(0,D.jsx)(`dd`,{children:f.reasonCode})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Campaign-call intent`}),(0,D.jsx)(`dd`,{children:f.attempted?`Recorded`:`Not recorded`})]})]}),(0,D.jsx)(`p`,{className:E.note,children:`A call intent is not proof of worker execution, model requests or successful evaluation.`}),(0,D.jsx)(`h5`,{children:`Direct dependencies`}),C?z(C.dependsOn,`None declared for this campaign.`):(0,D.jsx)(`p`,{className:E.note,children:`Dependency information unavailable.`}),(0,D.jsx)(`h5`,{children:`Additional inherited delivery prerequisites`}),C?z(P,`None recorded beyond the direct dependencies.`):(0,D.jsx)(`p`,{className:E.note,children:`Delivery prerequisite information unavailable.`}),(0,D.jsx)(`p`,{className:E.note,children:`Inherited prerequisites are ancestor delivery gates, not additional declared dependency edges. A state badge alone does not verify the delivery receipt.`})]}):(0,D.jsx)(`p`,{className:E.note,children:n?`Selected campaign ${n} is no longer present in this diagram. No substitute has been selected. Choose another campaign to inspect its evidence.`:`Select a campaign to inspect its recorded evidence.`})})]}),(0,D.jsx)(`p`,{className:E.legend,children:`Lines show declared dependencies, from earlier to later layers. Layer placement does not change declared priority or establish execution readiness.`}),t.edges.length>k?(0,D.jsxs)(`p`,{className:E.note,children:[`Showing `,k,` of `,t.edges.length,` visible dependency lines. Every campaign’s complete relationships remain available in its detail and accessible description.`]}):null]}):(0,D.jsx)(`p`,{className:E.empty,children:`No campaign outcomes are available in this observation. Inspect a registered controller with recorded campaigns to see its mission topology.`})]})}function F({data:e}){return(0,D.jsx)(P,{data:e},e.controllerId)}var I=e=>e==null?`Not recorded`:String(e),L=e=>[...new Set(e)].sort().join(`, `)||`None recorded`,R={pending:`Pending`,held:`Held`,completed:`Completed`,"in-flight":`Unresolved intent`};function z(e,t){let n={clockWarning:!1,changes:[],changedCampaigns:0};if(!e)return{...n,kind:`baseline`,notice:`First accepted observation. Refresh this controller explicitly to compare recorded evidence.`};if(e.controllerId!==t.controllerId||e.createdAt!==t.createdAt)return{...n,kind:`incomparable`,notice:`Controller identity or registration timestamp changed. Registration continuity is not established; these observations are not compared.`};let r=[],i=(e,t,n,i,a)=>{n!==i&&r.push({key:e,label:t,before:n,after:i,...a?{campaignId:a}:{}})},a=[];(e.sourceState!==`healthy`||t.sourceState!==`healthy`)&&a.push(`One or both observations contain missing or degraded evidence. Absence from an observation does not establish deletion, completion or execution.`),t.createdAt===null&&a.push(`The registration timestamp is not recorded. Registration continuity is not established.`),e.deadlineAt!==t.deadlineAt&&a.push(`The recorded deadline changed. This difference does not establish registration continuity or renew execution authority.`),i(`controller:status`,`Recorded controller status`,e.status,t.status),i(`controller:health`,`Evidence health`,e.sourceState,t.sourceState),i(`controller:deadline`,`Recorded deadline`,I(e.deadlineAt),I(t.deadlineAt)),i(`controller:reasons`,`Evidence reasons`,L(e.reasons),L(t.reasons));for(let[n,r]of[[`mode`,`Admission mode`],[`sequence`,`Admission sequence`],[`requestedAt`,`Admission requested at`],[`acknowledgedAt`,`Admission acknowledged at`]])i(`control:${n}`,r,I(e.control?.[n]),I(t.control?.[n]));let o=new Map(e.outcomes.map(e=>[e.campaignId,e])),s=new Map(t.outcomes.map(e=>[e.campaignId,e])),c=[...s.keys(),...[...o.keys()].filter(e=>!s.has(e))];for(let e of c){let t=o.get(e),n=s.get(e);if(!t||!n){i(`campaign:${e}:presence`,`Campaign presence`,t?`Present`:`Not observed`,n?`Present`:`Not observed`,e);continue}i(`campaign:${e}:state`,`Recorded state`,R[t.state],R[n.state],e),i(`campaign:${e}:reason`,`Recorded reason`,t.reasonCode,n.reasonCode,e),i(`campaign:${e}:attempted`,`Campaign-call intent`,t.attempted?`Recorded`:`Not recorded`,n.attempted?`Recorded`:`Not recorded`,e)}if(i(`controller:campaign-order`,`Recorded campaign order`,e.outcomes.map(e=>e.campaignId).join(`, `)||`None recorded`,t.outcomes.map(e=>e.campaignId).join(`, `)||`None recorded`),i(`controller:topology`,`Dependency evidence`,e.topology?`Available`:`Unavailable`,t.topology?`Available`:`Unavailable`),e.topology&&t.topology){let n=new Map(e.topology.map(e=>[e.campaignId,e]));for(let e of t.topology){let t=n.get(e.campaignId);t&&(i(`campaign:${e.campaignId}:dependencies`,`Direct dependencies`,L(t.dependsOn),L(e.dependsOn),e.campaignId),i(`campaign:${e.campaignId}:prerequisites`,`Effective prerequisites`,L(t.prerequisites),L(e.prerequisites),e.campaignId))}}return{kind:`compared`,notice:a.join(` `)||null,clockWarning:Date.parse(t.observedAt)<=Date.parse(e.observedAt),changes:r,changedCampaigns:new Set(r.flatMap(e=>e.campaignId?[e.campaignId]:[])).size}}var B={changes:`_changes_qcw1f_1`,header:`_header_qcw1f_2`,labels:`_labels_qcw1f_4`,historical:`_historical_qcw1f_6`,description:`_description_qcw1f_7`,note:`_note_qcw1f_7`,footnote:`_footnote_qcw1f_7`,times:`_times_qcw1f_9`,warning:`_warning_qcw1f_12`,baseline:`_baseline_qcw1f_13`,counts:`_counts_qcw1f_14`,disclosure:`_disclosure_qcw1f_18`,rows:`_rows_qcw1f_22`,row:`_row_qcw1f_22`,field:`_field_qcw1f_24`,values:`_values_qcw1f_27`};function V({previous:e,current:t,historical:n,loading:r}){let i=(0,g.useMemo)(()=>z(e,t),[e,t]);return(0,D.jsxs)(`section`,{className:B.changes,"aria-label":`Changes between observations`,children:[(0,D.jsxs)(`header`,{className:B.header,children:[(0,D.jsx)(`h3`,{children:`Changes between observations`}),(0,D.jsxs)(`div`,{className:B.labels,children:[r?(0,D.jsx)(`span`,{children:`Refresh in progress`}):null,n?(0,D.jsx)(`span`,{className:B.historical,children:`Historical observations`}):null]})]}),(0,D.jsx)(`p`,{className:B.description,children:`Compare the last two accepted responses in this session. This is not an event log or a live activity view.`}),(0,D.jsxs)(`dl`,{className:B.times,"aria-label":`Compared observation times`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Previous observation`}),(0,D.jsx)(`dd`,{children:e?(0,D.jsx)(`time`,{dateTime:e.observedAt,children:e.observedAt}):`Not yet observed`})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Displayed observation`}),(0,D.jsx)(`dd`,{children:(0,D.jsx)(`time`,{dateTime:t.observedAt,children:t.observedAt})})]})]}),r?(0,D.jsx)(`p`,{className:B.note,children:`The accepted observations below remain unchanged while the refresh is pending.`}):null,n?(0,D.jsx)(`p`,{className:B.warning,children:`The latest refresh failed. This comparison uses retained observations, not current evidence.`}):null,i.notice?(0,D.jsx)(`p`,{className:i.kind===`baseline`?B.note:B.warning,children:i.notice}):null,i.clockWarning?(0,D.jsx)(`p`,{className:B.warning,children:`Observation timestamps are equal or move backward. Before and after follow response order, not a verified event timeline.`}):null,i.kind===`baseline`?(0,D.jsx)(`p`,{className:B.baseline,children:`Refresh this controller to compare two observations.`}):i.kind===`incomparable`?(0,D.jsx)(`p`,{className:B.baseline,children:`These observations cannot be compared as one controller registration.`}):i.changes.length===0?(0,D.jsx)(`p`,{className:B.baseline,children:`No compared evidence fields changed. Observation times are excluded; this does not prove that no work occurred.`}):(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`dl`,{className:B.counts,"aria-label":`Observation change counts`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Changed fields`}),(0,D.jsx)(`dd`,{children:i.changes.length})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Campaigns with displayed changes`}),(0,D.jsx)(`dd`,{children:i.changedCampaigns})]})]}),(0,D.jsxs)(`details`,{className:B.disclosure,children:[(0,D.jsxs)(`summary`,{children:[`Review `,i.changes.length,` changed field`,i.changes.length===1?``:`s`]}),(0,D.jsx)(`ul`,{className:B.rows,"aria-label":`Changed observation fields`,children:i.changes.map(e=>(0,D.jsxs)(`li`,{className:B.row,children:[(0,D.jsxs)(`div`,{className:B.field,children:[(0,D.jsx)(`h4`,{children:e.label}),e.campaignId?(0,D.jsx)(`span`,{children:e.campaignId}):null]}),(0,D.jsxs)(`dl`,{className:B.values,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Before`}),(0,D.jsx)(`dd`,{children:e.before})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`After`}),(0,D.jsx)(`dd`,{children:e.after})]})]})]},e.key))})]})]}),(0,D.jsx)(`p`,{className:B.footnote,children:`Differences describe returned evidence only. They do not establish worker execution, delivery verification or a production deployment.`})]})}var H={inspector:`_inspector_123iu_1`,header:`_header_123iu_2`,note:`_note_123iu_4`,empty:`_empty_123iu_4`,field:`_field_123iu_4`,control:`_control_123iu_4`,readOnly:`_readOnly_123iu_5`,form:`_form_123iu_6`,identity:`_identity_123iu_15`,warning:`_warning_123iu_18`,facts:`_facts_123iu_19`,sequence:`_sequence_123iu_24`,tableWrap:`_tableWrap_123iu_27`,reasons:`_reasons_123iu_32`};function U({value:e}){return e?(0,D.jsx)(`time`,{dateTime:e,children:e.replace(`T`,` `).replace(`Z`,` UTC`)}):(0,D.jsx)(D.Fragment,{children:`Not recorded`})}var W={"campaign-execution":`Campaign execution`,"campaign-verification":`Campaign verification`,"delivery-execution":`Local branch delivery`,"delivery-verification":`Delivery confirmation`,"settlement-publication":`Controller acknowledgement`};function G(){let[e,t]=(0,g.useState)(``),[n,r]=(0,g.useState)(null),[i,a]=(0,g.useState)({current:null,previous:null}),o=i.current,[s,c]=(0,g.useState)(!1),[l,u]=(0,g.useState)(null),[d,f]=(0,g.useState)(!1),p=(0,g.useRef)({sequence:0,abort:null});(0,g.useEffect)(()=>()=>{p.current.sequence+=1,p.current.abort?.abort()},[]);async function m(e){if(!v(e)){f(!0);return}f(!1),p.current.abort?.abort();let t=++p.current.sequence,n=new AbortController;p.current.abort=n,r(e),a(t=>t.current?.controllerId===e?t:{current:null,previous:null}),c(!0),u(null);try{let r=await C(e,n.signal);t===p.current.sequence&&a(t=>({current:r,previous:t.current?.controllerId===e?t.current:null}))}catch{t===p.current.sequence&&u(`Observation failed or returned invalid evidence. Check your connection and refresh this controller.`)}finally{t===p.current.sequence&&c(!1)}}return(0,D.jsxs)(`section`,{className:H.inspector,"aria-labelledby":`controller-inspector-title`,children:[(0,D.jsxs)(`header`,{className:H.header,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`h2`,{id:`controller-inspector-title`,children:`Controller inspector`}),(0,D.jsx)(`p`,{children:`Read the recorded progress of a named portfolio controller.`})]}),(0,D.jsx)(`span`,{className:H.readOnly,children:`Read-only`})]}),(0,D.jsxs)(`form`,{className:H.form,onSubmit:t=>{t.preventDefault(),m(e)},children:[(0,D.jsxs)(`div`,{className:H.field,children:[(0,D.jsx)(`label`,{htmlFor:`controller-id`,children:`Controller ID`}),(0,D.jsx)(`input`,{id:`controller-id`,value:e,onChange:e=>{t(e.target.value),f(!1)},maxLength:64,autoComplete:`off`,autoCapitalize:`none`,spellCheck:!1,"aria-invalid":d,"aria-describedby":`controller-id-help`}),(0,D.jsx)(`p`,{id:`controller-id-help`,children:`Use the ID from your controller manifest: lowercase letters, numbers, hyphens or underscores.`})]}),(0,D.jsx)(`button`,{type:`submit`,children:`Inspect controller`}),n?(0,D.jsx)(`button`,{type:`button`,disabled:s,onClick:()=>{m(n)},children:`Refresh controller`}):null]}),d?(0,D.jsx)(`p`,{role:`alert`,className:H.warning,children:`Enter 1–64 characters, starting with a lowercase letter or number.`}):null,n?(0,D.jsxs)(`div`,{"aria-busy":s,children:[(0,D.jsxs)(`h3`,{className:H.identity,children:[`Evidence for `,(0,D.jsx)(`code`,{children:n})]}),e===n?null:(0,D.jsxs)(`p`,{className:H.note,children:[`The form has changed. Evidence below still belongs to `,n,`; submit to inspect another ID.`]}),(0,D.jsx)(`p`,{role:`status`,className:H.note,children:s?`Reading ${n}…${o?` Previous observation remains below.`:``}`:l&&o?`Historical observation — refresh failed. This is not current evidence.`:o?`Recorded snapshot. Refresh explicitly to check for changes; this is not a live process view.`:`No verified observation is available.`}),l?(0,D.jsx)(`p`,{role:`alert`,className:H.warning,children:l}):null,o?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`dl`,{className:H.facts,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Evidence health`}),(0,D.jsx)(`dd`,{children:o.sourceState})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Recorded status`}),(0,D.jsx)(`dd`,{children:o.status})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Observed at`}),(0,D.jsx)(`dd`,{children:(0,D.jsx)(U,{value:o.observedAt})})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Created at`}),(0,D.jsx)(`dd`,{children:(0,D.jsx)(U,{value:o.createdAt})})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`dt`,{children:`Original deadline`}),(0,D.jsx)(`dd`,{children:(0,D.jsx)(U,{value:o.deadlineAt})})]})]}),(0,D.jsx)(V,{previous:i.previous,current:o,historical:!!l,loading:s}),o.sourceState===`missing`?(0,D.jsx)(`p`,{className:H.warning,children:`No controller registration was found in this store. Check the ID and selected Universe store.`}):null,o.sourceState===`degraded`?(0,D.jsx)(`p`,{className:H.warning,children:`Evidence could not be fully verified. This observation does not repair locks, reconcile work or prove a controller is running.`}):null,o.control?(0,D.jsxs)(`section`,{className:H.control,"aria-label":`Recorded admission control`,children:[(0,D.jsx)(`h4`,{children:o.control.mode===`open`?`Admission reopened`:o.control.acknowledgedAt?`Drain acknowledged`:`Drain awaiting acknowledgement`}),(0,D.jsxs)(`ol`,{className:H.sequence,children:[(0,D.jsxs)(`li`,{children:[(0,D.jsx)(`strong`,{children:o.control.mode===`open`?`Resume recorded`:`Drain recorded`}),(0,D.jsxs)(`span`,{children:[`Sequence `,o.control.sequence]}),(0,D.jsx)(U,{value:o.control.requestedAt})]}),(0,D.jsxs)(`li`,{children:[(0,D.jsx)(`strong`,{children:o.control.mode===`open`?`Resume did not start work`:o.control.acknowledgedAt?`Acknowledgement recorded`:`Acknowledgement not recorded`}),o.control.mode===`drain`?(0,D.jsx)(U,{value:o.control.acknowledgedAt}):(0,D.jsx)(`span`,{children:`Resume does not start work.`})]})]}),(0,D.jsx)(`p`,{children:o.control.mode===`drain`?`Drain blocks new dispatch intents; already-admitted work can continue. An unresolved intent prevents acknowledgement; absence of a visible worker proves neither completion nor failure.`:`Execution requires a separate run invocation. Admission state does not renew the original deadline or establish a running controller.`})]}):(0,D.jsx)(`p`,{className:H.note,children:`No admission-control record. This does not establish process liveness.`}),(0,D.jsx)(F,{data:o},o.controllerId),o.outcomes.length?(0,D.jsx)(`div`,{className:H.tableWrap,role:`region`,"aria-label":`Recorded campaign outcomes`,tabIndex:0,children:(0,D.jsxs)(`table`,{children:[(0,D.jsx)(`caption`,{children:`Recorded campaign outcomes`}),(0,D.jsx)(`thead`,{children:(0,D.jsxs)(`tr`,{children:[(0,D.jsx)(`th`,{scope:`col`,children:`Campaign`}),(0,D.jsx)(`th`,{scope:`col`,children:`State`}),(0,D.jsx)(`th`,{scope:`col`,children:`Campaign attempted`}),(0,D.jsx)(`th`,{scope:`col`,children:`Reason`})]})}),(0,D.jsx)(`tbody`,{children:o.outcomes.map(e=>(0,D.jsxs)(`tr`,{children:[(0,D.jsx)(`th`,{scope:`row`,children:e.campaignId}),(0,D.jsx)(`td`,{children:e.state}),(0,D.jsx)(`td`,{children:e.attempted?`Yes`:`No`}),(0,D.jsx)(`td`,{children:e.reasonCode})]},e.campaignId))})]})}):(0,D.jsx)(`p`,{className:H.note,children:`No campaign outcomes available in this observation.`}),(0,D.jsx)(`p`,{className:H.note,children:`“In-flight” means an unresolved durable intent, not proof of a live worker. Campaign attempted records a call intent, not proof of worker execution or successful evaluation. A dispatch-not-started outcome remains held and does not authorize a retry.`}),o.diagnostics?.length?(0,D.jsxs)(`section`,{"aria-label":`Recorded handoff diagnostics`,children:[(0,D.jsx)(`h4`,{children:`Recorded handoff diagnostics`}),(0,D.jsx)(`p`,{className:H.note,children:`These are historical failure records, not live errors. Check the campaign outcome above for its current recorded state. A diagnostic never authorizes retrying a worker or publishing a branch.`}),(0,D.jsx)(`div`,{className:H.tableWrap,role:`region`,"aria-label":`Handoff diagnostic details`,tabIndex:0,children:(0,D.jsxs)(`table`,{children:[(0,D.jsx)(`caption`,{children:`Where the handoff stopped`}),(0,D.jsx)(`thead`,{children:(0,D.jsxs)(`tr`,{children:[(0,D.jsx)(`th`,{scope:`col`,children:`Campaign`}),(0,D.jsx)(`th`,{scope:`col`,children:`Stage`}),(0,D.jsx)(`th`,{scope:`col`,children:`Failure code`}),(0,D.jsx)(`th`,{scope:`col`,children:`Recorded at`})]})}),(0,D.jsx)(`tbody`,{children:o.diagnostics.map(e=>(0,D.jsxs)(`tr`,{children:[(0,D.jsx)(`th`,{scope:`row`,children:e.campaignId}),(0,D.jsx)(`td`,{children:W[e.phase]}),(0,D.jsx)(`td`,{children:e.code}),(0,D.jsx)(`td`,{children:(0,D.jsx)(U,{value:e.at})})]},e.campaignId))})]})}),(0,D.jsx)(`p`,{className:H.note,children:`Inspect the pinned campaign and delivery receipts before recovery. Completed outcomes can retain an earlier diagnostic; raw error text and private intent digests are omitted here.`})]}):null,o.reasons.length?(0,D.jsxs)(`details`,{className:H.reasons,children:[(0,D.jsxs)(`summary`,{children:[`Evidence reasons (`,o.reasons.length,`)`]}),(0,D.jsx)(`ul`,{children:o.reasons.map((e,t)=>(0,D.jsx)(`li`,{children:e},`${e}-${t}`))})]}):null]}):null]}):(0,D.jsx)(`p`,{className:H.empty,children:`Enter an ID to inspect this store. Nothing is queried until you submit.`})]})}var K={shell:`_shell_1077u_1`,scopeBar:`_scopeBar_1077u_2`,scope:`_scope_1077u_2`,brand:`_brand_1077u_4`,brandMark:`_brandMark_1077u_6`,workspace:`_workspace_1077u_7`,badge:`_badge_1077u_8`,store:`_store_1077u_9`,root:`_root_1077u_12`,actions:`_actions_1077u_13`,notice:`_notice_1077u_14`,main:`_main_1077u_16`,explanation:`_explanation_1077u_17`,checking:`_checking_1077u_20`},q={key:`universe-console-scope`,async fetch(){let e=await c(`/api/universe/console`);if(e?.schemaVersion!==1||e.mode!==`universe`||e.readOnly!==!0||typeof e.root!=`string`||!/^(?:\/|[a-zA-Z]:[\\/]|\\\\)/.test(e.root)||[...e.root].some(e=>e.charCodeAt(0)<32||e.charCodeAt(0)>=127&&e.charCodeAt(0)<=159))throw Error(`The server did not establish an explicit read-only Universe scope.`);return e}};function J(){let e=l(q),t=d(q),n=s();return(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(m,{}),(0,D.jsxs)(`div`,{className:K.shell,children:[(0,D.jsxs)(`header`,{className:K.scopeBar,children:[(0,D.jsxs)(`div`,{className:K.scope,children:[(0,D.jsxs)(`div`,{className:K.brand,children:[(0,D.jsxs)(`svg`,{className:K.brandMark,viewBox:`54 67 146 124`,"aria-hidden":`true`,focusable:`false`,children:[(0,D.jsx)(`path`,{fill:`currentColor`,d:`M106 76H123V115H100L113 154L99 179H72L59 156Z M130 76H147L194 156L181 179H154L140 154L153 115H130Z`}),(0,D.jsx)(`path`,{fill:`#2563EB`,d:`M110 121H143L133 152H120Z`})]}),(0,D.jsx)(`strong`,{children:`Ashlrverse`}),(0,D.jsx)(`span`,{className:K.workspace,children:`Experiments`})]}),(0,D.jsx)(`span`,{className:K.badge,children:`Read-only observation`}),e.data?(0,D.jsxs)(`details`,{className:K.store,children:[(0,D.jsx)(`summary`,{children:`Universe store`}),(0,D.jsx)(`code`,{"aria-label":`Universe store`,className:K.root,children:e.data.root})]}):null]}),(0,D.jsxs)(`div`,{className:K.actions,children:[(0,D.jsxs)(`button`,{type:`button`,onClick:n.cycle,children:[`Theme: `,n.theme]}),(0,D.jsx)(`button`,{type:`button`,onClick:()=>{o()},children:`Disconnect`})]})]}),(0,D.jsx)(`main`,{id:`main-content`,tabIndex:-1,className:K.main,children:e.status===`error`?(0,D.jsxs)(`section`,{role:`alert`,className:K.notice,children:[(0,D.jsx)(`h1`,{children:`Console scope unavailable`}),(0,D.jsxs)(`p`,{children:[e.error?.message,` No project data is shown until the scope can be checked.`]}),(0,D.jsx)(`button`,{type:`button`,onClick:t,children:`Retry scope check`})]}):e.data?(0,D.jsxs)(f.Provider,{value:e.data.root,children:[(0,D.jsx)(`p`,{className:K.explanation,children:`This console observes the selected Universe store. Run campaigns from your terminal; opening this page does not start work.`}),(0,D.jsx)(G,{},e.data.root),(0,D.jsx)(p,{})]}):(0,D.jsx)(`p`,{role:`status`,children:`Checking the selected Universe store…`})})]})]})}function Y(){let e=u();return(0,g.useEffect)(()=>{if(e!==`checking`)return;let t=!1;return a(q.key,q.fetch).then(()=>{t||i(r(q.key).status===`success`)}),()=>{t=!0}},[e]),e===`checking`?(0,D.jsx)(`p`,{className:K.checking,role:`status`,children:`Checking for an existing console session…`}):e===`unauthenticated`?(0,D.jsx)(h,{heading:`Connect to Ashlrverse`,command:`ashlr universe console --root /absolute/universe-store`}):(0,D.jsx)(J,{})}export{Y as UniverseConsoleApp};
|
|
2
|
-
//# sourceMappingURL=UniverseConsoleApp-QSoaY_Fk.js.map
|