@ashlr/hub 3.22.0 → 3.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +5 -5
- package/dist/authority-surface.json +16 -11
- package/dist/build-identity.json +2 -2
- package/dist/cli/verify-safety-sources.d.ts +4 -0
- package/dist/cli/verify-safety-sources.js +41 -0
- package/dist/cli/verify-safety-sources.js.map +1 -0
- package/dist/cli/verify-safety.js +16 -1
- package/dist/cli/verify-safety.js.map +1 -1
- package/dist/core/decide/needs-you.d.ts +3 -1
- package/dist/core/decide/needs-you.js +52 -28
- package/dist/core/decide/needs-you.js.map +1 -1
- package/dist/core/fleet/fleet-control-model.d.ts +2 -1
- package/dist/core/fleet/fleet-control-model.js +5 -0
- package/dist/core/fleet/fleet-control-model.js.map +1 -1
- package/dist/core/fleet/fleet-control-types.d.ts +11 -1
- package/dist/core/fleet/fleet-control.d.ts +4 -0
- package/dist/core/fleet/fleet-control.js +23 -1
- package/dist/core/fleet/fleet-control.js.map +1 -1
- package/dist/core/fleet/quota.js +1 -1
- package/dist/core/fleet/quota.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
- package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
- package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
- package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
- package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
- package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
- package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
- package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
- package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
- package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
- package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
- package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
- package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
- package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
- package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
- package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
- package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
- package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
- package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
- package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
- package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
- package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
- package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
- package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
- package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
- package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
- package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
- package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
- package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
- package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
- package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
- package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
- package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
- package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
- package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
- package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
- package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
- package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
- package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
- package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
- package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
- package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
- package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
- package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
- package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
- package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
- package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
- package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
- package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
- package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
- package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
- package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
- package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
- package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
- package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
- package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
- package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
- package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
- package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
- package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
- package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
- package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
- package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
- package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
- package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
- package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
- package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
- package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
- package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
- package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
- package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
- package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
- package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
- package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
- package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
- package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
- package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
- package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
- package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
- package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
- package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
- package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
- package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
- package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
- package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
- package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
- package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
- package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
- package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
- package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
- package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
- package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
- package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
- package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
- package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
- package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
- package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
- package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
- package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
- package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
- package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
- package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
- package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
- package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
- package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
- package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
- package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
- package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
- package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
- package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
- package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
- package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
- package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
- package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
- package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
- package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
- package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
- package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
- package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
- package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
- package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
- package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
- package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
- package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
- package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
- package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
- package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
- package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
- package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
- package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
- package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
- package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
- package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
- package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
- package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
- package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
- package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
- package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
- package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
- package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
- package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
- package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
- package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
- package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
- package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
- package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
- package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
- package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
- package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
- package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
- package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
- package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
- package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
- package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
- package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
- package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
- package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
- package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
- package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
- package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
- package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
- package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
- package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
- package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
- package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
- package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
- package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
- package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
- package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
- package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
- package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
- package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
- package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
- package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
- package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
- package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
- package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
- package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
- package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
- package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
- package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
- package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
- package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
- package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
- package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
- package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
- package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
- package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
- package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
- package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
- package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
- package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
- package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
- package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
- package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
- package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
- package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
- package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
- package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
- package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
- package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
- package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
- package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
- package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
- package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
- package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
- package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
- package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
- package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
- package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
- package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
- package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
- package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
- package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
- package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
- package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
- package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
- package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
- package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
- package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
- package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
- package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
- package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
- package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
- package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
- package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
- package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
- package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
- package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
- package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
- package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
- package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
- package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
- package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
- package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
- package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
- package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
- package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
- package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
- package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
- package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
- package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
- package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
- package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
- package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
- package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
- package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
- package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
- package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
- package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
- package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
- package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
- package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
- package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
- package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
- package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
- package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
- package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
- package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
- package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
- package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
- package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
- package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
- package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
- package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
- package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
- package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
- package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
- package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
- package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
- package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
- package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
- package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
- package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
- package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
- package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
- package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
- package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
- package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
- package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
- package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
- package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
- package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
- package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
- package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
- package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
- package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
- package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
- package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
- package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
- package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
- package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
- package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
- package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
- package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
- package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
- package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
- package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
- package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
- package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
- package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
- package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
- package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
- package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
- package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
- package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
- package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
- package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
- package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
- package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
- package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
- package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
- package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
- package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
- package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
- package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
- package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
- package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
- package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
- package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
- package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
- package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
- package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
- package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
- package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
- package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
- package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
- package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
- package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
- package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
- package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
- package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
- package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
- package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
- package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
- package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
- package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
- package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
- package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
- package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
- package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
- package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
- package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
- package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
- package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
- package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
- package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
- package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
- package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
- package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
- package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
- package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
- package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
- package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
- package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
- package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
- package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
- package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrowserPanel-CECVGJBS.js","names":[],"sources":["../../../../../../src/core/verse/browser-types.ts","../../../../../../src/web-ui/routes/verse/browser/agent-runner.ts","../../../../../../src/web-ui/routes/verse/browser/browser-address.ts","../../../../../../src/web-ui/routes/verse/browser/browser-geometry.ts","../../../../../../src/web-ui/routes/verse/browser/browser-icons.tsx","../../../../../../src/web-ui/routes/verse/browser/browser-queries.ts","../../../../../../src/web-ui/routes/verse/browser/browser-tabs.ts","../../../../../../src/web-ui/routes/verse/browser/native-browser.ts","../../../../../../src/web-ui/routes/verse/browser/send-to-chat.ts","../../../../../../src/web-ui/routes/verse/browser/BrowserPanel.module.css","../../../../../../src/web-ui/routes/verse/browser/BrowserPanel.tsx"],"sourcesContent":["/**\n * core/verse/browser-types.ts — the integrated Browser pane's contract (3.15).\n *\n * Three parties exchange these shapes:\n * - the Verse page's Browser pane (routes/verse/browser/**), which renders\n * the tabs and EXECUTES every command (through the desktop shell's native\n * webview, or an <iframe> for loopback pages in a plain browser tab);\n * - the sidecar (browser-api.ts + browser-bridge.ts), which gates what an\n * agent may ask for and relays it to the pane;\n * - a chat seat, which reaches the sidecar through unified agent-tools MCP\n * with a bearer token valid for its current turn.\n *\n * The pane is the only executor on purpose: an agent can only ever look at\n * the browser the operator is looking at, in the chat the operator granted.\n *\n * BROWSER-SAFE: imported by the web bundle and by server.ts. Plain data and\n * pure functions only — no node: modules.\n */\n\nexport const VERSE_BROWSER_PATH = '/api/verse/browser';\n/** GET ?sessionId= → VerseBrowserPolicy */\nexport const VERSE_BROWSER_POLICY_PATH = `${VERSE_BROWSER_PATH}/policy`;\n/** POST { sessionId, enabled, scope? } → VerseBrowserPolicy (scope defaults to `browser`, the whole grant) */\nexport const VERSE_BROWSER_ACCESS_PATH = `${VERSE_BROWSER_PATH}/access`;\n/** POST { sessionId, origin, allowed } → VerseBrowserPolicy */\nexport const VERSE_BROWSER_ALLOW_PATH = `${VERSE_BROWSER_PATH}/allow`;\n/** POST { sessionId, key } → VerseBrowserPolicy (forget one \"Allow for this chat\" answer) */\nexport const VERSE_BROWSER_ALLOWANCE_PATH = `${VERSE_BROWSER_PATH}/allowance`;\n/** GET ?sessionId=&wait= → VerseBrowserCommandsResponse (long-poll, ≤ 20 s) */\nexport const VERSE_BROWSER_COMMANDS_PATH = `${VERSE_BROWSER_PATH}/commands`;\n/** POST { sessionId, id } → { allowed: boolean }; the pane's effect fence. */\nexport const VERSE_BROWSER_DISPATCH_PATH = `${VERSE_BROWSER_PATH}/dispatch`;\n/** POST VerseBrowserCommandResult → { ok: true } */\nexport const VERSE_BROWSER_RESULT_PATH = `${VERSE_BROWSER_PATH}/result`;\n/** Retired Browser MCP path. Only a 410 response is served here. */\nexport const VERSE_BROWSER_MCP_PATH = `${VERSE_BROWSER_PATH}/mcp`;\n\n/**\n * The old MCP path's exact shape. It is exempt from the read and mutation\n * gates only to return 410; possession of a grant never admits a command.\n */\nexport const VERSE_BROWSER_MCP_PATH_RE = /^\\/api\\/verse\\/browser\\/mcp\\/([A-Za-z0-9_-]{43})$/;\n\nexport function isBrowserMcpPath(path: string): boolean {\n return VERSE_BROWSER_MCP_PATH_RE.test(path);\n}\n\n/** Retired MCP server name, retained for migration tests. */\nexport const BROWSER_MCP_SERVER_NAME = 'ashlr-browser';\n\n/**\n * What an agent may ask the pane to do.\n *\n * Reading (scope `browser`): status, navigate, screenshot, read-text,\n * console, snapshot, network, tabs, history. Acting (scope `browser_act`):\n * resolve (what a ref is, for the sidecar's safety decision) and act (one\n * click / type / select / hover / key / scroll, performed natively as real\n * input). Script (scope `browser_script`, off by default, loopback only):\n * evaluate. `confirm` is the sidecar asking the OPERATOR, through the pane,\n * whether an action that matters may go ahead.\n */\nexport type VerseBrowserAgentOp =\n | 'status'\n | 'navigate'\n | 'screenshot'\n | 'read-text'\n | 'console'\n | 'snapshot'\n | 'network'\n | 'tabs'\n | 'history'\n | 'resolve'\n | 'act'\n | 'evaluate'\n | 'confirm';\n\nexport const VERSE_BROWSER_AGENT_OPS: readonly VerseBrowserAgentOp[] = [\n 'status', 'navigate', 'screenshot', 'read-text', 'console',\n 'snapshot', 'network', 'tabs', 'history', 'resolve', 'act', 'evaluate', 'confirm',\n];\n\n/**\n * The three things an operator can switch on for a chat's agents. `browser`\n * is the whole grant (look + navigate); `browser_act` (click, type, …) comes\n * on with it and can be switched off alone; `browser_script` (run a JS\n * expression in a localhost page) stays off until switched on.\n */\nexport type VerseBrowserScope = 'browser' | 'browser_act' | 'browser_script';\nexport const VERSE_BROWSER_SCOPES: readonly VerseBrowserScope[] = ['browser', 'browser_act', 'browser_script'];\n\n/** The operator's answer to a confirmation card. */\nexport type VerseBrowserDecision = 'once' | 'chat' | 'deny';\nexport const VERSE_BROWSER_DECISIONS: readonly VerseBrowserDecision[] = ['once', 'chat', 'deny'];\n\n/** `confirm` command args: what the card shows. All of it is display text. */\nexport interface VerseBrowserConfirmRequest {\n /** \"Click\", \"Type into\", \"Press Enter in\", … */\n action: string;\n /** The element as the page names it (untrusted page text, rendered as text). */\n target: string | null;\n /** The origin it happens on. */\n origin: string;\n /** Why it needs the operator (one line each). */\n reasons: string[];\n /** The tool the agent called. */\n tool: string;\n /** When the sidecar stops waiting (ISO). */\n expiresAt: string;\n}\n\n/** One agent request, as the pane receives it. */\nexport interface VerseBrowserAgentCommand {\n id: string;\n sessionId: string;\n op: VerseBrowserAgentOp;\n /** navigate only — already gated by the sidecar. */\n url?: string;\n /** read-text: max characters; console: max entries. */\n limit?: number;\n /**\n * The op's arguments (snapshot, network, tabs, history, resolve, act,\n * evaluate, confirm, screenshot). Plain JSON built by the sidecar; the pane\n * re-validates every field against a closed shape before anything reaches\n * the page, and the desktop shell validates again.\n */\n args?: Record<string, unknown>;\n /**\n * The origins (besides loopback) this chat may observe, so the pane can\n * refuse BEFORE capturing a page the agent may not see. The sidecar checks\n * the answer again (defence in depth).\n */\n allowedOrigins: string[];\n createdAt: string;\n}\n\nexport interface VerseBrowserCommandsResponse {\n commands: VerseBrowserAgentCommand[];\n}\n\n/** A console / network row as the pane reports it (also what \"Send to chat\" formats). */\nexport interface VerseBrowserConsoleEntry {\n t: number;\n level: 'log' | 'info' | 'warn' | 'error' | 'debug';\n text: string;\n}\n\nexport interface VerseBrowserNetworkEntry {\n t: number;\n method: string;\n url: string;\n /** null = the request never got a response (DNS, CORS, offline, blocked). */\n status: number | null;\n error?: string;\n}\n\n/** The pane's answer to one command. `data` shape depends on the op (see browser-bridge.ts). */\nexport interface VerseBrowserCommandResult {\n id: string;\n ok: boolean;\n /** The page the answer describes — the sidecar re-checks it against the gate. */\n url?: string;\n data?: unknown;\n error?: string;\n}\n\n/** A refused agent request, shown in the pane so the operator can allow the origin. */\nexport interface VerseBrowserBlockedRequest {\n url: string;\n origin: string;\n at: string;\n}\n\nexport interface VerseBrowserPolicy {\n sessionId: string;\n /** The operator switched agent access on for this chat (until Verse restarts). */\n agentAccess: boolean;\n /** Agents may click, type, select, press keys and scroll (on with access; can be switched off alone). */\n actAccess: boolean;\n /** Agents may run a JS expression in a localhost page (off until switched on). */\n scriptAccess: boolean;\n /** \"Allow for this chat\" answers given on confirmation cards, oldest first. */\n allowances: string[];\n /** Origins beyond loopback this chat's agent may open and observe. */\n allowedOrigins: string[];\n /** Recent agent requests refused because their origin is not allowed (newest first, ≤ 5). */\n blocked: VerseBrowserBlockedRequest[];\n /** Seat engines that load the browser tools when access is on. */\n toolEngines: string[];\n /** When the pane last asked for commands for this chat (ISO), or null. */\n paneSeenAt: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// The URL gate (shared by the sidecar and the pane, so they cannot disagree)\n// ---------------------------------------------------------------------------\n\nexport type BrowserUrlVerdict =\n | { ok: true; url: string; origin: string; loopback: boolean }\n | { ok: false; code: 'invalid' | 'scheme' | 'credentials' | 'self' | 'not-allowed'; origin: string | null; message: string };\n\nconst LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]']);\n\n/** localhost, 127.0.0.1, [::1] and `*.localhost` (RFC 6761 — always loopback). */\nexport function isLoopbackHost(hostname: string): boolean {\n const host = hostname.toLowerCase();\n return LOOPBACK_HOSTS.has(host) || host.endsWith('.localhost');\n}\n\nfunction defaultPort(url: URL): string {\n return url.port || (url.protocol === 'https:' ? '443' : '80');\n}\n\n/**\n * May an AGENT open (or observe) `raw` in this chat?\n *\n * - http(s) only, no `user:pass@`;\n * - never Verse itself (`versePort` on a loopback host): the pane would be\n * looking at the console that drives it;\n * - loopback (the operator's own dev servers) — allowed by default. An agent\n * that can already run `curl localhost:3000` gains nothing new here;\n * - anything else only when the operator allowed that exact origin for\n * this chat.\n *\n * The OPERATOR's own address bar is not gated by this (a browser goes where\n * its user points it) — only the Verse origin is refused there too.\n */\nexport function agentUrlVerdict(raw: string, opts: { versePort: number | null; allowedOrigins: readonly string[] }): BrowserUrlVerdict {\n let url: URL;\n if (typeof raw !== 'string' || raw.length === 0 || raw.length > 4096) {\n return { ok: false, code: 'invalid', origin: null, message: 'the URL is empty or longer than 4096 characters' };\n }\n try {\n url = new URL(raw);\n } catch {\n return { ok: false, code: 'invalid', origin: null, message: 'that is not a valid absolute URL (include http:// or https://)' };\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return { ok: false, code: 'scheme', origin: null, message: `only http and https pages can be opened (not ${url.protocol.replace(/:$/, '')})` };\n }\n if (url.username !== '' || url.password !== '') {\n return { ok: false, code: 'credentials', origin: url.origin, message: 'URLs carrying a username or password are refused' };\n }\n const loopback = isLoopbackHost(url.hostname);\n if (loopback && opts.versePort !== null && defaultPort(url) === String(opts.versePort)) {\n return { ok: false, code: 'self', origin: url.origin, message: 'Verse itself cannot be opened in its own browser pane' };\n }\n if (loopback) return { ok: true, url: url.href, origin: url.origin, loopback: true };\n if (opts.allowedOrigins.includes(url.origin)) return { ok: true, url: url.href, origin: url.origin, loopback: false };\n return {\n ok: false,\n code: 'not-allowed',\n origin: url.origin,\n message: `${url.origin} is outside this machine. Agents may only use localhost pages unless the operator allows an origin for this chat in the Browser pane (it is listed there as a blocked request).`,\n };\n}\n\n/** `https://Example.com/x?y` → `https://example.com`; null for anything that is not an http(s) origin. */\nexport function normalizeBrowserOrigin(raw: string): string | null {\n if (typeof raw !== 'string' || raw.length === 0 || raw.length > 2048) return null;\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n return null;\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return null;\n if (url.username !== '' || url.password !== '') return null;\n return url.origin;\n}\n\n// ---------------------------------------------------------------------------\n// Console formatting (the agent's `browser_console` and the pane's \"Send to chat\")\n// ---------------------------------------------------------------------------\n\nfunction clip(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nfunction clockTime(t: number): string {\n if (!Number.isFinite(t) || t <= 0) return '--:--:--';\n const d = new Date(t);\n return Number.isNaN(d.getTime()) ? '--:--:--' : d.toISOString().slice(11, 19);\n}\n\n/**\n * Console rows and failed requests as plain text, newest last, at most\n * `limit` of each. One line per entry; multi-line messages keep their first\n * three lines. Empty sections say so rather than vanishing.\n */\nexport function formatBrowserConsole(\n consoleEntries: readonly VerseBrowserConsoleEntry[],\n network: readonly VerseBrowserNetworkEntry[],\n limit = 50,\n): string {\n const n = Math.max(1, Math.min(200, Math.floor(Number.isFinite(limit) ? limit : 50)));\n const logs = consoleEntries.slice(-n).map((e) => {\n const lines = String(e.text ?? '').split('\\n');\n const body = lines.slice(0, 3).join('\\n ') + (lines.length > 3 ? ' …' : '');\n return `[${clockTime(e.t)}] ${String(e.level ?? 'log').toUpperCase().padEnd(5)} ${clip(body, 1000)}`;\n });\n const net = network.slice(-n).map((e) => {\n const status = e.status === null || e.status === undefined ? 'FAILED' : String(e.status);\n const why = e.error ? ` — ${clip(String(e.error), 200)}` : '';\n return `[${clockTime(e.t)}] ${status} ${String(e.method ?? 'GET').toUpperCase()} ${clip(String(e.url ?? ''), 300)}${why}`;\n });\n return [\n `Console (${logs.length}${consoleEntries.length > logs.length ? ` of ${consoleEntries.length}` : ''}):`,\n ...(logs.length > 0 ? logs : [' (empty)']),\n '',\n `Network errors (${net.length}${network.length > net.length ? ` of ${network.length}` : ''}):`,\n ...(net.length > 0 ? net : [' (none)']),\n ].join('\\n');\n}\n\nconst CONSOLE_LEVELS = new Set(['log', 'info', 'warn', 'error', 'debug']);\n\n/** Boundary check for console rows crossing from a page (anything malformed is dropped). */\nexport function asConsoleEntries(value: unknown): VerseBrowserConsoleEntry[] {\n if (!Array.isArray(value)) return [];\n const out: VerseBrowserConsoleEntry[] = [];\n for (const row of value.slice(-500)) {\n if (typeof row !== 'object' || row === null) continue;\n const r = row as Record<string, unknown>;\n if (typeof r['text'] !== 'string') continue;\n const level = typeof r['level'] === 'string' && CONSOLE_LEVELS.has(r['level']) ? (r['level'] as VerseBrowserConsoleEntry['level']) : 'log';\n out.push({ t: typeof r['t'] === 'number' ? r['t'] : 0, level, text: clip(r['text'], 4000) });\n }\n return out;\n}\n\n/** Boundary check for failed-request rows crossing from a page. */\nexport function asNetworkEntries(value: unknown): VerseBrowserNetworkEntry[] {\n if (!Array.isArray(value)) return [];\n const out: VerseBrowserNetworkEntry[] = [];\n for (const row of value.slice(-500)) {\n if (typeof row !== 'object' || row === null) continue;\n const r = row as Record<string, unknown>;\n if (typeof r['url'] !== 'string') continue;\n out.push({\n t: typeof r['t'] === 'number' ? r['t'] : 0,\n method: typeof r['method'] === 'string' ? clip(r['method'], 12) : 'GET',\n url: clip(r['url'], 2000),\n status: typeof r['status'] === 'number' && Number.isInteger(r['status']) ? r['status'] : null,\n ...(typeof r['error'] === 'string' ? { error: clip(r['error'], 500) } : {}),\n });\n }\n return out;\n}\n","/**\n * routes/verse/browser/agent-runner.ts — how the Browser pane carries out\n * one agent command (core/verse/browser-mcp.ts + verse-mcp-browser-act.ts\n * queued it; browser-bridge.ts relayed it). Pure apart from the executor it\n * is handed.\n *\n * The pane re-applies the sidecar's gate BEFORE capturing or acting: a tab\n * showing a page this chat may not observe (the operator's own external\n * browsing) is never screenshotted, read, snapshotted or acted on — the\n * refusal leaves the machine, the page does not. The sidecar checks every\n * answer's URL again.\n *\n * Every op's arguments are rebuilt here from a CLOSED shape (anything else is\n * refused) before they reach the desktop shell, which validates them again.\n * While the operator has taken over the pane (they clicked or typed in it),\n * every command but `status` and `confirm` is refused until they press\n * Resume. What the sidecar decided needs the operator arrives as a `confirm`\n * command, answered by the card the executor shows.\n * A claimed command is not authority to mutate: the pane checks the sidecar\n * again immediately before each effect. An operation already dispatched after\n * that check may finish if Stop arrives while the native call is running.\n */\nimport {\n agentUrlVerdict,\n isLoopbackHost,\n type VerseBrowserAgentCommand,\n type VerseBrowserCommandResult,\n type VerseBrowserConfirmRequest,\n type VerseBrowserConsoleEntry,\n type VerseBrowserDecision,\n type VerseBrowserNetworkEntry,\n} from '../../../../core/verse/browser-types.js';\nimport type { ApprovedPage, NativeActSpec, NativeQuery } from './native-browser.js';\nimport type { BrowserScreenshot } from './send-to-chat.js';\n\nexport interface BrowserExecutorCapabilities {\n screenshot: boolean;\n text: boolean;\n console: boolean;\n /** Snapshot, resolve, act, network, evaluate (a desktop shell that implements them). */\n act: boolean;\n}\n\nexport interface BrowserClip {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface BrowserTabSummary {\n id: string;\n index: number;\n url: string | null;\n title: string | null;\n active: boolean;\n}\n\n/** What the pane exposes to the runner (BrowserPanel builds one per render). */\nexport interface BrowserExecutor {\n mode: 'native' | 'frame';\n capabilities: BrowserExecutorCapabilities;\n /** The active tab's page, or nulls when no page is open. */\n current(): { tabId: string; url: string | null; title: string | null; tabs: number };\n navigate(url: string): Promise<{ url: string; title: string | null; loading: boolean }>;\n screenshot(clip?: BrowserClip): Promise<BrowserScreenshot & { scale?: number; origin?: { x: number; y: number } }>;\n text(limit: number): Promise<{ url: string; title: string | null; text: string; truncated: boolean }>;\n console(): Promise<{ url: string; console: VerseBrowserConsoleEntry[]; network: VerseBrowserNetworkEntry[] }>;\n /** A tap query / native action in the active tab (snapshot, network, resolve, act, evaluate). */\n query(what: NativeQuery, timeoutMs: number, approved?: ApprovedPage): Promise<unknown>;\n history(direction: 'back' | 'forward'): Promise<{ url: string | null; title: string | null; loading: boolean }>;\n tabs(): BrowserTabSummary[];\n openTab(url: string | null): Promise<void>;\n selectTab(index: number): boolean;\n closeTab(index: number): boolean;\n /** Show the operator the confirmation card and wait for their answer. */\n confirm(request: VerseBrowserConfirmRequest): Promise<VerseBrowserDecision>;\n /** The operator took over the pane; the agent waits for Resume. */\n paused(): boolean;\n}\n\nconst FRAME_LIMIT =\n 'This Browser pane is running in the web UI (an embedded frame), which cannot see into or act in the page. Snapshots, screenshots, page text, console and clicking need the Ashlr desktop app. You can still open localhost pages with browser_navigate.';\nconst OLD_SHELL =\n 'This desktop app is too old to read the page structure or act in it. Ask the operator to update the Ashlr desktop app.';\nconst PAUSED =\n 'The operator took over the browser (they clicked or typed in it), so agent actions are paused. Wait until they press Resume in the Browser pane, then try again.';\nconst NOT_OBSERVABLE =\n 'The active tab shows a page this chat may not observe, so nothing was captured or done. Navigate to a localhost page, or ask the operator to allow that origin for this chat.';\n\nconst REF_RE = /^e[1-9][0-9]{0,6}$/;\nconst SIG_RE = /^[a-z0-9]{1,16}$/;\nconst MODIFIERS = new Set(['Shift', 'Alt', 'Control', 'Meta']);\n/** A native act can type 2000 characters; the sidecar waits 60 s. */\nconst ACT_TIMEOUT_MS = 55_000;\nconst QUERY_TIMEOUT_MS = 10_000;\n\n/** Verse's own port, from its page address (\"\" → the scheme default). */\nexport function versePortOf(origin: string): number | null {\n try {\n const url = new URL(origin);\n const port = Number(url.port || (url.protocol === 'https:' ? 443 : 80));\n return Number.isInteger(port) && port > 0 ? port : null;\n } catch {\n return null;\n }\n}\n\nfunction fail(id: string, error: string, url?: string | null): VerseBrowserCommandResult {\n return { id, ok: false, error, ...(url ? { url } : {}) };\n}\n\nfunction message(err: unknown): string {\n return err instanceof Error && err.message ? err.message : 'The browser could not do that.';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction int(value: unknown, min: number, max: number): number | null {\n return typeof value === 'number' && Number.isInteger(value) && value >= min && value <= max ? value : null;\n}\n\nfunction coord(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= 100_000 ? value : null;\n}\n\nfunction refOf(value: unknown): string | null {\n return typeof value === 'string' && REF_RE.test(value) ? value : null;\n}\n\nfunction approvedPage(value: unknown): ApprovedPage | null {\n if (!isRecord(value) || !only(value, ['tab', 'url', 'origin', 'loadId'])) return null;\n const { tab, url, origin, loadId } = value;\n if (typeof tab !== 'string' || !/^[a-z0-9]{1,16}$/.test(tab)\n || typeof url !== 'string' || url.length > 4096\n || typeof origin !== 'string' || typeof loadId !== 'string' || !/^[a-z0-9A-Z]{1,40}$/.test(loadId)) return null;\n try {\n if (new URL(url).origin !== origin) return null;\n } catch { return null; }\n return { tab, url, origin, loadId };\n}\n\n// ---------------------------------------------------------------------------\n// Closed argument shapes (anything else → null → refused)\n// ---------------------------------------------------------------------------\n\nexport function parseResolveArgs(args: unknown): { ref: string } | { x: number; y: number } | { focused: true } | null {\n if (!isRecord(args)) return null;\n const keys = Object.keys(args).sort().join(',');\n if (keys === 'ref') {\n const ref = refOf(args['ref']);\n return ref ? { ref } : null;\n }\n if (keys === 'x,y') {\n const x = coord(args['x']);\n const y = coord(args['y']);\n return x !== null && y !== null ? { x, y } : null;\n }\n if (keys === 'focused' && args['focused'] === true) return { focused: true };\n return null;\n}\n\nfunction target(args: Record<string, unknown>): { ref: string } | { x: number; y: number } | null {\n if (args['ref'] !== undefined) {\n if (args['x'] !== undefined || args['y'] !== undefined) return null;\n const ref = refOf(args['ref']);\n return ref ? { ref } : null;\n }\n const x = coord(args['x']);\n const y = coord(args['y']);\n return x !== null && y !== null ? { x, y } : null;\n}\n\nfunction only(args: Record<string, unknown>, allowed: readonly string[]): boolean {\n return Object.keys(args).every((k) => allowed.includes(k));\n}\n\nfunction expectOf(args: Record<string, unknown>): { expect?: string } | null {\n if (args['expect'] === undefined) return {};\n return typeof args['expect'] === 'string' && SIG_RE.test(args['expect']) ? { expect: args['expect'] } : null;\n}\n\nexport function parseActArgs(args: unknown): NativeActSpec | null {\n if (!isRecord(args) || typeof args['kind'] !== 'string') return null;\n const expect = expectOf(args);\n if (!expect) return null;\n switch (args['kind']) {\n case 'click': {\n if (!only(args, ['kind', 'ref', 'x', 'y', 'button', 'double', 'modifiers', 'expect'])) return null;\n const t = target(args);\n if (!t) return null;\n const button = args['button'];\n if (button !== undefined && button !== 'left' && button !== 'right') return null;\n if (args['double'] !== undefined && typeof args['double'] !== 'boolean') return null;\n const mods = args['modifiers'];\n if (mods !== undefined && (!Array.isArray(mods) || mods.length > 4 || new Set(mods).size !== mods.length || mods.some((m) => typeof m !== 'string' || !MODIFIERS.has(m)))) return null;\n return {\n kind: 'click', ...t, ...expect,\n ...(button === 'right' ? { button: 'right' as const } : {}),\n ...(args['double'] === true ? { double: true } : {}),\n ...(Array.isArray(mods) && mods.length ? { modifiers: mods as string[] } : {}),\n };\n }\n case 'type': {\n if (!only(args, ['kind', 'ref', 'text', 'submit', 'clear', 'expect'])) return null;\n const ref = refOf(args['ref']);\n const text = args['text'];\n if (!ref || typeof text !== 'string' || text.length === 0 || [...text].length > 2000) return null;\n if ((args['submit'] !== undefined && typeof args['submit'] !== 'boolean') || (args['clear'] !== undefined && typeof args['clear'] !== 'boolean')) return null;\n return { kind: 'type', ref, text, ...expect, ...(args['submit'] === true ? { submit: true } : {}), ...(args['clear'] === true ? { clear: true } : {}) };\n }\n case 'select': {\n if (!only(args, ['kind', 'ref', 'values', 'expect'])) return null;\n const ref = refOf(args['ref']);\n const values = args['values'];\n if (!ref || !Array.isArray(values) || values.length === 0 || values.length > 50 || values.some((v) => typeof v !== 'string' || v.length > 200)) return null;\n return { kind: 'select', ref, values: values as string[], ...expect };\n }\n case 'hover': {\n if (!only(args, ['kind', 'ref', 'x', 'y', 'expect'])) return null;\n const t = target(args);\n return t ? { kind: 'hover', ...t, ...expect } : null;\n }\n case 'key': {\n if (!only(args, ['kind', 'key'])) return null;\n const key = args['key'];\n return typeof key === 'string' && key.length > 0 && key.length <= 32 ? { kind: 'key', key } : null;\n }\n case 'scroll': {\n if (!only(args, ['kind', 'ref', 'direction', 'amount', 'expect'])) return null;\n const ref = args['ref'] === undefined ? null : refOf(args['ref']);\n if (args['ref'] !== undefined && !ref) return null;\n const direction = args['direction'];\n if (direction !== undefined && direction !== 'up' && direction !== 'down' && direction !== 'left' && direction !== 'right') return null;\n if (!ref && direction === undefined) return null;\n const amount = args['amount'];\n if (amount !== undefined && (typeof amount !== 'number' || !Number.isFinite(amount) || amount < 1 || amount > 20_000)) return null;\n return {\n kind: 'scroll', ...expect,\n ...(ref ? { ref } : {}),\n ...(direction ? { direction: direction as 'up' | 'down' | 'left' | 'right' } : {}),\n ...(typeof amount === 'number' ? { amount } : {}),\n };\n }\n default:\n return null;\n }\n}\n\nfunction parseClip(value: unknown): BrowserClip | null | undefined {\n if (value === undefined) return undefined;\n if (!isRecord(value) || !only(value, ['x', 'y', 'width', 'height'])) return null;\n const x = coord(value['x']);\n const y = coord(value['y']);\n const w = coord(value['width']);\n const h = coord(value['height']);\n return x !== null && y !== null && w !== null && h !== null && w >= 1 && h >= 1 ? { x, y, width: w, height: h } : null;\n}\n\nexport function parseConfirmArgs(args: unknown): VerseBrowserConfirmRequest | null {\n if (!isRecord(args)) return null;\n const s = (key: string, max: number): string | null => (typeof args[key] === 'string' ? (args[key] as string).slice(0, max) : null);\n const action = s('action', 200);\n const origin = s('origin', 300);\n const tool = s('tool', 60);\n const expiresAt = s('expiresAt', 40);\n const reasons = Array.isArray(args['reasons']) ? args['reasons'].filter((r): r is string => typeof r === 'string').slice(0, 8).map((r) => r.slice(0, 300)) : null;\n if (!action || !origin || !tool || !expiresAt || !reasons) return null;\n const target = args['target'] === null || args['target'] === undefined ? null : s('target', 200);\n return { action, origin, tool, expiresAt, reasons, target };\n}\n\n// ---------------------------------------------------------------------------\n// The runner\n// ---------------------------------------------------------------------------\n\nconst NEEDS_PAGE = new Set(['screenshot', 'read-text', 'console', 'snapshot', 'network', 'resolve', 'act', 'evaluate']);\nconst NEEDS_ACT = new Set(['snapshot', 'network', 'resolve', 'act', 'evaluate']);\n\nexport async function executeAgentCommand(\n command: VerseBrowserAgentCommand,\n exec: BrowserExecutor,\n verseOrigin: string,\n canDispatch: (id: string) => Promise<boolean>,\n): Promise<VerseBrowserCommandResult> {\n const gate = { versePort: versePortOf(verseOrigin), allowedOrigins: command.allowedOrigins };\n const here = exec.current();\n const observable = here.url !== null && agentUrlVerdict(here.url, gate).ok;\n const args = isRecord(command.args) ? command.args : {};\n const seen = (url: unknown): boolean => typeof url === 'string' && agentUrlVerdict(url, gate).ok;\n\n if (command.op !== 'status' && command.op !== 'confirm' && exec.paused()) return fail(command.id, PAUSED);\n\n try {\n if (NEEDS_PAGE.has(command.op)) {\n if (exec.mode === 'frame') return fail(command.id, FRAME_LIMIT);\n if (NEEDS_ACT.has(command.op) && !exec.capabilities.act) return fail(command.id, OLD_SHELL);\n if (!here.url) return fail(command.id, 'No page is open in the Browser pane. Open one with browser_navigate first.');\n if (!observable) return fail(command.id, NOT_OBSERVABLE);\n }\n\n switch (command.op) {\n case 'status': {\n let loadId: string | null = null;\n if (observable && exec.mode === 'native' && exec.capabilities.act && !exec.paused()) {\n try {\n const info = exec.current();\n const page = await exec.query('info', QUERY_TIMEOUT_MS);\n const record = isRecord(page) ? page : {};\n if (info.tabId === here.tabId && info.url === here.url && record['url'] === here.url && typeof record['loadId'] === 'string') {\n loadId = record['loadId'];\n }\n } catch { /* Status still reports the pane; actions require a page identity. */ }\n }\n return {\n id: command.id,\n ok: true,\n // A page the agent may not observe is not even named.\n ...(observable && here.url ? { url: here.url } : {}),\n data: {\n title: observable ? here.title : null,\n hidden: here.url !== null && !observable,\n native: exec.mode === 'native',\n capabilities: exec.capabilities,\n tabs: here.tabs,\n paused: exec.paused(),\n tabId: here.tabId,\n loadId,\n },\n };\n }\n\n case 'navigate': {\n const verdict = agentUrlVerdict(command.url ?? '', gate);\n if (!verdict.ok) return fail(command.id, verdict.message);\n if (!(await canDispatch(command.id))) return fail(command.id, 'This browser turn ended before navigation could start.');\n const landed = await exec.navigate(verdict.url);\n return { id: command.id, ok: true, url: landed.url, data: { title: seen(landed.url) ? landed.title : null, loading: landed.loading } };\n }\n\n case 'screenshot': {\n if (!exec.capabilities.screenshot) return fail(command.id, 'This desktop shell cannot take screenshots on this platform (macOS only for now).');\n const clip = parseClip(args['clip']);\n if (clip === null) return fail(command.id, 'That screenshot area is not valid.');\n const shot = await exec.screenshot(clip);\n // The page may have moved on while the snapshot was taken.\n const now = exec.current().url;\n if (!seen(now)) return fail(command.id, NOT_OBSERVABLE);\n return { id: command.id, ok: true, url: now!, data: shot };\n }\n\n case 'read-text': {\n const limit = Math.max(500, Math.min(50_000, command.limit ?? 20_000));\n const read = await exec.text(limit);\n if (!seen(read.url)) return fail(command.id, 'The page changed to one this chat may not observe while it was being read.');\n return { id: command.id, ok: true, url: read.url, data: { title: read.title, text: read.text, truncated: read.truncated } };\n }\n\n case 'console': {\n const logs = await exec.console();\n if (!seen(logs.url)) return fail(command.id, 'The page changed to one this chat may not observe while it was being read.');\n const limit = Math.max(1, Math.min(200, command.limit ?? 50));\n return { id: command.id, ok: true, url: logs.url, data: { console: logs.console.slice(-limit), network: logs.network.slice(-limit) } };\n }\n\n case 'snapshot': {\n if (!only(args, ['maxNodes', 'rootRef'])) return fail(command.id, 'Invalid snapshot arguments.');\n const maxNodes = args['maxNodes'] === undefined ? 400 : int(args['maxNodes'], 20, 2000);\n const rootRef = args['rootRef'] === undefined ? undefined : refOf(args['rootRef']);\n if (maxNodes === null || rootRef === null) return fail(command.id, 'Invalid snapshot arguments.');\n const data = await exec.query({ snapshot: { max_nodes: maxNodes, ...(rootRef ? { root_ref: rootRef } : {}) } }, QUERY_TIMEOUT_MS);\n return answer(command.id, data, seen);\n }\n\n case 'network': {\n const limit = args['limit'] === undefined ? 100 : int(args['limit'], 1, 500);\n if (limit === null || !only(args, ['limit'])) return fail(command.id, 'Invalid network arguments.');\n return answer(command.id, await exec.query({ network: { limit } }, QUERY_TIMEOUT_MS), seen);\n }\n\n case 'resolve': {\n const resolved = parseResolveArgs(args);\n if (!resolved) return fail(command.id, 'Invalid element target.');\n return answer(command.id, await exec.query({ resolve: resolved }, QUERY_TIMEOUT_MS), seen);\n }\n\n case 'act': {\n const approved = approvedPage(args['approved']);\n const { approved: _approved, ...rawSpec } = args;\n const spec = parseActArgs(rawSpec);\n if (!spec || !approved) return fail(command.id, 'Invalid action or missing approved page identity.');\n if (approved.tab !== here.tabId || approved.url !== here.url) return fail(command.id, 'The approved tab or page changed before the action.');\n if (!(await canDispatch(command.id))) return fail(command.id, 'This browser turn ended before the action could start.');\n const data = await exec.query({ act: spec }, ACT_TIMEOUT_MS, approved);\n const record = isRecord(data) ? data : {};\n // An action can take the page somewhere this chat may not observe:\n // say so without naming it.\n if (typeof record['url'] === 'string' && !seen(record['url'])) {\n return { id: command.id, ok: true, url: here.url!, data: { kind: spec.kind, left: true } };\n }\n return { id: command.id, ok: true, url: typeof record['url'] === 'string' ? record['url'] : here.url!, data: record };\n }\n\n case 'evaluate': {\n const expression = args['expression'];\n const approved = approvedPage(args['approved']);\n if (typeof expression !== 'string' || expression.length === 0 || expression.length > 10_000 || !only(args, ['expression', 'approved']) || !approved) {\n return fail(command.id, 'Invalid expression.');\n }\n try {\n if (!isLoopbackHost(new URL(here.url!).hostname)) return fail(command.id, 'Scripts only run on localhost pages.');\n } catch {\n return fail(command.id, 'Scripts only run on localhost pages.');\n }\n if (approved.tab !== here.tabId || approved.url !== here.url) return fail(command.id, 'The approved tab or page changed before the script.');\n if (!(await canDispatch(command.id))) return fail(command.id, 'This browser turn ended before the script could start.');\n const data = await exec.query({ evaluate: { expression } }, 15_000, approved);\n return { id: command.id, ok: true, url: here.url!, data };\n }\n\n case 'tabs': {\n const action = args['action'];\n if (!only(args, ['action', 'index', 'url'])) return fail(command.id, 'Invalid tabs arguments.');\n if (action === 'new') {\n let url: string | null = null;\n if (args['url'] !== undefined) {\n const verdict = agentUrlVerdict(typeof args['url'] === 'string' ? args['url'] : '', gate);\n if (!verdict.ok) return fail(command.id, verdict.message);\n url = verdict.url;\n }\n if (!(await canDispatch(command.id))) return fail(command.id, 'This browser turn ended before the tab could change.');\n await exec.openTab(url);\n } else if (action === 'select' || action === 'close') {\n const index = int(args['index'], 0, 31);\n if (index === null) return fail(command.id, 'Invalid tab index.');\n const tab = exec.tabs()[index];\n if (!tab) return fail(command.id, `There is no tab ${index}.`);\n if (tab.url !== null && !seen(tab.url)) {\n return fail(command.id, 'That tab shows a page outside this action\\'s allowed origins; only the operator can switch to or close it.');\n }\n if (!(await canDispatch(command.id))) return fail(command.id, 'This browser turn ended before the tab could change.');\n // The dispatch check crosses an async boundary. Re-read the tab\n // immediately before changing it so a newly remote page, or a tab\n // that moved into this index, cannot inherit the old approval.\n const fresh = exec.tabs()[index];\n if (!fresh || fresh.id !== tab.id || fresh.url !== tab.url || (fresh.url !== null && !seen(fresh.url))) {\n return fail(command.id, 'That tab changed before the action; list tabs again.');\n }\n if (!(action === 'select' ? exec.selectTab(index) : exec.closeTab(index))) return fail(command.id, `Tab ${index} could not be ${action === 'select' ? 'selected' : 'closed'}.`);\n } else if (action !== 'list') {\n return fail(command.id, 'Invalid tabs action.');\n }\n const tabs = exec.tabs().map((t) => (t.url !== null && !seen(t.url) ? { ...t, url: null, title: null, hidden: true } : t));\n return { id: command.id, ok: true, data: { tabs } };\n }\n\n case 'history': {\n // The native webview cannot reveal its next history URL before taking\n // the step, so no origin gate could run before navigation.\n return fail(command.id, 'Agent history is unavailable until the destination can be verified. Open a known URL instead.');\n }\n\n case 'confirm': {\n const request = parseConfirmArgs(args);\n if (!request) return fail(command.id, 'Invalid confirmation request.');\n const decision = await exec.confirm(request);\n return { id: command.id, ok: true, data: { decision } };\n }\n\n default:\n return fail(command.id, 'Unknown browser command.');\n }\n } catch (err) {\n return fail(command.id, message(err));\n }\n}\n\n/** A tap answer that names its page: only forwarded when the page is observable. */\nfunction answer(id: string, data: unknown, seen: (url: unknown) => boolean): VerseBrowserCommandResult {\n const record = isRecord(data) ? data : {};\n if (!seen(record['url'])) return fail(id, 'The page changed to one this chat may not observe while it was being read.');\n return { id, ok: true, url: record['url'] as string, data: record };\n}\n","/**\n * routes/verse/browser/browser-address.ts — what the Browser pane's address\n * bar does with what the operator typed. Pure; no React.\n *\n * 5173, :5173 → http://localhost:5173/\n * localhost:3000/x, 127.0.0.1 → http://… (loopback)\n * app.localhost:3000 → http://… (RFC 6761: always loopback)\n * example.com/path → https://example.com/path\n * http(s)://… → as typed\n * two words → a web search (DuckDuckGo)\n * javascript:, file:, data:… → invalid\n * Verse's own address → refused (\"self\"): the pane would be showing\n * the console that drives it.\n *\n * `frameable` is the plain-browser fallback's rule: the Verse page's CSP\n * lets it frame `http://localhost:*` and `http://127.0.0.1:*` and nothing\n * else (core/web/server.ts), and most real sites forbid framing anyway\n * (X-Frame-Options), so everything else is offered as \"Open externally\".\n */\nimport { isLoopbackHost } from '../../../../core/verse/browser-types.js';\nimport { isLoopbackPreviewUrl } from '../../../../core/verse/workbench-types.js';\n\nexport type BrowserAddress =\n | { kind: 'url'; url: string; loopback: boolean; frameable: boolean }\n | { kind: 'self'; url: string }\n | { kind: 'invalid'; reason: string };\n\nexport const SEARCH_URL = 'https://duckduckgo.com/?q=';\n\nfunction portOf(url: URL): string {\n return url.port || (url.protocol === 'https:' ? '443' : '80');\n}\n\n/** True when `url` points at the Verse server this page came from. */\nexport function isVerseAddress(url: URL, verseOrigin: string): boolean {\n let verse: URL;\n try {\n verse = new URL(verseOrigin);\n } catch {\n return false;\n }\n if (!isLoopbackHost(verse.hostname) || !isLoopbackHost(url.hostname)) return url.origin === verse.origin;\n return portOf(url) === portOf(verse);\n}\n\nexport function parseBrowserAddress(input: string, verseOrigin: string): BrowserAddress {\n const raw = input.trim();\n if (raw.length === 0) return { kind: 'invalid', reason: 'Type an address, like localhost:5173.' };\n if (raw.length > 2048) return { kind: 'invalid', reason: 'That address is too long.' };\n\n let candidate: string;\n if (/^:?\\d{2,5}$/.test(raw)) {\n candidate = `http://localhost:${raw.replace(':', '')}/`;\n } else if (/^(?:localhost|127\\.0\\.0\\.1|\\[::1\\]|[\\w-]+\\.localhost)(?::\\d{1,5})?(?:[/?#].*)?$/i.test(raw)) {\n candidate = `http://${raw}`;\n } else if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(raw) || /^(?:javascript|data|file|about|blob|vbscript):/i.test(raw)) {\n candidate = raw;\n } else if (/\\s/.test(raw) || !/^[\\w-]+(?:\\.[\\w-]+)+(?::\\d{1,5})?(?:[/?#]\\S*)?$/.test(raw)) {\n // Words, not an address: search for them (a browser, not a URL validator).\n return { kind: 'url', url: `${SEARCH_URL}${encodeURIComponent(raw)}`, loopback: false, frameable: false };\n } else {\n candidate = `https://${raw}`;\n }\n\n let url: URL;\n try {\n url = new URL(candidate);\n } catch {\n return { kind: 'invalid', reason: 'That is not an address this browser can open.' };\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return { kind: 'invalid', reason: 'Only http and https pages open here.' };\n }\n if (url.username || url.password) return { kind: 'invalid', reason: 'Addresses with a username or password are refused.' };\n if (isVerseAddress(url, verseOrigin)) return { kind: 'self', url: url.href };\n const loopback = isLoopbackHost(url.hostname);\n return { kind: 'url', url: url.href, loopback, frameable: isLoopbackPreviewUrl(url.href) };\n}\n\n/** \"localhost:5173/admin\" / \"example.com/docs\" — for tab titles and the history list. */\nexport function shortAddress(href: string): string {\n try {\n const url = new URL(href);\n const path = url.pathname === '/' ? '' : url.pathname;\n return `${url.host}${path}${url.search}`;\n } catch {\n return href;\n }\n}\n\n/** The origin of an http(s) URL, or null. */\nexport function originOf(href: string): string | null {\n try {\n const url = new URL(href);\n return url.protocol === 'http:' || url.protocol === 'https:' ? url.origin : null;\n } catch {\n return null;\n }\n}\n","/**\n * routes/verse/browser/browser-geometry.ts — where the page goes inside the\n * pane: device presets, zoom steps, and the rectangle handed to the native\n * webview. Pure.\n *\n * The native webview is a separate window laid over the Verse window, so it\n * is positioned in the Verse page's viewport coordinates (CSS px from the\n * top-left of the window's web content — `getBoundingClientRect()`), and\n * native adds the window's own screen position.\n */\n\nexport type DevicePreset = 'fill' | 'desktop' | 'tablet' | 'mobile';\n\nexport const DEVICE_SIZES: Readonly<Record<Exclude<DevicePreset, 'fill'>, { width: number; height: number; label: string }>> = {\n desktop: { width: 1280, height: 800, label: 'Desktop 1280 × 800' },\n tablet: { width: 820, height: 1180, label: 'Tablet 820 × 1180' },\n mobile: { width: 390, height: 844, label: 'Phone 390 × 844' },\n};\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * The page's rectangle inside `stage` for a preset: the preset's size,\n * centred, never larger than the stage (a phone in a short pane scrolls\n * inside the page rather than spilling over the chat).\n */\nexport function frameRect(stage: Rect, device: DevicePreset): Rect {\n if (device === 'fill') return roundRect(stage);\n const size = DEVICE_SIZES[device];\n const width = Math.min(size.width, stage.width);\n const height = Math.min(size.height, stage.height);\n return roundRect({\n x: stage.x + (stage.width - width) / 2,\n y: stage.y + (stage.height - height) / 2,\n width,\n height,\n });\n}\n\nexport function roundRect(r: Rect): Rect {\n const x = Math.round(r.x);\n const y = Math.round(r.y);\n return { x, y, width: Math.max(1, Math.round(r.x + r.width) - x), height: Math.max(1, Math.round(r.y + r.height) - y) };\n}\n\nexport function sameRect(a: Rect | null, b: Rect | null): boolean {\n return !!a && !!b && a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n/** A rectangle the native side will accept (finite, positive, on screen). */\nexport function isUsableRect(r: Rect): boolean {\n return [r.x, r.y, r.width, r.height].every(Number.isFinite) && r.width >= 40 && r.height >= 40;\n}\n\nexport const ZOOM_STEPS: readonly number[] = [0.5, 0.67, 0.75, 0.8, 0.9, 1, 1.1, 1.25, 1.5, 1.75, 2];\n\nexport function stepZoom(current: number, direction: -1 | 1): number {\n const index = ZOOM_STEPS.findIndex((z) => Math.abs(z - current) < 0.001);\n if (index < 0) return 1;\n return ZOOM_STEPS[Math.max(0, Math.min(ZOOM_STEPS.length - 1, index + direction))]!;\n}\n\nexport function zoomLabel(zoom: number): string {\n return `${Math.round(zoom * 100)}%`;\n}\n","/**\n * routes/verse/browser/browser-icons.tsx — the Browser pane's 16px glyphs.\n * Same grammar as components/primitives/icons.tsx (16-unit box, 1.5 stroke,\n * round caps, currentColor, decorative), kept local so the pane owns them.\n */\nimport type { ReactNode, SVGProps } from 'react';\n\nexport interface GlyphProps extends Omit<SVGProps<SVGSVGElement>, 'children' | 'viewBox'> {\n size?: number;\n}\n\nfunction Glyph({ size = 16, children, ...rest }: GlyphProps & { children: ReactNode }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}\n strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\" {...rest}>\n {children}\n </svg>\n );\n}\n\nexport const BackGlyph = (p: GlyphProps) => <Glyph {...p}><path d=\"M13 8H3.5M7.5 4 3.5 8l4 4\" /></Glyph>;\nexport const ForwardGlyph = (p: GlyphProps) => <Glyph {...p}><path d=\"M3 8h9.5M8.5 4l4 4-4 4\" /></Glyph>;\nexport const ReloadGlyph = (p: GlyphProps) => <Glyph {...p}><path d=\"M13 3.5v3h-3\" /><path d=\"M12.6 6.5A5 5 0 1 0 13 9\" /></Glyph>;\nexport const GlobeGlyph = (p: GlyphProps) => (\n <Glyph {...p}><circle cx=\"8\" cy=\"8\" r=\"5.75\" /><path d=\"M2.25 8h11.5M8 2.25c1.6 1.7 2.4 3.6 2.4 5.75S9.6 12.05 8 13.75C6.4 12.05 5.6 10.15 5.6 8S6.4 3.95 8 2.25Z\" /></Glyph>\n);\nexport const CameraGlyph = (p: GlyphProps) => (\n <Glyph {...p}><path d=\"M2.25 5.25h2.5l1.25-1.75h4l1.25 1.75h2.5v7.25H2.25Z\" /><circle cx=\"8\" cy=\"8.75\" r=\"2.25\" /></Glyph>\n);\nexport const PickGlyph = (p: GlyphProps) => (\n <Glyph {...p}><path d=\"M2.75 2.75h4M2.75 2.75v4M13.25 6.75v-4h-4M2.75 9.25v4h4\" /><path d=\"m8.5 8.5 5 1.9-2.1.9-.9 2.1Z\" /></Glyph>\n);\nexport const ConsoleGlyph = (p: GlyphProps) => (\n <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"m4.5 6.25 2 1.75-2 1.75M8.25 10h3\" /></Glyph>\n);\nexport const SendGlyph = (p: GlyphProps) => <Glyph {...p}><path d=\"M13.75 2.25 6.9 9.1M13.75 2.25 9.5 13.75 6.9 9.1 2.25 6.5Z\" /></Glyph>;\nexport const ExternalGlyph = (p: GlyphProps) => <Glyph {...p}><path d=\"M9.5 2.75h3.75V6.5M13.25 2.75 7.5 8.5M11.25 9.5v3.75h-8.5v-8.5H6.5\" /></Glyph>;\nexport const DesktopGlyph = (p: GlyphProps) => <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"8.5\" rx=\"1\" /><path d=\"M5.5 13.75h5M8 11.25v2.5\" /></Glyph>;\nexport const TabletGlyph = (p: GlyphProps) => <Glyph {...p}><rect x=\"3.25\" y=\"1.75\" width=\"9.5\" height=\"12.5\" rx=\"1.25\" /><path d=\"M7.25 12h1.5\" /></Glyph>;\nexport const PhoneGlyph = (p: GlyphProps) => <Glyph {...p}><rect x=\"4.75\" y=\"1.75\" width=\"6.5\" height=\"12.5\" rx=\"1.25\" /><path d=\"M7.25 12h1.5\" /></Glyph>;\nexport const FillGlyph = (p: GlyphProps) => <Glyph {...p}><path d=\"M2.75 6V2.75H6M10 2.75h3.25V6M13.25 10v3.25H10M6 13.25H2.75V10\" /></Glyph>;\nexport const ServerGlyph = (p: GlyphProps) => (\n <Glyph {...p}><rect x=\"2.25\" y=\"2.75\" width=\"11.5\" height=\"4.25\" rx=\"1\" /><rect x=\"2.25\" y=\"9\" width=\"11.5\" height=\"4.25\" rx=\"1\" /><path d=\"M4.75 4.9h.01M4.75 11.1h.01\" /></Glyph>\n);\nexport const ShieldGlyph = (p: GlyphProps) => <Glyph {...p}><path d=\"M8 1.75 13 3.75v4c0 3-2.1 5.3-5 6.5-2.9-1.2-5-3.5-5-6.5v-4Z\" /></Glyph>;\n","/**\n * routes/verse/browser/browser-queries.ts — the Browser pane's calls to the\n * sidecar (core/verse/browser-api.ts). Same conventions as the composer's:\n * writes pull the held mutation token and throw `VerseMutationLockedError`\n * when none is held; reads carry the read-client proof.\n *\n * Everything is injectable (`BrowserApi`) so the panel's tests run on fakes.\n */\nimport { getMutationToken, hasMutationHold, touchMutationHold } from '../../../data/auth-store.js';\nimport { apiGet, apiPost } from '../../../data/client.js';\nimport {\n VERSE_BROWSER_ACCESS_PATH,\n VERSE_BROWSER_ALLOWANCE_PATH,\n VERSE_BROWSER_ALLOW_PATH,\n VERSE_BROWSER_COMMANDS_PATH,\n VERSE_BROWSER_DISPATCH_PATH,\n VERSE_BROWSER_POLICY_PATH,\n VERSE_BROWSER_RESULT_PATH,\n type VerseBrowserCommandResult,\n type VerseBrowserCommandsResponse,\n type VerseBrowserPolicy,\n type VerseBrowserScope,\n} from '../../../../core/verse/browser-types.js';\nimport type { VersePreviewTargetsResponse } from '../../../../core/verse/workbench-types.js';\nimport { VERSE_PREVIEW_TARGETS_PATH } from '../../../../core/verse/workbench-types.js';\nimport type { VerseAttachment, VerseAttachmentUpload } from '../../../../core/verse/workbench-types.js';\nimport { uploadAttachment } from '../composer/composer-queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport interface BrowserApi {\n policy(sessionId: string, signal?: AbortSignal): Promise<VerseBrowserPolicy>;\n /** Switch agent access (scope `browser`, the whole grant) or one of its parts. */\n setAccess(sessionId: string, enabled: boolean, scope?: VerseBrowserScope): Promise<VerseBrowserPolicy>;\n /** Forget one \"Allow for this chat\" answer. */\n revokeAllowance(sessionId: string, key: string): Promise<VerseBrowserPolicy>;\n allowOrigin(sessionId: string, origin: string, allowed: boolean): Promise<VerseBrowserPolicy>;\n /** The long-poll. Resolves [] after the server's wait. */\n commands(sessionId: string, signal?: AbortSignal): Promise<VerseBrowserCommandsResponse>;\n /** Recheck a claimed command's live authority immediately before an effect. */\n canDispatch(sessionId: string, id: string): Promise<boolean>;\n result(sessionId: string, result: VerseBrowserCommandResult): Promise<void>;\n /** Dev servers found for the chat's folders (the Preview pane's discovery). */\n targets(sessionId: string, signal?: AbortSignal): Promise<VersePreviewTargetsResponse>;\n attach(sessionId: string, upload: VerseAttachmentUpload): Promise<VerseAttachment>;\n /** True when a mutation token is held (agent commands can be answered). */\n canWrite(): boolean;\n}\n\nconst q = (params: Record<string, string>): string => new URLSearchParams(params).toString();\n\nasync function post<T>(path: string, body: unknown, signal?: AbortSignal): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const result = await apiPost<T>(path, body, token, signal);\n touchMutationHold();\n return result;\n}\n\nexport const browserApi: BrowserApi = {\n policy: (sessionId, signal) => apiGet(`${VERSE_BROWSER_POLICY_PATH}?${q({ sessionId })}`, signal),\n setAccess: (sessionId, enabled, scope) => post(VERSE_BROWSER_ACCESS_PATH, { sessionId, enabled, ...(scope && scope !== 'browser' ? { scope } : {}) }),\n revokeAllowance: (sessionId, key) => post(VERSE_BROWSER_ALLOWANCE_PATH, { sessionId, key }),\n allowOrigin: (sessionId, origin, allowed) => post(VERSE_BROWSER_ALLOW_PATH, { sessionId, origin, allowed }),\n commands: (sessionId, signal) => apiGet(`${VERSE_BROWSER_COMMANDS_PATH}?${q({ sessionId })}`, signal),\n canDispatch: async (sessionId, id) => (await post<{ allowed: boolean }>(VERSE_BROWSER_DISPATCH_PATH, { sessionId, id })).allowed === true,\n result: async (sessionId, result) => {\n await post(VERSE_BROWSER_RESULT_PATH, { sessionId, ...result });\n },\n targets: (sessionId, signal) => apiGet(`${VERSE_PREVIEW_TARGETS_PATH}?${q({ sessionId })}`, signal),\n attach: (sessionId, upload) => uploadAttachment(sessionId, upload),\n canWrite: () => hasMutationHold(),\n};\n","/**\n * routes/verse/browser/browser-tabs.ts — the Browser pane's tab model. Pure\n * (a reducer plus its storage codec), so the panel stays a view.\n *\n * A tab is a page address plus a history of the addresses opened IN THIS\n * PANE. In the desktop app the native webview keeps its own real history\n * (back/forward go to it, and its `nav` events update `url`); in the iframe\n * fallback a cross-origin frame's history is unreadable, so back/forward\n * walk this list instead — the same compromise as the Preview pane.\n *\n * Tab ids are `t<n>`: they name native windows (`browser-<id>`), whose label\n * rule is `^[a-z0-9]{1,16}$`.\n */\n\nexport const MAX_BROWSER_TABS = 8;\nconst MAX_HISTORY = 50;\n\nexport interface BrowserTab {\n id: string;\n /** null = the launcher (dev servers to open). */\n url: string | null;\n title: string | null;\n loading: boolean;\n history: string[];\n index: number;\n /** Bumped by Reload in the iframe fallback (a new frame element). */\n reloadKey: number;\n}\n\nexport interface BrowserTabsState {\n tabs: BrowserTab[];\n activeId: string;\n nextId: number;\n}\n\nexport type BrowserTabsAction =\n | { type: 'new-tab'; url?: string | null }\n | { type: 'close'; id: string }\n | { type: 'activate'; id: string }\n /** The operator (or an agent) opened `url` in tab `id`. */\n | { type: 'navigate'; id: string; url: string }\n /** The native webview reports where it actually is (redirects, in-page links). */\n | { type: 'native-nav'; id: string; url: string; loading: boolean }\n | { type: 'title'; id: string; title: string }\n | { type: 'step'; id: string; delta: -1 | 1 }\n | { type: 'reload'; id: string }\n | { type: 'loaded'; id: string };\n\nfunction blankTab(id: string, url: string | null = null): BrowserTab {\n return { id, url, title: null, loading: url !== null, history: url ? [url] : [], index: url ? 0 : -1, reloadKey: 0 };\n}\n\nexport function initialTabsState(): BrowserTabsState {\n return { tabs: [blankTab('t1')], activeId: 't1', nextId: 2 };\n}\n\nfunction mapTab(state: BrowserTabsState, id: string, fn: (tab: BrowserTab) => BrowserTab): BrowserTabsState {\n let changed = false;\n const tabs = state.tabs.map((tab) => {\n if (tab.id !== id) return tab;\n const next = fn(tab);\n if (next !== tab) changed = true;\n return next;\n });\n return changed ? { ...state, tabs } : state;\n}\n\nfunction pushHistory(tab: BrowserTab, url: string): BrowserTab {\n const kept = tab.history.slice(0, tab.index + 1);\n const history = [...kept, url].slice(-MAX_HISTORY);\n return { ...tab, url, loading: true, history, index: history.length - 1, title: tab.url === url ? tab.title : null };\n}\n\nexport function browserTabsReducer(state: BrowserTabsState, action: BrowserTabsAction): BrowserTabsState {\n switch (action.type) {\n case 'new-tab': {\n if (state.tabs.length >= MAX_BROWSER_TABS) return state;\n const id = `t${state.nextId}`;\n return { tabs: [...state.tabs, blankTab(id, action.url ?? null)], activeId: id, nextId: state.nextId + 1 };\n }\n case 'close': {\n const index = state.tabs.findIndex((t) => t.id === action.id);\n if (index < 0) return state;\n const tabs = state.tabs.filter((t) => t.id !== action.id);\n if (tabs.length === 0) {\n const id = `t${state.nextId}`;\n return { tabs: [blankTab(id)], activeId: id, nextId: state.nextId + 1 };\n }\n const activeId = state.activeId === action.id ? tabs[Math.min(index, tabs.length - 1)]!.id : state.activeId;\n return { ...state, tabs, activeId };\n }\n case 'activate':\n return state.tabs.some((t) => t.id === action.id) && state.activeId !== action.id ? { ...state, activeId: action.id } : state;\n case 'navigate':\n return mapTab(state, action.id, (tab) => pushHistory(tab, action.url));\n case 'native-nav':\n return mapTab(state, action.id, (tab) => {\n if (tab.url === action.url) return tab.loading === action.loading ? tab : { ...tab, loading: action.loading };\n // A redirect or an in-page link: record it where the operator is.\n const moved = pushHistory(tab, action.url);\n return { ...moved, loading: action.loading };\n });\n case 'title':\n return mapTab(state, action.id, (tab) => (tab.title === action.title ? tab : { ...tab, title: action.title }));\n case 'step':\n return mapTab(state, action.id, (tab) => {\n const index = tab.index + action.delta;\n if (index < 0 || index >= tab.history.length) return tab;\n return { ...tab, index, url: tab.history[index]!, loading: true, title: null };\n });\n case 'reload':\n return mapTab(state, action.id, (tab) => (tab.url ? { ...tab, loading: true, reloadKey: tab.reloadKey + 1 } : tab));\n case 'loaded':\n return mapTab(state, action.id, (tab) => (tab.loading ? { ...tab, loading: false } : tab));\n default:\n return state;\n }\n}\n\nexport function activeTab(state: BrowserTabsState): BrowserTab {\n return state.tabs.find((t) => t.id === state.activeId) ?? state.tabs[0]!;\n}\n\n// ---------------------------------------------------------------------------\n// Storage (per viewer, per browser profile — a convenience, never required)\n// ---------------------------------------------------------------------------\n\nexport const BROWSER_TABS_STORAGE_KEY = 'ashlr.verse.browser.v1';\n\nexport function serializeTabs(state: BrowserTabsState): string {\n return JSON.stringify({ tabs: state.tabs.map((t) => ({ id: t.id, url: t.url })), activeId: state.activeId });\n}\n\nfunction isHttpUrl(value: unknown): value is string {\n if (typeof value !== 'string' || value.length > 4096) return false;\n try {\n const url = new URL(value);\n return (url.protocol === 'http:' || url.protocol === 'https:') && !url.username && !url.password;\n } catch {\n return false;\n }\n}\n\n/** Restore saved tabs; anything malformed falls back to one empty tab. */\nexport function restoreTabs(raw: string | null): BrowserTabsState {\n if (!raw) return initialTabsState();\n try {\n const parsed = JSON.parse(raw) as { tabs?: unknown; activeId?: unknown };\n if (!Array.isArray(parsed.tabs)) return initialTabsState();\n const tabs: BrowserTab[] = [];\n let max = 0;\n for (const row of parsed.tabs.slice(0, MAX_BROWSER_TABS)) {\n if (typeof row !== 'object' || row === null) continue;\n const { id, url } = row as { id?: unknown; url?: unknown };\n if (typeof id !== 'string' || !/^t\\d{1,6}$/.test(id) || tabs.some((t) => t.id === id)) continue;\n tabs.push({ ...blankTab(id, isHttpUrl(url) ? url : null), loading: false });\n max = Math.max(max, Number(id.slice(1)));\n }\n if (tabs.length === 0) return initialTabsState();\n const activeId = typeof parsed.activeId === 'string' && tabs.some((t) => t.id === parsed.activeId) ? parsed.activeId : tabs[0]!.id;\n return { tabs, activeId, nextId: max + 1 };\n } catch {\n return initialTabsState();\n }\n}\n","/**\n * routes/verse/browser/native-browser.ts — the Browser pane's one seam to the\n * desktop shell (shell contract \"browser\" v1, desktop/src-tauri/src/\n * browser_pane.rs + shell_contract.js, documented in desktop/README.md).\n *\n * FEATURE-DETECTED, NEVER BUILD-FLAGGED. The same bundle runs in three places:\n * 1. a desktop shell that implements the browser contract →\n * `window.__ASHLR_DESKTOP__.browser.version >= 1`: real native webviews\n * (any site, screenshots on macOS, console, element picker);\n * 2. an OLDER desktop shell (installed before `ship:local -- --native`) →\n * `__ASHLR_DESKTOP__` exists but has no `browser`: iframe fallback;\n * 3. a plain browser tab on `ashlr verse` → no bridge: iframe fallback.\n * `nativeBrowser()` answers which, at call time, and returns null for 2 and 3.\n *\n * PROTOCOL. The page sends a closed set of ops (`send`); native answers with\n * `ashlr:browser` window events. Requests that expect an answer carry a\n * `req` id and resolve through `request()` (or time out). Native never runs\n * page-supplied script in a tab: `query` names one fixed tap function, and\n * its arguments travel as JSON that native re-validates against closed\n * shapes (browser_pane.rs). The one exception, `evaluate`, is loopback-only\n * and needs the operator's per-chat \"scripts\" switch upstream.\n *\n * ACTING (`act` capability, macOS): `{ act: { kind, … } }` makes native\n * synthesise real mouse / key events into the tab's webview at the element\n * the tap located — the page sees trusted input, exactly as if the operator\n * had clicked. Native reports genuine operator input in a tab as an\n * `operator` event, which pauses the agent (BrowserPanel).\n */\n\nexport const NATIVE_BROWSER_EVENT = 'ashlr:browser';\nexport const NATIVE_BROWSER_MIN_VERSION = 1;\n\nexport interface NativeBrowserCapabilities {\n screenshot: boolean;\n picker: boolean;\n console: boolean;\n text: boolean;\n /** Snapshot, resolve, act (synthesised input) and evaluate — a shell that implements them. */\n act: boolean;\n}\n\nexport interface Bounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** One agent action for native to perform (desktop/src-tauri/src/browser_pane.rs `ActSpec`). */\nexport type NativeActSpec =\n | { kind: 'click'; ref?: string; x?: number; y?: number; button?: 'left' | 'right'; double?: boolean; modifiers?: string[]; expect?: string }\n | { kind: 'type'; ref: string; text: string; submit?: boolean; clear?: boolean; expect?: string }\n | { kind: 'select'; ref: string; values: string[]; expect?: string }\n | { kind: 'hover'; ref?: string; x?: number; y?: number; expect?: string }\n | { kind: 'key'; key: string }\n | { kind: 'scroll'; ref?: string; direction?: 'up' | 'down' | 'left' | 'right'; amount?: number; expect?: string };\n\n/** The tab and page load the operator approved before an agent action. */\nexport interface ApprovedPage {\n tab: string;\n url: string;\n origin: string;\n loadId: string;\n}\n\nexport type NativeQuery =\n | 'text'\n | 'console'\n | 'info'\n | 'pick-start'\n | 'pick-poll'\n | 'pick-cancel'\n | 'resume'\n | { snapshot: { max_nodes?: number; root_ref?: string } }\n | { network: { limit?: number } }\n | { resolve: { ref: string } | { x: number; y: number } | { focused: true } }\n | { act: NativeActSpec }\n | { evaluate: { expression: string } };\n\nexport type NativeBrowserOp =\n | { op: 'open'; tab: string; url: string; bounds: Bounds }\n | { op: 'navigate'; tab: string; url: string }\n | { op: 'back' | 'forward' | 'reload'; tab: string }\n | { op: 'bounds'; tab: string; bounds: Bounds }\n | { op: 'hide' }\n | { op: 'close'; tab: string }\n | { op: 'zoom'; tab: string; factor: number }\n | { op: 'query'; tab: string; req: string; what: NativeQuery; approved?: ApprovedPage }\n | { op: 'screenshot'; tab: string; req: string; clip?: Bounds }\n | { op: 'external'; url: string };\n\nexport type NativeBrowserEvent =\n | { kind: 'nav'; tab: string; url: string; loading: boolean }\n | { kind: 'title'; tab: string; title: string }\n | { kind: 'blocked'; tab: string; url: string; reason: string }\n | { kind: 'closed'; tab: string }\n /** Genuine operator input (a click or key press) reached a tab — never the agent's synthesised input. */\n | { kind: 'operator'; tab: string }\n | { kind: 'result'; req: string; ok: true; data: unknown }\n | { kind: 'result'; req: string; ok: false; error: string };\n\nexport interface NativeBrowser {\n version: number;\n capabilities: NativeBrowserCapabilities;\n send(op: NativeBrowserOp): boolean;\n}\n\ninterface RawBridge {\n version?: unknown;\n capabilities?: unknown;\n send?: unknown;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** The shell's browser bridge, or null (a browser tab, or a shell older than contract v1). */\nexport function nativeBrowser(win: Window = window): NativeBrowser | null {\n let raw: RawBridge | undefined;\n try {\n raw = (win as unknown as { __ASHLR_DESKTOP__?: { browser?: RawBridge } }).__ASHLR_DESKTOP__?.browser;\n } catch {\n return null;\n }\n if (!raw || typeof raw.send !== 'function') return null;\n const version = typeof raw.version === 'number' ? raw.version : 0;\n if (version < NATIVE_BROWSER_MIN_VERSION) return null;\n const caps = isRecord(raw.capabilities) ? raw.capabilities : {};\n const send = raw.send as (msg: unknown) => unknown;\n return {\n version,\n capabilities: {\n screenshot: caps['screenshot'] === true,\n picker: caps['picker'] !== false,\n console: caps['console'] !== false,\n text: caps['text'] !== false,\n act: caps['act'] === true,\n },\n send(op) {\n try {\n return send(op) === true;\n } catch {\n return false;\n }\n },\n };\n}\n\n/** Boundary check: the event crossed from native. Anything malformed is dropped. */\nexport function parseNativeBrowserEvent(detail: unknown): NativeBrowserEvent | null {\n if (!isRecord(detail) || typeof detail['kind'] !== 'string') return null;\n const tab = typeof detail['tab'] === 'string' ? detail['tab'] : null;\n switch (detail['kind']) {\n case 'nav':\n return tab && typeof detail['url'] === 'string'\n ? { kind: 'nav', tab, url: detail['url'], loading: detail['loading'] === true }\n : null;\n case 'title':\n return tab && typeof detail['title'] === 'string' ? { kind: 'title', tab, title: detail['title'].slice(0, 300) } : null;\n case 'blocked':\n return tab && typeof detail['url'] === 'string'\n ? { kind: 'blocked', tab, url: detail['url'], reason: typeof detail['reason'] === 'string' ? detail['reason'] : 'refused' }\n : null;\n case 'closed':\n return tab ? { kind: 'closed', tab } : null;\n case 'operator':\n return tab ? { kind: 'operator', tab } : null;\n case 'result': {\n if (typeof detail['req'] !== 'string') return null;\n if (detail['ok'] === true) return { kind: 'result', req: detail['req'], ok: true, data: detail['data'] };\n return { kind: 'result', req: detail['req'], ok: false, error: typeof detail['error'] === 'string' ? detail['error'] : 'failed' };\n }\n default:\n return null;\n }\n}\n\n/** Every native browser event, parsed. Returns the unsubscribe. */\nexport function subscribeNativeBrowser(handler: (event: NativeBrowserEvent) => void, win: Window = window): () => void {\n const listener = (event: Event): void => {\n const parsed = parseNativeBrowserEvent((event as CustomEvent<unknown>).detail);\n if (parsed) handler(parsed);\n };\n win.addEventListener(NATIVE_BROWSER_EVENT, listener);\n return () => win.removeEventListener(NATIVE_BROWSER_EVENT, listener);\n}\n\nlet reqCounter = 0;\n\n/**\n * Send an op that expects a `result` and wait for it. Rejects on a refused\n * send, a native error or the timeout — with a message fit for the operator.\n */\nexport function nativeRequest(\n bridge: NativeBrowser,\n build: (req: string) => Extract<NativeBrowserOp, { req: string }>,\n timeoutMs = 10_000,\n win: Window = window,\n): Promise<unknown> {\n const req = `r${Date.now().toString(36)}${(++reqCounter).toString(36)}`;\n return new Promise((resolve, reject) => {\n let done = false;\n const finish = (): void => {\n done = true;\n clearTimeout(timer);\n unsubscribe();\n };\n const unsubscribe = subscribeNativeBrowser((event) => {\n if (done || event.kind !== 'result' || event.req !== req) return;\n finish();\n if (event.ok) resolve(event.data);\n else reject(new Error(event.error === 'unsupported' ? 'This desktop shell cannot do that on this platform.' : event.error));\n }, win);\n const timer = setTimeout(() => {\n if (done) return;\n finish();\n reject(new Error('The desktop browser did not answer in time.'));\n }, timeoutMs);\n if (!bridge.send(build(req))) {\n finish();\n reject(new Error('The desktop shell refused the request.'));\n }\n });\n}\n","/**\n * routes/verse/browser/send-to-chat.ts — \"Send to chat\": what the Browser\n * pane captured, drafted into the chat's composer. Never sent — the\n * operator's press is the send (composer-bridge.ts).\n *\n * A screenshot becomes a real attachment first (POST /api/verse/attachments,\n * ≤ 8 MB, the same store the composer's paperclip uses); its `@path` ref goes\n * into the draft, which is what makes the seat read the file at turn time\n * (attachments.ts resolveAttachmentRefs). Logs, the page and a picked element\n * go in as text, fenced so a page's own backticks cannot break out.\n */\nimport type { VerseAttachment, VerseAttachmentUpload } from '../../../../core/verse/workbench-types.js';\nimport { VERSE_ATTACHMENT_MAX_BYTES } from '../../../../core/verse/workbench-types.js';\nimport {\n formatBrowserConsole,\n type VerseBrowserConsoleEntry,\n type VerseBrowserNetworkEntry,\n} from '../../../../core/verse/browser-types.js';\n\nexport interface BrowserScreenshot {\n mime: 'image/png' | 'image/jpeg';\n base64: string;\n width: number | null;\n height: number | null;\n}\n\nexport interface PickedElement {\n selector: string;\n html: string;\n text?: string;\n}\n\nexport interface BrowserCapture {\n url: string | null;\n title: string | null;\n screenshot?: BrowserScreenshot | null;\n console?: VerseBrowserConsoleEntry[] | null;\n network?: VerseBrowserNetworkEntry[] | null;\n element?: PickedElement | null;\n /** Said in the draft when part of the capture was not possible (e.g. no screenshots in a browser tab). */\n notes?: string[];\n}\n\n/** A fence longer than any backtick run inside `body`, so page text cannot close it. */\nexport function fence(body: string, lang = ''): string {\n let longest = 0;\n for (const m of body.matchAll(/`+/g)) longest = Math.max(longest, m[0].length);\n const ticks = '`'.repeat(Math.max(3, longest + 1));\n return `${ticks}${lang}\\n${body.replace(/\\s+$/, '')}\\n${ticks}`;\n}\n\n/** Approximate decoded size of a base64 payload. */\nexport function base64Bytes(b64: string): number {\n const pad = b64.endsWith('==') ? 2 : b64.endsWith('=') ? 1 : 0;\n return Math.floor((b64.length * 3) / 4) - pad;\n}\n\n/** `browser-localhost-5173-20260927-101500.png` — ASCII, the attachment store's name rules. */\nexport function screenshotName(url: string | null, mime: BrowserScreenshot['mime'], now: Date): string {\n let host = 'page';\n try {\n if (url) host = new URL(url).host.replace(/[^A-Za-z0-9.-]+/g, '-');\n } catch {\n /* keep 'page' */\n }\n const stamp = now.toISOString().replace(/[-:]/g, '').replace('T', '-').slice(0, 15);\n return `browser-${host.slice(0, 60)}-${stamp}.${mime === 'image/jpeg' ? 'jpg' : 'png'}`;\n}\n\n/** The draft text for a capture (the attachment ref, when there is one, goes first). */\nexport function buildSendToChatText(capture: BrowserCapture, attachmentRef: string | null): string {\n const parts: string[] = [];\n const where = capture.url\n ? `${capture.title ? `“${capture.title.slice(0, 120)}” — ` : ''}${capture.url}`\n : 'the Browser pane';\n parts.push(`From the Browser pane: ${where}`);\n if (attachmentRef) parts.push(`Screenshot: ${attachmentRef}`);\n if (capture.element) {\n parts.push(`Selected element \\`${capture.element.selector.replace(/`/g, '')}\\`:\\n${fence(capture.element.html, 'html')}`);\n }\n if (capture.console || capture.network) {\n parts.push(fence(formatBrowserConsole(capture.console ?? [], capture.network ?? [], 40), 'text'));\n }\n for (const note of capture.notes ?? []) parts.push(`(${note})`);\n return parts.join('\\n\\n');\n}\n\nexport interface SendToChatDeps {\n attach(sessionId: string, upload: VerseAttachmentUpload): Promise<VerseAttachment>;\n insert(sessionId: string, text: string): boolean;\n now(): Date;\n}\n\nexport type SendToChatResult =\n | { ok: true; attached: boolean }\n | { ok: false; message: string };\n\n/**\n * Upload the screenshot (if any), then draft everything into the composer.\n * A screenshot that is too large or fails to upload does not lose the rest:\n * the draft goes in with a note saying what was left out.\n */\nexport async function sendCaptureToChat(sessionId: string, capture: BrowserCapture, deps: SendToChatDeps): Promise<SendToChatResult> {\n let ref: string | null = null;\n const notes = [...(capture.notes ?? [])];\n const shot = capture.screenshot;\n if (shot) {\n if (base64Bytes(shot.base64) > VERSE_ATTACHMENT_MAX_BYTES) {\n notes.push('the screenshot was larger than 8 MB and was left out');\n } else {\n try {\n const saved = await deps.attach(sessionId, { name: screenshotName(capture.url, shot.mime, deps.now()), mime: shot.mime, dataBase64: shot.base64 });\n ref = saved.ref;\n } catch (err) {\n // A locked token is the caller's to handle (it opens the unlock dialog).\n if (err instanceof Error && err.name === 'VerseMutationLockedError') throw err;\n notes.push('the screenshot could not be attached');\n }\n }\n }\n const text = buildSendToChatText({ ...capture, notes }, ref);\n if (!deps.insert(sessionId, text)) {\n return { ok: false, message: 'No message box is open for this chat — open the chat, then send again.' };\n }\n return { ok: true, attached: ref !== null };\n}\n","/*\n * routes/verse/browser/BrowserPanel.module.css — the integrated Browser pane.\n * Tokens only (design/style-scan-310: no raw hex, no px font sizes). The tab\n * strip and toolbar follow the dock's Preview pane so the two read alike.\n */\n\n.pane {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--bg-canvas);\n color: var(--text-primary);\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: 220px;\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(--bg-canvas);\n}\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-ui);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n cursor: pointer;\n}\n.tabButton > svg { flex: none; color: var(--text-tertiary); }\n.tabButton:hover { color: var(--text-primary); }\n.tabButton:focus-visible,\n.tabClose:focus-visible,\n.noteClose:focus-visible,\n.chipAction:focus-visible,\n.zoomButton:focus-visible,\n.zoomValue: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.tabClose {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\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.newTab { align-self: center; margin: 0 var(--space-1); }\n\n.spinner {\n flex: none;\n width: var(--space-3);\n height: var(--space-3);\n border: 1.5px solid var(--border-default);\n border-top-color: var(--accent-500);\n border-radius: var(--radius-full);\n animation: spin 0.8s linear infinite;\n}\n@keyframes spin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: reduce) {\n .spinner { animation: none; }\n}\n\n/* ---- toolbar -------------------------------------------------------------- */\n\n.toolbar {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--space-2);\n flex: none;\n min-width: 0;\n min-height: calc(var(--control-h-sm) + 2 * var(--space-1));\n padding: var(--space-1) var(--space-2);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n.group {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n flex: none;\n}\n\n.addressForm {\n display: flex;\n flex: 1 1 200px;\n min-width: 0;\n}\n\n.address {\n width: 100%;\n min-width: 0;\n height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n.address:focus-visible {\n outline: none;\n border-color: var(--accent-500);\n box-shadow: var(--shadow-focus-ring);\n}\n\n.zoom {\n display: inline-flex;\n align-items: center;\n height: var(--control-h-sm);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n overflow: hidden;\n}\n.zoomButton,\n.zoomValue {\n height: 100%;\n padding: 0 var(--space-2);\n border: 0;\n background: transparent;\n color: var(--text-secondary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n cursor: pointer;\n}\n.zoomValue {\n min-width: calc(var(--space-6) * 1.5);\n font-variant-numeric: tabular-nums;\n border-left: 1px solid var(--border-subtle);\n border-right: 1px solid var(--border-subtle);\n}\n.zoomButton:hover,\n.zoomValue:hover { background: var(--bg-hover); color: var(--text-primary); }\n\n/* ---- notes and the capture tray ----------------------------------------- */\n\n.note {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n padding: var(--space-1) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-code);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.noteClose {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n margin-left: auto;\n width: calc(var(--control-h-xs) - var(--space-1));\n height: calc(var(--control-h-xs) - var(--space-1));\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n}\n.noteClose:hover { background: var(--bg-hover); color: var(--text-primary); }\n\n.tray {\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-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n overflow-x: auto;\n}\n\n.trayItem {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n margin: 0;\n padding: var(--space-1) var(--space-1) var(--space-1) var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-canvas);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.thumb {\n display: block;\n height: calc(var(--control-h-sm) * 1.5);\n width: auto;\n max-width: calc(var(--control-h-sm) * 3);\n border-radius: var(--radius-xs);\n object-fit: cover;\n}\n\n.selector {\n max-width: 240px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n}\n\n.trayHint {\n flex: none;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n}\n\n/* ---- the page ----------------------------------------------------------- */\n\n.body {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n}\n\n.stage {\n position: relative;\n flex: 1 1 auto;\n min-height: 0;\n overflow: hidden;\n background: var(--bg-code);\n}\n\n.nativeHole {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n.nativeHint {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n}\n\n.frameBox {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n}\n.frameBox[data-device='fill'] > .frame { width: 100%; height: 100%; }\n.frameBox[data-device='desktop'] > .frame { width: min(1280px, 100%); height: min(800px, 100%); }\n.frameBox[data-device='tablet'] > .frame { width: min(820px, 100%); height: min(1180px, 100%); }\n.frameBox[data-device='mobile'] > .frame { width: min(390px, 100%); height: min(844px, 100%); }\n\n.frame {\n display: block;\n border: 0;\n background: var(--bg-canvas);\n box-shadow: var(--shadow-sm);\n}\n\n.external {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--space-2);\n height: 100%;\n padding: var(--space-6);\n text-align: center;\n color: var(--text-tertiary);\n}\n.externalTitle {\n margin: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: 600;\n overflow-wrap: anywhere;\n}\n.externalBody {\n max-width: 44ch;\n margin: 0 0 var(--space-2);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.launcher {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n height: 100%;\n padding: var(--space-4);\n overflow-y: auto;\n background: var(--bg-canvas);\n}\n.launcherTitle {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: 600;\n}\n\n.servers {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.server {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n padding: var(--space-1) var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.server > svg { flex: none; color: var(--text-tertiary); }\n\n.serverLabel {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n}\n\n.serverUrl {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--text-tertiary);\n}\n\n.badge {\n flex: none;\n padding: 0 var(--space-2);\n border-radius: var(--radius-full);\n background: var(--bg-code);\n color: var(--text-tertiary);\n}\n.badge[data-running] {\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n/* ---- console drawer ------------------------------------------------------ */\n\n.devtools {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n flex: none;\n height: 34%;\n min-height: calc(var(--control-h-sm) * 4);\n padding: var(--space-2) var(--space-3);\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n overflow: hidden;\n}\n\n.devtoolsHeader {\n display: flex;\n align-items: baseline;\n gap: var(--space-3);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n font-weight: 600;\n}\n\n.logs {\n flex: 1 1 auto;\n min-height: 0;\n margin: 0;\n overflow: auto;\n color: var(--text-primary);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n/* ---- agent access -------------------------------------------------------- */\n\n.agent {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\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}\n\n.agentRow {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--space-2);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n}\n.agentRow > svg { flex: none; color: var(--text-tertiary); }\n\n.agentOrigins {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1);\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n padding: 0 var(--space-1) 0 var(--space-2);\n min-height: var(--control-h-xs);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n color: var(--text-secondary);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n.chip[data-kind='blocked'] { border-color: var(--status-warning-solid); }\n\n.chipAction {\n padding: 0 var(--space-2);\n border: 0;\n border-radius: var(--radius-full);\n background: var(--bg-hover);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n.chipAction:hover { background: var(--bg-active); }\n.chip[data-kind='allowance'] { border-style: dashed; }\n\n/* ---- agents acting: the confirmation card, the pause, recent actions ----- */\n\n.note[data-kind='paused'] {\n background: var(--status-warning-bg, var(--bg-code));\n color: var(--text-primary);\n}\n.noteAction { margin-left: auto; }\n\n.confirm {\n display: flex;\n flex-direction: column;\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 border-left: 3px solid var(--status-warning-solid);\n background: var(--bg-surface);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.confirmHead {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n color: var(--text-primary);\n}\n.confirmHead > svg { flex: none; color: var(--status-warning-solid); }\n.confirmHead > span { margin-left: auto; font-variant-numeric: tabular-nums; }\n.confirmBody { margin: 0; overflow-wrap: anywhere; }\n.confirmBody code { font-family: var(--font-mono); }\n.confirmReasons { margin: 0; padding-left: var(--space-4); }\n.confirmActions { display: flex; flex-wrap: wrap; gap: var(--space-2); }\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-3);\n flex: none;\n margin: 0;\n padding: var(--space-1) var(--space-3);\n list-style: none;\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-code);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.action { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 32ch; }\n.action::before { content: '•'; margin-right: var(--space-1); color: var(--accent-500); }\n.action[data-outcome='failed']::before,\n.action[data-outcome='declined']::before { color: var(--status-warning-solid); }\n","/**\n * routes/verse/browser/BrowserPanel.tsx — the integrated Browser pane (3.15):\n * the browser Mason and a chat's agents share.\n *\n * TWO ENGINES, ONE PANE (native-browser.ts decides, at mount):\n * - DESKTOP APP (shell contract \"browser\" v1): each tab is a real native\n * webview laid exactly over this pane's stage, so ANY site works (no\n * X-Frame-Options wall), with screenshots (macOS), console + network\n * capture and an element picker. The webview is a separate native layer:\n * it is hidden whenever this pane is hidden or a Verse dialog / menu\n * opens over it, or it would cover them.\n * - WEB UI / older desktop shell: an <iframe> for loopback dev servers\n * (the page CSP's `frame-src` allows exactly those) and \"Open externally\"\n * for everything else. A cross-origin frame cannot be read, so capture\n * features say so instead of pretending.\n *\n * AGENTS. With \"Agent access\" on for this chat, the chat's Claude / local\n * seats get browser tools (core/verse/browser-mcp.ts + verse-mcp-browser-\n * act.ts). Their commands arrive here (long-poll, browser-queries.ts) and run\n * in THIS pane — agent-runner.ts — so an agent only ever sees and touches\n * what Mason sees. Localhost is allowed; other origins only when Mason allows\n * them below. In the desktop app agents can also click, type, select, press\n * keys and scroll (as real input, drawn as a ring in the page, listed in the\n * strip under it); anything that matters shows a card here first — Allow\n * once / Allow for this chat / Deny. Mason clicking or typing in the page\n * while an agent is working pauses it (\"You took over\") until Resume. They\n * never type into password or payment fields, pick files or download.\n *\n * Props are the pane contract the workbench pane registry mounts\n * (register.ts): the chat it serves, and whether it is on screen.\n */\nimport { useCallback, useEffect, useMemo, useReducer, useRef, useState, type FormEvent, type KeyboardEvent as ReactKeyboardEvent, type ReactElement } from 'react';\n\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { IconPlus, IconX } from '../../../components/primitives/icons.js';\nimport type {\n VerseBrowserAgentCommand,\n VerseBrowserCommandResult,\n VerseBrowserConfirmRequest,\n VerseBrowserConsoleEntry,\n VerseBrowserDecision,\n VerseBrowserNetworkEntry,\n VerseBrowserPolicy,\n VerseBrowserScope,\n} from '../../../../core/verse/browser-types.js';\nimport { asConsoleEntries, asNetworkEntries, formatBrowserConsole, isLoopbackHost } from '../../../../core/verse/browser-types.js';\nimport type { VersePreviewDevServer } from '../../../../core/verse/workbench-types.js';\nimport { insertIntoComposer } from '../chat/composer-bridge.js';\nimport { useTokenGate } from '../context/use-token-gate.js';\nimport { executeAgentCommand, type BrowserClip, type BrowserExecutor } from './agent-runner.js';\nimport { originOf, parseBrowserAddress, shortAddress, type BrowserAddress } from './browser-address.js';\nimport { DEVICE_SIZES, frameRect, isUsableRect, sameRect, stepZoom, zoomLabel, type DevicePreset, type Rect } from './browser-geometry.js';\nimport {\n BackGlyph,\n CameraGlyph,\n ConsoleGlyph,\n DesktopGlyph,\n ExternalGlyph,\n FillGlyph,\n ForwardGlyph,\n GlobeGlyph,\n PhoneGlyph,\n PickGlyph,\n ReloadGlyph,\n SendGlyph,\n ServerGlyph,\n ShieldGlyph,\n TabletGlyph,\n} from './browser-icons.js';\nimport { browserApi, type BrowserApi } from './browser-queries.js';\nimport {\n BROWSER_TABS_STORAGE_KEY,\n MAX_BROWSER_TABS,\n activeTab as selectActiveTab,\n browserTabsReducer,\n restoreTabs,\n serializeTabs,\n type BrowserTab,\n type BrowserTabsAction,\n} from './browser-tabs.js';\nimport {\n nativeBrowser,\n nativeRequest,\n subscribeNativeBrowser,\n type ApprovedPage,\n type NativeBrowser,\n type NativeQuery,\n} from './native-browser.js';\nimport { sendCaptureToChat, type BrowserCapture, type BrowserScreenshot, type PickedElement } from './send-to-chat.js';\nimport styles from './BrowserPanel.module.css';\n\n// ---------------------------------------------------------------------------\n// Contract + deps\n// ---------------------------------------------------------------------------\n\nexport interface BrowserPanelProps {\n /** The chat this pane serves (\"Send to chat\", agent access). Null → browsing only. */\n sessionId: string | null;\n /** False while the pane is mounted but not on screen (the native layer hides). Default true. */\n visible?: boolean;\n /** Tests inject fakes. */\n deps?: Partial<BrowserPanelDeps>;\n}\n\nexport interface BrowserPanelDeps {\n api: BrowserApi;\n native: () => NativeBrowser | null;\n /** `window.location.origin`: Verse's own address, never opened here. */\n origin: () => string;\n insert: (sessionId: string, text: string) => boolean;\n openExternal: (url: string) => void;\n storage: () => Pick<Storage, 'getItem' | 'setItem'> | null;\n now: () => Date;\n}\n\nfunction defaultStorage(): Pick<Storage, 'getItem' | 'setItem'> | null {\n try {\n return window.localStorage;\n } catch {\n return null;\n }\n}\n\nconst DEFAULT_DEPS: BrowserPanelDeps = {\n api: browserApi,\n native: () => nativeBrowser(),\n origin: () => window.location.origin,\n insert: insertIntoComposer,\n openExternal: (url) => {\n window.open(url, '_blank', 'noopener,noreferrer');\n },\n storage: defaultStorage,\n now: () => new Date(),\n};\n\nconst POLICY_POLL_MS = 5_000;\nconst CONSOLE_POLL_MS = 2_000;\nconst BOUNDS_POLL_MS = 400;\nconst PICK_POLL_MS = 400;\nconst PICK_TIMEOUT_MS = 90_000;\nconst NAV_WAIT_MS = 15_000;\n/** Operator input within this long of an agent command counts as taking over. */\nconst AGENT_ACTIVE_MS = 120_000;\nconst RECENT_ACTIONS_MAX = 6;\n/** Anything portalled onto <body> that a native layer would otherwise cover. */\nconst OVERLAY_SELECTOR = '[role=\"dialog\"],[role=\"alertdialog\"],[aria-modal=\"true\"],[role=\"menu\"],[role=\"listbox\"]';\n\nconst DEVICE_ICON: Readonly<Record<DevicePreset, ReactElement>> = {\n fill: <FillGlyph size={14} />,\n desktop: <DesktopGlyph size={14} />,\n tablet: <TabletGlyph size={14} />,\n mobile: <PhoneGlyph size={14} />,\n};\n\nfunction errorText(err: unknown): string {\n return err instanceof Error && err.message ? err.message : 'Something went wrong.';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction asScreenshot(value: unknown): (BrowserScreenshot & { scale?: number; origin?: { x: number; y: number } }) | null {\n if (!isRecord(value)) return null;\n const mime = value['mime'];\n const base64 = value['base64'];\n if ((mime !== 'image/png' && mime !== 'image/jpeg') || typeof base64 !== 'string' || !/^[A-Za-z0-9+/]+={0,2}$/.test(base64)) return null;\n const origin = isRecord(value['origin']) ? value['origin'] : null;\n return {\n mime,\n base64,\n width: typeof value['width'] === 'number' ? value['width'] : null,\n height: typeof value['height'] === 'number' ? value['height'] : null,\n // Newer desktop shells say how image pixels map back to the page (≤ 1280×800 images).\n ...(typeof value['scale'] === 'number' && Number.isFinite(value['scale']) && value['scale'] > 0 ? { scale: value['scale'] } : {}),\n ...(origin && typeof origin['x'] === 'number' && typeof origin['y'] === 'number' ? { origin: { x: origin['x'], y: origin['y'] } } : {}),\n };\n}\n\n/** One line of the recent-actions strip. */\ninterface AgentActionRow {\n id: string;\n at: number;\n label: string;\n outcome: 'done' | 'failed' | 'allowed' | 'declined';\n}\n\n/** What the strip says an agent command did, or null for pure reads (they are not actions). */\nfunction actionLabel(command: VerseBrowserAgentCommand): string | null {\n const args = isRecord(command.args) ? command.args : {};\n const target = typeof args['ref'] === 'string' ? ` ${args['ref']}` : typeof args['x'] === 'number' ? ` at ${Math.round(args['x'])},${Math.round(args['y'] as number)}` : '';\n switch (command.op) {\n case 'navigate':\n return command.url ? `Opened ${shortAddress(command.url)}` : 'Opened a page';\n case 'history':\n return args['direction'] === 'forward' ? 'Went forward' : 'Went back';\n case 'tabs':\n return args['action'] === 'list' ? null : `Tabs: ${String(args['action'])}${typeof args['index'] === 'number' ? ` ${args['index']}` : ''}`;\n case 'evaluate':\n return 'Ran a script';\n case 'act':\n switch (args['kind']) {\n case 'click': return `${args['double'] === true ? 'Double-clicked' : 'Clicked'}${target}`;\n case 'type': return `Typed ${typeof args['text'] === 'string' ? args['text'].length : 0} chars into${target}${args['submit'] === true ? ' + Enter' : ''}`;\n case 'select': return `Selected in${target}`;\n case 'hover': return `Hovered${target}`;\n case 'key': return `Pressed ${String(args['key'] ?? '')}`;\n case 'scroll': return `Scrolled${args['direction'] ? ` ${String(args['direction'])}` : ''}${target}`;\n default: return 'Acted';\n }\n default:\n return null;\n }\n}\n\nfunction tabLabel(tab: BrowserTab): string {\n if (!tab.url) return 'New tab';\n return tab.title?.trim() || shortAddress(tab.url);\n}\n\n/** True while a dialog, menu or listbox portalled onto <body> could sit over the stage. */\nfunction useOverlayOpen(stage: HTMLElement | null, enabled: boolean): boolean {\n const [open, setOpen] = useState(false);\n useEffect(() => {\n if (!enabled || typeof MutationObserver === 'undefined') {\n setOpen(false);\n return;\n }\n const raf = typeof requestAnimationFrame === 'function' && typeof cancelAnimationFrame === 'function';\n let frame: ReturnType<typeof setTimeout> | number | null = null;\n const check = (): void => {\n frame = null;\n const found = Array.from(document.body.children).some((el) =>\n !(stage && el.contains(stage)) && (el.matches(OVERLAY_SELECTOR) || el.querySelector(OVERLAY_SELECTOR) !== null));\n setOpen(found);\n };\n // Coalesced to one check per frame (a streaming chat mutates <body> rarely,\n // but a portal can mount and unmount in the same tick).\n const schedule = (): void => {\n if (frame !== null) return;\n frame = raf ? requestAnimationFrame(check) : setTimeout(check, 16);\n };\n const observer = new MutationObserver(schedule);\n observer.observe(document.body, { childList: true });\n check();\n return () => {\n observer.disconnect();\n if (frame !== null) {\n if (raf) cancelAnimationFrame(frame as number);\n else clearTimeout(frame as ReturnType<typeof setTimeout>);\n }\n };\n }, [stage, enabled]);\n return open;\n}\n\nfunction useDocumentVisible(): boolean {\n const [visible, setVisible] = useState(() => typeof document === 'undefined' || document.visibilityState !== 'hidden');\n useEffect(() => {\n const onChange = (): void => setVisible(document.visibilityState !== 'hidden');\n document.addEventListener('visibilitychange', onChange);\n return () => document.removeEventListener('visibilitychange', onChange);\n }, []);\n return visible;\n}\n\n// ---------------------------------------------------------------------------\n// The pane\n// ---------------------------------------------------------------------------\n\nexport function BrowserPanel({ sessionId, visible = true, deps: depsOverride }: BrowserPanelProps) {\n const deps = useMemo<BrowserPanelDeps>(() => ({ ...DEFAULT_DEPS, ...depsOverride }), [depsOverride]);\n const api = deps.api;\n const native = useMemo(() => deps.native(), [deps]);\n const verseOrigin = useMemo(() => deps.origin(), [deps]);\n const mode: 'native' | 'frame' = native ? 'native' : 'frame';\n const gate = useTokenGate();\n\n const [tabsState, rawDispatch] = useReducer(browserTabsReducer, undefined, () => {\n let raw: string | null = null;\n try {\n raw = deps.storage()?.getItem(BROWSER_TABS_STORAGE_KEY) ?? null;\n } catch {\n raw = null;\n }\n return restoreTabs(raw);\n });\n const tabsStateRef = useRef(tabsState);\n tabsStateRef.current = tabsState;\n // Native navigation events and agent commands can dispatch before React's\n // next render. Keep the action fence's tab view current within that gap.\n const dispatch = useCallback((action: BrowserTabsAction) => {\n tabsStateRef.current = browserTabsReducer(tabsStateRef.current, action);\n rawDispatch(action);\n }, [rawDispatch]);\n const tab = selectActiveTab(tabsState);\n\n const [device, setDevice] = useState<DevicePreset>('fill');\n const [zoom, setZoom] = useState(1);\n const [address, setAddress] = useState(tab.url ?? '');\n const [addressNote, setAddressNote] = useState<BrowserAddress | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [devtoolsOpen, setDevtoolsOpen] = useState(false);\n const [logs, setLogs] = useState<{ url: string; console: VerseBrowserConsoleEntry[]; network: VerseBrowserNetworkEntry[] } | null>(null);\n const [logsError, setLogsError] = useState<string | null>(null);\n const [shot, setShot] = useState<BrowserScreenshot | null>(null);\n const [element, setElement] = useState<PickedElement | null>(null);\n const [picking, setPicking] = useState(false);\n const [busy, setBusy] = useState<null | 'shot' | 'send' | 'access'>(null);\n const [policy, setPolicy] = useState<VerseBrowserPolicy | null>(null);\n const [servers, setServers] = useState<VersePreviewDevServer[] | null>(null);\n const [agentActivity, setAgentActivity] = useState<string | null>(null);\n // The operator took the pane over while an agent was working: agent commands wait for Resume.\n const [paused, setPaused] = useState(false);\n const pausedRef = useRef(false);\n pausedRef.current = paused;\n const [confirmCard, setConfirmCard] = useState<{ request: VerseBrowserConfirmRequest; answer: (d: VerseBrowserDecision) => void } | null>(null);\n const confirmAnswerRef = useRef<((d: VerseBrowserDecision) => void) | null>(null);\n const [recentActions, setRecentActions] = useState<AgentActionRow[]>([]);\n const lastAgentAtRef = useRef(0);\n const agentOnRef = useRef(false);\n\n const stageRef = useRef<HTMLDivElement | null>(null);\n const [stageEl, setStageEl] = useState<HTMLDivElement | null>(null);\n const docVisible = useDocumentVisible();\n const overlayOpen = useOverlayOpen(stageEl, mode === 'native' && visible);\n\n // Persist tabs (per viewer; a convenience, so every failure is ignored).\n useEffect(() => {\n try {\n deps.storage()?.setItem(BROWSER_TABS_STORAGE_KEY, serializeTabs(tabsState));\n } catch {\n /* private window, quota: the pane works without it */\n }\n }, [tabsState, deps]);\n\n // The address bar follows the active tab (unless the operator is typing in it).\n const addressFocused = useRef(false);\n useEffect(() => {\n if (!addressFocused.current) setAddress(tab.url ?? '');\n }, [tab.id, tab.url]);\n\n // Per-tab captures belong to the page they came from.\n useEffect(() => {\n setShot(null);\n setElement(null);\n setLogs(null);\n setLogsError(null);\n }, [tab.id]);\n\n // -------------------------------------------------------------------------\n // Native layer: events, placement, visibility\n // -------------------------------------------------------------------------\n\n const openedRef = useRef<Set<string>>(new Set());\n const activeIdRef = useRef(tabsState.activeId);\n activeIdRef.current = tabsState.activeId;\n const lastBoundsRef = useRef<Rect | null>(null);\n const shownRef = useRef<string | null>(null);\n\n /** Mason used the pane while an agent was working: pause the agent until he presses Resume. */\n const noteOperatorInput = useCallback(() => {\n if (agentOnRef.current && Date.now() - lastAgentAtRef.current < AGENT_ACTIVE_MS) setPaused(true);\n }, []);\n\n useEffect(() => {\n if (!native) return undefined;\n return subscribeNativeBrowser((event) => {\n switch (event.kind) {\n case 'operator':\n // Genuine input only: native never reports the agent's own synthesised events.\n if (event.tab === activeIdRef.current) noteOperatorInput();\n break;\n case 'nav':\n dispatch({ type: 'native-nav', id: event.tab, url: event.url, loading: event.loading });\n break;\n case 'title':\n dispatch({ type: 'title', id: event.tab, title: event.title });\n break;\n case 'blocked':\n setNotice(`Blocked ${shortAddress(event.url)} — ${event.reason}.`);\n break;\n case 'closed':\n openedRef.current.delete(event.tab);\n // The page Mason is looking at went away natively (⌘W while it had\n // focus): close the tab here too rather than silently re-opening\n // it. A background tab that was evicted just re-opens on its next\n // activation.\n if (event.tab === activeIdRef.current && shownRef.current === event.tab) {\n shownRef.current = null;\n dispatch({ type: 'close', id: event.tab });\n }\n break;\n default:\n break;\n }\n });\n }, [native, noteOperatorInput, dispatch]);\n\n const showNative = mode === 'native' && visible && docVisible && !overlayOpen && tab.url !== null && !gate.dialog.open;\n\n const placeNative = useCallback((force = false) => {\n if (!native) return;\n const stage = stageRef.current;\n if (!showNative || !stage || !tab.url) {\n if (shownRef.current !== null) {\n native.send({ op: 'hide' });\n shownRef.current = null;\n lastBoundsRef.current = null;\n }\n return;\n }\n const box = stage.getBoundingClientRect();\n const rect = frameRect({ x: box.left, y: box.top, width: box.width, height: box.height }, device);\n if (!isUsableRect(rect)) return;\n if (!openedRef.current.has(tab.id)) {\n if (native.send({ op: 'open', tab: tab.id, url: tab.url, bounds: rect })) {\n openedRef.current.add(tab.id);\n shownRef.current = tab.id;\n lastBoundsRef.current = rect;\n if (zoom !== 1) native.send({ op: 'zoom', tab: tab.id, factor: zoom });\n }\n return;\n }\n if (!force && shownRef.current === tab.id && sameRect(lastBoundsRef.current, rect)) return;\n native.send({ op: 'bounds', tab: tab.id, bounds: rect });\n shownRef.current = tab.id;\n lastBoundsRef.current = rect;\n }, [native, showNative, tab.id, tab.url, device, zoom]);\n\n useEffect(() => {\n placeNative(true);\n if (!native || !showNative) return undefined;\n const stage = stageRef.current;\n const onResize = (): void => placeNative();\n const observer = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(onResize) : null;\n if (stage) observer?.observe(stage);\n window.addEventListener('resize', onResize);\n // Position can change without a resize (a sidebar collapsing beside the\n // pane moves it sideways); a cheap rect check catches that.\n const timer = setInterval(onResize, BOUNDS_POLL_MS);\n return () => {\n observer?.disconnect();\n window.removeEventListener('resize', onResize);\n clearInterval(timer);\n };\n }, [native, showNative, placeNative]);\n\n // Leaving the pane hides every native tab (they survive for the next mount).\n useEffect(() => () => {\n if (native) native.send({ op: 'hide' });\n }, [native]);\n\n useEffect(() => {\n if (native && openedRef.current.has(tab.id)) native.send({ op: 'zoom', tab: tab.id, factor: zoom });\n }, [native, zoom, tab.id]);\n\n // -------------------------------------------------------------------------\n // Navigation\n // -------------------------------------------------------------------------\n\n const navigateTab = useCallback((id: string, url: string) => {\n dispatch({ type: 'navigate', id, url });\n if (native && openedRef.current.has(id)) native.send({ op: 'navigate', tab: id, url });\n }, [native, dispatch]);\n\n const submitAddress = (event: FormEvent) => {\n event.preventDefault();\n const parsed = parseBrowserAddress(address, verseOrigin);\n if (parsed.kind !== 'url') {\n setAddressNote(parsed);\n return;\n }\n setAddressNote(null);\n setAddress(parsed.url);\n // Like any browser: Enter hands the bar back to the page, so redirects\n // and in-page navigation show up in it again.\n addressFocused.current = false;\n const input = (event.currentTarget as HTMLFormElement).querySelector('input');\n input?.blur();\n noteOperatorInput();\n navigateTab(tab.id, parsed.url);\n };\n\n const onAddressKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n setAddress(tab.url ?? '');\n setAddressNote(null);\n event.currentTarget.blur();\n };\n\n const goBack = () => {\n noteOperatorInput();\n if (native && openedRef.current.has(tab.id)) native.send({ op: 'back', tab: tab.id });\n else dispatch({ type: 'step', id: tab.id, delta: -1 });\n };\n const goForward = () => {\n noteOperatorInput();\n if (native && openedRef.current.has(tab.id)) native.send({ op: 'forward', tab: tab.id });\n else dispatch({ type: 'step', id: tab.id, delta: 1 });\n };\n const reload = () => {\n noteOperatorInput();\n if (!tab.url) {\n void refreshServers();\n return;\n }\n if (native && openedRef.current.has(tab.id)) native.send({ op: 'reload', tab: tab.id });\n else dispatch({ type: 'reload', id: tab.id });\n };\n\n const openExternally = (url: string) => {\n if (native) native.send({ op: 'external', url });\n else deps.openExternal(url);\n };\n\n const closeTab = (id: string) => {\n if (native && openedRef.current.has(id)) {\n native.send({ op: 'close', tab: id });\n openedRef.current.delete(id);\n if (shownRef.current === id) shownRef.current = null;\n }\n dispatch({ type: 'close', id });\n };\n\n // -------------------------------------------------------------------------\n // Dev servers (the launcher)\n // -------------------------------------------------------------------------\n\n const refreshServers = useCallback(async (signal?: AbortSignal) => {\n if (!sessionId) {\n setServers([]);\n return;\n }\n try {\n const targets = await api.targets(sessionId, signal);\n const rows = [...targets.devServers].sort((a, b) => Number(b.running) - Number(a.running));\n setServers(rows);\n } catch {\n if (!signal?.aborted) setServers([]);\n }\n }, [api, sessionId]);\n\n useEffect(() => {\n if (!visible || tab.url !== null) return undefined;\n const ctrl = new AbortController();\n void refreshServers(ctrl.signal);\n return () => ctrl.abort();\n }, [visible, tab.url, refreshServers]);\n\n // -------------------------------------------------------------------------\n // Capture: console, screenshot, picker\n // -------------------------------------------------------------------------\n\n const queryTab = useCallback((what: NativeQuery, timeoutMs = 6_000, approved?: ApprovedPage): Promise<unknown> => {\n if (!native) return Promise.reject(new Error('Needs the Ashlr desktop app.'));\n if (!openedRef.current.has(tab.id)) return Promise.reject(new Error('No page is open.'));\n return nativeRequest(native, (req) => ({ op: 'query', tab: tab.id, req, what, ...(approved ? { approved } : {}) }), timeoutMs);\n }, [native, tab.id]);\n\n const readConsole = useCallback(async () => {\n const data = await queryTab('console');\n const record = isRecord(data) ? data : {};\n return {\n url: typeof record['url'] === 'string' ? record['url'] : tab.url ?? '',\n console: asConsoleEntries(record['console']),\n network: asNetworkEntries(record['network']),\n };\n }, [queryTab, tab.url]);\n\n useEffect(() => {\n if (!devtoolsOpen || mode !== 'native' || !visible || !tab.url) return undefined;\n let live = true;\n const pull = async (): Promise<void> => {\n try {\n const next = await readConsole();\n if (live) {\n setLogs(next);\n setLogsError(null);\n }\n } catch (err) {\n if (live) setLogsError(errorText(err));\n }\n };\n void pull();\n const timer = setInterval(() => void pull(), CONSOLE_POLL_MS);\n return () => {\n live = false;\n clearInterval(timer);\n };\n }, [devtoolsOpen, mode, visible, tab.url, readConsole]);\n\n const takeScreenshot = useCallback(async (clip?: BrowserClip): Promise<BrowserScreenshot & { scale?: number; origin?: { x: number; y: number } }> => {\n if (!native) throw new Error('Screenshots need the Ashlr desktop app — a web page cannot capture another site\\'s frame.');\n if (!native.capabilities.screenshot) throw new Error('This desktop shell cannot take screenshots on this platform yet (macOS only).');\n if (!openedRef.current.has(tab.id)) throw new Error('No page is open.');\n const data = await nativeRequest(native, (req) => ({ op: 'screenshot', tab: tab.id, req, ...(clip ? { clip } : {}) }), 20_000);\n const parsed = asScreenshot(data);\n if (!parsed) throw new Error('The screenshot could not be read.');\n return parsed;\n }, [native, tab.id]);\n\n const onScreenshot = async () => {\n setBusy('shot');\n try {\n setShot(await takeScreenshot());\n } catch (err) {\n setNotice(errorText(err));\n } finally {\n setBusy(null);\n }\n };\n\n const pickTimer = useRef<ReturnType<typeof setInterval> | null>(null);\n const stopPickPolling = () => {\n if (pickTimer.current) clearInterval(pickTimer.current);\n pickTimer.current = null;\n };\n useEffect(() => stopPickPolling, []);\n useEffect(() => {\n // A new tab or page ends a pick in progress.\n stopPickPolling();\n setPicking(false);\n }, [tab.id, tab.url]);\n\n const onPick = async () => {\n if (picking) {\n stopPickPolling();\n setPicking(false);\n void queryTab('pick-cancel').catch(() => {});\n return;\n }\n try {\n await queryTab('pick-start');\n } catch (err) {\n setNotice(errorText(err));\n return;\n }\n setPicking(true);\n const started = Date.now();\n stopPickPolling();\n pickTimer.current = setInterval(() => {\n if (Date.now() - started > PICK_TIMEOUT_MS) {\n stopPickPolling();\n setPicking(false);\n void queryTab('pick-cancel').catch(() => {});\n return;\n }\n queryTab('pick-poll', 3_000).then((data) => {\n if (!isRecord(data)) return;\n if (data['state'] === 'picked' && isRecord(data['result'])) {\n const r = data['result'];\n stopPickPolling();\n setPicking(false);\n if (typeof r['selector'] === 'string' && typeof r['html'] === 'string') {\n setElement({ selector: r['selector'], html: r['html'], ...(typeof r['text'] === 'string' ? { text: r['text'] } : {}) });\n }\n } else if (data['state'] === 'idle') {\n // Escape in the page cancelled it.\n stopPickPolling();\n setPicking(false);\n }\n }).catch(() => {});\n }, PICK_POLL_MS);\n };\n\n const onSendToChat = async () => {\n if (!sessionId) {\n setNotice('Open a chat to send this to it.');\n return;\n }\n setBusy('send');\n try {\n const capture: BrowserCapture = { url: tab.url, title: tab.title, screenshot: shot, element, notes: [] };\n if (mode === 'native' && tab.url && native?.capabilities.console !== false) {\n try {\n const read = await readConsole();\n capture.console = read.console;\n capture.network = read.network;\n } catch {\n capture.notes!.push('the console could not be read');\n }\n } else if (mode === 'frame' && tab.url) {\n capture.notes!.push('console, network errors and screenshots need the Ashlr desktop app');\n }\n const send = () => sendCaptureToChat(sessionId, capture, { attach: api.attach, insert: deps.insert, now: deps.now });\n const result = shot ? await gate.run('Attach the browser screenshot to this chat', send) : await send();\n if (result === null) return;\n if (!result.ok) {\n setNotice(result.message);\n return;\n }\n setShot(null);\n setElement(null);\n setNotice(result.attached ? 'Added to the message box with the screenshot attached — nothing was sent.' : 'Added to the message box — nothing was sent.');\n } catch (err) {\n setNotice(errorText(err));\n } finally {\n setBusy(null);\n }\n };\n\n // -------------------------------------------------------------------------\n // Agent access (policy) and the command loop\n // -------------------------------------------------------------------------\n\n const refreshPolicy = useCallback(async (signal?: AbortSignal) => {\n if (!sessionId) {\n setPolicy(null);\n return;\n }\n try {\n setPolicy(await api.policy(sessionId, signal));\n } catch {\n if (!signal?.aborted) setPolicy(null);\n }\n }, [api, sessionId]);\n\n useEffect(() => {\n if (!visible || !sessionId) return undefined;\n const ctrl = new AbortController();\n void refreshPolicy(ctrl.signal);\n const timer = setInterval(() => void refreshPolicy(), POLICY_POLL_MS);\n return () => {\n ctrl.abort();\n clearInterval(timer);\n };\n }, [visible, sessionId, refreshPolicy]);\n\n const setAccess = async (enabled: boolean) => {\n if (!sessionId) return;\n setBusy('access');\n try {\n const next = await gate.run(enabled ? 'Let this chat\\'s agents use the browser' : 'Turn off browser access for this chat', () => api.setAccess(sessionId, enabled));\n if (next) setPolicy(next);\n } catch (err) {\n setNotice(errorText(err));\n } finally {\n setBusy(null);\n }\n };\n\n const setScope = async (scope: VerseBrowserScope, enabled: boolean) => {\n if (!sessionId) return;\n setBusy('access');\n try {\n const reason = scope === 'browser_act'\n ? (enabled ? 'Let this chat\\'s agents click and type in the browser' : 'Stop agents clicking and typing')\n : (enabled ? 'Let this chat\\'s agents run full-privilege scripts in localhost pages, including access to cookies and stored credentials' : 'Stop agents running page scripts');\n const next = await gate.run(reason, () => api.setAccess(sessionId, enabled, scope));\n if (next) setPolicy(next);\n } catch (err) {\n setNotice(errorText(err));\n } finally {\n setBusy(null);\n }\n };\n\n const revokeAllowance = async (key: string) => {\n if (!sessionId) return;\n try {\n const next = await gate.run('Forget an \"Allow for this chat\" answer', () => api.revokeAllowance(sessionId, key));\n if (next) setPolicy(next);\n } catch (err) {\n setNotice(errorText(err));\n }\n };\n\n const allowOrigin = async (origin: string, allowed: boolean) => {\n if (!sessionId) return;\n try {\n const next = await gate.run(allowed ? `Let this chat's agents open ${origin}` : `Stop agents opening ${origin}`, () => api.allowOrigin(sessionId, origin, allowed));\n if (next) setPolicy(next);\n } catch (err) {\n setNotice(errorText(err));\n }\n };\n\n /** Resolves when the tab's next page load finishes (or after NAV_WAIT_MS, still loading). */\n const waitForLoad = useCallback((id: string, fallbackUrl: string | null): Promise<{ url: string | null; title: string | null; loading: boolean }> => {\n return new Promise((resolve) => {\n let last = fallbackUrl;\n let title: string | null = null;\n const stop = subscribeNativeBrowser((event) => {\n if (event.kind === 'title' && event.tab === id) title = event.title;\n if (event.kind !== 'nav' || event.tab !== id) return;\n last = event.url;\n if (!event.loading) {\n stop();\n clearTimeout(timer);\n resolve({ url: last, title, loading: false });\n }\n });\n const timer = setTimeout(() => {\n stop();\n resolve({ url: last, title, loading: true });\n }, NAV_WAIT_MS);\n });\n }, []);\n\n // The executor sees the CURRENT pane every time a command runs.\n const executorRef = useRef<BrowserExecutor | null>(null);\n executorRef.current = {\n mode,\n capabilities: {\n screenshot: mode === 'native' && native?.capabilities.screenshot === true,\n text: mode === 'native' && native?.capabilities.text !== false,\n console: mode === 'native' && native?.capabilities.console !== false,\n act: mode === 'native' && native?.capabilities.act === true,\n },\n current: () => ({ tabId: tab.id, url: tab.url, title: tab.title, tabs: tabsState.tabs.length }),\n navigate: async (url) => {\n const id = tab.id;\n navigateTab(id, url);\n if (!native) {\n await new Promise((resolve) => setTimeout(resolve, 1_000));\n return { url, title: null, loading: false };\n }\n const landed = await waitForLoad(id, url);\n return { url: landed.url ?? url, title: landed.title, loading: landed.loading };\n },\n query: (what, timeoutMs, approved) => queryTab(what, timeoutMs, approved),\n history: async (direction) => {\n const id = tab.id;\n if (native && openedRef.current.has(id)) {\n const waiting = waitForLoad(id, tab.url);\n native.send({ op: direction, tab: id });\n return waiting;\n }\n dispatch({ type: 'step', id, delta: direction === 'back' ? -1 : 1 });\n await new Promise((resolve) => setTimeout(resolve, 1_000));\n return { url: null, title: null, loading: false };\n },\n tabs: () => tabsStateRef.current.tabs.map((t, index) => ({ id: t.id, index, url: t.url, title: t.title, active: t.id === tabsStateRef.current.activeId })),\n openTab: async (url) => {\n dispatch({ type: 'new-tab', url });\n await new Promise((resolve) => setTimeout(resolve, url ? 1_500 : 0));\n },\n selectTab: (index) => {\n const target = tabsStateRef.current.tabs[index];\n if (!target) return false;\n dispatch({ type: 'activate', id: target.id });\n return true;\n },\n closeTab: (index) => {\n const target = tabsStateRef.current.tabs[index];\n if (!target) return false;\n closeTab(target.id);\n return true;\n },\n confirm: (request) => new Promise<VerseBrowserDecision>((resolve) => {\n const expires = Date.parse(request.expiresAt);\n // Answer a little before the sidecar gives up, so a late click never races it.\n const ms = Math.max(1_000, Math.min(118_000, (Number.isFinite(expires) ? expires - Date.now() : 118_000) - 2_000));\n let done = false;\n const finish = (decision: VerseBrowserDecision): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n confirmAnswerRef.current = null;\n setConfirmCard(null);\n resolve(decision);\n };\n const timer = setTimeout(() => finish('deny'), ms);\n confirmAnswerRef.current = finish;\n setConfirmCard({ request, answer: finish });\n }),\n paused: () => pausedRef.current,\n screenshot: takeScreenshot,\n text: async (limit) => {\n const data = await queryTab('text');\n const r = isRecord(data) ? data : {};\n const text = typeof r['text'] === 'string' ? r['text'] : '';\n return {\n url: typeof r['url'] === 'string' ? r['url'] : tab.url ?? '',\n title: typeof r['title'] === 'string' ? r['title'] : null,\n text: text.slice(0, limit),\n truncated: r['truncated'] === true || text.length > limit,\n };\n },\n console: readConsole,\n };\n\n const agentOn = policy?.agentAccess === true;\n agentOnRef.current = agentOn;\n useEffect(() => {\n if (!agentOn) setPaused(false);\n }, [agentOn]);\n\n const recordAction = useCallback((command: VerseBrowserAgentCommand, result: VerseBrowserCommandResult) => {\n let label = actionLabel(command);\n let outcome: AgentActionRow['outcome'] = result.ok ? 'done' : 'failed';\n if (command.op === 'confirm') {\n const args = isRecord(command.args) ? command.args : {};\n const decision = isRecord(result.data) ? result.data['decision'] : null;\n label = `Asked you: ${typeof args['action'] === 'string' ? args['action'].slice(0, 80) : 'an action'}`;\n outcome = decision === 'once' || decision === 'chat' ? 'allowed' : 'declined';\n }\n if (!label) return;\n setRecentActions((rows) => [{ id: command.id, at: Date.now(), label, outcome }, ...rows].slice(0, RECENT_ACTIONS_MAX));\n }, []);\n\n useEffect(() => {\n if (!sessionId || !visible || !agentOn) return undefined;\n const ctrl = new AbortController();\n let stopped = false;\n void (async () => {\n while (!stopped) {\n if (!api.canWrite()) {\n setAgentActivity('Unlock actions to let the agent use the browser.');\n await new Promise((resolve) => setTimeout(resolve, 3_000));\n continue;\n }\n try {\n const { commands } = await api.commands(sessionId, ctrl.signal);\n for (const command of commands) {\n if (stopped) break;\n if (command.op !== 'status') lastAgentAtRef.current = Date.now();\n setAgentActivity(command.op === 'navigate' && command.url\n ? `Agent opened ${shortAddress(command.url)}`\n : command.op === 'confirm' ? 'Agent is waiting for your answer' : `Agent: ${command.op.replace('-', ' ')}`);\n const result = await executeAgentCommand(command, executorRef.current!, verseOrigin, (id) => api.canDispatch(sessionId, id));\n recordAction(command, result);\n await api.result(sessionId, result).catch(() => {});\n }\n } catch {\n if (stopped) break;\n await new Promise((resolve) => setTimeout(resolve, 3_000));\n }\n }\n })();\n return () => {\n stopped = true;\n ctrl.abort();\n setAgentActivity(null);\n // A card nobody can answer any more is a no.\n confirmAnswerRef.current?.('deny');\n };\n }, [sessionId, visible, agentOn, api, verseOrigin, recordAction]);\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n const frameable = tab.url ? parseBrowserAddress(tab.url, verseOrigin) : null;\n const canCapture = mode === 'native' && tab.url !== null;\n const screenshotTitle = mode !== 'native'\n ? 'Screenshots need the Ashlr desktop app'\n : native?.capabilities.screenshot ? 'Screenshot' : 'Screenshots are macOS-only in this desktop shell';\n\n return (\n <div className={styles.pane} data-mode={mode}>\n <div className={styles.strip}>\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Browser tabs\">\n {tabsState.tabs.map((t) => {\n const selected = t.id === tabsState.activeId;\n const label = tabLabel(t);\n return (\n <div key={t.id} className={styles.tab} data-selected={selected || undefined} role=\"presentation\">\n <button type=\"button\" role=\"tab\" aria-selected={selected} aria-controls=\"browser-stage\" tabIndex={selected ? 0 : -1}\n className={styles.tabButton} title={t.url ?? 'New tab'} onClick={() => { noteOperatorInput(); dispatch({ type: 'activate', id: t.id }); }}>\n {t.loading ? <span className={styles.spinner} aria-hidden=\"true\" /> : <GlobeGlyph size={12} />}\n <span className={styles.tabTitle}>{label}</span>\n </button>\n <button type=\"button\" className={styles.tabClose} aria-label={`Close ${label}`} title=\"Close tab\" onClick={() => { noteOperatorInput(); closeTab(t.id); }}>\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconPlus />} aria-label=\"New tab\" title=\"New tab\" className={styles.newTab}\n disabled={tabsState.tabs.length >= MAX_BROWSER_TABS} onClick={() => { noteOperatorInput(); dispatch({ type: 'new-tab' }); }} />\n </div>\n\n <div className={styles.toolbar}>\n <div className={styles.group}>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<BackGlyph />} aria-label=\"Back\" title=\"Back\"\n disabled={!tab.url || (mode === 'frame' && tab.index <= 0)} onClick={goBack} />\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ForwardGlyph />} aria-label=\"Forward\" title=\"Forward\"\n disabled={!tab.url || (mode === 'frame' && tab.index >= tab.history.length - 1)} onClick={goForward} />\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ReloadGlyph />} aria-label={tab.url ? 'Reload' : 'Refresh dev servers'}\n title={tab.url ? 'Reload' : 'Refresh dev servers'} onClick={reload} />\n </div>\n <form className={styles.addressForm} onSubmit={submitAddress} role=\"search\" aria-label=\"Browser address\">\n <input\n className={styles.address}\n value={address}\n onChange={(event) => setAddress(event.target.value)}\n onKeyDown={onAddressKeyDown}\n onFocus={(event) => { addressFocused.current = true; event.currentTarget.select(); }}\n onBlur={() => { addressFocused.current = false; }}\n placeholder={mode === 'native' ? 'Search or type an address — localhost:5173' : 'localhost:5173'}\n aria-label=\"Address\"\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n inputMode=\"url\"\n />\n </form>\n <div className={styles.group}>\n <Segmented<DevicePreset>\n aria-label=\"Device size\"\n size=\"sm\"\n value={device}\n onChange={setDevice}\n options={(['fill', 'desktop', 'tablet', 'mobile'] as const).map((d) => ({\n value: d,\n label: DEVICE_ICON[d],\n ariaLabel: d === 'fill' ? 'Fill the pane' : DEVICE_SIZES[d].label,\n }))}\n />\n <div className={styles.zoom} role=\"group\" aria-label=\"Zoom\">\n <button type=\"button\" className={styles.zoomButton} aria-label=\"Zoom out\" title=\"Zoom out\" onClick={() => setZoom((z) => stepZoom(z, -1))}>−</button>\n <button type=\"button\" className={styles.zoomValue} aria-label={`Zoom ${zoomLabel(zoom)} — reset`} title=\"Reset zoom\" onClick={() => setZoom(1)}>{zoomLabel(zoom)}</button>\n <button type=\"button\" className={styles.zoomButton} aria-label=\"Zoom in\" title=\"Zoom in\" onClick={() => setZoom((z) => stepZoom(z, 1))}>+</button>\n </div>\n </div>\n <div className={styles.group}>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<CameraGlyph />} aria-label=\"Screenshot\" title={screenshotTitle}\n disabled={!tab.url || busy === 'shot'} onClick={() => void onScreenshot()} />\n <IconButton variant={picking ? 'subtle' : 'ghost'} size=\"sm\" icon={<PickGlyph />} aria-label={picking ? 'Cancel element picker' : 'Pick an element'}\n aria-pressed={picking} title={canCapture ? (picking ? 'Cancel picking (Esc in the page)' : 'Pick an element') : 'The element picker needs the Ashlr desktop app'}\n disabled={!canCapture} onClick={() => void onPick()} />\n <IconButton variant={devtoolsOpen ? 'subtle' : 'ghost'} size=\"sm\" icon={<ConsoleGlyph />} aria-label=\"Console\" aria-pressed={devtoolsOpen}\n title=\"Console and network errors\" onClick={() => setDevtoolsOpen((o) => !o)} />\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ExternalGlyph />} aria-label=\"Open in your browser\" title=\"Open in your browser\"\n disabled={!tab.url} onClick={() => tab.url && openExternally(tab.url)} />\n <Button size=\"sm\" variant=\"subtle\" icon={<SendGlyph />} disabled={!sessionId || !tab.url || busy === 'send'} busy={busy === 'send'}\n onClick={() => void onSendToChat()} title={sessionId ? 'Draft the page, console and any capture into this chat’s message box' : 'Open a chat first'}>\n Send to chat\n </Button>\n </div>\n </div>\n\n {addressNote ? (\n <div className={styles.note} role=\"status\">\n {addressNote.kind === 'self' ? 'That address is Verse itself — it cannot open inside its own browser.' : addressNote.kind === 'invalid' ? addressNote.reason : null}\n <button type=\"button\" className={styles.noteClose} aria-label=\"Dismiss\" onClick={() => setAddressNote(null)}><IconX size={12} /></button>\n </div>\n ) : null}\n {notice ? (\n <div className={styles.note} role=\"alert\">\n {notice}\n <button type=\"button\" className={styles.noteClose} aria-label=\"Dismiss\" onClick={() => setNotice(null)}><IconX size={12} /></button>\n </div>\n ) : null}\n {picking ? <div className={styles.note} role=\"status\">Click an element in the page to pick it — Esc cancels.</div> : null}\n {confirmCard ? <ConfirmCard request={confirmCard.request} onAnswer={confirmCard.answer} /> : null}\n {paused ? (\n <div className={styles.note} role=\"status\" data-kind=\"paused\">\n <strong>You took over.</strong> The agent is paused while you use the page.\n <Button size=\"sm\" variant=\"subtle\" className={styles.noteAction} onClick={() => setPaused(false)}>Resume agent</Button>\n </div>\n ) : null}\n\n {shot || element ? (\n <div className={styles.tray} aria-label=\"Captured for the chat\">\n {shot ? (\n <figure className={styles.trayItem}>\n <img className={styles.thumb} src={`data:${shot.mime};base64,${shot.base64}`} alt={`Screenshot of ${tab.url ?? 'the page'}`} />\n <figcaption>{shot.width && shot.height ? `${shot.width} × ${shot.height}` : 'Screenshot'}</figcaption>\n <button type=\"button\" className={styles.noteClose} aria-label=\"Discard screenshot\" onClick={() => setShot(null)}><IconX size={12} /></button>\n </figure>\n ) : null}\n {element ? (\n <figure className={styles.trayItem}>\n <code className={styles.selector} title={element.selector}>{element.selector}</code>\n <figcaption>{element.text ? element.text.slice(0, 80) : 'element'}</figcaption>\n <button type=\"button\" className={styles.noteClose} aria-label=\"Discard element\" onClick={() => setElement(null)}><IconX size={12} /></button>\n </figure>\n ) : null}\n <span className={styles.trayHint}>Included with <strong>Send to chat</strong>.</span>\n </div>\n ) : null}\n\n <div className={styles.body}>\n <div\n id=\"browser-stage\"\n role=\"tabpanel\"\n aria-label={tab.url ? `Page: ${tabLabel(tab)}` : 'New tab'}\n className={styles.stage}\n data-device={device}\n ref={(node) => { stageRef.current = node; setStageEl(node); }}\n >\n {!tab.url ? (\n <Launcher servers={servers} hasChat={sessionId !== null} onOpen={(url) => navigateTab(tab.id, url)} />\n ) : mode === 'native' ? (\n // The native webview is drawn OVER this box by the desktop shell.\n // What shows through is only ever a placeholder while it moves.\n <div className={styles.nativeHole} aria-hidden={showNative}>\n {!showNative ? <span className={styles.nativeHint}>{overlayOpen || gate.dialog.open ? 'Page hidden while a dialog is open.' : 'Page hidden.'}</span> : null}\n </div>\n ) : frameable?.kind === 'url' && frameable.frameable ? (\n <div className={styles.frameBox} data-device={device}>\n <iframe\n key={`${tab.id}:${tab.index}:${tab.reloadKey}`}\n className={styles.frame}\n src={tab.url}\n title={`Browser: ${tabLabel(tab)}`}\n // A dev server is another origin (another port): allow-same-origin\n // is ITS origin, never Verse's. No top navigation, ever.\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-downloads\"\n referrerPolicy=\"no-referrer\"\n style={zoom !== 1 ? { transform: `scale(${zoom})`, transformOrigin: '0 0', width: `${100 / zoom}%`, height: `${100 / zoom}%` } : undefined}\n onLoad={() => dispatch({ type: 'loaded', id: tab.id })}\n />\n </div>\n ) : (\n <div className={styles.external}>\n <GlobeGlyph size={28} />\n <p className={styles.externalTitle}>{shortAddress(tab.url)} can’t be shown in the web UI</p>\n <p className={styles.externalBody}>\n A browser tab can only frame local dev servers (and most sites refuse framing). The Ashlr desktop app shows any site here, with screenshots and console.\n </p>\n <Button size=\"sm\" variant=\"primary\" icon={<ExternalGlyph />} onClick={() => openExternally(tab.url!)}>Open in your browser</Button>\n </div>\n )}\n </div>\n\n {devtoolsOpen ? (\n <section className={styles.devtools} aria-label=\"Console and network\">\n <header className={styles.devtoolsHeader}>\n <span>Console · network errors</span>\n {logs ? <span className={styles.muted}>{logs.console.length} messages · {logs.network.length} failed requests</span> : null}\n </header>\n {mode !== 'native' ? (\n <p className={styles.muted}>\n A page in an embedded frame belongs to another origin, so its console cannot be read from here. Open this page in the Ashlr desktop app to capture console output and failed requests (or use your browser’s developer tools).\n </p>\n ) : !tab.url ? (\n <p className={styles.muted}>Open a page to see its console.</p>\n ) : logsError ? (\n <p className={styles.muted}>{logsError}</p>\n ) : (\n <pre className={styles.logs}>{logs ? formatBrowserConsole(logs.console, logs.network, 200) : 'Reading…'}</pre>\n )}\n </section>\n ) : null}\n </div>\n\n {sessionId && agentOn && recentActions.length > 0 ? (\n <ol className={styles.actions} aria-label=\"Recent agent actions\">\n {recentActions.map((row) => (\n <li key={row.id} className={styles.action} data-outcome={row.outcome} title={new Date(row.at).toLocaleTimeString()}>\n {row.label}\n {row.outcome === 'failed' ? ' — failed' : row.outcome === 'declined' ? ' — declined' : row.outcome === 'allowed' ? ' — allowed' : ''}\n </li>\n ))}\n </ol>\n ) : null}\n\n {sessionId ? (\n <AgentAccessBar\n policy={policy}\n busy={busy === 'access'}\n activity={paused ? 'Paused — you took over.' : agentActivity}\n mode={mode}\n canAct={mode === 'native' && native?.capabilities.act === true}\n onToggle={(on) => void setAccess(on)}\n onScope={(scope, on) => void setScope(scope, on)}\n onAllow={(origin, allowed) => void allowOrigin(origin, allowed)}\n onRevoke={(key) => void revokeAllowance(key)}\n currentOrigin={tab.url ? originOf(tab.url) : null}\n />\n ) : null}\n\n <MutationTokenDialog open={gate.dialog.open} reason={gate.dialog.reason} tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\" onClose={gate.dialog.onClose} onUnlocked={gate.dialog.onUnlocked} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Pieces\n// ---------------------------------------------------------------------------\n\nfunction Launcher({ servers, hasChat, onOpen }: { servers: VersePreviewDevServer[] | null; hasChat: boolean; onOpen: (url: string) => void }) {\n return (\n <div className={styles.launcher}>\n <p className={styles.launcherTitle}>Open a page</p>\n <p className={styles.muted}>Type an address above, or open a dev server{hasChat ? ' found in this chat’s folders' : ''}.</p>\n {servers === null ? (\n <p className={styles.muted}>Looking for dev servers…</p>\n ) : servers.length === 0 ? (\n <p className={styles.muted}>{hasChat ? 'No dev servers found (launch.json, package.json scripts, or anything listening in these folders).' : 'Open a chat to see its dev servers.'}</p>\n ) : (\n <ul className={styles.servers}>\n {servers.map((s) => (\n <li key={s.id} className={styles.server}>\n <ServerGlyph size={14} />\n <span className={styles.serverLabel} title={s.label}>{s.label}</span>\n <span className={styles.serverUrl}>{shortAddress(s.url)}</span>\n <span className={styles.badge} data-running={s.running || undefined}>{s.running ? 'running' : 'stopped'}</span>\n <Button size=\"sm\" variant={s.running ? 'subtle' : 'ghost'} onClick={() => onOpen(s.url)}\n title={s.running ? `Open ${s.url}` : 'Not running — start it from the Preview pane or a terminal, then open'}>\n Open\n </Button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\n/**\n * The operator's say over one agent action. The page's own words for the\n * element (untrusted) are shown as plain text, next to — never instead of —\n * what Verse knows: the action, the origin and why it is being asked.\n */\nfunction ConfirmCard({ request, onAnswer }: { request: VerseBrowserConfirmRequest; onAnswer: (decision: VerseBrowserDecision) => void }) {\n const [left, setLeft] = useState(() => Math.max(0, Math.round((Date.parse(request.expiresAt) - Date.now()) / 1000)));\n useEffect(() => {\n const timer = setInterval(() => setLeft(Math.max(0, Math.round((Date.parse(request.expiresAt) - Date.now()) / 1000))), 1_000);\n return () => clearInterval(timer);\n }, [request.expiresAt]);\n return (\n <section className={styles.confirm} role=\"group\" aria-label=\"The agent is asking to act\">\n <div className={styles.confirmHead}>\n <ShieldGlyph size={14} />\n <strong>The agent wants to: {request.action}</strong>\n <span className={styles.muted}>{Number.isFinite(left) ? `${left}s` : ''}</span>\n </div>\n <p className={styles.confirmBody}>\n On <code>{request.origin}</code>\n {request.target ? <> · the page calls it <q>{request.target}</q></> : null}\n </p>\n {request.reasons.length > 0 ? (\n <ul className={styles.confirmReasons}>\n {request.reasons.map((reason) => <li key={reason}>Asked because {reason}.</li>)}\n </ul>\n ) : null}\n <div className={styles.confirmActions}>\n <Button size=\"sm\" variant=\"primary\" onClick={() => onAnswer('once')}>Allow once</Button>\n <Button size=\"sm\" variant=\"subtle\" onClick={() => onAnswer('chat')}>Allow for this chat</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => onAnswer('deny')}>Deny</Button>\n </div>\n </section>\n );\n}\n\nfunction AgentAccessBar({ policy, busy, activity, mode, canAct, onToggle, onScope, onAllow, onRevoke, currentOrigin }: {\n policy: VerseBrowserPolicy | null;\n busy: boolean;\n activity: string | null;\n mode: 'native' | 'frame';\n canAct: boolean;\n onToggle: (on: boolean) => void;\n onScope: (scope: VerseBrowserScope, on: boolean) => void;\n onAllow: (origin: string, allowed: boolean) => void;\n onRevoke: (key: string) => void;\n currentOrigin: string | null;\n}) {\n const on = policy?.agentAccess === true;\n const act = policy?.actAccess === true;\n const script = policy?.scriptAccess === true;\n const allowances = policy?.allowances ?? [];\n const allowed = policy?.allowedOrigins ?? [];\n const blocked = policy?.blocked ?? [];\n const engines = policy?.toolEngines ?? ['claude', 'local'];\n // The page Mason is on is outside localhost and not allowed: offer it in one click.\n let offer: string | null = null;\n if (currentOrigin && !allowed.includes(currentOrigin) && !blocked.some((b) => b.origin === currentOrigin)) {\n try {\n if (!isLoopbackHost(new URL(currentOrigin).hostname)) offer = currentOrigin;\n } catch {\n offer = null;\n }\n }\n return (\n <section className={styles.agent} aria-label=\"Agent access\">\n <div className={styles.agentRow}>\n <ShieldGlyph size={14} />\n <Switch checked={on} disabled={busy || policy === null} onChange={onToggle} label=\"Agents in this chat can use this browser\" />\n <span className={styles.muted}>\n {on\n ? activity ?? `Localhost only${allowed.length ? ` + ${allowed.length} allowed` : ''} · ${act && canAct ? 'look, click and type — asks you before anything that matters' : 'look, navigate, screenshot, read'} · never passwords, payments, files or downloads.`\n : `Gives ${engines.includes('claude') ? 'Claude and local' : engines.join(', ')} seats browser tools from their next turn.`}\n\n {on && mode === 'frame' ? ' In the web UI agents can only navigate.' : ''}\n {on && mode === 'native' && !canAct ? ' Update the desktop app to let agents click and type.' : ''}\n </span>\n </div>\n {on ? (\n <div className={styles.agentRow}>\n <Switch checked={act} disabled={busy} onChange={(next) => onScope('browser_act', next)} label=\"Click and type\" />\n <Switch checked={script} disabled={busy || !act} onChange={(next) => onScope('browser_script', next)} label=\"Run scripts (localhost)\" />\n </div>\n ) : null}\n {on && allowances.length > 0 ? (\n <div className={styles.agentOrigins} aria-label=\"Allowed for this chat\">\n {allowances.map((key) => (\n <span key={`k-${key}`} className={styles.chip} data-kind=\"allowance\">\n {key}\n <button type=\"button\" className={styles.noteClose} aria-label={`Stop allowing ${key}`} onClick={() => onRevoke(key)}><IconX size={12} /></button>\n </span>\n ))}\n </div>\n ) : null}\n {on && (blocked.length > 0 || allowed.length > 0 || offer) ? (\n <div className={styles.agentOrigins}>\n {blocked.map((b) => (\n <span key={`b-${b.origin}`} className={styles.chip} data-kind=\"blocked\">\n Agent asked for {b.origin}\n <button type=\"button\" className={styles.chipAction} onClick={() => onAllow(b.origin, true)}>Allow for this chat</button>\n </span>\n ))}\n {allowed.map((origin) => (\n <span key={`a-${origin}`} className={styles.chip}>\n {origin}\n <button type=\"button\" className={styles.noteClose} aria-label={`Stop allowing ${origin}`} onClick={() => onAllow(origin, false)}><IconX size={12} /></button>\n </span>\n ))}\n {offer ? (\n <span className={styles.chip} data-kind=\"offer\">\n Agents can’t see {offer}\n <button type=\"button\" className={styles.chipAction} onClick={() => onAllow(offer, true)}>Allow</button>\n </span>\n ) : null}\n </div>\n ) : null}\n </section>\n );\n}\n\nexport default BrowserPanel;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-hePW80VL.js";import{n,s as r}from"./index-BC5Uslm5.js";import{l as i,o as a,u as o}from"./global-w7KDTTi0.js";import{t as s}from"./MutationTokenDialog-DlY2VLVh.js";import{t as c}from"./Segmented-BA8RmKYq.js";import{_ as l,y as u}from"./format-V6IiIMAL.js";import{t as d}from"./Tag-BvOxSxYi.js";import{i as f,n as p,t as m}from"./budget-queries-Nvx0H2XE.js";import{c as h}from"./capacity-strip-model-CBMJ2U-w.js";import{a as g,n as _,o as v,r as y,s as b,t as x}from"./budget-model-BZyGzAr4.js";import{n as S,t as C}from"./use-token-gate-h5QAERLT.js";import{t as w}from"./Switch-Cqc_bSoh.js";import{t as T}from"./Slider-DS5HrVzl.js";var E=t(r(),1),D={panel:`_panel_18a87_5`,header:`_header_18a87_14`,title:`_title_18a87_20`,summary:`_summary_18a87_26`,age:`_age_18a87_32`,mode:`_mode_18a87_38`,modeText:`_modeText_18a87_44`,preview:`_preview_18a87_51`,previewLead:`_previewLead_18a87_62`,previewWhy:`_previewWhy_18a87_63`,error:`_error_18a87_69`,loading:`_loading_18a87_74`,empty:`_empty_18a87_75`,seats:`_seats_18a87_81`,seat:`_seat_18a87_81`,seatHead:`_seatHead_18a87_98`,marker:`_marker_18a87_105`,seatName:`_seatName_18a87_111`,status:`_status_18a87_119`,free:`_free_18a87_131`,toggle:`_toggle_18a87_135`,bars:`_bars_18a87_137`,bar:`_bar_18a87_137`,barLabel:`_barLabel_18a87_149`,bindingMark:`_bindingMark_18a87_157`,barValue:`_barValue_18a87_161`,unknown:`_unknown_18a87_166`,track:`_track_18a87_172`,used:`_used_18a87_179`,room:`_room_18a87_180`,reserveBand:`_reserveBand_18a87_181`,ceiling:`_ceiling_18a87_203`,trackUnknown:`_trackUnknown_18a87_211`,controls:`_controls_18a87_218`,freeLine:`_freeLine_18a87_224`,why:`_why_18a87_225`,more:`_more_18a87_230`,footnote:`_footnote_18a87_240`},O=e({BUDGET_COMMIT_DELAY_MS:()=>450,BUDGET_POLL_MS:()=>A,BudgetControl:()=>F,BudgetControlView:()=>P}),k=n(),A=6e4;function j({bar:e}){let t=e.usedPercent,n=g(e.ceilingPercent);if(t===null)return(0,k.jsxs)(`div`,{className:D.bar,"data-binding":e.binding||void 0,children:[(0,k.jsx)(`span`,{className:D.barLabel,children:e.label}),(0,k.jsx)(`div`,{className:D.trackUnknown,role:`img`,"aria-label":e.description}),(0,k.jsx)(`span`,{className:`${D.barValue} ${D.unknown}`,children:`no reading`})]});let r=g(t),i=r>=n;return(0,k.jsxs)(`div`,{className:D.bar,"data-binding":e.binding||void 0,children:[(0,k.jsxs)(`span`,{className:D.barLabel,children:[e.label,e.binding?(0,k.jsx)(`span`,{className:D.bindingMark,title:`This window limits autonomy right now`,children:`binding`}):null]}),(0,k.jsxs)(`div`,{className:D.track,role:`img`,"aria-label":e.description,children:[n<100?(0,k.jsx)(`div`,{className:D.reserveBand,style:{left:`${n}%`,width:`${100-n}%`}}):null,i?null:(0,k.jsx)(`div`,{className:D.room,style:{left:`${r}%`,width:`${n-r}%`}}),(0,k.jsx)(`div`,{className:D.used,"data-over":i||void 0,style:{width:`${r}%`}}),n<100?(0,k.jsx)(`div`,{className:D.ceiling,style:{left:`${n}%`}}):null]}),(0,k.jsxs)(`span`,{className:D.barValue,children:[l(t),` used`,n<100?` · stops at ${n}%`:``]})]})}function M(e,t){let[n,r]=(0,E.useState)(e),i=(0,E.useRef)(!1),a=(0,E.useRef)(null),o=(0,E.useRef)(t);return o.current=t,(0,E.useEffect)(()=>{i.current||r(e)},[e]),(0,E.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]),[n,(0,E.useCallback)(e=>{r(e),i.current=!0,a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{i.current=!1,a.current=null,o.current(e)},450)},[])]}function N({row:e,saving:t,readOnly:n,onSeat:r}){let i=(0,E.useId)(),a=e.policy.reservePercent,o=e.policy.maxSessionWindowPercent??100,[s,c]=M(a,t=>{t!==a&&r(e.seatId,{reservePercent:t})}),[l,u]=M(o,t=>{t!==o&&r(e.seatId,{maxSessionWindowPercent:t>=100?null:t})}),f=n||t;return(0,k.jsxs)(`li`,{className:D.seat,"aria-labelledby":i,"data-status":e.status,"aria-busy":t||void 0,children:[(0,k.jsxs)(`div`,{className:D.seatHead,children:[(0,k.jsx)(d,{engine:e.engine,className:D.marker}),(0,k.jsx)(`span`,{id:i,className:D.seatName,title:e.label,children:e.label}),(0,k.jsx)(`span`,{className:D.status,"data-status":e.status,children:_[e.status]}),e.free?(0,k.jsx)(`span`,{className:D.free,children:`free`}):null,(0,k.jsx)(w,{className:D.toggle,checked:e.policy.enabled,disabled:f,"aria-label":`Autonomy on ${e.label}`,label:`Autonomy`,onChange:t=>r(e.seatId,{enabled:t})})]}),e.bars.length>0?(0,k.jsx)(`div`,{className:D.bars,children:e.bars.map(e=>(0,k.jsx)(j,{bar:e},e.kind))}):e.free?(0,k.jsx)(`p`,{className:D.freeLine,children:`No usage window — local models cost nothing and are never held back for you.`}):null,!e.free&&e.policy.enabled?(0,k.jsxs)(`div`,{className:D.controls,children:[(0,k.jsx)(T,{label:`Kept for you`,min:0,max:100,step:5,value:s,disabled:f,valueLabel:`${s}%`,valueText:`${s} percent of the ${e.engine===`grok`?`billing period`:`weekly window`} kept for you`,onChange:e=>c(g(Number(e.currentTarget.value)))}),e.hasSessionCeiling?(0,k.jsx)(T,{label:`5-hour ceiling`,min:10,max:100,step:5,value:l,disabled:f,valueLabel:l>=100?`none`:`${l}%`,valueText:l>=100?`no 5-hour ceiling`:`autonomy stops at ${l} percent of the 5-hour window`,onChange:e=>u(g(Number(e.currentTarget.value),10,100))}):null]}):null,(0,k.jsx)(`p`,{className:D.why,children:e.why}),e.more.length>0?(0,k.jsxs)(`details`,{className:D.more,children:[(0,k.jsx)(`summary`,{children:e.more.length===1?`1 more note`:`${e.more.length} more notes`}),(0,k.jsx)(`ul`,{children:e.more.map(e=>(0,k.jsx)(`li`,{children:e},e))})]}):null]})}function P({view:e,preview:t,nowMs:n,pending:r,error:i,readError:a=null,readOnly:o=!1,maxMode:s=null,onMode:l,onSeat:d}){let f=(0,E.useId)(),p=[...h(e).values()],m=y(p),g=x.find(t=>t.value===e.mode)??null,_=g??x[1],S=typeof e.readingMaxAgeMs==`number`&&Number.isFinite(e.readingMaxAgeMs)?e.readingMaxAgeMs:null,C=s?x.find(e=>e.value===s)?.label??s:null,w=v(e.mode,s),T=t?.seatId?p.find(e=>e.seatId===t.seatId):null;return(0,k.jsxs)(`section`,{className:D.panel,"aria-labelledby":f,children:[(0,k.jsxs)(`header`,{className:D.header,children:[(0,k.jsx)(`h2`,{id:f,className:D.title,children:`Budget`}),(0,k.jsx)(`p`,{className:D.summary,children:m.sentence}),(0,k.jsx)(`span`,{className:D.age,children:Number.isFinite(Date.parse(e.sampledAt))?`Readings ${b(e.sampledAt,n)}`:`Reading time not reported`})]}),(0,k.jsxs)(`div`,{className:D.mode,children:[(0,k.jsx)(c,{"aria-label":`Budget mode`,options:x.map(e=>({value:e.value,label:e.label,...v(e.value,s)?{ariaLabel:`${e.label} — above your grant`}:{},disabled:o||r!==null||v(e.value,s)})),value:e.mode,onChange:t=>{t!==e.mode&&!v(t,s)&&l(t)}}),(0,k.jsx)(`p`,{className:D.modeText,children:g?_.description:`The server did not say which mode is on.`}),C?(0,k.jsx)(`p`,{className:D.modeText,"data-ceiling":``,children:w?`Your grant allows up to ${C}, so autonomy spends as ${C} until this moves down.`:`Your grant allows up to ${C}; modes above it are off. Re-approve the grant to raise it.`}):null]}),t?(0,k.jsxs)(`p`,{className:D.preview,"aria-live":`polite`,children:[(0,k.jsx)(`span`,{className:D.previewLead,children:`Next medium task →`}),` `,(0,k.jsx)(`strong`,{children:T?.label??t.seatId??`nowhere right now`}),(0,k.jsx)(`span`,{className:D.previewWhy,children:typeof t.why==`string`?u(t.why,n):null})]}):null,i?(0,k.jsx)(`p`,{className:D.error,role:`alert`,children:i}):null,a?(0,k.jsx)(`p`,{className:D.error,role:`status`,"data-read-error":``,children:a}):null,p.length===0?(0,k.jsx)(`p`,{className:D.empty,children:`No seats yet — connect an account or start Ollama, and they appear here.`}):(0,k.jsx)(`ul`,{className:D.seats,children:p.map(e=>(0,k.jsx)(N,{row:e,saving:r===e.seatId||r===`mode`,readOnly:o,onSeat:d},e.seatId))}),(0,k.jsxs)(`p`,{className:D.footnote,children:[`Reserves limit autonomy only; your chats can always use a seat. A seat with no reading, or one`,` `,S===null?`whose reading is stale`:`older than ${Math.round(S/6e4)} minutes`,`, is held back.`]})]})}function F({maxMode:e=null}={}){let t=i(p,{freshMs:0}),n=i(m,{freshMs:0}),r=o(p),c=o(m),l=S(),[u,d]=(0,E.useState)(null),[h,g]=(0,E.useState)(null),[_,v]=(0,E.useState)(null),[y,b]=(0,E.useState)(()=>Date.now());(0,E.useEffect)(()=>{let e=()=>{(typeof document>`u`||document.visibilityState!==`hidden`)&&(r(),c(),b(Date.now()))},t=window.setInterval(e,A);return document.addEventListener(`visibilitychange`,e),()=>{window.clearInterval(t),document.removeEventListener(`visibilitychange`,e)}},[r,c]);let x=t.data,w=u&&(!x||!(Date.parse(u.sampledAt)<Date.parse(x.sampledAt)))?u:x,T=(0,E.useCallback)(async(e,t,n)=>{g(e),v(null);try{let e=await l.run(t,()=>f(n));e&&d(e)}catch(e){v(C(e))}finally{g(null),b(Date.now())}},[l]),O=t.status===`error`?a(t.error):null,j=n.status===`error`?a(n.error):null;return w?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(P,{view:w,preview:n.data??null,nowMs:y,pending:h,error:_,readError:O?`Showing the last readings. ${O}`:j?`Next-task preview unavailable. ${j}`:null,maxMode:e,onMode:e=>void T(`mode`,`Switch the budget to ${e}`,{mode:e}),onSeat:(e,t)=>void T(e,`Change the budget for ${e}`,{seatId:e,policy:t})}),(0,k.jsx)(s,{open:l.dialog.open,reason:l.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:l.dialog.onClose,onUnlocked:l.dialog.onUnlocked})]}):(0,k.jsx)(`section`,{className:D.panel,"aria-label":`Budget`,children:O?(0,k.jsxs)(`p`,{className:D.error,role:`alert`,children:[`Budget unavailable. `,O]}):(0,k.jsx)(`p`,{className:D.loading,children:`Reading seat usage…`})})}export{O as n,F as t};
|
|
2
|
+
//# sourceMappingURL=BudgetControl-De1TPzvX.js.map
|